Compare commits
5 Commits
v0.31
...
version0.3
Author | SHA1 | Date | |
---|---|---|---|
|
0d9ec08bd7 | ||
|
98c26730c6 | ||
|
3a306429ea | ||
|
4f634a8277 | ||
|
a49d5e85b8 |
26
README.md
26
README.md
@@ -1,11 +1,7 @@
|
||||
#IMPORTANT INFORMATION
|
||||
----------------------------------------------------------------------------
|
||||
- 0.30 Version Test only download. almost complete
|
||||
- Beta 0.26 and Beta 0.261, Beta 0.262,0.27 is complete test, 0.28 is tested.
|
||||
- You can download and use it (Release section).
|
||||
|
||||
# Current work list (for Version 0.31)
|
||||
1 Testing CAT Control with Software using hamlib on Linux
|
||||
- Beta 0.26 and Beta 0.261, Beta 0.262, Beta 0.27 is complete test
|
||||
- You can download and use it.
|
||||
|
||||
#NOTICE
|
||||
----------------------------------------------------------------------------
|
||||
@@ -50,24 +46,6 @@ Prepared or finished tasks for the next version
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
## REVISION RECORD
|
||||
0.30
|
||||
- implemented the function to monitor the value of all analog inputs. This allows you to monitor the status of the CW keys connected to your uBITX.
|
||||
- possible to set the ADC range for CW Keying. If no setting is made, it will have the same range as the original code. If you set the CW Keying ADC Values using uBITX Manager 0.3, you can reduce the key error.
|
||||
- Added the function to select Straight Key, IAMBICA, IAMBICB key from the menu.
|
||||
- default Band select is Ham Band mode, if you want common type, long press function key at band select menu, uBITX Manager can be used to modify frequencies to suit your country.
|
||||
|
||||
0.29
|
||||
- Remove the use of initialization values in BFO settings - using crruent value, if factory reset
|
||||
- Select Tune Step, default 0, 20, 50, 100, 200, Use the uBITX Manager to set the steps value you want. You can select Step by pressing and holding the Function Key (1sec ~ 2sec).
|
||||
- Modify Dial Lock Function, Press the Function key for more than 3 seconds to toggle dial lock.
|
||||
- created a new frequency tune method. remove original source codes, Threshold has been applied to reduce malfunction. checked the continuity of the user operating to make natural tune possible.
|
||||
- stabilize and remove many warning messages - by Pullrequest and merge
|
||||
- Changed cw keying method. removed the original code and applied Ron's code and Improved compatibility with original hardware and CAT commnication. It can be used without modification of hardware.
|
||||
|
||||
0.28
|
||||
- Fixed CAT problem with hamlib on Linux
|
||||
- restore Protocol autorecovery logic
|
||||
|
||||
0.27
|
||||
(First alpha test version, This will be renamed to the major version 1.0)
|
||||
- Dual VFO Dial Lock (vfoA Dial lock)
|
||||
|
@@ -130,10 +130,21 @@ void CatGetFreqMode(unsigned long freq, byte fromType)
|
||||
}
|
||||
|
||||
//Mode Check
|
||||
if (isUSB)
|
||||
CAT_BUFF[4] = CAT_MODE_USB;
|
||||
if (cwMode == 0)
|
||||
{
|
||||
if (isUSB)
|
||||
CAT_BUFF[4] = CAT_MODE_USB;
|
||||
else
|
||||
CAT_BUFF[4] = CAT_MODE_LSB;
|
||||
}
|
||||
else if (cwMode == 1)
|
||||
{
|
||||
CAT_BUFF[4] = CAT_MODE_CW;
|
||||
}
|
||||
else
|
||||
CAT_BUFF[4] = CAT_MODE_LSB;
|
||||
{
|
||||
CAT_BUFF[4] = CAT_MODE_CW;
|
||||
}
|
||||
|
||||
SendCatData(5);
|
||||
}
|
||||
@@ -198,12 +209,18 @@ void CatSetMode(byte tmpMode, byte fromType)
|
||||
|
||||
if (!inTx)
|
||||
{
|
||||
if (tmpMode == CAT_MODE_USB)
|
||||
if (tmpMode == CAT_MODE_CW)
|
||||
{
|
||||
cwMode = 1;
|
||||
}
|
||||
else if (tmpMode == CAT_MODE_USB)
|
||||
{
|
||||
cwMode = 0;
|
||||
isUSB = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
cwMode = 0;
|
||||
isUSB = false;
|
||||
}
|
||||
|
||||
@@ -358,10 +375,21 @@ void ReadEEPRom_FT817(byte fromType)
|
||||
CAT_BUFF[1] = 0xB2;
|
||||
break; case 0x69 : //FM Mic (#29) Contains 0-100 (decimal) as displayed
|
||||
case 0x78 :
|
||||
if (isUSB)
|
||||
CAT_BUFF[0] = CAT_MODE_USB;
|
||||
else
|
||||
CAT_BUFF[0] = CAT_MODE_LSB;
|
||||
if (cwMode == 0)
|
||||
{
|
||||
if (isUSB)
|
||||
CAT_BUFF[0] = CAT_MODE_USB;
|
||||
else
|
||||
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;
|
||||
break;
|
||||
@@ -384,7 +412,7 @@ void ReadEEPRom_FT817(byte fromType)
|
||||
//7A 6 ? ?
|
||||
//7A 7 SPL On/Off 0 = Off, 1 = On
|
||||
|
||||
CAT_BUFF[0] = (isSplitOn ? 0xFF : 0x7F);
|
||||
CAT_BUFF[0] = (splitOn ? 0xFF : 0x7F);
|
||||
break;
|
||||
case 0xB3 : //
|
||||
CAT_BUFF[0] = 0x00;
|
||||
|
@@ -151,6 +151,7 @@ int count = 0; //to generally count ticks, loops, etc
|
||||
#define CW_SPEED 28
|
||||
|
||||
//AT328 has 1KBytes EEPROM
|
||||
#define CW_CAL 252
|
||||
#define VFO_A_MODE 256
|
||||
#define VFO_B_MODE 257
|
||||
#define CW_DELAY 258
|
||||
@@ -232,7 +233,7 @@ int count = 0; //to generally count ticks, loops, etc
|
||||
char ritOn = 0;
|
||||
char vfoActive = VFO_A;
|
||||
int8_t meter_reading = 0; // a -1 on meter makes it invisible
|
||||
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier;
|
||||
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier, cwmCarrier;
|
||||
unsigned long vfoA_eeprom, vfoB_eeprom; //for protect eeprom life
|
||||
unsigned long frequency, ritRxFrequency, ritTxFrequency; //frequency is the current frequency on the dial
|
||||
|
||||
@@ -249,7 +250,6 @@ byte saveIntervalSec = 10; //second
|
||||
unsigned long saveCheckTime = 0;
|
||||
unsigned long saveCheckFreq = 0;
|
||||
|
||||
bool isSplitOn = false;
|
||||
byte cwDelayTime = 60;
|
||||
byte delayBeforeCWStartTime = 50;
|
||||
|
||||
@@ -298,9 +298,13 @@ byte userCallsignLength = 0; //7 : display callsign at system startup, 6~0 :
|
||||
*/
|
||||
boolean txCAT = false; //turned on if the transmitting due to a CAT command
|
||||
char inTx = 0; //it is set to 1 if in transmit mode (whatever the reason : cw, ptt or cat)
|
||||
char splitOn = 0; //working split, uses VFO B as the transmit frequency, (NOT IMPLEMENTED YET)
|
||||
char splitOn = 0; //working split, uses VFO B as the transmit frequency
|
||||
char keyDown = 0; //in cw mode, denotes the carrier is being transmitted
|
||||
char 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
|
||||
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
|
||||
@@ -364,8 +368,10 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
|
||||
|
||||
EEPROM.get(HAM_BAND_FREQS + 4 * findedIndex, resultFreq);
|
||||
|
||||
loadMode = (byte)(resultFreq >> 30);
|
||||
resultFreq = resultFreq & 0x3FFFFFFF;
|
||||
//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;
|
||||
@@ -376,10 +382,10 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
|
||||
|
||||
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 & 0x3FFFFFFF) | (mode << 30) );
|
||||
EEPROM.put(HAM_BAND_FREQS + 4 * bandIndex, (f & 0x1FFFFFFF) | (mode << 29) );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
KD8CEC
|
||||
When using the basic delay of the Arduino, the program freezes.
|
||||
@@ -473,13 +479,27 @@ void setFrequency(unsigned long f){
|
||||
|
||||
setTXFilters(f);
|
||||
|
||||
if (isUSB){
|
||||
si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f);
|
||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
||||
if (cwMode == 0)
|
||||
{
|
||||
if (isUSB){
|
||||
si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f);
|
||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
||||
}
|
||||
else{
|
||||
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f);
|
||||
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
||||
}
|
||||
}
|
||||
else{
|
||||
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f);
|
||||
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;
|
||||
@@ -508,6 +528,21 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
||||
ritRxFrequency = frequency;
|
||||
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){
|
||||
//turn off the second local oscillator and the bfo
|
||||
@@ -517,10 +552,22 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
||||
//shif the first oscillator to the tx frequency directly
|
||||
//the key up and key down will toggle the carrier unbalancing
|
||||
//the exact cw frequency is the tuned frequency + sidetone
|
||||
if (isUSB)
|
||||
si5351bx_setfreq(2, frequency + sideTone);
|
||||
else
|
||||
si5351bx_setfreq(2, frequency - sideTone);
|
||||
|
||||
if (cwMode == 0)
|
||||
{
|
||||
if (isUSB)
|
||||
si5351bx_setfreq(2, frequency + sideTone);
|
||||
else
|
||||
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
|
||||
@@ -532,10 +579,28 @@ void stopTx(){
|
||||
inTx = 0;
|
||||
|
||||
digitalWrite(TX_RX, 0); //turn off the tx
|
||||
si5351bx_setfreq(0, usbCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier); //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)
|
||||
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
|
||||
setFrequency(frequency);
|
||||
|
||||
@@ -761,6 +826,7 @@ void initSettings(){
|
||||
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
|
||||
//0: default, 1:not use, 2:LSB, 3:USB, 4:CW, 5:AM, 6:FM
|
||||
@@ -824,7 +890,7 @@ void initSettings(){
|
||||
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[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;
|
||||
@@ -909,6 +975,9 @@ void initSettings(){
|
||||
//original code with modified by kd8cec
|
||||
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
||||
usbCarrier = 11995000l;
|
||||
|
||||
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
||||
cwmCarrier = 11995000l;
|
||||
|
||||
if (vfoA > 35000000l || 3500000l > vfoA) {
|
||||
vfoA = 7150000l;
|
||||
@@ -993,7 +1062,7 @@ void setup()
|
||||
|
||||
//Serial.begin(9600);
|
||||
lcd.begin(16, 2);
|
||||
printLineF(1, F("CECBT v0.31"));
|
||||
printLineF(1, F("CECBT v0.33"));
|
||||
|
||||
Init_Cat(38400, SERIAL_8N1);
|
||||
initMeter(); //not used in this build
|
||||
@@ -1011,11 +1080,12 @@ void setup()
|
||||
}
|
||||
|
||||
initPorts();
|
||||
|
||||
byteToMode(vfoA_mode);
|
||||
initOscillators();
|
||||
|
||||
frequency = vfoA;
|
||||
saveCheckFreq = frequency; //for auto save frequency
|
||||
byteToMode(vfoA_mode);
|
||||
setFrequency(vfoA);
|
||||
updateDisplay();
|
||||
|
||||
@@ -1082,7 +1152,7 @@ void loop(){
|
||||
else
|
||||
doTuningWithThresHold();
|
||||
|
||||
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 200) {
|
||||
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 500) {
|
||||
idle_process();
|
||||
beforeIdle_ProcessTime = millis();
|
||||
}
|
||||
|
@@ -37,6 +37,7 @@ void factory_alignment(){
|
||||
|
||||
|
||||
printLine2("#3:Test 3.5MHz");
|
||||
cwMode = 0;
|
||||
isUSB = false;
|
||||
setFrequency(3500000l);
|
||||
updateDisplay();
|
||||
@@ -59,6 +60,7 @@ void factory_alignment(){
|
||||
btnWaitForClick();
|
||||
printLine2("#5:Test 14MHz");
|
||||
|
||||
cwMode = 0;
|
||||
isUSB = true;
|
||||
setFrequency(14000000l);
|
||||
updateDisplay();
|
||||
@@ -80,6 +82,7 @@ void factory_alignment(){
|
||||
printLine2("Alignment done");
|
||||
delay(1000);
|
||||
|
||||
cwMode = 0;
|
||||
isUSB = false;
|
||||
setFrequency(7150000l);
|
||||
updateDisplay();
|
||||
|
@@ -17,7 +17,137 @@
|
||||
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()
|
||||
{
|
||||
@@ -25,6 +155,11 @@ void idle_process()
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -119,30 +119,56 @@ void menuBand(int btn){
|
||||
}
|
||||
|
||||
//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(){
|
||||
if (isUSB)
|
||||
return 3;
|
||||
if (cwMode == 0)
|
||||
{
|
||||
if (isUSB)
|
||||
return 3;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
else if (cwMode == 1)
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
else
|
||||
return 2;
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
}
|
||||
|
||||
//Convert Number to Mode by KD8CEC
|
||||
void byteToMode(byte modeValue){
|
||||
if (modeValue == 3)
|
||||
isUSB = 1;
|
||||
if (modeValue == 4)
|
||||
cwMode = 1;
|
||||
else if (modeValue == 5)
|
||||
cwMode = 2;
|
||||
else
|
||||
isUSB = 0;
|
||||
{
|
||||
cwMode = 0;
|
||||
if (modeValue == 3)
|
||||
isUSB = 1;
|
||||
else
|
||||
isUSB = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//Convert Number to Mode by KD8CEC
|
||||
void byteWithFreqToMode(byte modeValue){
|
||||
if (modeValue == 3)
|
||||
isUSB = 1;
|
||||
else if (modeValue == 0) //Not Set
|
||||
isUSB = (frequency > 10000000l) ? true : false;
|
||||
else
|
||||
isUSB = 0;
|
||||
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
|
||||
@@ -212,6 +238,7 @@ void menuRitToggle(int btn){
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void menuSidebandToggle(int btn){
|
||||
if (!btn){
|
||||
if (isUSB == true)
|
||||
@@ -220,6 +247,7 @@ void menuSidebandToggle(int btn){
|
||||
printLineF2(F("Select USB?"));
|
||||
}
|
||||
else {
|
||||
cwMode = 0;
|
||||
if (isUSB == true){
|
||||
isUSB = false;
|
||||
printLineF2(F("LSB Selected"));
|
||||
@@ -234,6 +262,134 @@ void menuSidebandToggle(int btn){
|
||||
menuOn = 0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
void menuSelectMode(int btn){
|
||||
int knob = 0;
|
||||
int selectModeType = 0;
|
||||
int beforeMode = 0;
|
||||
int moveStep = 0;
|
||||
|
||||
if (!btn){
|
||||
printLineF2(F("Select Mode?"));
|
||||
}
|
||||
else {
|
||||
delay_background(500, 0);
|
||||
|
||||
//LSB, USB, CWL, CWU
|
||||
if (cwMode == 0 && isUSB == 0)
|
||||
selectModeType = 0;
|
||||
else if (cwMode == 0 && isUSB == 1)
|
||||
selectModeType = 1;
|
||||
else if (cwMode == 1)
|
||||
selectModeType = 2;
|
||||
else
|
||||
selectModeType = 3;
|
||||
|
||||
beforeMode = selectModeType;
|
||||
|
||||
while(!btnDown() && digitalRead(PTT) == HIGH){
|
||||
//Display Mode Name
|
||||
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
|
||||
@@ -299,12 +455,14 @@ void menuSetupKeyType(int btn){
|
||||
if (knob != 0)
|
||||
{
|
||||
moveStep += (knob > 0 ? 1 : -1);
|
||||
if (selectedKeyType > 0 && moveStep < -3) {
|
||||
selectedKeyType--;
|
||||
if (moveStep < -3) {
|
||||
if (selectedKeyType > 0)
|
||||
selectedKeyType--;
|
||||
moveStep = 0;
|
||||
}
|
||||
else if (selectedKeyType < 2 && moveStep > 3) {
|
||||
selectedKeyType++;
|
||||
else if (moveStep > 3) {
|
||||
if (selectedKeyType < 2)
|
||||
selectedKeyType++;
|
||||
moveStep = 0;
|
||||
}
|
||||
}
|
||||
@@ -683,6 +841,7 @@ void factoryCalibration(int btn){
|
||||
|
||||
calibration = 0;
|
||||
|
||||
cwMode = 0;
|
||||
isUSB = true;
|
||||
|
||||
//turn off the second local oscillator and the bfo
|
||||
@@ -811,7 +970,7 @@ void printCarrierFreq(unsigned long freq){
|
||||
strcat(c, ".");
|
||||
strncat(c, &b[2], 3);
|
||||
strcat(c, ".");
|
||||
strncat(c, &b[5], 1);
|
||||
strncat(c, &b[5], 3);
|
||||
printLine2(c);
|
||||
}
|
||||
|
||||
@@ -863,12 +1022,71 @@ void menuSetupCarrier(int btn){
|
||||
else
|
||||
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);
|
||||
printLine2ClearAndUpdate();
|
||||
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){
|
||||
int knob = 0;
|
||||
@@ -1025,7 +1243,7 @@ void doMenu(){
|
||||
btnState = btnDown();
|
||||
|
||||
if (i > 0){
|
||||
if (modeCalibrate && select + i < 170)
|
||||
if (modeCalibrate && select + i < 190)
|
||||
select += i;
|
||||
if (!modeCalibrate && select + i < 80)
|
||||
select += i;
|
||||
@@ -1043,7 +1261,7 @@ void doMenu(){
|
||||
else if (select < 30)
|
||||
menuVfoToggle(btnState, 1);
|
||||
else if (select < 40)
|
||||
menuSidebandToggle(btnState);
|
||||
menuSelectMode(btnState);
|
||||
else if (select < 50)
|
||||
menuCWSpeed(btnState);
|
||||
else if (select < 60)
|
||||
@@ -1057,18 +1275,22 @@ void doMenu(){
|
||||
else if (select < 100 && modeCalibrate)
|
||||
menuSetupCarrier(btnState); //lsb
|
||||
else if (select < 110 && modeCalibrate)
|
||||
menuSetupCwTone(btnState);
|
||||
menuSetupCWCarrier(btnState); //lsb
|
||||
else if (select < 120 && modeCalibrate)
|
||||
menuSetupCwDelay(btnState);
|
||||
menuSetupCwTone(btnState);
|
||||
else if (select < 130 && modeCalibrate)
|
||||
menuSetupTXCWInterval(btnState);
|
||||
menuSetupCwDelay(btnState);
|
||||
else if (select < 140 && modeCalibrate)
|
||||
menuSetupKeyType(btnState);
|
||||
menuSetupTXCWInterval(btnState);
|
||||
else if (select < 150 && modeCalibrate)
|
||||
menuADCMonitor(btnState);
|
||||
menuSetupKeyType(btnState);
|
||||
else if (select < 160 && modeCalibrate)
|
||||
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
||||
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);
|
||||
|
||||
Check_Cat(0); //To prevent disconnections
|
||||
|
@@ -109,7 +109,11 @@ void initOscillators(){
|
||||
//initialize the SI5351
|
||||
si5351bx_init();
|
||||
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
|
||||
si5351bx_setfreq(0, usbCarrier);
|
||||
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier);
|
||||
else
|
||||
si5351bx_setfreq(0, cwmCarrier);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -234,10 +234,21 @@ void updateDisplay() {
|
||||
if (ritOn)
|
||||
strcpy(c, "RIT ");
|
||||
else {
|
||||
if (isUSB)
|
||||
strcpy(c, "USB ");
|
||||
if (cwMode == 0)
|
||||
{
|
||||
if (isUSB)
|
||||
strcpy(c, "USB ");
|
||||
else
|
||||
strcpy(c, "LSB ");
|
||||
}
|
||||
else if (cwMode == 1)
|
||||
{
|
||||
strcpy(c, "CWL ");
|
||||
}
|
||||
else
|
||||
strcpy(c, "LSB ");
|
||||
{
|
||||
strcpy(c, "CWU ");
|
||||
}
|
||||
}
|
||||
if (vfoActive == VFO_A) // VFO A is active
|
||||
strcat(c, "A:");
|
||||
|
Reference in New Issue
Block a user