Compare commits

...

47 Commits

Author SHA1 Message Date
phdlee
e915c21412 Merge pull request #18 from phdlee/version0.34
Version0.34
2018-02-03 17:17:43 +09:00
phdlee
60777178a8 TX Check in auto keysend 2018-02-03 17:07:11 +09:00
phdlee
dd68b38454 Optimize codes 2018-02-03 16:35:27 +09:00
phdlee
d229a10092 change tune step size and fixed bug 2018-02-02 20:49:00 +09:00
phdlee
3d019cdd44 change IF Shift Step 1 -> 50Hz 2018-01-31 17:53:20 +09:00
phdlee
55cfeeb924 Update README.md 2018-01-31 12:13:44 +09:00
phdlee
c8879e0e59 Update README.md 2018-01-31 12:12:58 +09:00
phdlee
4f5ac283b7 Merge pull request #17 from phdlee/version0.33
Version0.33
2018-01-31 10:47:20 +09:00
phdlee
4745790dfa fixed Key select bug 2018-01-31 10:44:23 +09:00
phdlee
85832de034 change confirmation key PTT->function key for easy interface 2018-01-30 20:02:49 +09:00
phdlee
4830db78cb change IF Shift setup type 2018-01-30 18:43:08 +09:00
phdlee
5eca64d2a9 vfo changed buf fixed, added BFO feature with Mike 2018-01-30 17:44:15 +09:00
phdlee
3058d52551 Merge pull request #16 from phdlee/version0.32
Version0.32
2018-01-30 12:20:18 +09:00
phdlee
04699ba074 Merge pull request #15 from phdlee/version0.31
Fixed Bug CW Key Range
Append Feature : Display Line Toggle, (Between line1 and line2)
 Append function : for other users / using s.meter, p.meter ... (when idle time execute function)
2018-01-29 18:44:05 +09:00
phdlee
aa61281c38 Merge pull request #14 from phdlee/version0.296
rename version to 0.30
2018-01-27 18:39:22 +09:00
phdlee
261215b1ad Merge pull request #13 from phdlee/version0.296
Version0.296 => Version 0.30
2018-01-27 18:36:07 +09:00
phdlee
1a2f5b4fde Update README.md 2018-01-27 18:33:51 +09:00
phdlee
8203427808 Merge pull request #12 from phdlee/version0.296
Add Comment
2018-01-26 18:25:48 +09:00
phdlee
4e15f2150c Update README.md 2018-01-25 23:39:33 +09:00
phdlee
82a5fd7df9 Merge pull request #11 from phdlee/version0.296
Version0.296
2018-01-25 23:33:04 +09:00
phdlee
386a0b2d46 Update README.md 2018-01-25 22:33:20 +09:00
phdlee
c6401af7d1 Merge pull request #10 from phdlee/version0.29
Version0.29
2018-01-25 22:26:19 +09:00
phdlee
b153a305d6 Merge branch 'master' into version0.29 2018-01-25 22:25:35 +09:00
phdlee
e61e45d3dd Update README.md 2018-01-22 18:26:22 +09:00
phdlee
a1f941f965 Update README.md 2018-01-22 18:25:41 +09:00
phdlee
d1e72b3bd5 Update README.md 2018-01-22 18:24:29 +09:00
phdlee
032e7f919f Update README.md 2018-01-22 18:21:55 +09:00
phdlee
b6bc264332 Update README.md 2018-01-22 18:11:15 +09:00
phdlee
b1cc5eb98a Update README.md 2018-01-22 02:11:35 +09:00
phdlee
2fe1662d67 Merge pull request #8 from qiwenmin/master
Fixed most compilation warnings and a delay issue
2018-01-20 21:24:15 +09:00
phdlee
ebbc5aae5e Merge pull request #9 from phdlee/version0.28
change delaytimes via cat
2018-01-18 11:47:21 +09:00
Qi Wenmin
209cd3a49c Fixed most compilation warnings and a delay issue
* Fixed most compilation warnings (Compiler warning level: All)
* Fixed a delay issue in enc_read function.
2018-01-17 14:42:15 +08:00
phdlee
95e5c1dfe5 Update README.md 2018-01-14 14:53:28 +09:00
phdlee
45a8479061 Update README.md 2018-01-14 14:52:58 +09:00
phdlee
a6ad381c24 Update README.md 2018-01-14 14:52:22 +09:00
phdlee
bcf80f851d Update README.md 2018-01-14 14:51:46 +09:00
phdlee
16304efacd Update README.md 2018-01-14 14:51:23 +09:00
phdlee
968024ab73 Merge pull request #7 from phdlee/beta0.26
Beta0.26
2018-01-14 14:19:53 +09:00
phdlee
3e60728727 Update README.md 2018-01-13 22:27:23 +09:00
phdlee
9781ef086b Update README.md 2018-01-13 10:58:47 +09:00
phdlee
f27f504ea4 Merge pull request #6 from phdlee/beta0.26
Beta0.26
2018-01-12 20:19:09 +09:00
phdlee
2b08a76fbf Update README.md 2018-01-12 10:16:59 +09:00
phdlee
90655e03b8 Update README.md
add status of project
2018-01-12 09:51:58 +09:00
phdlee
8551ff1b68 Update README.md 2018-01-11 17:40:00 +09:00
phdlee
5ce94e8e49 Merge pull request #5 from qiwenmin/master
Fix the delay condition bug when overflow
2018-01-10 13:51:59 +09:00
Qi Wenmin
7ef9c29fa8 Fix the delay condition bug when overflow
The original expression will cause bug when overflow.
2018-01-10 12:00:53 +08:00
phdlee
fda398046e Merge pull request #4 from phdlee/beta0.25
beta 0.25 commit
2018-01-10 11:39:15 +09:00
7 changed files with 674 additions and 465 deletions

View File

