[RTTY] Added support for ITA2 encoding

This commit is contained in:
Jan Gromeš 2018-09-11 11:24:56 +02:00
parent 8165f8107b
commit 4fecd8c073
4 changed files with 102 additions and 2 deletions

View file

@ -92,6 +92,20 @@ void loop() {
float f = -3.1415;
rtty.println(f, 3);
/*
// KiteLib also provides ITA2 ("Baudot") code support
// RTTY client must be configured to 5 bits
rtty.begin(434, 183, 45, 5);
// create ITA2-encoded string
// NOTE: ASCII characters that do not have ITA2
// equivalent will be replaced with NUL
ITA2 itaStr = "HELLO WORLD\n";
// send the ITA2 string
rtty.write(itaStr.byteArr(), itaStr.length());
*/
// turn transmitter off
fsk.standby();

View file

@ -27,6 +27,7 @@ XBeeSerial KEYWORD1
MQTTClient KEYWORD1
HTTPClient KEYWORD1
RTTYClient KEYWORD1
ITA2 KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
@ -96,6 +97,7 @@ check KEYWORD2
# RTTY
idle KEYWORD2
byteArr KEYWORD2
# TransportLayer
openTransportConnection KEYWORD2

View file

@ -1,5 +1,62 @@
#include "RTTY.h"
ITA2::ITA2(const char* str) {
_len = strlen(str);
_str = new char[_len];
strcpy(_str, str);
}
ITA2::~ITA2() {
delete[] _str;
}
size_t ITA2::length() {
return(_len);
}
uint8_t* ITA2::byteArr() {
// create temporary array 3x the string length (figures may be 3 bytes)
uint8_t* temp = new uint8_t[_len*3];
size_t arrayLen = 0;
for(size_t i = 0; i < _len; i++) {
uint16_t code = getBits(_str[i]);
// check if the code is letter or figure
if(code & (ITA2_FIGS << 10)) {
temp[arrayLen] = ITA2_FIGS;
temp[arrayLen + 1] = (code >> 5) & ITA2_LTRS;
temp[arrayLen + 2] = ITA2_LTRS;
arrayLen += 3;
} else {
temp[arrayLen] = code;
arrayLen += 1;
}
}
uint8_t* arr = new uint8_t[arrayLen];
memcpy(arr, temp, arrayLen);
delete[] temp;
return(arr);
}
uint16_t ITA2::getBits(char c) {
// search ITA2 table
uint16_t code = 0x0000;
for(uint8_t i = 0; i < ITA2_LENGTH; i++) {
if(ITA2Table[i][0] == c) {
// character is in letter shift
code = i;
break;
} else if(ITA2Table[i][1] == c) {
// character is in figures shift
code = (ITA2_FIGS << 10) | (i << 5) | ITA2_LTRS;
break;
}
}
return(code);
}
RTTYClient::RTTYClient(PhysicalLayer* phy) {
_phy = phy;
}
@ -68,11 +125,11 @@ size_t RTTYClient::write(uint8_t b) {
}
size_t RTTYClient::print(const String& str) {
return(RTTYClient::write(str.c_str(), str.length()));
return(RTTYClient::write((uint8_t*)str.c_str(), str.length()));
}
size_t RTTYClient::print(const char str[]) {
return(RTTYClient::write(str, strlen(str)));
return(RTTYClient::write((uint8_t*)str, strlen(str)));
}
size_t RTTYClient::print(char c) {

View file

@ -4,6 +4,33 @@
#include "TypeDef.h"
#include "PhysicalLayer.h"
#define ITA2_FIGS 0x1B
#define ITA2_LTRS 0x1F
#define ITA2_LENGTH 32
// ITA2 character table: - position in array corresponds to 5-bit ITA2 code
// - characters to the left are in letters shift, characters to the right in figures shift
// - characters marked 0x7F do not have ASCII equivalent
const char ITA2Table[ITA2_LENGTH][2] = {{'\0', '\0'}, {'E', '3'}, {'\n', '\n'}, {'A', '-'}, {' ', ' '}, {'S', '\''}, {'I', '8'}, {'U', '7'},
{'\r', '\r'}, {'D', 0x05}, {'R', '4'}, {'J', '\a'}, {'N', ','}, {'F', '!'}, {'C', ':'}, {'K', '('},
{'T', '5'}, {'Z', '+'}, {'L', ')'}, {'W', '2'}, {'H', 0x7F}, {'Y', '6'}, {'P', '0'}, {'Q', '1'},
{'O', '9'}, {'B', '?'}, {'G', '&'}, {0x7F, 0x7F}, {'M', '.'}, {'X', '/'}, {'V', ';'}, {0x7F, 0x7F}};
class ITA2 {
public:
ITA2(const char* str);
~ITA2();
size_t length();
uint8_t* byteArr();
private:
char* _str;
size_t _len;
uint16_t getBits(char c);
};
class RTTYClient {
public:
RTTYClient(PhysicalLayer* phy);