Compare commits

...

19 Commits

Author SHA1 Message Date
phdlee
1e9576ddc2 fixed cat with cw key (IA, IB) 2018-02-09 01:11:48 +09:00
phdlee
a7684284d2 write eeprom cycle test and reconvery 2018-02-08 12:45:54 +09:00
phdlee
3b4aaa664c version0.35 2018-02-06 16:13:05 +09:00
phdlee
14888bb7d7 change channel name display code 2018-02-05 16:46:37 +09:00
phdlee
57cd385b8a add vfo to channel, channel to vfo 2018-02-05 15:07:25 +09:00
phdlee
60777178a8 TX Check in auto keysend 2018-02-03 17:07:11 +09:00
phdlee
dd68b38454 Optimize codes 2018-02-03 16:35:27 +09:00
phdlee
d229a10092 change tune step size and fixed bug 2018-02-02 20:49:00 +09:00
phdlee
3d019cdd44 change IF Shift Step 1 -> 50Hz 2018-01-31 17:53:20 +09:00
phdlee
4745790dfa fixed Key select bug 2018-01-31 10:44:23 +09:00
phdlee
85832de034 change confirmation key PTT->function key for easy interface 2018-01-30 20:02:49 +09:00
phdlee
4830db78cb change IF Shift setup type 2018-01-30 18:43:08 +09:00
phdlee
5eca64d2a9 vfo changed buf fixed, added BFO feature with Mike 2018-01-30 17:44:15 +09:00
phdlee
0d9ec08bd7 Added CWL, CWU Mode, need test 2018-01-30 13:20:52 +09:00
phdlee
98c26730c6 display test and split TX/RX added 2018-01-30 12:13:52 +09:00
phdlee
3a306429ea display exaam (scroll freq) #2 2018-01-30 00:00:43 +09:00
phdlee
4f634a8277 line2 display example1.1 2018-01-29 23:02:46 +09:00
phdlee
a49d5e85b8 line2 display sample1 2018-01-29 22:49:30 +09:00
phdlee
282c196f63 fixed cw adc range bug 2018-01-29 18:38:48 +09:00
9 changed files with 1307 additions and 358 deletions

View File

