diff options
Diffstat (limited to 'src/testapp1/morse.c')
-rw-r--r-- | src/testapp1/morse.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/testapp1/morse.c b/src/testapp1/morse.c new file mode 100644 index 0000000..a448a4b --- /dev/null +++ b/src/testapp1/morse.c @@ -0,0 +1,98 @@ +const uint8_t morse_mapping[60] PROGMEM = +{ + // Read bits from right to left + + 0b110101, //+ ASCII 43 + 0b110101, //, ASCII 44 + 0b1011110, //- ASCII 45 + + 0b1010101, //., ASCII 46 + 0b110110, // / ASCII 47 + + 0b100000, // 0, ASCII 48 + 0b100001, // 1 + 0b100011, + 0b100111, + 0b101111, + 0b111111, + 0b111110, + 0b111100, + 0b111000, + 0b110000, // 9, ASCII 57 + + // The following are mostly invalid, but + // required to fill the gap in ASCII between + // numerals and capital letters + 0b10, // : + 0b10, // ; + 0b10, // < + 0b10, // = + 0b10, // > + 0b1110011, // ? + 0b1101001, //@ + + 0b101, // A ASCII 65 + 0b11110, + 0b11010, + 0b1110, + 0b11, + 0b11011, + 0b1100, + 0b11111, + 0b111, + 0b10001, + 0b1010, + 0b11101, + 0b100, //M + 0b110, + 0b1000, + 0b11001, + 0b10100, + 0b1101, + 0b1111, + 0b10, + 0b1011, + 0b10111, + 0b1001, + 0b10110, + 0b10010, + 0b11100, // Z + + 0b101010, //Start, ASCII [ + 0b1010111, // SK , ASCII '\' +}; + +void morse_symbol(uint8_t sym) +{ + uint8_t p = 0; + uint8_t val = pgm_read_byte(&morse_mapping[sym]); + + while((val >> p) != 0b1) { + + if (p != 0) { + delay_ms(2 * DIT_DURATION); + } + + if (((val >> p) & 0b1) == 0b1) { + dit(); + } + else { + dah(); + } + + p++; + } +} + +// Transmit a string in morse code. Supported range: +// All ASCII between '+' and '\', which includes +// numerals and capital letters. +void morse(char* text) +{ + char* sym = text; + do { + morse_symbol(*sym - '+'); + sym++; + } while (*sym != '\0'); +} + |