Compare commits

..

1 Commits

Author SHA1 Message Date
phdlee
fda398046e Merge pull request #4 from phdlee/beta0.25
beta 0.25 commit
2018-01-10 11:39:15 +09:00
10 changed files with 297 additions and 1549 deletions

View File

@@ -1,67 +1,11 @@
#IMPORTANT INFORMATION
----------------------------------------------------------------------------
- Beta 0.26 and Beta 0.261, Beta 0.262, Beta 0.27 is complete test
- You can download and use it.
#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.
- 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.
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.
Now uBITX is an HF radio and will be able to join you in your happy hams life.
Based on this source, you can use it by adding functions.
I am going to do a new project based on this source, linking with WSPR, WSJT-X and so on.
Of course, this repository is still running. If you have any bugs or ideas, please feel free to email me.
http://www.hamskey.com
DE KD8CEC
kd8cec@gmail.com
#uBITX #uBITX
uBITX firmware, written for the Raduino/Arduino control of uBITX transceivers uBITX firmware, written for the Raduino/Arduino control of uBITX transceivers
This project is based on https://github.com/afarhan/ubitx and all copyright is inherited. This project is based on https://github.com/afarhan/ubitx and all copyright is inherited.
The copyright information of the original is below. The copyright information of the original is below.
KD8CEC KD8CEC
----------------------------------------------------------------------------
Prepared or finished tasks for the next version
- Most of them are implemented and included in version 0.27.
- User Interface on LCD -> Option by user (not need)
- Include WSPR Beacone function - (implement other new repository)
complete experiment
need solve : Big code size (over 100%, then remove some functions for experment)
need replace Si5351 Library (increase risk and need more beta tester)
W3PM sent me his wonderful source - using BITX, GPS
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
## REVISION RECORD ## REVISION RECORD
0.27
(First alpha test version, This will be renamed to the major version 1.0)
- Dual VFO Dial Lock (vfoA Dial lock)
- Support Ham band on uBITX
default Hamband is regeion1 but customize by uBITX Manager Software
- Advanced ham band options (Tx control) for use in all countries. You can adjust it yourself.
- Convenience of band movement
0.26
- only Beta tester released & source code share
- find a bug on none initial eeprom uBITX - Fixed (Check -> initialized & compatible original source code)
- change the version number 0.26 -> 0.27
- Prevent overflow bugs
- bug with linux based Hamlib (raspberry pi), It was perfect for the 0.224 version, but there was a problem for the 0.25 version.
On Windows, ham deluxe, wsjt-x, jt65-hf, and fldigi were successfully run. Problem with Raspberry pi.
0.25 0.25
- Beta Version Released - Beta Version Released
http://www.hamskey.com/2018/01/release-beta-version-of-cat-support.html http://www.hamskey.com/2018/01/release-beta-version-of-cat-support.html

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
@@ -130,21 +129,10 @@ void CatGetFreqMode(unsigned long freq, byte fromType)
} }
//Mode Check //Mode Check
if (cwMode == 0)
{
if (isUSB) if (isUSB)
CAT_BUFF[4] = CAT_MODE_USB; CAT_BUFF[4] = CAT_MODE_USB;
else else
CAT_BUFF[4] = CAT_MODE_LSB; CAT_BUFF[4] = CAT_MODE_LSB;
}
else if (cwMode == 1)
{
CAT_BUFF[4] = CAT_MODE_CW;
}
else
{
CAT_BUFF[4] = CAT_MODE_CW;
}
SendCatData(5); SendCatData(5);
} }
@@ -193,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)
@@ -209,18 +197,12 @@ void CatSetMode(byte tmpMode, byte fromType)
if (!inTx) if (!inTx)
{ {
if (tmpMode == CAT_MODE_CW) if (tmpMode == CAT_MODE_USB)
{ {
cwMode = 1;
}
else if (tmpMode == CAT_MODE_USB)
{
cwMode = 0;
isUSB = true; isUSB = true;
} }
else else
{ {
cwMode = 0;
isUSB = false; isUSB = false;
} }
@@ -375,21 +357,10 @@ void ReadEEPRom_FT817(byte fromType)
CAT_BUFF[1] = 0xB2; CAT_BUFF[1] = 0xB2;
break; case 0x69 : //FM Mic (#29) Contains 0-100 (decimal) as displayed break; case 0x69 : //FM Mic (#29) Contains 0-100 (decimal) as displayed
case 0x78 : case 0x78 :
if (cwMode == 0)
{
if (isUSB) if (isUSB)
CAT_BUFF[0] = CAT_MODE_USB; CAT_BUFF[0] = CAT_MODE_USB;
else else
CAT_BUFF[0] = CAT_MODE_LSB; CAT_BUFF[0] = CAT_MODE_LSB;
}
else if (cwMode == 1)
{
CAT_BUFF[0] = CAT_MODE_CW;
}
else if (cwMode == 2)
{
CAT_BUFF[0] = CAT_MODE_CW;
}
if (CAT_BUFF[0] != 0) CAT_BUFF[0] = 1 << 5; if (CAT_BUFF[0] != 0) CAT_BUFF[0] = 1 << 5;
break; break;
@@ -412,7 +383,7 @@ void ReadEEPRom_FT817(byte fromType)
//7A 6 ? ? //7A 6 ? ?
//7A 7 SPL On/Off 0 = Off, 1 = On //7A 7 SPL On/Off 0 = Off, 1 = On
CAT_BUFF[0] = (splitOn ? 0xFF : 0x7F); CAT_BUFF[0] = (isSplitOn ? 0xFF : 0x7F);
break; break;
case 0xB3 : // case 0xB3 : //
CAT_BUFF[0] = 0x00; CAT_BUFF[0] = 0x00;
@@ -427,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;
@@ -499,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);
clearLine2(); printLine2("");
} }
break; break;
@@ -511,9 +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);
clearLine2(); printLine2("");
line2DisplayStatus = 0;
} }
break; break;
@@ -532,8 +502,8 @@ 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);
clearLine2(); printLine2("");
break; break;
case 0x62 : // case 0x62 : //
//5-0 CW Speed (4-60 WPM) (#21) From 0 to 38 (HEX) with 0 = 4 WPM and 38 = 60 WPM (1 WPM steps) //5-0 CW Speed (4-60 WPM) (#21) From 0 to 38 (HEX) with 0 = 4 WPM and 38 = 60 WPM (1 WPM steps)
@@ -541,8 +511,8 @@ 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);
clearLine2(); printLine2("");
break; break;
/* /*
@@ -678,6 +648,7 @@ 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;
@@ -299,11 +292,7 @@ void controlAutoCW(){
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ); printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ);
byte diplayAutoCWLine = 0; lcd.setCursor(0,0);
if ((displayOption1 & 0x01) == 0x01)
diplayAutoCWLine = 1;
lcd.setCursor(0, diplayAutoCWLine);
lcd.write(byteToChar(selectedCWTextIndex)); lcd.write(byteToChar(selectedCWTextIndex));
lcd.write(':'); lcd.write(':');
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0; isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;

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
@@ -84,7 +78,6 @@
#define PTT (A3) #define PTT (A3)
#define ANALOG_KEYER (A6) #define ANALOG_KEYER (A6)
#define ANALOG_SPARE (A7) #define ANALOG_SPARE (A7)
#define ANALOG_SMETER (A7) //by KD8CEC
/** /**
* The Raduino board is the size of a standard 16x2 LCD panel. It has three connectors: * The Raduino board is the size of a standard 16x2 LCD panel. It has three connectors:
@@ -151,36 +144,12 @@ int count = 0; //to generally count ticks, loops, etc
#define CW_SPEED 28 #define CW_SPEED 28
//AT328 has 1KBytes EEPROM //AT328 has 1KBytes EEPROM
#define CW_CAL 252
#define VFO_A_MODE 256 #define VFO_A_MODE 256
#define VFO_B_MODE 257 #define VFO_B_MODE 257
#define CW_DELAY 258 #define CW_DELAY 258
#define CW_START 259 #define CW_START 259
#define HAM_BAND_COUNT 260 //
#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)
//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)
#define CW_KEY_TYPE 358
#define DISPLAY_OPTION1 361 //Display Option1
#define DISPLAY_OPTION2 362 //Display Option2
//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 VERSION_ADDRESS 779 //check Firmware version #define VERSION_ADDRESS 779 //check Firmware version
//USER INFORMATION //USER INFORMATION
#define USER_CALLSIGN_KEY 780 //0x59 #define USER_CALLSIGN_KEY 780 //0x59
@@ -233,11 +202,11 @@ int count = 0; //to generally count ticks, loops, etc
char ritOn = 0; char ritOn = 0;
char vfoActive = VFO_A; char vfoActive = VFO_A;
int8_t meter_reading = 0; // a -1 on meter makes it invisible int8_t meter_reading = 0; // a -1 on meter makes it invisible
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier, cwmCarrier; 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
@@ -250,6 +219,7 @@ byte saveIntervalSec = 10; //second
unsigned long saveCheckTime = 0; unsigned long saveCheckTime = 0;
unsigned long saveCheckFreq = 0; unsigned long saveCheckFreq = 0;
bool isSplitOn = false;
byte cwDelayTime = 60; byte cwDelayTime = 60;
byte delayBeforeCWStartTime = 50; byte delayBeforeCWStartTime = 50;
@@ -258,27 +228,8 @@ byte sideTonePitch=0;
byte sideToneSub = 0; byte sideToneSub = 0;
//DialLock //DialLock
byte isDialLock = 0; //000000[0]vfoB [0]vfoA 0Bit : A, 1Bit : B byte isDialLock = 0;
byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop] byte isTxOff = 0;
byte arTuneStep[5];
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
byte displayOption1 = 0;
byte displayOption2 = 0;
//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;
byte cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
bool Iambic_Key = true;
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
unsigned char keyerControl = IAMBICB;
//Variables for auto cw mode //Variables for auto cw mode
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
@@ -298,13 +249,9 @@ byte userCallsignLength = 0; //7 : display callsign at system startup, 6~0 :
*/ */
boolean txCAT = false; //turned on if the transmitting due to a CAT command boolean txCAT = false; //turned on if the transmitting due to a CAT command
char inTx = 0; //it is set to 1 if in transmit mode (whatever the reason : cw, ptt or cat) char inTx = 0; //it is set to 1 if in transmit mode (whatever the reason : cw, ptt or cat)
char splitOn = 0; //working split, uses VFO B as the transmit frequency char splitOn = 0; //working split, uses VFO B as the transmit frequency, (NOT IMPLEMENTED YET)
char keyDown = 0; //in cw mode, denotes the carrier is being transmitted char keyDown = 0; //in cw mode, denotes the carrier is being transmitted
char isUSB = 0; //upper sideband was selected, this is reset to the default for the char isUSB = 0; //upper sideband was selected, this is reset to the default for the
char cwMode = 0; //compatible original source, and extend mode //if cwMode == 0, mode check : isUSB, cwMode > 0, mode Check : cwMode
//iscwMode = 0 : ssbmode, 1 :cwl, 2 : cwu, 3 : cwn (none tx)
//frequency when it crosses the frequency border of 10 MHz //frequency when it crosses the frequency border of 10 MHz
byte menuOn = 0; //set to 1 when the menu is being displayed, if a menu item sets it to zero, the menu is exited byte menuOn = 0; //set to 1 when the menu is being displayed, if a menu item sets it to zero, the menu is exited
unsigned long cwTimeout = 0; //milliseconds to go before the cw transmit line is released and the radio goes back to rx mode unsigned long cwTimeout = 0; //milliseconds to go before the cw transmit line is released and the radio goes back to rx mode
@@ -312,80 +259,11 @@ unsigned long dbgCount = 0; //not used now
unsigned char txFilter = 0; //which of the four transmit filters are in use unsigned char txFilter = 0; //which of the four transmit filters are in use
boolean modeCalibrate = false;//this mode of menus shows extended menus to calibrate the oscillators and choose the proper boolean modeCalibrate = false;//this mode of menus shows extended menus to calibrate the oscillators and choose the proper
//beat frequency //beat frequency
unsigned long beforeIdle_ProcessTime = 0; //for check Idle time
byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
/** /**
* Below are the basic functions that control the uBitx. Understanding the functions before * Below are the basic functions that control the uBitx. Understanding the functions before
* you start hacking around * you start hacking around
*/ */
//Ham Band
#define MAX_LIMIT_RANGE 10 //because limited eeprom size
byte useHamBandCount = 0; //0 use full range frequency
byte tuneTXType = 0; //0 : use full range, 1 : just Change Dial speed, 2 : just ham band change, but can general band by tune, 3 : only ham band (just support 0, 2 (0.26 version))
//100 : use full range but not TX on general band, 101 : just change dial speed but.. 2 : jut... but.. 3 : only ham band (just support 100, 102 (0.26 version))
unsigned int hamBandRange[MAX_LIMIT_RANGE][2]; // = //Khz because reduce use memory
//-1 : not found, 0 ~ 9 : Hamband index
char getIndexHambanBbyFreq(unsigned long f)
{
f = f / 1000;
for (byte i = 0; i < useHamBandCount; i++)
if (hamBandRange[i][0] <= f && f < hamBandRange[i][1])
return i;
return -1;
}
//when Band change step = just hamband
//moveDirection : 1 = next, -1 : prior
void setNextHamBandFreq(unsigned long f, char moveDirection)
{
unsigned long resultFreq = 0;
byte loadMode = 0;
char findedIndex = getIndexHambanBbyFreq(f);
if (findedIndex == -1) { //out of hamband
f = f / 1000;
for (byte i = 0; i < useHamBandCount -1; i++) {
if (hamBandRange[i][1] <= f && f < hamBandRange[i + 1][0]) {
findedIndex = i + moveDirection;
//return (unsigned long)(hamBandRange[i + 1][0]) * 1000;
}
} //end of for
}
else if (((moveDirection == 1) && (findedIndex < useHamBandCount -1)) || //Next
((moveDirection == -1) && (findedIndex > 0)) ) { //Prior
findedIndex += moveDirection;
}
else
findedIndex = -1;
if (findedIndex == -1)
findedIndex = (moveDirection == 1 ? 0 : useHamBandCount -1);
EEPROM.get(HAM_BAND_FREQS + 4 * findedIndex, resultFreq);
//loadMode = (byte)(resultFreq >> 30);
//resultFreq = resultFreq & 0x3FFFFFFF;
loadMode = (byte)(resultFreq >> 29);
resultFreq = resultFreq & 0x1FFFFFFF;
if ((resultFreq / 1000) < hamBandRange[(unsigned char)findedIndex][0] || (resultFreq / 1000) > hamBandRange[(unsigned char)findedIndex][1])
resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000;
setFrequency(resultFreq);
byteWithFreqToMode(loadMode);
}
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
if (bandIndex >= 0)
//EEPROM.put(HAM_BAND_FREQS + 4 * bandIndex, (f & 0x3FFFFFFF) | (mode << 30) );
EEPROM.put(HAM_BAND_FREQS + 4 * bandIndex, (f & 0x1FFFFFFF) | (mode << 29) );
}
/* /*
KD8CEC KD8CEC
When using the basic delay of the Arduino, the program freezes. When using the basic delay of the Arduino, the program freezes.
@@ -397,7 +275,7 @@ unsigned long delayBeforeTime = 0;
byte delay_background(unsigned delayTime, byte fromType){ //fromType : 4 autoCWKey -> Check Paddle byte delay_background(unsigned delayTime, byte fromType){ //fromType : 4 autoCWKey -> Check Paddle
delayBeforeTime = millis(); delayBeforeTime = millis();
while (millis() - delayBeforeTime <= delayTime) { while (millis() <= delayBeforeTime + delayTime) {
if (fromType == 4) if (fromType == 4)
{ {
@@ -475,12 +353,13 @@ 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);
if (cwMode == 0)
{
if (isUSB){ if (isUSB){
si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f); si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f);
si5351bx_setfreq(1, SECOND_OSC_USB); si5351bx_setfreq(1, SECOND_OSC_USB);
@@ -489,18 +368,6 @@ void setFrequency(unsigned long f){
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f); si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f);
si5351bx_setfreq(1, SECOND_OSC_LSB); si5351bx_setfreq(1, SECOND_OSC_LSB);
} }
}
else
{
if (cwMode == 1){ //CWL
si5351bx_setfreq(2, SECOND_OSC_LSB + cwmCarrier + f);
si5351bx_setfreq(1, SECOND_OSC_LSB);
}
else{ //CWU
si5351bx_setfreq(2, SECOND_OSC_USB - cwmCarrier + f);
si5351bx_setfreq(1, SECOND_OSC_USB);
}
}
frequency = f; frequency = f;
} }
@@ -512,13 +379,9 @@ void setFrequency(unsigned long f){
*/ */
void startTx(byte txMode, byte isDisplayUpdate){ void startTx(byte txMode, byte isDisplayUpdate){
//Check Hamband only TX //Not found Hamband index by now frequency unsigned long tx_freq = 0;
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
//no message
return;
}
if ((isTxType & 0x01) != 0x01) if (isTxOff != 1)
digitalWrite(TX_RX, 1); digitalWrite(TX_RX, 1);
inTx = 1; inTx = 1;
@@ -528,21 +391,6 @@ void startTx(byte txMode, byte isDisplayUpdate){
ritRxFrequency = frequency; ritRxFrequency = frequency;
setFrequency(ritTxFrequency); setFrequency(ritTxFrequency);
} }
else if (splitOn == 1) {
if (vfoActive == VFO_B) {
vfoActive = VFO_A;
frequency = vfoA;
byteToMode(vfoA_mode);
}
else if (vfoActive == VFO_A){
vfoActive = VFO_B;
frequency = vfoB;
byteToMode(vfoB_mode);
}
setFrequency(frequency);
} //end of else
if (txMode == TX_CW){ if (txMode == TX_CW){
//turn off the second local oscillator and the bfo //turn off the second local oscillator and the bfo
@@ -552,23 +400,11 @@ void startTx(byte txMode, byte isDisplayUpdate){
//shif the first oscillator to the tx frequency directly //shif the first oscillator to the tx frequency directly
//the key up and key down will toggle the carrier unbalancing //the key up and key down will toggle the carrier unbalancing
//the exact cw frequency is the tuned frequency + sidetone //the exact cw frequency is the tuned frequency + sidetone
if (cwMode == 0)
{
if (isUSB) if (isUSB)
si5351bx_setfreq(2, frequency + sideTone); si5351bx_setfreq(2, frequency + sideTone);
else else
si5351bx_setfreq(2, frequency - sideTone); si5351bx_setfreq(2, frequency - sideTone);
} }
else if (cwMode == 1) //CWL
{
si5351bx_setfreq(2, frequency - sideTone);
}
else //CWU
{
si5351bx_setfreq(2, frequency + sideTone);
}
}
//reduce latency time when begin of CW mode //reduce latency time when begin of CW mode
if (isDisplayUpdate == 1) if (isDisplayUpdate == 1)
@@ -579,28 +415,10 @@ void stopTx(){
inTx = 0; inTx = 0;
digitalWrite(TX_RX, 0); //turn off the tx digitalWrite(TX_RX, 0); //turn off the tx
if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
if (ritOn) if (ritOn)
setFrequency(ritRxFrequency); setFrequency(ritRxFrequency);
else if (splitOn == 1) {
//vfo Change
if (vfoActive == VFO_B){
vfoActive = VFO_A;
frequency = vfoA;
byteToMode(vfoA_mode);
}
else if (vfoActive == VFO_A){
vfoActive = VFO_B;
frequency = vfoB;
byteToMode(vfoB_mode);
}
setFrequency(frequency);
} //end of else
else else
setFrequency(frequency); setFrequency(frequency);
@@ -652,6 +470,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;
@@ -670,58 +490,54 @@ 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 (isDialLock == 1)
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02)))
return; return;
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;
@@ -732,11 +548,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;
@@ -792,41 +611,12 @@ void storeFrequencyAndMode(byte saveType)
void initSettings(){ void initSettings(){
//read the settings from the eeprom and restore them //read the settings from the eeprom and restore them
//if the readings are off, then set defaults //if the readings are off, then set defaults
//for original source Section ===========================
EEPROM.get(MASTER_CAL, calibration); EEPROM.get(MASTER_CAL, calibration);
EEPROM.get(USB_CAL, usbCarrier); EEPROM.get(USB_CAL, usbCarrier);
EEPROM.get(VFO_A, vfoA); EEPROM.get(VFO_A, vfoA);
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 =============================
//ID & Version Check from EEProm
//if found different firmware, erase eeprom (32
#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.
if (EEPROM.read(FIRMWAR_ID_ADDR) != 0x59 ||
EEPROM.read(FIRMWAR_ID_ADDR + 1) != 0x58 ||
EEPROM.read(FIRMWAR_ID_ADDR + 2) != 0x68 ) {
printLineF(1, F("Init EEProm..."));
//initial all eeprom
for (unsigned int i = 32; i < 1024; i++) //protect Master_cal, usb_cal
EEPROM.write(i, 0);
//Write Firmware ID
EEPROM.write(FIRMWAR_ID_ADDR, 0x59);
EEPROM.write(FIRMWAR_ID_ADDR + 1, 0x58);
EEPROM.write(FIRMWAR_ID_ADDR + 2, 0x68);
}
//Version Write for Memory Management Software
if (EEPROM.read(VERSION_ADDRESS) != VERSION_NUM)
EEPROM.write(VERSION_ADDRESS, VERSION_NUM);
EEPROM.get(CW_CAL, cwmCarrier);
//for Save VFO_A_MODE to eeprom //for Save VFO_A_MODE to eeprom
//0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM //0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM
@@ -838,130 +628,14 @@ void initSettings(){
//CW interval between TX and CW Start //CW interval between TX and CW Start
EEPROM.get(CW_START, delayBeforeCWStartTime); EEPROM.get(CW_START, delayBeforeCWStartTime);
EEPROM.get(CW_KEY_TYPE, cwKeyType);
if (cwKeyType > 2)
cwKeyType = 0;
if (cwKeyType == 0)
Iambic_Key = false;
else
{
Iambic_Key = true;
if (cwKeyType = 1)
keyerControl &= ~IAMBICB;
else
keyerControl |= IAMBICB;
}
EEPROM.get(DISPLAY_OPTION1, displayOption1);
EEPROM.get(DISPLAY_OPTION2, displayOption2);
//User callsign information //User callsign information
if (EEPROM.read(USER_CALLSIGN_KEY) == 0x59) if (EEPROM.read(USER_CALLSIGN_KEY) == 0x59)
userCallsignLength = EEPROM.read(USER_CALLSIGN_LEN); //MAXIMUM 18 LENGTH userCallsignLength = EEPROM.read(USER_CALLSIGN_LEN); //MAXIMUM 18 LENGTH
//Ham Band Count //Version Write for Memory Management Software
EEPROM.get(HAM_BAND_COUNT, useHamBandCount); if (EEPROM.read(VERSION_ADDRESS) != VERSION_NUM)
EEPROM.get(TX_TUNE_TYPE, tuneTXType); EEPROM.write(VERSION_ADDRESS, VERSION_NUM);
byte findedValidValueCount = 0;
//Read band Information
for (byte i = 0; i < useHamBandCount; i++) {
unsigned int tmpReadValue = 0;
EEPROM.get(HAM_BAND_RANGE + 4 * i, tmpReadValue);
hamBandRange[i][0] = tmpReadValue;
if (tmpReadValue > 1 && tmpReadValue < 55000)
findedValidValueCount++;
EEPROM.get(HAM_BAND_RANGE + 4 * i + 2, 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] = 7300; //region 1
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;
@@ -972,13 +646,9 @@ 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;
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
cwmCarrier = 11995000l;
if (vfoA > 35000000l || 3500000l > vfoA) { if (vfoA > 35000000l || 3500000l > vfoA) {
vfoA = 7150000l; vfoA = 7150000l;
vfoA_mode = 2; vfoA_mode = 2;
@@ -988,9 +658,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;
@@ -1026,7 +695,6 @@ void initPorts(){
pinMode(PTT, INPUT_PULLUP); pinMode(PTT, INPUT_PULLUP);
pinMode(ANALOG_KEYER, INPUT_PULLUP); pinMode(ANALOG_KEYER, INPUT_PULLUP);
pinMode(ANALOG_SMETER, INPUT); //by KD8CEC
pinMode(CW_TONE, OUTPUT); pinMode(CW_TONE, OUTPUT);
digitalWrite(CW_TONE, 0); digitalWrite(CW_TONE, 0);
@@ -1047,50 +715,131 @@ void initPorts(){
void setup() void setup()
{ {
/*
//Init EEProm for Fault EEProm TEST and Factory Reset //Init EEProm for Fault EEProm TEST and Factory Reset
//please remove remark for others. /*
//for (int i = 0; i < 1024; i++) for (int i = 0; i < 1024; i++)
for (int i = 16; i < 1024; i++) //protect Master_cal, usb_cal EEPROM.write(i, 0);
EEPROM.write(i, 0xFF);
lcd.begin(16, 2);
printLineF(1, F("Complete Erase"));
sleep(1000);
//while(1);
//end section of test
*/ */
//Serial.begin(9600); //Serial.begin(9600);
lcd.begin(16, 2); lcd.begin(16, 2);
printLineF(1, F("CECBT v0.33"));
Init_Cat(38400, SERIAL_8N1); Init_Cat(38400, SERIAL_8N1);
initMeter(); //not used in this build initMeter(); //not used in this build
initSettings(); initSettings();
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) { printLineF(1, F("CECBT v0.25"));
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80))
{
userCallsignLength = userCallsignLength & 0x7F; userCallsignLength = userCallsignLength & 0x7F;
printLineFromEEPRom(0, 0, 0, userCallsignLength -1); //eeprom to lcd use offset (USER_CALLSIGN_DAT) printLineFromEEPRom(0, 0, 0, userCallsignLength -1); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
delay(500);
} }
else { else
{
printLineF(0, F("uBITX v0.20")); printLineF(0, F("uBITX v0.20"));
delay(500); delay_background(500, 0);
clearLine2(); printLine2("");
} }
initPorts(); initPorts();
byteToMode(vfoA_mode);
initOscillators(); initOscillators();
frequency = vfoA; frequency = vfoA;
saveCheckFreq = frequency; //for auto save frequency saveCheckFreq = frequency; //for auto save frequency
byteToMode(vfoA_mode);
setFrequency(vfoA); setFrequency(vfoA);
updateDisplay(); updateDisplay();
if (btnDown()) if (btnDown())
factory_alignment(); factory_alignment();
/*
//This is for auto key test
EEPROM.put(CW_AUTO_MAGIC_KEY, 0x73); //MAGIC KEY
EEPROM.put(CW_AUTO_COUNT, 3); //WORD COUNT
EEPROM.put(CW_AUTO_DATA + 0, 6); // 0 word begin postion / CQCQ TEST K
EEPROM.put(CW_AUTO_DATA + 1, 33); // 0 word end postion / CQCQ TEST K
EEPROM.put(CW_AUTO_DATA + 2, 34); //1 word begin position / LOL LOL
EEPROM.put(CW_AUTO_DATA + 3, 40); //1 word end position / LOL LOL
EEPROM.put(CW_AUTO_DATA + 4, 41); //2 word begin position / /?![]789
EEPROM.put(CW_AUTO_DATA + 5, 48); //2 word end position / /?![]789
EEPROM.put(CW_AUTO_DATA + 6, 'C'); //
EEPROM.put(CW_AUTO_DATA + 7, 'Q'); //
EEPROM.put(CW_AUTO_DATA + 8, 'C'); //
EEPROM.put(CW_AUTO_DATA + 9, 'Q'); //
EEPROM.put(CW_AUTO_DATA + 10, ' '); //
EEPROM.put(CW_AUTO_DATA + 11, 'D'); //
EEPROM.put(CW_AUTO_DATA + 12, 'E'); //
EEPROM.put(CW_AUTO_DATA + 13, ' '); //
EEPROM.put(CW_AUTO_DATA + 14, 'K'); //
EEPROM.put(CW_AUTO_DATA + 15, 'D'); //
EEPROM.put(CW_AUTO_DATA + 16, '8'); //
EEPROM.put(CW_AUTO_DATA + 17, 'C'); //
EEPROM.put(CW_AUTO_DATA + 18, 'E'); //
EEPROM.put(CW_AUTO_DATA + 19, 'C'); //
EEPROM.put(CW_AUTO_DATA + 20, ' '); //
EEPROM.put(CW_AUTO_DATA + 21, 'E'); //
EEPROM.put(CW_AUTO_DATA + 22, 'M'); //
EEPROM.put(CW_AUTO_DATA + 23, '3'); //
EEPROM.put(CW_AUTO_DATA + 24, '7'); //
EEPROM.put(CW_AUTO_DATA + 25, ' '); //
EEPROM.put(CW_AUTO_DATA + 26, 'D'); //
EEPROM.put(CW_AUTO_DATA + 27, 'E'); //
EEPROM.put(CW_AUTO_DATA + 28, ' '); //
EEPROM.put(CW_AUTO_DATA + 29, 'C'); //
EEPROM.put(CW_AUTO_DATA + 30, 'E'); //
EEPROM.put(CW_AUTO_DATA + 31, 'C'); //
EEPROM.put(CW_AUTO_DATA + 32, ' '); //
EEPROM.put(CW_AUTO_DATA + 33, 'K'); //
*/
/*
EEPROM.put(CW_AUTO_DATA + 34, '<'); //
EEPROM.put(CW_AUTO_DATA + 35, ' '); //
EEPROM.put(CW_AUTO_DATA + 36, '>'); //
EEPROM.put(CW_AUTO_DATA + 37, ' '); //
EEPROM.put(CW_AUTO_DATA + 38, '7'); //
EEPROM.put(CW_AUTO_DATA + 39, '3'); //
EEPROM.put(CW_AUTO_DATA + 40, 'K'); //
EEPROM.put(CW_AUTO_DATA + 41, 'C'); //
EEPROM.put(CW_AUTO_DATA + 42, 'Q'); //
EEPROM.put(CW_AUTO_DATA + 43, ' '); //
EEPROM.put(CW_AUTO_DATA + 44, '>'); // start "
EEPROM.put(CW_AUTO_DATA + 45, ' '); // end "
EEPROM.put(CW_AUTO_DATA + 46, '>'); //
EEPROM.put(CW_AUTO_DATA + 47, ' '); //
EEPROM.put(CW_AUTO_DATA + 48, 'K'); //
*/
/*
//This is for auto key test2
//USER CALL SIGN
EEPROM.put(USER_CALLSIGN_KEY, 0x59); //MAGIC KEY
//EEPROM.put(USER_CALLSIGN_LEN, 10); //WORD COUNT
EEPROM.put(USER_CALLSIGN_LEN, 10 + 0x80); //WORD COUNT
EEPROM.put(USER_CALLSIGN_DAT + 1, 'K'); //
EEPROM.put(USER_CALLSIGN_DAT + 2, 'D'); //
EEPROM.put(USER_CALLSIGN_DAT + 3, '8'); //
EEPROM.put(USER_CALLSIGN_DAT + 4, 'C'); //
EEPROM.put(USER_CALLSIGN_DAT + 5, 'E'); //
EEPROM.put(USER_CALLSIGN_DAT + 6, 'C'); //
EEPROM.put(USER_CALLSIGN_DAT + 7, '/'); //
EEPROM.put(USER_CALLSIGN_DAT + 8, 'A'); //
EEPROM.put(USER_CALLSIGN_DAT + 9, 'B'); //
EEPROM.put(USER_CALLSIGN_DAT + 10, 'C'); //
//CW QSO CALLSIGN
EEPROM.put(CW_STATION_LEN, 6); //
EEPROM.put(CW_STATION_LEN - 6 + 0 , 'A'); //
EEPROM.put(CW_STATION_LEN - 6 + 1 , 'B'); //
EEPROM.put(CW_STATION_LEN - 6 + 2 , '1'); //
EEPROM.put(CW_STATION_LEN - 6 + 3 , 'C'); //
EEPROM.put(CW_STATION_LEN - 6 + 4 , 'D'); //
EEPROM.put(CW_STATION_LEN - 6 + 5 , 'E'); //
*/
} }
@@ -1150,13 +899,8 @@ void loop(){
if (ritOn) if (ritOn)
doRIT(); doRIT();
else else
doTuningWithThresHold(); doTuning();
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 500) {
idle_process();
beforeIdle_ProcessTime = millis();
} }
} //end of check TX Status
//we check CAT after the encoder as it might put the radio into TX //we check CAT after the encoder as it might put the radio into TX
Check_Cat(inTx? 1 : 0); Check_Cat(inTx? 1 : 0);

View File

@@ -14,7 +14,6 @@ void btnWaitForClick(){
void factory_alignment(){ void factory_alignment(){
factoryCalibration(1); factoryCalibration(1);
line2DisplayStatus = 1;
if (calibration == 0){ if (calibration == 0){
printLine2("Setup Aborted"); printLine2("Setup Aborted");
@@ -37,7 +36,6 @@ void factory_alignment(){
printLine2("#3:Test 3.5MHz"); printLine2("#3:Test 3.5MHz");
cwMode = 0;
isUSB = false; isUSB = false;
setFrequency(3500000l); setFrequency(3500000l);
updateDisplay(); updateDisplay();
@@ -60,7 +58,6 @@ void factory_alignment(){
btnWaitForClick(); btnWaitForClick();
printLine2("#5:Test 14MHz"); printLine2("#5:Test 14MHz");
cwMode = 0;
isUSB = true; isUSB = true;
setFrequency(14000000l); setFrequency(14000000l);
updateDisplay(); updateDisplay();
@@ -82,7 +79,6 @@ void factory_alignment(){
printLine2("Alignment done"); printLine2("Alignment done");
delay(1000); delay(1000);
cwMode = 0;
isUSB = false; isUSB = false;
setFrequency(7150000l); setFrequency(7150000l);
updateDisplay(); updateDisplay();

View File

@@ -1,165 +0,0 @@
/*************************************************************************
KD8CEC's uBITX Idle time Processing
Functions that run at times that do not affect TX, CW, and CAT
It is called in 1/10 time unit.
-----------------------------------------------------------------------------
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
byte line2Buffer[16];
//KD8CEC 200Hz ST
//L14.150 200Hz ST
//U14.150 +150khz
int freqScrollPosition = 0;
//Example Line2 Optinal Display
void updateLine2Buffer()
{
unsigned long tmpFreq = 0;
if (ritOn)
{
line2Buffer[0] = 'R';
line2Buffer[1] = 'i';
line2Buffer[2] = 't';
line2Buffer[3] = 'T';
line2Buffer[4] = 'X';
line2Buffer[5] = ':';
//display frequency
tmpFreq = ritTxFrequency;
for (int i = 15; i >= 6; i--) {
if (tmpFreq > 0) {
if (i == 12 || i == 8) line2Buffer[i] = '.';
else {
line2Buffer[i] = tmpFreq % 10 + 0x30;
tmpFreq /= 10;
}
}
else
line2Buffer[i] = ' ';
}
return;
}
if (vfoActive == VFO_B)
{
tmpFreq = vfoA;
//line2Buffer[0] = 'A';
}
else
{
tmpFreq = vfoB;
//line2Buffer[0] = 'B';
}
// EXAMPLE 1 & 2
//U14.150.100
//display frequency
for (int i = 9; i >= 0; i--) {
if (tmpFreq > 0) {
if (i == 2 || i == 6) line2Buffer[i] = '.';
else {
line2Buffer[i] = tmpFreq % 10 + 0x30;
tmpFreq /= 10;
}
}
else
line2Buffer[i] = ' ';
}
//EXAMPLE #1
if ((displayOption1 & 0x04) == 0x00)
line2Buffer[6] = 'k';
else
{
//example #2
if (freqScrollPosition++ > 18)
{
line2Buffer[6] = 'k';
if (freqScrollPosition > 25)
freqScrollPosition = -1;
}
else
{
line2Buffer[10] = 'H';
line2Buffer[11] = 'z';
if (freqScrollPosition < 7)
{
for (int i = 11; i >= 0; i--)
if (i - (7 - freqScrollPosition) >= 0)
line2Buffer[i] = line2Buffer[i - (7 - freqScrollPosition)];
else
line2Buffer[i] = ' ';
}
else
{
for (int i = 0; i < 11; i++)
if (i + (freqScrollPosition - 7) <= 11)
line2Buffer[i] = line2Buffer[i + (freqScrollPosition - 7)];
else
line2Buffer[i] = ' ';
}
}
}
line2Buffer[7] = ' ';
//Step
byte tmpStep = arTuneStep[tuneStepIndex -1];
for (int i = 10; i >= 8; i--) {
if (tmpStep > 0) {
line2Buffer[i] = tmpStep % 10 + 0x30;
tmpStep /= 10;
}
else
line2Buffer[i] = ' ';
}
line2Buffer[11] = 'H';
line2Buffer[12] = 'z';
line2Buffer[13] = ' ';
//if (
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
if (cwKeyType == 0)
{
line2Buffer[14] = 'S';
line2Buffer[15] = 'T';
}
else if (cwKeyType == 1)
{
line2Buffer[14] = 'I';
line2Buffer[15] = 'A';
}
else
{
line2Buffer[14] = 'I';
line2Buffer[15] = 'B';
}
}
void idle_process()
{
//space for user graphic display
if (menuOn == 0)
{
//if line2DisplayStatus == 0 <-- this condition is clear Line, you can display any message
if (line2DisplayStatus == 0 || (((displayOption1 & 0x04) == 0x04) && line2DisplayStatus == 2)) {
updateLine2Buffer();
printLine2(line2Buffer);
line2DisplayStatus = 2;
}
}
}

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,181 +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;
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;
@@ -281,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;
} }
@@ -344,6 +184,3 @@ void cwKeyer(){
delay(cwSpeed); delay(cwSpeed);
} }
} }
*/

View File

@@ -13,11 +13,13 @@
#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 band;
byte btnPressCount = 0; unsigned long offset;
// band = frequency/1000000l;
// offset = frequency % 1000000l;
if (!btn){ if (!btn){
printLineF2(F("Band Select?")); printLineF2(F("Band Select?"));
@@ -29,32 +31,6 @@ void menuBand(int btn){
while (btnDown()) { while (btnDown()) {
delay(50); delay(50);
Check_Cat(0); //To prevent disconnections Check_Cat(0); //To prevent disconnections
if (btnPressCount++ > 20) {
btnPressCount = 0;
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
tuneTXType = 0;
printLineF2(F("Full range mode"));
}
else {
tuneTXType = 2;
printLineF2(F("Ham band mode"));
}
delay_background(1000, 0);
printLine2ClearAndUpdate();
printLineF2(F("Press to confirm"));
}
}
char currentBandIndex = -1;
//Save Band Information
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
//Get Now Band Index
currentBandIndex = getIndexHambanBbyFreq(frequency);
if (currentBandIndex >= 0) {
//Save Frequency to Band Frequncy Record
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
}
} }
delay(50); delay(50);
@@ -74,35 +50,16 @@ void menuBand(int btn){
else else
isUSB = false; isUSB = false;
setFrequency(((unsigned long)band * 1000000l) + offset); */ setFrequency(((unsigned long)band * 1000000l) + offset); */
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
if (knob < 0) {
if (stepChangeCount-- < -3) {
setNextHamBandFreq(frequency, -1); //Prior Band
stepChangeCount = 0;
}
}
else if (knob > 0) {
if (stepChangeCount++ > 3) {
setNextHamBandFreq(frequency, 1); //Next Band
stepChangeCount = 0;
}
}
}
else { //original source
if (knob < 0 && frequency > 3000000l) if (knob < 0 && frequency > 3000000l)
setFrequency(frequency - 200000l); setFrequency(frequency - 200000l);
if (knob > 0 && frequency < 30000000l) if (knob > 0 && frequency < 30000000l)
setFrequency(frequency + 200000l); setFrequency(frequency + 200000l);
if (frequency > 10000000l) if (frequency > 10000000l)
isUSB = true; isUSB = true;
else else
isUSB = false; isUSB = false;
}
updateDisplay(); updateDisplay();
} }
delay(20); delay(20);
Check_Cat(0); //To prevent disconnections Check_Cat(0); //To prevent disconnections
} }
@@ -118,61 +75,22 @@ 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:CWL, 5:CWU, 6:FM
byte modeToByte(){ byte modeToByte(){
if (cwMode == 0)
{
if (isUSB) if (isUSB)
return 3; return 3;
else else
return 2; return 2;
} }
else if (cwMode == 1)
{
return 4;
}
else
{
return 5;
}
}
//Convert Number to Mode by KD8CEC
void byteToMode(byte modeValue){ void byteToMode(byte modeValue){
if (modeValue == 4)
cwMode = 1;
else if (modeValue == 5)
cwMode = 2;
else
{
cwMode = 0;
if (modeValue == 3) if (modeValue == 3)
isUSB = 1; isUSB = 1;
else else
isUSB = 0; isUSB = 0;
} }
}
//Convert Number to Mode by KD8CEC void menuVfoToggle(int btn)
void byteWithFreqToMode(byte modeValue){
if (modeValue == 4)
cwMode = 1;
else if (modeValue == 5)
cwMode = 2;
else {
cwMode = 0;
if (modeValue == 3)
isUSB = 1;
else if (modeValue == 0) //Not Set
isUSB = (frequency > 10000000l) ? true : false;
else
isUSB = 0;
}
}
//VFO Toggle and save VFO Information, modified by KD8CEC
void menuVfoToggle(int btn, char isUseDelayTime)
{ {
if (!btn){ if (!btn){
if (vfoActive == VFO_A) if (vfoActive == VFO_A)
@@ -206,9 +124,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;
@@ -238,7 +155,6 @@ void menuRitToggle(int btn){
} }
} }
/*
void menuSidebandToggle(int btn){ void menuSidebandToggle(int btn){
if (!btn){ if (!btn){
if (isUSB == true) if (isUSB == true)
@@ -247,7 +163,6 @@ void menuSidebandToggle(int btn){
printLineF2(F("Select USB?")); printLineF2(F("Select USB?"));
} }
else { else {
cwMode = 0;
if (isUSB == true){ if (isUSB == true){
isUSB = false; isUSB = false;
printLineF2(F("LSB Selected")); printLineF2(F("LSB Selected"));
@@ -262,334 +177,21 @@ void menuSidebandToggle(int btn){
menuOn = 0; menuOn = 0;
} }
} }
*/
void menuSelectMode(int btn){
int knob = 0;
int selectModeType = 0;
int beforeMode = 0;
int moveStep = 0;
void menuTxOnOff(int btn){
if (!btn){ if (!btn){
printLineF2(F("Select Mode?")); if (isTxOff == 0)
}
else {
delay_background(500, 0);
//LSB, USB, CWL, CWU
if (cwMode == 0 && isUSB == 0)
selectModeType = 0;
else if (cwMode == 0 && isUSB == 1)
selectModeType = 1;
else if (cwMode == 1)
selectModeType = 2;
else
selectModeType = 3;
beforeMode = selectModeType;
while(!btnDown() && digitalRead(PTT) == HIGH){
//Display Mode Name
if (selectModeType == 0)
printLineF1(F("LSB"));
else if (selectModeType == 1)
printLineF1(F("USB"));
else if (selectModeType == 2)
printLineF1(F("CWL"));
else if (selectModeType == 3)
printLineF1(F("CWU"));
knob = enc_read();
if (knob != 0)
{
moveStep += (knob > 0 ? 1 : -1);
if (moveStep < -3) {
if (selectModeType > 0)
selectModeType--;
moveStep = 0;
}
else if (moveStep > 3) {
if (selectModeType < 3)
selectModeType++;
moveStep = 0;
}
}
Check_Cat(0); //To prevent disconnections
}
if (beforeMode != selectModeType) {
printLineF1(F("Changed Mode"));
if (selectModeType == 0) {
cwMode = 0; isUSB = 0;
}
else if (selectModeType == 1) {
cwMode = 0; isUSB = 1;
}
else if (selectModeType == 2) {
cwMode = 1;
}
else if (selectModeType == 3) {
cwMode = 2;
}
//Save Frequency & Mode Information
if (vfoActive == VFO_A)
{
vfoA = frequency;
vfoA_mode = modeToByte();
storeFrequencyAndMode(1);
}
else
{
vfoB = frequency;
vfoB_mode = modeToByte();
storeFrequencyAndMode(2);
}
}
if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
setFrequency(frequency);
delay_background(500, 0);
printLine2ClearAndUpdate();
menuOn = 0;
}
}
void menuSplitOnOff(int btn){
if (!btn){
if (splitOn == 0)
printLineF2(F("Split On?"));
else
printLineF2(F("Split Off?"));
}
else {
if (splitOn == 1){
splitOn = 0;
printLineF2(F("Split Off!"));
}
else {
splitOn = 1;
if (ritOn == 1)
ritOn = 0;
printLineF2(F("Split On!"));
}
delay_background(500, 0);
printLine2ClearAndUpdate();
menuOn = 0;
}
}
/*
//Select CW Key Type by KD8CEC
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
void menuSetupKeyType(int btn){
int knob = 0;
int selectedKeyType = 0;
int moveStep = 0;
if (!btn && digitalRead(PTT) == HIGH){
printLineF2(F("Change Key Type?"));
}
else {
printLineF2(F("Press PTT to set"));
delay_background(500, 0);
selectedKeyType = cwKeyType;
while(!btnDown() && digitalRead(PTT) == HIGH){
//Display Key Type
if (selectedKeyType == 0)
printLineF1(F("Straight"));
else if (selectedKeyType == 1)
printLineF1(F("IAMBICA"));
else if (selectedKeyType == 2)
printLineF1(F("IAMBICB"));
knob = enc_read();
if (knob != 0)
{
moveStep += (knob > 0 ? 1 : -1);
if (moveStep < -3) {
if (selectedKeyType > 0)
selectedKeyType--;
moveStep = 0;
}
else if (moveStep > 3) {
if (selectedKeyType < 2)
selectedKeyType++;
moveStep = 0;
}
}
Check_Cat(0); //To prevent disconnections
}
//save the setting
if (digitalRead(PTT) == LOW){
printLineF2(F("CW Key Type set!"));
cwKeyType = selectedKeyType;
EEPROM.put(CW_KEY_TYPE, cwKeyType);
if (cwKeyType == 0)
Iambic_Key = false;
else
{
Iambic_Key = true;
if (cwKeyType = 1)
keyerControl &= ~IAMBICB;
else
keyerControl |= IAMBICB;
}
delay_background(2000, 0);
}
printLine2ClearAndUpdate();
menuOn = 0;
}
}
//Analog pin monitoring with CW Key and function keys connected.
//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)
printLineF2(F("TX OFF?")); printLineF2(F("TX OFF?"));
else else
printLineF2(F("TX ON?")); printLineF2(F("TX ON?"));
} }
else { else {
if ((isTxType & optionType) == 0){ if (isTxOff == 0){
isTxType |= optionType; isTxOff = 1;
printLineF2(F("TX OFF!")); printLineF2(F("TX OFF!"));
} }
else { else {
isTxType &= ~(optionType); isTxOff = 0;
printLineF2(F("TX ON!")); printLineF2(F("TX ON!"));
} }
delay_background(500, 0); delay_background(500, 0);
@@ -634,7 +236,7 @@ void menuExit(int btn){
} }
} }
void menuCWSpeed(int btn){ int menuCWSpeed(int btn){
int knob = 0; int knob = 0;
int wpm; int wpm;
@@ -689,8 +291,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;
@@ -713,8 +314,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;
@@ -762,8 +362,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;
@@ -826,8 +425,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())
@@ -836,12 +437,12 @@ 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;
cwMode = 0;
isUSB = true; isUSB = true;
//turn off the second local oscillator and the bfo //turn off the second local oscillator and the bfo
@@ -894,13 +495,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,"));
@@ -959,6 +560,7 @@ void menuSetupCalibration(int btn){
menuOn = 0; menuOn = 0;
} }
void printCarrierFreq(unsigned long freq){ void printCarrierFreq(unsigned long freq){
memset(c, 0, sizeof(c)); memset(c, 0, sizeof(c));
@@ -970,11 +572,10 @@ void printCarrierFreq(unsigned long freq){
strcat(c, "."); strcat(c, ".");
strncat(c, &b[2], 3); strncat(c, &b[2], 3);
strcat(c, "."); strcat(c, ".");
strncat(c, &b[5], 3); strncat(c, &b[5], 1);
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;
@@ -989,8 +590,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);
@@ -1022,72 +622,12 @@ void menuSetupCarrier(int btn){
else else
usbCarrier = prevCarrier; usbCarrier = prevCarrier;
//si5351bx_setfreq(0, usbCarrier); si5351bx_setfreq(0, usbCarrier);
if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
setFrequency(frequency); setFrequency(frequency);
printLine2ClearAndUpdate(); printLine2ClearAndUpdate();
menuOn = 0; menuOn = 0;
} }
//Append by KD8CEC
void menuSetupCWCarrier(int btn){
int knob = 0;
unsigned long prevCarrier;
if (!btn){
printLineF2(F("Set CW RX BFO"));
return;
}
prevCarrier = cwmCarrier;
printLineF1(F("PTT to confirm. "));
delay_background(1000, 0);
si5351bx_setfreq(0, cwmCarrier);
printCarrierFreq(cwmCarrier);
//disable all clock 1 and clock 2
while (digitalRead(PTT) == HIGH && !btnDown())
{
knob = enc_read();
if (knob > 0)
cwmCarrier -= 5;
else if (knob < 0)
cwmCarrier += 5;
else
continue; //don't update the frequency or the display
si5351bx_setfreq(0, cwmCarrier);
printCarrierFreq(cwmCarrier);
Check_Cat(0); //To prevent disconnections
delay(100);
}
//save the setting
if (digitalRead(PTT) == LOW){
printLineF2(F("Carrier set!"));
EEPROM.put(CW_CAL, cwmCarrier);
delay_background(1000, 0);
}
else
cwmCarrier = prevCarrier;
if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
else
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
setFrequency(frequency);
printLine2ClearAndUpdate();
menuOn = 0;
}
//Modified by KD8CEC
void menuSetupCwTone(int btn){ void menuSetupCwTone(int btn){
int knob = 0; int knob = 0;
int prev_sideTone; int prev_sideTone;
@@ -1136,16 +676,12 @@ 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) isDialLock = tmpLock;
isDialLock |= (vfoActive == VFO_A ? 0x01 : 0x02);
else
isDialLock &= ~(vfoActive == VFO_A ? 0x01 : 0x02);
if (fromMode == 2 || fromMode == 3) return; if (fromMode == 2 || fromMode == 3) return;
if (tmpLock == 1) if (isDialLock == 1)
printLineF2(F("Dial Lock ON")); printLineF2(F("Dial Lock ON"));
else else
printLineF2(F("Dial Lock OFF")); printLineF2(F("Dial Lock OFF"));
@@ -1154,88 +690,28 @@ 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 setDialLock(isDialLock == 1 ? 0 : 1, 0); //Reverse Dialo lock
if (vfoActive == VFO_A)
setDialLock((isDialLock & 0x01) == 0x01 ? 0 : 1, 0); //Reverse Dial lock
else
setDialLock((isDialLock & 0x02) == 0x02 ? 0 : 1, 0); //Reverse Dial lock
return; return;
} }
} }
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){
@@ -1243,25 +719,22 @@ void doMenu(){
btnState = btnDown(); btnState = btnDown();
if (i > 0){ if (i > 0){
if (modeCalibrate && select + i < 190) 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)
menuSelectMode(btnState); menuSidebandToggle(btnState);
else if (select < 50) else if (select < 50)
menuCWSpeed(btnState); menuCWSpeed(btnState);
else if (select < 60) else if (select < 60)
@@ -1275,22 +748,14 @@ void doMenu(){
else if (select < 100 && modeCalibrate) else if (select < 100 && modeCalibrate)
menuSetupCarrier(btnState); //lsb menuSetupCarrier(btnState); //lsb
else if (select < 110 && modeCalibrate) else if (select < 110 && modeCalibrate)
menuSetupCWCarrier(btnState); //lsb
else if (select < 120 && modeCalibrate)
menuSetupCwTone(btnState); menuSetupCwTone(btnState);
else if (select < 130 && modeCalibrate) else if (select < 120 && modeCalibrate)
menuSetupCwDelay(btnState); menuSetupCwDelay(btnState);
else if (select < 140 && modeCalibrate) else if (select < 130 && modeCalibrate)
menuSetupTXCWInterval(btnState); menuSetupTXCWInterval(btnState);
else if (select < 140 && modeCalibrate)
menuTxOnOff(btnState);
else if (select < 150 && modeCalibrate) else if (select < 150 && modeCalibrate)
menuSetupKeyType(btnState);
else if (select < 160 && modeCalibrate)
menuADCMonitor(btnState);
else if (select < 170 && modeCalibrate)
menuSplitOnOff(btnState); //SplitOn / off
else if (select < 180 && modeCalibrate)
menuTxOnOff(btnState, 0x01); //TX OFF / ON
else if (select < 190 && 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
@@ -109,11 +109,7 @@ void initOscillators(){
//initialize the SI5351 //initialize the SI5351
si5351bx_init(); si5351bx_init();
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier); si5351bx_setfreq(0, usbCarrier);
else
si5351bx_setfreq(0, cwmCarrier);
} }

View File

@@ -115,10 +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 ((displayOption1 & 0x01) == 0x01)
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
if (strcmp(c, printBuff[linenmbr])) { // only refresh the display when there was a change if (strcmp(c, printBuff[linenmbr])) { // only refresh the display when there was a change
lcd.setCursor(0, linenmbr); // place the cursor at the beginning of the selected line lcd.setCursor(0, linenmbr); // place the cursor at the beginning of the selected line
lcd.print(c); lcd.print(c);
@@ -148,9 +145,6 @@ void printLineF(char linenmbr, const __FlashStringHelper *c)
#define LCD_MAX_COLUMN 16 #define LCD_MAX_COLUMN 16
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex) { void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex) {
if ((displayOption1 & 0x01) == 0x01)
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
lcd.setCursor(lcdColumn, linenmbr); lcd.setCursor(lcdColumn, linenmbr);
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++) for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
@@ -166,20 +160,14 @@ 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);
} }
void clearLine2()
{
printLine2("");
line2DisplayStatus = 0;
}
// short cut to print to the first line // short cut to print to the first line
void printLine1Clear(){ void printLine1Clear(){
printLine(1,""); printLine(1,"");
@@ -191,7 +179,6 @@ void printLine2Clear(){
void printLine2ClearAndUpdate(){ void printLine2ClearAndUpdate(){
printLine(0, ""); printLine(0, "");
line2DisplayStatus = 0;
updateDisplay(); updateDisplay();
} }
@@ -234,22 +221,11 @@ void updateDisplay() {
if (ritOn) if (ritOn)
strcpy(c, "RIT "); strcpy(c, "RIT ");
else { else {
if (cwMode == 0)
{
if (isUSB) if (isUSB)
strcpy(c, "USB "); strcpy(c, "USB ");
else else
strcpy(c, "LSB "); strcpy(c, "LSB ");
} }
else if (cwMode == 1)
{
strcpy(c, "CWL ");
}
else
{
strcpy(c, "CWU ");
}
}
if (vfoActive == VFO_A) // VFO A is active if (vfoActive == VFO_A) // VFO A is active
strcat(c, "A:"); strcat(c, "A:");
else else
@@ -275,22 +251,17 @@ void updateDisplay() {
// strcat(c, " TX"); // strcat(c, " TX");
printLine(1, c); printLine(1, c);
byte diplayVFOLine = 1; if (isDialLock == 1) {
if ((displayOption1 & 0x01) == 0x01) lcd.setCursor(5,1);
diplayVFOLine = 0;
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
lcd.setCursor(5,diplayVFOLine);
lcd.write((uint8_t)0); lcd.write((uint8_t)0);
} }
else if (isCWAutoMode == 2){ else if (isCWAutoMode == 2){
lcd.setCursor(5,diplayVFOLine); lcd.setCursor(5,1);
lcd.write(0x7E); lcd.write(0x7E);
} }
else else
{ {
lcd.setCursor(5,diplayVFOLine); lcd.setCursor(5,1);
lcd.write(":"); lcd.write(":");
} }
@@ -340,9 +311,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)