RS41ng/legacy-code/morse.c

152 wiersze
3.3 KiB
C

// Morse Code Playback Functions
// Mark Jessop 2018-04
// OK1TE 2018-11
//
// Based on code from https://github.com/Paradoxis/Arduino-morse-code-translator/blob/master/main.ino
//
#include "morse.h"
#include "config.h"
// All morse delays
#define MORSE_DELAY (1200 / MORSE_WPM)
#define MORSE_DELAY_DOT (MORSE_DELAY * 1)
#define MORSE_DELAY_DASH (MORSE_DELAY * 3)
#define MORSE_DELAY_SPACE (MORSE_DELAY * 7)
// All morse characters
const char MORSE_DOT = '.';
const char MORSE_DASH = '-';
// Letters
const char* const MORSE_LETTERS[] = {
".-", // A
"-...", // B
"-.-.", // C
"-..", // D
".", // E
"..-.", // F
"--.", // G
"....", // H
"..", // I
".---", // J
"-.-", // K
".-..", // L
"--", // M
"-.", // N
"---", // O
".--.", // P
"--.-", // Q
".-.", // R
"...", // S
"-", // T
"..-", // U
"...-", // V
".--", // W
"-..-", // X
"-.--", // Y
"--.." // Z
};
// Numerals.
const char* const MORSE_NUMBERS[] = {
"-----", // 0
".----", // 1
"..---", // 2
"...--", // 3
"....-", // 4
".....", // 5
"-....", // 6
"--...", // 7
"---..", // 8
"----." // 9
};
// Symbols
const char Morse_Slash[] = "-..-.";
const char Morse_Equal[] = "-...-";
const char Morse_FullStop[] = ".-.-.-";
const char Morse_Comma[] = "--..--";
const char Morse_QuestionMark[] = "..--..";
const char Morse_Plus[] = ".-.-.";
const char Morse_AtSign[] = ".--.-.";
// Send a single character
void sendDotOrDash (char unit) {
//radio_enable_tx();
// Unit is a dot (500 ms)
if (unit == MORSE_DOT) {
//_delay_ms(MORSE_DELAY_DOT);
}
// Unit is a dash (1500 ms)
else if (unit == MORSE_DASH) {
//_delay_ms(MORSE_DELAY_DASH);
}
// Inter-element gap
//radio_inhibit_tx();
//_delay_ms(MORSE_DELAY);
}
void sendMorseSequence (const char* sequence) {
// Counter
int i = 0;
// Loop through every character until an 'end-of-line' (null) character is found
while (sequence[i] != 0) {
sendDotOrDash(sequence[i]);
i++;
}
// Delay between every letter
//_delay_ms(MORSE_DELAY * 3);
}
void sendMorse(const char* message){
int i = 0;
while (message[i] != 0){
const char current = message[i];
// Lower case letters
if (current >= 'a' && current <= 'z') {
sendMorseSequence(MORSE_LETTERS[current - 'a']);
}
// Capital case letters
else if (current >= 'A' && current <= 'Z') {
sendMorseSequence(MORSE_LETTERS[current - 'A']);
}
// Numbers
else if (current >= '0' && current <= '9') {
sendMorseSequence(MORSE_NUMBERS[current - '0']);
}
else switch (current) {
case '/': sendMorseSequence(Morse_Slash);
break;
case '=': sendMorseSequence(Morse_Equal);
break;
case '.': sendMorseSequence(Morse_FullStop);
break;
case ',': sendMorseSequence(Morse_Comma);
break;
case '?': sendMorseSequence(Morse_QuestionMark);
break;
case '+': sendMorseSequence(Morse_Plus);
break;
case '@': sendMorseSequence(Morse_AtSign);
break;
default:
break;
// Treat all other characters as a space.
//_delay_ms(MORSE_DELAY_SPACE);
}
i++;
}
//radio_disable_tx();
}