diff --git a/ubitx_20/cw_autokey.ino b/ubitx_20/cw_autokey.ino index 7f20461..01c2564 100644 --- a/ubitx_20/cw_autokey.ino +++ b/ubitx_20/cw_autokey.ino @@ -1,5 +1,5 @@ /************************************************************************* - KD8CEC'S Memory Keyer for HAM + KD8CEC's Memory Keyer for HAM This source code is written for All amateur radio operator, I have not had amateur radio communication for a long time. CW has been diff --git a/ubitx_20/ubitx_20.ino b/ubitx_20/ubitx_20.ino index f5d986e..03e617e 100644 --- a/ubitx_20/ubitx_20.ino +++ b/ubitx_20/ubitx_20.ino @@ -158,7 +158,20 @@ int count = 0; //to generally count ticks, loops, etc #define TX_TUNE_TYPE 261 // #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 TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) +#define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) + +//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_ST_FROM 349 //CW ADC Range STRAIGHT KEY from (Lower 8 bit) +#define CW_ADC_ST_TO 350 //CW ADC Range STRAIGHT KEY to (Lower 8 bit) +#define CW_ADC_DOT_FROM 351 //CW ADC Range DOT from (Lower 8 bit) +#define CW_ADC_DOT_TO 352 //CW ADC Range DOT to (Lower 8 bit) + +#define CW_ADC_MOST_BIT2 353 //most 2bits of BOTH_TO, BOTH_FROM, DASH_TO, DASH_FROM +#define CW_ADC_DASH_FROM 354 //CW ADC Range DASH from (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_TO 357 //CW ADC Range BOTH to (Lower 8 bit) //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. @@ -245,6 +258,16 @@ byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop] byte arTuneStep[5]; byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user +//CW ADC Range +int cwAdcSTFrom = 0; +int cwAdcSTTo = 0; +int cwAdcDotFrom = 0; +int cwAdcDotTo = 0; +int cwAdcDashFrom = 0; +int cwAdcDashTo = 0; +int cwAdcBothFrom = 0; +int cwAdcBothTo = 0; + //Variables for auto cw mode byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending byte cwAutoTextCount = 0; //cwAutoText Count @@ -574,8 +597,13 @@ applied Threshold for reduct errors, dial Lock, dynamic Step byte threshold = 2; //noe action for count unsigned long lastEncInputtime = 0; int encodedSumValue = 0; +unsigned long lastTunetime = 0; //if continous moving, skip threshold processing +byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw + +#define skipThresholdTime 100 #define encodeTimeOut 1000 -void doTuning(){ + +void doTuningWithThresHold(){ int s = 0; unsigned long prev_freq; long incdecValue = 0; @@ -592,6 +620,8 @@ void doTuning(){ if (s == 0) { if (encodedSumValue != 0 && (millis() - encodeTimeOut) > lastEncInputtime) encodedSumValue = 0; + + lastMovedirection = 0; return; } lastEncInputtime = millis(); @@ -599,23 +629,25 @@ void doTuning(){ //for check moving direction encodedSumValue += (s > 0 ? 1 : -1); - //check threshold - if ((encodedSumValue * encodedSumValue) <= (threshold * threshold)) + //check threshold and operator actions (hold dial speed = continous moving, skip threshold check) + if ((lastTunetime < millis() - skipThresholdTime) && ((encodedSumValue * encodedSumValue) <= (threshold * threshold))) return; + lastTunetime = millis(); + //Valid Action without noise encodedSumValue = 0; prev_freq = frequency; //incdecValue = tuningStep * s; - frequency += (arTuneStep[tuneStepIndex -1] * s); + frequency += (arTuneStep[tuneStepIndex -1] * s * (s * s < 10 ? 1 : 3)); //appield weight (s is speed) if (prev_freq < 10000000l && frequency > 10000000l) isUSB = true; if (prev_freq > 10000000l && frequency < 10000000l) isUSB = false; - + setFrequency(frequency); updateDisplay(); } @@ -686,7 +718,10 @@ void initSettings(){ EEPROM.get(VFO_B, vfoB); EEPROM.get(CW_SIDETONE, sideTone); EEPROM.get(CW_SPEED, cwSpeed); - + //End of original code + + //---------------------------------------------------------------- + //Add Lines by KD8CEC //for custom source Section ============================= //ID & Version Check from EEProm //if found different firmware, erase eeprom (32 @@ -787,8 +822,47 @@ void initSettings(){ if (tuneStepIndex == 0) //New User tuneStepIndex = 3; - + //CW Key ADC Range ======= adjust set value for reduce cw keying error + //by KD8CEC + unsigned int tmpMostBits = 0; + tmpMostBits = EEPROM.read(CW_ADC_MOST_BIT1); + cwAdcSTFrom = EEPROM.read(CW_ADC_ST_FROM) | ((tmpMostBits & 0x03) << 8); + cwAdcSTTo = EEPROM.read(CW_ADC_ST_TO) | ((tmpMostBits & 0x0C) << 6); + cwAdcDotFrom = EEPROM.read(CW_ADC_DOT_FROM) | ((tmpMostBits & 0x30) << 4); + cwAdcDotTo = EEPROM.read(CW_ADC_DOT_TO) | ((tmpMostBits & 0xC0) << 2); + + tmpMostBits = EEPROM.read(CW_ADC_MOST_BIT2); + cwAdcDashFrom = EEPROM.read(CW_ADC_DASH_FROM) | ((tmpMostBits & 0x03) << 8); + cwAdcDashTo = EEPROM.read(CW_ADC_DASH_TO) | ((tmpMostBits & 0x0C) << 6); + cwAdcBothFrom = EEPROM.read(CW_ADC_BOTH_FROM) | ((tmpMostBits & 0x30) << 4); + cwAdcBothTo = EEPROM.read(CW_ADC_BOTH_TO) | ((tmpMostBits & 0xC0) << 2); + + //default Value (for original hardware) + if (cwAdcSTFrom >= cwAdcSTTo) + { + cwAdcSTFrom = 0; + cwAdcSTTo = 50; + } + + if (cwAdcBothFrom >= cwAdcBothTo) + { + cwAdcBothFrom = 51; + cwAdcBothTo = 300; + } + + if (cwAdcDotFrom >= cwAdcDotTo) + { + cwAdcDotFrom = 301; + cwAdcDotTo = 600; + } + if (cwAdcDashFrom >= cwAdcDashTo) + { + cwAdcDashFrom = 601; + cwAdcDashTo = 800; + } + //end of CW Keying Variables + if (cwDelayTime < 1 || cwDelayTime > 250) cwDelayTime = 60; @@ -798,6 +872,7 @@ void initSettings(){ if (vfoB_mode < 2) vfoB_mode = 3; + //original code with modified by kd8cec if (usbCarrier > 12010000l || usbCarrier < 11990000l) usbCarrier = 11995000l; @@ -810,8 +885,9 @@ void initSettings(){ vfoB = 14150000l; vfoB_mode = 3; } + //end of original code section - //for protect eeprom life + //for protect eeprom life by KD8CEC vfoA_eeprom = vfoA; vfoB_eeprom = vfoB; vfoA_mode_eeprom = vfoA_mode; @@ -969,7 +1045,7 @@ void loop(){ if (ritOn) doRIT(); else - doTuning(); + doTuningWithThresHold(); } //we check CAT after the encoder as it might put the radio into TX diff --git a/ubitx_20/ubitx_keyer.ino b/ubitx_20/ubitx_keyer.ino index bae1396..65e86ec 100644 --- a/ubitx_20/ubitx_keyer.ino +++ b/ubitx_20/ubitx_keyer.ino @@ -83,79 +83,38 @@ void cwKeyUp(){ cwTimeout = millis() + cwDelayTime * 10; } -/***************************************************************************** -// New logic, by RON -// modified by KD8CEC -******************************************************************************/ +//Variables for Ron's new logic #define DIT_L 0x01 // DIT latch #define DAH_L 0x02 // DAH latch #define DIT_PROC 0x04 // DIT is being processed #define PDLSWAP 0x08 // 0 for normal, 1 for swap #define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT }; - static long ktimer; - bool Iambic_Key = true; unsigned char keyerControl = IAMBICB; unsigned char keyerState = IDLE; -//Below is a test to reduce the keying error. -/* -char update_PaddleLatch(byte isUpdateKeyState) { - int paddle = analogRead(ANALOG_KEYER); - unsigned char tmpKeyerControl; - - if (paddle > 800) // above 4v is up - tmpKeyerControl = 0; - //else if (paddle > 600) // 4-3v is DASH - else if (paddle > 693 && paddle < 700) // 4-3v is DASH - tmpKeyerControl |= DAH_L; - //else if (paddle > 300) //1-2v is DOT - else if (paddle > 323 && paddle < 328) //1-2v is DOT - tmpKeyerControl |= DIT_L; - //else if (paddle > 50) - else if (paddle > 280 && paddle < 290) - tmpKeyerControl |= (DAH_L | DIT_L) ; //both are between 1 and 2v - else - tmpKeyerControl = 0 ; //STRAIGHT KEY in original code - //keyerControl |= (DAH_L | DIT_L) ; //STRAIGHT KEY in original code - - if (isUpdateKeyState == 1) { - keyerControl |= tmpKeyerControl; - } - - byte buff[17]; - sprintf(buff, "Key : %d", paddle); - if (tmpKeyerControl > 0) - printLine2(buff); - - return tmpKeyerControl; - - //if (analogRead(ANALOG_DOT) < 600 ) keyerControl |= DIT_L; - //if (analogRead(ANALOG_DASH) < 600 ) keyerControl |= DAH_L; -} -*/ - +//Below is a test to reduce the keying error. do not delete lines //create by KD8CEC for compatible with new CW Logic char update_PaddleLatch(byte isUpdateKeyState) { - int paddle = analogRead(ANALOG_KEYER); unsigned char tmpKeyerControl; + int paddle = analogRead(ANALOG_KEYER); - if (paddle > 800) // above 4v is up - tmpKeyerControl = 0; - else if (paddle > 600) // 4-3v is DASH + if (paddle > cwAdcDashFrom && paddle < cwAdcDashTo) tmpKeyerControl |= DAH_L; - else if (paddle > 300) //1-2v is DOT + else if (paddle > cwAdcDotFrom && paddle < cwAdcDotTo) tmpKeyerControl |= DIT_L; - else if (paddle > 50) - tmpKeyerControl |= (DAH_L | DIT_L) ; //both are between 1 and 2v - else - { //STRAIGHT KEY in original code + else if (paddle > cwAdcBothFrom && paddle < cwAdcBothTo) + tmpKeyerControl |= (DAH_L | DIT_L) ; + else + { if (Iambic_Key) tmpKeyerControl = 0 ; - else + else if (paddle > cwAdcSTFrom && paddle < cwAdcSTTo) tmpKeyerControl = DIT_L ; + else + tmpKeyerControl = 0 ; } if (isUpdateKeyState == 1) @@ -164,123 +123,128 @@ char update_PaddleLatch(byte isUpdateKeyState) { return tmpKeyerControl; } -//This function is Ron's Logic. +/***************************************************************************** +// New logic, by RON +// modified by KD8CEC +******************************************************************************/ void cwKeyer(void){ byte paddle; lastPaddle = 0; int dot,dash; bool continue_loop = true; unsigned tmpKeyControl = 0; -if( Iambic_Key ){ - -while(continue_loop){ - switch (keyerState) { - case IDLE: - tmpKeyControl = update_PaddleLatch(0); - if ( tmpKeyControl == DAH_L || tmpKeyControl == DIT_L || - tmpKeyControl == (DAH_L | DIT_L) || (keyerControl & 0x03)) { - //DIT or DASH or current state DIT & DASH - //(analogRead(ANALOG_DOT) < 600) || //DIT - //(analogRead(ANALOG_DASH) < 600) || //DIT - // (keyerControl & 0x03)) { - update_PaddleLatch(1); - keyerState = CHK_DIT; - }else{ + + if( Iambic_Key ) { + while(continue_loop) { + switch (keyerState) { + case IDLE: + tmpKeyControl = update_PaddleLatch(0); + if ( tmpKeyControl == DAH_L || tmpKeyControl == DIT_L || + tmpKeyControl == (DAH_L | DIT_L) || (keyerControl & 0x03)) { + update_PaddleLatch(1); + keyerState = CHK_DIT; + }else{ + if (0 < cwTimeout && cwTimeout < millis()){ + cwTimeout = 0; + stopTx(); + } + continue_loop = false; + } + break; + + case CHK_DIT: + if (keyerControl & DIT_L) { + keyerControl |= DIT_PROC; + ktimer = cwSpeed; + keyerState = KEYED_PREP; + }else{ + keyerState = CHK_DAH; + } + break; + + case CHK_DAH: + if (keyerControl & DAH_L) { + ktimer = cwSpeed*3; + keyerState = KEYED_PREP; + }else{ + keyerState = IDLE; + } + break; + + case KEYED_PREP: + ktimer += millis(); // set ktimer to interval end time + keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits + keyerState = KEYED; // next state + if (!inTx){ + keyDown = 0; + cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT; + startTx(TX_CW, 1); + } + cwKeydown(); + break; + + case KEYED: + if (millis() > ktimer) { // are we at end of key down ? + cwKeyUp(); + ktimer = millis() + cwSpeed; // inter-element time + keyerState = INTER_ELEMENT; // next state + }else if (keyerControl & IAMBICB) { + update_PaddleLatch(1); // early paddle latch in Iambic B mode + } + break; + + case INTER_ELEMENT: + // Insert time between dits/dahs + update_PaddleLatch(1); // latch paddle state + if (millis() > ktimer) { // are we at end of inter-space ? + if (keyerControl & DIT_PROC) { // was it a dit or dah ? + keyerControl &= ~(DIT_L + DIT_PROC); // clear two bits + keyerState = CHK_DAH; // dit done, check for dah + }else{ + keyerControl &= ~(DAH_L); // clear dah latch + keyerState = IDLE; // go idle + } + } + break; + } + + Check_Cat(3); + } //end of while + } + else{ + while(1){ + if (update_PaddleLatch(0) == DIT_L) { + // if we are here, it is only because the key is pressed + if (!inTx){ + keyDown = 0; + cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT; + startTx(TX_CW, 1); + } + cwKeydown(); + + while ( update_PaddleLatch(0) == DIT_L ) + delay_background(1, 3); + + cwKeyUp(); + } + else{ if (0 < cwTimeout && cwTimeout < millis()){ cwTimeout = 0; + keyDown = 0; stopTx(); } - continue_loop = false; + if (!cwTimeout) + return; + // got back to the beginning of the loop, if no further activity happens on straight key + // we will time out, and return out of this routine + //delay(5); + delay_background(5, 3); + continue; } - break; - case CHK_DIT: - if (keyerControl & DIT_L) { - keyerControl |= DIT_PROC; - ktimer = cwSpeed; - keyerState = KEYED_PREP; - }else{ - keyerState = CHK_DAH; - } - break; - - case CHK_DAH: - if (keyerControl & DAH_L) { - ktimer = cwSpeed*3; - keyerState = KEYED_PREP; - }else{ - keyerState = IDLE; - } - break; - - case KEYED_PREP: - ktimer += millis(); // set ktimer to interval end time - keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits - keyerState = KEYED; // next state - if (!inTx){ - keyDown = 0; - cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT; - startTx(TX_CW, 1); - } - cwKeydown(); - break; - - case KEYED: - if (millis() > ktimer) { // are we at end of key down ? - cwKeyUp(); - ktimer = millis() + cwSpeed; // inter-element time - keyerState = INTER_ELEMENT; // next state - }else if (keyerControl & IAMBICB) { - update_PaddleLatch(1); // early paddle latch in Iambic B mode - } - break; - - case INTER_ELEMENT: - // Insert time between dits/dahs - update_PaddleLatch(1); // latch paddle state - if (millis() > ktimer) { // are we at end of inter-space ? - if (keyerControl & DIT_PROC) { // was it a dit or dah ? - keyerControl &= ~(DIT_L + DIT_PROC); // clear two bits - keyerState = CHK_DAH; // dit done, check for dah - }else{ - keyerControl &= ~(DAH_L); // clear dah latch - keyerState = IDLE; // go idle - } - } - break; - } -} //end of while - -}else{ - while(1){ - //if (analogRead(ANALOG_DOT) < 600){ - if (update_PaddleLatch(0) == DIT_L) { - // if we are here, it is only because the key is pressed - if (!inTx){ - keyDown = 0; - cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT; - startTx(TX_CW, 1); - } - // start the transmission) - cwKeydown(); - //while ( analogRead(ANALOG_DOT) < 600 ) delay(1); - while ( update_PaddleLatch(0) == DIT_L ) delay(1); - cwKeyUp(); - }else{ - if (0 < cwTimeout && cwTimeout < millis()){ - cwTimeout = 0; - keyDown = 0; - stopTx(); - } - if (!cwTimeout) - return; - // got back to the beginning of the loop, if no further activity happens on straight key - // we will time out, and return out of this routine - delay(5); - continue; - } -} //end of else -} + Check_Cat(2); + } //end of while + } //end of elese } diff --git a/ubitx_20/ubitx_menu.ino b/ubitx_20/ubitx_menu.ino index 117dca7..ffd2394 100644 --- a/ubitx_20/ubitx_menu.ino +++ b/ubitx_20/ubitx_menu.ino @@ -13,6 +13,7 @@ #define printLineF1(x) (printLineF(1, x)) #define printLineF2(x) (printLineF(0, x)) +//Ham band move by KD8CEC void menuBand(int btn){ int knob = 0; int stepChangeCount = 0; @@ -117,6 +118,7 @@ void menuBand(int btn){ menuOn = 0; } +//Convert Mode, Number by KD8CEC //0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM byte modeToByte(){ if (isUSB) @@ -125,12 +127,15 @@ byte modeToByte(){ return 2; } +//Convert Number to Mode by KD8CEC void byteToMode(byte modeValue){ if (modeValue == 3) isUSB = 1; else isUSB = 0; } + +//Convert Number to Mode by KD8CEC void byteWithFreqToMode(byte modeValue){ if (modeValue == 3) isUSB = 1; @@ -140,6 +145,7 @@ void byteWithFreqToMode(byte modeValue){ isUSB = 0; } +//VFO Toggle and save VFO Information, modified by KD8CEC void menuVfoToggle(int btn, char isUseDelayTime) { if (!btn){ @@ -229,6 +235,7 @@ void menuSidebandToggle(int btn){ } } +//Select CW Key Type by KD8CEC void menuSetupKeyType(int btn){ if (!btn && digitalRead(PTT) == HIGH){ if (Iambic_Key) @@ -263,7 +270,88 @@ void menuSetupKeyType(int btn){ } } +//Analog pin monitoring with CW Key and function keys connected. +//by KD8CEC +void menuADCMonitor(int btn){ + int adcPinA0 = 0; //A0(BLACK, EncoderA) + int adcPinA1 = 0; //A1(BROWN, EncoderB) + int adcPinA2 = 0; //A2(RED, Function Key) + int adcPinA3 = 0; //A3(ORANGE, CW Key) + int adcPinA6 = 0; //A6(BLUE, Ptt) + int adcPinA7 = 0; //A7(VIOLET, Spare) + unsigned long pressKeyTime = 0; + + if (!btn){ + printLineF2(F("ADC Line Monitor")); + return; + } + + printLineF2(F("Exit:Long PTT")); + delay_background(2000, 0); + printLineF1(F("A0 A1 A2")); + printLineF2(F("A3 A6 A7")); + delay_background(3000, 0); + + while (true) { + adcPinA0 = analogRead(A0); //A0(BLACK, EncoderA) + adcPinA1 = analogRead(A1); //A1(BROWN, EncoderB) + adcPinA2 = analogRead(A2); //A2(RED, Function Key) + adcPinA3 = analogRead(A3); //A3(ORANGE, CW Key) + adcPinA6 = analogRead(A6); //A6(BLUE, Ptt) + adcPinA7 = analogRead(A7); //A7(VIOLET, Spare) +/* + sprintf(c, "%4d %4d %4d", adcPinA0, adcPinA1, adcPinA2); + printLine1(c); + sprintf(c, "%4d %4d %4d", adcPinA3, adcPinA6, adcPinA7); + printLine2(c); +*/ + + if (adcPinA6 < 10) { + if (pressKeyTime == 0) + pressKeyTime = millis(); + else if (pressKeyTime < (millis() - 3000)) + break; + } + else + pressKeyTime = 0; + + ltoa(adcPinA0, c, 10); + //strcat(b, c); + strcpy(b, c); + strcat(b, ", "); + + ltoa(adcPinA1, c, 10); + strcat(b, c); + strcat(b, ", "); + + ltoa(adcPinA2, c, 10); + strcat(b, c); + + printLine1(b); + + //strcpy(b, " "); + ltoa(adcPinA3, c, 10); + strcpy(b, c); + strcat(b, ", "); + + ltoa(adcPinA6, c, 10); + strcat(b, c); + strcat(b, ", "); + + ltoa(adcPinA7, c, 10); + strcat(b, c); + printLine2(b); + + delay_background(200, 0); + } //end of while + + printLine2ClearAndUpdate(); + menuOn = 0; +} + +//Function to disbled transmission +//by KD8CEC void menuTxOnOff(int btn, byte optionType){ if (!btn){ if ((isTxType & optionType) == 0) @@ -377,6 +465,7 @@ void menuCWSpeed(int btn){ menuOn = 0; } +//Builtin CW Keyer Logic by KD8CEC void menuCWAutoKey(int btn){ if (!btn){ printLineF2(F("CW AutoKey Mode?")); @@ -400,6 +489,7 @@ void menuCWAutoKey(int btn){ menuOn = 0; } +//Modified by KD8CEC void menuSetupCwDelay(int btn){ int knob = 0; int tmpCWDelay = cwDelayTime * 10; @@ -448,6 +538,7 @@ void menuSetupCwDelay(int btn){ menuOn = 0; } +//CW Time delay by KD8CEC void menuSetupTXCWInterval(int btn){ int knob = 0; int tmpTXCWInterval = delayBeforeCWStartTime * 2; @@ -659,6 +750,7 @@ void printCarrierFreq(unsigned long freq){ printLine2(c); } +//modified by KD8CEC (just 1 line remarked //usbCarrier = ... void menuSetupCarrier(int btn){ int knob = 0; unsigned long prevCarrier; @@ -712,6 +804,7 @@ void menuSetupCarrier(int btn){ menuOn = 0; } +//Modified by KD8CEC void menuSetupCwTone(int btn){ int knob = 0; int prev_sideTone; @@ -760,6 +853,7 @@ void menuSetupCwTone(int btn){ menuOn = 0; } +//Lock Dial move by KD8CEC void setDialLock(byte tmpLock, byte fromMode) { if (tmpLock == 1) isDialLock |= (vfoActive == VFO_A ? 0x01 : 0x02); @@ -782,6 +876,7 @@ unsigned int btnDownTimeCount; #define PRESS_ADJUST_TUNE 1000 #define PRESS_LOCK_CONTROL 2000 +//Modified by KD8CEC void doMenu(){ int select=0, i,btnState; char isNeedDisplay = 0; @@ -865,7 +960,7 @@ void doMenu(){ btnState = btnDown(); if (i > 0){ - if (modeCalibrate && select + i < 160) + if (modeCalibrate && select + i < 170) select += i; if (!modeCalibrate && select + i < 80) select += i; @@ -905,8 +1000,10 @@ void doMenu(){ else if (select < 140 && modeCalibrate) menuSetupKeyType(btnState); else if (select < 150 && modeCalibrate) - menuTxOnOff(btnState, 0x01); //TX OFF / ON + menuADCMonitor(btnState); else if (select < 160 && modeCalibrate) + menuTxOnOff(btnState, 0x01); //TX OFF / ON + else if (select < 170 && modeCalibrate) menuExit(btnState); Check_Cat(0); //To prevent disconnections