Compare commits
43 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a21dbe2fa5 | ||
|
9faa8bb44c | ||
|
d926b15e3d | ||
|
fb2c9d2cc3 | ||
|
bf68dd6c26 | ||
|
4a6909f361 | ||
|
c911d26163 | ||
|
98e3b41f5a | ||
|
e0f9148972 | ||
|
277666f82f | ||
|
e532dccce7 | ||
|
81333e7af4 | ||
|
04949cdb93 | ||
|
bbdd0947d3 | ||
|
ed767f2e34 | ||
|
a374297d49 | ||
|
1e9576ddc2 | ||
|
a7684284d2 | ||
|
c1d81d9d5b | ||
|
3b4aaa664c | ||
|
d69588d999 | ||
|
14888bb7d7 | ||
|
57cd385b8a | ||
|
e915c21412 | ||
|
60777178a8 | ||
|
dd68b38454 | ||
|
d229a10092 | ||
|
3d019cdd44 | ||
|
55cfeeb924 | ||
|
c8879e0e59 | ||
|
4f5ac283b7 | ||
|
4745790dfa | ||
|
85832de034 | ||
|
4830db78cb | ||
|
5eca64d2a9 | ||
|
0d9ec08bd7 | ||
|
3058d52551 | ||
|
98c26730c6 | ||
|
3a306429ea | ||
|
4f634a8277 | ||
|
a49d5e85b8 | ||
|
04699ba074 | ||
|
282c196f63 |
65
README.md
65
README.md
@@ -1,23 +1,13 @@
|
|||||||
#IMPORTANT INFORMATION
|
#IMPORTANT INFORMATION
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
- 0.30 Version Test only download. almost complete
|
- A bug was found in version 1.0, When CW Keytype is set to IAMBCA and IAMBCB, there was a problem that switching to RX is not performed well when CAT communication is performed. If CW key type is straight, it works normally. This bug has been fixed and changed to version 1.01.
|
||||||
- Beta 0.26 and Beta 0.261, Beta 0.262,0.27 is complete test, 0.28 is tested.
|
- Now Release Version 1.01 on my blog (http://www.hamskey.com)
|
||||||
- You can download and use it (Release section).
|
- You can download and compiled hex file and uBITX Manager application on my blog (http://www.hamskey.com)
|
||||||
|
|
||||||
# Current work list (for Version 0.31)
|
|
||||||
1 Testing CAT Control with Software using hamlib on Linux
|
|
||||||
|
|
||||||
#NOTICE
|
#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.
|
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.
|
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.
|
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.
|
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.
|
||||||
@@ -40,8 +30,6 @@ The copyright information of the original is below.
|
|||||||
KD8CEC
|
KD8CEC
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
Prepared or finished tasks for the next version
|
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)
|
- Include WSPR Beacone function - (implement other new repository)
|
||||||
complete experiment
|
complete experiment
|
||||||
need solve : Big code size (over 100%, then remove some functions for experment)
|
need solve : Big code size (over 100%, then remove some functions for experment)
|
||||||
@@ -50,6 +38,53 @@ Prepared or finished tasks for the next version
|
|||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
## REVISION RECORD
|
## REVISION RECORD
|
||||||
|
1.04
|
||||||
|
- Optimized from Version1.03
|
||||||
|
- Reduce program size (97% -> 95%)
|
||||||
|
|
||||||
|
1.03
|
||||||
|
- Change eBFO Calibration Step (50 to 5)
|
||||||
|
- Change CW Frequency Display type
|
||||||
|
|
||||||
|
1.02
|
||||||
|
- Applied CW Start Delay to New CW Key logic (This is my mistake when applying the new CW Key Logic.Since uBITX operations are not significantly affected, this does not create a separate Release, It will be reflected in the next release.) - complete
|
||||||
|
- Modified CW Key Logic for Auto Key, (available AutoKey function by any cw keytype) - complete
|
||||||
|
- reduce cpu use usage (working)
|
||||||
|
- reduce (working)
|
||||||
|
|
||||||
|
1.01
|
||||||
|
- Fixed Cat problem with (IAMBIC A or B Selected)
|
||||||
|
1.0
|
||||||
|
- rename 0.30 to 1.0
|
||||||
|
|
||||||
|
0.35
|
||||||
|
- vfo to channel bug fixed (not saved mode -> fixed, channel has frequency and mode)
|
||||||
|
- add Channel tag (ch.1 ~ 10) by uBITX Manager
|
||||||
|
- add VFO to Channel, Channel To VFO
|
||||||
|
|
||||||
|
0.34
|
||||||
|
- TX Status check in auto Keysend logic
|
||||||
|
- optimize codes
|
||||||
|
- change default tune step size, and fixed bug
|
||||||
|
- change IF shift step (1Hz -> 50Hz)
|
||||||
|
|
||||||
|
0.33
|
||||||
|
- Added CWL, CWU Mode, (dont complete test yet)
|
||||||
|
- fixed VFO changed bug.
|
||||||
|
- Added Additional BFO for CWL, CWL
|
||||||
|
- Added IF Shift
|
||||||
|
- Change confirmation key PTT -> function key (not critical menus)
|
||||||
|
- Change CW Key Select type, (toggle -> select by dial)
|
||||||
|
|
||||||
|
0.32
|
||||||
|
- Added function Scroll Frequencty on upper line
|
||||||
|
- Added Example code for Draw meter and remarked (you can see and use this code in source codes)
|
||||||
|
- Added Split function, just toggle VFOs when TX/RX
|
||||||
|
|
||||||
|
0.31
|
||||||
|
- Fixed CW ADC Range error
|
||||||
|
- Display Message on Upper Line (anothor VFO Frequency, Tune Step, Selected Key Type)
|
||||||
|
|
||||||
0.30
|
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.
|
- 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.
|
- 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.
|
||||||
|
@@ -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:
|
||||||
/*
|
/*
|
||||||
|
@@ -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
|
||||||
|
@@ -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,18 @@ 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 CW_DISPLAY_SHIFT 359 //Transmits on CWL, CWU Mode, LCD Frequency shifts Sidetone Frequency.
|
||||||
|
//(7:Enable / Disable //0: enable, 1:disable, (default is applied shift)
|
||||||
|
//6 : 0 : Adjust Pulus, 1 : Adjust Minus
|
||||||
|
//0~5: Adjust Value : * 10 = Adjust Value (0~300)
|
||||||
|
|
||||||
|
#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 +242,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 +259,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 +269,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 +284,13 @@ 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;
|
||||||
|
|
||||||
|
byte isShiftDisplayCWFreq = 1; //Display Frequency
|
||||||
|
int shiftDisplayAdjustVal = 0; //
|
||||||
|
|
||||||
//Variables for auto cw mode
|
//Variables for auto cw mode
|
||||||
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
||||||
@@ -286,9 +310,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 +324,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,29 +384,30 @@ 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.
|
||||||
When the delay is used, the program will generate an error because it is not communicating,
|
When the delay is used, the program will generate an error because it is not communicating,
|
||||||
so Create a new delay function that can do background processing.
|
so Create a new delay function that can do background processing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
unsigned long delayBeforeTime = 0;
|
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();
|
||||||
@@ -457,14 +494,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;
|
||||||
}
|
}
|
||||||
@@ -474,7 +525,6 @@ void setFrequency(unsigned long f){
|
|||||||
* put the uBitx in tx mode. It takes care of rit settings, sideband settings
|
* put the uBitx in tx mode. It takes care of rit settings, sideband settings
|
||||||
* Note: In cw mode, doesnt key the radio, only puts it in tx mode
|
* Note: In cw mode, doesnt key the radio, only puts it in tx mode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void startTx(byte txMode, byte isDisplayUpdate){
|
void startTx(byte txMode, byte isDisplayUpdate){
|
||||||
//Check Hamband only TX //Not found Hamband index by now frequency
|
//Check Hamband only TX //Not found Hamband index by now frequency
|
||||||
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
|
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
|
||||||
@@ -492,6 +542,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 +566,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 +593,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);
|
||||||
|
|
||||||
@@ -585,7 +680,7 @@ void checkButton(){
|
|||||||
delay(10);
|
delay(10);
|
||||||
Check_Cat(0);
|
Check_Cat(0);
|
||||||
}
|
}
|
||||||
delay(50);//debounce
|
//delay(50);//debounce
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -600,13 +695,12 @@ int encodedSumValue = 0;
|
|||||||
unsigned long lastTunetime = 0; //if continous moving, skip threshold processing
|
unsigned long lastTunetime = 0; //if continous moving, skip threshold processing
|
||||||
byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw
|
byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw
|
||||||
|
|
||||||
#define skipThresholdTime 100
|
//#define skipThresholdTime 70
|
||||||
#define encodeTimeOut 1000
|
#define encodeTimeOut 1000
|
||||||
|
|
||||||
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)))
|
||||||
@@ -630,7 +724,9 @@ void doTuningWithThresHold(){
|
|||||||
encodedSumValue += (s > 0 ? 1 : -1);
|
encodedSumValue += (s > 0 ? 1 : -1);
|
||||||
|
|
||||||
//check threshold and operator actions (hold dial speed = continous moving, skip threshold check)
|
//check threshold and operator actions (hold dial speed = continous moving, skip threshold check)
|
||||||
if ((lastTunetime < millis() - skipThresholdTime) && ((encodedSumValue * encodedSumValue) <= (threshold * threshold)))
|
//not use continues changing by Threshold
|
||||||
|
//if ((lastTunetime < (millis() - skipThresholdTime)) && ((encodedSumValue * encodedSumValue) <= (threshold * threshold)))
|
||||||
|
if (((encodedSumValue * encodedSumValue) <= (threshold * threshold)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lastTunetime = millis();
|
lastTunetime = millis();
|
||||||
@@ -640,7 +736,8 @@ void doTuningWithThresHold(){
|
|||||||
|
|
||||||
prev_freq = frequency;
|
prev_freq = frequency;
|
||||||
//incdecValue = tuningStep * s;
|
//incdecValue = tuningStep * s;
|
||||||
frequency += (arTuneStep[tuneStepIndex -1] * s * (s * s < 10 ? 1 : 3)); //appield weight (s is speed)
|
//frequency += (arTuneStep[tuneStepIndex -1] * s * (s * s < 10 ? 1 : 3)); //appield weight (s is speed)
|
||||||
|
frequency += (arTuneStep[tuneStepIndex -1] * s); //appield weight (s is speed) //if want need more increase size, change step size
|
||||||
|
|
||||||
if (prev_freq < 10000000l && frequency > 10000000l)
|
if (prev_freq < 10000000l && frequency > 10000000l)
|
||||||
isUSB = true;
|
isUSB = true;
|
||||||
@@ -660,9 +757,9 @@ void doRIT(){
|
|||||||
unsigned long old_freq = frequency;
|
unsigned long old_freq = frequency;
|
||||||
|
|
||||||
if (knob < 0)
|
if (knob < 0)
|
||||||
frequency -= 100l;
|
frequency -= (arTuneStep[tuneStepIndex -1]); //
|
||||||
else if (knob > 0)
|
else if (knob > 0)
|
||||||
frequency += 100;
|
frequency += (arTuneStep[tuneStepIndex -1]); //
|
||||||
|
|
||||||
if (old_freq != frequency){
|
if (old_freq != frequency){
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
@@ -670,8 +767,8 @@ void doRIT(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
save Frequency and mode to eeprom
|
save Frequency and mode to eeprom for Auto Save with protected eeprom cycle, by kd8cec
|
||||||
*/
|
*/
|
||||||
void storeFrequencyAndMode(byte saveType)
|
void storeFrequencyAndMode(byte saveType)
|
||||||
{
|
{
|
||||||
@@ -703,6 +800,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 +858,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 +870,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 +916,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 +936,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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -838,6 +970,22 @@ void initSettings(){
|
|||||||
cwAdcBothFrom = EEPROM.read(CW_ADC_BOTH_FROM) | ((tmpMostBits & 0x30) << 4);
|
cwAdcBothFrom = EEPROM.read(CW_ADC_BOTH_FROM) | ((tmpMostBits & 0x30) << 4);
|
||||||
cwAdcBothTo = EEPROM.read(CW_ADC_BOTH_TO) | ((tmpMostBits & 0xC0) << 2);
|
cwAdcBothTo = EEPROM.read(CW_ADC_BOTH_TO) | ((tmpMostBits & 0xC0) << 2);
|
||||||
|
|
||||||
|
//Display Type for CW mode
|
||||||
|
isShiftDisplayCWFreq = EEPROM.read(CW_DISPLAY_SHIFT);
|
||||||
|
|
||||||
|
//Adjust CW Mode Freq
|
||||||
|
shiftDisplayAdjustVal = (isShiftDisplayCWFreq & 0x3F) * 10;
|
||||||
|
|
||||||
|
//check Minus
|
||||||
|
if ((isShiftDisplayCWFreq & 0x40) == 0x40)
|
||||||
|
shiftDisplayAdjustVal = shiftDisplayAdjustVal * -1;
|
||||||
|
|
||||||
|
//Shift Display Check (Default : 0)
|
||||||
|
if ((isShiftDisplayCWFreq & 0x80) == 0) //Enabled
|
||||||
|
isShiftDisplayCWFreq = 1;
|
||||||
|
else //Disabled
|
||||||
|
isShiftDisplayCWFreq = 0;
|
||||||
|
|
||||||
//default Value (for original hardware)
|
//default Value (for original hardware)
|
||||||
if (cwAdcSTFrom >= cwAdcSTTo)
|
if (cwAdcSTFrom >= cwAdcSTTo)
|
||||||
{
|
{
|
||||||
@@ -876,14 +1024,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
|
||||||
|
|
||||||
@@ -909,7 +1060,6 @@ void initSettings(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initPorts(){
|
void initPorts(){
|
||||||
|
|
||||||
analogReference(DEFAULT);
|
analogReference(DEFAULT);
|
||||||
|
|
||||||
//??
|
//??
|
||||||
@@ -923,6 +1073,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 +1109,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.04"));
|
||||||
|
|
||||||
Init_Cat(38400, SERIAL_8N1);
|
Init_Cat(38400, SERIAL_8N1);
|
||||||
initMeter(); //not used in this build
|
initMeter(); //not used in this build
|
||||||
@@ -972,15 +1123,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();
|
||||||
|
|
||||||
@@ -988,14 +1140,7 @@ void setup()
|
|||||||
factory_alignment();
|
factory_alignment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
|
||||||
/**
|
|
||||||
* The loop checks for keydown, ptt, function button and tuning.
|
|
||||||
*/
|
|
||||||
//for debug
|
|
||||||
int dbgCnt = 0;
|
|
||||||
byte flasher = 0;
|
|
||||||
|
|
||||||
void checkAutoSaveFreqMode()
|
void checkAutoSaveFreqMode()
|
||||||
{
|
{
|
||||||
//when tx or ritOn, disable auto save
|
//when tx or ritOn, disable auto save
|
||||||
@@ -1013,18 +1158,8 @@ 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)
|
FrequencyToVFO(1);
|
||||||
{
|
saveCheckTime = 0; //for reduce cpu use rate
|
||||||
vfoA = frequency;
|
|
||||||
vfoA_mode = modeToByte();
|
|
||||||
storeFrequencyAndMode(1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vfoB = frequency;
|
|
||||||
vfoB_mode = modeToByte();
|
|
||||||
storeFrequencyAndMode(2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1044,11 +1179,18 @@ 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();
|
||||||
|
checkAutoSaveFreqMode(); //move here form out scope for reduce cpu use rate
|
||||||
|
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);
|
||||||
checkAutoSaveFreqMode();
|
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
262
ubitx_20/ubitx_idle.ino
Normal file
262
ubitx_20/ubitx_idle.ino
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
strcpy(line2Buffer, "RitTX:");
|
||||||
|
/*
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmpFreq = vfoB;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@@ -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;
|
||||||
|
|
||||||
@@ -176,6 +172,9 @@ void cwKeyer(void){
|
|||||||
keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits
|
keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits
|
||||||
keyerState = KEYED; // next state
|
keyerState = KEYED; // next state
|
||||||
if (!inTx){
|
if (!inTx){
|
||||||
|
//DelayTime Option
|
||||||
|
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||||
|
|
||||||
keyDown = 0;
|
keyDown = 0;
|
||||||
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||||
startTx(TX_CW, 1);
|
startTx(TX_CW, 1);
|
||||||
@@ -208,7 +207,7 @@ void cwKeyer(void){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Check_Cat(3);
|
Check_Cat(2);
|
||||||
} //end of while
|
} //end of while
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -216,6 +215,9 @@ void cwKeyer(void){
|
|||||||
if (update_PaddleLatch(0) == DIT_L) {
|
if (update_PaddleLatch(0) == DIT_L) {
|
||||||
// if we are here, it is only because the key is pressed
|
// if we are here, it is only because the key is pressed
|
||||||
if (!inTx){
|
if (!inTx){
|
||||||
|
//DelayTime Option
|
||||||
|
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||||
|
|
||||||
keyDown = 0;
|
keyDown = 0;
|
||||||
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||||
startTx(TX_CW, 1);
|
startTx(TX_CW, 1);
|
||||||
@@ -233,13 +235,14 @@ void cwKeyer(void){
|
|||||||
keyDown = 0;
|
keyDown = 0;
|
||||||
stopTx();
|
stopTx();
|
||||||
}
|
}
|
||||||
if (!cwTimeout)
|
//if (!cwTimeout) //removed by KD8CEC
|
||||||
return;
|
// return;
|
||||||
// got back to the beginning of the loop, if no further activity happens on straight key
|
// 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
|
// we will time out, and return out of this routine
|
||||||
//delay(5);
|
//delay(5);
|
||||||
delay_background(5, 3);
|
//delay_background(5, 3); //removed by KD8CEC
|
||||||
continue;
|
//continue; //removed by KD8CEC
|
||||||
|
return; //Tx stop control by Main Loop
|
||||||
}
|
}
|
||||||
|
|
||||||
Check_Cat(2);
|
Check_Cat(2);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -60,6 +60,7 @@ void i2cWriten(uint8_t reg, uint8_t *vals, uint8_t vcnt) { // write array
|
|||||||
Wire.endTransmission();
|
Wire.endTransmission();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t si5351Val[8] = {0, 1, 0, 0, 0, 0, 0, 0}; //for reduce program memory size
|
||||||
|
|
||||||
void si5351bx_init() { // Call once at power-up, start PLLA
|
void si5351bx_init() { // Call once at power-up, start PLLA
|
||||||
uint32_t msxp1;
|
uint32_t msxp1;
|
||||||
@@ -68,11 +69,13 @@ void si5351bx_init() { // Call once at power-up, start PLLA
|
|||||||
i2cWrite(3, si5351bx_clken); // Disable all CLK output drivers
|
i2cWrite(3, si5351bx_clken); // Disable all CLK output drivers
|
||||||
i2cWrite(183, SI5351BX_XTALPF << 6); // Set 25mhz crystal load capacitance
|
i2cWrite(183, SI5351BX_XTALPF << 6); // Set 25mhz crystal load capacitance
|
||||||
msxp1 = 128 * SI5351BX_MSA - 512; // and msxp2=0, msxp3=1, not fractional
|
msxp1 = 128 * SI5351BX_MSA - 512; // and msxp2=0, msxp3=1, not fractional
|
||||||
uint8_t vals[8] = {0, 1, BB2(msxp1), BB1(msxp1), BB0(msxp1), 0, 0, 0};
|
//uint8_t vals[8] = {0, 1, BB2(msxp1), BB1(msxp1), BB0(msxp1), 0, 0, 0};
|
||||||
i2cWriten(26, vals, 8); // Write to 8 PLLA msynth regs
|
si5351Val[2] = BB2(msxp1);
|
||||||
|
si5351Val[3] = BB1(msxp1);
|
||||||
|
si5351Val[4] = BB0(msxp1);
|
||||||
|
|
||||||
|
i2cWriten(26, si5351Val, 8); // Write to 8 PLLA msynth regs
|
||||||
i2cWrite(177, 0x20); // Reset PLLA (0x80 resets PLLB)
|
i2cWrite(177, 0x20); // Reset PLLA (0x80 resets PLLB)
|
||||||
// for (reg=16; reg<=23; reg++) i2cWrite(reg, 0x80); // Powerdown CLK's
|
|
||||||
// i2cWrite(187, 0); // No fannout of clkin, xtal, ms0, ms4
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void si5351bx_setfreq(uint8_t clknum, uint32_t fout) { // Set a CLK to fout Hz
|
void si5351bx_setfreq(uint8_t clknum, uint32_t fout) { // Set a CLK to fout Hz
|
||||||
@@ -109,7 +112,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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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,36 +71,52 @@ 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){
|
||||||
@@ -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,17 +259,37 @@ 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
|
||||||
strcat(c, "B:");
|
strcat(c, "B:");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Fixed by Mitani Massaru (JE4SMQ)
|
||||||
|
if (isShiftDisplayCWFreq == 1)
|
||||||
|
{
|
||||||
|
if (cwMode == 1) //CWL
|
||||||
|
tmpFreq = tmpFreq - sideTone + shiftDisplayAdjustVal;
|
||||||
|
else if (cwMode == 2) //CWU
|
||||||
|
tmpFreq = tmpFreq + sideTone + shiftDisplayAdjustVal;
|
||||||
|
}
|
||||||
|
|
||||||
//display frequency
|
//display frequency
|
||||||
for (int i = 15; i >= 6; i--) {
|
for (int i = 15; i >= 6; i--) {
|
||||||
if (tmpFreq > 0) {
|
if (tmpFreq > 0) {
|
||||||
@@ -251,36 +309,24 @@ 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(":");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
//now, the second line
|
|
||||||
memset(c, 0, sizeof(c));
|
|
||||||
memset(b, 0, sizeof(b));
|
|
||||||
|
|
||||||
if (inTx)
|
|
||||||
strcat(c, "TX ");
|
|
||||||
else if (ritOn)
|
|
||||||
strcpy(c, "RIT");
|
|
||||||
|
|
||||||
strcpy(c, " \xff");
|
|
||||||
drawMeter(meter_reading);
|
|
||||||
strcat(c, meter);
|
|
||||||
strcat(c, "\xff");
|
|
||||||
printLine2(c);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int enc_prev_state = 3;
|
int enc_prev_state = 3;
|
||||||
|
BIN
ubitxmanager ubuntu.odt
Normal file
BIN
ubitxmanager ubuntu.odt
Normal file
Binary file not shown.
Reference in New Issue
Block a user