Compare commits

..

15 Commits

Author SHA1 Message Date
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 140 additions and 601 deletions

View File

@@ -1,5 +1,4 @@
/************************************************************************* /*************************************************************************
KD8CEC's CAT Library for uBITX and HAM
This source code is written for uBITX, but it can also be used on other radios. This source code is written for uBITX, but it can also be used on other radios.
The CAT protocol is used by many radios to provide remote control to comptuers through The CAT protocol is used by many radios to provide remote control to comptuers through
@@ -182,7 +181,7 @@ void CatSetPTT(boolean isPTTOn, byte fromType)
void CatVFOToggle(boolean isSendACK, byte fromType) void CatVFOToggle(boolean isSendACK, byte fromType)
{ {
if (fromType != 2 && fromType != 3) { if (fromType != 2 && fromType != 3) {
menuVfoToggle(1, 0); menuVfoToggle(1);
} }
if (isSendACK) if (isSendACK)
@@ -399,7 +398,7 @@ void ReadEEPRom_FT817(byte fromType)
void WriteEEPRom_FT817(byte fromType) void WriteEEPRom_FT817(byte fromType)
{ {
//byte temp0 = CAT_BUFF[0]; byte temp0 = CAT_BUFF[0];
byte temp1 = CAT_BUFF[1]; byte temp1 = CAT_BUFF[1];
CAT_BUFF[0] = 0; CAT_BUFF[0] = 0;
@@ -471,8 +470,8 @@ void WriteEEPRom_FT817(byte fromType)
sideTone = (sideTonePitch * 50 + 300) + sideToneSub; sideTone = (sideTonePitch * 50 + 300) + sideToneSub;
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(500);
printLine2(""); //Ham radio deluxe is the only one that supports this feature yet. and ham radio deluxe has wait time as greater than 500ms printLine2("");
} }
break; break;
@@ -483,8 +482,8 @@ void WriteEEPRom_FT817(byte fromType)
sideTone = (sideTonePitch * 50 + 300) + sideToneSub; sideTone = (sideTonePitch * 50 + 300) + sideToneSub;
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(500);
printLine2(""); //Ham radio deluxe is the only one that supports this feature yet. and ham radio deluxe has wait time as greater than 500ms printLine2("");
} }
break; break;
@@ -503,7 +502,7 @@ void WriteEEPRom_FT817(byte fromType)
cwDelayTime = CAT_BUFF[2]; cwDelayTime = CAT_BUFF[2];
printLineF2(F("CW Speed set!")); printLineF2(F("CW Speed set!"));
EEPROM.put(CW_DELAY, cwDelayTime); EEPROM.put(CW_DELAY, cwDelayTime);
delay(300); delay(500);
printLine2(""); printLine2("");
break; break;
case 0x62 : // case 0x62 : //
@@ -512,7 +511,7 @@ void WriteEEPRom_FT817(byte fromType)
cwSpeed = 1200 / ((CAT_BUFF[2] & 0x3F) + 4); cwSpeed = 1200 / ((CAT_BUFF[2] & 0x3F) + 4);
printLineF2(F("CW Speed set!")); printLineF2(F("CW Speed set!"));
EEPROM.put(CW_SPEED, cwSpeed); EEPROM.put(CW_SPEED, cwSpeed);
delay(300); delay(500);
printLine2(""); printLine2("");
break; break;
@@ -630,6 +629,7 @@ void Check_Cat(byte fromType)
} }
else if (Serial.available() < 5) else if (Serial.available() < 5)
{ {
/*
//First Arrived //First Arrived
if (rxBufferCheckCount == 0) if (rxBufferCheckCount == 0)
{ {
@@ -649,6 +649,8 @@ void Check_Cat(byte fromType)
rxBufferCheckCount = Serial.available(); rxBufferCheckCount = Serial.available();
rxBufferArriveTime = millis() + CAT_RECEIVE_TIMEOUT; //Set time for timeout rxBufferArriveTime = millis() + CAT_RECEIVE_TIMEOUT; //Set time for timeout
} }
*/
return; return;
} }

View File

