[PSK][WIP] Added PSK files

This commit is contained in:
jgromes 2019-05-29 10:54:49 +02:00
parent 05498c2598
commit f85e7b2489
3 changed files with 313 additions and 0 deletions

View file

@ -63,6 +63,7 @@
#include "protocols/Morse.h"
#include "protocols/RTTY.h"
#include "protocols/Pager.h"
#include "protocols/PSK.h"
// transport layer protocols
#include "protocols/TransportLayer.h"

128
src/protocols/PSK.cpp Normal file
View file

@ -0,0 +1,128 @@
#include "PSK.h"
VaricodeString::VaricodeString(char c) {
_len = 1;
_str = new char[1];
_str[0] = c;
}
VaricodeString::VaricodeString(const char* str) {
_len = strlen(str);
_str = new char[_len];
strcpy(_str, str);
}
VaricodeString::~VaricodeString() {
delete[] _str;
}
size_t VaricodeString::length() {
return(_len);
}
uint16_t* VaricodeString::byteArr() {
uint16_t* arr = new uint16_t[_len];
for(size_t i = 0; i < _len; i++) {
arr[i] = VaricodeTable[(uint8_t)_str[i]];
}
return(arr);
}
PSKClient::PSKClient(PhysicalLayer* phy) {
_phy = phy;
}
int16_t PSKClient::begin(int pin, float carrier, float rate, uint16_t audioFreq) {
pinMode(pin, OUTPUT);
// save configuration
_pin = pin;
_audioFreq = audioFreq;
// calculate duration of 1 bit
_bitDuration = (uint32_t)(1000000.0/rate);
// calculate 24-bit frequency
uint32_t mult = 1;
_carrier = (carrier * (mult << _phy->getDivExponent())) / _phy->getCrystalFreq();
// set FSK frequency deviation to 0
int16_t state = _phy->setFrequencyDeviation(0);
return(state);
}
size_t PSKClient::write(uint16_t* buff, size_t len) {
size_t n = 0;
for(size_t i = 0; i < len; i++) {
n += PSKClient::write(buff[i]);
}
return(n);
}
size_t PSKClient::write(uint16_t code) {
// get number of bits in character code
uint8_t dataBits = 10;
for(dataBits = 10; dataBits > 0; dataBits--) {
if(code & (0x0001 << dataBits)) {
break;
}
}
// send code
for(uint16_t mask = 0x01; mask <= (uint16_t)(0x01 << (dataBits - 1)); mask <<= 1) {
if(code & mask) {
mark();
} else {
space();
}
}
// character end
space();
space();
return(1);
}
size_t PSKClient::print(VaricodeString& var) {
uint16_t* arr = var.byteArr();
size_t n = PSKClient::write(arr, var.length());
delete[] arr;
return(n);
}
size_t PSKClient::print(const char str[]) {
VaricodeString var = str;
return(PSKClient::print(var));
}
size_t PSKClient::println() {
VaricodeString lf = "\r\n";
return(PSKClient::print(lf));
}
size_t PSKClient::println(VaricodeString& var) {
size_t n = PSKClient::print(var);
n += PSKClient::println();
return(n);
}
size_t PSKClient::println(const char str[]) {
size_t n = PSKClient::print(str);
n += PSKClient::println();
return(n);
}
void PSKClient::mark() {
// do not perform phase change
uint32_t start = micros();
while(micros() - start < _bitDuration);
}
void PSKClient::space() {
// change phase by 180 degrees
uint32_t start = micros();
// TODO: flip phase here
while(micros() - start < _bitDuration);
}

184
src/protocols/PSK.h Normal file
View file