@@ -1,19 +1,14 @@
#IMPORTANT INFORMATION #IMPORTANT INFORMATION
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
- Beta 0.26 and Beta 0.261, Beta 0.262, Beta 0.27 is complete test - 0.33 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.
- 0.31 is tested but has not critical bug
- You can download and use it (Release section).
#NOTICE #NOTICE
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
I received uBITX a month ago and found that many features are required, and began coding with the idea of implementing minimal functionality as a general hf transceiver rather than an experimental device. I received uBITX a month ago and found that many features are required, and began coding with the idea of implementing minimal functionality as a general hf transceiver rather than an experimental device.
- fixed bugs...
- Diallock for uBITX's sensitive encoders
- built in softare Memory keyer and cw options control for CW communication
- Implementation of CAT communication protocol for Digital Communication (as FT8, JT65, etc)
- Delay Options for external Linear.
- and more...
Most of the basic functions of the HF transceiver I thought were implemented. Most of the basic functions of the HF transceiver I thought were implemented.
The minimum basic specification for uBITX to operate as a radio, I think it is finished. The minimum basic specification for uBITX to operate as a radio, I think it is finished.
So I will release the 0.27 version and if I do not see the bug anymore, I will try to change the version name to 1.0. So I will release the 0.27 version and if I do not see the bug anymore, I will try to change the version name to 1.0.
@@ -46,6 +41,41 @@ Prepared or finished tasks for the next version
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
## REVISION RECORD ## REVISION RECORD
0.33
- Added CWL, CWU Mode, (dont complete test yet)
- fixed VFO changed bug.
- Added Additional BFO for CWL, CWL
- Added IF Shift
- Change confirmation key PTT -> function key (not critical menus)
- Change CW Key Select type, (toggle -> select by dial)
0.32
- Added function Scroll Frequencty on upper line
- Added Example code for Draw meter and remarked (you can see and use this code in source codes)
- Added Split function, just toggle VFOs when TX/RX
0.31
- Fixed CW ADC Range error
- Display Message on Upper Line (anothor VFO Frequency, Tune Step, Selected Key Type)
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)

View File

