morse.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Morse Code Playback Functions
  2. // Formerly Mark Jessop 2018-04 & OK1TE 2018-11, who did this totally differently.
  3. // (no longer) Based on code from https://github.com/Paradoxis/Arduino-morse-code-translator/blob/master/main.ino
  4. // --
  5. // Who on earth does string constants in embedded code..
  6. // Chris Baird,, <chris.j.baird@gmail.com> 2020-03-26
  7. #include "morse.h"
  8. #include "config.h"
  9. #include "radio.h"
  10. #include "delay.h"
  11. #define GREEN GPIO_Pin_7
  12. #define RED GPIO_Pin_8
  13. int MORSE_DELAY = (1200 / MORSE_WPM);
  14. #define MORSE_DELAY_DIT (MORSE_DELAY * 1)
  15. #define MORSE_DELAY_DAH (MORSE_DELAY * 3)
  16. /* Idea from 'Efficient Storage Of Morse Code Character Codes',
  17. * Lawrence Krakauer, page 36, Issue 14, BYTE 1976-10
  18. */
  19. const unsigned char morsetable[] =
  20. {
  21. 'A', 0b01100000, 'B', 0b10001000, 'C', 0b10101000, 'D', 0b10010000,
  22. 'E', 0b01000000, 'F', 0b00101000, 'G', 0b11010000, 'H', 0b00001000,
  23. 'I', 0b00100000, 'J', 0b01111000, 'K', 0b10110000, 'L', 0b01001000,
  24. 'M', 0b11100000, 'N', 0b10100000, 'O', 0b11110000, 'P', 0b01101000,
  25. 'Q', 0b11011000, 'R', 0b01010000, 'S', 0b00010000, 'T', 0b11000000,
  26. 'U', 0b00110000, 'V', 0b00011000, 'W', 0b01110000, 'X', 0b10011000,
  27. 'Y', 0b10111000, 'Z', 0b11001000, '0', 0b11111100, '1', 0b01111100,
  28. '2', 0b00111100, '3', 0b00011100, '4', 0b00001100, '5', 0b00000100,
  29. '6', 0b10000100, '7', 0b11000100, '8', 0b11100100, '9', 0b11110100,
  30. '(', 0b10110100, ')', 0b10110110, ',', 0b11001110, '-', 0b10000110,
  31. '.', 0b01010110, '/', 0b10010100, ':', 0b11100010, ';', 0b10101010,
  32. '=', 0b10001100, '?', 0b00110010, '@', 0b01101010, '+', 0b01010100,
  33. '&', 0b01000100, '\"',0b01001010, '\'',0b01111010,
  34. 0,0
  35. };
  36. char morse_sanitize (char c)
  37. {
  38. char r = 0;
  39. if ((c > 96) && (c < 123)) c -= 32;
  40. if ((c > 64) && (c < 91)) r = c;
  41. if ((c > 47) && (c < 58)) r = c;
  42. return r;
  43. }
  44. void encode_char_ook (unsigned char c)
  45. {
  46. int i = 0;
  47. unsigned char j;
  48. c = morse_sanitize(c);
  49. for (i = 0; j = morsetable[i], j && (j != c); i += 2) continue;
  50. if (j)
  51. {
  52. unsigned char b = morsetable[i+1];
  53. do
  54. {
  55. radio_enable_tx();
  56. GPIO_ResetBits(GPIOB, RED); /* too lazy to include in led_enabled */
  57. _delay_ms (b&128 ? MORSE_DELAY_DAH : MORSE_DELAY_DIT);
  58. GPIO_SetBits(GPIOB, RED);
  59. radio_disable_tx();
  60. _delay_ms (MORSE_DELAY_DIT);
  61. b = (b & 127) << 1;
  62. }
  63. while (b != 128);
  64. _delay_ms (MORSE_DELAY_DIT*2);
  65. }
  66. else
  67. /* tx idle-dah on unknown/space characters */
  68. _delay_ms (MORSE_DELAY_DAH);
  69. }
  70. void send_morse (const char* message)
  71. {
  72. radio_enable_tx ();
  73. while (*message) encode_char_ook (*message++);
  74. radio_disable_tx ();
  75. }