@@ -109,7 +109,8 @@ void CatSetFreq(byte fromType)
//#define BCD_LEN 9 //#define BCD_LEN 9
//PROTOCOL : 0x03 //PROTOCOL : 0x03
//Computer <-(frequency)-> TRCV CAT_BUFF //Computer <-(frequency)-> TRCV CAT_BUFF
void CatGetFreqMode(unsigned long freq, byte fromType) //void CatGetFreqMode(unsigned long freq, byte fromType)
void CatGetFreqMode(unsigned long freq) //for remove warning messages
{ {
int i; int i;
byte tmpValue; byte tmpValue;
@@ -130,23 +131,40 @@ 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);
} }
void CatSetSplit(boolean isSplit, byte fromType) //void CatSetSplit(boolean isSplit, byte fromType)
void CatSetSplit(boolean isSplit) //for remove warning messages
{ {
if (isSplit)
splitOn = 1;
else
splitOn = 0;
Serial.write(ACK); Serial.write(ACK);
} }
void CatSetPTT(boolean isPTTOn, byte fromType) void CatSetPTT(boolean isPTTOn, byte fromType)
{ {
if (fromType == 2 || fromType == 3) { //
if ((!inTx) && (fromType == 2 || fromType == 3)) {
Serial.write(ACK); Serial.write(ACK);
return; return;
} }
@@ -182,7 +200,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)
@@ -198,12 +216,18 @@ void CatSetMode(byte tmpMode, byte fromType)
if (!inTx) if (!inTx)
{ {
if (tmpMode == CAT_MODE_USB) if (tmpMode == CAT_MODE_CW)
{ {
cwMode = 1;
}
else if (tmpMode == CAT_MODE_USB)
{
cwMode = 0;
isUSB = true; isUSB = true;
} }
else else
{ {
cwMode = 0;
isUSB = false; isUSB = false;
} }
@@ -215,7 +239,8 @@ void CatSetMode(byte tmpMode, byte fromType)
} }
//Read EEProm by uBITX Manager Software //Read EEProm by uBITX Manager Software
void ReadEEPRom(byte fromType) //void ReadEEPRom(byte fromType)
void ReadEEPRom() //for remove warnings.
{ {
//5BYTES //5BYTES
//CAT_BUFF[0] [1] [2] [3] [4] //4 COMMAND //CAT_BUFF[0] [1] [2] [3] [4] //4 COMMAND
@@ -238,7 +263,8 @@ void ReadEEPRom(byte fromType)
} }
//Write just proecess 1byes //Write just proecess 1byes
void WriteEEPRom(byte fromType) //void WriteEEPRom(byte fromType)
void WriteEEPRom(void) //for remove warning
{ {
//5BYTES //5BYTES
uint16_t eepromStartIndex = CAT_BUFF[0] + CAT_BUFF[1] * 256; uint16_t eepromStartIndex = CAT_BUFF[0] + CAT_BUFF[1] * 256;
@@ -258,7 +284,8 @@ void WriteEEPRom(byte fromType)
} }
} }
void ReadEEPRom_FT817(byte fromType) //void ReadEEPRom_FT817(byte fromType)
void ReadEEPRom_FT817(void) //for remove warnings
{ {
byte temp0 = CAT_BUFF[0]; byte temp0 = CAT_BUFF[0];
byte temp1 = CAT_BUFF[1]; byte temp1 = CAT_BUFF[1];
@@ -358,10 +385,21 @@ 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;
@@ -384,7 +422,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] = (isSplitOn ? 0xFF : 0x7F); CAT_BUFF[0] = (splitOn ? 0xFF : 0x7F);
break; break;
case 0xB3 : // case 0xB3 : //
CAT_BUFF[0] = 0x00; CAT_BUFF[0] = 0x00;
@@ -472,7 +510,7 @@ void WriteEEPRom_FT817(byte fromType)
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(300); //If timeout errors occur in the calling software, remove them
printLine2(""); //Ham radio deluxe is the only one that supports this feature yet. and ham radio deluxe has wait time as greater than 500ms clearLine2();
} }
break; break;
@@ -484,7 +522,8 @@ void WriteEEPRom_FT817(byte fromType)
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(300); //If timeout errors occur in the calling software, remove them
printLine2(""); //Ham radio deluxe is the only one that supports this feature yet. and ham radio deluxe has wait time as greater than 500ms clearLine2();
line2DisplayStatus = 0;
} }
break; break;
@@ -504,7 +543,7 @@ void WriteEEPRom_FT817(byte fromType)
printLineF2(F("CW Speed set!")); printLineF2(F("CW Speed set!"));
EEPROM.put(CW_DELAY, cwDelayTime); EEPROM.put(CW_DELAY, cwDelayTime);
delay(300); delay(300);
printLine2(""); clearLine2();
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)
@@ -513,7 +552,7 @@ void WriteEEPRom_FT817(byte fromType)
printLineF2(F("CW Speed set!")); printLineF2(F("CW Speed set!"));
EEPROM.put(CW_SPEED, cwSpeed); EEPROM.put(CW_SPEED, cwSpeed);
delay(300); delay(300);
printLine2(""); clearLine2();
break; break;
/* /*
@@ -572,7 +611,8 @@ void WriteEEPRom_FT817(byte fromType)
Serial.write(ACK); Serial.write(ACK);
} }
void CatRxStatus(byte fromType) //void CatRxStatus(byte fromType)
void CatRxStatus(void) //for remove warning
{ {
byte sMeterValue = 1; byte sMeterValue = 1;
@@ -592,7 +632,8 @@ void CatRxStatus(byte fromType)
} }
void CatTxStatus(byte fromType) //void CatTxStatus(byte fromType)
void CatTxStatus(void) //for remove warning
{ {
boolean isHighSWR = false; boolean isHighSWR = false;
boolean isSplitOn = false; boolean isSplitOn = false;
@@ -693,11 +734,11 @@ void Check_Cat(byte fromType)
case 0x02 : //Split On case 0x02 : //Split On
case 0x82: //Split Off case 0x82: //Split Off
CatSetSplit(CAT_BUFF[4] == 0x02, fromType); CatSetSplit(CAT_BUFF[4] == 0x02);
break; break;
case 0x03 : //Read Frequency and mode case 0x03 : //Read Frequency and mode
CatGetFreqMode(frequency, fromType); CatGetFreqMode(frequency);
break; break;
case 0x07 : //Set Operating Mode case 0x07 : //Set Operating Mode
@@ -714,24 +755,24 @@ void Check_Cat(byte fromType)
break; break;
case 0xDB: //Read uBITX EEPROM Data case 0xDB: //Read uBITX EEPROM Data
ReadEEPRom(fromType); //Call by uBITX Manager Program ReadEEPRom(); //Call by uBITX Manager Program
break; break;
case 0xBB: //Read FT-817 EEPROM Data (for comfirtable) case 0xBB: //Read FT-817 EEPROM Data (for comfirtable)
ReadEEPRom_FT817(fromType); ReadEEPRom_FT817();
break; break;
case 0xDC: //Write uBITX EEPROM Data case 0xDC: //Write uBITX EEPROM Data
WriteEEPRom(fromType); //Call by uBITX Manager Program WriteEEPRom(); //Call by uBITX Manager Program
break; break;
case 0xBC: //Write FT-817 EEPROM Data (for comfirtable) case 0xBC: //Write FT-817 EEPROM Data (for comfirtable)
WriteEEPRom_FT817(fromType); WriteEEPRom_FT817(fromType);
break; break;
case 0xE7 : //Read RX Status case 0xE7 : //Read RX Status
CatRxStatus(fromType); CatRxStatus();
break; break;
case 0xF7: //Read TX Status case 0xF7: //Read TX Status
CatTxStatus(fromType); CatTxStatus();
break; break;
default: default:
/* /*

View File

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

View File

@@ -84,6 +84,7 @@
#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:
@@ -150,6 +151,7 @@ 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
@@ -158,7 +160,8 @@ int count = 0; //to generally count ticks, loops, etc
#define TX_TUNE_TYPE 261 // #define TX_TUNE_TYPE 261 //
#define HAM_BAND_RANGE 262 //FROM (2BYTE) TO (2BYTE) * 10 = 40byte #define HAM_BAND_RANGE 262 //FROM (2BYTE) TO (2BYTE) * 10 = 40byte
#define HAM_BAND_FREQS 302 //40, 1 BAND = 4Byte most bit is mode #define HAM_BAND_FREQS 302 //40, 1 BAND = 4Byte most bit is mode
#define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) #define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) //1STEP :
//for reduce cw key error, eeprom address //for reduce cw key error, eeprom address
#define CW_ADC_MOST_BIT1 348 //most 2bits of DOT_TO , DOT_FROM, ST_TO, ST_FROM #define CW_ADC_MOST_BIT1 348 //most 2bits of DOT_TO , DOT_FROM, ST_TO, ST_FROM
@@ -172,6 +175,14 @@ int count = 0; //to generally count ticks, loops, etc
#define CW_ADC_DASH_TO 355 //CW ADC Range DASH to (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_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_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
#define CHANNEL_FREQ 630 //Channel 1 ~ 20, 1 Channel = 4 bytes
#define CHANNEL_DESC 710 //Channel 1 ~ 20, 1 Channel = 4 bytes
#define RESERVE3 770 //Reserve3 between Channel and Firmware id check
//Check Firmware type and version //Check Firmware type and version
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error. #define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
@@ -227,7 +238,7 @@ 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; unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier, cwmCarrier;
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
@@ -244,7 +255,6 @@ 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;
@@ -255,9 +265,12 @@ byte sideToneSub = 0;
//DialLock //DialLock
byte isDialLock = 0; //000000[0]vfoB [0]vfoA 0Bit : A, 1Bit : B byte isDialLock = 0; //000000[0]vfoB [0]vfoA 0Bit : A, 1Bit : B
byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop] byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop]
byte arTuneStep[5]; long arTuneStep[5];
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
byte displayOption1 = 0;
byte displayOption2 = 0;
//CW ADC Range //CW ADC Range
int cwAdcSTFrom = 0; int cwAdcSTFrom = 0;
int cwAdcSTTo = 0; int cwAdcSTTo = 0;
@@ -267,6 +280,10 @@ int cwAdcDashFrom = 0;
int cwAdcDashTo = 0; int cwAdcDashTo = 0;
int cwAdcBothFrom = 0; int cwAdcBothFrom = 0;
int cwAdcBothTo = 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
@@ -286,9 +303,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 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, (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 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
@@ -296,6 +317,14 @@ 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,
char lcdMeter[17];
byte isIFShift = 0; //1 = ifShift, 2 extend
long ifShiftValue = 0; //
/** /**
* Below are the basic functions that control the uBitx. Understanding the functions before * Below are the basic functions that control the uBitx. Understanding the functions before
* you start hacking around * you start hacking around
@@ -348,22 +377,24 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
EEPROM.get(HAM_BAND_FREQS + 4 * findedIndex, resultFreq); EEPROM.get(HAM_BAND_FREQS + 4 * findedIndex, resultFreq);
loadMode = (byte)(resultFreq >> 30); //loadMode = (byte)(resultFreq >> 30);
resultFreq = resultFreq & 0x3FFFFFFF; //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]) if ((resultFreq / 1000) < hamBandRange[(unsigned char)findedIndex][0] || (resultFreq / 1000) > hamBandRange[(unsigned char)findedIndex][1])
resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000; resultFreq = (unsigned long)(hamBandRange[(unsigned char)findedIndex][0]) * 1000;
setFrequency(resultFreq); setFrequency(resultFreq);
byteWithFreqToMode(loadMode); byteToMode(loadMode, 1);
} }
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) { void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
if (bandIndex >= 0) 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 KD8CEC
When using the basic delay of the Arduino, the program freezes. When using the basic delay of the Arduino, the program freezes.
@@ -457,14 +488,28 @@ void setFrequency(unsigned long f){
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 + (isIFShift ? ifShiftValue : 0));
si5351bx_setfreq(1, SECOND_OSC_USB); si5351bx_setfreq(1, SECOND_OSC_USB);
} }
else{ else{
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f); si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f + (isIFShift ? ifShiftValue : 0));
si5351bx_setfreq(1, SECOND_OSC_LSB); si5351bx_setfreq(1, SECOND_OSC_LSB);
} }
}
else
{
if (cwMode == 1){ //CWL
si5351bx_setfreq(2, SECOND_OSC_LSB + cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
si5351bx_setfreq(1, SECOND_OSC_LSB);
}
else{ //CWU
si5351bx_setfreq(2, SECOND_OSC_USB - cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
si5351bx_setfreq(1, SECOND_OSC_USB);
}
}
frequency = f; frequency = f;
} }
@@ -492,6 +537,21 @@ 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, 0);
}
else if (vfoActive == VFO_A){
vfoActive = VFO_B;
frequency = vfoB;
byteToMode(vfoB_mode, 0);
}
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
@@ -501,11 +561,23 @@ 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)
@@ -516,10 +588,28 @@ void stopTx(){
inTx = 0; inTx = 0;
digitalWrite(TX_RX, 0); //turn off the tx 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 + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
else
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
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, 0);
}
else if (vfoActive == VFO_A){
vfoActive = VFO_B;
frequency = vfoB;
byteToMode(vfoB_mode, 0);
}
setFrequency(frequency);
} //end of else
else else
setFrequency(frequency); setFrequency(frequency);
@@ -606,7 +696,6 @@ byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw
void doTuningWithThresHold(){ void doTuningWithThresHold(){
int s = 0; int s = 0;
unsigned long prev_freq; unsigned long prev_freq;
long incdecValue = 0;
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) || if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) (vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02)))
@@ -669,9 +758,8 @@ void doRIT(){
updateDisplay(); updateDisplay();
} }
} }
/*
/** save Frequency and mode to eeprom for Auto Save with protected eeprom cycle, by kd8cec
save Frequency and mode to eeprom
*/ */
void storeFrequencyAndMode(byte saveType) void storeFrequencyAndMode(byte saveType)
{ {
@@ -703,6 +791,22 @@ void storeFrequencyAndMode(byte saveType)
} }
} }
//calculate step size from 1 byte, compatible uBITX Manager, by KD8CEC
unsigned int byteToSteps(byte srcByte) {
byte powerVal = (byte)(srcByte >> 6);
unsigned int baseVal = srcByte & 0x3F;
if (powerVal == 1)
return baseVal * 10;
else if (powerVal == 2)
return baseVal * 100;
else if (powerVal == 3)
return baseVal * 1000;
else
return baseVal;
}
/** /**
* The settings are read from EEPROM. The first time around, the values may not be * The settings are read from EEPROM. The first time around, the values may not be
* present or out of range, in this case, some intelligent defaults are copied into the * present or out of range, in this case, some intelligent defaults are copied into the
@@ -745,6 +849,7 @@ void initSettings(){
if (EEPROM.read(VERSION_ADDRESS) != VERSION_NUM) if (EEPROM.read(VERSION_ADDRESS) != VERSION_NUM)
EEPROM.write(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
@@ -756,6 +861,24 @@ 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)
@@ -784,13 +907,13 @@ void initSettings(){
if ((3 < tuneTXType && tuneTXType < 100) || 103 < tuneTXType || useHamBandCount < 1 || findedValidValueCount < 5) if ((3 < tuneTXType && tuneTXType < 100) || 103 < tuneTXType || useHamBandCount < 1 || findedValidValueCount < 5)
{ {
tuneTXType = 2; tuneTXType = 2;
//if empty band Information, auto insert default region 1 frequency range //if empty band Information, auto insert default region 2 frequency range
//This part is made temporary for people who have difficulty setting up, so can remove it when you run out of memory. //This part is made temporary for people who have difficulty setting up, so can remove it when you run out of memory.
useHamBandCount = 10; useHamBandCount = 10;
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000; hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800; hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367; 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 2
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150; hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350; hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168; hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
@@ -804,8 +927,8 @@ void initSettings(){
findedValidValueCount = 0; findedValidValueCount = 0;
EEPROM.get(TUNING_STEP, tuneStepIndex); EEPROM.get(TUNING_STEP, tuneStepIndex);
for (byte i = 0; i < 5; i++) { for (byte i = 0; i < 5; i++) {
arTuneStep[i] = EEPROM.read(TUNING_STEP + i + 1); arTuneStep[i] = byteToSteps(EEPROM.read(TUNING_STEP + i + 1));
if (arTuneStep[i] >= 1 && arTuneStep[i] < 251) //Maximum 250 for check valid Value if (arTuneStep[i] >= 1 && arTuneStep[i] <= 60000) //Maximum 650 for check valid Value
findedValidValueCount++; findedValidValueCount++;
} }
@@ -876,14 +999,17 @@ void initSettings(){
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; //LSB
} }
if (vfoB > 35000000l || 3500000l > vfoB) { if (vfoB > 35000000l || 3500000l > vfoB) {
vfoB = 14150000l; vfoB = 14150000l;
vfoB_mode = 3; vfoB_mode = 3; //USB
} }
//end of original code section //end of original code section
@@ -923,6 +1049,7 @@ 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);
@@ -958,7 +1085,7 @@ void setup()
//Serial.begin(9600); //Serial.begin(9600);
lcd.begin(16, 2); lcd.begin(16, 2);
printLineF(1, F("CECBT v0.30")); printLineF(1, F("CECBT v1.01"));
Init_Cat(38400, SERIAL_8N1); Init_Cat(38400, SERIAL_8N1);
initMeter(); //not used in this build initMeter(); //not used in this build
@@ -972,15 +1099,16 @@ void setup()
else { else {
printLineF(0, F("uBITX v0.20")); printLineF(0, F("uBITX v0.20"));
delay(500); delay(500);
printLine2(""); clearLine2();
} }
initPorts(); initPorts();
byteToMode(vfoA_mode, 0);
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();
@@ -989,13 +1117,11 @@ void setup()
} }
/**
* The loop checks for keydown, ptt, function button and tuning.
*/
//for debug //for debug
int dbgCnt = 0; int dbgCnt = 0;
byte flasher = 0; byte flasher = 0;
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
void checkAutoSaveFreqMode() void checkAutoSaveFreqMode()
{ {
//when tx or ritOn, disable auto save //when tx or ritOn, disable auto save
@@ -1013,6 +1139,7 @@ void checkAutoSaveFreqMode()
//check time for Frequency auto save //check time for Frequency auto save
if (millis() - saveCheckTime > saveIntervalSec * 1000) if (millis() - saveCheckTime > saveIntervalSec * 1000)
{ {
/*
if (vfoActive == VFO_A) if (vfoActive == VFO_A)
{ {
vfoA = frequency; vfoA = frequency;
@@ -1025,6 +1152,8 @@ void checkAutoSaveFreqMode()
vfoB_mode = modeToByte(); vfoB_mode = modeToByte();
storeFrequencyAndMode(2); storeFrequencyAndMode(2);
} }
*/
FrequencyToVFO(1);
} }
} }
} }
@@ -1044,9 +1173,16 @@ void loop(){
if (!inTx){ if (!inTx){
if (ritOn) if (ritOn)
doRIT(); doRIT();
//else if (isIFShift)
// doIFShift();
else else
doTuningWithThresHold(); doTuningWithThresHold();
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 250) {
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,6 +14,7 @@ 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");
@@ -36,6 +37,7 @@ 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();
@@ -58,6 +60,7 @@ 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();
@@ -79,6 +82,7 @@ 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();

259
ubitx_20/ubitx_idle.ino Normal file
View File

@@ -0,0 +1,259 @@
/*************************************************************************
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/>.
**************************************************************************/
char line2Buffer[16];
//KD8CEC 200Hz ST
//L14.150 200Hz ST
//U14.150 +150khz
int freqScrollPosition = 0;
//Example Line2 Optinal Display
//immediate execution, not call by scheulder
void updateLine2Buffer(char isDirectCall)
{
unsigned long tmpFreq = 0;
if (isDirectCall == 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;
} //end of ritOn display
//======================================================
//other VFO display
//======================================================
if (vfoActive == VFO_B)
{
tmpFreq = vfoA;
//line2Buffer[0] = 'A';
}
else
{
tmpFreq = vfoB;
//line2Buffer[0] = 'B';
}
// EXAMPLE 1 & 2
//U14.150.100
//display frequency
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) //none scroll display
line2Buffer[6] = 'k';
else
{
//example #2
if (freqScrollPosition++ > 18) //none scroll display time
{
line2Buffer[6] = 'k';
if (freqScrollPosition > 25)
freqScrollPosition = -1;
}
else //scroll frequency
{
line2Buffer[10] = 'H';
line2Buffer[11] = 'z';
if (freqScrollPosition < 7)
{
for (int i = 11; i >= 0; i--)
if (i - (7 - freqScrollPosition) >= 0)
line2Buffer[i] = line2Buffer[i - (7 - freqScrollPosition)];
else
line2Buffer[i] = ' ';
}
else
{
for (int i = 0; i < 11; i++)
if (i + (freqScrollPosition - 7) <= 11)
line2Buffer[i] = line2Buffer[i + (freqScrollPosition - 7)];
else
line2Buffer[i] = ' ';
}
}
} //scroll
line2Buffer[7] = ' ';
} //check direct call by encoder
if (isIFShift)
{
if (isDirectCall == 1)
for (int i = 0; i < 16; i++)
line2Buffer[i] = ' ';
//IFShift Offset Value
line2Buffer[8] = 'I';
line2Buffer[9] = 'F';
if (ifShiftValue == 0)
{
line2Buffer[10] = 'S';
line2Buffer[11] = ':';
line2Buffer[12] = 'O';
line2Buffer[13] = 'F';
line2Buffer[14] = 'F';
}
else
{
line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
line2Buffer[11] = 0;
line2Buffer[12] = ' ';
//11, 12, 13, 14, 15
memset(b, 0, sizeof(b));
ltoa(ifShiftValue, b, DEC);
strncat(line2Buffer, b, 5);
}
if (isDirectCall == 1) //if call by encoder (not scheduler), immediate print value
printLine2(line2Buffer);
} // end of display IF
else // step display
{
if (isDirectCall != 0)
return;
memset(&line2Buffer[8], ' ', 8);
//Step
long tmpStep = arTuneStep[tuneStepIndex -1];
byte isStepKhz = 0;
if (tmpStep >= 1000)
{
isStepKhz = 2;
}
for (int i = 10; i >= 8 - isStepKhz; i--) {
if (tmpStep > 0) {
line2Buffer[i + isStepKhz] = tmpStep % 10 + 0x30;
tmpStep /= 10;
}
else
line2Buffer[i +isStepKhz] = ' ';
}
//if (isStepKhz == 1)
// line2Buffer[10] = 'k';
if (isStepKhz == 0)
{
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';
}
}
}
//meterType : 0 = S.Meter, 1 : P.Meter
void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
{
if (meterType == 0 || meterType == 1 || meterType == 2)
{
drawMeter(meterValue); //call original source code
int lineNumber = 0;
if ((displayOption1 & 0x01) == 0x01)
lineNumber = 1;
lcd.setCursor(drawPosition, lineNumber);
for (int i = 0; i < 6; i++) //meter 5 + +db 1 = 6
lcd.write(lcdMeter[i]);
}
}
byte testValue = 0;
char checkCount = 0;
void idle_process()
{
//space for user graphic display
if (menuOn == 0)
{
if ((displayOption1 & 0x10) == 0x10) //always empty topline
return;
//if line2DisplayStatus == 0 <-- this condition is clear Line, you can display any message
if (line2DisplayStatus == 0 || (((displayOption1 & 0x04) == 0x04) && line2DisplayStatus == 2)) {
if (checkCount++ > 1)
{
updateLine2Buffer(0); //call by scheduler
printLine2(line2Buffer);
line2DisplayStatus = 2;
checkCount = 0;
}
//EX for Meters
/*
DisplayMeter(0, testValue++, 7);
if (testValue > 30)
testValue = 0;
*/
}
}
}

View File

@@ -90,28 +90,26 @@ void cwKeyUp(){
#define PDLSWAP 0x08 // 0 for normal, 1 for swap #define PDLSWAP 0x08 // 0 for normal, 1 for swap
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B #define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT }; enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT };
static long ktimer; static unsigned long ktimer;
bool Iambic_Key = true;
unsigned char keyerControl = IAMBICB;
unsigned char keyerState = IDLE; unsigned char keyerState = IDLE;
//Below is a test to reduce the keying error. do not delete lines //Below is a test to reduce the keying error. do not delete lines
//create by KD8CEC for compatible with new CW Logic //create by KD8CEC for compatible with new CW Logic
char update_PaddleLatch(byte isUpdateKeyState) { char update_PaddleLatch(byte isUpdateKeyState) {
unsigned char tmpKeyerControl; unsigned char tmpKeyerControl = 0;
int paddle = analogRead(ANALOG_KEYER); int paddle = analogRead(ANALOG_KEYER);
if (paddle > cwAdcDashFrom && paddle < cwAdcDashTo) if (paddle >= cwAdcDashFrom && paddle <= cwAdcDashTo)
tmpKeyerControl |= DAH_L; tmpKeyerControl |= DAH_L;
else if (paddle > cwAdcDotFrom && paddle < cwAdcDotTo) else if (paddle >= cwAdcDotFrom && paddle <= cwAdcDotTo)
tmpKeyerControl |= DIT_L; tmpKeyerControl |= DIT_L;
else if (paddle > cwAdcBothFrom && paddle < cwAdcBothTo) else if (paddle >= cwAdcBothFrom && paddle <= cwAdcBothTo)
tmpKeyerControl |= (DAH_L | DIT_L) ; tmpKeyerControl |= (DAH_L | DIT_L) ;
else else
{ {
if (Iambic_Key) if (Iambic_Key)
tmpKeyerControl = 0 ; tmpKeyerControl = 0 ;
else if (paddle > cwAdcSTFrom && paddle < cwAdcSTTo) else if (paddle >= cwAdcSTFrom && paddle <= cwAdcSTTo)
tmpKeyerControl = DIT_L ; tmpKeyerControl = DIT_L ;
else else
tmpKeyerControl = 0 ; tmpKeyerControl = 0 ;
@@ -128,9 +126,7 @@ char update_PaddleLatch(byte isUpdateKeyState) {
// modified by KD8CEC // modified by KD8CEC
******************************************************************************/ ******************************************************************************/
void cwKeyer(void){ void cwKeyer(void){
byte paddle;
lastPaddle = 0; lastPaddle = 0;
int dot,dash;
bool continue_loop = true; bool continue_loop = true;
unsigned tmpKeyControl = 0; unsigned tmpKeyControl = 0;
@@ -208,7 +204,7 @@ void cwKeyer(void){
break; break;
} }
Check_Cat(3); Check_Cat(2);
} //end of while } //end of while
} }
else{ else{

File diff suppressed because it is too large Load Diff

View File

@@ -109,7 +109,11 @@ 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
si5351bx_setfreq(0, usbCarrier);
if (cwMode == 0)
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
else
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0));
} }

View File

@@ -25,8 +25,8 @@ int btnDown(){
* The current reading of the meter is assembled in the string called meter * The current reading of the meter is assembled in the string called meter
*/ */
//char meter[17];
/*
const PROGMEM uint8_t s_meter_bitmap[] = { const PROGMEM uint8_t s_meter_bitmap[] = {
B00000,B00000,B00000,B00000,B00000,B00100,B00100,B11011, B00000,B00000,B00000,B00000,B00000,B00100,B00100,B11011,
B10000,B10000,B10000,B10000,B10100,B10100,B10100,B11011, B10000,B10000,B10000,B10000,B10100,B10100,B10100,B11011,
@@ -35,7 +35,18 @@ const PROGMEM uint8_t s_meter_bitmap[] = {
B00010,B00010,B00010,B00010,B00110,B00110,B00110,B11011, B00010,B00010,B00010,B00010,B00110,B00110,B00110,B11011,
B00001,B00001,B00001,B00001,B00101,B00101,B00101,B11011 B00001,B00001,B00001,B00001,B00101,B00101,B00101,B11011
}; };
PGM_P ps_meter_bitmap = reinterpret_cast<PGM_P>(s_meter_bitmap); */
const PROGMEM uint8_t meters_bitmap[] = {
B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 , //custom 1
B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 , //custom 2
B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 , //custom 3
B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 , //custom 4
B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 , //custom 5
B01000, B11100, B01000, B00000, B10111, B10101, B10101, B10111 //custom 6
};
PGM_P p_metes_bitmap = reinterpret_cast<PGM_P>(meters_bitmap);
const PROGMEM uint8_t lock_bitmap[8] = { const PROGMEM uint8_t lock_bitmap[8] = {
0b01110, 0b01110,
@@ -60,38 +71,54 @@ void initMeter(){
lcd.createChar(0, tmpbytes); lcd.createChar(0, tmpbytes);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i);
lcd.createChar(1, tmpbytes); lcd.createChar(1, tmpbytes);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 8); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 8);
lcd.createChar(2, tmpbytes); lcd.createChar(2, tmpbytes);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 16); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 16);
lcd.createChar(3, tmpbytes); lcd.createChar(3, tmpbytes);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 24); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 24);
lcd.createChar(4, tmpbytes); lcd.createChar(4, tmpbytes);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 28); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 32);
lcd.createChar(5, tmpbytes); lcd.createChar(5, tmpbytes);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(ps_meter_bitmap + i + 32); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 40);
lcd.createChar(6, tmpbytes); lcd.createChar(6, tmpbytes);
} }
/** //by KD8CEC
* The meter is drawn with special characters. //0 ~ 25 : 30 over : + 10
* character 1 is used to simple draw the blocks of the scale of the meter void drawMeter(int needle) {
* characters 2 to 6 are used to draw the needle in positions 1 to within the block //5Char + O over
* This displays a meter from 0 to 100, -1 displays nothing int i;
*/
/* for (i = 0; i < 5; i++) {
if (needle >= 5)
lcdMeter[i] = 5; //full
else if (needle > 0)
lcdMeter[i] = needle; //full
else //0
lcdMeter[i] = 0x20;
needle -= 5;
}
if (needle > 0)
lcdMeter[5] = 6;
else
lcdMeter[5] = 0x20;
}
/*
void drawMeter(int8_t needle){ void drawMeter(int8_t needle){
int16_t best, i, s; int16_t best, i, s;
@@ -101,21 +128,23 @@ void drawMeter(int8_t needle){
s = (needle * 4)/10; s = (needle * 4)/10;
for (i = 0; i < 8; i++){ for (i = 0; i < 8; i++){
if (s >= 5) if (s >= 5)
meter[i] = 1; lcdMeter[i] = 1;
else if (s >= 0) else if (s >= 0)
meter[i] = 2 + s; lcdMeter[i] = 2 + s;
else else
meter[i] = 1; lcdMeter[i] = 1;
s = s - 5; s = s - 5;
} }
if (needle >= 40) if (needle >= 40)
meter[i-1] = 6; lcdMeter[i-1] = 6;
meter[i] = 0; lcdMeter[i] = 0;
} }
*/ */
// The generic routine to display one line on the LCD // The generic routine to display one line on the LCD
void printLine(unsigned char linenmbr, const char *c) { void printLine(unsigned char linenmbr, const char *c) {
if ((displayOption1 & 0x01) == 0x01)
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);
@@ -145,6 +174,9 @@ 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++)
@@ -168,6 +200,12 @@ void printLine2(const 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,"");
@@ -179,6 +217,7 @@ void printLine2Clear(){
void printLine2ClearAndUpdate(){ void printLine2ClearAndUpdate(){
printLine(0, ""); printLine(0, "");
line2DisplayStatus = 0;
updateDisplay(); updateDisplay();
} }
@@ -194,7 +233,6 @@ char byteToChar(byte srcByte){
void updateDisplay() { void updateDisplay() {
// tks Jack Purdum W8TEE // tks Jack Purdum W8TEE
// replaced fsprint commmands by str commands for code size reduction // replaced fsprint commmands by str commands for code size reduction
// replace code for Frequency numbering error (alignment, point...) by KD8CEC // replace code for Frequency numbering error (alignment, point...) by KD8CEC
int i; int i;
unsigned long tmpFreq = frequency; // unsigned long tmpFreq = frequency; //
@@ -221,11 +259,22 @@ 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
@@ -251,18 +300,22 @@ void updateDisplay() {
// strcat(c, " TX"); // strcat(c, " TX");
printLine(1, c); printLine(1, c);
byte diplayVFOLine = 1;
if ((displayOption1 & 0x01) == 0x01)
diplayVFOLine = 0;
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) || if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) { (vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
lcd.setCursor(5,1); 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,1); lcd.setCursor(5,diplayVFOLine);
lcd.write(0x7E); lcd.write(0x7E);
} }
else else
{ {
lcd.setCursor(5,1); lcd.setCursor(5,diplayVFOLine);
lcd.write(":"); lcd.write(":");
} }