@@ -365,6 +365,11 @@ void controlAutoCW(){
//check interval time, if you want adjust interval between chars, modify below //check interval time, if you want adjust interval between chars, modify below
if (isAutoCWHold == 0 && (millis() - autoCWbeforeTime > cwSpeed * 3)) if (isAutoCWHold == 0 && (millis() - autoCWbeforeTime > cwSpeed * 3))
{ {
if (!inTx){ //if not TX Status, change RX -> TX
keyDown = 0;
startTx(TX_CW, 0); //disable updateDisplay Command for reduce latency time
}
sendCWChar(EEPROM.read(CW_AUTO_DATA + autoCWSendCharIndex++)); sendCWChar(EEPROM.read(CW_AUTO_DATA + autoCWSendCharIndex++));
if (autoCWSendCharIndex > autoCWSendCharEndIndex) { //finish auto cw send if (autoCWSendCharIndex > autoCWSendCharEndIndex) { //finish auto cw send

View File

@@ -160,7 +160,8 @@ int count = 0; //to generally count ticks, loops, etc
#define TX_TUNE_TYPE 261 // #define TX_TUNE_TYPE 261 //
#define HAM_BAND_RANGE 262 //FROM (2BYTE) TO (2BYTE) * 10 = 40byte #define HAM_BAND_RANGE 262 //FROM (2BYTE) TO (2BYTE) * 10 = 40byte
#define HAM_BAND_FREQS 302 //40, 1 BAND = 4Byte most bit is mode #define HAM_BAND_FREQS 302 //40, 1 BAND = 4Byte most bit is mode
#define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) #define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) //1STEP :
//for reduce cw key error, eeprom address //for reduce cw key error, eeprom address
#define CW_ADC_MOST_BIT1 348 //most 2bits of DOT_TO , DOT_FROM, ST_TO, ST_FROM #define CW_ADC_MOST_BIT1 348 //most 2bits of DOT_TO , DOT_FROM, ST_TO, ST_FROM
@@ -260,7 +261,7 @@ byte sideToneSub = 0;
//DialLock //DialLock
byte isDialLock = 0; //000000[0]vfoB [0]vfoA 0Bit : A, 1Bit : B byte isDialLock = 0; //000000[0]vfoB [0]vfoA 0Bit : A, 1Bit : B
byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop] byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop]
byte arTuneStep[5]; long 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 displayOption1 = 0;
@@ -315,6 +316,10 @@ boolean modeCalibrate = false;//this mode of menus shows extended menus to calib
unsigned long beforeIdle_ProcessTime = 0; //for check Idle time unsigned long beforeIdle_ProcessTime = 0; //for check Idle time
byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle, 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
@@ -377,7 +382,7 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000; resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000;
setFrequency(resultFreq); setFrequency(resultFreq);
byteWithFreqToMode(loadMode); byteToMode(loadMode, 1);
} }
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) { void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
@@ -482,22 +487,22 @@ void setFrequency(unsigned long f){
if (cwMode == 0) 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 else
{ {
if (cwMode == 1){ //CWL if (cwMode == 1){ //CWL
si5351bx_setfreq(2, SECOND_OSC_LSB + cwmCarrier + f); si5351bx_setfreq(2, SECOND_OSC_LSB + cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
si5351bx_setfreq(1, SECOND_OSC_LSB); si5351bx_setfreq(1, SECOND_OSC_LSB);
} }
else{ //CWU else{ //CWU
si5351bx_setfreq(2, SECOND_OSC_USB - cwmCarrier + f); si5351bx_setfreq(2, SECOND_OSC_USB - cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
si5351bx_setfreq(1, SECOND_OSC_USB); si5351bx_setfreq(1, SECOND_OSC_USB);
} }
} }
@@ -532,12 +537,12 @@ void startTx(byte txMode, byte isDisplayUpdate){
if (vfoActive == VFO_B) { if (vfoActive == VFO_B) {
vfoActive = VFO_A; vfoActive = VFO_A;
frequency = vfoA; frequency = vfoA;
byteToMode(vfoA_mode); byteToMode(vfoA_mode, 0);
} }
else if (vfoActive == VFO_A){ else if (vfoActive == VFO_A){
vfoActive = VFO_B; vfoActive = VFO_B;
frequency = vfoB; frequency = vfoB;
byteToMode(vfoB_mode); byteToMode(vfoB_mode, 0);
} }
setFrequency(frequency); setFrequency(frequency);
@@ -581,9 +586,9 @@ void stopTx(){
digitalWrite(TX_RX, 0); //turn off the tx digitalWrite(TX_RX, 0); //turn off the tx
if (cwMode == 0) if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
else else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off 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);
@@ -592,12 +597,12 @@ void stopTx(){
if (vfoActive == VFO_B){ if (vfoActive == VFO_B){
vfoActive = VFO_A; vfoActive = VFO_A;
frequency = vfoA; frequency = vfoA;
byteToMode(vfoA_mode); byteToMode(vfoA_mode, 0);
} }
else if (vfoActive == VFO_A){ else if (vfoActive == VFO_A){
vfoActive = VFO_B; vfoActive = VFO_B;
frequency = vfoB; frequency = vfoB;
byteToMode(vfoB_mode); byteToMode(vfoB_mode, 0);
} }
setFrequency(frequency); setFrequency(frequency);
} //end of else } //end of else
@@ -750,9 +755,8 @@ void doRIT(){
updateDisplay(); updateDisplay();
} }
} }
/*
/** save Frequency and mode to eeprom for Auto Save with protected eeprom cycle, by kd8cec
save Frequency and mode to eeprom
*/ */
void storeFrequencyAndMode(byte saveType) void storeFrequencyAndMode(byte saveType)
{ {
@@ -784,6 +788,22 @@ void storeFrequencyAndMode(byte saveType)
} }
} }
//calculate step size from 1 byte, compatible uBITX Manager, by KD8CEC
unsigned int byteToSteps(byte srcByte) {
byte powerVal = (byte)(srcByte >> 6);
unsigned int baseVal = srcByte & 0x3F;
if (powerVal == 1)
return baseVal * 10;
else if (powerVal == 2)
return baseVal * 100;
else if (powerVal == 3)
return baseVal * 1000;
else
return baseVal;
}
/** /**
* The settings are read from EEPROM. The first time around, the values may not be * The settings are read from EEPROM. The first time around, the values may not be
* present or out of range, in this case, some intelligent defaults are copied into the * present or out of range, in this case, some intelligent defaults are copied into the
@@ -847,7 +867,7 @@ void initSettings(){
else else
{ {
Iambic_Key = true; Iambic_Key = true;
if (cwKeyType = 1) if (cwKeyType == 1)
keyerControl &= ~IAMBICB; keyerControl &= ~IAMBICB;
else else
keyerControl |= IAMBICB; keyerControl |= IAMBICB;
@@ -904,8 +924,8 @@ void initSettings(){
findedValidValueCount = 0; findedValidValueCount = 0;
EEPROM.get(TUNING_STEP, tuneStepIndex); EEPROM.get(TUNING_STEP, tuneStepIndex);
for (byte i = 0; i < 5; i++) { for (byte i = 0; i < 5; i++) {
arTuneStep[i] = EEPROM.read(TUNING_STEP + i + 1); arTuneStep[i] = byteToSteps(EEPROM.read(TUNING_STEP + i + 1));
if (arTuneStep[i] >= 1 && arTuneStep[i] < 251) //Maximum 250 for check valid Value if (arTuneStep[i] >= 1 && arTuneStep[i] <= 60000) //Maximum 650 for check valid Value
findedValidValueCount++; findedValidValueCount++;
} }
@@ -981,12 +1001,12 @@ void initSettings(){
if (vfoA > 35000000l || 3500000l > vfoA) { if (vfoA > 35000000l || 3500000l > vfoA) {
vfoA = 7150000l; vfoA = 7150000l;
vfoA_mode = 2; vfoA_mode = 2; //LSB
} }
if (vfoB > 35000000l || 3500000l > vfoB) { if (vfoB > 35000000l || 3500000l > vfoB) {
vfoB = 14150000l; vfoB = 14150000l;
vfoB_mode = 3; vfoB_mode = 3; //USB
} }
//end of original code section //end of original code section
@@ -1062,7 +1082,7 @@ void setup()
//Serial.begin(9600); //Serial.begin(9600);
lcd.begin(16, 2); lcd.begin(16, 2);
printLineF(1, F("CECBT v0.33")); printLineF(1, F("CECBT v0.35"));
Init_Cat(38400, SERIAL_8N1); Init_Cat(38400, SERIAL_8N1);
initMeter(); //not used in this build initMeter(); //not used in this build
@@ -1081,7 +1101,7 @@ void setup()
initPorts(); initPorts();
byteToMode(vfoA_mode); byteToMode(vfoA_mode, 0);
initOscillators(); initOscillators();
frequency = vfoA; frequency = vfoA;
@@ -1094,13 +1114,11 @@ void setup()
} }
/**
* The loop checks for keydown, ptt, function button and tuning.
*/
//for debug //for debug
int dbgCnt = 0; int dbgCnt = 0;
byte flasher = 0; byte flasher = 0;
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
void checkAutoSaveFreqMode() void checkAutoSaveFreqMode()
{ {
//when tx or ritOn, disable auto save //when tx or ritOn, disable auto save
@@ -1149,10 +1167,12 @@ 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() - 500) { if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 250) {
idle_process(); idle_process();
beforeIdle_ProcessTime = millis(); beforeIdle_ProcessTime = millis();
} }

View File

