Lots of new functionality in FEATURE_TRAINING_COMMAND_LINE_INTERFACE
      keyer_training_text_norsk.h content contributed by Martin, OK1RR
      Norwegian language support for Wordsworth training: OPTION_WORDSWORTH_NORSK
pull/25/merge
Anthony Good 2017-05-06 19:38:57 -04:00
rodzic d9f021c17d
commit 69f2e4004d
19 zmienionych plików z 980 dodań i 111 usunięć

Wyświetl plik

@ -697,6 +697,11 @@ Recent Update History
keyer_training_text_czech.h contributed by Martin, OK1RR
Czech language support for Wordsworth training: OPTION_WORDSWORTH_CZECH
2017.05.06.01
Lots of new functionality in FEATURE_TRAINING_COMMAND_LINE_INTERFACE
keyer_training_text_norsk.h content contributed by Martin, OK1RR
Norwegian language support for Wordsworth training: OPTION_WORDSWORTH_NORSK
This code is currently maintained for and compiled with Arduino 1.8.1. Your mileage may vary with other versions.
ATTENTION: LIBRARY FILES MUST BE PUT IN LIBRARIES DIRECTORIES AND NOT THE INO SKETCH DIRECTORY !!!!
@ -704,7 +709,7 @@ Recent Update History
FOR EXAMPLE:
K3NG_PS2Keyboard.h, K3NG_PS2Keyboard.cpp -----> \Arduino\Sketchbook\libraries\K3NG_PS2Keyboard\
Goertz.h, Gooertz.cpp ------------------------> \Arduino\Sketchbook\libraries\Goertz\
Goertz.h, Goertz.cpp ------------------------> \Arduino\Sketchbook\libraries\Goertz\
BasicTerm.h, BasicTerm.cpp -------------------> \Arduino\Sketchbook\libraries\BasicTerm\
@ -712,8 +717,8 @@ Recent Update History
*/
#define CODE_VERSION "2017.05.05.01"
#define eeprom_magic_number 25
#define CODE_VERSION "2017.05.06.01"
#define eeprom_magic_number 26
#include <stdio.h>
#include "keyer_hardware.h"
@ -880,6 +885,7 @@ struct config_t { //48 bytes
uint8_t link_receive_enabled;
uint8_t paddle_interruption_quiet_time_element_lengths;
uint8_t wordsworth_wordspace;
uint8_t wordsworth_repetition;
} configuration;
byte sending_mode = UNDEFINED_SENDING;
@ -1328,9 +1334,13 @@ unsigned long millis_rollover = 0;
#include "keyer_training_text_czech.h"
#elif defined(OPTION_WORDSWORTH_DEUTCSH)
#include "keyer_training_text_deutsch.h"
#elif defined(OPTION_WORDSWORTH_NORSK)
#include "keyer_training_text_norsk.h"
#else
#include "keyer_training_text_english.h"
#endif
#include "keyer_callsign_prefixes.h"
#endif
@ -10410,42 +10420,81 @@ void serial_tune_command (PRIMARY_SERIAL_CLS * port_to_use)
//---------------------------------------------------------------------
#ifdef FEATURE_TRAINING_COMMAND_LINE_INTERFACE
String generate_callsign() {
String generate_callsign(byte callsign_mode) {
String callsign(10);
static String callsign(10);
char nextchar;
long random_number = 0;
char word_buffer[10];
switch (random(1,5)) {
case 1: callsign = "K"; break;
case 2: callsign = "W"; break;
case 3: callsign = "N"; break;
case 4: callsign = "A"; break;
}
if (callsign == "A") { // if the first letter is A, we definitely need a second letter before the number
nextchar = random(65,91);
callsign = callsign + nextchar;
} else {
random_number = random(0,1); // randomly add a second letter for K, W, N prefixes
if (random_number) {
callsign = "";
if (callsign_mode == CALLSIGN_INTERNATIONAL){
if (random(1,101) < 96) {
// start with a letter 96% of the time
nextchar = random(65,91);
callsign = callsign + nextchar;
if (random(1,101) < 20) { // randomly add second prefix letter 20% of the time
nextchar = random(65,91);
callsign = callsign + nextchar;
}
} else {
// start with a number
nextchar = random(49,58); // generate the number
callsign = callsign + nextchar;
nextchar = random(65,91); // must add a letter next
callsign = callsign + nextchar;
}
} //CALLSIGN_INTERNATIONAL
if (callsign_mode == CALLSIGN_US){
switch (random(1,5)) {
case 1: callsign = "K"; break;
case 2: callsign = "W"; break;
case 3: callsign = "N"; break;
case 4: callsign = "A"; break;
}
if (callsign == "A") { // if the first letter is A, we definitely need a second letter before the number
nextchar = random(65,91);
callsign = callsign + nextchar;
} else {
// randomly add a second letter for K, W, N prefixes
if (random(1,101) < 51) {
nextchar = random(65,91);
callsign = callsign + nextchar;
}
}
} //CALLSIGN_US
if (callsign_mode == CALLSIGN_CANADA){
strcpy_P(word_buffer, (char*)pgm_read_word(&(canadian_prefix_table[random(0,canadian_prefix_size)])));
callsign = word_buffer;
}
nextchar = random(48,58); // generate the number
callsign = callsign + nextchar;
if (callsign_mode == CALLSIGN_EUROPEAN){
strcpy_P(word_buffer, (char*)pgm_read_word(&(eu_prefix_table[random(0,eu_prefix_size)])));
callsign = word_buffer;
}
if (callsign_mode != CALLSIGN_CANADA){
nextchar = random(48,58); // generate the number
callsign = callsign + nextchar;
}
nextchar = random(65,91); // generate first letter after number
callsign = callsign + nextchar;
if (random(1,5) < 4) { // randomly put a second character after the number
if ((random(1,101) < 40) || (callsign_mode == CALLSIGN_CANADA)) { // randomly put a second character after the number
nextchar = random(65,91);
callsign = callsign + nextchar;
if (random_number < 3) { // randomly put a third character after the number
if ((random(1,101) < 96) || (callsign_mode == CALLSIGN_CANADA)) { // randomly put a third character after the number
nextchar = random(65,91);
callsign = callsign + nextchar;
}
}
if (random(1,16) == 1) { // randomly put a slash something on the end like /QRP or /#
if (random(1,4) == 1) {
if (random(1,101) < 10) { // randomly put a slash something on the end like /QRP or /#
if (random(1,101) < 25) {
callsign = callsign + "/QRP";
} else {
nextchar = random(48,58);
@ -10709,6 +10758,9 @@ void serial_cw_practice(PRIMARY_SERIAL_CLS * port_to_use){
char incoming_char = ' ';
check_serial_override = 1;
byte previous_key_tx_state = key_tx;
key_tx = 0;
while(menu_loop){
@ -10717,7 +10769,8 @@ void serial_cw_practice(PRIMARY_SERIAL_CLS * port_to_use){
}
port_to_use->println(F("\r\n\nCW Training Menu\n"));
port_to_use->println(F("U - US Callsigns"));
port_to_use->println(F("C - Callsigns"));
port_to_use->println(F("I - Callsigns - Interactive Practice"));
port_to_use->println(F("W - Wordsworth"));
//port_to_use->println("2 - PA QSO Party"); // Don't think this is working right / wasn't finished - Goody 2017-05-01
port_to_use->println(F("\nX - Exit\n"));
@ -10737,19 +10790,75 @@ void serial_cw_practice(PRIMARY_SERIAL_CLS * port_to_use){
switch(incoming_char){
case 'X': menu_loop = 0; break;
case 'U': us_callsign_practice(port_to_use); break;
case 'C': serial_callsign_practice_menu(port_to_use,PRACTICE_NON_INTERACTIVE); break;
case 'I': serial_callsign_practice_menu(port_to_use,PRACTICE_INTERACTIVE); break;
case 'W': serial_wordsworth_menu(port_to_use); break;
//case '2': paqso_practice(port_to_use); break;
} //switch(incoming_char)
} //while(menu_loop)
port_to_use->println(F("Exiting Training module..."));
check_serial_override = 0;
key_tx = previous_key_tx_state;
}
#endif
//---------------------------------------------------------------------
#if defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
void serial_callsign_practice_menu(PRIMARY_SERIAL_CLS * port_to_use,byte practice_mode){
byte menu_loop = 1;
byte menu_loop2 = 1;
char incoming_char = ' ';
while(menu_loop){
while (port_to_use->available() > 0) { // clear out the buffer if anything is there
port_to_use->read();
}
port_to_use->println(F("\r\n\nCallsign Practice Menu\n"));
port_to_use->println(F("I - International Callsigns"));
port_to_use->println(F("U - US Callsigns"));
port_to_use->println(F("E - European Callsigns"));
port_to_use->println(F("C - Canadian Callsigns"));
port_to_use->println(F("\nX - Exit\n"));
menu_loop2 = 1;
while (menu_loop2){
if (port_to_use->available()){
incoming_char = port_to_use->read();
menu_loop2 = 0;
}
}
incoming_char = toUpperCase(incoming_char);
if (practice_mode == PRACTICE_INTERACTIVE){
switch(incoming_char){
case 'X': menu_loop = 0; break;
case 'I': callsign_practice_interactive(port_to_use,CALLSIGN_INTERNATIONAL); break;
case 'U': callsign_practice_interactive(port_to_use,CALLSIGN_US); break;
case 'E': callsign_practice_interactive(port_to_use,CALLSIGN_EUROPEAN); break;
case 'C': callsign_practice_interactive(port_to_use,CALLSIGN_CANADA); break;
} //switch(incoming_char)
} else {
switch(incoming_char){
case 'X': menu_loop = 0; break;
case 'I': callsign_practice_non_interactive(port_to_use,CALLSIGN_INTERNATIONAL); break;
case 'U': callsign_practice_non_interactive(port_to_use,CALLSIGN_US); break;
case 'E': callsign_practice_non_interactive(port_to_use,CALLSIGN_EUROPEAN); break;
case 'C': callsign_practice_non_interactive(port_to_use,CALLSIGN_CANADA); break;
} //switch(incoming_char)
}
} //while(menu_loop)
port_to_use->println(F("Exiting callsign training..."));
}
#endif
@ -10757,7 +10866,7 @@ void serial_cw_practice(PRIMARY_SERIAL_CLS * port_to_use){
//---------------------------------------------------------------------
#if defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
void serial_enter_wpm_wordspace(PRIMARY_SERIAL_CLS * port_to_use,byte wpm_or_wordspace){
void serial_set_wordspace_parameters(PRIMARY_SERIAL_CLS * port_to_use,byte mode_select){
byte menu_loop = 1;
byte menu_loop2 = 1;
@ -10771,12 +10880,13 @@ void serial_enter_wpm_wordspace(PRIMARY_SERIAL_CLS * port_to_use,byte wpm_or_wor
port_to_use->read();
}
if (wpm_or_wordspace){
port_to_use->print(F("\r\nEnter Wordspace >"));
} else {
port_to_use->print(F("\r\nEnter WPM >"));
switch(mode_select){
case WORDSWORTH_WORDSPACE: port_to_use->print(F("\r\nEnter Wordspace >")); break;
case WORDSWORTH_WPM: port_to_use->print(F("\r\nEnter WPM >")); break;
case WORDSWORTH_REPETITION: port_to_use->print(F("\r\nEnter Repetition >")); break;
}
menu_loop2 = 1;
temp_value = 0;
@ -10798,31 +10908,31 @@ void serial_enter_wpm_wordspace(PRIMARY_SERIAL_CLS * port_to_use,byte wpm_or_wor
if (temp_value == 0){
menu_loop = 0; // just blow out if nothing was entered
} else {
if ((temp_value > 0) && (temp_value < 101) && (wpm_or_wordspace == 0)){
if ((temp_value > 0) && (temp_value < 101) && (mode_select == WORDSWORTH_WPM)){
configuration.wpm = temp_value;
config_dirty = 1;
menu_loop = 0;
} else {
if ((temp_value > 1) && (temp_value < 13) && (wpm_or_wordspace == 1)){
if ((temp_value > 1) && (temp_value < 13) && (mode_select == WORDSWORTH_WORDSPACE)){
configuration.wordsworth_wordspace = temp_value;
config_dirty = 1;
menu_loop = 0;
} else {
port_to_use->println(F("\r\nOMG that's an invalid value. Try again, OM..."));
if ((temp_value > 0) && (temp_value < 11) && (mode_select == WORDSWORTH_REPETITION)){
configuration.wordsworth_repetition = temp_value;
config_dirty = 1;
menu_loop = 0;
} else {
port_to_use->println(F("\r\nOMG that's an invalid value. Try again, OM..."));
}
}
}
}
} //while(menu_loop)
}
#endif //defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
//---------------------------------------------------------------------
#if defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
@ -10846,15 +10956,18 @@ void serial_wordsworth_menu(PRIMARY_SERIAL_CLS * port_to_use){
port_to_use->println(F("N - Names"));
port_to_use->println(F("Q - QSO Words"));
port_to_use->println(F("M - Mixed\n"));
port_to_use->println(F("S - Set wordspace"));
port_to_use->println(F("O - Set Wordspace"));
port_to_use->println(F("W - Set WPM"));
port_to_use->println(F("R - Set Repetition"));
port_to_use->println(F("\nX - Exit\n"));
port_to_use->print(F("WPM:"));
port_to_use->print(configuration.wpm);
port_to_use->print(F(" Wordspace:"));
port_to_use->print(configuration.wordsworth_wordspace);
port_to_use->print(F(" Effective WPM:"));
port_to_use->println(configuration.wpm * (effective_wpm_factor[configuration.wordsworth_wordspace-1]/100.0),0);
port_to_use->print(configuration.wpm * (effective_wpm_factor[configuration.wordsworth_wordspace-1]/100.0),0);
port_to_use->print(F(" Repetition:"));
port_to_use->println(configuration.wordsworth_repetition);
menu_loop2 = 1;
@ -10875,13 +10988,10 @@ void serial_wordsworth_menu(PRIMARY_SERIAL_CLS * port_to_use){
case 'N': wordsworth_practice(port_to_use,WORDSWORTH_NAMES); break;
case 'M': wordsworth_practice(port_to_use,WORDSWORTH_MIXED); break;
case 'Q': wordsworth_practice(port_to_use,WORDSWORTH_QSO_WORDS); break;
case 'W': serial_enter_wpm_wordspace(port_to_use,0); break;
case 'S': serial_enter_wpm_wordspace(port_to_use,1); break;
case 'X': menu_loop = 0; break;
//case '1': us_callsign_practice(port_to_use); break;
//case '2': serial_wordsworth_menu(port_to_use); break;
case 'W': serial_set_wordspace_parameters(port_to_use,WORDSWORTH_WPM); break;
case 'O': serial_set_wordspace_parameters(port_to_use,WORDSWORTH_WORDSPACE); break;
case 'R': serial_set_wordspace_parameters(port_to_use,WORDSWORTH_REPETITION); break;
case 'X': menu_loop = 0; break;
} //switch(incoming_char)
@ -10903,20 +11013,19 @@ void wordsworth_practice(PRIMARY_SERIAL_CLS * port_to_use,byte practice_type)
byte loop1 = 1;
byte loop2;
byte loop3;
unsigned int word_index;
char word_buffer[10];
byte x;
byte not_printed;
byte practice_type_called = practice_type;
byte repetitions;
byte previous_key_tx_state = key_tx;
key_tx = 0;
randomSeed(millis());
//
port_to_use->println(F("Wordsworth practice...\n"));
while (port_to_use->available() > 0) { // clear out the buffer if anything is there
@ -10956,55 +11065,66 @@ void wordsworth_practice(PRIMARY_SERIAL_CLS * port_to_use,byte practice_type)
break;
}
// debug_serial_port->print("wordsworth_practice: word_index:");
// debug_serial_port->println(word_index);
#if defined(DEBUG_WORDSWORTH)
debug_serial_port->print("wordsworth_practice: word_index:");
debug_serial_port->println(word_index);
debug_serial_port->print("wordsworth_practice: word_buffer:");
debug_serial_port->println(word_buffer);
#endif
loop3 = 1;
repetitions = 0;
// debug_serial_port->print("wordsworth_practice: word_buffer:");
// debug_serial_port->println(word_buffer);
while ((loop3) && (repetitions < configuration.wordsworth_repetition)){ // word sending loop
x = 0;
loop2 = 1;
loop2 = 1;
x = 0;
while (loop2){
//zzzzz
while (loop2){ //character sending loop
// debug_serial_port->print("wordsworth_practice: send_char:");
// debug_serial_port->println(word_buffer[x]);
#if defined(DEBUG_WORDSWORTH)
debug_serial_port->print("wordsworth_practice: send_char:");
debug_serial_port->println(word_buffer[x]);
#endif
word_buffer[x] = toUpperCase(word_buffer[x]);
send_char(word_buffer[x],KEYER_NORMAL);
x++;
not_printed = 1;
word_buffer[x] = toUpperCase(word_buffer[x]);
send_char(word_buffer[x],KEYER_NORMAL);
x++;
not_printed = 1;
if ((word_buffer[x] == 0) || (x > 9)){ // are we at the end of the word?
loop2 = 0;
for (int y = 0;y < (configuration.wordsworth_wordspace-1);y++){ // send extra word spaces
send_char(' ',KEYER_NORMAL);
if (((y > ((configuration.wordsworth_wordspace-1)/2)) || (configuration.wordsworth_wordspace < 4)) && (not_printed)){
port_to_use->println(word_buffer);
not_printed = 0;
}
if (port_to_use->available()){
port_to_use->read();
y = 99;
loop1 = 0;
loop2 = 0;
if ((word_buffer[x] == 0) || (x > 9)){ // are we at the end of the word?
loop2 = 0;
for (int y = 0;y < (configuration.wordsworth_wordspace-1);y++){ // send extra word spaces
send_char(' ',KEYER_NORMAL);
if (((y > ((configuration.wordsworth_wordspace-1)/2)) || (configuration.wordsworth_wordspace < 4)) && (not_printed)){
port_to_use->println(word_buffer);
not_printed = 0;
}
if (port_to_use->available()){
port_to_use->read();
y = 99;
loop1 = 0;
loop2 = 0;
loop3 = 0;
}
}
}
}
if (port_to_use->available()){
port_to_use->read();
loop1 = 0;
loop2 = 0;
}
}
if (port_to_use->available()){
port_to_use->read();
loop1 = 0;
loop2 = 0;
loop3 = 0;
}
} //loop2
repetitions++;
} //loop3
} //loop1
key_tx = previous_key_tx_state;
}
#endif //defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
@ -11012,7 +11132,7 @@ void wordsworth_practice(PRIMARY_SERIAL_CLS * port_to_use,byte practice_type)
//---------------------------------------------------------------------
#if defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
void us_callsign_practice(PRIMARY_SERIAL_CLS * port_to_use)
void callsign_practice_interactive(PRIMARY_SERIAL_CLS * port_to_use,byte callsign_mode)
{
byte loop1 = 1;
@ -11023,17 +11143,14 @@ void us_callsign_practice(PRIMARY_SERIAL_CLS * port_to_use)
char incoming_char = ' ';
String user_entered_callsign = "";
byte previous_key_tx_state = key_tx;
key_tx = 0;
//randomSeed(analogRead(0));
randomSeed(millis());
port_to_use->println(F("Callsign receive practice; type in callsign and hit ENTER."));
port_to_use->println(F("Interactive callsign receive practice\r\n\r\nCopy callsign, type it in, and hit ENTER."));
port_to_use->println(F("If you are using the Arduino serial monitor, select \"Carriage Return\" line ending."));
port_to_use->println(F("Enter a blackslash \\ to exit."));
port_to_use->println(F("Enter a blackslash \\ to exit.\r\n"));
while (port_to_use->available() > 0) { // clear out the buffer if anything is there
incoming_char = port_to_use->read();
}
port_to_use->print(F("Press enter to start..."));
port_to_use->print(F("Press enter to start...\r\n"));
while (port_to_use->available() == 0) {
}
while (port_to_use->available() > 0) { // clear out the buffer if anything is there
@ -11042,17 +11159,14 @@ void us_callsign_practice(PRIMARY_SERIAL_CLS * port_to_use)
while (loop1){
callsign = generate_callsign();
callsign = generate_callsign(callsign_mode);
loop2 = 1;
while (loop2){
// for (byte x = 0; x < (callsign.length()); x++) {
// send_char(callsign[x],KEYER_NORMAL);
// }
//port_to_use->println(callsign);
#if defined(DEBUG_CALLSIGN_PRACTICE_SHOW_CALLSIGN)
port_to_use->println(callsign);
#endif
serialwaitloop = 1;
user_entered_callsign = "";
@ -11063,11 +11177,10 @@ void us_callsign_practice(PRIMARY_SERIAL_CLS * port_to_use)
send_char(callsign[x],KEYER_NORMAL);
x++;
}
//zzzzzz
while(port_to_use->available() > 0) {
//if (port_to_use->available() > 0) {
while(port_to_use->available() > 0) {
incoming_char = port_to_use->read();
incoming_char = toUpperCase(incoming_char);
port_to_use->print(incoming_char);
if (incoming_char == 13) {
serialwaitloop = 0;
@ -11113,6 +11226,71 @@ void us_callsign_practice(PRIMARY_SERIAL_CLS * port_to_use)
} //loop2
} //loop1
}
#endif //defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
//---------------------------------------------------------------------
#if defined(FEATURE_SERIAL) && defined(FEATURE_TRAINING_COMMAND_LINE_INTERFACE) && defined(FEATURE_COMMAND_LINE_INTERFACE)
void callsign_practice_non_interactive(PRIMARY_SERIAL_CLS * port_to_use,byte callsign_mode)
{
byte loop1 = 1;
byte loop2;
byte x;
String callsign(10);
char incoming_char = ' ';
byte previous_key_tx_state = key_tx;
key_tx = 0;
randomSeed(millis());
port_to_use->println(F("Callsign receive practice\r\n"));
while (port_to_use->available() > 0) { // clear out the buffer if anything is there
incoming_char = port_to_use->read();
}
//zzzzzz
while (loop1){
callsign = generate_callsign(callsign_mode) + " ";
loop2 = 1;
x = 0;
while ((loop2) && (x < (callsign.length()))) {
send_char(callsign[x],KEYER_NORMAL);
x++;
if (port_to_use->available()){
port_to_use->read();
loop1 = 0;
loop2 = 0;
x = 99;
}
#ifdef FEATURE_COMMAND_BUTTONS
while ((paddle_pin_read(paddle_left) == LOW) || (paddle_pin_read(paddle_right) == LOW) || (analogbuttonread(0))) {
loop1 = 0;
loop2 = 0;
x = 99;
}
#else
while ((paddle_pin_read(paddle_left) == LOW) || (paddle_pin_read(paddle_right) == LOW)) {
loop1 = 0;
loop2 = 0;
x = 99;
}
#endif //FEATURE_COMMAND_BUTTONS
} //loop2
port_to_use->println(callsign);
} //loop1
key_tx = previous_key_tx_state;
}
@ -13151,6 +13329,7 @@ void initialize_keyer_state(){
configuration.length_wordspace = default_length_wordspace;
configuration.weighting = default_weighting;
configuration.wordsworth_wordspace = default_wordsworth_wordspace;
configuration.wordsworth_repetition = default_wordsworth_repetition;
configuration.wpm_farnsworth = initial_speed_wpm;
switch_to_tx_silent(1);

Wyświetl plik

@ -162,4 +162,16 @@
#define WORDSWORTH_QSO_WORDS 6
#define WORDSWORTH_MIXED 99
#define WORDSWORTH_WORDSPACE 1
#define WORDSWORTH_WPM 2
#define WORDSWORTH_REPETITION 3
#define CALLSIGN_INTERNATIONAL 0
#define CALLSIGN_US 1
#define CALLSIGN_EUROPEAN 2
#define CALLSIGN_CANADA 3
#define PRACTICE_NON_INTERACTIVE 0
#define PRACTICE_INTERACTIVE 1
#endif //keyer_h

Wyświetl plik

@ -0,0 +1,414 @@
const char canadian_prefix_1[] PROGMEM = "VE1";
const char canadian_prefix_2[] PROGMEM = "VE2";
const char canadian_prefix_3[] PROGMEM = "VE3";
const char canadian_prefix_4[] PROGMEM = "VE4";
const char canadian_prefix_5[] PROGMEM = "VE5";
const char canadian_prefix_6[] PROGMEM = "VE6";
const char canadian_prefix_7[] PROGMEM = "VE7";
const char canadian_prefix_8[] PROGMEM = "VE8";
const char canadian_prefix_9[] PROGMEM = "VE9";
const char canadian_prefix_10[] PROGMEM = "VY0";
const char canadian_prefix_11[] PROGMEM = "VY1";
const char canadian_prefix_12[] PROGMEM = "VY2";
const char canadian_prefix_13[] PROGMEM = "VO1";
const char canadian_prefix_14[] PROGMEM = "VO2";
const byte canadian_prefix_size = 14;
const char* const canadian_prefix_table[] PROGMEM =
{canadian_prefix_1,canadian_prefix_2,canadian_prefix_3,canadian_prefix_4,canadian_prefix_5,canadian_prefix_6,canadian_prefix_7,canadian_prefix_8,canadian_prefix_9,canadian_prefix_10,
canadian_prefix_11,canadian_prefix_12,canadian_prefix_13,canadian_prefix_14};
// European callsign prefix table
//
// Note 2017-05-06: This is weird. If I put "LB" in the array, avrdude trips up with a timeout error when uploading to a Mega.
// That's why LB isn't in this table
const char eu_prefix_1[] PROGMEM = "3A";
const char eu_prefix_2[] PROGMEM = "4O";
const char eu_prefix_3[] PROGMEM = "4U";
const char eu_prefix_4[] PROGMEM = "9A";
const char eu_prefix_5[] PROGMEM = "9H";
const char eu_prefix_6[] PROGMEM = "C3";
const char eu_prefix_7[] PROGMEM = "CT";
const char eu_prefix_8[] PROGMEM = "CU";
const char eu_prefix_9[] PROGMEM = "DA";
const char eu_prefix_10[] PROGMEM = "DB";
const char eu_prefix_11[] PROGMEM = "DC";
const char eu_prefix_12[] PROGMEM = "DD";
const char eu_prefix_13[] PROGMEM = "DE";
const char eu_prefix_14[] PROGMEM = "DF";
const char eu_prefix_15[] PROGMEM = "DG";
const char eu_prefix_16[] PROGMEM = "DH";
const char eu_prefix_17[] PROGMEM = "DI";
const char eu_prefix_18[] PROGMEM = "DJ";
const char eu_prefix_19[] PROGMEM = "DK";
const char eu_prefix_20[] PROGMEM = "DL";
const char eu_prefix_21[] PROGMEM = "EI";
const char eu_prefix_22[] PROGMEM = "ER";
const char eu_prefix_23[] PROGMEM = "ES";
const char eu_prefix_24[] PROGMEM = "EU";
const char eu_prefix_25[] PROGMEM = "EV";
const char eu_prefix_26[] PROGMEM = "EW";
const char eu_prefix_27[] PROGMEM = "F";
const char eu_prefix_28[] PROGMEM = "G";
const char eu_prefix_29[] PROGMEM = "GX";
const char eu_prefix_30[] PROGMEM = "GD";
const char eu_prefix_31[] PROGMEM = "GT";
const char eu_prefix_32[] PROGMEM = "GI";
const char eu_prefix_33[] PROGMEM = "GN";
const char eu_prefix_34[] PROGMEM = "GJ";
const char eu_prefix_35[] PROGMEM = "GH";
const char eu_prefix_36[] PROGMEM = "GM";
const char eu_prefix_37[] PROGMEM = "GS";
const char eu_prefix_38[] PROGMEM = "GU";
const char eu_prefix_39[] PROGMEM = "GP";
const char eu_prefix_40[] PROGMEM = "GW";
const char eu_prefix_41[] PROGMEM = "GC";
const char eu_prefix_42[] PROGMEM = "HB";
const char eu_prefix_43[] PROGMEM = "HV";
const char eu_prefix_44[] PROGMEM = "I";
const char eu_prefix_45[] PROGMEM = "IS";
const char eu_prefix_46[] PROGMEM = "IM";
const char eu_prefix_47[] PROGMEM = "JW";
const char eu_prefix_48[] PROGMEM = "JX";
const char eu_prefix_49[] PROGMEM = "LX";
const char eu_prefix_50[] PROGMEM = "LY";
const char eu_prefix_51[] PROGMEM = "LZ";
const char eu_prefix_52[] PROGMEM = "OY";
const char eu_prefix_53[] PROGMEM = "OZ";
const char eu_prefix_54[] PROGMEM = "S5";
const char eu_prefix_55[] PROGMEM = "YU";
const char eu_prefix_56[] PROGMEM = "T7";
const char eu_prefix_57[] PROGMEM = "T9";
const char eu_prefix_58[] PROGMEM = "TF";
const char eu_prefix_59[] PROGMEM = "TK";
const char eu_prefix_60[] PROGMEM = "EM";
const char eu_prefix_61[] PROGMEM = "EO";
const char eu_prefix_62[] PROGMEM = "YL";
const char eu_prefix_63[] PROGMEM = "YO";
const char eu_prefix_64[] PROGMEM = "YT";
const char eu_prefix_65[] PROGMEM = "YU";
const char eu_prefix_66[] PROGMEM = "YP";
const char eu_prefix_67[] PROGMEM = "YQ";
const char eu_prefix_68[] PROGMEM = "YR";
const char eu_prefix_69[] PROGMEM = "Z3";
const char eu_prefix_70[] PROGMEM = "ZA";
const char eu_prefix_71[] PROGMEM = "YZ";
const char eu_prefix_72[] PROGMEM = "SA";
const char eu_prefix_73[] PROGMEM = "SB";
const char eu_prefix_74[] PROGMEM = "SC";
const char eu_prefix_75[] PROGMEM = "SD";
const char eu_prefix_76[] PROGMEM = "SE";
const char eu_prefix_77[] PROGMEM = "SF";
const char eu_prefix_78[] PROGMEM = "SG";
const char eu_prefix_79[] PROGMEM = "SH";
const char eu_prefix_80[] PROGMEM = "SI";
const char eu_prefix_81[] PROGMEM = "SJ";
const char eu_prefix_82[] PROGMEM = "SK";
const char eu_prefix_83[] PROGMEM = "SL";
const char eu_prefix_84[] PROGMEM = "SM";
const char eu_prefix_85[] PROGMEM = "SN";
const char eu_prefix_86[] PROGMEM = "SO";
const char eu_prefix_87[] PROGMEM = "SP";
const char eu_prefix_88[] PROGMEM = "SQ";
const char eu_prefix_89[] PROGMEM = "SR";
const char eu_prefix_90[] PROGMEM = "SS";
const char eu_prefix_91[] PROGMEM = "ST";
const char eu_prefix_92[] PROGMEM = "SU";
const char eu_prefix_93[] PROGMEM = "SV";
const char eu_prefix_94[] PROGMEM = "SW";
const char eu_prefix_95[] PROGMEM = "SX";
const char eu_prefix_96[] PROGMEM = "SY";
const char eu_prefix_97[] PROGMEM = "SZ";
const char eu_prefix_98[] PROGMEM = "OE";
const char eu_prefix_99[] PROGMEM = "OF";
const char eu_prefix_100[] PROGMEM = "OG";
const char eu_prefix_101[] PROGMEM = "OH";
const char eu_prefix_102[] PROGMEM = "OI";
const char eu_prefix_103[] PROGMEM = "OJ";
const char eu_prefix_104[] PROGMEM = "OK";
const char eu_prefix_105[] PROGMEM = "OL";
const char eu_prefix_106[] PROGMEM = "OM";
const char eu_prefix_107[] PROGMEM = "ON";
const char eu_prefix_108[] PROGMEM = "OO";
const char eu_prefix_109[] PROGMEM = "OP";
const char eu_prefix_110[] PROGMEM = "OQ";
const char eu_prefix_111[] PROGMEM = "OR";
const char eu_prefix_112[] PROGMEM = "OS";
const char eu_prefix_113[] PROGMEM = "OT";
const char eu_prefix_114[] PROGMEM = "PA";
const char eu_prefix_115[] PROGMEM = "PB";
const char eu_prefix_116[] PROGMEM = "PC";
const char eu_prefix_117[] PROGMEM = "PD";
const char eu_prefix_118[] PROGMEM = "PE";
const char eu_prefix_119[] PROGMEM = "PF";
const char eu_prefix_120[] PROGMEM = "PG";
const char eu_prefix_121[] PROGMEM = "PH";
const char eu_prefix_122[] PROGMEM = "PI";
const char eu_prefix_123[] PROGMEM = "UA";
const char eu_prefix_124[] PROGMEM = "UB";
const char eu_prefix_125[] PROGMEM = "UC";
const char eu_prefix_126[] PROGMEM = "UD";
const char eu_prefix_127[] PROGMEM = "UE";
const char eu_prefix_128[] PROGMEM = "UF";
const char eu_prefix_129[] PROGMEM = "UG";
const char eu_prefix_130[] PROGMEM = "UH";
const char eu_prefix_131[] PROGMEM = "UI";
const char eu_prefix_132[] PROGMEM = "RA";
const char eu_prefix_133[] PROGMEM = "RB";
const char eu_prefix_134[] PROGMEM = "RC";
const char eu_prefix_135[] PROGMEM = "RD";
const char eu_prefix_136[] PROGMEM = "RE";
const char eu_prefix_137[] PROGMEM = "RF";
const char eu_prefix_138[] PROGMEM = "RG";
const char eu_prefix_139[] PROGMEM = "RH";
const char eu_prefix_140[] PROGMEM = "RI";
const char eu_prefix_141[] PROGMEM = "RJ";
const char eu_prefix_142[] PROGMEM = "RK";
const char eu_prefix_143[] PROGMEM = "RL";
const char eu_prefix_144[] PROGMEM = "RM";
const char eu_prefix_145[] PROGMEM = "RN";
const char eu_prefix_146[] PROGMEM = "RO";
const char eu_prefix_147[] PROGMEM = "RP";
const char eu_prefix_148[] PROGMEM = "RQ";
const char eu_prefix_149[] PROGMEM = "RR";
const char eu_prefix_150[] PROGMEM = "RS";
const char eu_prefix_151[] PROGMEM = "RT";
const char eu_prefix_152[] PROGMEM = "RU";
const char eu_prefix_153[] PROGMEM = "RV";
const char eu_prefix_154[] PROGMEM = "RW";
const char eu_prefix_155[] PROGMEM = "RX";
const char eu_prefix_156[] PROGMEM = "RY";
const char eu_prefix_157[] PROGMEM = "RZ";
const char eu_prefix_158[] PROGMEM = "UR";
const char eu_prefix_159[] PROGMEM = "US";
const char eu_prefix_160[] PROGMEM = "UT";
const char eu_prefix_161[] PROGMEM = "UU";
const char eu_prefix_162[] PROGMEM = "UV";
const char eu_prefix_163[] PROGMEM = "UW";
const char eu_prefix_164[] PROGMEM = "UX";
const char eu_prefix_165[] PROGMEM = "UY";
const char eu_prefix_166[] PROGMEM = "UZ";
const char eu_prefix_167[] PROGMEM = "EA";
const char eu_prefix_168[] PROGMEM = "EB";
const char eu_prefix_169[] PROGMEM = "EC";
const char eu_prefix_170[] PROGMEM = "ED";
const char eu_prefix_171[] PROGMEM = "EE";
const char eu_prefix_172[] PROGMEM = "EF";
const char eu_prefix_173[] PROGMEM = "EG";
const char eu_prefix_174[] PROGMEM = "EH";
const char eu_prefix_175[] PROGMEM = "EJ";
const char eu_prefix_176[] PROGMEM = "HA";
const char eu_prefix_177[] PROGMEM = "HG";
const char eu_prefix_178[] PROGMEM = "LA";
const char eu_prefix_179[] PROGMEM = "LC";
const char eu_prefix_180[] PROGMEM = "LD";
const char eu_prefix_181[] PROGMEM = "LE";
const char eu_prefix_182[] PROGMEM = "LF";
const char eu_prefix_183[] PROGMEM = "LG";
const char eu_prefix_184[] PROGMEM = "LH";
const char eu_prefix_185[] PROGMEM = "LI";
const char eu_prefix_186[] PROGMEM = "LJ";
const char eu_prefix_187[] PROGMEM = "LK";
const char eu_prefix_188[] PROGMEM = "LL";
const char eu_prefix_189[] PROGMEM = "LM";
const char eu_prefix_190[] PROGMEM = "LN";
/*const char eu_prefix_191[] PROGMEM = "LB"; see note above about "LB"*/
const byte eu_prefix_size = 190;
const char* const eu_prefix_table[] PROGMEM = {
eu_prefix_1,
eu_prefix_2,
eu_prefix_3,
eu_prefix_4,
eu_prefix_5,
eu_prefix_6,
eu_prefix_7,
eu_prefix_8,
eu_prefix_9,
eu_prefix_10,
eu_prefix_11,
eu_prefix_12,
eu_prefix_13,
eu_prefix_14,
eu_prefix_15,
eu_prefix_16,
eu_prefix_17,
eu_prefix_18,
eu_prefix_19,
eu_prefix_20,
eu_prefix_21,
eu_prefix_22,
eu_prefix_23,
eu_prefix_24,
eu_prefix_25,
eu_prefix_26,
eu_prefix_27,
eu_prefix_28,
eu_prefix_29,
eu_prefix_30,
eu_prefix_31,
eu_prefix_32,
eu_prefix_33,
eu_prefix_34,
eu_prefix_35,
eu_prefix_36,
eu_prefix_37,
eu_prefix_38,
eu_prefix_39,
eu_prefix_40,
eu_prefix_41,
eu_prefix_42,
eu_prefix_43,
eu_prefix_44,
eu_prefix_45,
eu_prefix_46,
eu_prefix_47,
eu_prefix_48,
eu_prefix_49,
eu_prefix_50,
eu_prefix_51,
eu_prefix_52,
eu_prefix_53,
eu_prefix_54,
eu_prefix_55,
eu_prefix_56,
eu_prefix_57,
eu_prefix_58,
eu_prefix_59,
eu_prefix_60,
eu_prefix_61,
eu_prefix_62,
eu_prefix_63,
eu_prefix_64,
eu_prefix_65,
eu_prefix_66,
eu_prefix_67,
eu_prefix_68,
eu_prefix_69,
eu_prefix_70,
eu_prefix_71,
eu_prefix_72,
eu_prefix_73,
eu_prefix_74,
eu_prefix_75,
eu_prefix_76,
eu_prefix_77,
eu_prefix_78,
eu_prefix_79,
eu_prefix_80,
eu_prefix_81,
eu_prefix_82,
eu_prefix_83,
eu_prefix_84,
eu_prefix_85,
eu_prefix_86,
eu_prefix_87,
eu_prefix_88,
eu_prefix_89,
eu_prefix_90,
eu_prefix_91,
eu_prefix_92,
eu_prefix_93,
eu_prefix_94,
eu_prefix_95,
eu_prefix_96,
eu_prefix_97,
eu_prefix_98,
eu_prefix_99,
eu_prefix_100,
eu_prefix_101,
eu_prefix_102,
eu_prefix_103,
eu_prefix_104,
eu_prefix_105,
eu_prefix_106,
eu_prefix_107,
eu_prefix_108,
eu_prefix_109,
eu_prefix_110,
eu_prefix_111,
eu_prefix_112,
eu_prefix_113,
eu_prefix_114,
eu_prefix_115,
eu_prefix_116,
eu_prefix_117,
eu_prefix_118,
eu_prefix_119,
eu_prefix_120,
eu_prefix_121,
eu_prefix_122,
eu_prefix_123,
eu_prefix_124,
eu_prefix_125,
eu_prefix_126,
eu_prefix_127,
eu_prefix_128,
eu_prefix_129,
eu_prefix_130,
eu_prefix_131,
eu_prefix_132,
eu_prefix_133,
eu_prefix_134,
eu_prefix_135,
eu_prefix_136,
eu_prefix_137,
eu_prefix_138,
eu_prefix_139,
eu_prefix_140,
eu_prefix_141,
eu_prefix_142,
eu_prefix_143,
eu_prefix_144,
eu_prefix_145,
eu_prefix_146,
eu_prefix_147,
eu_prefix_148,
eu_prefix_149,
eu_prefix_150,
eu_prefix_151,
eu_prefix_152,
eu_prefix_153,
eu_prefix_154,
eu_prefix_155,
eu_prefix_156,
eu_prefix_157,
eu_prefix_158,
eu_prefix_159,
eu_prefix_160,
eu_prefix_161,
eu_prefix_162,
eu_prefix_163,
eu_prefix_164,
eu_prefix_165,
eu_prefix_166,
eu_prefix_167,
eu_prefix_168,
eu_prefix_169,
eu_prefix_170,
eu_prefix_171,
eu_prefix_172,
eu_prefix_173,
eu_prefix_174,
eu_prefix_175,
eu_prefix_176,
eu_prefix_177,
eu_prefix_178,
eu_prefix_179,
eu_prefix_180,
eu_prefix_181,
eu_prefix_182,
eu_prefix_183,
eu_prefix_184,
eu_prefix_185,
eu_prefix_186,
eu_prefix_187,
eu_prefix_188,
eu_prefix_189,
eu_prefix_190/*,
eu_prefix_191*/
};

Wyświetl plik

@ -43,5 +43,7 @@
// #define DEBUG_FORCE_RESET
// #define DEBUG_WINKEY_DISABLE_LEAD_IN_TIME_SETTING
// #define DEBUG_KEYPAD_SERIAL
// #define DEBUG_CALLSIGN_PRACTICE_SHOW_CALLSIGN
// #define DEBUG_WORDSWORTH
// #define OPTION_WINKEY_IGNORE_FIRST_STATUS_REQUEST

Wyświetl plik

@ -93,4 +93,5 @@
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK

Wyświetl plik

@ -110,3 +110,4 @@
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK

Wyświetl plik

@ -78,3 +78,4 @@
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK

Wyświetl plik

@ -76,3 +76,4 @@
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK

Wyświetl plik

@ -80,4 +80,5 @@
//#define OPTION_CMOS_SUPER_KEYER_IAMBIC_B_TIMING_ON_BY_DEFAULT
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK

Wyświetl plik

@ -106,6 +106,7 @@
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK
// #define FEATURE_COMPETITION_COMPRESSION_DETECTION //(Experimental)

Wyświetl plik

@ -60,3 +60,4 @@
// #define OPTION_WORDSWORTH_CZECH
// #define OPTION_WORDSWORTH_DEUTSCH
// #define OPTION_WORDSWORTH_NORSK

Wyświetl plik

@ -58,6 +58,7 @@
#define potentiometer_check_interval_ms 150
#define default_paddle_interruption_quiet_time_element_lengths 0
#define default_wordsworth_wordspace 6
#define default_wordsworth_repetition 1
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 4

Wyświetl plik

@ -80,6 +80,7 @@
#define default_paddle_interruption_quiet_time_element_lengths 0
#define default_wordsworth_wordspace 6
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 4
#define analog_buttons_r1 10

Wyświetl plik

@ -58,6 +58,7 @@
#define potentiometer_check_interval_ms 150
#define default_paddle_interruption_quiet_time_element_lengths 0
#define default_wordsworth_wordspace 6
#define default_wordsworth_repetition 1
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 4

Wyświetl plik

@ -58,6 +58,7 @@
#define potentiometer_check_interval_ms 150
#define default_paddle_interruption_quiet_time_element_lengths 0
#define default_wordsworth_wordspace 6
#define default_wordsworth_repetition 1
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 4

Wyświetl plik

@ -60,6 +60,7 @@
#define potentiometer_check_interval_ms 150
#define default_paddle_interruption_quiet_time_element_lengths 0
#define default_wordsworth_wordspace 6
#define default_wordsworth_repetition 1
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 4

Wyświetl plik

@ -67,6 +67,7 @@
#define potentiometer_check_interval_ms 150
#define default_paddle_interruption_quiet_time_element_lengths 0
#define default_wordsworth_wordspace 6
#define default_wordsworth_repetition 1
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 4

Wyświetl plik

@ -59,6 +59,7 @@
#define potentiometer_check_interval_ms 150
#define default_paddle_interruption_quiet_time_element_lengths 7
#define default_wordsworth_wordspace 6
#define default_wordsworth_repetition 1
#ifdef FEATURE_COMMAND_BUTTONS
#define analog_buttons_number_of_buttons 1

Wyświetl plik

@ -0,0 +1,248 @@
// keyer_training_text_norsk.h
// Norwegian word list contributed by Karl, LA3FY
// English word list originally from gen_cw_words.pl - a program that generates words in a random order,
// intended to be used during morse code practice.
// Original gen_cw_words.pl code Copyright (C) 2015,2017 Andy Stewart (KB1OIQ)
// https://sourceforge.net/projects/kb1oiq-k1ig-wordsworth/
// two letter word array
const char s2_1[] PROGMEM = "og";
const char s2_2[] PROGMEM = "";
const char s2_3[] PROGMEM = "";
const char s2_4[] PROGMEM = "er";
const char s2_5[] PROGMEM = "en";
const char s2_6[] PROGMEM = "av";
const char s2_7[] PROGMEM = "at";
const char s2_8[] PROGMEM = "de";
const char s2_9[] PROGMEM = "et";
const char s2_10[] PROGMEM = "";
const char s2_11[] PROGMEM = "vi";
const char s2_12[] PROGMEM = "du";
const char s2_13[] PROGMEM = "da";
const char s2_14[] PROGMEM = "ut";
const char s2_15[] PROGMEM = "sa";
const char s2_16[] PROGMEM = "";
const char s2_17[] PROGMEM = "ny";
const char s2_18[] PROGMEM = "ha";
const char s2_19[] PROGMEM = "år";
const char s2_20[] PROGMEM = "";
const char s2_21[] PROGMEM = "to";
const char s2_22[] PROGMEM = "se";
const byte s2_size = 22;
const char* const s2_table[] PROGMEM =
{s2_1,s2_2,s2_3,s2_4,s2_5,s2_6,s2_7,s2_8,s2_9,s2_10,
s2_11,s2_12,s2_13,s2_14,s2_15,s2_16,s2_17,s2_18,s2_19,s2_20,
s2_21,s2_22};
// three letter word array
const char s3_1[] PROGMEM = "det";
const char s3_2[] PROGMEM = "som";
const char s3_3[] PROGMEM = "han";
const char s3_4[] PROGMEM = "for";
const char s3_5[] PROGMEM = "med";
const char s3_6[] PROGMEM = "var";
const char s3_7[] PROGMEM = "den";
const char s3_8[] PROGMEM = "har";
const char s3_9[] PROGMEM = "jeg";
const char s3_10[] PROGMEM = "men";
const char s3_11[] PROGMEM = "seg";
const char s3_12[] PROGMEM = "hun";
const char s3_13[] PROGMEM = "vår";
const char s3_14[] PROGMEM = "fra";
const char s3_15[] PROGMEM = "kan";
const char s3_16[] PROGMEM = "ble";
const char s3_17[] PROGMEM = "vil";
const char s3_18[] PROGMEM = "ham";
const char s3_19[] PROGMEM = "ved";
const char s3_20[] PROGMEM = "noe";
const char s3_21[] PROGMEM = "meg";
const char s3_22[] PROGMEM = "mot";
const char s3_23[] PROGMEM = "opp";
const char s3_24[] PROGMEM = "der";
const char s3_25[] PROGMEM = "når";
const char s3_26[] PROGMEM = "inn";
const char s3_27[] PROGMEM = "dem";
const char s3_28[] PROGMEM = "sin";
const char s3_29[] PROGMEM = "kom";
const char s3_30[] PROGMEM = "enn";
const char s3_31[] PROGMEM = "bli";
const char s3_32[] PROGMEM = "før";
const char s3_33[] PROGMEM = "går";
const char s3_34[] PROGMEM = "her";
const char s3_35[] PROGMEM = "mer";
const char s3_36[] PROGMEM = "hva";
const char s3_37[] PROGMEM = "alt";
const char s3_38[] PROGMEM = "oss";
const byte s3_size = 38;
const char* const s3_table[] PROGMEM =
{s3_1,s3_2,s3_3,s3_4,s3_5,s3_6,s3_7,s3_8,s3_9,s3_10,
s3_11,s3_12,s3_13,s3_14,s3_15,s3_16,s3_17,s3_18,s3_19,s3_20,
s3_21,s3_22,s3_23,s3_24,s3_25,s3_26,s3_27,s3_28,s3_29,s3_30,
s3_31,s3_32,s3_33,s3_34,s3_35,s3_36,s3_37,s3_38};
// four letter word array
const char s4_1[] PROGMEM = "ikke";
const char s4_2[] PROGMEM = "over";
const char s4_3[] PROGMEM = "også";
const char s4_4[] PROGMEM = "bare";
const char s4_5[] PROGMEM = "være";
const char s4_6[] PROGMEM = "blir";
const char s4_7[] PROGMEM = "alle";
const char s4_8[] PROGMEM = "noen";
const char s4_9[] PROGMEM = "selv";
const char s4_10[] PROGMEM = "sier";
const char s4_11[] PROGMEM = "hans";
const char s4_12[] PROGMEM = "gikk";
const char s4_13[] PROGMEM = "fikk";
const char s4_14[] PROGMEM = "dash";
const char s4_15[] PROGMEM = "hvor";
const char s4_16[] PROGMEM = "hele";
const byte s4_size = 16;
const char* const s4_table[] PROGMEM =
{s4_1,s4_2,s4_3,s4_4,s4_5,s4_6,s4_7,s4_8,s4_9,s4_10,
s4_11,s4_12,s4_13,s4_14,s4_15,s4_16};
// common names
const char name_1[] PROGMEM = "Jan";
const char name_2[] PROGMEM = "Per";
const char name_3[] PROGMEM = "Bjørn";
const char name_4[] PROGMEM = "Ole";
const char name_5[] PROGMEM = "Kjell";
const char name_6[] PROGMEM = "Lars";
const char name_7[] PROGMEM = "Arne";
const char name_8[] PROGMEM = "Knut";
const char name_9[] PROGMEM = "Svein";
const char name_10[] PROGMEM = "Hans";
const char name_11[] PROGMEM = "Odd";
const char name_12[] PROGMEM = "Tor";
const char name_13[] PROGMEM = "Geir";
const char name_14[] PROGMEM = "Terje";
const char name_15[] PROGMEM = "Thomas";
const char name_16[] PROGMEM = "Morten";
const char name_17[] PROGMEM = "John";
const char name_18[] PROGMEM = "Erik";
const char name_19[] PROGMEM = "Anders";
const char name_20[] PROGMEM = "Rune";
const char name_21[] PROGMEM = "Martin";
const char name_22[] PROGMEM = "Andreas";
const char name_23[] PROGMEM = "Trond";
const char name_24[] PROGMEM = "Tore";
const char name_25[] PROGMEM = "Harald";
const char name_26[] PROGMEM = "Olav";
const char name_27[] PROGMEM = "Gunnar";
const char name_28[] PROGMEM = "Jon";
const char name_29[] PROGMEM = "Rolf";
const char name_30[] PROGMEM = "Leif";
const char name_31[] PROGMEM = "Tom";
const char name_32[] PROGMEM = "Stian";
const char name_33[] PROGMEM = "Kristian";
const char name_34[] PROGMEM = "Nils";
const char name_35[] PROGMEM = "Øyvind";
const char name_36[] PROGMEM = "Helge";
const char name_37[] PROGMEM = "Espen";
const char name_38[] PROGMEM = "Einar";
const char name_39[] PROGMEM = "Marius";
const char name_40[] PROGMEM = "Kåre";
const char name_41[] PROGMEM = "Daniel";
const char name_42[] PROGMEM = "Magnus";
const char name_43[] PROGMEM = "Fredrik";
const char name_44[] PROGMEM = "Christian";
const char name_45[] PROGMEM = "Steinar";
const char name_46[] PROGMEM = "Eirik";
const char name_47[] PROGMEM = "Håkon";
const char name_48[] PROGMEM = "Øystein";
const char name_49[] PROGMEM = "Henrik";
const char name_50[] PROGMEM = "Karl";
const byte name_size = 50;
const char* const name_table[] PROGMEM =
{name_1,name_2,name_3,name_4,name_5,name_6,name_7,name_8,name_9,name_10,
name_11,name_12,name_13,name_14,name_15,name_16,name_17,name_18,name_19,name_20,
name_21,name_22,name_23,name_24,name_25,name_26,name_27,name_28,name_29,name_30,
name_31,name_32,name_33,name_34,name_35,name_36,name_37,name_38,name_39,name_40,
name_41,name_42,name_43,name_44,name_45,name_46,name_47,name_48,name_49,name_50};
// CW QSO word array
const char qso_1[] PROGMEM = "QRL?";
const char qso_2[] PROGMEM = "QRM";
const char qso_3[] PROGMEM = "QRN";
const char qso_4[] PROGMEM = "QRS";
const char qso_5[] PROGMEM = "QRT";
const char qso_6[] PROGMEM = "QRZ";
const char qso_7[] PROGMEM = "QSL";
const char qso_8[] PROGMEM = "QSO";
const char qso_9[] PROGMEM = "QSY";
const char qso_10[] PROGMEM = "QTH";
const char qso_11[] PROGMEM = "QRX";
const char qso_12[] PROGMEM = "ABT";
const char qso_13[] PROGMEM = "AGE";
const char qso_14[] PROGMEM = "ANT";
const char qso_15[] PROGMEM = "BEAM";
const char qso_16[] PROGMEM = "BK";
const char qso_17[] PROGMEM = "QRP";
const char qso_18[] PROGMEM = "AGN";
const char qso_19[] PROGMEM = "C";
const char qso_20[] PROGMEM = "CL";
const char qso_21[] PROGMEM = "CPY";
const char qso_22[] PROGMEM = "CQ";
const char qso_23[] PROGMEM = "CUL";
const char qso_24[] PROGMEM = "DE";
const char qso_25[] PROGMEM = "DX";
const char qso_26[] PROGMEM = "ES";
const char qso_27[] PROGMEM = "EL";
const char qso_28[] PROGMEM = "FB";
const char qso_29[] PROGMEM = "HI";
const char qso_30[] PROGMEM = "HW?";
const char qso_31[] PROGMEM = "HR";
const char qso_32[] PROGMEM = "K";
const char qso_33[] PROGMEM = "=";
const char qso_34[] PROGMEM = "<";
const char qso_35[] PROGMEM = "%";
const char qso_36[] PROGMEM = ">";
const char qso_37[] PROGMEM = "LID";
const char qso_38[] PROGMEM = "LOOP";
const char qso_39[] PROGMEM = "NAME";
const char qso_40[] PROGMEM = "OM";
const char qso_41[] PROGMEM = "OP";
const char qso_42[] PROGMEM = "PKT";
const char qso_43[] PROGMEM = "PSE";
const char qso_44[] PROGMEM = "R";
const char qso_45[] PROGMEM = "RPT";
const char qso_46[] PROGMEM = "RST";
const char qso_47[] PROGMEM = "RIG";
const char qso_48[] PROGMEM = "TEMP";
const char qso_49[] PROGMEM = "TEST";
const char qso_50[] PROGMEM = "TU";
const char qso_51[] PROGMEM = "TKS";
const char qso_52[] PROGMEM = "TNX";
const char qso_53[] PROGMEM = "VERT";
const char qso_54[] PROGMEM = "WATT";
const char qso_55[] PROGMEM = "WX";
const char qso_56[] PROGMEM = "YAGI";
const char qso_57[] PROGMEM = "YRS";
const char qso_58[] PROGMEM = "73";
const char qso_59[] PROGMEM = "88";
const char qso_60[] PROGMEM = "?";
const char qso_61[] PROGMEM = "/";
const char qso_62[] PROGMEM = "VY";
const char qso_63[] PROGMEM = "YL";
const char qso_64[] PROGMEM = "XYL";
const char qso_65[] PROGMEM = "MY";
const char qso_66[] PROGMEM = "UR";
const char qso_67[] PROGMEM = "IS";
const char qso_68[] PROGMEM = "QSB";
const char qso_69[] PROGMEM = "QRQ";
const char qso_70[] PROGMEM = "HVE";
const char qso_71[] PROGMEM = "HPE";
const char qso_72[] PROGMEM = "BEST";
const byte qso_size = 72;
const char* const qso_table[] PROGMEM =
{qso_1,qso_2,qso_3,qso_4,qso_5,qso_6,qso_7,qso_8,qso_9,qso_10,qso_11,qso_12,qso_13,qso_14,qso_15,qso_16,qso_17,qso_18,qso_19,qso_20,
qso_21,qso_22,qso_23,qso_24,qso_25,qso_26,qso_27,qso_28,qso_29,qso_30,qso_31,qso_32,qso_33,qso_34,qso_35,qso_36,qso_37,qso_38,qso_39,qso_40,
qso_41,qso_42,qso_43,qso_44,qso_45,qso_46,qso_47,qso_48,qso_49,qso_50,qso_51,qso_52,qso_53,qso_54,qso_55,qso_56,qso_57,qso_58,qso_59,qso_60,
qso_61,qso_62,qso_63,qso_64,qso_65,qso_66,qso_67,qso_68,qso_69,qso_70,qso_71,qso_72};