//========================================================================
// DO NOT ARBITRARILY DOWNLOAD THIS CODE - it WILL NOT WORK FOR YOU!!!!!!!!
// This code works only on a heavily modified uBITX. The modifications
// are described in various PDF files on this site, and summarized below.
//========================================================================
//
// This code is based on version 0.20 of Ashhar (VU2ESE) Farhan's original
// uBITX Arduino code, which I downloaded from GitHub.
//
// Version 1.0 is considered feature complete. Hopefully, only bug fixes
// will be added to the code, since Arduino program memory is almost completed
// used.
//
// Version 1.1 and beyond fix bugs and might add small features.
// See ubitx_kb1oiq.ino for details.
//
// I have a dream that perhaps this will be useful to visually impaired
// amateur radio operators. A local ham "field tested" this rig and really
// liked the accessibility features which I've added. His constructive
// feedback was VERY helpful to me. Thanks, Joe (W1HAI)!
//
// Requirements:
//
// * Required software libraries
// * SoftwareSerial
// * Adafruit LiquidCrystal
// * MenuSystem (https://github.com/jonblack/arduino-menusystem)
//
// * Required hardware modifications:
// * Keypad
// * Voice
// * CW jack
// * LCD to I2C
//
// Modifications by KB1OIQ:
//
// * Put C++ wrappers around original code. New C++ classes:
// button, display, keyer, keypad, menu, output (voice and LCD),
// radio, rotary encoder, si5351, and voice. All new code
// is encapsulated in C++ classes, except a few small routines
// in ubitx_kb1oiq.ino.
//
// * Moved menu selection from the rotary encoder to the keypad.
//
// * Removed the following pieces of code:
// CAT, Serial.begin(9600)
// Calibration and carrier adjust routines work but are commented out.
//
// * All text strings are now in PROGMEM.
//
// * CW supports paddle (left or right handed) and
// straight key (either tip or ring), setup in menu.
//
// * Key/paddle ignored if not explicitly in CW mode. Similarly,
// PTT ignored if not in LSB/USB mode.
//
// * Transmit disabled if outside of the USA ham bands
// User is verbally admonished.
//
// * All text to the LCD is spoken by the Emic2 module.
// Voice explicitly cannot be disabled.
//
// * VFOs save mode, frequency, and active VFO in EEPROM.
//
// * Added CW mode (in addition to USB/LSB).
//
// * Three different tuning granularities: 10Hz, 100Hz, 1000Hz.
// Press rotary encoder button to cycle through these selections.
//
// * Keypad buttons and their function:
// * 1 = previous band (or channel in 60m mode)
// * 2 = menu mode
// * 3 = next band (or channel in 60m mode)
// * 4 = cycle through modes LSB, USB, CW
// * 5 = toggle vfo
// * 6 = 60 meters
// * 7 = toggle RIT
// * 8 = stop talking (hold it for a few seconds)
// * 9 = zero beat
// * * = keypad frequency entry
// * 0 = help
// * # = speak, either reads mode/vfo/frequency or tells user what menu they're in
//
// * Band edge detection has been implemented using a two tone beep.
//
// * Mic UP/DN buttons are used to cycle through the bands, sensitive
// to the mode. This has been duplicated by keypad buttons 1 and 3,
// so no Mic is required.
//
// * Added 60m mode following the USA band plan. The Mic UP/DN buttons cycle
// through the channels, sensitive to the mode.
//
// * Added RIT (normal: plus/minus 10kHz in 10Hz increments)
// (60m: plus/minus 200Hz in 10Hz increments)
//
// * DO NOT arbitrarily download this code and load it into your
// stock uBITX - IT WILL NOT WORK without the extensive modifications
// described in other files in this directory.
//
//========================================================================
AMS 02-jun-2018