@@ -17,30 +17,64 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/ **************************************************************************/
byte line2Buffer[16]; char line2Buffer[16];
//KD8CEC 200Hz ST //KD8CEC 200Hz ST
//L14.150 200Hz ST //L14.150 200Hz ST
//U14.150 +150khz //U14.150 +150khz
int freqScrollPosition = 0; int freqScrollPosition = 0;
//Example Line2 Optinal Display //Example Line2 Optinal Display
void updateLine2Buffer() //immediate execution, not call by scheulder
void updateLine2Buffer(char isDirectCall)
{ {
unsigned long tmpFreq = 0; unsigned long tmpFreq = 0;
if (isDirectCall == 0)
if (ritOn)
{ {
line2Buffer[0] = 'R'; if (ritOn)
line2Buffer[1] = 'i'; {
line2Buffer[2] = 't'; line2Buffer[0] = 'R';
line2Buffer[3] = 'T'; line2Buffer[1] = 'i';
line2Buffer[4] = 'X'; line2Buffer[2] = 't';
line2Buffer[5] = ':'; 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;
} //end of ritOn display
//======================================================
//other VFO display
//======================================================
if (vfoActive == VFO_B)
{
tmpFreq = vfoA;
//line2Buffer[0] = 'A';
}
else
{
tmpFreq = vfoB;
//line2Buffer[0] = 'B';
}
// EXAMPLE 1 & 2
//U14.150.100
//display frequency //display frequency
tmpFreq = ritTxFrequency; for (int i = 9; i >= 0; i--) {
for (int i = 15; i >= 6; i--) {
if (tmpFreq > 0) { if (tmpFreq > 0) {
if (i == 12 || i == 8) line2Buffer[i] = '.'; if (i == 2 || i == 6) line2Buffer[i] = '.';
else { else {
line2Buffer[i] = tmpFreq % 10 + 0x30; line2Buffer[i] = tmpFreq % 10 + 0x30;
tmpFreq /= 10; tmpFreq /= 10;
@@ -49,116 +83,174 @@ void updateLine2Buffer()
else else
line2Buffer[i] = ' '; line2Buffer[i] = ' ';
} }
return;
}
if (vfoActive == VFO_B) //EXAMPLE #1
{ if ((displayOption1 & 0x04) == 0x00) //none scroll display
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'; line2Buffer[6] = 'k';
if (freqScrollPosition > 25) else
freqScrollPosition = -1; {
//example #2
if (freqScrollPosition++ > 18) //none scroll display time
{
line2Buffer[6] = 'k';
if (freqScrollPosition > 25)
freqScrollPosition = -1;
}
else //scroll frequency
{
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] = ' ';
}
}
} //scroll
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 else
{ {
line2Buffer[10] = 'H'; line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
line2Buffer[11] = 'z'; line2Buffer[11] = 0;
line2Buffer[12] = ' ';
if (freqScrollPosition < 7)
{ //11, 12, 13, 14, 15
for (int i = 11; i >= 0; i--) memset(b, 0, sizeof(b));
if (i - (7 - freqScrollPosition) >= 0) ltoa(ifShiftValue, b, DEC);
line2Buffer[i] = line2Buffer[i - (7 - freqScrollPosition)]; strncat(line2Buffer, b, 5);
else }
line2Buffer[i] = ' ';
if (isDirectCall == 1) //if call by encoder (not scheduler), immediate print value
printLine2(line2Buffer);
} // end of display IF
else // step display
{
if (isDirectCall != 0)
return;
memset(&line2Buffer[8], ' ', 8);
//Step
long tmpStep = arTuneStep[tuneStepIndex -1];
byte isStepKhz = 0;
if (tmpStep >= 1000)
{
isStepKhz = 2;
}
for (int i = 10; i >= 8 - isStepKhz; i--) {
if (tmpStep > 0) {
line2Buffer[i + isStepKhz] = tmpStep % 10 + 0x30;
tmpStep /= 10;
} }
else else
{ line2Buffer[i +isStepKhz] = ' ';
for (int i = 0; i < 11; i++)
if (i + (freqScrollPosition - 7) <= 11)
line2Buffer[i] = line2Buffer[i + (freqScrollPosition - 7)];
else
line2Buffer[i] = ' ';
}
} }
} //if (isStepKhz == 1)
line2Buffer[7] = ' '; // line2Buffer[10] = 'k';
//Step if (isStepKhz == 0)
byte tmpStep = arTuneStep[tuneStepIndex -1]; {
for (int i = 10; i >= 8; i--) { line2Buffer[11] = 'H';
if (tmpStep > 0) { line2Buffer[12] = 'z';
line2Buffer[i] = tmpStep % 10 + 0x30; }
tmpStep /= 10;
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 else
line2Buffer[i] = ' '; {
} line2Buffer[14] = 'I';
line2Buffer[11] = 'H'; line2Buffer[15] = 'B';
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() void idle_process()
{ {
//space for user graphic display //space for user graphic display
if (menuOn == 0) if (menuOn == 0)
{ {
if ((displayOption1 & 0x10) == 0x10) //always empty topline
return;
//if line2DisplayStatus == 0 <-- this condition is clear Line, you can display any message //if line2DisplayStatus == 0 <-- this condition is clear Line, you can display any message
if (line2DisplayStatus == 0 || (((displayOption1 & 0x04) == 0x04) && line2DisplayStatus == 2)) { if (line2DisplayStatus == 0 || (((displayOption1 & 0x04) == 0x04) && line2DisplayStatus == 2)) {
updateLine2Buffer(); if (checkCount++ > 1)
printLine2(line2Buffer); {
line2DisplayStatus = 2; updateLine2Buffer(0); //call by scheduler
printLine2(line2Buffer);
line2DisplayStatus = 2;
checkCount = 0;
}
//EX for Meters
/*
DisplayMeter(0, testValue++, 7);
if (testValue > 30)
testValue = 0;
*/
} }
} }
} }

View File

@@ -13,6 +13,36 @@
#define printLineF1(x) (printLineF(1, x)) #define printLineF1(x) (printLineF(1, x))
#define printLineF2(x) (printLineF(0, x)) #define printLineF2(x) (printLineF(0, x))
void FrequencyToVFO(byte isSaveFreq)
{
//Save Frequency & Mode Information
if (vfoActive == VFO_A)
{
vfoA = frequency;
vfoA_mode = modeToByte();
if (isSaveFreq)
storeFrequencyAndMode(1);
}
else
{
vfoB = frequency;
vfoB_mode = modeToByte();
if (isSaveFreq)
storeFrequencyAndMode(2);
}
}
void menuClearExit(int delayTime)
{
if (delayTime > 0)
delay_background(delayTime, 0);
printLine2ClearAndUpdate();
menuOn = 0;
}
//Ham band move by KD8CEC //Ham band move by KD8CEC
void menuBand(int btn){ void menuBand(int btn){
int knob = 0; int knob = 0;
@@ -27,8 +57,7 @@ void menuBand(int btn){
printLineF2(F("Press to confirm")); printLineF2(F("Press to confirm"));
//wait for the button menu select button to be lifted) //wait for the button menu select button to be lifted)
while (btnDown()) { while (btnDown()) {
delay(50); delay_background(50, 0);
Check_Cat(0); //To prevent disconnections
if (btnPressCount++ > 20) { if (btnPressCount++ > 20) {
btnPressCount = 0; btnPressCount = 0;
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2 if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
@@ -57,23 +86,13 @@ void menuBand(int btn){
} }
} }
delay(50); //delay(50);
ritDisable(); ritDisable();
while(!btnDown()){ while(!btnDown()){
knob = enc_read(); knob = enc_read();
if (knob != 0){ if (knob != 0){
/*
if (band > 3 && knob < 0)
band--;
if (band < 30 && knob > 0)
band++;
if (band > 10)
isUSB = true;
else
isUSB = false;
setFrequency(((unsigned long)band * 1000000l) + offset); */
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
if (knob < 0) { if (knob < 0) {
if (stepChangeCount-- < -3) { if (stepChangeCount-- < -3) {
@@ -87,7 +106,7 @@ void menuBand(int btn){
stepChangeCount = 0; stepChangeCount = 0;
} }
} }
} } //end of only ham band move
else { //original source else { //original source
if (knob < 0 && frequency > 3000000l) if (knob < 0 && frequency > 3000000l)
setFrequency(frequency - 200000l); setFrequency(frequency - 200000l);
@@ -103,19 +122,21 @@ void menuBand(int btn){
updateDisplay(); updateDisplay();
} }
delay(20); delay_background(20, 0);
Check_Cat(0); //To prevent disconnections
} }
/*
while(btnDown()) { while(btnDown()) {
delay(50); delay(50);
Check_Cat(0); //To prevent disconnections Check_Cat(0); //To prevent disconnections
} }
*/
delay(50); FrequencyToVFO(1);
printLine2ClearAndUpdate(); //printLine2ClearAndUpdate();
menuOn = 0; //delay_background(500, 0);
//menuOn = 0;
menuClearExit(500);
} }
//Convert Mode, Number by KD8CEC //Convert Mode, Number by KD8CEC
@@ -139,7 +160,9 @@ byte modeToByte(){
} }
//Convert Number to Mode by KD8CEC //Convert Number to Mode by KD8CEC
void byteToMode(byte modeValue){ //autoSetModebyFreq : 0
//autoSetModebyFreq : 1, if (modValue is not set, set mode by frequency)
void byteToMode(byte modeValue, byte autoSetModebyFreq){
if (modeValue == 4) if (modeValue == 4)
cwMode = 1; cwMode = 1;
else if (modeValue == 5) else if (modeValue == 5)
@@ -149,11 +172,14 @@ void byteToMode(byte modeValue){
cwMode = 0; cwMode = 0;
if (modeValue == 3) if (modeValue == 3)
isUSB = 1; isUSB = 1;
else if (autoSetModebyFreq == 1 && (modeValue == 0))
isUSB = (frequency > 10000000l) ? true : false;
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) if (modeValue == 4)
@@ -170,99 +196,71 @@ void byteWithFreqToMode(byte modeValue){
isUSB = 0; isUSB = 0;
} }
} }
//VFO Toggle and save VFO Information, modified by KD8CEC
void menuVfoToggle(int btn, char isUseDelayTime)
{
if (!btn){
if (vfoActive == VFO_A)
printLineF2(F("Select VFO B?"));
else
printLineF2(F("Select VFO A?"));
}
else {
if (vfoActive == VFO_B){
vfoB = frequency;
vfoB_mode = modeToByte();
storeFrequencyAndMode(2); //vfoB -> eeprom
vfoActive = VFO_A;
frequency = vfoA;
saveCheckFreq = frequency;
byteToMode(vfoA_mode);
printLineF2(F("Selected VFO A"));
}
else {
vfoA = frequency;
vfoA_mode = modeToByte();
storeFrequencyAndMode(1); //vfoA -> eeprom
vfoActive = VFO_B;
frequency = vfoB;
saveCheckFreq = frequency;
byteToMode(vfoB_mode);
printLineF2(F("Selected VFO B"));
}
ritDisable();
if (isUseDelayTime == 1) //Found Issue in wsjt-x Linux 32bit
delay_background(500, 0);
printLine2ClearAndUpdate();
//exit the menu
menuOn = 0;
}
}
void menuRitToggle(int btn){
if (!btn){
if (ritOn == 1)
printLineF2(F("RIT:On, Off?"));
else
printLineF2(F("RIT:Off, On?"));
}
else {
if (ritOn == 0){
printLineF2(F("RIT is ON"));
//enable RIT so the current frequency is used at transmit
ritEnable(frequency);
}
else{
printLineF2(F("RIT is OFF"));
ritDisable();
}
menuOn = 0;
delay_background(500, 0);
printLine2ClearAndUpdate();
}
}
/*
void menuSidebandToggle(int btn){
if (!btn){
if (isUSB == true)
printLineF2(F("Select LSB?"));
else
printLineF2(F("Select USB?"));
}
else {
cwMode = 0;
if (isUSB == true){
isUSB = false;
printLineF2(F("LSB Selected"));
}
else {
isUSB = true;
printLineF2(F("USB Selected"));
}
setFrequency(frequency);
delay_background(500, 0);
printLine2ClearAndUpdate();
menuOn = 0;
}
}
*/ */
void menuIFSSetup(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() ){
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 -= 50l;
else if (knob > 0)
ifShiftValue += 50;
needApplyChangeValue = 1;
}
}
delay_background(500, 0); //for check Long Press function key
if (btnDown() || ifShiftValue == 0)
{
isIFShift = 0;
printLineF2(F("IF Shift is OFF"));
setFrequency(frequency);
delay_background(500, 0);
}
//menuOn = 0;
//printLine2ClearAndUpdate();
menuClearExit(0);
}
}
void menuSelectMode(int btn){ void menuSelectMode(int btn){
int knob = 0; int knob = 0;
int selectModeType = 0; int selectModeType = 0;
@@ -286,9 +284,10 @@ void menuSelectMode(int btn){
selectModeType = 3; selectModeType = 3;
beforeMode = selectModeType; beforeMode = selectModeType;
while(!btnDown() && digitalRead(PTT) == HIGH){ while(!btnDown() && digitalRead(PTT) == HIGH){
//Display Mode Name //Display Mode Name
printLineF1(F("LSB USB CWL CWU"));
if (selectModeType == 0) if (selectModeType == 0)
printLineF1(F("LSB")); printLineF1(F("LSB"));
else if (selectModeType == 1) else if (selectModeType == 1)
@@ -321,8 +320,7 @@ void menuSelectMode(int btn){
} }
if (beforeMode != selectModeType) { if (beforeMode != selectModeType) {
printLineF1(F("Changed Mode")); //printLineF1(F("Changed Mode"));
if (selectModeType == 0) { if (selectModeType == 0) {
cwMode = 0; isUSB = 0; cwMode = 0; isUSB = 0;
} }
@@ -336,111 +334,37 @@ void menuSelectMode(int btn){
cwMode = 2; cwMode = 2;
} }
//Save Frequency & Mode Information FrequencyToVFO(1);
if (vfoActive == VFO_A)
{
vfoA = frequency;
vfoA_mode = modeToByte();
storeFrequencyAndMode(1);
}
else
{
vfoB = frequency;
vfoB_mode = modeToByte();
storeFrequencyAndMode(2);
}
} }
if (cwMode == 0) if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
else else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
setFrequency(frequency); setFrequency(frequency);
delay_background(500, 0);
printLine2ClearAndUpdate(); //delay_background(500, 0);
menuOn = 0; //printLine2ClearAndUpdate();
//menuOn = 0;
menuClearExit(500);
} }
} }
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
void menuSetupKeyType(int btn){
if (!btn && digitalRead(PTT) == HIGH){
if (Iambic_Key)
printLineF2(F("Key: Straight?"));
else
printLineF2(F("Key: Fn=A, PTT=B"));
}
else {
if (Iambic_Key)
{
printLineF2(F("Straight Key!"));
Iambic_Key = false;
}
else
{
Iambic_Key = true;
if (btn)
{
keyerControl &= ~IAMBICB;
printLineF2(F("IAMBICA Key!"));
}
else
{
keyerControl |= IAMBICB;
printLineF2(F("IAMBICB Key!"));
}
}
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){
int knob = 0; int knob = 0;
int selectedKeyType = 0; int selectedKeyType = 0;
int moveStep = 0; int moveStep = 0;
if (!btn && digitalRead(PTT) == HIGH){ if (!btn){
printLineF2(F("Change Key Type?")); printLineF2(F("Change Key Type?"));
} }
else { else {
printLineF2(F("Press PTT to set")); printLineF2(F("Press to set Key"));
delay_background(500, 0); delay_background(500, 0);
selectedKeyType = cwKeyType; selectedKeyType = cwKeyType;
while(!btnDown() && digitalRead(PTT) == HIGH){
while(!btnDown()){
//Display Key Type //Display Key Type
if (selectedKeyType == 0) if (selectedKeyType == 0)
@@ -470,27 +394,25 @@ void menuSetupKeyType(int btn){
Check_Cat(0); //To prevent disconnections Check_Cat(0); //To prevent disconnections
} }
//save the setting printLineF2(F("CW Key Type set!"));
if (digitalRead(PTT) == LOW){ cwKeyType = selectedKeyType;
printLineF2(F("CW Key Type set!")); EEPROM.put(CW_KEY_TYPE, cwKeyType);
cwKeyType = selectedKeyType;
EEPROM.put(CW_KEY_TYPE, cwKeyType);
if (cwKeyType == 0) if (cwKeyType == 0)
Iambic_Key = false; Iambic_Key = false;
else
{
Iambic_Key = true;
if (cwKeyType == 1)
keyerControl &= ~IAMBICB;
else else
{ keyerControl |= IAMBICB;
Iambic_Key = true;
if (cwKeyType = 1)
keyerControl &= ~IAMBICB;
else
keyerControl |= IAMBICB;
}
delay_background(2000, 0);
} }
printLine2ClearAndUpdate(); //delay_background(2000, 0);
menuOn = 0; //printLine2ClearAndUpdate();
//menuOn = 0;
menuClearExit(1000);
} }
} }
@@ -570,10 +492,109 @@ void menuADCMonitor(int btn){
delay_background(200, 0); delay_background(200, 0);
} //end of while } //end of while
printLine2ClearAndUpdate(); //printLine2ClearAndUpdate();
menuOn = 0; //menuOn = 0;
menuClearExit(0);
} }
//VFO Toggle and save VFO Information, modified by KD8CEC
void menuVfoToggle(int btn, char isUseDelayTime)
{
if (!btn){
if (vfoActive == VFO_A)
printLineF2(F("Select VFO B?"));
else
printLineF2(F("Select VFO A?"));
}
else {
FrequencyToVFO(1);
if (vfoActive == VFO_B){
//vfoB = frequency;
//vfoB_mode = modeToByte();
//storeFrequencyAndMode(2); //vfoB -> eeprom
vfoActive = VFO_A;
frequency = vfoA;
saveCheckFreq = frequency;
byteToMode(vfoA_mode, 0);
//printLineF2(F("Selected VFO A"));
}
else {
//vfoA = frequency;
//vfoA_mode = modeToByte();
//storeFrequencyAndMode(1); //vfoA -> eeprom
vfoActive = VFO_B;
frequency = vfoB;
saveCheckFreq = frequency;
byteToMode(vfoB_mode, 0);
//printLineF2(F("Selected VFO B"));
}
ritDisable();
setFrequency(frequency);
//if (isUseDelayTime == 1) //Found Issue in wsjt-x Linux 32bit
// delay_background(500, 0);
//printLine2ClearAndUpdate();
//menuOn = 0;
menuClearExit(0);
}
}
void menuRitToggle(int btn){
if (!btn){
if (ritOn == 1)
printLineF2(F("RIT:On, Off?"));
else
printLineF2(F("RIT:Off, On?"));
}
else {
if (ritOn == 0){
printLineF2(F("RIT is ON"));
//enable RIT so the current frequency is used at transmit
ritEnable(frequency);
}
else{
printLineF2(F("RIT is OFF"));
ritDisable();
}
//delay_background(500, 0);
//printLine2ClearAndUpdate();
//menuOn = 0;
menuClearExit(500);
}
}
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;
menuClearExit(500);
}
}
//Function to disbled transmission //Function to disbled transmission
//by KD8CEC //by KD8CEC
void menuTxOnOff(int btn, byte optionType){ void menuTxOnOff(int btn, byte optionType){
@@ -592,9 +613,11 @@ void menuTxOnOff(int btn, byte optionType){
isTxType &= ~(optionType); isTxType &= ~(optionType);
printLineF2(F("TX ON!")); printLineF2(F("TX ON!"));
} }
delay_background(500, 0);
printLine2ClearAndUpdate(); //delay_background(500, 0);
menuOn = 0; //printLine2ClearAndUpdate();
//menuOn = 0;
menuClearExit(500);
} }
} }
@@ -617,21 +640,19 @@ void menuSetup(int btn){
modeCalibrate = false; modeCalibrate = false;
printLineF2(F("Setup:Off")); printLineF2(F("Setup:Off"));
} }
delay_background(2000, 0); //delay_background(2000, 0);
printLine2Clear(); //printLine2Clear();
menuOn = 0; //menuOn = 0;
menuClearExit(1000);
} }
} }
void menuExit(int btn){ void menuExit(int btn){
if (!btn){ if (!btn){
printLineF2(F("Exit Menu?")); printLineF2(F("Exit Menu?"));
} }
else{ else
printLine2ClearAndUpdate(); menuClearExit(0);
menuOn = 0;
}
} }
void menuCWSpeed(int btn){ void menuCWSpeed(int btn){
@@ -649,7 +670,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);
@@ -679,14 +700,15 @@ 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;
menuClearExit(1000);
} }
//Builtin CW Keyer Logic by KD8CEC //Builtin CW Keyer Logic by KD8CEC
@@ -724,7 +746,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);
@@ -752,14 +774,15 @@ 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;
menuClearExit(1000);
} }
//CW Time delay by KD8CEC //CW Time delay by KD8CEC
@@ -773,7 +796,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);
@@ -801,14 +824,15 @@ 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;
menuClearExit(1000);
} }
@@ -891,7 +915,8 @@ void factoryCalibration(int btn){
while(btnDown()) while(btnDown())
delay(50); delay(50);
delay(100);
menuClearExit(100);
} }
void menuSetupCalibration(int btn){ void menuSetupCalibration(int btn){
@@ -955,8 +980,9 @@ void menuSetupCalibration(int btn){
initOscillators(); initOscillators();
//si5351_set_calibration(calibration); //si5351_set_calibration(calibration);
setFrequency(frequency); setFrequency(frequency);
printLine2ClearAndUpdate(); //printLine2ClearAndUpdate();
menuOn = 0; //menuOn = 0;
menuClearExit(0);
} }
void printCarrierFreq(unsigned long freq){ void printCarrierFreq(unsigned long freq){
@@ -1029,8 +1055,9 @@ void menuSetupCarrier(int btn){
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off 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;
menuClearExit(0);
} }
//Append by KD8CEC //Append by KD8CEC
@@ -1065,8 +1092,9 @@ void menuSetupCWCarrier(int btn){
si5351bx_setfreq(0, cwmCarrier); si5351bx_setfreq(0, cwmCarrier);
printCarrierFreq(cwmCarrier); printCarrierFreq(cwmCarrier);
Check_Cat(0); //To prevent disconnections //Check_Cat(0); //To prevent disconnections
delay(100); //delay(100);
delay_background(100, 0);
} }
//save the setting //save the setting
@@ -1083,10 +1111,12 @@ void menuSetupCWCarrier(int btn){
else else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off 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;
menuClearExit(0);
} }
//Modified by KD8CEC //Modified by KD8CEC
void menuSetupCwTone(int btn){ void menuSetupCwTone(int btn){
int knob = 0; int knob = 0;
@@ -1119,21 +1149,23 @@ void menuSetupCwTone(int btn){
itoa(sideTone, b, 10); itoa(sideTone, b, 10);
printLine2(b); printLine2(b);
delay(100); //delay(100);
Check_Cat(0); //To prevent disconnections //Check_Cat(0); //To prevent disconnections
delay_background(100, 0);
} }
noTone(CW_TONE); noTone(CW_TONE);
//save the setting //save the setting
if (digitalRead(PTT) == LOW){ if (digitalRead(PTT) == LOW){
printLineF2(F("Sidetone set!")); printLineF2(F("Sidetone set!"));
EEPROM.put(CW_SIDETONE, usbCarrier); EEPROM.put(CW_SIDETONE, sideTone);
delay_background(2000, 0); delay_background(2000, 0);
} }
else else
sideTone = prev_sideTone; sideTone = prev_sideTone;
printLine2ClearAndUpdate(); //printLine2ClearAndUpdate();
menuOn = 0; //menuOn = 0;
menuClearExit(0);
} }
//Lock Dial move by KD8CEC //Lock Dial move by KD8CEC
@@ -1171,8 +1203,9 @@ void doMenu(){
//Appened Lines by KD8CEC for Adjust Tune step and Set Dial lock //Appened Lines by KD8CEC for Adjust Tune step and Set Dial lock
while(btnDown()){ while(btnDown()){
delay(50); //delay(50);
Check_Cat(0); //To prevent disconnections //Check_Cat(0); //To prevent disconnections
delay_background(50, 0);
if (btnDownTimeCount++ == (PRESS_ADJUST_TUNE / 50)) { //Set Tune Step if (btnDownTimeCount++ == (PRESS_ADJUST_TUNE / 50)) { //Set Tune Step
printLineF2(F("Set Tune Step?")); printLineF2(F("Set Tune Step?"));
@@ -1190,13 +1223,14 @@ 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())
{ {
Check_Cat(0); //To prevent disconnections //Check_Cat(0); //To prevent disconnections
delay(50); //debounce //delay(50); //debounce
delay_background(50, 0);
if (isNeedDisplay) { if (isNeedDisplay) {
strcpy(b, "Tune Step:"); strcpy(b, "Tune Step:");
@@ -1243,9 +1277,9 @@ void doMenu(){
btnState = btnDown(); btnState = btnDown();
if (i > 0){ if (i > 0){
if (modeCalibrate && select + i < 190) 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)
@@ -1257,40 +1291,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 < 40) else if (select < 30)
menuSelectMode(btnState); menuSelectMode(btnState);
else if (select < 40)
menuRitToggle(btnState);
else if (select < 50) else if (select < 50)
menuCWSpeed(btnState); menuIFSSetup(btnState);
else if (select < 60) else if (select < 60)
menuCWAutoKey(btnState); menuCWSpeed(btnState);
else if (select < 70) else if (select < 70)
menuSetup(btnState);
else if (select < 80 && !modeCalibrate)
menuExit(btnState);
else if (select < 90 && modeCalibrate)
menuSetupCalibration(btnState); //crystal
else if (select < 100 && modeCalibrate)
menuSetupCarrier(btnState); //lsb
else if (select < 110 && modeCalibrate)
menuSetupCWCarrier(btnState); //lsb
else if (select < 120 && modeCalibrate)
menuSetupCwTone(btnState);
else if (select < 130 && modeCalibrate)
menuSetupCwDelay(btnState);
else if (select < 140 && modeCalibrate)
menuSetupTXCWInterval(btnState);
else if (select < 150 && modeCalibrate)
menuSetupKeyType(btnState);
else if (select < 160 && modeCalibrate)
menuADCMonitor(btnState);
else if (select < 170 && modeCalibrate)
menuSplitOnOff(btnState); //SplitOn / off menuSplitOnOff(btnState); //SplitOn / off
else if (select < 80)
menuCWAutoKey(btnState);
else if (select < 90)
menuSetup(btnState);
else if (select < 100)
menuExit(btnState);
else if (select < 110 && modeCalibrate)
menuSetupCalibration(btnState); //crystal
else if (select < 120 && modeCalibrate)
menuSetupCarrier(btnState); //lsb
else if (select < 130 && modeCalibrate)
menuSetupCWCarrier(btnState); //lsb
else if (select < 140 && modeCalibrate)
menuSetupCwTone(btnState);
else if (select < 150 && modeCalibrate)
menuSetupCwDelay(btnState);
else if (select < 160 && modeCalibrate)
menuSetupTXCWInterval(btnState);
else if (select < 170 && modeCalibrate)
menuSetupKeyType(btnState);
else if (select < 180 && modeCalibrate) else if (select < 180 && modeCalibrate)
menuTxOnOff(btnState, 0x01); //TX OFF / ON menuADCMonitor(btnState);
else if (select < 190 && modeCalibrate) 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
@@ -1298,9 +1334,8 @@ void doMenu(){
//debounce the button //debounce the button
while(btnDown()){ while(btnDown()){
delay(50); delay_background(50, 0); //To prevent disconnections
Check_Cat(0); //To prevent disconnections
} }
delay(50); //delay(50);
} }

View File

@@ -111,9 +111,9 @@ void initOscillators(){
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
if (cwMode == 0) if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
else else
si5351bx_setfreq(0, cwmCarrier); si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0));
} }

View File

@@ -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,19 +130,18 @@ 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) if ((displayOption1 & 0x01) == 0x01)
@@ -207,7 +235,6 @@ char byteToChar(byte srcByte){
void updateDisplay() { void updateDisplay() {
// tks Jack Purdum W8TEE // tks Jack Purdum W8TEE
// replaced fsprint commmands by str commands for code size reduction // replaced fsprint commmands by str commands for code size reduction
// replace code for Frequency numbering error (alignment, point...) by KD8CEC // replace code for Frequency numbering error (alignment, point...) by KD8CEC
int i; int i;
unsigned long tmpFreq = frequency; // unsigned long tmpFreq = frequency; //