You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
3.8 KiB
180 lines
3.8 KiB
/* |
|
* Telegraph - Arduino library for sending Morse code |
|
* |
|
* Copyright (C) 2023 Samuel Sloniker KJ7RRV |
|
* |
|
* This program is free software: you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License as published by the Free |
|
* Software Foundation, either version 3 of the License, or (at your option) |
|
* any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|
* more details. |
|
* |
|
* You should have received a copy of the GNU General Public License along with |
|
* this program. If not, see <https://www.gnu.org/licenses/>. |
|
*/ |
|
|
|
#include "Arduino.h" |
|
#include "Telegraph.h" |
|
|
|
Telegraph::Telegraph(int pin, int speed, int activeValue) { |
|
pinMode(pin, OUTPUT); |
|
_pin = pin; |
|
_activeValue = activeValue; |
|
_inactiveValue = (activeValue == HIGH)?LOW:HIGH; |
|
digitalWrite(_pin, _inactiveValue); |
|
wpm = speed; |
|
} |
|
|
|
void Telegraph::on() { |
|
digitalWrite(_pin, _activeValue); |
|
} |
|
|
|
void Telegraph::off() { |
|
digitalWrite(_pin, _inactiveValue); |
|
} |
|
|
|
String Telegraph::_lookUpLetter(char letter) { |
|
switch(toupper(letter)) { |
|
case 'A' : |
|
return ".-"; |
|
case 'B' : |
|
return "-..."; |
|
case 'C' : |
|
return "-.-."; |
|
case 'D' : |
|
return "-.."; |
|
case 'E' : |
|
return "."; |
|
case 'F' : |
|
return "..-."; |
|
case 'G' : |
|
return "--."; |
|
case 'H' : |
|
return "...."; |
|
case 'I' : |
|
return ".."; |
|
case 'J' : |
|
return ".---"; |
|
case 'K' : |
|
return "-.-"; |
|
case 'L' : |
|
return ".-.."; |
|
case 'M' : |
|
return "--"; |
|
case 'N' : |
|
return "-."; |
|
case 'O' : |
|
return "---"; |
|
case 'P' : |
|
return ".--."; |
|
case 'Q' : |
|
return "--.-"; |
|
case 'R' : |
|
return ".-."; |
|
case 'S' : |
|
return "..."; |
|
case 'T' : |
|
return "-"; |
|
case 'U' : |
|
return "..-"; |
|
case 'V' : |
|
return "...-"; |
|
case 'W' : |
|
return ".--"; |
|
case 'X' : |
|
return "-..-"; |
|
case 'Y' : |
|
return "-.--"; |
|
case 'Z' : |
|
return "--.."; |
|
case '1' : |
|
return ".----"; |
|
case '2' : |
|
return "..---"; |
|
case '3' : |
|
return "...--"; |
|
case '4' : |
|
return "....-"; |
|
case '5' : |
|
return "....."; |
|
case '6' : |
|
return "-...."; |
|
case '7' : |
|
return "--..."; |
|
case '8' : |
|
return "---.."; |
|
case '9' : |
|
return "----."; |
|
case '0' : |
|
return "-----"; |
|
case '.' : |
|
return ".-.-.-"; |
|
case ',' : |
|
return "--..--"; |
|
case '?' : |
|
return "..--.."; |
|
case '\'' : |
|
return ".----."; |
|
case '!' : |
|
return "-.-.--"; |
|
case '/' : |
|
return "-..-."; |
|
case '(' : |
|
return "-.--."; |
|
case ')' : |
|
return "-.--.-"; |
|
case '&' : |
|
return ".-..."; |
|
case ':' : |
|
return "---..."; |
|
case ';' : |
|
return "-.-.-."; |
|
case '=' : |
|
return "-...-"; |
|
case '+' : |
|
return ".-.-."; |
|
case '-' : |
|
return "-....-"; |
|
case '_' : |
|
return "..--.-"; |
|
case '"' : |
|
return ".-..-."; |
|
case '$' : |
|
return "...-..-"; |
|
case '@' : |
|
return ".--.-."; |
|
default: |
|
return ""; |
|
} |
|
} |
|
|
|
void Telegraph::_sendLetter(char letter, bool last) { |
|
int ditLength = 1200 / wpm; |
|
|
|
if (letter == ' ') { |
|
delay(ditLength * 4); |
|
} else { |
|
String symbols = _lookUpLetter(letter); |
|
for(int i = 0; i < symbols.length(); ++i) { |
|
on(); |
|
delay(ditLength * ((symbols[i] == '-')?3:1)); |
|
off(); |
|
if (i != symbols.length()-1) { |
|
delay(ditLength); |
|
} |
|
} |
|
if (! last) { |
|
delay(ditLength * 3); |
|
} |
|
} |
|
} |
|
|
|
void Telegraph::send(String text) { |
|
for(int i = 0; i < text.length(); ++i) { |
|
_sendLetter(text[i], i == text.length()-1); |
|
} |
|
}
|
|
|