diff --git a/src/cw.cpp b/src/cw.cpp new file mode 100644 index 0000000..881f453 --- /dev/null +++ b/src/cw.cpp @@ -0,0 +1,37 @@ +#include +#include + +uint8_t convertASCII(char c){ + uint8_t result; + if(isalpha(c)){ + if(islower(c)){ + result = (uint8_t)c - 97; + }else{ + result = (uint8_t)c - 65; + } + } else if (isdigit(c)){ + result = (uint8_t)c - 22; + } else { + switch (c) { + case '-': + result = 36; + break; + case '.': + result = 36; + break; + case ',': + result = 36; + break; + case '?': + result = 36; + break; + case '/' || '\\': + result = 36; + break; + default: + result = 41; + break; + } + } + return result; +} \ No newline at end of file diff --git a/src/cw.h b/src/cw.h new file mode 100644 index 0000000..ee028a8 --- /dev/null +++ b/src/cw.h @@ -0,0 +1,55 @@ +#ifndef CW_H +#define CW_H + +#include +#include + +// Morse code representation for each character (A-Z, 0-9) +const char* morseCode[42] = { + ".-", // 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 + "-----", // 0 + ".----", // 1 + "..---", // 2 + "...--", // 3 + "....-", // 4 + ".....", // 5 + "-....", // 6 + "--...", // 7 + "---..", // 8 + "----.", // 9 + "-...-", // - + ".-.-.-", // . + "--..--", // , + "..--..", // ? + "-..-.", // / + ".-.-.", // End Of Message (41) +}; +uint8_t convertASCII(char c); +const char* allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.,?/\\"; + +#endif // CW_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0a7a2bf..0be45c4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,7 @@ #include #include +#include "cw.h" /* TODO: * - Implement sending strings @@ -29,6 +30,7 @@ uint16_t p_tol = 10, p_min = 50, p_max = 2000, p_buf = 0, p_cache = 0; String serial_buffer = ""; char buf; +void key_string(String); void adjust_length(uint16_t); void set_length(uint16_t, uint16_t); void send(bool); @@ -42,11 +44,11 @@ void setup() { pinMode(input_dah, INPUT_PULLUP); pinMode(input_pot, INPUT); pinMode(output, OUTPUT); - digitalWrite(output, HIGH); + digitalWrite(output, LOW); log("Read EEPROM\n"); dit = EEPROM.read(20); dah = EEPROM.read(21); - // debug = EEPROM.read(22); + debug = EEPROM.read(22); p_buf = analogRead(input_pot); adjust_length(p_buf); log("Setup complete\n"); @@ -62,7 +64,6 @@ void setup() { } void loop() { - log("."); if (!digitalRead(input_dah)){ send(true); }else if (!digitalRead(input_dit)){ @@ -82,13 +83,10 @@ void loop() { if (Serial.available() > 0) { buf = Serial.read(); - log("SR "); - log(String(buf)); - log("\n"); if ((uint16_t) buf == 13){ process_input(serial_buffer); serial_buffer = ""; - } else { + } else if ((uint8_t) buf > 27 ){ serial_buffer += buf; } } @@ -111,7 +109,7 @@ void process_input(String input){ log(input); log("\n"); char command = input[0]; - input.remove(0); + input.remove(0,1); log("Command: "); log(String(command)); log(" - "); @@ -120,7 +118,7 @@ void process_input(String input){ uint16_t length = 0; switch(command){ case 'S': - // TODO + key_string(input); break; case 'I': length = input.toInt(); @@ -132,6 +130,7 @@ void process_input(String input){ break; case 'D': debug = boolean(input.toInt()==1); + log("Debug mode enabled"); EEPROM.write(22, debug); break; default: @@ -140,13 +139,39 @@ void process_input(String input){ } } +void key_string(String input){ + // log("Sending string: "); + // log(input); + // log("\n"); + uint8_t b = 0; + for (uint8_t i = 0; i < input.length(); i++){ + char c = input[i]; + if ((uint8_t)c != 32){ + b = convertASCII(c); + for(uint8_t y = 0; y < strlen(morseCode[b]); y++){ + send(morseCode[b][y] == '.'); + delay(dit); + } + if(debug){ + Serial.print(' '); + } + delay(dit); + } else { + if (debug){ + Serial.print(" "); + } + delay(dah); + } + } +} + void send(bool b) { - log("Sending "); - log(b?"dah":"dit"); - log("\n"); - digitalWrite(output, LOW); - delay(b?dit:dah); + if (debug){ + Serial.print(b?"+":"="); + } digitalWrite(output, HIGH); + delay(b?dit:dah); + digitalWrite(output, LOW); } void set_length(uint16_t length_dit, uint16_t length_dah) {