mirror of
https://codeberg.org/mclemens/ubitxv6.git
synced 2024-11-19 08:26:10 -05:00
cda86a1b12
The files are not split into .cpp and .h files. The main file ubitxxxx.cpp will have the main routines to control the radio, initialization and main loop. The user interface is implemented in ubitx_ui.cpp, the code for setup/calibration routines is in setup.cpp. Nano gui, keyer, morse.cpp (morse reader) are all libaries that have minimum dependencies on each other.
115 lines
2.7 KiB
C++
115 lines
2.7 KiB
C++
#include <Arduino.h>
|
|
#include "ubitx.h"
|
|
#include "morse.h"
|
|
/*
|
|
* Each byte of the morse table stores one letter.
|
|
* The 0 is a dot, a 1 is a dash
|
|
* From the Most significant byte onwards, the letter is padded with 1s.
|
|
* The first zero after the 1s indicates the start of the letter, it MUST be discarded
|
|
*/
|
|
|
|
extern int cwSpeed;
|
|
struct Morse {
|
|
char letter;
|
|
unsigned char code;
|
|
};
|
|
|
|
static const PROGMEM struct Morse morse_table[] = {
|
|
{'a', 0xf9}, // 11111001
|
|
{'b', 0xe8}, // 11101000
|
|
{'c', 0xea}, // 11101010
|
|
{'d', 0xf4}, // 11110100
|
|
{'e', 0xfc}, // 11111100
|
|
{'f', 0xe4}, // 11100100
|
|
{'g', 0xf6}, // 11110110
|
|
{'h', 0xe0}, // 11100000
|
|
{'i', 0xf8}, // 11111000
|
|
{'j', 0xe7}, // 11100111
|
|
{'k', 0xf6}, // 11110101
|
|
{'l', 0xe4}, // 11100100
|
|
{'m', 0xfb}, // 11111011
|
|
{'n', 0xfa}, // 11111010
|
|
{'o', 0xf7}, // 11110111
|
|
{'p', 0xe6}, // 11100110
|
|
{'q', 0xed}, // 11101101
|
|
{'r', 0xf2}, // 11110010
|
|
{'s', 0xf0}, // 11110000
|
|
{'t', 0xfd}, // 11111101
|
|
{'u', 0xf1}, // 11110001
|
|
{'v', 0xe1}, // 11100001
|
|
{'w', 0xf3}, // 11110011
|
|
{'x', 0xe9}, // 11101001
|
|
{'y', 0xe3}, // 11101011
|
|
{'z', 0xec}, // 11101100
|
|
{'1', 0xcf}, // 11001111
|
|
{'2', 0xc7}, // 11000111
|
|
{'3', 0xc3}, // 11000011
|
|
{'4', 0xc1}, // 11000001
|
|
{'5', 0xc0}, // 11000000
|
|
{'6', 0xd0}, // 11010000
|
|
{'7', 0xd8}, // 11011000
|
|
{'8', 0xdc}, // 11011100
|
|
{'9', 0xde}, // 11011110
|
|
{'0', 0xdf}, // 11011111
|
|
{'.', 0xd5}, // 110010101
|
|
{'?', 0xd3}, // 110110011
|
|
};
|
|
|
|
static void morseLetter(char c){
|
|
unsigned char mask = 0x80;
|
|
|
|
//handle space character as three dashes
|
|
if (c == ' '){
|
|
active_delay(cwSpeed * 9);
|
|
Serial.print(' ');
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < sizeof(morse_table)/ sizeof(struct Morse); i++){
|
|
struct Morse m;
|
|
memcpy_P(&m, morse_table + i, sizeof(struct Morse));
|
|
|
|
if (m.letter == tolower(c)){
|
|
unsigned char code = m.code;
|
|
//Serial.print(m.letter); Serial.println(' ');
|
|
|
|
while(mask & code && mask > 1)
|
|
mask = mask >> 1;
|
|
//now we are at the first zero, skip and carry on
|
|
mask = mask >> 1;
|
|
while(mask){
|
|
tone(CW_TONE, sideTone,10000);
|
|
if (mask & code){
|
|
delay(3 * (int)cwSpeed);
|
|
//Serial.print('-');
|
|
}
|
|
else{
|
|
delay((int)cwSpeed);
|
|
//Serial.print('.');
|
|
}
|
|
//Serial.print('#');
|
|
noTone(CW_TONE);
|
|
delay((int)cwSpeed); // space between dots and dashes
|
|
mask = mask >> 1;
|
|
}
|
|
//Serial.println('@');
|
|
delay(200); // space between letters is a dash (3 dots), one dot's space has already been sent
|
|
}
|
|
}
|
|
}
|
|
|
|
void morseText(char *text){
|
|
// while (1){
|
|
noTone(CW_TONE);
|
|
delay(1000);
|
|
tone(CW_TONE, 600);
|
|
delay(1000);
|
|
// }
|
|
|
|
Serial.println(sideTone);
|
|
while(*text){
|
|
morseLetter(*text++);
|
|
}
|
|
}
|
|
|