#define LEDPIN 13 #define WPMOFFSET 10 // Byte offset in EEPROM for WPM #define TONEPIN 11 #define NORMALENCODING 0 #define FARNSWORTHENCODING 1 char morseTable[] = { 0b101, // A = dit dah 0b11000, // B = dah dit dit dit etc. 0b11010, // C 0b1100, // D 0b10, // E 0b10010, // F 0b1110, // G 0b10000, // H 0b100, // I 0b10111, // J 0b1101, // K 0b10100, // L 0b111, // M 0b110, // N 0b1111, // O 0b10110, // P 0b11101, // Q 0b1010, // R 0b1000, // S 0b11, // T 0b1001, // U 0b10001, // V 0b1011, // W 0b11001, // X 0b11011, // Y 0b11100 // Z }; char numberTable[] = { 0b111111, // 0 0b101111, // 1 0b100111, // 2 0b100011, // 3 0b100001, // 4 0b100000, // 5 0b110000, // 6 0b111000, // 7 0b111100, // 8 0b111110 // 9 }; byte WPM; // Yep, you're limited to 255 words per minute... byte displayState; extern int ditDelay; extern int wordsPerMinute; int elements; // Holds menu elements int encodingType; // Normal or Farnsowrth int menuSelection; // Which menu is active int menuIndex; // Which menu option is active int toneFrequency = 700; // Default extern const char *contestExchanges[]; extern int currentTone; void WriteWPM(); / Purpose: to cause a delay in program execution Paramter list: unsigned long millisWait // the number of millseconds to wait Return value: void / void mydelay(unsigned long millisWait) { unsigned long now = millis(); while (millis() - now < millisWait) ; // Twiddle thumbs... } / Purpose: to send a Morse code dit Paramter list: void Return value: void CAUTION: Assumes that a global named ditDelay holds the value for dit spacing / void dit() { digitalWrite(LEDPIN, HIGH); NewTone(TONEPIN, currentTone, 0); mydelay(ditDelay); noNewTone(TONEPIN); // Turn off the tone. digitalWrite(LEDPIN, LOW); mydelay(ditDelay); } / Purpose: to send a Morse code dah Paramter list: void Return value: void CAUTION: Assumes that a global named ditDelay holds the value for dit spacing / void dah() { digitalWrite(LEDPIN, HIGH); NewTone(TONEPIN, currentTone, 0); mydelay(3 * ditDelay); noNewTone(TONEPIN); // Turn off the tone. digitalWrite(LEDPIN, LOW); mydelay(ditDelay); } / Purpose: to provide spacing between letters Paramter list: void Return value: void CAUTION: Assumes that a global named ditDelay holds the value for dit spacing / void LetterSpace() { mydelay(3 * ditDelay); } / Purpose: to provide spacing between words Paramter list: void Return value: void CAUTION: Assumes that a global named ditDelay holds the value for dit spacing / void WordSpace() { mydelay(7 * ditDelay); } / Purpose: to send a Morse code character Paramter list: char code the code for the letter to send Return value: void / void SendCode(char code) { int i; for (i = 7; i >= 0; i--) if (code & (1 << i)) break; for (i--; i >= 0; i--) { if (code & (1 << i)) dah(); else dit(); } LetterSpace(); } / Purpose: to send a Morse code character Paramter list: char myChar The character to be sent Return value: void / void Send(char myChar) { if (isalpha(myChar)) { SendCode(morseTable[myChar - 'A']); // Make into a zero-based array index return; } else if (isdigit(myChar)) { SendCode(numberTable[myChar - '0']); // Same deal here... return; } switch (myChar) { // Non-aalpha and non-digit characters case ' ': case '\r': case '\n': WordSpace(); break; case '.': SendCode(0b1010101); break; case ',': SendCode(0b1110011); break; case '!': SendCode(0b1101011); break; case '?': SendCode(0b1001100); break; case '/': SendCode(0b110010); break; case '+': SendCode(0b101010); break; case '-': SendCode(0b1100001); break; case '=': SendCode(0b110001); break; case '@': SendCode(0b1011010); break; default: // lcd.setCursor(2, 0); // lcd.print("Unknown char"); break; } } void SendMessage(int whichOne) { char *ptr; ptr = (char *) contestExchanges[whichOne]; Serial.println(contestExchanges[whichOne]); while (*ptr) Send(*ptr++); } / Purpose: establish the dit length for code transmission. Crucial since all spacing is done using dit length Parameter list: void Retrun value: void / void SetDitLength() { if (encodingType == NORMALENCODING) { ditDelay = 1200 / wordsPerMinute; } } / Purpose: to cause a delay in program execution Paramter list: unsigned long millisWait // the number of millseconds to wait Return value: void / void MyDelay(unsigned long millisWait) { unsigned long now = millis(); while (millis() - now < millisWait) ; // Twiddle thumbs... } / Purpose: read the WPM speed last used from EEPROM Parameter list: void Retrun value: void / void ReadWPM() { wordsPerMinute = EEPROM.read(WPMOFFSET); if (wordsPerMinute < 5 || wordsPerMinute > 80) { wordsPerMinute = 20; WriteWPM(); } } / Purpose: save the WPM speed last used to EEPROM Parameter list: void Retrun value: void / void WriteWPM() { EEPROM.write(wordsPerMinute, WPM); }