@@ -1,6 +1,4 @@
/************************************************************************* /*************************************************************************
KD8CEC's Memory Keyer for HAM
This source code is written for All amateur radio operator, This source code is written for All amateur radio operator,
I have not had amateur radio communication for a long time. CW has been I have not had amateur radio communication for a long time. CW has been
around for a long time, and I do not know what kind of keyer and keying around for a long time, and I do not know what kind of keyer and keying
@@ -15,7 +13,6 @@
I wrote this code myself, so there is no license restriction. I wrote this code myself, so there is no license restriction.
So this code allows anyone to write with confidence. So this code allows anyone to write with confidence.
But keep it as long as the original author of the code. But keep it as long as the original author of the code.
DE Ian KD8CEC
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@@ -211,14 +208,10 @@ void sendCWChar(char cwKeyChar)
charLength = ((tmpChar >> 6) & 0x03) + 3; charLength = ((tmpChar >> 6) & 0x03) + 3;
for (j = 0; j < charLength; j++) for (j = 0; j < charLength; j++)
sendBuff[j] = (tmpChar << (j + 2)) & 0x80; sendBuff[j] = (tmpChar << j + 2) & 0x80;
break; break;
} }
else
{
charLength = 0;
}
} }
} }
@@ -264,7 +257,7 @@ unsigned long scrollDispayTime = 0;
#define scrollSpeed 500 #define scrollSpeed 500
byte displayScrolStep = 0; byte displayScrolStep = 0;
void controlAutoCW(){ int controlAutoCW(){
int knob = 0; int knob = 0;
byte i; byte i;

View File

@@ -1,10 +1,4 @@
/** /**
Since KD8CEC Version 0.29, most of the original code is no longer available.
Most features(TX, Frequency Range, Ham Band, TX Control, CW delay, start Delay... more) have been added by KD8CEC.
However, the license rules are subject to the original source rules.
DE Ian KD8CEC
Original source comment -------------------------------------------------------------
* This source file is under General Public License version 3. * This source file is under General Public License version 3.
* *
* This verision uses a built-in Si5351 library * This verision uses a built-in Si5351 library
@@ -158,20 +152,6 @@ 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)
//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 //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.
@@ -231,7 +211,7 @@ unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier;
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
unsigned int cwSpeed = 100; //this is actuall the dot period in milliseconds int cwSpeed = 100; //this is actuall the dot period in milliseconds
extern int32_t calibration; extern int32_t calibration;
//for store the mode in eeprom //for store the mode in eeprom
@@ -255,18 +235,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];
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 //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
@@ -351,8 +320,8 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
loadMode = (byte)(resultFreq >> 30); loadMode = (byte)(resultFreq >> 30);
resultFreq = resultFreq & 0x3FFFFFFF; resultFreq = resultFreq & 0x3FFFFFFF;
if ((resultFreq / 1000) < hamBandRange[(unsigned char)findedIndex][0] || (resultFreq / 1000) > hamBandRange[(unsigned char)findedIndex][1]) if ((resultFreq / 1000) < hamBandRange[findedIndex][0] || (resultFreq / 1000) > hamBandRange[findedIndex][1])
resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000; resultFreq = (unsigned long)(hamBandRange[findedIndex][0]) * 1000;
setFrequency(resultFreq); setFrequency(resultFreq);
byteWithFreqToMode(loadMode); byteWithFreqToMode(loadMode);
@@ -453,7 +422,10 @@ void setTXFilters(unsigned long freq){
*/ */
void setFrequency(unsigned long f){ void setFrequency(unsigned long f){
f = (f / arTuneStep[tuneStepIndex -1]) * arTuneStep[tuneStepIndex -1]; uint64_t osc_f;
//1 digits discarded
f = (f / 50) * 50;
setTXFilters(f); setTXFilters(f);
@@ -476,6 +448,8 @@ void setFrequency(unsigned long f){
*/ */
void startTx(byte txMode, byte isDisplayUpdate){ void startTx(byte txMode, byte isDisplayUpdate){
unsigned long tx_freq = 0;
//Check Hamband only TX //Not found Hamband index by now frequency //Check Hamband only TX //Not found Hamband index by now frequency
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) { if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
//no message //no message
@@ -571,6 +545,8 @@ void checkPTT(){
} }
void checkButton(){ void checkButton(){
int i, t1, t2, knob, new_knob;
//only if the button is pressed //only if the button is pressed
if (!btnDown()) if (!btnDown())
return; return;
@@ -589,24 +565,17 @@ void checkButton(){
} }
/************************************ /**
Replace function by KD8CEC * The tuning jumps by 50 Hz on each step when you tune slowly
prevent error controls * As you spin the encoder faster, the jump size also increases
applied Threshold for reduct errors, dial Lock, dynamic Step * This way, you can quickly move to another band by just spinning the
*************************************/ * tuning knob
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 void doTuning(){
#define encodeTimeOut 1000
void doTuningWithThresHold(){
int s = 0; int s = 0;
unsigned long prev_freq; unsigned long prev_freq;
long incdecValue = 0; int incdecValue = 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)))
@@ -615,32 +584,36 @@ void doTuningWithThresHold(){
if (isCWAutoMode == 0 || cwAutoDialType == 1) if (isCWAutoMode == 0 || cwAutoDialType == 1)
s = enc_read(); s = enc_read();
//if time is exceeded, it is recognized as an error, if (s){
//ignore exists values, because of errors
if (s == 0) {
if (encodedSumValue != 0 && (millis() - encodeTimeOut) > lastEncInputtime)
encodedSumValue = 0;
lastMovedirection = 0;
return;
}
lastEncInputtime = millis();
//for check moving direction
encodedSumValue += (s > 0 ? 1 : -1);
//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; prev_freq = frequency;
//incdecValue = tuningStep * s;
frequency += (arTuneStep[tuneStepIndex -1] * s * (s * s < 10 ? 1 : 3)); //appield weight (s is speed) if (s > 10)
incdecValue = 200000l;
if (s > 7)
incdecValue = 10000l;
else if (s > 4)
incdecValue = 1000l;
else if (s > 2)
incdecValue = 500;
else if (s > 0)
incdecValue = 50l;
else if (s > -2)
incdecValue = -50l;
else if (s > -4)
incdecValue = -500l;
else if (s > -7)
incdecValue = -1000l;
else if (s > -9)
incdecValue = -10000l;
else
incdecValue = -200000l;
if (incdecValue > 0 && frequency + incdecValue > HIGHEST_FREQ_DIAL)
frequency = HIGHEST_FREQ_DIAL;
else if (incdecValue < 0 && frequency < -incdecValue + LOWEST_FREQ_DIAL) //for compute and compare based integer type.
frequency = LOWEST_FREQ_DIAL;
else
frequency += incdecValue;
if (prev_freq < 10000000l && frequency > 10000000l) if (prev_freq < 10000000l && frequency > 10000000l)
isUSB = true; isUSB = true;
@@ -651,11 +624,14 @@ void doTuningWithThresHold(){
setFrequency(frequency); setFrequency(frequency);
updateDisplay(); updateDisplay();
} }
}
/** /**
* RIT only steps back and forth by 100 hz at a time * RIT only steps back and forth by 100 hz at a time
*/ */
void doRIT(){ void doRIT(){
unsigned long newFreq;
int knob = enc_read(); int knob = enc_read();
unsigned long old_freq = frequency; unsigned long old_freq = frequency;
@@ -718,10 +694,7 @@ void initSettings(){
EEPROM.get(VFO_B, vfoB); EEPROM.get(VFO_B, vfoB);
EEPROM.get(CW_SIDETONE, sideTone); EEPROM.get(CW_SIDETONE, sideTone);
EEPROM.get(CW_SPEED, cwSpeed); EEPROM.get(CW_SPEED, cwSpeed);
//End of original code
//----------------------------------------------------------------
//Add Lines by KD8CEC
//for custom source Section ============================= //for custom source Section =============================
//ID & Version Check from EEProm //ID & Version Check from EEProm
//if found different firmware, erase eeprom (32 //if found different firmware, erase eeprom (32
@@ -765,104 +738,19 @@ void initSettings(){
EEPROM.get(HAM_BAND_COUNT, useHamBandCount); EEPROM.get(HAM_BAND_COUNT, useHamBandCount);
EEPROM.get(TX_TUNE_TYPE, tuneTXType); EEPROM.get(TX_TUNE_TYPE, tuneTXType);
byte findedValidValueCount = 0;
if ((3 < tuneTXType && tuneTXType < 100) || 103 < tuneTXType || useHamBandCount < 1)
tuneTXType = 0;
//Read band Information //Read band Information
for (byte i = 0; i < useHamBandCount; i++) { for (byte i = 0; i < useHamBandCount; i++) {
unsigned int tmpReadValue = 0; unsigned int tmpReadValue = 0;
EEPROM.get(HAM_BAND_RANGE + 4 * i, tmpReadValue); EEPROM.get(HAM_BAND_RANGE + 4 * i, tmpReadValue);
hamBandRange[i][0] = tmpReadValue; hamBandRange[i][0] = tmpReadValue;
if (tmpReadValue > 1 && tmpReadValue < 55000)
findedValidValueCount++;
EEPROM.get(HAM_BAND_RANGE + 4 * i + 2, tmpReadValue); EEPROM.get(HAM_BAND_RANGE + 4 * i + 2, tmpReadValue);
hamBandRange[i][1] = tmpReadValue; hamBandRange[i][1] = tmpReadValue;
} }
//Check Value Range and default Set for new users
if ((3 < tuneTXType && tuneTXType < 100) || 103 < tuneTXType || useHamBandCount < 1 || findedValidValueCount < 5)
{
tuneTXType = 2;
//if empty band Information, auto insert default region 1 frequency range
//This part is made temporary for people who have difficulty setting up, so can remove it when you run out of memory.
useHamBandCount = 10;
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367;
hamBandRange[3][0] = 7000; hamBandRange[3][1] = 7200;
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
hamBandRange[7][0] = 21000; hamBandRange[7][1] = 21450;
hamBandRange[8][0] = 24890; hamBandRange[8][1] = 24990;
hamBandRange[9][0] = 28000; hamBandRange[9][1] = 29700;
}
//Read Tuning Step Index, and steps
findedValidValueCount = 0;
EEPROM.get(TUNING_STEP, tuneStepIndex);
for (byte i = 0; i < 5; i++) {
arTuneStep[i] = EEPROM.read(TUNING_STEP + i + 1);
if (arTuneStep[i] >= 1 && arTuneStep[i] < 251) //Maximum 250 for check valid Value
findedValidValueCount++;
}
//Check Value Range and default Set for new users
if (findedValidValueCount < 5)
{
//Default Setting
arTuneStep[0] = 10;
arTuneStep[1] = 20;
arTuneStep[2] = 50;
arTuneStep[3] = 100;
arTuneStep[4] = 200;
}
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) if (cwDelayTime < 1 || cwDelayTime > 250)
cwDelayTime = 60; cwDelayTime = 60;
@@ -872,7 +760,6 @@ void initSettings(){
if (vfoB_mode < 2) if (vfoB_mode < 2)
vfoB_mode = 3; vfoB_mode = 3;
//original code with modified by kd8cec
if (usbCarrier > 12010000l || usbCarrier < 11990000l) if (usbCarrier > 12010000l || usbCarrier < 11990000l)
usbCarrier = 11995000l; usbCarrier = 11995000l;
@@ -885,9 +772,8 @@ void initSettings(){
vfoB = 14150000l; vfoB = 14150000l;
vfoB_mode = 3; vfoB_mode = 3;
} }
//end of original code section
//for protect eeprom life by KD8CEC //for protect eeprom life
vfoA_eeprom = vfoA; vfoA_eeprom = vfoA;
vfoB_eeprom = vfoB; vfoB_eeprom = vfoB;
vfoA_mode_eeprom = vfoA_mode; vfoA_mode_eeprom = vfoA_mode;
@@ -958,7 +844,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.27"));
Init_Cat(38400, SERIAL_8N1); Init_Cat(38400, SERIAL_8N1);
initMeter(); //not used in this build initMeter(); //not used in this build
@@ -1045,7 +931,7 @@ void loop(){
if (ritOn) if (ritOn)
doRIT(); doRIT();
else else
doTuningWithThresHold(); doTuning();
} }
//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

View File

@@ -1,9 +1,6 @@
/** /**
CW Keyer * CW Keyer
CW Key logic change with ron's code (ubitx_keyer.cpp) *
Ron's logic has been modified to work with the original uBITX by KD8CEC
Original Comment ----------------------------------------------------------------------------
* The CW keyer handles either a straight key or an iambic / paddle key. * The CW keyer handles either a straight key or an iambic / paddle key.
* They all use just one analog input line. This is how it works. * They all use just one analog input line. This is how it works.
* The analog line has the internal pull-up resistor enabled. * The analog line has the internal pull-up resistor enabled.
@@ -37,6 +34,7 @@
//when both are simultaneously pressed //when both are simultaneously pressed
char lastPaddle = 0; char lastPaddle = 0;
//reads the analog keyer pin and reports the paddle //reads the analog keyer pin and reports the paddle
byte getPaddle(){ byte getPaddle(){
int paddle = analogRead(ANALOG_KEYER); int paddle = analogRead(ANALOG_KEYER);
@@ -83,183 +81,13 @@ void cwKeyUp(){
cwTimeout = millis() + cwDelayTime * 10; cwTimeout = millis() + cwDelayTime * 10;
} }
//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. do not delete lines
//create by KD8CEC for compatible with new CW Logic
char update_PaddleLatch(byte isUpdateKeyState) {
unsigned char tmpKeyerControl;
int paddle = analogRead(ANALOG_KEYER);
if (paddle > cwAdcDashFrom && paddle < cwAdcDashTo)
tmpKeyerControl |= DAH_L;
else if (paddle > cwAdcDotFrom && paddle < cwAdcDotTo)
tmpKeyerControl |= DIT_L;
else if (paddle > cwAdcBothFrom && paddle < cwAdcBothTo)
tmpKeyerControl |= (DAH_L | DIT_L) ;
else
{
if (Iambic_Key)
tmpKeyerControl = 0 ;
else if (paddle > cwAdcSTFrom && paddle < cwAdcSTTo)
tmpKeyerControl = DIT_L ;
else
tmpKeyerControl = 0 ;
}
if (isUpdateKeyState == 1)
keyerControl |= tmpKeyerControl;
return tmpKeyerControl;
}
/*****************************************************************************
// 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)) {
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();
}
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;
}
Check_Cat(2);
} //end of while
} //end of elese
}
//=======================================================================================
//Before logic
//by Farhan and modified by KD8CEC
//======================================================================================
/** /**
* The keyer handles the straight key as well as the iambic key * The keyer handles the straight key as well as the iambic key
* This module keeps looping until the user stops sending cw * This module keeps looping until the user stops sending cw
* if the cwTimeout is set to 0, then it means, we have to exit the keyer loop * if the cwTimeout is set to 0, then it means, we have to exit the keyer loop
* Each time the key is hit the cwTimeout is pushed to a time in the future by cwKeyDown() * Each time the key is hit the cwTimeout is pushed to a time in the future by cwKeyDown()
*/ */
/*
void cwKeyer(){ void cwKeyer(){
byte paddle; byte paddle;
lastPaddle = 0; lastPaddle = 0;
@@ -283,7 +111,17 @@ void cwKeyer(){
if (!cwTimeout) if (!cwTimeout)
return; return;
Check_Cat(2); //for uBITX on Raspberry pi, when straight keying, disconnect / test complete //if a paddle was used (not a straight key) we should extend the space to be a full dash
//by adding two more dots long space (one has already been added at the end of the dot or dash)
/*
if (cwTimeout > 0 && lastPaddle != PADDLE_STRAIGHT)
delay_background(cwSpeed * 2, 3);
//delay(cwSpeed * 2);
// got back to the begining of the loop, if no further activity happens on the paddle or the straight key
// we will time out, and return out of this routine
delay(5);
*/
continue; continue;
} }
@@ -346,6 +184,3 @@ void cwKeyer(){
delay(cwSpeed); delay(cwSpeed);
} }
} }
*/

