diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-08-03 00:00:08 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-08-03 00:00:08 +0200 |
commit | 7b9caafc2df24298b0cd101f72201d2d78976204 (patch) | |
tree | efcddb14727c6ab0c4f20d97a98c8a9e2d9d412c /src | |
parent | 03a611053df998984b40a4f91a941210a1e71674 (diff) | |
download | renard_hb9hi-7b9caafc2df24298b0cd101f72201d2d78976204.tar.gz renard_hb9hi-7b9caafc2df24298b0cd101f72201d2d78976204.tar.bz2 renard_hb9hi-7b9caafc2df24298b0cd101f72201d2d78976204.zip |
(untested) Add better morse code support
Diffstat (limited to 'src')
-rw-r--r-- | src/testapp1/main.c | 29 | ||||
-rw-r--r-- | src/testapp1/morse.c | 98 |
2 files changed, 109 insertions, 18 deletions
diff --git a/src/testapp1/main.c b/src/testapp1/main.c index ef14019..c266684 100644 --- a/src/testapp1/main.c +++ b/src/testapp1/main.c @@ -35,7 +35,7 @@ static int inittimer(void) #define PTT_LOGIC_LOW 0 #if PTT_LOGIC_LOW -void dah() +void dah(void) { PORTB = 0; // PTT is inverted logic delay_ms(3*DIT_DURATION); @@ -44,7 +44,7 @@ void dah() delay_ms(DIT_DURATION); } -void dit() +void dit(void) { PORTB = 0; // PTT is inverted logic delay_ms(DIT_DURATION); @@ -53,7 +53,7 @@ void dit() delay_ms(DIT_DURATION); } #else -void dah() +void dah(void) { PORTB = PORTB_PTT; delay_ms(3*DIT_DURATION); @@ -62,7 +62,7 @@ void dah() delay_ms(DIT_DURATION); } -void dit() +void dit(void) { PORTB = PORTB_PTT; delay_ms(DIT_DURATION); @@ -72,7 +72,9 @@ void dit() } #endif -int main ( void ) +#include "morse.c" + +int main(void) { /* Enable PTT output on PB0 */ PORTB = PORTB_PTT; @@ -85,21 +87,12 @@ int main ( void ) /* initialise timer interrupt */ inittimer(); + morse("HB9EGM"); + delay_ms(12*DIT_DURATION); + while (1) { // morse code ! - dah(); - dah(); - - delay_ms(2*DIT_DURATION); - dah(); - dah(); - dah(); - - delay_ms(2*DIT_DURATION); - dit(); - dit(); - dit(); - + morse("MOH"); delay_ms(6*DIT_DURATION); } 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'); +} + |