Compare commits
46 Commits
version0.2
...
v0.33
Author | SHA1 | Date | |
---|---|---|---|
|
4f5ac283b7 | ||
|
4745790dfa | ||
|
85832de034 | ||
|
4830db78cb | ||
|
5eca64d2a9 | ||
|
0d9ec08bd7 | ||
|
3058d52551 | ||
|
98c26730c6 | ||
|
3a306429ea | ||
|
4f634a8277 | ||
|
a49d5e85b8 | ||
|
04699ba074 | ||
|
282c196f63 | ||
|
aa61281c38 | ||
|
261215b1ad | ||
|
1a2f5b4fde | ||
|
8203427808 | ||
|
4e15f2150c | ||
|
82a5fd7df9 | ||
|
386a0b2d46 | ||
|
c6401af7d1 | ||
|
b153a305d6 | ||
|
e61e45d3dd | ||
|
a1f941f965 | ||
|
d1e72b3bd5 | ||
|
032e7f919f | ||
|
b6bc264332 | ||
|
b1cc5eb98a | ||
|
2fe1662d67 | ||
|
ebbc5aae5e | ||
|
209cd3a49c | ||
|
95e5c1dfe5 | ||
|
45a8479061 | ||
|
a6ad381c24 | ||
|
bcf80f851d | ||
|
16304efacd | ||
|
968024ab73 | ||
|
3e60728727 | ||
|
9781ef086b | ||
|
f27f504ea4 | ||
|
2b08a76fbf | ||
|
90655e03b8 | ||
|
8551ff1b68 | ||
|
5ce94e8e49 | ||
|
7ef9c29fa8 | ||
|
fda398046e |
26
README.md
26
README.md
@@ -1,7 +1,11 @@
|
|||||||
#IMPORTANT INFORMATION
|
#IMPORTANT INFORMATION
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
- Beta 0.26 and Beta 0.261, Beta 0.262, Beta 0.27 is complete test
|
- 0.30 Version Test only download. almost complete
|
||||||
- You can download and use it.
|
- Beta 0.26 and Beta 0.261, Beta 0.262,0.27 is complete test, 0.28 is tested.
|
||||||
|
- You can download and use it (Release section).
|
||||||
|
|
||||||
|
# Current work list (for Version 0.31)
|
||||||
|
1 Testing CAT Control with Software using hamlib on Linux
|
||||||
|
|
||||||
#NOTICE
|
#NOTICE
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
@@ -46,6 +50,24 @@ Prepared or finished tasks for the next version
|
|||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
## REVISION RECORD
|
## REVISION RECORD
|
||||||
|
0.30
|
||||||
|
- implemented the function to monitor the value of all analog inputs. This allows you to monitor the status of the CW keys connected to your uBITX.
|
||||||
|
- possible to set the ADC range for CW Keying. If no setting is made, it will have the same range as the original code. If you set the CW Keying ADC Values using uBITX Manager 0.3, you can reduce the key error.
|
||||||
|
- Added the function to select Straight Key, IAMBICA, IAMBICB key from the menu.
|
||||||
|
- default Band select is Ham Band mode, if you want common type, long press function key at band select menu, uBITX Manager can be used to modify frequencies to suit your country.
|
||||||
|
|
||||||
|
0.29
|
||||||
|
- Remove the use of initialization values in BFO settings - using crruent value, if factory reset
|
||||||
|
- Select Tune Step, default 0, 20, 50, 100, 200, Use the uBITX Manager to set the steps value you want. You can select Step by pressing and holding the Function Key (1sec ~ 2sec).
|
||||||
|
- Modify Dial Lock Function, Press the Function key for more than 3 seconds to toggle dial lock.
|
||||||
|
- created a new frequency tune method. remove original source codes, Threshold has been applied to reduce malfunction. checked the continuity of the user operating to make natural tune possible.
|
||||||
|
- stabilize and remove many warning messages - by Pullrequest and merge
|
||||||
|
- Changed cw keying method. removed the original code and applied Ron's code and Improved compatibility with original hardware and CAT commnication. It can be used without modification of hardware.
|
||||||
|
|
||||||
|
0.28
|
||||||
|
- Fixed CAT problem with hamlib on Linux
|
||||||
|
- restore Protocol autorecovery logic
|
||||||
|
|
||||||
0.27
|
0.27
|
||||||
(First alpha test version, This will be renamed to the major version 1.0)
|
(First alpha test version, This will be renamed to the major version 1.0)
|
||||||
- Dual VFO Dial Lock (vfoA Dial lock)
|
- Dual VFO Dial Lock (vfoA Dial lock)
|
||||||
|
@@ -130,10 +130,21 @@ void CatGetFreqMode(unsigned long freq, byte fromType)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Mode Check
|
//Mode Check
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
if (isUSB)
|
if (isUSB)
|
||||||
CAT_BUFF[4] = CAT_MODE_USB;
|
CAT_BUFF[4] = CAT_MODE_USB;
|
||||||
else
|
else
|
||||||
CAT_BUFF[4] = CAT_MODE_LSB;
|
CAT_BUFF[4] = CAT_MODE_LSB;
|
||||||
|
}
|
||||||
|
else if (cwMode == 1)
|
||||||
|
{
|
||||||
|
CAT_BUFF[4] = CAT_MODE_CW;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CAT_BUFF[4] = CAT_MODE_CW;
|
||||||
|
}
|
||||||
|
|
||||||
SendCatData(5);
|
SendCatData(5);
|
||||||
}
|
}
|
||||||
@@ -198,12 +209,18 @@ void CatSetMode(byte tmpMode, byte fromType)
|
|||||||
|
|
||||||
if (!inTx)
|
if (!inTx)
|
||||||
{
|
{
|
||||||
if (tmpMode == CAT_MODE_USB)
|
if (tmpMode == CAT_MODE_CW)
|
||||||
{
|
{
|
||||||
|
cwMode = 1;
|
||||||
|
}
|
||||||
|
else if (tmpMode == CAT_MODE_USB)
|
||||||
|
{
|
||||||
|
cwMode = 0;
|
||||||
isUSB = true;
|
isUSB = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
cwMode = 0;
|
||||||
isUSB = false;
|
isUSB = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,10 +375,21 @@ void ReadEEPRom_FT817(byte fromType)
|
|||||||
CAT_BUFF[1] = 0xB2;
|
CAT_BUFF[1] = 0xB2;
|
||||||
break; case 0x69 : //FM Mic (#29) Contains 0-100 (decimal) as displayed
|
break; case 0x69 : //FM Mic (#29) Contains 0-100 (decimal) as displayed
|
||||||
case 0x78 :
|
case 0x78 :
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
if (isUSB)
|
if (isUSB)
|
||||||
CAT_BUFF[0] = CAT_MODE_USB;
|
CAT_BUFF[0] = CAT_MODE_USB;
|
||||||
else
|
else
|
||||||
CAT_BUFF[0] = CAT_MODE_LSB;
|
CAT_BUFF[0] = CAT_MODE_LSB;
|
||||||
|
}
|
||||||
|
else if (cwMode == 1)
|
||||||
|
{
|
||||||
|
CAT_BUFF[0] = CAT_MODE_CW;
|
||||||
|
}
|
||||||
|
else if (cwMode == 2)
|
||||||
|
{
|
||||||
|
CAT_BUFF[0] = CAT_MODE_CW;
|
||||||
|
}
|
||||||
|
|
||||||
if (CAT_BUFF[0] != 0) CAT_BUFF[0] = 1 << 5;
|
if (CAT_BUFF[0] != 0) CAT_BUFF[0] = 1 << 5;
|
||||||
break;
|
break;
|
||||||
@@ -384,7 +412,7 @@ void ReadEEPRom_FT817(byte fromType)
|
|||||||
//7A 6 ? ?
|
//7A 6 ? ?
|
||||||
//7A 7 SPL On/Off 0 = Off, 1 = On
|
//7A 7 SPL On/Off 0 = Off, 1 = On
|
||||||
|
|
||||||
CAT_BUFF[0] = (isSplitOn ? 0xFF : 0x7F);
|
CAT_BUFF[0] = (splitOn ? 0xFF : 0x7F);
|
||||||
break;
|
break;
|
||||||
case 0xB3 : //
|
case 0xB3 : //
|
||||||
CAT_BUFF[0] = 0x00;
|
CAT_BUFF[0] = 0x00;
|
||||||
@@ -472,7 +500,7 @@ void WriteEEPRom_FT817(byte fromType)
|
|||||||
printLineF2(F("Sidetone set! CAT"));
|
printLineF2(F("Sidetone set! CAT"));
|
||||||
EEPROM.put(CW_SIDETONE, sideTone);
|
EEPROM.put(CW_SIDETONE, sideTone);
|
||||||
delay(300); //If timeout errors occur in the calling software, remove them
|
delay(300); //If timeout errors occur in the calling software, remove them
|
||||||
printLine2(""); //Ham radio deluxe is the only one that supports this feature yet. and ham radio deluxe has wait time as greater than 500ms
|
clearLine2();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -484,7 +512,8 @@ void WriteEEPRom_FT817(byte fromType)
|
|||||||
printLineF2(F("Sidetone set! CAT"));
|
printLineF2(F("Sidetone set! CAT"));
|
||||||
EEPROM.put(CW_SIDETONE, sideTone);
|
EEPROM.put(CW_SIDETONE, sideTone);
|
||||||
delay(300); //If timeout errors occur in the calling software, remove them
|
delay(300); //If timeout errors occur in the calling software, remove them
|
||||||
printLine2(""); //Ham radio deluxe is the only one that supports this feature yet. and ham radio deluxe has wait time as greater than 500ms
|
clearLine2();
|
||||||
|
line2DisplayStatus = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -504,7 +533,7 @@ void WriteEEPRom_FT817(byte fromType)
|
|||||||
printLineF2(F("CW Speed set!"));
|
printLineF2(F("CW Speed set!"));
|
||||||
EEPROM.put(CW_DELAY, cwDelayTime);
|
EEPROM.put(CW_DELAY, cwDelayTime);
|
||||||
delay(300);
|
delay(300);
|
||||||
printLine2("");
|
clearLine2();
|
||||||
break;
|
break;
|
||||||
case 0x62 : //
|
case 0x62 : //
|
||||||
//5-0 CW Speed (4-60 WPM) (#21) From 0 to 38 (HEX) with 0 = 4 WPM and 38 = 60 WPM (1 WPM steps)
|
//5-0 CW Speed (4-60 WPM) (#21) From 0 to 38 (HEX) with 0 = 4 WPM and 38 = 60 WPM (1 WPM steps)
|
||||||
@@ -513,7 +542,7 @@ void WriteEEPRom_FT817(byte fromType)
|
|||||||
printLineF2(F("CW Speed set!"));
|
printLineF2(F("CW Speed set!"));
|
||||||
EEPROM.put(CW_SPEED, cwSpeed);
|
EEPROM.put(CW_SPEED, cwSpeed);
|
||||||
delay(300);
|
delay(300);
|
||||||
printLine2("");
|
clearLine2();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
|
@@ -299,7 +299,11 @@ void controlAutoCW(){
|
|||||||
|
|
||||||
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ);
|
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ);
|
||||||
|
|
||||||
lcd.setCursor(0,0);
|
byte diplayAutoCWLine = 0;
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
diplayAutoCWLine = 1;
|
||||||
|
|
||||||
|
lcd.setCursor(0, diplayAutoCWLine);
|
||||||
lcd.write(byteToChar(selectedCWTextIndex));
|
lcd.write(byteToChar(selectedCWTextIndex));
|
||||||
lcd.write(':');
|
lcd.write(':');
|
||||||
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
|
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
|
||||||
|
@@ -84,6 +84,7 @@
|
|||||||
#define PTT (A3)
|
#define PTT (A3)
|
||||||
#define ANALOG_KEYER (A6)
|
#define ANALOG_KEYER (A6)
|
||||||
#define ANALOG_SPARE (A7)
|
#define ANALOG_SPARE (A7)
|
||||||
|
#define ANALOG_SMETER (A7) //by KD8CEC
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Raduino board is the size of a standard 16x2 LCD panel. It has three connectors:
|
* The Raduino board is the size of a standard 16x2 LCD panel. It has three connectors:
|
||||||
@@ -150,6 +151,7 @@ int count = 0; //to generally count ticks, loops, etc
|
|||||||
#define CW_SPEED 28
|
#define CW_SPEED 28
|
||||||
|
|
||||||
//AT328 has 1KBytes EEPROM
|
//AT328 has 1KBytes EEPROM
|
||||||
|
#define CW_CAL 252
|
||||||
#define VFO_A_MODE 256
|
#define VFO_A_MODE 256
|
||||||
#define VFO_B_MODE 257
|
#define VFO_B_MODE 257
|
||||||
#define CW_DELAY 258
|
#define CW_DELAY 258
|
||||||
@@ -172,6 +174,10 @@ int count = 0; //to generally count ticks, loops, etc
|
|||||||
#define CW_ADC_DASH_TO 355 //CW ADC Range DASH to (Lower 8 bit)
|
#define CW_ADC_DASH_TO 355 //CW ADC Range DASH to (Lower 8 bit)
|
||||||
#define CW_ADC_BOTH_FROM 356 //CW ADC Range BOTH from (Lower 8 bit)
|
#define CW_ADC_BOTH_FROM 356 //CW ADC Range BOTH from (Lower 8 bit)
|
||||||
#define CW_ADC_BOTH_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
#define CW_ADC_BOTH_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
||||||
|
#define CW_KEY_TYPE 358
|
||||||
|
|
||||||
|
#define DISPLAY_OPTION1 361 //Display Option1
|
||||||
|
#define DISPLAY_OPTION2 362 //Display Option2
|
||||||
|
|
||||||
//Check Firmware type and version
|
//Check Firmware type and version
|
||||||
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
|
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
|
||||||
@@ -227,7 +233,7 @@ int count = 0; //to generally count ticks, loops, etc
|
|||||||
char ritOn = 0;
|
char ritOn = 0;
|
||||||
char vfoActive = VFO_A;
|
char vfoActive = VFO_A;
|
||||||
int8_t meter_reading = 0; // a -1 on meter makes it invisible
|
int8_t meter_reading = 0; // a -1 on meter makes it invisible
|
||||||
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier;
|
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier, cwmCarrier;
|
||||||
unsigned long vfoA_eeprom, vfoB_eeprom; //for protect eeprom life
|
unsigned long vfoA_eeprom, vfoB_eeprom; //for protect eeprom life
|
||||||
unsigned long frequency, ritRxFrequency, ritTxFrequency; //frequency is the current frequency on the dial
|
unsigned long frequency, ritRxFrequency, ritTxFrequency; //frequency is the current frequency on the dial
|
||||||
|
|
||||||
@@ -244,7 +250,6 @@ byte saveIntervalSec = 10; //second
|
|||||||
unsigned long saveCheckTime = 0;
|
unsigned long saveCheckTime = 0;
|
||||||
unsigned long saveCheckFreq = 0;
|
unsigned long saveCheckFreq = 0;
|
||||||
|
|
||||||
bool isSplitOn = false;
|
|
||||||
byte cwDelayTime = 60;
|
byte cwDelayTime = 60;
|
||||||
byte delayBeforeCWStartTime = 50;
|
byte delayBeforeCWStartTime = 50;
|
||||||
|
|
||||||
@@ -258,6 +263,9 @@ byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop]
|
|||||||
byte arTuneStep[5];
|
byte arTuneStep[5];
|
||||||
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
|
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
|
||||||
|
|
||||||
|
byte displayOption1 = 0;
|
||||||
|
byte displayOption2 = 0;
|
||||||
|
|
||||||
//CW ADC Range
|
//CW ADC Range
|
||||||
int cwAdcSTFrom = 0;
|
int cwAdcSTFrom = 0;
|
||||||
int cwAdcSTTo = 0;
|
int cwAdcSTTo = 0;
|
||||||
@@ -267,6 +275,10 @@ int cwAdcDashFrom = 0;
|
|||||||
int cwAdcDashTo = 0;
|
int cwAdcDashTo = 0;
|
||||||
int cwAdcBothFrom = 0;
|
int cwAdcBothFrom = 0;
|
||||||
int cwAdcBothTo = 0;
|
int cwAdcBothTo = 0;
|
||||||
|
byte cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||||||
|
bool Iambic_Key = true;
|
||||||
|
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
||||||
|
unsigned char keyerControl = IAMBICB;
|
||||||
|
|
||||||
//Variables for auto cw mode
|
//Variables for auto cw mode
|
||||||
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
||||||
@@ -286,9 +298,13 @@ byte userCallsignLength = 0; //7 : display callsign at system startup, 6~0 :
|
|||||||
*/
|
*/
|
||||||
boolean txCAT = false; //turned on if the transmitting due to a CAT command
|
boolean txCAT = false; //turned on if the transmitting due to a CAT command
|
||||||
char inTx = 0; //it is set to 1 if in transmit mode (whatever the reason : cw, ptt or cat)
|
char inTx = 0; //it is set to 1 if in transmit mode (whatever the reason : cw, ptt or cat)
|
||||||
char splitOn = 0; //working split, uses VFO B as the transmit frequency, (NOT IMPLEMENTED YET)
|
char splitOn = 0; //working split, uses VFO B as the transmit frequency
|
||||||
char keyDown = 0; //in cw mode, denotes the carrier is being transmitted
|
char keyDown = 0; //in cw mode, denotes the carrier is being transmitted
|
||||||
char isUSB = 0; //upper sideband was selected, this is reset to the default for the
|
char isUSB = 0; //upper sideband was selected, this is reset to the default for the
|
||||||
|
|
||||||
|
char cwMode = 0; //compatible original source, and extend mode //if cwMode == 0, mode check : isUSB, cwMode > 0, mode Check : cwMode
|
||||||
|
//iscwMode = 0 : ssbmode, 1 :cwl, 2 : cwu, 3 : cwn (none tx)
|
||||||
|
|
||||||
//frequency when it crosses the frequency border of 10 MHz
|
//frequency when it crosses the frequency border of 10 MHz
|
||||||
byte menuOn = 0; //set to 1 when the menu is being displayed, if a menu item sets it to zero, the menu is exited
|
byte menuOn = 0; //set to 1 when the menu is being displayed, if a menu item sets it to zero, the menu is exited
|
||||||
unsigned long cwTimeout = 0; //milliseconds to go before the cw transmit line is released and the radio goes back to rx mode
|
unsigned long cwTimeout = 0; //milliseconds to go before the cw transmit line is released and the radio goes back to rx mode
|
||||||
@@ -296,6 +312,14 @@ unsigned long dbgCount = 0; //not used now
|
|||||||
unsigned char txFilter = 0; //which of the four transmit filters are in use
|
unsigned char txFilter = 0; //which of the four transmit filters are in use
|
||||||
boolean modeCalibrate = false;//this mode of menus shows extended menus to calibrate the oscillators and choose the proper
|
boolean modeCalibrate = false;//this mode of menus shows extended menus to calibrate the oscillators and choose the proper
|
||||||
//beat frequency
|
//beat frequency
|
||||||
|
|
||||||
|
unsigned long beforeIdle_ProcessTime = 0; //for check Idle time
|
||||||
|
byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
|
||||||
|
char lcdMeter[17];
|
||||||
|
|
||||||
|
byte isIFShift = 0; //1 = ifShift, 2 extend
|
||||||
|
long ifShiftValue = 0; //
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Below are the basic functions that control the uBitx. Understanding the functions before
|
* Below are the basic functions that control the uBitx. Understanding the functions before
|
||||||
* you start hacking around
|
* you start hacking around
|
||||||
@@ -348,8 +372,10 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
|
|||||||
|
|
||||||
EEPROM.get(HAM_BAND_FREQS + 4 * findedIndex, resultFreq);
|
EEPROM.get(HAM_BAND_FREQS + 4 * findedIndex, resultFreq);
|
||||||
|
|
||||||
loadMode = (byte)(resultFreq >> 30);
|
//loadMode = (byte)(resultFreq >> 30);
|
||||||
resultFreq = resultFreq & 0x3FFFFFFF;
|
//resultFreq = resultFreq & 0x3FFFFFFF;
|
||||||
|
loadMode = (byte)(resultFreq >> 29);
|
||||||
|
resultFreq = resultFreq & 0x1FFFFFFF;
|
||||||
|
|
||||||
if ((resultFreq / 1000) < hamBandRange[(unsigned char)findedIndex][0] || (resultFreq / 1000) > hamBandRange[(unsigned char)findedIndex][1])
|
if ((resultFreq / 1000) < hamBandRange[(unsigned char)findedIndex][0] || (resultFreq / 1000) > hamBandRange[(unsigned char)findedIndex][1])
|
||||||
resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000;
|
resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000;
|
||||||
@@ -360,10 +386,10 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
|
|||||||
|
|
||||||
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
||||||
if (bandIndex >= 0)
|
if (bandIndex >= 0)
|
||||||
EEPROM.put(HAM_BAND_FREQS + 4 * bandIndex, (f & 0x3FFFFFFF) | (mode << 30) );
|
//EEPROM.put(HAM_BAND_FREQS + 4 * bandIndex, (f & 0x3FFFFFFF) | (mode << 30) );
|
||||||
|
EEPROM.put(HAM_BAND_FREQS + 4 * bandIndex, (f & 0x1FFFFFFF) | (mode << 29) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
KD8CEC
|
KD8CEC
|
||||||
When using the basic delay of the Arduino, the program freezes.
|
When using the basic delay of the Arduino, the program freezes.
|
||||||
@@ -457,14 +483,28 @@ void setFrequency(unsigned long f){
|
|||||||
|
|
||||||
setTXFilters(f);
|
setTXFilters(f);
|
||||||
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
if (isUSB){
|
if (isUSB){
|
||||||
si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f);
|
si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f + (isIFShift ? ifShiftValue : 0));
|
||||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
si5351bx_setfreq(1, SECOND_OSC_USB);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f);
|
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f + (isIFShift ? ifShiftValue : 0));
|
||||||
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cwMode == 1){ //CWL
|
||||||
|
si5351bx_setfreq(2, SECOND_OSC_LSB + cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
|
||||||
|
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
||||||
|
}
|
||||||
|
else{ //CWU
|
||||||
|
si5351bx_setfreq(2, SECOND_OSC_USB - cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
|
||||||
|
si5351bx_setfreq(1, SECOND_OSC_USB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
frequency = f;
|
frequency = f;
|
||||||
}
|
}
|
||||||
@@ -492,6 +532,21 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
|||||||
ritRxFrequency = frequency;
|
ritRxFrequency = frequency;
|
||||||
setFrequency(ritTxFrequency);
|
setFrequency(ritTxFrequency);
|
||||||
}
|
}
|
||||||
|
else if (splitOn == 1) {
|
||||||
|
if (vfoActive == VFO_B) {
|
||||||
|
vfoActive = VFO_A;
|
||||||
|
frequency = vfoA;
|
||||||
|
byteToMode(vfoA_mode);
|
||||||
|
}
|
||||||
|
else if (vfoActive == VFO_A){
|
||||||
|
vfoActive = VFO_B;
|
||||||
|
frequency = vfoB;
|
||||||
|
byteToMode(vfoB_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
setFrequency(frequency);
|
||||||
|
} //end of else
|
||||||
|
|
||||||
|
|
||||||
if (txMode == TX_CW){
|
if (txMode == TX_CW){
|
||||||
//turn off the second local oscillator and the bfo
|
//turn off the second local oscillator and the bfo
|
||||||
@@ -501,11 +556,23 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
|||||||
//shif the first oscillator to the tx frequency directly
|
//shif the first oscillator to the tx frequency directly
|
||||||
//the key up and key down will toggle the carrier unbalancing
|
//the key up and key down will toggle the carrier unbalancing
|
||||||
//the exact cw frequency is the tuned frequency + sidetone
|
//the exact cw frequency is the tuned frequency + sidetone
|
||||||
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
if (isUSB)
|
if (isUSB)
|
||||||
si5351bx_setfreq(2, frequency + sideTone);
|
si5351bx_setfreq(2, frequency + sideTone);
|
||||||
else
|
else
|
||||||
si5351bx_setfreq(2, frequency - sideTone);
|
si5351bx_setfreq(2, frequency - sideTone);
|
||||||
}
|
}
|
||||||
|
else if (cwMode == 1) //CWL
|
||||||
|
{
|
||||||
|
si5351bx_setfreq(2, frequency - sideTone);
|
||||||
|
}
|
||||||
|
else //CWU
|
||||||
|
{
|
||||||
|
si5351bx_setfreq(2, frequency + sideTone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//reduce latency time when begin of CW mode
|
//reduce latency time when begin of CW mode
|
||||||
if (isDisplayUpdate == 1)
|
if (isDisplayUpdate == 1)
|
||||||
@@ -516,10 +583,28 @@ void stopTx(){
|
|||||||
inTx = 0;
|
inTx = 0;
|
||||||
|
|
||||||
digitalWrite(TX_RX, 0); //turn off the tx
|
digitalWrite(TX_RX, 0); //turn off the tx
|
||||||
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
else
|
||||||
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
|
||||||
if (ritOn)
|
if (ritOn)
|
||||||
setFrequency(ritRxFrequency);
|
setFrequency(ritRxFrequency);
|
||||||
|
else if (splitOn == 1) {
|
||||||
|
//vfo Change
|
||||||
|
if (vfoActive == VFO_B){
|
||||||
|
vfoActive = VFO_A;
|
||||||
|
frequency = vfoA;
|
||||||
|
byteToMode(vfoA_mode);
|
||||||
|
}
|
||||||
|
else if (vfoActive == VFO_A){
|
||||||
|
vfoActive = VFO_B;
|
||||||
|
frequency = vfoB;
|
||||||
|
byteToMode(vfoB_mode);
|
||||||
|
}
|
||||||
|
setFrequency(frequency);
|
||||||
|
} //end of else
|
||||||
else
|
else
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
|
||||||
@@ -670,6 +755,24 @@ void doRIT(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void doIFShift(){
|
||||||
|
int knob = enc_read();
|
||||||
|
unsigned long old_freq = frequency;
|
||||||
|
|
||||||
|
if (knob != 0)
|
||||||
|
{
|
||||||
|
if (knob < 0)
|
||||||
|
ifShiftValue -= 1l;
|
||||||
|
else if (knob > 0)
|
||||||
|
ifShiftValue += 1;
|
||||||
|
|
||||||
|
updateLine2Buffer(1);
|
||||||
|
setFrequency(frequency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
save Frequency and mode to eeprom
|
save Frequency and mode to eeprom
|
||||||
*/
|
*/
|
||||||
@@ -745,6 +848,7 @@ void initSettings(){
|
|||||||
if (EEPROM.read(VERSION_ADDRESS) != VERSION_NUM)
|
if (EEPROM.read(VERSION_ADDRESS) != VERSION_NUM)
|
||||||
EEPROM.write(VERSION_ADDRESS, VERSION_NUM);
|
EEPROM.write(VERSION_ADDRESS, VERSION_NUM);
|
||||||
|
|
||||||
|
EEPROM.get(CW_CAL, cwmCarrier);
|
||||||
|
|
||||||
//for Save VFO_A_MODE to eeprom
|
//for Save VFO_A_MODE to eeprom
|
||||||
//0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM
|
//0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM
|
||||||
@@ -756,6 +860,24 @@ void initSettings(){
|
|||||||
|
|
||||||
//CW interval between TX and CW Start
|
//CW interval between TX and CW Start
|
||||||
EEPROM.get(CW_START, delayBeforeCWStartTime);
|
EEPROM.get(CW_START, delayBeforeCWStartTime);
|
||||||
|
EEPROM.get(CW_KEY_TYPE, cwKeyType);
|
||||||
|
if (cwKeyType > 2)
|
||||||
|
cwKeyType = 0;
|
||||||
|
|
||||||
|
if (cwKeyType == 0)
|
||||||
|
Iambic_Key = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Iambic_Key = true;
|
||||||
|
if (cwKeyType == 1)
|
||||||
|
keyerControl &= ~IAMBICB;
|
||||||
|
else
|
||||||
|
keyerControl |= IAMBICB;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EEPROM.get(DISPLAY_OPTION1, displayOption1);
|
||||||
|
EEPROM.get(DISPLAY_OPTION2, displayOption2);
|
||||||
|
|
||||||
//User callsign information
|
//User callsign information
|
||||||
if (EEPROM.read(USER_CALLSIGN_KEY) == 0x59)
|
if (EEPROM.read(USER_CALLSIGN_KEY) == 0x59)
|
||||||
@@ -790,7 +912,7 @@ void initSettings(){
|
|||||||
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
|
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
|
||||||
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
|
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
|
||||||
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367;
|
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367;
|
||||||
hamBandRange[3][0] = 7000; hamBandRange[3][1] = 7200;
|
hamBandRange[3][0] = 7000; hamBandRange[3][1] = 7300; //region 1
|
||||||
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
|
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
|
||||||
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
|
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
|
||||||
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
|
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
|
||||||
@@ -876,6 +998,9 @@ void initSettings(){
|
|||||||
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
||||||
usbCarrier = 11995000l;
|
usbCarrier = 11995000l;
|
||||||
|
|
||||||
|
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
||||||
|
cwmCarrier = 11995000l;
|
||||||
|
|
||||||
if (vfoA > 35000000l || 3500000l > vfoA) {
|
if (vfoA > 35000000l || 3500000l > vfoA) {
|
||||||
vfoA = 7150000l;
|
vfoA = 7150000l;
|
||||||
vfoA_mode = 2;
|
vfoA_mode = 2;
|
||||||
@@ -923,6 +1048,7 @@ void initPorts(){
|
|||||||
|
|
||||||
pinMode(PTT, INPUT_PULLUP);
|
pinMode(PTT, INPUT_PULLUP);
|
||||||
pinMode(ANALOG_KEYER, INPUT_PULLUP);
|
pinMode(ANALOG_KEYER, INPUT_PULLUP);
|
||||||
|
pinMode(ANALOG_SMETER, INPUT); //by KD8CEC
|
||||||
|
|
||||||
pinMode(CW_TONE, OUTPUT);
|
pinMode(CW_TONE, OUTPUT);
|
||||||
digitalWrite(CW_TONE, 0);
|
digitalWrite(CW_TONE, 0);
|
||||||
@@ -958,7 +1084,7 @@ void setup()
|
|||||||
|
|
||||||
//Serial.begin(9600);
|
//Serial.begin(9600);
|
||||||
lcd.begin(16, 2);
|
lcd.begin(16, 2);
|
||||||
printLineF(1, F("CECBT v0.30"));
|
printLineF(1, F("CECBT v0.33"));
|
||||||
|
|
||||||
Init_Cat(38400, SERIAL_8N1);
|
Init_Cat(38400, SERIAL_8N1);
|
||||||
initMeter(); //not used in this build
|
initMeter(); //not used in this build
|
||||||
@@ -972,15 +1098,16 @@ void setup()
|
|||||||
else {
|
else {
|
||||||
printLineF(0, F("uBITX v0.20"));
|
printLineF(0, F("uBITX v0.20"));
|
||||||
delay(500);
|
delay(500);
|
||||||
printLine2("");
|
clearLine2();
|
||||||
}
|
}
|
||||||
|
|
||||||
initPorts();
|
initPorts();
|
||||||
|
|
||||||
|
byteToMode(vfoA_mode);
|
||||||
initOscillators();
|
initOscillators();
|
||||||
|
|
||||||
frequency = vfoA;
|
frequency = vfoA;
|
||||||
saveCheckFreq = frequency; //for auto save frequency
|
saveCheckFreq = frequency; //for auto save frequency
|
||||||
byteToMode(vfoA_mode);
|
|
||||||
setFrequency(vfoA);
|
setFrequency(vfoA);
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
|
|
||||||
@@ -1044,9 +1171,16 @@ void loop(){
|
|||||||
if (!inTx){
|
if (!inTx){
|
||||||
if (ritOn)
|
if (ritOn)
|
||||||
doRIT();
|
doRIT();
|
||||||
|
//else if (isIFShift)
|
||||||
|
// doIFShift();
|
||||||
else
|
else
|
||||||
doTuningWithThresHold();
|
doTuningWithThresHold();
|
||||||
|
|
||||||
|
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 250) {
|
||||||
|
idle_process();
|
||||||
|
beforeIdle_ProcessTime = millis();
|
||||||
}
|
}
|
||||||
|
} //end of check TX Status
|
||||||
|
|
||||||
//we check CAT after the encoder as it might put the radio into TX
|
//we check CAT after the encoder as it might put the radio into TX
|
||||||
Check_Cat(inTx? 1 : 0);
|
Check_Cat(inTx? 1 : 0);
|
||||||
|
@@ -14,6 +14,7 @@ void btnWaitForClick(){
|
|||||||
void factory_alignment(){
|
void factory_alignment(){
|
||||||
|
|
||||||
factoryCalibration(1);
|
factoryCalibration(1);
|
||||||
|
line2DisplayStatus = 1;
|
||||||
|
|
||||||
if (calibration == 0){
|
if (calibration == 0){
|
||||||
printLine2("Setup Aborted");
|
printLine2("Setup Aborted");
|
||||||
@@ -36,6 +37,7 @@ void factory_alignment(){
|
|||||||
|
|
||||||
|
|
||||||
printLine2("#3:Test 3.5MHz");
|
printLine2("#3:Test 3.5MHz");
|
||||||
|
cwMode = 0;
|
||||||
isUSB = false;
|
isUSB = false;
|
||||||
setFrequency(3500000l);
|
setFrequency(3500000l);
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
@@ -58,6 +60,7 @@ void factory_alignment(){
|
|||||||
btnWaitForClick();
|
btnWaitForClick();
|
||||||
printLine2("#5:Test 14MHz");
|
printLine2("#5:Test 14MHz");
|
||||||
|
|
||||||
|
cwMode = 0;
|
||||||
isUSB = true;
|
isUSB = true;
|
||||||
setFrequency(14000000l);
|
setFrequency(14000000l);
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
@@ -79,6 +82,7 @@ void factory_alignment(){
|
|||||||
printLine2("Alignment done");
|
printLine2("Alignment done");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|
||||||
|
cwMode = 0;
|
||||||
isUSB = false;
|
isUSB = false;
|
||||||
setFrequency(7150000l);
|
setFrequency(7150000l);
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
|
237
ubitx_20/ubitx_idle.ino
Normal file
237
ubitx_20/ubitx_idle.ino
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
KD8CEC's uBITX Idle time Processing
|
||||||
|
Functions that run at times that do not affect TX, CW, and CAT
|
||||||
|
It is called in 1/10 time unit.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
byte line2Buffer[16];
|
||||||
|
//KD8CEC 200Hz ST
|
||||||
|
//L14.150 200Hz ST
|
||||||
|
//U14.150 +150khz
|
||||||
|
int freqScrollPosition = 0;
|
||||||
|
//Example Line2 Optinal Display
|
||||||
|
//immediate execution, not call by scheulder
|
||||||
|
void updateLine2Buffer(char isDirectCall)
|
||||||
|
{
|
||||||
|
unsigned long tmpFreq = 0;
|
||||||
|
if (isDirectCall == 0)
|
||||||
|
{
|
||||||
|
if (ritOn)
|
||||||
|
{
|
||||||
|
line2Buffer[0] = 'R';
|
||||||
|
line2Buffer[1] = 'i';
|
||||||
|
line2Buffer[2] = 't';
|
||||||
|
line2Buffer[3] = 'T';
|
||||||
|
line2Buffer[4] = 'X';
|
||||||
|
line2Buffer[5] = ':';
|
||||||
|
|
||||||
|
//display frequency
|
||||||
|
tmpFreq = ritTxFrequency;
|
||||||
|
for (int i = 15; i >= 6; i--) {
|
||||||
|
if (tmpFreq > 0) {
|
||||||
|
if (i == 12 || i == 8) line2Buffer[i] = '.';
|
||||||
|
else {
|
||||||
|
line2Buffer[i] = tmpFreq % 10 + 0x30;
|
||||||
|
tmpFreq /= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vfoActive == VFO_B)
|
||||||
|
{
|
||||||
|
tmpFreq = vfoA;
|
||||||
|
//line2Buffer[0] = 'A';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmpFreq = vfoB;
|
||||||
|
//line2Buffer[0] = 'B';
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXAMPLE 1 & 2
|
||||||
|
//U14.150.100
|
||||||
|
//display frequency
|
||||||
|
for (int i = 9; i >= 0; i--) {
|
||||||
|
if (tmpFreq > 0) {
|
||||||
|
if (i == 2 || i == 6) line2Buffer[i] = '.';
|
||||||
|
else {
|
||||||
|
line2Buffer[i] = tmpFreq % 10 + 0x30;
|
||||||
|
tmpFreq /= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
//EXAMPLE #1
|
||||||
|
if ((displayOption1 & 0x04) == 0x00)
|
||||||
|
line2Buffer[6] = 'k';
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//example #2
|
||||||
|
if (freqScrollPosition++ > 18)
|
||||||
|
{
|
||||||
|
line2Buffer[6] = 'k';
|
||||||
|
if (freqScrollPosition > 25)
|
||||||
|
freqScrollPosition = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line2Buffer[10] = 'H';
|
||||||
|
line2Buffer[11] = 'z';
|
||||||
|
|
||||||
|
if (freqScrollPosition < 7)
|
||||||
|
{
|
||||||
|
for (int i = 11; i >= 0; i--)
|
||||||
|
if (i - (7 - freqScrollPosition) >= 0)
|
||||||
|
line2Buffer[i] = line2Buffer[i - (7 - freqScrollPosition)];
|
||||||
|
else
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 11; i++)
|
||||||
|
if (i + (freqScrollPosition - 7) <= 11)
|
||||||
|
line2Buffer[i] = line2Buffer[i + (freqScrollPosition - 7)];
|
||||||
|
else
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line2Buffer[7] = ' ';
|
||||||
|
} //check direct call by encoder
|
||||||
|
|
||||||
|
|
||||||
|
if (isIFShift)
|
||||||
|
{
|
||||||
|
if (isDirectCall == 1)
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
|
||||||
|
//IFShift Offset Value
|
||||||
|
line2Buffer[8] = 'I';
|
||||||
|
line2Buffer[9] = 'F';
|
||||||
|
|
||||||
|
if (ifShiftValue == 0)
|
||||||
|
{
|
||||||
|
line2Buffer[10] = 'S';
|
||||||
|
line2Buffer[11] = ':';
|
||||||
|
line2Buffer[12] = 'O';
|
||||||
|
line2Buffer[13] = 'F';
|
||||||
|
line2Buffer[14] = 'F';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
|
||||||
|
line2Buffer[11] = 0;
|
||||||
|
line2Buffer[12] = ' ';
|
||||||
|
|
||||||
|
//11, 12, 13, 14, 15
|
||||||
|
memset(b, 0, sizeof(b));
|
||||||
|
ltoa(ifShiftValue, b, DEC);
|
||||||
|
strncat(line2Buffer, b, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDirectCall == 1) //if call by encoder (not scheduler), immediate print value
|
||||||
|
printLine2(line2Buffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isDirectCall != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Step
|
||||||
|
byte tmpStep = arTuneStep[tuneStepIndex -1];
|
||||||
|
for (int i = 10; i >= 8; i--) {
|
||||||
|
if (tmpStep > 0) {
|
||||||
|
line2Buffer[i] = tmpStep % 10 + 0x30;
|
||||||
|
tmpStep /= 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
line2Buffer[11] = 'H';
|
||||||
|
line2Buffer[12] = 'z';
|
||||||
|
|
||||||
|
line2Buffer[13] = ' ';
|
||||||
|
//if (
|
||||||
|
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||||||
|
if (cwKeyType == 0)
|
||||||
|
{
|
||||||
|
line2Buffer[14] = 'S';
|
||||||
|
line2Buffer[15] = 'T';
|
||||||
|
}
|
||||||
|
else if (cwKeyType == 1)
|
||||||
|
{
|
||||||
|
line2Buffer[14] = 'I';
|
||||||
|
line2Buffer[15] = 'A';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line2Buffer[14] = 'I';
|
||||||
|
line2Buffer[15] = 'B';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//meterType : 0 = S.Meter, 1 : P.Meter
|
||||||
|
void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
||||||
|
{
|
||||||
|
drawMeter(meterValue); //call original source code
|
||||||
|
int lineNumber = 0;
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
lineNumber = 1;
|
||||||
|
|
||||||
|
lcd.setCursor(drawPosition, lineNumber);
|
||||||
|
|
||||||
|
for (int i = 0; i < 6; i++) //meter 5 + +db 1 = 6
|
||||||
|
lcd.write(lcdMeter[i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
byte testValue = 0;
|
||||||
|
char checkCount = 0;
|
||||||
|
void idle_process()
|
||||||
|
{
|
||||||
|
//space for user graphic display
|
||||||
|
if (menuOn == 0)
|
||||||
|
{
|
||||||
|
//if line2DisplayStatus == 0 <-- this condition is clear Line, you can display any message
|
||||||
|
if (line2DisplayStatus == 0 || (((displayOption1 & 0x04) == 0x04) && line2DisplayStatus == 2)) {
|
||||||
|
if (checkCount++ > 1)
|
||||||
|
{
|
||||||
|
updateLine2Buffer(0); //call by scheduler
|
||||||
|
printLine2(line2Buffer);
|
||||||
|
line2DisplayStatus = 2;
|
||||||
|
checkCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//EX for Meters
|
||||||
|
/*
|
||||||
|
DisplayMeter(0, testValue++, 7);
|
||||||
|
if (testValue > 30)
|
||||||
|
testValue = 0;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@@ -91,8 +91,6 @@ void cwKeyUp(){
|
|||||||
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
||||||
enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT };
|
enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT };
|
||||||
static long ktimer;
|
static long ktimer;
|
||||||
bool Iambic_Key = true;
|
|
||||||
unsigned char keyerControl = IAMBICB;
|
|
||||||
unsigned char keyerState = IDLE;
|
unsigned char keyerState = IDLE;
|
||||||
|
|
||||||
//Below is a test to reduce the keying error. do not delete lines
|
//Below is a test to reduce the keying error. do not delete lines
|
||||||
@@ -101,17 +99,17 @@ char update_PaddleLatch(byte isUpdateKeyState) {
|
|||||||
unsigned char tmpKeyerControl;
|
unsigned char tmpKeyerControl;
|
||||||
int paddle = analogRead(ANALOG_KEYER);
|
int paddle = analogRead(ANALOG_KEYER);
|
||||||
|
|
||||||
if (paddle > cwAdcDashFrom && paddle < cwAdcDashTo)
|
if (paddle >= cwAdcDashFrom && paddle <= cwAdcDashTo)
|
||||||
tmpKeyerControl |= DAH_L;
|
tmpKeyerControl |= DAH_L;
|
||||||
else if (paddle > cwAdcDotFrom && paddle < cwAdcDotTo)
|
else if (paddle >= cwAdcDotFrom && paddle <= cwAdcDotTo)
|
||||||
tmpKeyerControl |= DIT_L;
|
tmpKeyerControl |= DIT_L;
|
||||||
else if (paddle > cwAdcBothFrom && paddle < cwAdcBothTo)
|
else if (paddle >= cwAdcBothFrom && paddle <= cwAdcBothTo)
|
||||||
tmpKeyerControl |= (DAH_L | DIT_L) ;
|
tmpKeyerControl |= (DAH_L | DIT_L) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Iambic_Key)
|
if (Iambic_Key)
|
||||||
tmpKeyerControl = 0 ;
|
tmpKeyerControl = 0 ;
|
||||||
else if (paddle > cwAdcSTFrom && paddle < cwAdcSTTo)
|
else if (paddle >= cwAdcSTFrom && paddle <= cwAdcSTTo)
|
||||||
tmpKeyerControl = DIT_L ;
|
tmpKeyerControl = DIT_L ;
|
||||||
else
|
else
|
||||||
tmpKeyerControl = 0 ;
|
tmpKeyerControl = 0 ;
|
||||||
|
@@ -87,6 +87,8 @@ void menuBand(int btn){
|
|||||||
stepChangeCount = 0;
|
stepChangeCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//setFrequency(frequency + 200000l);
|
||||||
}
|
}
|
||||||
else { //original source
|
else { //original source
|
||||||
if (knob < 0 && frequency > 3000000l)
|
if (knob < 0 && frequency > 3000000l)
|
||||||
@@ -119,30 +121,56 @@ void menuBand(int btn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Convert Mode, Number by KD8CEC
|
//Convert Mode, Number by KD8CEC
|
||||||
//0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM
|
//0: default, 1:not use, 2:LSB, 3:USB, 4:CWL, 5:CWU, 6:FM
|
||||||
byte modeToByte(){
|
byte modeToByte(){
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
if (isUSB)
|
if (isUSB)
|
||||||
return 3;
|
return 3;
|
||||||
else
|
else
|
||||||
return 2;
|
return 2;
|
||||||
|
}
|
||||||
|
else if (cwMode == 1)
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Convert Number to Mode by KD8CEC
|
//Convert Number to Mode by KD8CEC
|
||||||
void byteToMode(byte modeValue){
|
void byteToMode(byte modeValue){
|
||||||
|
if (modeValue == 4)
|
||||||
|
cwMode = 1;
|
||||||
|
else if (modeValue == 5)
|
||||||
|
cwMode = 2;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cwMode = 0;
|
||||||
if (modeValue == 3)
|
if (modeValue == 3)
|
||||||
isUSB = 1;
|
isUSB = 1;
|
||||||
else
|
else
|
||||||
isUSB = 0;
|
isUSB = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Convert Number to Mode by KD8CEC
|
//Convert Number to Mode by KD8CEC
|
||||||
void byteWithFreqToMode(byte modeValue){
|
void byteWithFreqToMode(byte modeValue){
|
||||||
|
if (modeValue == 4)
|
||||||
|
cwMode = 1;
|
||||||
|
else if (modeValue == 5)
|
||||||
|
cwMode = 2;
|
||||||
|
else {
|
||||||
|
cwMode = 0;
|
||||||
if (modeValue == 3)
|
if (modeValue == 3)
|
||||||
isUSB = 1;
|
isUSB = 1;
|
||||||
else if (modeValue == 0) //Not Set
|
else if (modeValue == 0) //Not Set
|
||||||
isUSB = (frequency > 10000000l) ? true : false;
|
isUSB = (frequency > 10000000l) ? true : false;
|
||||||
else
|
else
|
||||||
isUSB = 0;
|
isUSB = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//VFO Toggle and save VFO Information, modified by KD8CEC
|
//VFO Toggle and save VFO Information, modified by KD8CEC
|
||||||
@@ -179,6 +207,7 @@ void menuVfoToggle(int btn, char isUseDelayTime)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ritDisable();
|
ritDisable();
|
||||||
|
setFrequency(frequency);
|
||||||
|
|
||||||
if (isUseDelayTime == 1) //Found Issue in wsjt-x Linux 32bit
|
if (isUseDelayTime == 1) //Found Issue in wsjt-x Linux 32bit
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
@@ -212,6 +241,94 @@ void menuRitToggle(int btn){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void menuIFSToggle(int btn){
|
||||||
|
if (!btn){
|
||||||
|
if (isIFShift == 1)
|
||||||
|
printLineF2(F("IF Shift:On, Off?"));
|
||||||
|
else
|
||||||
|
printLineF2(F("IF Shift:Off, On?"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isIFShift == 0){
|
||||||
|
printLineF2(F("IF Shift is ON"));
|
||||||
|
isIFShift = 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
printLineF2(F("IF Shift is OFF"));
|
||||||
|
isIFShift = 0;
|
||||||
|
}
|
||||||
|
menuOn = 0;
|
||||||
|
delay_background(500, 0);
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
void menuIFSToggle(int btn){
|
||||||
|
int knob = 0;
|
||||||
|
char needApplyChangeValue = 1;
|
||||||
|
|
||||||
|
if (!btn){
|
||||||
|
if (isIFShift == 1)
|
||||||
|
printLineF2(F("IF Shift Change?"));
|
||||||
|
else
|
||||||
|
printLineF2(F("IF Shift:Off, On?"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isIFShift == 0){
|
||||||
|
printLineF2(F("IF Shift is ON"));
|
||||||
|
delay_background(500, 0);
|
||||||
|
isIFShift = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
delay_background(500, 0);
|
||||||
|
updateLine2Buffer(1);
|
||||||
|
setFrequency(frequency);
|
||||||
|
|
||||||
|
//Off or Change Value
|
||||||
|
while(!btnDown() && digitalRead(PTT) == HIGH){
|
||||||
|
if (needApplyChangeValue ==1)
|
||||||
|
{
|
||||||
|
updateLine2Buffer(1);
|
||||||
|
setFrequency(frequency);
|
||||||
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
else
|
||||||
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
|
||||||
|
needApplyChangeValue = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
knob = enc_read();
|
||||||
|
if (knob != 0){
|
||||||
|
if (knob < 0)
|
||||||
|
ifShiftValue -= 1l;
|
||||||
|
else if (knob > 0)
|
||||||
|
ifShiftValue += 1;
|
||||||
|
|
||||||
|
needApplyChangeValue = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delay_background(500, 0); //for check Long Press function key
|
||||||
|
|
||||||
|
if (btnDown() || digitalRead(PTT) == LOW || ifShiftValue == 0)
|
||||||
|
{
|
||||||
|
isIFShift = 0;
|
||||||
|
printLineF2(F("IF Shift is OFF"));
|
||||||
|
setFrequency(frequency);
|
||||||
|
delay_background(500, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
menuOn = 0;
|
||||||
|
//delay_background(500, 0);
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
void menuSidebandToggle(int btn){
|
void menuSidebandToggle(int btn){
|
||||||
if (!btn){
|
if (!btn){
|
||||||
if (isUSB == true)
|
if (isUSB == true)
|
||||||
@@ -220,6 +337,7 @@ void menuSidebandToggle(int btn){
|
|||||||
printLineF2(F("Select USB?"));
|
printLineF2(F("Select USB?"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
cwMode = 0;
|
||||||
if (isUSB == true){
|
if (isUSB == true){
|
||||||
isUSB = false;
|
isUSB = false;
|
||||||
printLineF2(F("LSB Selected"));
|
printLineF2(F("LSB Selected"));
|
||||||
@@ -234,7 +352,133 @@ void menuSidebandToggle(int btn){
|
|||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
void menuSelectMode(int btn){
|
||||||
|
int knob = 0;
|
||||||
|
int selectModeType = 0;
|
||||||
|
int beforeMode = 0;
|
||||||
|
int moveStep = 0;
|
||||||
|
|
||||||
|
if (!btn){
|
||||||
|
printLineF2(F("Select Mode?"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
delay_background(500, 0);
|
||||||
|
|
||||||
|
//LSB, USB, CWL, CWU
|
||||||
|
if (cwMode == 0 && isUSB == 0)
|
||||||
|
selectModeType = 0;
|
||||||
|
else if (cwMode == 0 && isUSB == 1)
|
||||||
|
selectModeType = 1;
|
||||||
|
else if (cwMode == 1)
|
||||||
|
selectModeType = 2;
|
||||||
|
else
|
||||||
|
selectModeType = 3;
|
||||||
|
|
||||||
|
beforeMode = selectModeType;
|
||||||
|
|
||||||
|
while(!btnDown() && digitalRead(PTT) == HIGH){
|
||||||
|
//Display Mode Name
|
||||||
|
printLineF1(F("LSB USB CWL CWU"));
|
||||||
|
if (selectModeType == 0)
|
||||||
|
printLineF1(F("LSB"));
|
||||||
|
else if (selectModeType == 1)
|
||||||
|
printLineF1(F("USB"));
|
||||||
|
else if (selectModeType == 2)
|
||||||
|
printLineF1(F("CWL"));
|
||||||
|
else if (selectModeType == 3)
|
||||||
|
printLineF1(F("CWU"));
|
||||||
|
|
||||||
|
knob = enc_read();
|
||||||
|
|
||||||
|
if (knob != 0)
|
||||||
|
{
|
||||||
|
moveStep += (knob > 0 ? 1 : -1);
|
||||||
|
if (moveStep < -3) {
|
||||||
|
if (selectModeType > 0)
|
||||||
|
selectModeType--;
|
||||||
|
|
||||||
|
moveStep = 0;
|
||||||
|
}
|
||||||
|
else if (moveStep > 3) {
|
||||||
|
if (selectModeType < 3)
|
||||||
|
selectModeType++;
|
||||||
|
|
||||||
|
moveStep = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Check_Cat(0); //To prevent disconnections
|
||||||
|
}
|
||||||
|
|
||||||
|
if (beforeMode != selectModeType) {
|
||||||
|
printLineF1(F("Changed Mode"));
|
||||||
|
|
||||||
|
if (selectModeType == 0) {
|
||||||
|
cwMode = 0; isUSB = 0;
|
||||||
|
}
|
||||||
|
else if (selectModeType == 1) {
|
||||||
|
cwMode = 0; isUSB = 1;
|
||||||
|
}
|
||||||
|
else if (selectModeType == 2) {
|
||||||
|
cwMode = 1;
|
||||||
|
}
|
||||||
|
else if (selectModeType == 3) {
|
||||||
|
cwMode = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save Frequency & Mode Information
|
||||||
|
if (vfoActive == VFO_A)
|
||||||
|
{
|
||||||
|
vfoA = frequency;
|
||||||
|
vfoA_mode = modeToByte();
|
||||||
|
storeFrequencyAndMode(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vfoB = frequency;
|
||||||
|
vfoB_mode = modeToByte();
|
||||||
|
storeFrequencyAndMode(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
else
|
||||||
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
|
||||||
|
setFrequency(frequency);
|
||||||
|
delay_background(500, 0);
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
menuOn = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void menuSplitOnOff(int btn){
|
||||||
|
if (!btn){
|
||||||
|
if (splitOn == 0)
|
||||||
|
printLineF2(F("Split On?"));
|
||||||
|
else
|
||||||
|
printLineF2(F("Split Off?"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (splitOn == 1){
|
||||||
|
splitOn = 0;
|
||||||
|
printLineF2(F("Split Off!"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
splitOn = 1;
|
||||||
|
if (ritOn == 1)
|
||||||
|
ritOn = 0;
|
||||||
|
printLineF2(F("Split On!"));
|
||||||
|
}
|
||||||
|
delay_background(500, 0);
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
menuOn = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
//Select CW Key Type by KD8CEC
|
//Select CW Key Type by KD8CEC
|
||||||
void menuSetupKeyType(int btn){
|
void menuSetupKeyType(int btn){
|
||||||
if (!btn && digitalRead(PTT) == HIGH){
|
if (!btn && digitalRead(PTT) == HIGH){
|
||||||
@@ -269,6 +513,71 @@ void menuSetupKeyType(int btn){
|
|||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Select CW Key Type by KD8CEC
|
||||||
|
void menuSetupKeyType(int btn){
|
||||||
|
int knob = 0;
|
||||||
|
int selectedKeyType = 0;
|
||||||
|
int moveStep = 0;
|
||||||
|
if (!btn){
|
||||||
|
printLineF2(F("Change Key Type?"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printLineF2(F("Press to set Key"));
|
||||||
|
delay_background(500, 0);
|
||||||
|
selectedKeyType = cwKeyType;
|
||||||
|
|
||||||
|
while(!btnDown()){
|
||||||
|
|
||||||
|
//Display Key Type
|
||||||
|
if (selectedKeyType == 0)
|
||||||
|
printLineF1(F("Straight"));
|
||||||
|
else if (selectedKeyType == 1)
|
||||||
|
printLineF1(F("IAMBICA"));
|
||||||
|
else if (selectedKeyType == 2)
|
||||||
|
printLineF1(F("IAMBICB"));
|
||||||
|
|
||||||
|
knob = enc_read();
|
||||||
|
|
||||||
|
if (knob != 0)
|
||||||
|
{
|
||||||
|
moveStep += (knob > 0 ? 1 : -1);
|
||||||
|
if (moveStep < -3) {
|
||||||
|
if (selectedKeyType > 0)
|
||||||
|
selectedKeyType--;
|
||||||
|
moveStep = 0;
|
||||||
|
}
|
||||||
|
else if (moveStep > 3) {
|
||||||
|
if (selectedKeyType < 2)
|
||||||
|
selectedKeyType++;
|
||||||
|
moveStep = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Check_Cat(0); //To prevent disconnections
|
||||||
|
}
|
||||||
|
|
||||||
|
printLineF2(F("CW Key Type set!"));
|
||||||
|
cwKeyType = selectedKeyType;
|
||||||
|
EEPROM.put(CW_KEY_TYPE, cwKeyType);
|
||||||
|
|
||||||
|
if (cwKeyType == 0)
|
||||||
|
Iambic_Key = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Iambic_Key = true;
|
||||||
|
if (cwKeyType == 1)
|
||||||
|
keyerControl &= ~IAMBICB;
|
||||||
|
else
|
||||||
|
keyerControl |= IAMBICB;
|
||||||
|
}
|
||||||
|
delay_background(2000, 0);
|
||||||
|
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
menuOn = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Analog pin monitoring with CW Key and function keys connected.
|
//Analog pin monitoring with CW Key and function keys connected.
|
||||||
//by KD8CEC
|
//by KD8CEC
|
||||||
@@ -425,7 +734,7 @@ void menuCWSpeed(int btn){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF1(F("Press PTT to set"));
|
printLineF1(F("Press to set WPm"));
|
||||||
strcpy(b, "WPM:");
|
strcpy(b, "WPM:");
|
||||||
itoa(wpm,c, 10);
|
itoa(wpm,c, 10);
|
||||||
strcat(b, c);
|
strcat(b, c);
|
||||||
@@ -455,12 +764,12 @@ void menuCWSpeed(int btn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
if (digitalRead(PTT) == LOW){
|
//if (digitalRead(PTT) == LOW){
|
||||||
printLineF2(F("CW Speed set!"));
|
printLineF2(F("CW Speed set!"));
|
||||||
cwSpeed = 1200/wpm;
|
cwSpeed = 1200/wpm;
|
||||||
EEPROM.put(CW_SPEED, cwSpeed);
|
EEPROM.put(CW_SPEED, cwSpeed);
|
||||||
delay_background(2000, 0);
|
delay_background(2000, 0);
|
||||||
}
|
//}
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
@@ -500,7 +809,7 @@ void menuSetupCwDelay(int btn){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF1(F("Press PTT to set"));
|
printLineF1(F("Press, set Delay"));
|
||||||
strcpy(b, "DELAY:");
|
strcpy(b, "DELAY:");
|
||||||
itoa(tmpCWDelay,c, 10);
|
itoa(tmpCWDelay,c, 10);
|
||||||
strcat(b, c);
|
strcat(b, c);
|
||||||
@@ -528,12 +837,12 @@ void menuSetupCwDelay(int btn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
if (digitalRead(PTT) == LOW){
|
//if (digitalRead(PTT) == LOW){
|
||||||
printLineF2(F("CW Delay set!"));
|
printLineF2(F("CW Delay set!"));
|
||||||
cwDelayTime = tmpCWDelay / 10;
|
cwDelayTime = tmpCWDelay / 10;
|
||||||
EEPROM.put(CW_DELAY, cwDelayTime);
|
EEPROM.put(CW_DELAY, cwDelayTime);
|
||||||
delay_background(2000, 0);
|
delay_background(2000, 0);
|
||||||
}
|
//}
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
@@ -549,7 +858,7 @@ void menuSetupTXCWInterval(int btn){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF1(F("Press PTT to set"));
|
printLineF1(F("Press, set Delay"));
|
||||||
strcpy(b, "Start Delay:");
|
strcpy(b, "Start Delay:");
|
||||||
itoa(tmpTXCWInterval,c, 10);
|
itoa(tmpTXCWInterval,c, 10);
|
||||||
strcat(b, c);
|
strcat(b, c);
|
||||||
@@ -577,12 +886,12 @@ void menuSetupTXCWInterval(int btn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
if (digitalRead(PTT) == LOW){
|
//if (digitalRead(PTT) == LOW){
|
||||||
printLineF2(F("CW Start set!"));
|
printLineF2(F("CW Start set!"));
|
||||||
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
||||||
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
||||||
delay_background(2000, 0);
|
delay_background(2000, 0);
|
||||||
}
|
//}
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
@@ -617,6 +926,7 @@ void factoryCalibration(int btn){
|
|||||||
|
|
||||||
calibration = 0;
|
calibration = 0;
|
||||||
|
|
||||||
|
cwMode = 0;
|
||||||
isUSB = true;
|
isUSB = true;
|
||||||
|
|
||||||
//turn off the second local oscillator and the bfo
|
//turn off the second local oscillator and the bfo
|
||||||
@@ -734,7 +1044,6 @@ void menuSetupCalibration(int btn){
|
|||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void printCarrierFreq(unsigned long freq){
|
void printCarrierFreq(unsigned long freq){
|
||||||
|
|
||||||
memset(c, 0, sizeof(c));
|
memset(c, 0, sizeof(c));
|
||||||
@@ -746,7 +1055,7 @@ void printCarrierFreq(unsigned long freq){
|
|||||||
strcat(c, ".");
|
strcat(c, ".");
|
||||||
strncat(c, &b[2], 3);
|
strncat(c, &b[2], 3);
|
||||||
strcat(c, ".");
|
strcat(c, ".");
|
||||||
strncat(c, &b[5], 1);
|
strncat(c, &b[5], 3);
|
||||||
printLine2(c);
|
printLine2(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -798,12 +1107,71 @@ void menuSetupCarrier(int btn){
|
|||||||
else
|
else
|
||||||
usbCarrier = prevCarrier;
|
usbCarrier = prevCarrier;
|
||||||
|
|
||||||
si5351bx_setfreq(0, usbCarrier);
|
//si5351bx_setfreq(0, usbCarrier);
|
||||||
|
if (cwMode == 0)
|
||||||
|
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
else
|
||||||
|
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Append by KD8CEC
|
||||||
|
void menuSetupCWCarrier(int btn){
|
||||||
|
int knob = 0;
|
||||||
|
unsigned long prevCarrier;
|
||||||
|
|
||||||
|
if (!btn){
|
||||||
|
printLineF2(F("Set CW RX BFO"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prevCarrier = cwmCarrier;
|
||||||
|
printLineF1(F("PTT to confirm. "));
|
||||||
|
delay_background(1000, 0);
|
||||||
|
|
||||||
|
si5351bx_setfreq(0, cwmCarrier);
|
||||||
|
printCarrierFreq(cwmCarrier);
|
||||||
|
|
||||||
|
//disable all clock 1 and clock 2
|
||||||
|
while (digitalRead(PTT) == HIGH && !btnDown())
|
||||||
|
{
|
||||||
|
knob = enc_read();
|
||||||
|
|
||||||
|
if (knob > 0)
|
||||||
|
cwmCarrier -= 5;
|
||||||
|
else if (knob < 0)
|
||||||
|
cwmCarrier += 5;
|
||||||
|
else
|
||||||
|
continue; //don't update the frequency or the display
|
||||||
|
|
||||||
|
si5351bx_setfreq(0, cwmCarrier);
|
||||||
|
printCarrierFreq(cwmCarrier);
|
||||||
|
|
||||||
|
Check_Cat(0); //To prevent disconnections
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
//save the setting
|
||||||
|
if (digitalRead(PTT) == LOW){
|
||||||
|
printLineF2(F("Carrier set!"));
|
||||||
|
EEPROM.put(CW_CAL, cwmCarrier);
|
||||||
|
delay_background(1000, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cwmCarrier = prevCarrier;
|
||||||
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
else
|
||||||
|
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
|
||||||
|
setFrequency(frequency);
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
menuOn = 0;
|
||||||
|
}
|
||||||
//Modified by KD8CEC
|
//Modified by KD8CEC
|
||||||
void menuSetupCwTone(int btn){
|
void menuSetupCwTone(int btn){
|
||||||
int knob = 0;
|
int knob = 0;
|
||||||
@@ -907,7 +1275,7 @@ void doMenu(){
|
|||||||
//ADJUST TUNE STEP
|
//ADJUST TUNE STEP
|
||||||
if (btnDownTimeCount > (PRESS_ADJUST_TUNE / 50))
|
if (btnDownTimeCount > (PRESS_ADJUST_TUNE / 50))
|
||||||
{
|
{
|
||||||
printLineF1(F("Press Key to set"));
|
printLineF1(F("Press to set step"));
|
||||||
isNeedDisplay = 1; //check to need display for display current value
|
isNeedDisplay = 1; //check to need display for display current value
|
||||||
|
|
||||||
while (digitalRead(PTT) == HIGH && !btnDown())
|
while (digitalRead(PTT) == HIGH && !btnDown())
|
||||||
@@ -960,9 +1328,9 @@ void doMenu(){
|
|||||||
btnState = btnDown();
|
btnState = btnDown();
|
||||||
|
|
||||||
if (i > 0){
|
if (i > 0){
|
||||||
if (modeCalibrate && select + i < 170)
|
if (modeCalibrate && select + i < 200)
|
||||||
select += i;
|
select += i;
|
||||||
if (!modeCalibrate && select + i < 80)
|
if (!modeCalibrate && select + i < 100)
|
||||||
select += i;
|
select += i;
|
||||||
}
|
}
|
||||||
//if (i < 0 && select - i >= 0)
|
//if (i < 0 && select - i >= 0)
|
||||||
@@ -974,36 +1342,42 @@ void doMenu(){
|
|||||||
else if (select < 10)
|
else if (select < 10)
|
||||||
menuBand(btnState);
|
menuBand(btnState);
|
||||||
else if (select < 20)
|
else if (select < 20)
|
||||||
menuRitToggle(btnState);
|
|
||||||
else if (select < 30)
|
|
||||||
menuVfoToggle(btnState, 1);
|
menuVfoToggle(btnState, 1);
|
||||||
|
else if (select < 30)
|
||||||
|
menuSelectMode(btnState);
|
||||||
else if (select < 40)
|
else if (select < 40)
|
||||||
menuSidebandToggle(btnState);
|
menuRitToggle(btnState);
|
||||||
else if (select < 50)
|
else if (select < 50)
|
||||||
menuCWSpeed(btnState);
|
menuIFSToggle(btnState);
|
||||||
else if (select < 60)
|
else if (select < 60)
|
||||||
menuCWAutoKey(btnState);
|
menuCWSpeed(btnState);
|
||||||
else if (select < 70)
|
else if (select < 70)
|
||||||
|
menuSplitOnOff(btnState); //SplitOn / off
|
||||||
|
else if (select < 80)
|
||||||
|
menuCWAutoKey(btnState);
|
||||||
|
else if (select < 90)
|
||||||
menuSetup(btnState);
|
menuSetup(btnState);
|
||||||
else if (select < 80 && !modeCalibrate)
|
else if (select < 100)
|
||||||
menuExit(btnState);
|
menuExit(btnState);
|
||||||
else if (select < 90 && modeCalibrate)
|
|
||||||
menuSetupCalibration(btnState); //crystal
|
|
||||||
else if (select < 100 && modeCalibrate)
|
|
||||||
menuSetupCarrier(btnState); //lsb
|
|
||||||
else if (select < 110 && modeCalibrate)
|
else if (select < 110 && modeCalibrate)
|
||||||
menuSetupCwTone(btnState);
|
menuSetupCalibration(btnState); //crystal
|
||||||
else if (select < 120 && modeCalibrate)
|
else if (select < 120 && modeCalibrate)
|
||||||
menuSetupCwDelay(btnState);
|
menuSetupCarrier(btnState); //lsb
|
||||||
else if (select < 130 && modeCalibrate)
|
else if (select < 130 && modeCalibrate)
|
||||||
menuSetupTXCWInterval(btnState);
|
menuSetupCWCarrier(btnState); //lsb
|
||||||
else if (select < 140 && modeCalibrate)
|
else if (select < 140 && modeCalibrate)
|
||||||
menuSetupKeyType(btnState);
|
menuSetupCwTone(btnState);
|
||||||
else if (select < 150 && modeCalibrate)
|
else if (select < 150 && modeCalibrate)
|
||||||
menuADCMonitor(btnState);
|
menuSetupCwDelay(btnState);
|
||||||
else if (select < 160 && modeCalibrate)
|
else if (select < 160 && modeCalibrate)
|
||||||
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
menuSetupTXCWInterval(btnState);
|
||||||
else if (select < 170 && modeCalibrate)
|
else if (select < 170 && modeCalibrate)
|
||||||
|
menuSetupKeyType(btnState);
|
||||||
|
else if (select < 180 && modeCalibrate)
|
||||||
|
menuADCMonitor(btnState);
|
||||||
|
else if (select < 190 && modeCalibrate)
|
||||||
|
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
||||||
|
else if (select < 200 && modeCalibrate)
|
||||||
menuExit(btnState);
|
menuExit(btnState);
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
Check_Cat(0); //To prevent disconnections
|
||||||
|
@@ -109,7 +109,11 @@ void initOscillators(){
|
|||||||
//initialize the SI5351
|
//initialize the SI5351
|
||||||
si5351bx_init();
|
si5351bx_init();
|
||||||
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
|
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
|
||||||
si5351bx_setfreq(0, usbCarrier);
|
|
||||||
|
if (cwMode == 0)
|
||||||
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
|
||||||
|
else
|
||||||
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -25,8 +25,8 @@ int btnDown(){
|
|||||||
* The current reading of the meter is assembled in the string called meter
|
* The current reading of the meter is assembled in the string called meter
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//char meter[17];
|
|
||||||
|
|
||||||
|
/*
|
||||||
const PROGMEM uint8_t s_meter_bitmap[] = {
|
const PROGMEM uint8_t s_meter_bitmap[] = {
|
||||||
B00000,B00000,B00000,B00000,B00000,B00100,B00100,B11011,
|
B00000,B00000,B00000,B00000,B00000,B00100,B00100,B11011,
|
||||||
B10000,B10000,B10000,B10000,B10100,B10100,B10100,B11011,
|
B10000,B10000,B10000,B10000,B10100,B10100,B10100,B11011,
|
||||||
@@ -35,7 +35,18 @@ const PROGMEM uint8_t s_meter_bitmap[] = {
|
|||||||
B00010,B00010,B00010,B00010,B00110,B00110,B00110,B11011,
|
B00010,B00010,B00010,B00010,B00110,B00110,B00110,B11011,
|
||||||
B00001,B00001,B00001,B00001,B00101,B00101,B00101,B11011
|
B00001,B00001,B00001,B00001,B00101,B00101,B00101,B11011
|
||||||
};
|
};
|
||||||
PGM_P ps_meter_bitmap = reinterpret_cast<PGM_P>(s_meter_bitmap);
|
*/
|
||||||
|
|
||||||
|
const PROGMEM uint8_t meters_bitmap[] = {
|
||||||
|
B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 , //custom 1
|
||||||
|
B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 , //custom 2
|
||||||
|
B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 , //custom 3
|
||||||
|
B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 , //custom 4
|
||||||
|
B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 , //custom 5
|
||||||
|
B01000, B11100, B01000, B00000, B10111, B10101, B10101, B10111 //custom 6
|
||||||
|
};
|
||||||
|
|
||||||
|
PGM_P p_metes_bitmap = reinterpret_cast<PGM_P>(meters_bitmap);
|
||||||
|
|
||||||
const PROGMEM uint8_t lock_bitmap[8] = {
|
const PROGMEM uint8_t lock_bitmap[8] = {
|
||||||
0b01110,
|
0b01110,
|
||||||
@@ -60,38 +71,56 @@ void initMeter(){
|
|||||||
lcd.createChar(0, tmpbytes);
|
lcd.createChar(0, tmpbytes);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i);
|
||||||
lcd.createChar(1, tmpbytes);
|
lcd.createChar(1, tmpbytes);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 8);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 8);
|
||||||
lcd.createChar(2, tmpbytes);
|
lcd.createChar(2, tmpbytes);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 16);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 16);
|
||||||
lcd.createChar(3, tmpbytes);
|
lcd.createChar(3, tmpbytes);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 24);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 24);
|
||||||
lcd.createChar(4, tmpbytes);
|
lcd.createChar(4, tmpbytes);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 28);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 32);
|
||||||
lcd.createChar(5, tmpbytes);
|
lcd.createChar(5, tmpbytes);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 32);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 40);
|
||||||
lcd.createChar(6, tmpbytes);
|
lcd.createChar(6, tmpbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
//by KD8CEC
|
||||||
* The meter is drawn with special characters.
|
//0 ~ 25 : 30 over : + 10
|
||||||
* character 1 is used to simple draw the blocks of the scale of the meter
|
void drawMeter(int needle) {
|
||||||
* characters 2 to 6 are used to draw the needle in positions 1 to within the block
|
//5Char + O over
|
||||||
* This displays a meter from 0 to 100, -1 displays nothing
|
int drawCharLength = needle / 5;
|
||||||
*/
|
int drawCharLengthLast = needle % 5;
|
||||||
|
int i;
|
||||||
|
|
||||||
/*
|
for (i = 0; i < 5; i++) {
|
||||||
|
if (needle >= 5)
|
||||||
|
lcdMeter[i] = 5; //full
|
||||||
|
else if (needle > 0)
|
||||||
|
lcdMeter[i] = needle; //full
|
||||||
|
else //0
|
||||||
|
lcdMeter[i] = 0x20;
|
||||||
|
|
||||||
|
needle -= 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needle > 0)
|
||||||
|
lcdMeter[5] = 6;
|
||||||
|
else
|
||||||
|
lcdMeter[5] = 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void drawMeter(int8_t needle){
|
void drawMeter(int8_t needle){
|
||||||
int16_t best, i, s;
|
int16_t best, i, s;
|
||||||
|
|
||||||
@@ -101,21 +130,23 @@ void drawMeter(int8_t needle){
|
|||||||
s = (needle * 4)/10;
|
s = (needle * 4)/10;
|
||||||
for (i = 0; i < 8; i++){
|
for (i = 0; i < 8; i++){
|
||||||
if (s >= 5)
|
if (s >= 5)
|
||||||
meter[i] = 1;
|
lcdMeter[i] = 1;
|
||||||
else if (s >= 0)
|
else if (s >= 0)
|
||||||
meter[i] = 2 + s;
|
lcdMeter[i] = 2 + s;
|
||||||
else
|
else
|
||||||
meter[i] = 1;
|
lcdMeter[i] = 1;
|
||||||
s = s - 5;
|
s = s - 5;
|
||||||
}
|
}
|
||||||
if (needle >= 40)
|
if (needle >= 40)
|
||||||
meter[i-1] = 6;
|
lcdMeter[i-1] = 6;
|
||||||
meter[i] = 0;
|
lcdMeter[i] = 0;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// The generic routine to display one line on the LCD
|
// The generic routine to display one line on the LCD
|
||||||
void printLine(unsigned char linenmbr, const char *c) {
|
void printLine(unsigned char linenmbr, const char *c) {
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
||||||
|
|
||||||
if (strcmp(c, printBuff[linenmbr])) { // only refresh the display when there was a change
|
if (strcmp(c, printBuff[linenmbr])) { // only refresh the display when there was a change
|
||||||
lcd.setCursor(0, linenmbr); // place the cursor at the beginning of the selected line
|
lcd.setCursor(0, linenmbr); // place the cursor at the beginning of the selected line
|
||||||
lcd.print(c);
|
lcd.print(c);
|
||||||
@@ -145,6 +176,9 @@ void printLineF(char linenmbr, const __FlashStringHelper *c)
|
|||||||
|
|
||||||
#define LCD_MAX_COLUMN 16
|
#define LCD_MAX_COLUMN 16
|
||||||
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex) {
|
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex) {
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
||||||
|
|
||||||
lcd.setCursor(lcdColumn, linenmbr);
|
lcd.setCursor(lcdColumn, linenmbr);
|
||||||
|
|
||||||
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||||||
@@ -168,6 +202,12 @@ void printLine2(const char *c){
|
|||||||
printLine(0,c);
|
printLine(0,c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clearLine2()
|
||||||
|
{
|
||||||
|
printLine2("");
|
||||||
|
line2DisplayStatus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// short cut to print to the first line
|
// short cut to print to the first line
|
||||||
void printLine1Clear(){
|
void printLine1Clear(){
|
||||||
printLine(1,"");
|
printLine(1,"");
|
||||||
@@ -179,6 +219,7 @@ void printLine2Clear(){
|
|||||||
|
|
||||||
void printLine2ClearAndUpdate(){
|
void printLine2ClearAndUpdate(){
|
||||||
printLine(0, "");
|
printLine(0, "");
|
||||||
|
line2DisplayStatus = 0;
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,11 +262,22 @@ void updateDisplay() {
|
|||||||
if (ritOn)
|
if (ritOn)
|
||||||
strcpy(c, "RIT ");
|
strcpy(c, "RIT ");
|
||||||
else {
|
else {
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
if (isUSB)
|
if (isUSB)
|
||||||
strcpy(c, "USB ");
|
strcpy(c, "USB ");
|
||||||
else
|
else
|
||||||
strcpy(c, "LSB ");
|
strcpy(c, "LSB ");
|
||||||
}
|
}
|
||||||
|
else if (cwMode == 1)
|
||||||
|
{
|
||||||
|
strcpy(c, "CWL ");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(c, "CWU ");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (vfoActive == VFO_A) // VFO A is active
|
if (vfoActive == VFO_A) // VFO A is active
|
||||||
strcat(c, "A:");
|
strcat(c, "A:");
|
||||||
else
|
else
|
||||||
@@ -251,18 +303,22 @@ void updateDisplay() {
|
|||||||
// strcat(c, " TX");
|
// strcat(c, " TX");
|
||||||
printLine(1, c);
|
printLine(1, c);
|
||||||
|
|
||||||
|
byte diplayVFOLine = 1;
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
diplayVFOLine = 0;
|
||||||
|
|
||||||
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
||||||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
|
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
|
||||||
lcd.setCursor(5,1);
|
lcd.setCursor(5,diplayVFOLine);
|
||||||
lcd.write((uint8_t)0);
|
lcd.write((uint8_t)0);
|
||||||
}
|
}
|
||||||
else if (isCWAutoMode == 2){
|
else if (isCWAutoMode == 2){
|
||||||
lcd.setCursor(5,1);
|
lcd.setCursor(5,diplayVFOLine);
|
||||||
lcd.write(0x7E);
|
lcd.write(0x7E);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lcd.setCursor(5,1);
|
lcd.setCursor(5,diplayVFOLine);
|
||||||
lcd.write(":");
|
lcd.write(":");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user