View File

@@ -13,8 +13,7 @@
#define printLineF1(x) (printLineF(1, x)) #define printLineF1(x) (printLineF(1, x))
#define printLineF2(x) (printLineF(0, x)) #define printLineF2(x) (printLineF(0, x))
//Ham band move by KD8CEC int menuBand(int btn){
void menuBand(int btn){
int knob = 0; int knob = 0;
int stepChangeCount = 0; int stepChangeCount = 0;
byte btnPressCount = 0; byte btnPressCount = 0;
@@ -37,6 +36,21 @@ void menuBand(int btn){
} }
else { else {
tuneTXType = 2; tuneTXType = 2;
//if empty band Information, auto insert default region 1 frequency range
//This part is made temporary for people who have difficulty setting up, so can remove it when you run out of memory.
if (useHamBandCount < 1) {
useHamBandCount = 10;
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367;
hamBandRange[3][0] = 7000; hamBandRange[3][1] = 7200;
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
hamBandRange[7][0] = 21000; hamBandRange[7][1] = 21450;
hamBandRange[8][0] = 24890; hamBandRange[8][1] = 24990;
hamBandRange[9][0] = 28000; hamBandRange[9][1] = 29700;
}
printLineF2(F("Ham band mode")); printLineF2(F("Ham band mode"));
} }
delay_background(1000, 0); delay_background(1000, 0);
@@ -118,7 +132,6 @@ void menuBand(int btn){
menuOn = 0; menuOn = 0;
} }
//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:CW, 5:AM, 6:FM
byte modeToByte(){ byte modeToByte(){
if (isUSB) if (isUSB)
@@ -127,15 +140,12 @@ byte modeToByte(){
return 2; return 2;
} }
//Convert Number to Mode by KD8CEC
void byteToMode(byte modeValue){ void byteToMode(byte modeValue){
if (modeValue == 3) if (modeValue == 3)
isUSB = 1; isUSB = 1;
else else
isUSB = 0; isUSB = 0;
} }
//Convert Number to Mode by KD8CEC
void byteWithFreqToMode(byte modeValue){ void byteWithFreqToMode(byte modeValue){
if (modeValue == 3) if (modeValue == 3)
isUSB = 1; isUSB = 1;
@@ -145,8 +155,7 @@ void byteWithFreqToMode(byte modeValue){
isUSB = 0; isUSB = 0;
} }
//VFO Toggle and save VFO Information, modified by KD8CEC void menuVfoToggle(int btn)
void menuVfoToggle(int btn, char isUseDelayTime)
{ {
if (!btn){ if (!btn){
if (vfoActive == VFO_A) if (vfoActive == VFO_A)
@@ -180,9 +189,8 @@ void menuVfoToggle(int btn, char isUseDelayTime)
ritDisable(); ritDisable();
if (isUseDelayTime == 1) //Found Issue in wsjt-x Linux 32bit //updateDisplay();
delay_background(500, 0); delay_background(500, 0);
printLine2ClearAndUpdate(); printLine2ClearAndUpdate();
//exit the menu //exit the menu
menuOn = 0; menuOn = 0;
@@ -235,123 +243,6 @@ void menuSidebandToggle(int btn){
} }
} }
//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;
}
}
//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){ void menuTxOnOff(int btn, byte optionType){
if (!btn){ if (!btn){
if ((isTxType & optionType) == 0) if ((isTxType & optionType) == 0)
@@ -410,7 +301,7 @@ void menuExit(int btn){
} }
} }
void menuCWSpeed(int btn){ int menuCWSpeed(int btn){
int knob = 0; int knob = 0;
int wpm; int wpm;
@@ -465,8 +356,7 @@ void menuCWSpeed(int btn){
menuOn = 0; menuOn = 0;
} }
//Builtin CW Keyer Logic by KD8CEC int menuCWAutoKey(int btn){
void menuCWAutoKey(int btn){
if (!btn){ if (!btn){
printLineF2(F("CW AutoKey Mode?")); printLineF2(F("CW AutoKey Mode?"));
return; return;
@@ -489,8 +379,7 @@ void menuCWAutoKey(int btn){
menuOn = 0; menuOn = 0;
} }
//Modified by KD8CEC int menuSetupCwDelay(int btn){
void menuSetupCwDelay(int btn){
int knob = 0; int knob = 0;
int tmpCWDelay = cwDelayTime * 10; int tmpCWDelay = cwDelayTime * 10;
@@ -538,8 +427,7 @@ void menuSetupCwDelay(int btn){
menuOn = 0; menuOn = 0;
} }
//CW Time delay by KD8CEC int menuSetupTXCWInterval(int btn){
void menuSetupTXCWInterval(int btn){
int knob = 0; int knob = 0;
int tmpTXCWInterval = delayBeforeCWStartTime * 2; int tmpTXCWInterval = delayBeforeCWStartTime * 2;
@@ -602,8 +490,10 @@ void menuSetupTXCWInterval(int btn){
extern int32_t calibration; extern int32_t calibration;
extern uint32_t si5351bx_vcoa; extern uint32_t si5351bx_vcoa;
void factoryCalibration(int btn){ int factoryCalibration(int btn){
int knob = 0; int knob = 0;
int32_t prev_calibration;
//keep clear of any previous button press //keep clear of any previous button press
while (btnDown()) while (btnDown())
@@ -612,9 +502,10 @@ void factoryCalibration(int btn){
if (!btn){ if (!btn){
printLineF2(F("Set Calibration?")); printLineF2(F("Set Calibration?"));
return; return 0;
} }
prev_calibration = calibration;
calibration = 0; calibration = 0;
isUSB = true; isUSB = true;
@@ -669,13 +560,13 @@ void factoryCalibration(int btn){
delay(100); delay(100);
} }
void menuSetupCalibration(int btn){ int menuSetupCalibration(int btn){
int knob = 0; int knob = 0;
int32_t prev_calibration; int32_t prev_calibration;
if (!btn){ if (!btn){
printLineF2(F("Set Calibration?")); printLineF2(F("Set Calibration?"));
return; return 0;
} }
printLineF1(F("Set to Zero-beat,")); printLineF1(F("Set to Zero-beat,"));
@@ -750,7 +641,6 @@ void printCarrierFreq(unsigned long freq){
printLine2(c); printLine2(c);
} }
//modified by KD8CEC (just 1 line remarked //usbCarrier = ...
void menuSetupCarrier(int btn){ void menuSetupCarrier(int btn){
int knob = 0; int knob = 0;
unsigned long prevCarrier; unsigned long prevCarrier;
@@ -765,8 +655,7 @@ void menuSetupCarrier(int btn){
printLineF1(F("PTT to confirm. ")); printLineF1(F("PTT to confirm. "));
delay_background(1000, 0); delay_background(1000, 0);
//usbCarrier = 11995000l; //Remarked by KD8CEC, Suggest from many user, if entry routine factoryrest usbCarrier = 11995000l;
si5351bx_setfreq(0, usbCarrier); si5351bx_setfreq(0, usbCarrier);
printCarrierFreq(usbCarrier); printCarrierFreq(usbCarrier);
@@ -804,7 +693,6 @@ void menuSetupCarrier(int btn){
menuOn = 0; menuOn = 0;
} }
//Modified by KD8CEC
void menuSetupCwTone(int btn){ void menuSetupCwTone(int btn){
int knob = 0; int knob = 0;
int prev_sideTone; int prev_sideTone;
@@ -853,7 +741,6 @@ void menuSetupCwTone(int btn){
menuOn = 0; menuOn = 0;
} }
//Lock Dial move by KD8CEC
void setDialLock(byte tmpLock, byte fromMode) { void setDialLock(byte tmpLock, byte fromMode) {
if (tmpLock == 1) if (tmpLock == 1)
isDialLock |= (vfoActive == VFO_A ? 0x01 : 0x02); isDialLock |= (vfoActive == VFO_A ? 0x01 : 0x02);
@@ -871,30 +758,22 @@ void setDialLock(byte tmpLock, byte fromMode) {
printLine2ClearAndUpdate(); printLine2ClearAndUpdate();
} }
unsigned int btnDownTimeCount; int btnDownTimeCount;
#define PRESS_ADJUST_TUNE 1000
#define PRESS_LOCK_CONTROL 2000
//Modified by KD8CEC
void doMenu(){ void doMenu(){
int select=0, i,btnState; int select=0, i,btnState;
char isNeedDisplay = 0;
//for DialLock On/Off function //for DialLock On/Off function
btnDownTimeCount = 0; btnDownTimeCount = 0;
//wait for the button to be raised up //wait for the button to be raised up
//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
if (btnDownTimeCount++ == (PRESS_ADJUST_TUNE / 50)) { //Set Tune Step //btnDownTimeCount++;
printLineF2(F("Set Tune Step?")); //check long time Down Button -> 3 Second
} if (btnDownTimeCount++ > (2000 / 50)) {
else if (btnDownTimeCount > (PRESS_LOCK_CONTROL / 50)) { //check long time Down Button -> 2.5 Second => Lock
if (vfoActive == VFO_A) if (vfoActive == VFO_A)
setDialLock((isDialLock & 0x01) == 0x01 ? 0 : 1, 0); //Reverse Dial lock setDialLock((isDialLock & 0x01) == 0x01 ? 0 : 1, 0); //Reverse Dial lock
else else
@@ -904,55 +783,6 @@ void doMenu(){
} }
delay(50); //debounce delay(50); //debounce
//ADJUST TUNE STEP
if (btnDownTimeCount > (PRESS_ADJUST_TUNE / 50))
{
printLineF1(F("Press Key to set"));
isNeedDisplay = 1; //check to need display for display current value
while (digitalRead(PTT) == HIGH && !btnDown())
{
Check_Cat(0); //To prevent disconnections
delay(50); //debounce
if (isNeedDisplay) {
strcpy(b, "Tune Step:");
itoa(arTuneStep[tuneStepIndex -1], c, 10);
strcat(b, c);
printLine2(b);
isNeedDisplay = 0;
}
i = enc_read();
if (i != 0) {
select += (i > 0 ? 1 : -1);
if (select * select >= 25) { //Threshold 5 * 5 = 25
if (select < 0) {
if (tuneStepIndex > 1)
tuneStepIndex--;
}
else {
if (tuneStepIndex < 5)
tuneStepIndex++;
}
select = 0;
isNeedDisplay = 1;
}
}
} //end of while
printLineF2(F("Changed Step!"));
//SAVE EEPROM
EEPROM.put(TUNING_STEP, tuneStepIndex);
delay_background(500, 0);
printLine2ClearAndUpdate();
return;
} //set tune step
//Below codes are origial code with modified by KD8CEC
//Select menu
menuOn = 2; menuOn = 2;
while (menuOn){ while (menuOn){
@@ -960,23 +790,20 @@ void doMenu(){
btnState = btnDown(); btnState = btnDown();
if (i > 0){ if (i > 0){
if (modeCalibrate && select + i < 170) if (modeCalibrate && select + i < 150)
select += i; select += i;
if (!modeCalibrate && select + i < 80) if (!modeCalibrate && select + i < 80)
select += i; select += i;
} }
//if (i < 0 && select - i >= 0) if (i < 0 && select - i >= 0)
if (i < 0 && select - i >= -10)
select += i; //caught ya, i is already -ve here, so you add it select += i; //caught ya, i is already -ve here, so you add it
if (select < -5) if (select < 10)
menuExit(btnState);
else if (select < 10)
menuBand(btnState); menuBand(btnState);
else if (select < 20) else if (select < 20)
menuRitToggle(btnState); menuRitToggle(btnState);
else if (select < 30) else if (select < 30)
menuVfoToggle(btnState, 1); menuVfoToggle(btnState);
else if (select < 40) else if (select < 40)
menuSidebandToggle(btnState); menuSidebandToggle(btnState);
else if (select < 50) else if (select < 50)
@@ -998,12 +825,8 @@ void doMenu(){
else if (select < 130 && modeCalibrate) else if (select < 130 && modeCalibrate)
menuSetupTXCWInterval(btnState); menuSetupTXCWInterval(btnState);
else if (select < 140 && modeCalibrate) else if (select < 140 && modeCalibrate)
menuSetupKeyType(btnState);
else if (select < 150 && modeCalibrate)
menuADCMonitor(btnState);
else if (select < 160 && modeCalibrate)
menuTxOnOff(btnState, 0x01); //TX OFF / ON menuTxOnOff(btnState, 0x01); //TX OFF / ON
else if (select < 170 && modeCalibrate) else if (select < 150 && modeCalibrate)
menuExit(btnState); menuExit(btnState);
Check_Cat(0); //To prevent disconnections Check_Cat(0); //To prevent disconnections

View File

@@ -62,7 +62,7 @@ void i2cWriten(uint8_t reg, uint8_t *vals, uint8_t vcnt) { // write array
void si5351bx_init() { // Call once at power-up, start PLLA void si5351bx_init() { // Call once at power-up, start PLLA
uint32_t msxp1; uint8_t reg; uint32_t msxp1;
Wire.begin(); Wire.begin();
i2cWrite(149, 0); // SpreadSpectrum off i2cWrite(149, 0); // SpreadSpectrum off
i2cWrite(3, si5351bx_clken); // Disable all CLK output drivers i2cWrite(3, si5351bx_clken); // Disable all CLK output drivers

View File

@@ -115,7 +115,7 @@ void drawMeter(int8_t needle){
*/ */
// 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(char linenmbr, char *c) {
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);
@@ -160,11 +160,11 @@ void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, b
} }
// short cut to print to the first line // short cut to print to the first line
void printLine1(const char *c){ void printLine1(char *c){
printLine(1,c); printLine(1,c);
} }
// short cut to print to the first line // short cut to print to the first line
void printLine2(const char *c){ void printLine2(char *c){
printLine(0,c); printLine(0,c);
} }
@@ -312,9 +312,9 @@ int enc_read(void) {
byte newState; byte newState;
int enc_speed = 0; int enc_speed = 0;
unsigned long start_at = millis(); long stop_by = millis() + 50;
while (millis() - start_at < 50) { // check if the previous state was stable while (millis() < stop_by) { // check if the previous state was stable
newState = enc_state(); // Get current state newState = enc_state(); // Get current state
if (newState != enc_prev_state) if (newState != enc_prev_state)