@ -0,0 +1,184 @@
#ifndef _KITELIB_PSK_H
#define _KITELIB_PSK_H
#include "TypeDef.h"
#include "PhysicalLayer.h"
// Varicode character table: - position in table corresponds to ASCII code
// - value in table corresponds to Varicode code
// - leading zeros are not shown
const uint16_t VaricodeTable[128] = {0b1010101011, // NUL
0b1011011011, // SOH
0b1011101101, // STX
0b1101110111, // ETX
0b1011101011, // EOT
0b1101011111, // ENQ
0b1011101111, // ACK
0b1011111101, // BEL
0b1011111111, // BS
0b11101111, // HT
0b11101, // LF
0b1101101111, // VT
0b1011011101, // FF
0b11111, // CR
0b1101110101, // SO
0b1110101011, // SI
0b1011110111, // DLE
0b1011110101, // DC1
0b1110101101, // DC2
0b1110101111, // DC3
0b1101011011, // DC4
0b1101101011, // NAK
0b1101101101, // SYN
0b1101010111, // ETB
0b1101111011, // CAN
0b1101111101, // EM
0b1110110111, // SUB
0b1101010101, // ESC
0b1101011101, // FS
0b1101011101, // GS
0b1011111011, // RS
0b1101111111, // US
0b1, // SP
0b111111111, // !
0b101011111, // "
0b111110101, // #
0b111011011, // $
0b1011010101, // %
0b1010111011, // &
0b101111111, // '
0b11111011, // (
0b11110111, // )
0b101101111, // *
0b111011111, // +
0b1110101, // ,
0b110101, // -
0b1010111, // .
0b110101111, // /
0b10110111, // 0
0b10111101, // 1
0b11101101, // 2
0b11111111, // 3
0b101110111, // 4
0b101011011, // 5
0b101101011, // 6
0b110101101, // 7
0b110101011, // 8
0b110110111, // 9
0b11110101, // :
0b110111101, // ;
0b111101101, // <
0b1010101, // =
0b111010111, // >
0b1010101111, // ?
0b1010111101, // @
0b1111101, // A
0b11101011, // B
0b10101101, // C
0b10110101, // D
0b1110111, // E
0b11011011, // F
0b11111101, // G
0b101010101, // H
0b1111111, // I
0b111111101, // J
0b101111101, // K
0b11010111, // L
0b10111011, // M
0b11011101, // N
0b10101011, // O
0b11010101, // P
0b111011101, // Q
0b10101111, // R
0b1101111, // S
0b1101101, // T
0b101010111, // U
0b110110101, // V
0b101011101, // W
0b101110101, // X
0b101111011, // Y
0b1010101101, // Z
0b111110111, // [
0b111101111, // backslash
0b111111011, // ]
0b1010111111, // ^
0b101101101, // _
0b1011011111, // `
0b1011, // a
0b1011111, // b
0b101111, // c
0b101101, // d
0b11, // e
0b111101, // f
0b1011011, // g
0b101011, // h
0b1101, // i
0b111101011, // j
0b10111111, // k
0b11011, // l
0b111011, // m
0b1111, // n
0b111, // o
0b111111, // p
0b110111111, // q
0b10101, // r
0b10111, // s
0b101, // t
0b110111, // u
0b1111011, // v
0b1101011, // w
0b11011111, // x
0b1011101, // y
0b111010101, // z
0b1010110111, // {
0b110111011, // |
0b1010110101, // }
0b1011010111, // ~
0b1110110101, // DEL
};
class VaricodeString {
public:
VaricodeString(char c);
VaricodeString(const char* str);
~VaricodeString();
size_t length();
uint16_t* byteArr();
private:
char* _str;
size_t _len;
uint16_t getBits(char c);
};
class PSKClient {
public:
PSKClient(PhysicalLayer* phy);
// basic methods
int16_t begin(int pin, float base, float rate = 31.25, uint16_t audioFreq = 400);
size_t write(uint16_t* buff, size_t len);
size_t write(uint16_t code);
size_t print(VaricodeString &);
size_t print(const char[]);
size_t println(void);
size_t println(VaricodeString &);
size_t println(const char[]);
private:
PhysicalLayer* _phy;
int _pin;
uint16_t _audioFreq;
uint32_t _carrier;
uint16_t _bitDuration;
void mark();
void space();
};
#endif