Compare commits
128 Commits
version1.0
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
295c49969f | ||
|
262ef3947a | ||
|
a4d9f6e6c5 | ||
|
395dd42459 | ||
|
f25bf57556 | ||
|
171f889f4a | ||
|
05de66a038 | ||
|
2c075d5236 | ||
|
37fcc5975a | ||
|
450f57ae0f | ||
|
c34e798313 | ||
|
df2c493700 | ||
|
9ff8365c3f | ||
|
948267bb39 | ||
|
e79dbdbbe7 | ||
|
7c1ee29500 | ||
|
4ee3631db0 | ||
|
c27bbf1b6b | ||
|
b984f62dfd | ||
|
41548163cf | ||
|
1ce889eef0 | ||
|
dd43ba4c33 | ||
|
fe44c703c5 | ||
|
22bb9ee112 | ||
|
c73fffb25b | ||
|
82177199c4 | ||
|
0e13dd0267 | ||
|
c602fdde7c | ||
|
edadce7d89 | ||
|
9da71429cb | ||
|
3050374504 | ||
|
152b63a9ed | ||
|
72ccd3b0e4 | ||
|
e81413fa02 | ||
|
c6b020fa70 | ||
|
2e8c97f19b | ||
|
337320b433 | ||
|
7c8088f753 | ||
|
b172527d00 | ||
|
67cdd14945 | ||
|
b375b7e9e4 | ||
|
27092d23e0 | ||
|
8a6e01e289 | ||
|
83dc1de18e | ||
|
2de1c873a1 | ||
|
4d97ac2283 | ||
|
65d21aba77 | ||
|
6a2369bc27 | ||
|
76d5c362d0 | ||
|
70fc6aeba8 | ||
|
75d952718b | ||
|
1d28f3e7e9 | ||
|
51f690ef85 | ||
|
12984486a6 | ||
|
e961cd8ac9 | ||
|
5c40718bec | ||
|
6add092391 | ||
|
3b4bdafacc | ||
|
82d9682ee9 | ||
|
6be127d811 | ||
|
5b13ede65b | ||
|
0aafe32e27 | ||
|
289ae1bd77 | ||
|
5611e1c0ff | ||
|
86797181cf | ||
|
f600c18541 | ||
|
11b6fbc1f4 | ||
|
0e245fc488 | ||
|
d721816039 | ||
|
34be2d0845 | ||
|
0996870154 | ||
|
9c4b694ce2 | ||
|
5afcdf2583 | ||
|
075f585a1e | ||
|
d0c04df9d8 | ||
|
4e9437a735 | ||
|
384c3c41b2 | ||
|
a21dbe2fa5 | ||
|
9faa8bb44c | ||
|
d926b15e3d | ||
|
c911d26163 | ||
|
98e3b41f5a | ||
|
277666f82f | ||
|
e532dccce7 | ||
|
04949cdb93 | ||
|
bbdd0947d3 | ||
|
a374297d49 | ||
|
c1d81d9d5b | ||
|
d69588d999 | ||
|
e915c21412 | ||
|
55cfeeb924 | ||
|
c8879e0e59 | ||
|
4f5ac283b7 | ||
|
3058d52551 | ||
|
04699ba074 | ||
|
aa61281c38 | ||
|
261215b1ad | ||
|
1a2f5b4fde | ||
|
8203427808 | ||
|
4e15f2150c | ||
|
82a5fd7df9 | ||
|
386a0b2d46 | ||
|
c6401af7d1 | ||
|
b153a305d6 | ||
|
e61e45d3dd | ||
|
a1f941f965 | ||
|
d1e72b3bd5 | ||
|
032e7f919f | ||
|
b6bc264332 | ||
|
b1cc5eb98a | ||
|
2fe1662d67 | ||
|
ebbc5aae5e | ||
|
209cd3a49c | ||
|
95e5c1dfe5 | ||
|
45a8479061 | ||
|
a6ad381c24 | ||
|
bcf80f851d | ||
|
16304efacd | ||
|
968024ab73 | ||
|
3e60728727 | ||
|
9781ef086b | ||
|
f27f504ea4 | ||
|
2b08a76fbf | ||
|
90655e03b8 | ||
|
8551ff1b68 | ||
|
5ce94e8e49 | ||
|
7ef9c29fa8 | ||
|
fda398046e |
173
README.md
173
README.md
@ -1,31 +1,21 @@
|
|||||||
#IMPORTANT INFORMATION
|
#KC4UPR'S NOTE
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
- Beta 0.26 and Beta 0.261, Beta 0.262, Beta 0.27 is complete test
|
This is a fork of the KD8CEC firmware that will be specific to my uBITX V5
|
||||||
- You can download and use it.
|
installation. My intent is to remove unnecessary code, as well as make some
|
||||||
|
GPIO changes based on my use of the Nextion LCD. Specifically, I'd like to
|
||||||
|
eliminate the use of analog I/O for reading the CW keys, and possibly enable
|
||||||
|
control of accessories such as filters using the extra GPIO pins that are
|
||||||
|
now available.
|
||||||
|
|
||||||
#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.
|
- Now Release Version 1.20 on my blog (http://www.hamskey.com)
|
||||||
|
- You can download and compiled hex file and uBITX Manager application on release section (https://github.com/phdlee/ubitx/releases)
|
||||||
- fixed bugs...
|
- For more information, see my blog (http://www.hamskey.com)
|
||||||
- Diallock for uBITX's sensitive encoders
|
|
||||||
- built in softare Memory keyer and cw options control for CW communication
|
|
||||||
- Implementation of CAT communication protocol for Digital Communication (as FT8, JT65, etc)
|
|
||||||
- Delay Options for external Linear.
|
|
||||||
- and more...
|
|
||||||
|
|
||||||
Most of the basic functions of the HF transceiver I thought were implemented.
|
|
||||||
The minimum basic specification for uBITX to operate as a radio, I think it is finished.
|
|
||||||
So I will release the 0.27 version and if I do not see the bug anymore, I will try to change the version name to 1.0.
|
|
||||||
Now uBITX is an HF radio and will be able to join you in your happy hams life.
|
|
||||||
Based on this source, you can use it by adding functions.
|
|
||||||
|
|
||||||
I am going to do a new project based on this source, linking with WSPR, WSJT-X and so on.
|
|
||||||
Of course, this repository is still running. If you have any bugs or ideas, please feel free to email me.
|
|
||||||
|
|
||||||
http://www.hamskey.com
|
http://www.hamskey.com
|
||||||
|
|
||||||
DE KD8CEC
|
Ian KD8CEC
|
||||||
kd8cec@gmail.com
|
kd8cec@gmail.com
|
||||||
|
|
||||||
#uBITX
|
#uBITX
|
||||||
@ -36,16 +26,143 @@ 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.
|
- Add TTS module
|
||||||
- User Interface on LCD -> Option by user (not need)
|
- Direct control for Student
|
||||||
- Include WSPR Beacone function - (implement other new repository)
|
|
||||||
complete experiment
|
|
||||||
need solve : Big code size (over 100%, then remove some functions for experment)
|
|
||||||
need replace Si5351 Library (increase risk and need more beta tester)
|
|
||||||
W3PM sent me his wonderful source - using BITX, GPS
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
## REVISION RECORD
|
## REVISION RECORD
|
||||||
|
1.20
|
||||||
|
- Support uBITX V5
|
||||||
|
- Change to SDR Frequency (Remove just RTL-SDR's error Frequency (2390Hz))
|
||||||
|
1.12
|
||||||
|
- Support Custom LPF Control
|
||||||
|
- Other Minor Bugs
|
||||||
|
1.1
|
||||||
|
- Support Nextion LCD, TJC LCD
|
||||||
|
- Read & Backup uBITX, ADC Monitoring, ATT, IF-Shift and more on Nextion LCD (TJC LCD)
|
||||||
|
- Factory Reset (Both Character LCD and Nextion LCD are applicable)
|
||||||
|
- Support Signal Meter using ADC (A7 Port)
|
||||||
|
- Supoort I2C Signal Meter
|
||||||
|
- Spectrum
|
||||||
|
- Band Scan
|
||||||
|
- Memory Control on Nextion LCD (TJC LCD)
|
||||||
|
- Speed Change CW-Option on Nextion LCD
|
||||||
|
- Fixed Band Change Bug (Both Character LCD and Nextion LCD are applicable)
|
||||||
|
- uBITX Manager removed the Encode and Decode buttons. The procedure has become a bit easier.
|
||||||
|
- I2C Device Scan on uBITX Manager ( Both Character LCD and Nextion LCD are applicable)
|
||||||
|
- Si5351 I2C Address can be changed
|
||||||
|
- Recovery using QR-Code Data from Server
|
||||||
|
- Nextion LCD and TJC LCD can display Spectrum and CW Decode (using Stand alone S-Meter)
|
||||||
|
- Other Minor Bugs
|
||||||
|
|
||||||
|
1.09 (Beta)
|
||||||
|
- include 1.094 beta, 1.095 beta, 1.097 beta
|
||||||
|
|
||||||
|
1.08
|
||||||
|
- Receive performance is improved compared to the original firmware or version 1.061
|
||||||
|
- ATT function has been added to reduce RF gain (Shift 45Mhz IF)
|
||||||
|
- Added the ability to connect SDR. (Low cost RTL-SDR available)
|
||||||
|
- Added a protocol to ADC Monitoring in CAT communications
|
||||||
|
- Various LCD support, 16x02 Parallel LCD - It is the LCD equipped with uBITX, 16x02 I2C LCD, 20x04 Parallel LCD, 20x04 I2C LCD, 16x02 I2C Dual LCD
|
||||||
|
- Added Extended Switch Support
|
||||||
|
- Support S Meter
|
||||||
|
- Added S-Meter setting assistant to uBITX Manager
|
||||||
|
- Add recovery mode (such as Factory Reset)
|
||||||
|
- There have been many other improvements and fixes. More information is available on the blog. (http://www.hamskey.com)
|
||||||
|
|
||||||
|
1.07 (Beta)
|
||||||
|
- include 1.071 beta, 1.073 beta, 1.075 beta
|
||||||
|
- Features implemented in the beta version have been applied to Version 1.08 above.
|
||||||
|
|
||||||
|
1.061
|
||||||
|
- Added WSPR
|
||||||
|
You only need uBITX to use WSPR. No external devices are required.
|
||||||
|
Added Si5351 module for WSPR
|
||||||
|
- Update uBITX Manager to Version 1.0
|
||||||
|
- Reduce program size
|
||||||
|
for WSPR
|
||||||
|
for other Module
|
||||||
|
- Fixed IF Shift Bug
|
||||||
|
Disable IF Shift on TX
|
||||||
|
IF shift available in USB mode
|
||||||
|
Fixed cat routine in IF Shift setup
|
||||||
|
- Bugs fixed
|
||||||
|
cw start delay option
|
||||||
|
Auto key Bug
|
||||||
|
(found bug : LZ1LDO)
|
||||||
|
Message selection when Auto Key is used in RIT mode
|
||||||
|
(found bug : gerald)
|
||||||
|
- Improve CW Keying (start TX)
|
||||||
|
|
||||||
|
1.05
|
||||||
|
- include 1.05W, 1.051, 1.051W
|
||||||
|
- for WSPR Beta Test Version
|
||||||
|
|
||||||
|
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
|
||||||
|
- implemented the function to monitor the value of all analog inputs. This allows you to monitor the status of the CW keys connected to your uBITX.
|
||||||
|
- possible to set the ADC range for CW Keying. If no setting is made, it will have the same range as the original code. If you set the CW Keying ADC Values using uBITX Manager 0.3, you can reduce the key error.
|
||||||
|
- Added the function to select Straight Key, IAMBICA, IAMBICB key from the menu.
|
||||||
|
- default Band select is Ham Band mode, if you want common type, long press function key at band select menu, uBITX Manager can be used to modify frequencies to suit your country.
|
||||||
|
|
||||||
|
0.29
|
||||||
|
- Remove the use of initialization values in BFO settings - using crruent value, if factory reset
|
||||||
|
- Select Tune Step, default 0, 20, 50, 100, 200, Use the uBITX Manager to set the steps value you want. You can select Step by pressing and holding the Function Key (1sec ~ 2sec).
|
||||||
|
- Modify Dial Lock Function, Press the Function key for more than 3 seconds to toggle dial lock.
|
||||||
|
- created a new frequency tune method. remove original source codes, Threshold has been applied to reduce malfunction. checked the continuity of the user operating to make natural tune possible.
|
||||||
|
- stabilize and remove many warning messages - by Pullrequest and merge
|
||||||
|
- Changed cw keying method. removed the original code and applied Ron's code and Improved compatibility with original hardware and CAT commnication. It can be used without modification of hardware.
|
||||||
|
|
||||||
|
0.28
|
||||||
|
- Fixed CAT problem with hamlib on Linux
|
||||||
|
- restore Protocol autorecovery logic
|
||||||
|
|
||||||
0.27
|
0.27
|
||||||
(First alpha test version, This will be renamed to the major version 1.0)
|
(First alpha test version, This will be renamed to the major version 1.0)
|
||||||
- Dual VFO Dial Lock (vfoA Dial lock)
|
- Dual VFO Dial Lock (vfoA Dial lock)
|
||||||
|
30
VersionInfo.txt
Normal file
30
VersionInfo.txt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
This file will guide you to change the source code file.
|
||||||
|
For Windows-based Arduino IDE users, the directory name and the Main source file name must be the same.
|
||||||
|
You do not need to learn github to download .hex files or source code that I release.
|
||||||
|
However, if you want to see what I'm doing right now, you should use the github homepage.
|
||||||
|
|
||||||
|
You do not need to learn git to suggest source code. If you give me an e-mail, I will correct it at any time.
|
||||||
|
If you have not joined the BITX Group, join group. There will be discussions on various topics every day.
|
||||||
|
I am getting a lot of hints from the group.
|
||||||
|
|
||||||
|
Ian KD8CEC
|
||||||
|
kd8cec@gmail.com
|
||||||
|
==================================================================
|
||||||
|
Files modified in Version1.08 Beta
|
||||||
|
|
||||||
|
1.Delted Files.
|
||||||
|
|
||||||
|
2.Added Files
|
||||||
|
|
||||||
|
3.Modified Files
|
||||||
|
- ubitx_20.ino
|
||||||
|
- ubitx_ui.ino
|
||||||
|
- cat_libs.ino
|
||||||
|
- ubitx.h
|
||||||
|
- ubitx_eemap.h
|
||||||
|
- ubitx_lcd_1602.ino
|
||||||
|
- ubitx_lcd_1602Dual.ino
|
||||||
|
- ubitx_lcd_2004.ino
|
||||||
|
- ubitx_wspr.ino
|
||||||
|
|
||||||
|
|
@ -31,8 +31,8 @@
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
#define printLineF1(x) (printLineF(1, x))
|
|
||||||
#define printLineF2(x) (printLineF(0, x))
|
#include "ubitx.h"
|
||||||
|
|
||||||
//for broken protocol
|
//for broken protocol
|
||||||
#define CAT_RECEIVE_TIMEOUT 500
|
#define CAT_RECEIVE_TIMEOUT 500
|
||||||
@ -252,12 +252,35 @@ void ReadEEPRom() //for remove warnings.
|
|||||||
|
|
||||||
Serial.write(0x02); //STX
|
Serial.write(0x02); //STX
|
||||||
checkSum = 0x02;
|
checkSum = 0x02;
|
||||||
|
//I2C Scanner
|
||||||
|
//Magic Key Start 59414, Length : 48583
|
||||||
|
//if (eepromStartIndex == 59414 && eepromReadLength == 48583)
|
||||||
|
if (CAT_BUFF[0] == 0x16 && CAT_BUFF[1] == 0xe8)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 1; i < 127; i++)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(i);
|
||||||
|
read1Byte = Wire.endTransmission();
|
||||||
|
if (read1Byte == 0)
|
||||||
|
{
|
||||||
|
Serial.write(i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.write(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
for (uint16_t i = 0; i < eepromReadLength; i++)
|
for (uint16_t i = 0; i < eepromReadLength; i++)
|
||||||
{
|
{
|
||||||
read1Byte = EEPROM.read(eepromStartIndex + i);
|
read1Byte = EEPROM.read(eepromStartIndex + i);
|
||||||
checkSum += read1Byte;
|
checkSum += read1Byte;
|
||||||
Serial.write(read1Byte);
|
Serial.write(read1Byte);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Serial.write(checkSum);
|
Serial.write(checkSum);
|
||||||
Serial.write(ACK);
|
Serial.write(ACK);
|
||||||
}
|
}
|
||||||
@ -277,8 +300,20 @@ void WriteEEPRom(void) //for remove warning
|
|||||||
Serial.write(ACK);
|
Serial.write(ACK);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
//Special Command
|
||||||
|
if (eepromStartIndex == 13131) //Magic Key
|
||||||
|
{
|
||||||
|
if (write1Byte == 0x51) //Restart
|
||||||
|
{
|
||||||
|
asm volatile (" jmp 0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
EEPROM.write(eepromStartIndex, write1Byte);
|
EEPROM.write(eepromStartIndex, write1Byte);
|
||||||
|
}
|
||||||
|
|
||||||
Serial.write(0x77); //OK
|
Serial.write(0x77); //OK
|
||||||
Serial.write(ACK);
|
Serial.write(ACK);
|
||||||
}
|
}
|
||||||
@ -642,7 +677,7 @@ void SetIFSValue(void)
|
|||||||
//void CatRxStatus(byte fromType)
|
//void CatRxStatus(byte fromType)
|
||||||
void CatRxStatus(void) //for remove warning
|
void CatRxStatus(void) //for remove warning
|
||||||
{
|
{
|
||||||
byte sMeterValue = 1;
|
byte sMeterValue = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
http://www.ka7oei.com/ft817_meow.html
|
http://www.ka7oei.com/ft817_meow.html
|
||||||
@ -655,6 +690,33 @@ void CatRxStatus(void) //for remove warning
|
|||||||
Bit 7 is 0 if there is a signal present, or 1 if the receiver is squelched.
|
Bit 7 is 0 if there is a signal present, or 1 if the receiver is squelched.
|
||||||
*/
|
*/
|
||||||
// The lower 4 bits (0-3) of this byte indicate the current S-meter reading. 00 refers to an S-Zero reading, 04 = S4, 09 = S9, 0A = "10 over," 0B = "20 over" and so on up to 0F.
|
// The lower 4 bits (0-3) of this byte indicate the current S-meter reading. 00 refers to an S-Zero reading, 04 = S4, 09 = S9, 0A = "10 over," 0B = "20 over" and so on up to 0F.
|
||||||
|
//0~8
|
||||||
|
switch (scaledSMeter)
|
||||||
|
{
|
||||||
|
case 8 : sMeterValue = 0x0B;
|
||||||
|
break;
|
||||||
|
case 7 : sMeterValue = 0x0A;
|
||||||
|
break;
|
||||||
|
case 6 : sMeterValue = 0x09;
|
||||||
|
break;
|
||||||
|
case 5 : sMeterValue = 0x07;
|
||||||
|
break;
|
||||||
|
case 4 : sMeterValue = 0x05;
|
||||||
|
break;
|
||||||
|
case 3 : sMeterValue = 0x04;
|
||||||
|
break;
|
||||||
|
case 2 : sMeterValue = 0x02;
|
||||||
|
break;
|
||||||
|
case 1 : sMeterValue = 0x01;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
sMeterValue = (scaledSMeter * 2) -1;
|
||||||
|
if (sMeterValue > 0)
|
||||||
|
sMeterValue--;
|
||||||
|
*/
|
||||||
|
|
||||||
CAT_BUFF[0] = sMeterValue & 0b00001111;
|
CAT_BUFF[0] = sMeterValue & 0b00001111;
|
||||||
SendCatData(1);
|
SendCatData(1);
|
||||||
}
|
}
|
||||||
|
@ -235,30 +235,6 @@ void sendCWChar(char cwKeyChar)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void sendAutoCW(int cwSendLength, char *sendString)
|
|
||||||
{
|
|
||||||
byte i;
|
|
||||||
|
|
||||||
if (!inTx){
|
|
||||||
keyDown = 0;
|
|
||||||
cwTimeout = millis() + cwDelayTime * 10;
|
|
||||||
startTx(TX_CW, 0); //disable updateDisplay Command for reduce latency time
|
|
||||||
updateDisplay();
|
|
||||||
|
|
||||||
delay_background(delayBeforeCWStartTime * 2, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < cwSendLength; i++)
|
|
||||||
{
|
|
||||||
sendCWChar(sendString[i]);
|
|
||||||
if (i != cwSendLength -1) delay_background(cwSpeed * 3, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
delay_background(cwDelayTime * 10, 2);
|
|
||||||
stopTx();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
byte isNeedScroll = 0;
|
byte isNeedScroll = 0;
|
||||||
unsigned long scrollDispayTime = 0;
|
unsigned long scrollDispayTime = 0;
|
||||||
#define scrollSpeed 500
|
#define scrollSpeed 500
|
||||||
@ -297,17 +273,18 @@ void controlAutoCW(){
|
|||||||
displayScrolStep = 0;
|
displayScrolStep = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
//Not need Scroll
|
||||||
|
//Display_AutoKeyTextIndex(selectedCWTextIndex);
|
||||||
|
SendCommand1Num('w', selectedCWTextIndex); //Index
|
||||||
|
SendEEPromData('a', cwStartIndex + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ, 0) ; //Data
|
||||||
|
SendCommand1Num('y', 1); //Send YN
|
||||||
|
isNeedScroll = 0;
|
||||||
|
#else
|
||||||
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ, 0);
|
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ, 0);
|
||||||
|
|
||||||
//byte diplayAutoCWLine = 0;
|
|
||||||
//if ((displayOption1 & 0x01) == 0x01)
|
|
||||||
// diplayAutoCWLine = 1;
|
|
||||||
|
|
||||||
Display_AutoKeyTextIndex(selectedCWTextIndex);
|
|
||||||
//lcd.setCursor(0, diplayAutoCWLine);
|
|
||||||
//lcd.write(byteToChar(selectedCWTextIndex));
|
|
||||||
//lcd.write(':');
|
|
||||||
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
|
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
|
||||||
|
Display_AutoKeyTextIndex(selectedCWTextIndex);
|
||||||
|
#endif
|
||||||
scrollDispayTime = millis() + scrollSpeed;
|
scrollDispayTime = millis() + scrollSpeed;
|
||||||
beforeCWTextIndex = selectedCWTextIndex;
|
beforeCWTextIndex = selectedCWTextIndex;
|
||||||
}
|
}
|
||||||
|
334
ubitx_20/softserial_tiny.cpp
Normal file
334
ubitx_20/softserial_tiny.cpp
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
/*
|
||||||
|
Softserial for Nextion LCD and Control MCU
|
||||||
|
KD8CEC, Ian Lee
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
It is a library rewritten in C format based on SoftwareSerial.c.
|
||||||
|
I tried to use as much as possible without modifying the SoftwareSerial.
|
||||||
|
But eventually I had to modify the code.
|
||||||
|
|
||||||
|
I rewrote it in C for the following reasons.
|
||||||
|
- Problems occurred when increasing Program Size and Program Memory
|
||||||
|
- We had to reduce the program size.
|
||||||
|
Of course, Software Serial is limited to one.
|
||||||
|
- reduce the steps for transmitting and receiving
|
||||||
|
|
||||||
|
useage
|
||||||
|
extern void SWSerial_Begin(long speedBaud);
|
||||||
|
extern void SWSerial_Write(uint8_t b);
|
||||||
|
extern int SWSerial_Available(void);
|
||||||
|
extern int SWSerial_Read(void);
|
||||||
|
extern void SWSerial_Print(uint8_t *b);
|
||||||
|
|
||||||
|
If you use Softwreserial library instead of this library, you can modify the code as shown below.
|
||||||
|
I kept the function name of SoftwareSerial so you only need to modify a few lines of code.
|
||||||
|
|
||||||
|
define top of source code
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
SoftwareSerial sSerial(10, 11); // RX, TX
|
||||||
|
|
||||||
|
replace source code
|
||||||
|
SWSerial_Begin to sSerial.begin
|
||||||
|
SWSerial_Write to sSerial.write
|
||||||
|
SWSerial_Available to sSerial.available
|
||||||
|
SWSerial_Read to sSerial.read
|
||||||
|
|
||||||
|
KD8CEC, Ian Lee
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
All licenses for the source code are subject to the license of the original source SoftwareSerial Library.
|
||||||
|
However, if you use or modify this code, please keep the all comments in this source code.
|
||||||
|
KD8CEC
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
License from SoftwareSerial
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
SoftwareSerial.cpp (formerly NewSoftSerial.cpp) -
|
||||||
|
Multi-instance software serial library for Arduino/Wiring
|
||||||
|
-- Interrupt-driven receive and other improvements by ladyada
|
||||||
|
(http://ladyada.net)
|
||||||
|
-- Tuning, circular buffer, derivation from class Print/Stream,
|
||||||
|
multi-instance support, porting to 8MHz processors,
|
||||||
|
various optimizations, PROGMEM delay tables, inverse logic and
|
||||||
|
direct port writing by Mikal Hart (http://www.arduiniana.org)
|
||||||
|
-- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com)
|
||||||
|
-- 20MHz processor support by Garrett Mace (http://www.macetech.com)
|
||||||
|
-- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
The latest version of this library can always be found at
|
||||||
|
http://arduiniana.org.
|
||||||
|
*/
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
//================================================================
|
||||||
|
//Public Variable
|
||||||
|
//================================================================
|
||||||
|
#define TX_PIN 9
|
||||||
|
#define RX_PIN 8
|
||||||
|
#define _SS_MAX_RX_BUFF 35 // RX buffer size
|
||||||
|
#define PRINT_MAX_LENGTH 30
|
||||||
|
|
||||||
|
//================================================================
|
||||||
|
//Internal Variable from SoftwareSerial.c and SoftwareSerial.h
|
||||||
|
//================================================================
|
||||||
|
//variable from softwareserial.c and softwareserial.h
|
||||||
|
static uint8_t swr_receive_buffer[_SS_MAX_RX_BUFF];
|
||||||
|
|
||||||
|
volatile uint8_t *_transmitPortRegister; //Write Port Register
|
||||||
|
uint8_t transmit_RegMask; //use Mask bit 1
|
||||||
|
uint8_t transmit_InvMask; //use mask bit 0
|
||||||
|
|
||||||
|
volatile uint8_t *_receivePortRegister; //Read Port Register
|
||||||
|
uint8_t _receiveBitMask;
|
||||||
|
|
||||||
|
//delay value for Bit
|
||||||
|
uint16_t _tx_delay;
|
||||||
|
|
||||||
|
//delay value for Receive
|
||||||
|
uint16_t _rx_delay_stopbit;
|
||||||
|
uint16_t _rx_delay_centering;
|
||||||
|
uint16_t _rx_delay_intrabit;
|
||||||
|
|
||||||
|
//Customize for uBITX Protocol
|
||||||
|
int8_t receiveIndex = 0;
|
||||||
|
uint8_t receivedCommandLength = 0;
|
||||||
|
int8_t ffCount = 0;
|
||||||
|
|
||||||
|
//Values for Receive Buffer
|
||||||
|
//uint16_t _buffer_overflow;
|
||||||
|
//static volatile uint8_t _receive_buffer_head;
|
||||||
|
//static volatile uint8_t _receive_buffer_tail;
|
||||||
|
|
||||||
|
//Values for Interrupt (check Start Bit)
|
||||||
|
volatile uint8_t *_pcint_maskreg;
|
||||||
|
uint8_t _pcint_maskvalue;
|
||||||
|
|
||||||
|
//================================================================
|
||||||
|
//Internal Function from SoftwareSerial.c
|
||||||
|
//================================================================
|
||||||
|
uint16_t subtract_cap(uint16_t num, uint16_t sub)
|
||||||
|
{
|
||||||
|
if (num > sub)
|
||||||
|
return num - sub;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void tunedDelay(uint16_t delay)
|
||||||
|
{
|
||||||
|
_delay_loop_2(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setRxIntMsk(bool enable)
|
||||||
|
{
|
||||||
|
if (enable)
|
||||||
|
*_pcint_maskreg |= _pcint_maskvalue;
|
||||||
|
else
|
||||||
|
*_pcint_maskreg &= ~_pcint_maskvalue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t rx_pin_read()
|
||||||
|
{
|
||||||
|
return *_receivePortRegister & _receiveBitMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// The receive routine called by the interrupt handler
|
||||||
|
//
|
||||||
|
void softSerail_Recv()
|
||||||
|
{
|
||||||
|
#if GCC_VERSION < 40302
|
||||||
|
// Work-around for avr-gcc 4.3.0 OSX version bug
|
||||||
|
// Preserve the registers that the compiler misses
|
||||||
|
// (courtesy of Arduino forum user *etracer*)
|
||||||
|
asm volatile(
|
||||||
|
"push r18 \n\t"
|
||||||
|
"push r19 \n\t"
|
||||||
|
"push r20 \n\t"
|
||||||
|
"push r21 \n\t"
|
||||||
|
"push r22 \n\t"
|
||||||
|
"push r23 \n\t"
|
||||||
|
"push r26 \n\t"
|
||||||
|
"push r27 \n\t"
|
||||||
|
::);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint8_t d = 0;
|
||||||
|
|
||||||
|
// If RX line is high, then we don't see any start bit
|
||||||
|
// so interrupt is probably not for us
|
||||||
|
if (!rx_pin_read()) //Start Bit
|
||||||
|
{
|
||||||
|
// Disable further interrupts during reception, this prevents
|
||||||
|
// triggering another interrupt directly after we return, which can
|
||||||
|
// cause problems at higher baudrates.
|
||||||
|
setRxIntMsk(false);
|
||||||
|
|
||||||
|
// Wait approximately 1/2 of a bit width to "center" the sample
|
||||||
|
tunedDelay(_rx_delay_centering);
|
||||||
|
|
||||||
|
// Read each of the 8 bits
|
||||||
|
for (uint8_t i=8; i > 0; --i)
|
||||||
|
{
|
||||||
|
tunedDelay(_rx_delay_intrabit);
|
||||||
|
d >>= 1;
|
||||||
|
|
||||||
|
if (rx_pin_read())
|
||||||
|
d |= 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (receivedCommandLength == 0) //check Already Command
|
||||||
|
{
|
||||||
|
//Set Received Data
|
||||||
|
swr_receive_buffer[receiveIndex++] = d;
|
||||||
|
|
||||||
|
//Finded Command
|
||||||
|
if (d == 0x73 && ffCount > 1 && receiveIndex > 6)
|
||||||
|
{
|
||||||
|
receivedCommandLength = receiveIndex;
|
||||||
|
receiveIndex = 0;
|
||||||
|
ffCount = 0;
|
||||||
|
}
|
||||||
|
else if (receiveIndex > _SS_MAX_RX_BUFF)
|
||||||
|
{
|
||||||
|
//Buffer Overflow
|
||||||
|
receiveIndex = 0;
|
||||||
|
ffCount = 0;
|
||||||
|
}
|
||||||
|
else if (d == 0xFF)
|
||||||
|
{
|
||||||
|
ffCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ffCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip the stop bit
|
||||||
|
tunedDelay(_rx_delay_stopbit);
|
||||||
|
|
||||||
|
// Re-enable interrupts when we're sure to be inside the stop bit
|
||||||
|
setRxIntMsk(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GCC_VERSION < 40302
|
||||||
|
// Work-around for avr-gcc 4.3.0 OSX version bug
|
||||||
|
// Restore the registers that the compiler misses
|
||||||
|
asm volatile(
|
||||||
|
"pop r27 \n\t"
|
||||||
|
"pop r26 \n\t"
|
||||||
|
"pop r23 \n\t"
|
||||||
|
"pop r22 \n\t"
|
||||||
|
"pop r21 \n\t"
|
||||||
|
"pop r20 \n\t"
|
||||||
|
"pop r19 \n\t"
|
||||||
|
"pop r18 \n\t"
|
||||||
|
::);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(PCINT0_vect)
|
||||||
|
{
|
||||||
|
softSerail_Recv();
|
||||||
|
}
|
||||||
|
|
||||||
|
//================================================================
|
||||||
|
//Public Function from SoftwareSerial.c and modified and create
|
||||||
|
//================================================================
|
||||||
|
// Read data from buffer
|
||||||
|
void SWSerial_Read(uint8_t * receive_cmdBuffer)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < receivedCommandLength; i++)
|
||||||
|
receive_cmdBuffer[i] = swr_receive_buffer[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SWSerial_Write(uint8_t b)
|
||||||
|
{
|
||||||
|
volatile uint8_t *reg = _transmitPortRegister;
|
||||||
|
uint8_t oldSREG = SREG;
|
||||||
|
uint16_t delay = _tx_delay;
|
||||||
|
|
||||||
|
cli(); // turn off interrupts for a clean txmit
|
||||||
|
|
||||||
|
// Write the start bit
|
||||||
|
*reg &= transmit_InvMask;
|
||||||
|
|
||||||
|
tunedDelay(delay);
|
||||||
|
|
||||||
|
// Write each of the 8 bits
|
||||||
|
for (uint8_t i = 8; i > 0; --i)
|
||||||
|
{
|
||||||
|
if (b & 1) // choose bit
|
||||||
|
*reg |= transmit_RegMask; // send 1
|
||||||
|
else
|
||||||
|
*reg &= transmit_InvMask; // send 0
|
||||||
|
|
||||||
|
tunedDelay(delay);
|
||||||
|
b >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore pin to natural state
|
||||||
|
*reg |= transmit_RegMask;
|
||||||
|
|
||||||
|
SREG = oldSREG; // turn interrupts back on
|
||||||
|
tunedDelay(_tx_delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SWSerial_Print(uint8_t *b)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < PRINT_MAX_LENGTH; i++)
|
||||||
|
{
|
||||||
|
if (b[i] == 0x00)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
SWSerial_Write(b[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SWSerial_Begin(long speedBaud)
|
||||||
|
{
|
||||||
|
//INT TX_PIN
|
||||||
|
digitalWrite(TX_PIN, HIGH);
|
||||||
|
pinMode(TX_PIN, OUTPUT);
|
||||||
|
transmit_RegMask = digitalPinToBitMask(TX_PIN); //use Bit 1
|
||||||
|
transmit_InvMask = ~digitalPinToBitMask(TX_PIN); //use Bit 0
|
||||||
|
_transmitPortRegister = portOutputRegister(digitalPinToPort(TX_PIN));
|
||||||
|
|
||||||
|
//INIT RX_PIN
|
||||||
|
pinMode(RX_PIN, INPUT);
|
||||||
|
digitalWrite(RX_PIN, HIGH); // pullup for normal logic!
|
||||||
|
_receiveBitMask = digitalPinToBitMask(RX_PIN);
|
||||||
|
_receivePortRegister = portInputRegister(digitalPinToPort(RX_PIN));
|
||||||
|
|
||||||
|
//Set Values
|
||||||
|
uint16_t bit_delay = (F_CPU / speedBaud) / 4;
|
||||||
|
_tx_delay = subtract_cap(bit_delay, 15 / 4);
|
||||||
|
|
||||||
|
if (digitalPinToPCICR(RX_PIN))
|
||||||
|
{
|
||||||
|
_rx_delay_centering = subtract_cap(bit_delay / 2, (4 + 4 + 75 + 17 - 23) / 4);
|
||||||
|
_rx_delay_intrabit = subtract_cap(bit_delay, 23 / 4);
|
||||||
|
_rx_delay_stopbit = subtract_cap(bit_delay * 3 / 4, (37 + 11) / 4);
|
||||||
|
*digitalPinToPCICR(RX_PIN) |= _BV(digitalPinToPCICRbit(RX_PIN));
|
||||||
|
_pcint_maskreg = digitalPinToPCMSK(RX_PIN);
|
||||||
|
_pcint_maskvalue = _BV(digitalPinToPCMSKbit(RX_PIN));
|
||||||
|
|
||||||
|
tunedDelay(_tx_delay); // if we were low this establishes the end
|
||||||
|
}
|
||||||
|
|
||||||
|
//Start Listen
|
||||||
|
setRxIntMsk(true);
|
||||||
|
}
|
326
ubitx_20/ubitx.h
326
ubitx_20/ubitx.h
@ -14,17 +14,295 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
#define WSPR_COUNT 443 //WSPR_MESSAGE_COUNT
|
#ifndef _UBITX_HEADER__
|
||||||
#define WSPR_MESSAGE1 444 //
|
#define _UBITX_HEADER__
|
||||||
#define WSPR_MESSAGE2 490 //
|
|
||||||
#define WSPR_MESSAGE3 536 //
|
|
||||||
#define WSPR_MESSAGE4 582 //
|
|
||||||
|
|
||||||
|
#include <Arduino.h> //for Linux, On Linux it is case sensitive.
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// Compile Option
|
||||||
|
//==============================================================================
|
||||||
|
//Ubitx Board Version
|
||||||
|
#define UBITX_BOARD_VERSION 2 //v1 ~ v4 : 4, v5: 5
|
||||||
|
|
||||||
|
//Depending on the type of LCD mounted on the uBITX, uncomment one of the options below.
|
||||||
|
//You must select only one.
|
||||||
|
//#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX (Parallel)
|
||||||
|
//#define UBITX_DISPLAY_LCD1602I //I2C type 16 x 02 LCD
|
||||||
|
//#define UBITX_DISPLAY_LCD1602I_DUAL //I2C type 16 x02 LCD Dual
|
||||||
|
//#define UBITX_DISPLAY_LCD2004P //24 x 04 LCD (Parallel)
|
||||||
|
//#define UBITX_DISPLAY_LCD2004I //I2C type 24 x 04 LCD
|
||||||
|
#define UBITX_DISPLAY_NEXTION //NEXTION LCD
|
||||||
|
|
||||||
|
//#define UBITX_DISPLAY_NEXTION_SAFE //Only EEProm Write 770~775
|
||||||
|
#define I2C_LCD_MASTER_ADDRESS_DEFAULT 0x27 //0x27 //DEFAULT, if Set I2C Address by uBITX Manager, read from EEProm
|
||||||
|
#define I2C_LCD_SECOND_ADDRESS_DEFAULT 0x3F //0x27 //only using Dual LCD Mode
|
||||||
|
|
||||||
|
//Select betwen Analog S-Meter and DSP (I2C) Meter
|
||||||
|
#define USE_I2CSMETER
|
||||||
|
|
||||||
|
#define EXTEND_KEY_GROUP1 //MODE, BAND(-), BAND(+), STEP
|
||||||
|
//#define EXTEND_KEY_GROUP2 //Numeric (0~9), Point(.), Enter //Not supported in Version 1.0x
|
||||||
|
|
||||||
|
//Custom LPF Filter Mod
|
||||||
|
//#define USE_CUSTOM_LPF_FILTER //LPF FILTER MOD
|
||||||
|
|
||||||
|
//#define ENABLE_FACTORYALIGN
|
||||||
|
#define FACTORY_RECOVERY_BOOTUP //Whether to enter Factory Recovery mode by pressing FKey and turning on power
|
||||||
|
#define ENABLE_ADCMONITOR //Starting with Version 1.07, you can read ADC values directly from uBITX Manager. So this function is not necessary.
|
||||||
|
|
||||||
|
extern byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
|
||||||
|
extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
||||||
|
#define SMeterLatency 3 //1 is 0.25 sec
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// User Select feather list
|
||||||
|
//==============================================================================
|
||||||
|
//Enable all features
|
||||||
|
#define FN_BAND 1 //592
|
||||||
|
#define FN_VFO_TOGGLE 1 //78
|
||||||
|
#define FN_MODE 1 //20
|
||||||
|
#define FN_RIT 1 //58
|
||||||
|
#define FN_SPLIT 1 //62
|
||||||
|
#define FN_IFSHIFT 1 //238
|
||||||
|
#define FN_ATT 1 //128
|
||||||
|
#define FN_CW_SPEED 1 //152
|
||||||
|
#define FN_VFOTOMEM 1 //254
|
||||||
|
#define FN_MEMTOVFO 1 //188
|
||||||
|
#define FN_MEMORYKEYER 1 //156
|
||||||
|
#define FN_WSPR 1 //1044
|
||||||
|
#define FN_SDRMODE 1 //68
|
||||||
|
#define FN_CALIBRATION 1 //666
|
||||||
|
#define FN_CARRIER 1 //382
|
||||||
|
#define FN_CWCARRIER 1 //346
|
||||||
|
#define FN_CWTONE 1 //148
|
||||||
|
#define FN_CWDELAY 1 //98
|
||||||
|
#define FN_TXCWDELAY 1 //94
|
||||||
|
#define FN_KEYTYPE 1 //168
|
||||||
|
#define FN_ADCMONITOR 1 //516
|
||||||
|
#define FN_TXONOFF 1 //58
|
||||||
|
|
||||||
|
/*
|
||||||
|
//Test Configuration (88%)
|
||||||
|
#define FN_BAND 0 //592
|
||||||
|
#define FN_VFO_TOGGLE 0 //78
|
||||||
|
#define FN_MODE 0 //20
|
||||||
|
#define FN_RIT 0 //58
|
||||||
|
#define FN_SPLIT 0 //62
|
||||||
|
#define FN_IFSHIFT 0 //238
|
||||||
|
#define FN_ATT 0 //128
|
||||||
|
#define FN_CW_SPEED 1 //152
|
||||||
|
#define FN_VFOTOMEM 0 //254
|
||||||
|
#define FN_MEMTOVFO 0 //188
|
||||||
|
#define FN_MEMORYKEYER 1 //156
|
||||||
|
#define FN_WSPR 0 //1044
|
||||||
|
#define FN_SDRMODE 1 //68
|
||||||
|
#define FN_CALIBRATION 1 //666
|
||||||
|
#define FN_CARRIER 1 //382
|
||||||
|
#define FN_CWCARRIER 1 //346
|
||||||
|
#define FN_CWTONE 1 //148
|
||||||
|
#define FN_CWDELAY 1 //98
|
||||||
|
#define FN_TXCWDELAY 1 //94
|
||||||
|
#define FN_KEYTYPE 1 //168
|
||||||
|
#define FN_ADCMONITOR 1 //516
|
||||||
|
#define FN_TXONOFF 1 //58
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
//Recommended Character LCD Developer 87%
|
||||||
|
#define FN_BAND 1 //592
|
||||||
|
#define FN_VFO_TOGGLE 1 //78
|
||||||
|
#define FN_MODE 1 //20
|
||||||
|
#define FN_RIT 1 //58
|
||||||
|
#define FN_SPLIT 1 //62
|
||||||
|
#define FN_IFSHIFT 1 //238
|
||||||
|
#define FN_ATT 0 //128
|
||||||
|
#define FN_CW_SPEED 0 //152 //using MM
|
||||||
|
#define FN_VFOTOMEM 1 //254
|
||||||
|
#define FN_MEMTOVFO 1 //188
|
||||||
|
#define FN_MEMORYKEYER 1 //156
|
||||||
|
#define FN_WSPR 1 //1044
|
||||||
|
#define FN_SDRMODE 1 //68
|
||||||
|
#define FN_CALIBRATION 0 //667 //using MM
|
||||||
|
#define FN_CARRIER 0 //382 //using MM
|
||||||
|
#define FN_CWCARRIER 0 //346 //using MM
|
||||||
|
#define FN_CWTONE 0 //148 //using MM
|
||||||
|
#define FN_CWDELAY 0 //98 //using MM
|
||||||
|
#define FN_TXCWDELAY 0 //94 //using MM
|
||||||
|
#define FN_KEYTYPE 0 //168 //using MM
|
||||||
|
#define FN_ADCMONITOR 0 //516 //using MM
|
||||||
|
#define FN_TXONOFF 1 //58
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
//Recommended for Nextion, TJC LCD 88%
|
||||||
|
#define FN_BAND 1 //600
|
||||||
|
#define FN_VFO_TOGGLE 1 //90
|
||||||
|
#define FN_MODE 1 //318
|
||||||
|
#define FN_RIT 1 //62
|
||||||
|
#define FN_SPLIT 1 //2
|
||||||
|
#define FN_IFSHIFT 1 //358
|
||||||
|
#define FN_ATT 1 //250
|
||||||
|
#define FN_CW_SPEED 0 //286
|
||||||
|
#define FN_VFOTOMEM 0 //276
|
||||||
|
#define FN_MEMTOVFO 0 //234
|
||||||
|
#define FN_MEMORYKEYER 1 //168
|
||||||
|
#define FN_WSPR 1 //1130
|
||||||
|
#define FN_SDRMODE 1 //70
|
||||||
|
#define FN_CALIBRATION 0 //790
|
||||||
|
#define FN_CARRIER 0 //500
|
||||||
|
#define FN_CWCARRIER 0 //464
|
||||||
|
#define FN_CWTONE 0 //158
|
||||||
|
#define FN_CWDELAY 0 //108
|
||||||
|
#define FN_TXCWDELAY 0 //106
|
||||||
|
#define FN_KEYTYPE 0 //294
|
||||||
|
#define FN_ADCMONITOR 0 //526 //not available with Nextion or Serial UI
|
||||||
|
#define FN_TXONOFF 1 //70
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
// End of User Select Mode and Compil options
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#ifdef UBITX_DISPLAY_LCD1602I
|
||||||
|
#define USE_I2C_LCD
|
||||||
|
#elif defined(UBITX_DISPLAY_LCD1602I_DUAL)
|
||||||
|
#define USE_I2C_LCD
|
||||||
|
#elif defined(UBITX_DISPLAY_LCD2004I)
|
||||||
|
#define USE_I2C_LCD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef UBITX_DISPLAY_NEXTION
|
||||||
|
#define USE_SW_SERIAL
|
||||||
|
#undef ENABLE_ADCMONITOR
|
||||||
|
#undef FACTORY_RECOVERY_BOOTUP
|
||||||
|
#elif defined(UBITX_CONTROL_MCU)
|
||||||
|
#define USE_SW_SERIAL
|
||||||
|
#undef ENABLE_ADCMONITOR
|
||||||
|
#undef FACTORY_RECOVERY_BOOTUP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// Hardware, Define PIN Usage
|
||||||
|
//==============================================================================
|
||||||
|
/**
|
||||||
|
* We need to carefully pick assignment of pin for various purposes.
|
||||||
|
* There are two sets of completely programmable pins on the Raduino.
|
||||||
|
* First, on the top of the board, in line with the LCD connector is an 8-pin connector
|
||||||
|
* that is largely meant for analog inputs and front-panel control. It has a regulated 5v output,
|
||||||
|
* ground and six pins. Each of these six pins can be individually programmed
|
||||||
|
* either as an analog input, a digital input or a digital output.
|
||||||
|
* The pins are assigned as follows (left to right, display facing you):
|
||||||
|
* Pin 1 (Violet), A7, SPARE => Analog S-Meter
|
||||||
|
* Pin 2 (Blue), A6, KEYER (DATA)
|
||||||
|
* Pin 3 (Green), +5v
|
||||||
|
* Pin 4 (Yellow), Gnd
|
||||||
|
* Pin 5 (Orange), A3, PTT
|
||||||
|
* Pin 6 (Red), A2, F BUTTON
|
||||||
|
* Pin 7 (Brown), A1, ENC B
|
||||||
|
* Pin 8 (Black), A0, ENC A
|
||||||
|
*Note: A5, A4 are wired to the Si5351 as I2C interface
|
||||||
|
* *
|
||||||
|
* Though, this can be assigned anyway, for this application of the Arduino, we will make the following
|
||||||
|
* assignment
|
||||||
|
* A2 will connect to the PTT line, which is the usually a part of the mic connector
|
||||||
|
* A3 is connected to a push button that can momentarily ground this line. This will be used for RIT/Bandswitching, etc.
|
||||||
|
* A6 is to implement a keyer, it is reserved and not yet implemented
|
||||||
|
* A7 is connected to a center pin of good quality 100K or 10K linear potentiometer with the two other ends connected to
|
||||||
|
* ground and +5v lines available on the connector. This implments the tuning mechanism
|
||||||
|
*/
|
||||||
|
#define ENC_A (A0)
|
||||||
|
#define ENC_B (A1)
|
||||||
|
#define FBUTTON (A2)
|
||||||
|
#define PTT (A3)
|
||||||
|
#define ANALOG_KEYER (A6)
|
||||||
|
#define ANALOG_SPARE (A7)
|
||||||
|
#define ANALOG_SMETER (A7) //by KD8CEC
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The second set of 16 pins on the Raduino's bottom connector are have the three clock outputs and the digital lines to control the rig.
|
||||||
|
* This assignment is as follows :
|
||||||
|
* Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||||
|
* GND +5V CLK2 GND GND CLK1 GND GND CLK0 GND D2 D3 D4 D5 D6 D7
|
||||||
|
* These too are flexible with what you may do with them, for the Raduino, we use them to :
|
||||||
|
* - TX_RX line : Switches between Transmit and Receive after sensing the PTT or the morse keyer
|
||||||
|
* - CW_KEY line : turns on the carrier for CW
|
||||||
|
*/
|
||||||
|
#define TX_RX (7) //Relay
|
||||||
|
#define CW_TONE (6)
|
||||||
|
#define TX_LPF_A (5) //Relay
|
||||||
|
#define TX_LPF_B (4) //Relay
|
||||||
|
#define TX_LPF_C (3) //Relay
|
||||||
|
#define CW_KEY (2)
|
||||||
|
|
||||||
|
//******************************************************
|
||||||
|
//DSP (I2C) Meter
|
||||||
|
//******************************************************
|
||||||
|
//S-Meter Address
|
||||||
|
#define I2CMETER_ADDR 0x58
|
||||||
|
//VALUE TYPE============================================
|
||||||
|
//Signal
|
||||||
|
#define I2CMETER_CALCS 0x59 //Calculated Signal Meter
|
||||||
|
#define I2CMETER_UNCALCS 0x58 //Uncalculated Signal Meter
|
||||||
|
|
||||||
|
//Power
|
||||||
|
#define I2CMETER_CALCP 0x57 //Calculated Power Meter
|
||||||
|
#define I2CMETER_UNCALCP 0x56 //UnCalculated Power Meter
|
||||||
|
|
||||||
|
//SWR
|
||||||
|
#define I2CMETER_CALCR 0x55 //Calculated SWR Meter
|
||||||
|
#define I2CMETER_UNCALCR 0x54 //Uncalculated SWR Meter
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// for public, Variable, functions
|
||||||
|
//==============================================================================
|
||||||
#define WSPR_BAND_COUNT 3
|
#define WSPR_BAND_COUNT 3
|
||||||
|
|
||||||
#define TX_SSB 0
|
#define TX_SSB 0
|
||||||
#define TX_CW 1
|
#define TX_CW 1
|
||||||
|
#define printLineF1(x) (printLineF(1, x))
|
||||||
|
#define printLineF2(x) (printLineF(0, x))
|
||||||
|
|
||||||
|
//0x00 : None, 0x01 : MODE, 0x02:BAND+, 0x03:BAND-, 0x04:TUNE_STEP, 0x05:VFO Toggle, 0x06:SplitOn/Off, 0x07:TX/ON-OFF, 0x08:SDR Mode On / Off, 0x09:Rit Toggle
|
||||||
|
#define FUNCTION_KEY_ADC 80 //MODE, BAND(-), BAND(+), STEP
|
||||||
|
#define FKEY_PRESS 0x78
|
||||||
|
#define FKEY_MODE 0x01
|
||||||
|
#define FKEY_BANDUP 0x02
|
||||||
|
#define FKEY_BANDDOWN 0x03
|
||||||
|
#define FKEY_STEP 0x04
|
||||||
|
#define FKEY_VFOCHANGE 0x05
|
||||||
|
#define FKEY_SPLIT 0x06
|
||||||
|
#define FKEY_TXOFF 0x07
|
||||||
|
#define FKEY_SDRMODE 0x08
|
||||||
|
#define FKEY_RIT 0x09
|
||||||
|
|
||||||
|
#define FKEY_ENTER 0x0A
|
||||||
|
#define FKEY_POINT 0x0B
|
||||||
|
#define FKEY_DELETE 0x0C
|
||||||
|
#define FKEY_CANCEL 0x0D
|
||||||
|
|
||||||
|
#define FKEY_NUM0 0x10
|
||||||
|
#define FKEY_NUM1 0x11
|
||||||
|
#define FKEY_NUM2 0x12
|
||||||
|
#define FKEY_NUM3 0x13
|
||||||
|
#define FKEY_NUM4 0x14
|
||||||
|
#define FKEY_NUM5 0x15
|
||||||
|
#define FKEY_NUM6 0x16
|
||||||
|
#define FKEY_NUM7 0x17
|
||||||
|
#define FKEY_NUM8 0x18
|
||||||
|
#define FKEY_NUM9 0x19
|
||||||
|
|
||||||
|
#define FKEY_TYPE_MAX 0x1F
|
||||||
|
|
||||||
|
extern uint8_t SI5351BX_ADDR; //change typical -> variable at Version 1.097, address read from eeprom, default value is 0x60
|
||||||
|
//EEProm Address : 63
|
||||||
|
extern unsigned long frequency;
|
||||||
|
extern byte WsprMSGCount;
|
||||||
|
extern byte sMeterLevels[9];
|
||||||
|
extern int currentSMeter; //ADC Value for S.Meter
|
||||||
|
extern byte scaledSMeter; //Calculated S.Meter Level
|
||||||
|
|
||||||
|
extern byte KeyValues[16][3]; //Set : Start Value, End Value, Key Type, 16 Set (3 * 16 = 48)
|
||||||
|
extern byte TriggerBySW; //Action Start from Nextion LCD, Other MCU
|
||||||
|
|
||||||
extern void printLine1(const char *c);
|
extern void printLine1(const char *c);
|
||||||
extern void printLine2(const char *c);
|
extern void printLine2(const char *c);
|
||||||
@ -35,35 +313,6 @@ extern int btnDown(void);
|
|||||||
extern char c[30];
|
extern char c[30];
|
||||||
extern char b[30];
|
extern char b[30];
|
||||||
extern int enc_read(void);
|
extern int enc_read(void);
|
||||||
|
|
||||||
extern unsigned long frequency;
|
|
||||||
|
|
||||||
#define printLineF1(x) (printLineF(1, x))
|
|
||||||
#define printLineF2(x) (printLineF(0, x))
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The second set of 16 pins on the Raduino's bottom connector are have the three clock outputs and the digital lines to control the rig.
|
|
||||||
* This assignment is as follows :
|
|
||||||
* Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
|
||||||
* GND +5V CLK0 GND GND CLK1 GND GND CLK2 GND D2 D3 D4 D5 D6 D7
|
|
||||||
* These too are flexible with what you may do with them, for the Raduino, we use them to :
|
|
||||||
* - TX_RX line : Switches between Transmit and Receive after sensing the PTT or the morse keyer
|
|
||||||
* - CW_KEY line : turns on the carrier for CW
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TX_RX (7)
|
|
||||||
#define CW_TONE (6)
|
|
||||||
#define TX_LPF_A (5)
|
|
||||||
#define TX_LPF_B (4)
|
|
||||||
#define TX_LPF_C (3)
|
|
||||||
#define CW_KEY (2)
|
|
||||||
|
|
||||||
//we directly generate the CW by programmin the Si5351 to the cw tx frequency, hence, both are different modes
|
|
||||||
//these are the parameter passed to startTx
|
|
||||||
#define TX_SSB 0
|
|
||||||
#define TX_CW 1
|
|
||||||
|
|
||||||
extern void si5351bx_init(void);
|
extern void si5351bx_init(void);
|
||||||
extern void si5351bx_setfreq(uint8_t clknum, uint32_t fout);
|
extern void si5351bx_setfreq(uint8_t clknum, uint32_t fout);
|
||||||
extern void si5351_set_calibration(int32_t cal);
|
extern void si5351_set_calibration(int32_t cal);
|
||||||
@ -76,6 +325,11 @@ extern void stopTx(void);
|
|||||||
extern void setTXFilters(unsigned long freq);
|
extern void setTXFilters(unsigned long freq);
|
||||||
|
|
||||||
extern void SendWSPRManage(void);
|
extern void SendWSPRManage(void);
|
||||||
extern byte WsprMSGCount;
|
extern char byteToChar(byte srcByte);
|
||||||
|
extern void DisplayCallsign(byte callSignLength);
|
||||||
|
extern void DisplayVersionInfo(const char* fwVersionInfo);
|
||||||
|
|
||||||
|
//I2C Signal Meter, Version 1.097
|
||||||
|
extern int GetI2CSmeterValue(int valueType); //ubitx_ui.ino
|
||||||
|
|
||||||
|
#endif //end of if header define
|
||||||
|
@ -1,24 +1,19 @@
|
|||||||
//Firmware Version
|
//Firmware Version
|
||||||
#define FIRMWARE_VERSION_INFO F("CE v1.070")
|
//+ : This symbol identifies the firmware.
|
||||||
#define FIRMWARE_VERSION_NUM 0x02 //1st Complete Project : 1 (Version 1.061), 2st Project : 2
|
// It was originally called 'CEC V1.072' but it is too long to waste the LCD window.
|
||||||
|
// I do not want to make this Firmware users's uBITX messy with my callsign.
|
||||||
//Depending on the type of LCD mounted on the uBITX, uncomment one of the options below.
|
// Putting one alphabet in front of 'v' has a different meaning.
|
||||||
//You must select only one.
|
// So I put + in the sense that it was improved one by one based on Original Firmware.
|
||||||
|
// This firmware has been gradually changed based on the original firmware created by Farhan, Jack, Jerry and others.
|
||||||
#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX
|
|
||||||
//#define UBITX_DISPLAY_LCD1602I //I2C type 16 x 02 LCD
|
|
||||||
//#define UBITX_DISPLAY_LCD2404P //24 x 04 LCD
|
|
||||||
//#define UBITX_DISPLAY_LCD2404I //I2C type 24 x 04 LCD
|
|
||||||
|
|
||||||
//Compile Option
|
|
||||||
#define ENABLE_FACTORYALIGN
|
|
||||||
#define ENABLE_ADCMONITOR //Starting with Version 1.07, you can read ADC values directly from uBITX Manager. So this function is not necessary.
|
|
||||||
|
|
||||||
|
#define FIRMWARE_VERSION_INFO F("+v1.200")
|
||||||
|
#define FIRMWARE_VERSION_NUM 0x04 //1st Complete Project : 1 (Version 1.061), 2st Project : 2, 1.08: 3, 1.09 : 4
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Cat Suppoort uBITX CEC Version
|
Cat Suppoort uBITX CEC Version
|
||||||
|
This firmware has been gradually changed based on the original firmware created by Farhan, Jack, Jerry and others.
|
||||||
Most features(TX, Frequency Range, Ham Band, TX Control, CW delay, start Delay... more) have been added by KD8CEC.
|
Most features(TX, Frequency Range, Ham Band, TX Control, CW delay, start Delay... more) have been added by KD8CEC.
|
||||||
However, the license rules are subject to the original source rules.
|
My wish is to keep the original author's Comment as long as the meaning does not change much, even if the code looks a bit long.
|
||||||
Ian KD8CEC
|
Ian KD8CEC
|
||||||
|
|
||||||
Original source comment -------------------------------------------------------------
|
Original source comment -------------------------------------------------------------
|
||||||
@ -56,161 +51,8 @@
|
|||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include "ubitx.h"
|
#include "ubitx.h"
|
||||||
|
#include "ubitx_eemap.h"
|
||||||
|
|
||||||
/**
|
|
||||||
The main chip which generates upto three oscillators of various frequencies in the
|
|
||||||
Raduino is the Si5351a. To learn more about Si5351a you can download the datasheet
|
|
||||||
from www.silabs.com although, strictly speaking it is not a requirment to understand this code.
|
|
||||||
|
|
||||||
We no longer use the standard SI5351 library because of its huge overhead due to many unused
|
|
||||||
features consuming a lot of program space. Instead of depending on an external library we now use
|
|
||||||
Jerry Gaffke's, KE7ER, lightweight standalone mimimalist "si5351bx" routines (see further down the
|
|
||||||
code). Here are some defines and declarations used by Jerry's routines:
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We need to carefully pick assignment of pin for various purposes.
|
|
||||||
* There are two sets of completely programmable pins on the Raduino.
|
|
||||||
* First, on the top of the board, in line with the LCD connector is an 8-pin connector
|
|
||||||
* that is largely meant for analog inputs and front-panel control. It has a regulated 5v output,
|
|
||||||
* ground and six pins. Each of these six pins can be individually programmed
|
|
||||||
* either as an analog input, a digital input or a digital output.
|
|
||||||
* The pins are assigned as follows (left to right, display facing you):
|
|
||||||
* Pin 1 (Violet), A7, SPARE
|
|
||||||
* Pin 2 (Blue), A6, KEYER (DATA)
|
|
||||||
* Pin 3 (Green), +5v
|
|
||||||
* Pin 4 (Yellow), Gnd
|
|
||||||
* Pin 5 (Orange), A3, PTT
|
|
||||||
* Pin 6 (Red), A2, F BUTTON
|
|
||||||
* Pin 7 (Brown), A1, ENC B
|
|
||||||
* Pin 8 (Black), A0, ENC A
|
|
||||||
*Note: A5, A4 are wired to the Si5351 as I2C interface
|
|
||||||
* *
|
|
||||||
* Though, this can be assigned anyway, for this application of the Arduino, we will make the following
|
|
||||||
* assignment
|
|
||||||
* A2 will connect to the PTT line, which is the usually a part of the mic connector
|
|
||||||
* A3 is connected to a push button that can momentarily ground this line. This will be used for RIT/Bandswitching, etc.
|
|
||||||
* A6 is to implement a keyer, it is reserved and not yet implemented
|
|
||||||
* A7 is connected to a center pin of good quality 100K or 10K linear potentiometer with the two other ends connected to
|
|
||||||
* ground and +5v lines available on the connector. This implments the tuning mechanism
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ENC_A (A0)
|
|
||||||
#define ENC_B (A1)
|
|
||||||
#define FBUTTON (A2)
|
|
||||||
#define PTT (A3)
|
|
||||||
#define ANALOG_KEYER (A6)
|
|
||||||
#define ANALOG_SPARE (A7)
|
|
||||||
#define ANALOG_SMETER (A7) //by KD8CEC
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Arduino, unlike C/C++ on a regular computer with gigabytes of RAM, has very little memory.
|
|
||||||
* We have to be very careful with variables that are declared inside the functions as they are
|
|
||||||
* created in a memory region called the stack. The stack has just a few bytes of space on the Arduino
|
|
||||||
* if you declare large strings inside functions, they can easily exceed the capacity of the stack
|
|
||||||
* and mess up your programs.
|
|
||||||
* We circumvent this by declaring a few global buffers as kitchen counters where we can
|
|
||||||
* slice and dice our strings. These strings are mostly used to control the display or handle
|
|
||||||
* the input and output from the USB port. We must keep a count of the bytes used while reading
|
|
||||||
* the serial port as we can easily run out of buffer space. This is done in the serial_in_count variable.
|
|
||||||
*/
|
|
||||||
int count = 0; //to generally count ticks, loops, etc
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The second set of 16 pins on the Raduino's bottom connector are have the three clock outputs and the digital lines to control the rig.
|
|
||||||
* This assignment is as follows :
|
|
||||||
* Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
|
||||||
* GND +5V CLK0 GND GND CLK1 GND GND CLK2 GND D2 D3 D4 D5 D6 D7
|
|
||||||
* These too are flexible with what you may do with them, for the Raduino, we use them to :
|
|
||||||
* - TX_RX line : Switches between Transmit and Receive after sensing the PTT or the morse keyer
|
|
||||||
* - CW_KEY line : turns on the carrier for CW
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TX_RX (7)
|
|
||||||
#define CW_TONE (6)
|
|
||||||
#define TX_LPF_A (5)
|
|
||||||
#define TX_LPF_B (4)
|
|
||||||
#define TX_LPF_C (3)
|
|
||||||
#define CW_KEY (2)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* These are the indices where these user changable settinngs are stored in the EEPROM
|
|
||||||
*/
|
|
||||||
#define MASTER_CAL 0
|
|
||||||
#define LSB_CAL 4
|
|
||||||
#define USB_CAL 8
|
|
||||||
#define SIDE_TONE 12
|
|
||||||
//these are ids of the vfos as well as their offset into the eeprom storage, don't change these 'magic' values
|
|
||||||
#define VFO_A 16
|
|
||||||
#define VFO_B 20
|
|
||||||
#define CW_SIDETONE 24
|
|
||||||
#define CW_SPEED 28
|
|
||||||
|
|
||||||
//KD8CEC EEPROM MAP
|
|
||||||
#define ADVANCED_FREQ_OPTION1 240 //Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency
|
|
||||||
#define IF1_CAL 241
|
|
||||||
#define ENABLE_SDR 242
|
|
||||||
#define SDR_FREQUNCY 243
|
|
||||||
|
|
||||||
#define CW_CAL 252
|
|
||||||
#define VFO_A_MODE 256
|
|
||||||
#define VFO_B_MODE 257
|
|
||||||
#define CW_DELAY 258
|
|
||||||
#define CW_START 259
|
|
||||||
#define HAM_BAND_COUNT 260 //
|
|
||||||
#define TX_TUNE_TYPE 261 //
|
|
||||||
#define HAM_BAND_RANGE 262 //FROM (2BYTE) TO (2BYTE) * 10 = 40byte
|
|
||||||
#define HAM_BAND_FREQS 302 //40, 1 BAND = 4Byte most bit is mode
|
|
||||||
#define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) //1STEP :
|
|
||||||
|
|
||||||
|
|
||||||
//for reduce cw key error, eeprom address
|
|
||||||
#define CW_ADC_MOST_BIT1 348 //most 2bits of DOT_TO , DOT_FROM, ST_TO, ST_FROM
|
|
||||||
#define CW_ADC_ST_FROM 349 //CW ADC Range STRAIGHT KEY from (Lower 8 bit)
|
|
||||||
#define CW_ADC_ST_TO 350 //CW ADC Range STRAIGHT KEY to (Lower 8 bit)
|
|
||||||
#define CW_ADC_DOT_FROM 351 //CW ADC Range DOT from (Lower 8 bit)
|
|
||||||
#define CW_ADC_DOT_TO 352 //CW ADC Range DOT to (Lower 8 bit)
|
|
||||||
|
|
||||||
#define CW_ADC_MOST_BIT2 353 //most 2bits of BOTH_TO, BOTH_FROM, DASH_TO, DASH_FROM
|
|
||||||
#define CW_ADC_DASH_FROM 354 //CW ADC Range DASH from (Lower 8 bit)
|
|
||||||
#define CW_ADC_DASH_TO 355 //CW ADC Range DASH to (Lower 8 bit)
|
|
||||||
#define CW_ADC_BOTH_FROM 356 //CW ADC Range BOTH from (Lower 8 bit)
|
|
||||||
#define CW_ADC_BOTH_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
|
||||||
#define CW_KEY_TYPE 358
|
|
||||||
#define 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 COMMON_OPTION0 360 //0: Confirm : CW Frequency Shift
|
|
||||||
//1 : IF Shift Save
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
#define IF_SHIFTVALUE 363
|
|
||||||
|
|
||||||
#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
|
|
||||||
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
|
|
||||||
#define VERSION_ADDRESS 779 //check Firmware version
|
|
||||||
//USER INFORMATION
|
|
||||||
#define USER_CALLSIGN_KEY 780 //0x59
|
|
||||||
#define USER_CALLSIGN_LEN 781 //1BYTE (OPTION + LENGTH) + CALLSIGN (MAXIMUM 18)
|
|
||||||
#define USER_CALLSIGN_DAT 782 //CALL SIGN DATA //direct EEPROM to LCD basic offset
|
|
||||||
|
|
||||||
//AUTO KEY STRUCTURE
|
|
||||||
//AUTO KEY USE 800 ~ 1023
|
|
||||||
#define CW_AUTO_MAGIC_KEY 800 //0x73
|
|
||||||
#define CW_AUTO_COUNT 801 //0 ~ 255
|
|
||||||
#define CW_AUTO_DATA 803 //[INDEX, INDEX, INDEX,DATA,DATA, DATA (Positon offset is CW_AUTO_DATA
|
|
||||||
#define CW_DATA_OFSTADJ CW_AUTO_DATA - USER_CALLSIGN_DAT //offset adjust for ditect eeprom to lcd (basic offset is USER_CALLSIGN_DAT
|
|
||||||
#define CW_STATION_LEN 1023 //value range : 4 ~ 30
|
|
||||||
/**
|
/**
|
||||||
* The uBITX is an upconnversion transceiver. The first IF is at 45 MHz.
|
* The uBITX is an upconnversion transceiver. The first IF is at 45 MHz.
|
||||||
* The first IF frequency is not exactly at 45 Mhz but about 5 khz lower,
|
* The first IF frequency is not exactly at 45 Mhz but about 5 khz lower,
|
||||||
@ -230,10 +72,43 @@ int count = 0; //to generally count ticks, loops, etc
|
|||||||
|
|
||||||
// the second oscillator should ideally be at 57 MHz, however, the crystal filter's center frequency
|
// the second oscillator should ideally be at 57 MHz, however, the crystal filter's center frequency
|
||||||
// is shifted down a little due to the loading from the impedance matching L-networks on either sides
|
// is shifted down a little due to the loading from the impedance matching L-networks on either sides
|
||||||
#define SECOND_OSC_USB (56995000l)
|
|
||||||
#define SECOND_OSC_LSB (32995000l)
|
#if UBITX_BOARD_VERSION == 5
|
||||||
//these are the two default USB and LSB frequencies. The best frequencies depend upon your individual taste and filter shape
|
//For Test //45005000
|
||||||
#define INIT_USB_FREQ (11996500l)
|
//#define SECOND_OSC_USB (56064200l)
|
||||||
|
//#define SECOND_OSC_LSB (33945800l)
|
||||||
|
|
||||||
|
/*
|
||||||
|
//For Test //4500000
|
||||||
|
#define SECOND_OSC_USB (56059200l)
|
||||||
|
#define SECOND_OSC_LSB (33940800l)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
//For Test // V1.121 44991500(LSB), 44998500 (USB), abs : 7k
|
||||||
|
#define SECOND_OSC_USB (56057700l)
|
||||||
|
#define SECOND_OSC_LSB (33932300l)
|
||||||
|
*/
|
||||||
|
|
||||||
|
//==============================================================================================================================
|
||||||
|
//For Test // V1.200 V1.122 45002500 (LSB), 45002000 (USB) (Change Default BFO Frequency 11056xxx, adjust bfo and ifshift ), abs: 0.5k
|
||||||
|
//Best, Test 3 uBITX V5
|
||||||
|
//Last Value, If more data is collected, it can be changed to a better value.
|
||||||
|
#define SECOND_OSC_USB (56058700l)
|
||||||
|
#define SECOND_OSC_LSB (33945800l)
|
||||||
|
|
||||||
|
//Not used, Just comment (Default)
|
||||||
|
#define INIT_USB_FREQ (11056500l)
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
#else
|
||||||
|
#define SECOND_OSC_USB (56995000l)
|
||||||
|
#define SECOND_OSC_LSB (32995000l)
|
||||||
|
//these are the two default USB and LSB frequencies. The best frequencies depend upon your individual taste and filter shape
|
||||||
|
//Not used, Just comment (Default)
|
||||||
|
#define INIT_USB_FREQ (11996500l)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// limits the tuning and working range of the ubitx between 3 MHz and 30 MHz
|
// limits the tuning and working range of the ubitx between 3 MHz and 30 MHz
|
||||||
#define LOWEST_FREQ (3000000l)
|
#define LOWEST_FREQ (3000000l)
|
||||||
#define HIGHEST_FREQ (30000000l)
|
#define HIGHEST_FREQ (30000000l)
|
||||||
@ -242,11 +117,6 @@ int count = 0; //to generally count ticks, loops, etc
|
|||||||
#define LOWEST_FREQ_DIAL (3000l)
|
#define LOWEST_FREQ_DIAL (3000l)
|
||||||
#define HIGHEST_FREQ_DIAL (60000000l)
|
#define HIGHEST_FREQ_DIAL (60000000l)
|
||||||
|
|
||||||
//we directly generate the CW by programmin the Si5351 to the cw tx frequency, hence, both are different modes
|
|
||||||
//these are the parameter passed to startTx
|
|
||||||
#define TX_SSB 0
|
|
||||||
#define TX_CW 1
|
|
||||||
|
|
||||||
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
|
||||||
@ -334,19 +204,38 @@ 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
|
||||||
|
|
||||||
byte advancedFreqOption1; //255 : Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency
|
byte advancedFreqOption1; //255 : Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2~Bit3 : dynamic sdr frequency, bit 7: IFTune_Value Reverse for DIY uBITX
|
||||||
byte attLevel = 0; //ATT : RF Gain Control (Receive) <-- IF1 Shift, 0 : Off, ShiftValue is attLevel * 100; attLevel 150 = 15K
|
byte attLevel = 0; //ATT : RF Gain Control (Receive) <-- IF1 Shift, 0 : Off, ShiftValue is attLevel * 100; attLevel 150 = 15K
|
||||||
char if1TuneValue = 0; //0 : OFF, IF1 + if1TuneValue * 100; // + - 12500;
|
byte if1TuneValue = 0; //0 : OFF, IF1 + if1TuneValue * 100; // + - 12500;
|
||||||
byte sdrModeOn = 0; //SDR MODE ON / OFF
|
byte sdrModeOn = 0; //SDR MODE ON / OFF
|
||||||
unsigned long SDR_Center_Freq; //DEFAULT Frequency : 32000000
|
unsigned long SDR_Center_Freq; //
|
||||||
|
|
||||||
unsigned long beforeIdle_ProcessTime = 0; //for check Idle time
|
unsigned long beforeIdle_ProcessTime = 0; //for check Idle time
|
||||||
byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
|
byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
|
||||||
char lcdMeter[17];
|
char lcdMeter[17];
|
||||||
|
byte sMeterLevels[9];
|
||||||
|
|
||||||
|
//Current ADC Value for S.Meter, and S Meter Level
|
||||||
|
int currentSMeter = 0;
|
||||||
|
byte scaledSMeter = 0;
|
||||||
|
|
||||||
|
byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
|
||||||
|
byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
||||||
|
|
||||||
|
byte KeyValues[16][3];
|
||||||
|
|
||||||
byte isIFShift = 0; //1 = ifShift, 2 extend
|
byte isIFShift = 0; //1 = ifShift, 2 extend
|
||||||
int ifShiftValue = 0; //
|
int ifShiftValue = 0; //
|
||||||
|
|
||||||
|
byte TriggerBySW = 0; //Action Start from Nextion LCD, Other MCU
|
||||||
|
|
||||||
|
//Use Custom Filter
|
||||||
|
//#define CUST_LPF_ENABLED 48
|
||||||
|
//#define CUST_LPF_START 49
|
||||||
|
char isCustomFilter = 0;
|
||||||
|
char isCustomFilter_A7 = 0;
|
||||||
|
char CustFilters[7][2];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@ -407,8 +296,8 @@ void setNextHamBandFreq(unsigned long f, char moveDirection)
|
|||||||
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);
|
|
||||||
byteToMode(loadMode, 1);
|
byteToMode(loadMode, 1);
|
||||||
|
setFrequency(resultFreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
||||||
@ -468,7 +357,50 @@ byte delay_background(unsigned delayTime, byte fromType){ //fromType : 4 autoCWK
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void setTXFilters(unsigned long freq){
|
void setTXFilters(unsigned long freq){
|
||||||
|
#ifdef USE_CUSTOM_LPF_FILTER
|
||||||
|
freq = freq / 1000000UL;
|
||||||
|
for (byte i = 0; i < 7; i++) {
|
||||||
|
if (freq >= CustFilters[i][0])
|
||||||
|
{
|
||||||
|
char aIn = CustFilters[i][1];
|
||||||
|
digitalWrite(TX_LPF_A, aIn & 0x01);
|
||||||
|
digitalWrite(TX_LPF_B, aIn & 0x02);
|
||||||
|
digitalWrite(TX_LPF_C, aIn & 0x04);
|
||||||
|
|
||||||
|
if (isCustomFilter_A7 == 1)
|
||||||
|
{
|
||||||
|
digitalWrite(10, aIn & 0x08);
|
||||||
|
digitalWrite(11, aIn & 0x10);
|
||||||
|
digitalWrite(12, aIn & 0x20);
|
||||||
|
digitalWrite(13, aIn & 0x40);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} //end of for
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if UBITX_BOARD_VERSION == 5
|
||||||
|
if (freq > 21000000L){ // the default filter is with 35 MHz cut-off
|
||||||
|
digitalWrite(TX_LPF_A, 0);
|
||||||
|
digitalWrite(TX_LPF_B, 0);
|
||||||
|
digitalWrite(TX_LPF_C, 0);
|
||||||
|
}
|
||||||
|
else if (freq >= 14000000L){ //thrown the KT1 relay on, the 30 MHz LPF is bypassed and the 14-18 MHz LPF is allowd to go through
|
||||||
|
digitalWrite(TX_LPF_A, 1);
|
||||||
|
digitalWrite(TX_LPF_B, 0);
|
||||||
|
digitalWrite(TX_LPF_C, 0);
|
||||||
|
}
|
||||||
|
else if (freq > 7000000L){
|
||||||
|
digitalWrite(TX_LPF_A, 0);
|
||||||
|
digitalWrite(TX_LPF_B, 1);
|
||||||
|
digitalWrite(TX_LPF_C, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
digitalWrite(TX_LPF_A, 0);
|
||||||
|
digitalWrite(TX_LPF_B, 0);
|
||||||
|
digitalWrite(TX_LPF_C, 1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (freq > 21000000L){ // the default filter is with 35 MHz cut-off
|
if (freq > 21000000L){ // the default filter is with 35 MHz cut-off
|
||||||
digitalWrite(TX_LPF_A, 0);
|
digitalWrite(TX_LPF_A, 0);
|
||||||
digitalWrite(TX_LPF_B, 0);
|
digitalWrite(TX_LPF_B, 0);
|
||||||
@ -489,6 +421,10 @@ void setTXFilters(unsigned long freq){
|
|||||||
digitalWrite(TX_LPF_B, 1);
|
digitalWrite(TX_LPF_B, 1);
|
||||||
digitalWrite(TX_LPF_C, 1);
|
digitalWrite(TX_LPF_C, 1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -509,74 +445,98 @@ void setFrequency(unsigned long f){
|
|||||||
setTXFilters(f);
|
setTXFilters(f);
|
||||||
|
|
||||||
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
||||||
long if1AdjustValue = ((inTx == 0) ? (attLevel * 100) : 0) + (if1TuneValue * 100); //if1Tune RX, TX Enabled, ATT : only RX Mode
|
int appliedTuneValue = 0;
|
||||||
|
|
||||||
if (sdrModeOn && (inTx == 0)) //IF SDR
|
//applied if tune
|
||||||
|
//byte advancedFreqOption1; //255 : Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency0, Bit3 : dynamic sdr frequency1, bit 7: IFTune_Value Reverse for DIY uBITX
|
||||||
|
if ((advancedFreqOption1 & 0x01) != 0x00)
|
||||||
|
{
|
||||||
|
appliedTuneValue = if1TuneValue;
|
||||||
|
|
||||||
|
//In the LSB state, the optimum reception value was found. To apply to USB, 3Khz decrease is required.
|
||||||
|
if (sdrModeOn && (inTx == 0))
|
||||||
|
appliedTuneValue -= 15; //decrease 1.55Khz
|
||||||
|
|
||||||
|
//if (isUSB)
|
||||||
|
if (cwMode == 2 || (cwMode == 0 && (isUSB)))
|
||||||
|
appliedTuneValue -= 30; //decrease 3Khz
|
||||||
|
}
|
||||||
|
|
||||||
|
//if1Tune RX, TX Enabled, ATT : only RX Mode
|
||||||
|
//The IF Tune shall be measured at the LSB. Then, move the 3Khz down for USB.
|
||||||
|
long if1AdjustValue = ((inTx == 0) ? (attLevel * 100) : 0) + (appliedTuneValue * 100); //if1Tune RX, TX Enabled, ATT : only RX Mode //5600
|
||||||
|
|
||||||
|
//for DIY uBITX (custom filter)
|
||||||
|
if ((advancedFreqOption1 & 0x80) != 0x00) //Reverse IF Tune (- Value for DIY uBITX)
|
||||||
|
if1AdjustValue *= -1;
|
||||||
|
|
||||||
|
if (sdrModeOn && (inTx == 0)) //IF SDR MODE
|
||||||
{
|
{
|
||||||
//Fixed Frequency SDR (Default Frequency : 32Mhz, available change sdr Frequency by uBITX Manager)
|
//Fixed Frequency SDR (Default Frequency : 32Mhz, available change sdr Frequency by uBITX Manager)
|
||||||
//Dynamic Frequency is for SWL without cat
|
//Dynamic Frequency is for SWL without cat
|
||||||
|
|
||||||
|
//byte advancedFreqOption1; //255 : Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency0, Bit3 : dynamic sdr frequency1, bit 7: IFTune_Value Reverse for DIY uBITX
|
||||||
|
long moveFrequency = 0;
|
||||||
|
//7 6 5 4 3 2 1 0
|
||||||
|
// _ _ <-- SDR Freuqncy Option
|
||||||
|
byte sdrOption = (advancedFreqOption1 >> 2) & 0x03;
|
||||||
|
|
||||||
|
if (sdrOption == 1) // SDR Frequency + frequenc
|
||||||
|
{
|
||||||
|
//example : offset Freq : 20 Mhz and frequency = 7.080 => 27.080 Mhz
|
||||||
|
//example : offset Freq : 0 Mhz and frequency = 7.080 => 7.080 Mhz
|
||||||
|
//for available HF, SDR
|
||||||
|
moveFrequency = f;
|
||||||
|
}
|
||||||
|
else if (sdrOption == 2) //Mhz move
|
||||||
|
{
|
||||||
//Offset Frequency + Mhz,
|
//Offset Frequency + Mhz,
|
||||||
//Example : Offset Frequency : 30Mhz and current Frequncy is 7.080 => 37.080Mhz
|
//Example : Offset Frequency : 30Mhz and current Frequncy is 7.080 => 37.080Mhz
|
||||||
// Offset Frequency : 30Mhz and current Frequncy is 14.074 => 34.074Mhz
|
// Offset Frequency : 30Mhz and current Frequncy is 14.074 => 34.074Mhz
|
||||||
|
moveFrequency = (f % 10000000);
|
||||||
|
}
|
||||||
|
else if (sdrOption == 3) //Khz move
|
||||||
|
{
|
||||||
|
//Offset Frequency + Khz,
|
||||||
|
//Example : Offset Frequency : 30Mhz and current Frequncy is 7.080 => 30.080Mhz
|
||||||
|
// Offset Frequency : 30Mhz and current Frequncy is 14.074 => 30.074Mhz
|
||||||
|
moveFrequency = (f % 1000000);
|
||||||
|
}
|
||||||
|
|
||||||
//Dynamic Frequency
|
#if UBITX_BOARD_VERSION == 5
|
||||||
//if (advancedFreqOption1 & 0x04 != 0x00)
|
si5351bx_setfreq(2, 45002000 + if1AdjustValue + f);
|
||||||
// if1AdjustValue += (f % 10000000);
|
si5351bx_setfreq(1, 45002000
|
||||||
|
+ if1AdjustValue
|
||||||
|
+ SDR_Center_Freq
|
||||||
|
//+ ((advancedFreqOption1 & 0x04) == 0x00 ? 0 : (f % 10000000))
|
||||||
|
+ moveFrequency);
|
||||||
|
// + 2390); //RTL-SDR Frequency Error, Do not add another SDR because the error is different. V1.3
|
||||||
|
#else
|
||||||
si5351bx_setfreq(2, 44991500 + if1AdjustValue + f);
|
si5351bx_setfreq(2, 44991500 + if1AdjustValue + f);
|
||||||
si5351bx_setfreq(1, 44991500
|
si5351bx_setfreq(1, 44991500
|
||||||
+ if1AdjustValue
|
+ if1AdjustValue
|
||||||
+ SDR_Center_Freq
|
+ SDR_Center_Freq
|
||||||
+ ((advancedFreqOption1 & 0x04) == 0x00 ? 0 : (f % 10000000))
|
//+ ((advancedFreqOption1 & 0x04) == 0x00 ? 0 : (f % 10000000))
|
||||||
+ 2390);
|
+ moveFrequency );
|
||||||
/*
|
//+ 2390); Do not add another SDR because the error is different. V1.3
|
||||||
si5351bx_setfreq(2, 44999500 + f);
|
#endif
|
||||||
si5351bx_setfreq(1, 44999500 + SDR_Center_Freq + 2390);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (cwMode == 1 || (cwMode == 0 && (!isUSB)))
|
if (cwMode == 1 || (cwMode == 0 && (!isUSB))) //cwl or lsb
|
||||||
{
|
{
|
||||||
//CWL(cwMode == 1) or LSB (cwMode == 0 && (!isUSB))
|
//CWL(cwMode == 1) or LSB (cwMode == 0 && (!isUSB))
|
||||||
si5351bx_setfreq(2, SECOND_OSC_LSB + if1AdjustValue + appliedCarrier + f);
|
si5351bx_setfreq(2, SECOND_OSC_LSB + if1AdjustValue + appliedCarrier + f);
|
||||||
//si5351bx_setfreq(1, SECOND_OSC_LSB + if1AdjustValue - (sdrModeOn ? (SDR_Center_Freq- usbCarrier) : 0));
|
|
||||||
si5351bx_setfreq(1, SECOND_OSC_LSB + if1AdjustValue);
|
si5351bx_setfreq(1, SECOND_OSC_LSB + if1AdjustValue);
|
||||||
}
|
}
|
||||||
else
|
else //cwu or usb
|
||||||
{
|
{
|
||||||
//CWU (cwMode == 2) or LSB (cwMode == 0 and isUSB)
|
//CWU (cwMode == 2) or USB (cwMode == 0 and isUSB)
|
||||||
si5351bx_setfreq(2, SECOND_OSC_USB + if1AdjustValue - appliedCarrier + f);
|
si5351bx_setfreq(2, SECOND_OSC_USB + if1AdjustValue - appliedCarrier + f);
|
||||||
//si5351bx_setfreq(1, SECOND_OSC_USB + if1AdjustValue + (sdrModeOn ? (SDR_Center_Freq- usbCarrier) : 0)); //Increase LO Frequency => 1198500 -> 32Mhz
|
si5351bx_setfreq(1, SECOND_OSC_USB + if1AdjustValue);
|
||||||
si5351bx_setfreq(1, SECOND_OSC_USB + if1AdjustValue); //Increase LO Frequency => 1198500 -> 32Mhz
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (cwMode == 0)
|
|
||||||
{
|
|
||||||
if (isUSB){
|
|
||||||
si5351bx_setfreq(2, SECOND_OSC_USB - appliedCarrier + f);
|
|
||||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
si5351bx_setfreq(2, SECOND_OSC_LSB + appliedCarrier + f);
|
|
||||||
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (cwMode == 1){ //CWL
|
|
||||||
si5351bx_setfreq(2, SECOND_OSC_LSB + appliedCarrier + f);
|
|
||||||
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
|
||||||
}
|
|
||||||
else{ //CWU
|
|
||||||
si5351bx_setfreq(2, SECOND_OSC_USB - appliedCarrier + f);
|
|
||||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
frequency = f;
|
frequency = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,13 +564,17 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (splitOn == 1) {
|
if (splitOn == 1)
|
||||||
if (vfoActive == VFO_B) {
|
{
|
||||||
|
FrequencyToVFO(1); //Save current Frequency and Mode to eeprom
|
||||||
|
if (vfoActive == VFO_B)
|
||||||
|
{
|
||||||
vfoActive = VFO_A;
|
vfoActive = VFO_A;
|
||||||
frequency = vfoA;
|
frequency = vfoA;
|
||||||
byteToMode(vfoA_mode, 0);
|
byteToMode(vfoA_mode, 0);
|
||||||
}
|
}
|
||||||
else if (vfoActive == VFO_A){
|
else if (vfoActive == VFO_A)
|
||||||
|
{
|
||||||
vfoActive = VFO_B;
|
vfoActive = VFO_B;
|
||||||
frequency = vfoB;
|
frequency = vfoB;
|
||||||
byteToMode(vfoB_mode, 0);
|
byteToMode(vfoB_mode, 0);
|
||||||
@ -726,7 +690,112 @@ void checkPTT(){
|
|||||||
if (digitalRead(PTT) == 1 && inTx == 1)
|
if (digitalRead(PTT) == 1 && inTx == 1)
|
||||||
stopTx();
|
stopTx();
|
||||||
}
|
}
|
||||||
|
#ifdef EXTEND_KEY_GROUP1
|
||||||
|
void checkButton(){
|
||||||
|
char currentBandIndex = -1;
|
||||||
|
|
||||||
|
//only if the button is pressed
|
||||||
|
int keyStatus = getBtnStatus();
|
||||||
|
if (keyStatus == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
delay(50);
|
||||||
|
keyStatus = getBtnStatus(); //will be remove 3 lines
|
||||||
|
if (keyStatus == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (keyStatus == FKEY_PRESS) //Menu Key
|
||||||
|
{
|
||||||
|
//for touch screen
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
SetSWActivePage(1);
|
||||||
|
doMenu();
|
||||||
|
|
||||||
|
if (isCWAutoMode == 0)
|
||||||
|
SetSWActivePage(0);
|
||||||
|
#else
|
||||||
|
doMenu();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (keyStatus <= FKEY_TYPE_MAX) //EXTEND KEY GROUP #1
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(keyStatus)
|
||||||
|
{
|
||||||
|
case FKEY_MODE :
|
||||||
|
if (cwMode == 1)
|
||||||
|
{
|
||||||
|
cwMode = 2;
|
||||||
|
}
|
||||||
|
else if (cwMode == 2)
|
||||||
|
{
|
||||||
|
cwMode = 0;
|
||||||
|
isUSB = 0;
|
||||||
|
}
|
||||||
|
else if (isUSB == 0)
|
||||||
|
{
|
||||||
|
isUSB = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cwMode = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FKEY_BANDUP :
|
||||||
|
case FKEY_BANDDOWN :
|
||||||
|
//Save Band Information
|
||||||
|
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
|
||||||
|
currentBandIndex = getIndexHambanBbyFreq(frequency);
|
||||||
|
|
||||||
|
if (currentBandIndex >= 0) {
|
||||||
|
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setNextHamBandFreq(frequency, keyStatus == FKEY_BANDDOWN ? -1 : 1); //Prior Band
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FKEY_STEP :
|
||||||
|
if (++tuneStepIndex > 5)
|
||||||
|
tuneStepIndex = 1;
|
||||||
|
|
||||||
|
EEPROM.put(TUNING_STEP, tuneStepIndex);
|
||||||
|
printLine2ClearAndUpdate();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FKEY_VFOCHANGE :
|
||||||
|
menuVfoToggle(1); //Vfo Toggle
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FKEY_SPLIT :
|
||||||
|
menuSplitOnOff(1);
|
||||||
|
break;
|
||||||
|
case FKEY_TXOFF:
|
||||||
|
menuTxOnOff(1, 0x01);
|
||||||
|
break;
|
||||||
|
case FKEY_SDRMODE :
|
||||||
|
menuSDROnOff(1);
|
||||||
|
break;
|
||||||
|
case FKEY_RIT :
|
||||||
|
menuRitToggle(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FrequencyToVFO(1);
|
||||||
|
SetCarrierFreq();
|
||||||
|
setFrequency(frequency);
|
||||||
|
//delay_background(delayTime, 0);
|
||||||
|
updateDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
//wait for the button to go up again
|
||||||
|
while(keyStatus == getBtnStatus()) {
|
||||||
|
delay(10);
|
||||||
|
Check_Cat(0);
|
||||||
|
}
|
||||||
|
//delay(50);//debounce
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
void checkButton(){
|
void checkButton(){
|
||||||
//only if the button is pressed
|
//only if the button is pressed
|
||||||
if (!btnDown())
|
if (!btnDown())
|
||||||
@ -744,7 +813,7 @@ void checkButton(){
|
|||||||
}
|
}
|
||||||
//delay(50);//debounce
|
//delay(50);//debounce
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/************************************
|
/************************************
|
||||||
Replace function by KD8CEC
|
Replace function by KD8CEC
|
||||||
@ -919,6 +988,24 @@ void initSettings(){
|
|||||||
if (EEPROM.read(VERSION_ADDRESS) != FIRMWARE_VERSION_NUM)
|
if (EEPROM.read(VERSION_ADDRESS) != FIRMWARE_VERSION_NUM)
|
||||||
EEPROM.write(VERSION_ADDRESS, FIRMWARE_VERSION_NUM);
|
EEPROM.write(VERSION_ADDRESS, FIRMWARE_VERSION_NUM);
|
||||||
|
|
||||||
|
//SI5351 I2C Address
|
||||||
|
//I2C_ADDR_SI5351
|
||||||
|
SI5351BX_ADDR = EEPROM.read(I2C_ADDR_SI5351);
|
||||||
|
if (SI5351BX_ADDR < 0x10 || SI5351BX_ADDR > 0xF0)
|
||||||
|
{
|
||||||
|
SI5351BX_ADDR = 0x60;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Backup Calibration Setting from Factory Setup
|
||||||
|
//Check Factory Setting Backup Y/N
|
||||||
|
if (EEPROM.read(FACTORY_BACKUP_YN) != 0x13) {
|
||||||
|
EEPROM.write(FACTORY_BACKUP_YN, 0x13); //Set Backup Y/N
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < 32; i++) //factory setting range
|
||||||
|
EEPROM.write(FACTORY_VALUES + i, EEPROM.read(i)); //0~31 => 65~96
|
||||||
|
}
|
||||||
|
|
||||||
EEPROM.get(CW_CAL, cwmCarrier);
|
EEPROM.get(CW_CAL, cwmCarrier);
|
||||||
|
|
||||||
//for Save VFO_A_MODE to eeprom
|
//for Save VFO_A_MODE to eeprom
|
||||||
@ -946,11 +1033,39 @@ void initSettings(){
|
|||||||
keyerControl |= IAMBICB;
|
keyerControl |= IAMBICB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EEPROM.get(COMMON_OPTION0, commonOption0);
|
EEPROM.get(COMMON_OPTION0, commonOption0);
|
||||||
EEPROM.get(DISPLAY_OPTION1, displayOption1);
|
EEPROM.get(DISPLAY_OPTION1, displayOption1);
|
||||||
EEPROM.get(DISPLAY_OPTION2, displayOption2);
|
EEPROM.get(DISPLAY_OPTION2, displayOption2);
|
||||||
|
|
||||||
|
for (byte i = 0; i < 8; i++) {
|
||||||
|
sMeterLevels[i + 1] = EEPROM.read(S_METER_LEVELS + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
//KeyValues
|
||||||
|
for (byte i = 0; i < 16; i++) {
|
||||||
|
KeyValues[i][0] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 3)); //RANGE : Start Value
|
||||||
|
KeyValues[i][1] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 3) + 1); //RANGE : End Value
|
||||||
|
KeyValues[i][2] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 3) + 2); //KEY TYPE
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USE_CUSTOM_LPF_FILTER
|
||||||
|
//Custom Filters
|
||||||
|
EEPROM.get(CUST_LPF_ENABLED, isCustomFilter);
|
||||||
|
if (isCustomFilter == 0x58)
|
||||||
|
{
|
||||||
|
isCustomFilter_A7 = 1;
|
||||||
|
}
|
||||||
|
isCustomFilter = (isCustomFilter == 0x58 || isCustomFilter == 0x57);
|
||||||
|
|
||||||
|
for (byte i = 0; i < 7; i++) {
|
||||||
|
CustFilters[i][0] = EEPROM.read(CUST_LPF_START + (i * 2)); //LPF (To) Mhz
|
||||||
|
CustFilters[i][1] = EEPROM.read(CUST_LPF_START + (i * 2) + 1); //Enabled I/O
|
||||||
|
}
|
||||||
|
//char isCustomFilter = 0;
|
||||||
|
//char isCustomFilter_A7 = 0;
|
||||||
|
//char CustFilters[2][7];
|
||||||
|
#endif
|
||||||
|
|
||||||
//User callsign information
|
//User callsign information
|
||||||
if (EEPROM.read(USER_CALLSIGN_KEY) == 0x59)
|
if (EEPROM.read(USER_CALLSIGN_KEY) == 0x59)
|
||||||
userCallsignLength = EEPROM.read(USER_CALLSIGN_LEN); //MAXIMUM 18 LENGTH
|
userCallsignLength = EEPROM.read(USER_CALLSIGN_LEN); //MAXIMUM 18 LENGTH
|
||||||
@ -1008,10 +1123,10 @@ void initSettings(){
|
|||||||
{
|
{
|
||||||
//Default Setting
|
//Default Setting
|
||||||
arTuneStep[0] = 10;
|
arTuneStep[0] = 10;
|
||||||
arTuneStep[1] = 20;
|
arTuneStep[1] = 50;
|
||||||
arTuneStep[2] = 50;
|
arTuneStep[2] = 100;
|
||||||
arTuneStep[3] = 100;
|
arTuneStep[3] = 500;
|
||||||
arTuneStep[4] = 200;
|
arTuneStep[4] = 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tuneStepIndex == 0) //New User
|
if (tuneStepIndex == 0) //New User
|
||||||
@ -1062,21 +1177,21 @@ void initSettings(){
|
|||||||
//Advanced Freq control
|
//Advanced Freq control
|
||||||
EEPROM.get(ADVANCED_FREQ_OPTION1, advancedFreqOption1);
|
EEPROM.get(ADVANCED_FREQ_OPTION1, advancedFreqOption1);
|
||||||
|
|
||||||
//use Advanced Frequency Control
|
//byte advancedFreqOption1; //255 : Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency0, Bit3 : dynamic sdr frequency1, bit 7: IFTune_Value Reverse for DIY uBITX
|
||||||
if (advancedFreqOption1 & 0x01 != 0x00)
|
if ((advancedFreqOption1 & 0x01) != 0x00)
|
||||||
{
|
{
|
||||||
EEPROM.get(IF1_CAL, if1TuneValue);
|
EEPROM.get(IF1_CAL, if1TuneValue);
|
||||||
|
|
||||||
//Stored Enabled SDR Mode
|
//Stored Enabled SDR Mode
|
||||||
if (advancedFreqOption1 & 0x02 != 0x00)
|
if ((advancedFreqOption1 & 0x02) != 0x00)
|
||||||
{
|
{
|
||||||
EEPROM.get(ENABLE_SDR, sdrModeOn);
|
EEPROM.get(ENABLE_SDR, sdrModeOn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EEPROM.get(SDR_FREQUNCY, SDR_Center_Freq);
|
EEPROM.get(SDR_FREQUNCY, SDR_Center_Freq);
|
||||||
if (SDR_Center_Freq == 0)
|
//if (SDR_Center_Freq == 0)
|
||||||
SDR_Center_Freq = 32000000;
|
// SDR_Center_Freq = 32000000;
|
||||||
|
|
||||||
//default Value (for original hardware)
|
//default Value (for original hardware)
|
||||||
if (cwAdcSTFrom >= cwAdcSTTo)
|
if (cwAdcSTFrom >= cwAdcSTTo)
|
||||||
@ -1112,12 +1227,22 @@ void initSettings(){
|
|||||||
if (vfoB_mode < 2)
|
if (vfoB_mode < 2)
|
||||||
vfoB_mode = 3;
|
vfoB_mode = 3;
|
||||||
|
|
||||||
|
|
||||||
|
#if UBITX_BOARD_VERSION == 5
|
||||||
|
//original code with modified by kd8cec
|
||||||
|
if (usbCarrier > 11060000l || usbCarrier < 11048000l)
|
||||||
|
usbCarrier = 11052000l;
|
||||||
|
|
||||||
|
if (cwmCarrier > 11060000l || cwmCarrier < 11048000l)
|
||||||
|
cwmCarrier = 11052000l;
|
||||||
|
#else
|
||||||
//original code with modified by kd8cec
|
//original code with modified by kd8cec
|
||||||
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
||||||
usbCarrier = 11997000l;
|
usbCarrier = 11997000l;
|
||||||
|
|
||||||
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
||||||
cwmCarrier = 11997000l;
|
cwmCarrier = 11997000l;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (vfoA > 35000000l || 3500000l > vfoA) {
|
if (vfoA > 35000000l || 3500000l > vfoA) {
|
||||||
vfoA = 7150000l;
|
vfoA = 7150000l;
|
||||||
@ -1167,6 +1292,16 @@ void initPorts(){
|
|||||||
pinMode(ANALOG_KEYER, INPUT_PULLUP);
|
pinMode(ANALOG_KEYER, INPUT_PULLUP);
|
||||||
pinMode(ANALOG_SMETER, INPUT); //by KD8CEC
|
pinMode(ANALOG_SMETER, INPUT); //by KD8CEC
|
||||||
|
|
||||||
|
#ifdef USE_CUSTOM_LPF_FILTER
|
||||||
|
if (isCustomFilter_A7)
|
||||||
|
{
|
||||||
|
pinMode(10, OUTPUT);
|
||||||
|
pinMode(11, OUTPUT);
|
||||||
|
pinMode(12, OUTPUT);
|
||||||
|
pinMode(13, OUTPUT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
pinMode(CW_TONE, OUTPUT);
|
pinMode(CW_TONE, OUTPUT);
|
||||||
digitalWrite(CW_TONE, 0);
|
digitalWrite(CW_TONE, 0);
|
||||||
|
|
||||||
@ -1184,6 +1319,40 @@ void initPorts(){
|
|||||||
digitalWrite(CW_KEY, 0);
|
digitalWrite(CW_KEY, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Recovery Factory Setting Values
|
||||||
|
void factory_Recovery()
|
||||||
|
{
|
||||||
|
if (EEPROM.read(FACTORY_BACKUP_YN) != 0x13)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (digitalRead(PTT) == 0) //Do not proceed if PTT is pressed to prevent malfunction.
|
||||||
|
return;
|
||||||
|
|
||||||
|
printLineF2(F("Factory Recovery"));
|
||||||
|
delay(2000);
|
||||||
|
if (!btnDown())
|
||||||
|
return;
|
||||||
|
|
||||||
|
printLineF2(F("IF you continue"));
|
||||||
|
printLineF1(F("release the key"));
|
||||||
|
delay(2000);
|
||||||
|
if (btnDown())
|
||||||
|
return;
|
||||||
|
|
||||||
|
printLineF1(F("Press Key PTT"));
|
||||||
|
delay(2000);
|
||||||
|
if (digitalRead(PTT) == 0)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < 32; i++) //factory setting range
|
||||||
|
EEPROM.write(i, EEPROM.read(FACTORY_VALUES + i)); //65~96 => 0~31
|
||||||
|
|
||||||
|
//printLineF2(F("CompleteRecovery"));
|
||||||
|
printLineF1(F("Power Reset!"));
|
||||||
|
while(1); //Hold
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -1199,25 +1368,51 @@ void setup()
|
|||||||
//end section of test
|
//end section of test
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//Load I2C LCD Address for I2C LCD
|
||||||
|
//I2C LCD Parametere
|
||||||
|
#ifdef USE_I2C_LCD
|
||||||
|
EEPROM.get(I2C_LCD_MASTER, I2C_LCD_MASTER_ADDRESS);
|
||||||
|
EEPROM.get(I2C_LCD_SECOND, I2C_LCD_SECOND_ADDRESS);
|
||||||
|
|
||||||
|
if (I2C_LCD_MASTER_ADDRESS < 0x10 || I2C_LCD_MASTER_ADDRESS > 0xF0)
|
||||||
|
I2C_LCD_MASTER_ADDRESS = I2C_LCD_MASTER_ADDRESS_DEFAULT;
|
||||||
|
|
||||||
|
if (I2C_LCD_SECOND_ADDRESS < 0x10 || I2C_LCD_SECOND_ADDRESS > 0xF0)
|
||||||
|
I2C_LCD_SECOND_ADDRESS = I2C_LCD_SECOND_ADDRESS_DEFAULT;
|
||||||
|
#endif
|
||||||
|
|
||||||
//Serial.begin(9600);
|
//Serial.begin(9600);
|
||||||
LCD_Init();
|
LCD_Init();
|
||||||
printLineF(1, FIRMWARE_VERSION_INFO);
|
//printLineF(1, FIRMWARE_VERSION_INFO);
|
||||||
|
DisplayVersionInfo(FIRMWARE_VERSION_INFO);
|
||||||
|
|
||||||
Init_Cat(38400, SERIAL_8N1);
|
Init_Cat(38400, SERIAL_8N1);
|
||||||
initSettings();
|
initSettings();
|
||||||
|
initPorts();
|
||||||
|
|
||||||
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) {
|
#ifdef USE_SW_SERIAL
|
||||||
|
// if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80))
|
||||||
|
// {
|
||||||
userCallsignLength = userCallsignLength & 0x7F;
|
userCallsignLength = userCallsignLength & 0x7F;
|
||||||
printLineFromEEPRom(0, 0, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
// }
|
||||||
delay(500);
|
#else
|
||||||
|
//for Chracter LCD
|
||||||
|
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80))
|
||||||
|
{
|
||||||
|
userCallsignLength = userCallsignLength & 0x7F;
|
||||||
|
DisplayCallsign(userCallsignLength);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printLineF(0, F("uBITX v0.20"));
|
printLineF(0, F("uBITX v0.20"));
|
||||||
delay(500);
|
delay(500);
|
||||||
clearLine2();
|
clearLine2();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
initPorts();
|
#ifdef FACTORY_RECOVERY_BOOTUP
|
||||||
|
if (btnDown())
|
||||||
|
factory_Recovery();
|
||||||
|
#endif
|
||||||
|
|
||||||
byteToMode(vfoA_mode, 0);
|
byteToMode(vfoA_mode, 0);
|
||||||
initOscillators();
|
initOscillators();
|
||||||
@ -1225,12 +1420,18 @@ void setup()
|
|||||||
frequency = vfoA;
|
frequency = vfoA;
|
||||||
saveCheckFreq = frequency; //for auto save frequency
|
saveCheckFreq = frequency; //for auto save frequency
|
||||||
setFrequency(vfoA);
|
setFrequency(vfoA);
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
SendUbitxData();
|
||||||
|
#endif
|
||||||
|
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
|
|
||||||
#ifdef ENABLE_FACTORYALIGN
|
#ifdef ENABLE_FACTORYALIGN
|
||||||
if (btnDown())
|
if (btnDown())
|
||||||
factory_alignment();
|
factory_alignment();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
|
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
|
||||||
@ -1287,4 +1488,9 @@ void loop(){
|
|||||||
|
|
||||||
//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);
|
||||||
|
|
||||||
|
//for SEND SW Serial
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
SWS_Process();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
152
ubitx_20/ubitx_eemap.h
Normal file
152
ubitx_20/ubitx_eemap.h
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
header file for EEProm Address Map by KD8CEC
|
||||||
|
It must be protected to protect the factory calibrated calibration.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
**************************************************************************/
|
||||||
|
#ifndef _UBITX_EEPOM_HEADER__
|
||||||
|
#define _UBITX_EEPOM_HEADER__
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// Factory-shipped EEProm address
|
||||||
|
// (factory Firmware)
|
||||||
|
// Address : 0 ~ 31
|
||||||
|
//==============================================================================
|
||||||
|
#define MASTER_CAL 0
|
||||||
|
#define LSB_CAL 4
|
||||||
|
#define USB_CAL 8
|
||||||
|
#define SIDE_TONE 12
|
||||||
|
//these are ids of the vfos as well as their offset into the eeprom storage, don't change these 'magic' values
|
||||||
|
#define VFO_A 16
|
||||||
|
#define VFO_B 20
|
||||||
|
#define CW_SIDETONE 24
|
||||||
|
#define CW_SPEED 28
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// The spare space available in the original firmware #1
|
||||||
|
// Address : 32 ~ 62
|
||||||
|
//==============================================================================
|
||||||
|
#define RESERVE_FOR_FACTORY1 32
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// custom LPF Filter
|
||||||
|
// 48 : Using Custom LPF Filter (48 = 0x57 or 0x58 => Using Custom LPF Filter, 0x58 = using A7 IO
|
||||||
|
// 49, 50 : LPF1 (49 : MHz (~ Mhz), 50 : Enabled PIN
|
||||||
|
// 51, 52 : LPF2
|
||||||
|
// 53, 54 : LPF3
|
||||||
|
// 55, 56 : LPF4
|
||||||
|
// 57, 58 : LPF5
|
||||||
|
// 59, 60 : LPF6
|
||||||
|
// 61, 62 : LPF7
|
||||||
|
//==============================================================================
|
||||||
|
#define CUST_LPF_ENABLED 48
|
||||||
|
#define CUST_LPF_START 49
|
||||||
|
|
||||||
|
//SI5351 I2C Address (Version 1.097)
|
||||||
|
#define I2C_ADDR_SI5351 63
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// The spare space available in the original firmware #2
|
||||||
|
// (Enabled if the EEProm address is insufficient)
|
||||||
|
// Address : 64 ~ 100
|
||||||
|
//==============================================================================
|
||||||
|
#define RESERVE_FOR_FACTORY2 64 //use Factory backup from Version 1.075
|
||||||
|
#define FACTORY_BACKUP_YN 64 //Check Backup //Magic : 0x13
|
||||||
|
#define FACTORY_VALUES 65 //65 ~ 65 + 32
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// KD8CEC EEPROM MAP
|
||||||
|
// Address : 101 ~ 1023
|
||||||
|
// 256 is the base address
|
||||||
|
// 256 ~ 1023 (EEProm Section #1)
|
||||||
|
// 255 ~ 101 (EEProm Section #2)
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
//0x00 : None, 0x01 : MODE, 0x02:BAND+, 0x03:BAND-, 0x04:TUNE_STEP, 0x05:VFO Toggle, 0x06:SplitOn/Off, 0x07:TX/ON-OFF, 0x08:SDR Mode On / Off, 0x09:Rit Toggle
|
||||||
|
#define EXTENDED_KEY_RANGE 140 //Extended Key => Set : Start Value, End Value, Key Type, 16 Set (3 * 16 = 48)
|
||||||
|
|
||||||
|
#define I2C_LCD_MASTER 190
|
||||||
|
#define I2C_LCD_SECOND 191
|
||||||
|
|
||||||
|
#define S_METER_LEVELS 230 //LEVEL0 ~ LEVEL7
|
||||||
|
|
||||||
|
#define ADVANCED_FREQ_OPTION1 240 //Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency
|
||||||
|
#define IF1_CAL 241
|
||||||
|
#define ENABLE_SDR 242
|
||||||
|
#define SDR_FREQUNCY 243
|
||||||
|
#define CW_CAL 252
|
||||||
|
|
||||||
|
#define VFO_A_MODE 256
|
||||||
|
#define VFO_B_MODE 257
|
||||||
|
#define CW_DELAY 258
|
||||||
|
#define CW_START 259
|
||||||
|
#define HAM_BAND_COUNT 260 //
|
||||||
|
#define TX_TUNE_TYPE 261 //
|
||||||
|
#define HAM_BAND_RANGE 262 //FROM (2BYTE) TO (2BYTE) * 10 = 40byte
|
||||||
|
#define HAM_BAND_FREQS 302 //40, 1 BAND = 4Byte most bit is mode
|
||||||
|
#define TUNING_STEP 342 //TUNING STEP * 6 (index 1 + STEPS 5) //1STEP :
|
||||||
|
|
||||||
|
//for reduce cw key error, eeprom address
|
||||||
|
#define CW_ADC_MOST_BIT1 348 //most 2bits of DOT_TO , DOT_FROM, ST_TO, ST_FROM
|
||||||
|
#define CW_ADC_ST_FROM 349 //CW ADC Range STRAIGHT KEY from (Lower 8 bit)
|
||||||
|
#define CW_ADC_ST_TO 350 //CW ADC Range STRAIGHT KEY to (Lower 8 bit)
|
||||||
|
#define CW_ADC_DOT_FROM 351 //CW ADC Range DOT from (Lower 8 bit)
|
||||||
|
#define CW_ADC_DOT_TO 352 //CW ADC Range DOT to (Lower 8 bit)
|
||||||
|
|
||||||
|
#define CW_ADC_MOST_BIT2 353 //most 2bits of BOTH_TO, BOTH_FROM, DASH_TO, DASH_FROM
|
||||||
|
#define CW_ADC_DASH_FROM 354 //CW ADC Range DASH from (Lower 8 bit)
|
||||||
|
#define CW_ADC_DASH_TO 355 //CW ADC Range DASH to (Lower 8 bit)
|
||||||
|
#define CW_ADC_BOTH_FROM 356 //CW ADC Range BOTH from (Lower 8 bit)
|
||||||
|
#define CW_ADC_BOTH_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
||||||
|
#define CW_KEY_TYPE 358
|
||||||
|
#define 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 COMMON_OPTION0 360 //0: Confirm : CW Frequency Shift
|
||||||
|
//1 : IF Shift Save
|
||||||
|
#define IF_SHIFTVALUE 363
|
||||||
|
|
||||||
|
#define DISPLAY_OPTION1 361 //Display Option1
|
||||||
|
#define DISPLAY_OPTION2 362 //Display Option2
|
||||||
|
|
||||||
|
#define WSPR_COUNT 443 //WSPR_MESSAGE_COUNT
|
||||||
|
#define WSPR_MESSAGE1 444 //
|
||||||
|
#define WSPR_MESSAGE2 490 //
|
||||||
|
#define WSPR_MESSAGE3 536 //
|
||||||
|
#define WSPR_MESSAGE4 582 //
|
||||||
|
|
||||||
|
#define CHANNEL_FREQ 630 //Channel 1 ~ 20, 1 Channel = 4 bytes
|
||||||
|
#define CHANNEL_DESC 710 //Channel 1 ~ 20, 1 Channel = 4 bytes
|
||||||
|
#define EXTERNAL_DEVICE_OPT1 770 //for External Deivce 4byte
|
||||||
|
#define EXTERNAL_DEVICE_OPT2 774 //for External Deivce 2byte
|
||||||
|
|
||||||
|
//Check Firmware type and version
|
||||||
|
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
|
||||||
|
#define VERSION_ADDRESS 779 //check Firmware version
|
||||||
|
//USER INFORMATION
|
||||||
|
#define USER_CALLSIGN_KEY 780 //0x59
|
||||||
|
#define USER_CALLSIGN_LEN 781 //1BYTE (OPTION + LENGTH) + CALLSIGN (MAXIMUM 18)
|
||||||
|
#define USER_CALLSIGN_DAT 782 //CALL SIGN DATA //direct EEPROM to LCD basic offset
|
||||||
|
|
||||||
|
//AUTO KEY STRUCTURE
|
||||||
|
//AUTO KEY USE 800 ~ 1023
|
||||||
|
#define CW_AUTO_MAGIC_KEY 800 //0x73
|
||||||
|
#define CW_AUTO_COUNT 801 //0 ~ 255
|
||||||
|
#define CW_AUTO_DATA 803 //[INDEX, INDEX, INDEX,DATA,DATA, DATA (Positon offset is CW_AUTO_DATA
|
||||||
|
#define CW_DATA_OFSTADJ CW_AUTO_DATA - USER_CALLSIGN_DAT //offset adjust for ditect eeprom to lcd (basic offset is USER_CALLSIGN_DAT
|
||||||
|
#define CW_STATION_LEN 1023 //value range : 4 ~ 30
|
||||||
|
|
||||||
|
#endif //end of if header define
|
||||||
|
|
@ -1,3 +1,4 @@
|
|||||||
|
#include "ubitx.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This procedure is only for those who have a signal generator/transceiver tuned to exactly 7.150 and a dummy load
|
* This procedure is only for those who have a signal generator/transceiver tuned to exactly 7.150 and a dummy load
|
||||||
@ -27,14 +28,25 @@ void factory_alignment(){
|
|||||||
printLine2("#2 BFO");
|
printLine2("#2 BFO");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|
||||||
|
#if UBITX_BOARD_VERSION == 5
|
||||||
|
usbCarrier = 11053000l;
|
||||||
|
menuSetupCarrier(1);
|
||||||
|
if (usbCarrier == 11053000l){
|
||||||
|
printLine2("Setup Aborted");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
usbCarrier = 11994999l;
|
usbCarrier = 11994999l;
|
||||||
menuSetupCarrier(1);
|
menuSetupCarrier(1);
|
||||||
|
|
||||||
if (usbCarrier == 11994999l){
|
if (usbCarrier == 11994999l){
|
||||||
printLine2("Setup Aborted");
|
printLine2("Setup Aborted");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printLine2("#3:Test 3.5MHz");
|
printLine2("#3:Test 3.5MHz");
|
||||||
cwMode = 0;
|
cwMode = 0;
|
||||||
@ -88,4 +100,3 @@ void factory_alignment(){
|
|||||||
updateDisplay();
|
updateDisplay();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
64
ubitx_20/ubitx_lcd.h
Normal file
64
ubitx_20/ubitx_lcd.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
header file for LCD by KD8CEC
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
**************************************************************************/
|
||||||
|
#ifndef _UBITX_LCD_HEADER__
|
||||||
|
#define _UBITX_LCD_HEADER__
|
||||||
|
|
||||||
|
//Common Defines *********************************************************
|
||||||
|
#define LCD_CLEARDISPLAY 0x01
|
||||||
|
#define LCD_RETURNHOME 0x02
|
||||||
|
#define LCD_ENTRYMODESET 0x04
|
||||||
|
#define LCD_DISPLAYCONTROL 0x08
|
||||||
|
#define LCD_CURSORSHIFT 0x10
|
||||||
|
#define LCD_FUNCTIONSET 0x20
|
||||||
|
#define LCD_SETCGRAMADDR 0x40
|
||||||
|
#define LCD_SETDDRAMADDR 0x80
|
||||||
|
|
||||||
|
// flags for display entry mode
|
||||||
|
#define LCD_ENTRYRIGHT 0x00
|
||||||
|
#define LCD_ENTRYLEFT 0x02
|
||||||
|
#define LCD_ENTRYSHIFTINCREMENT 0x01
|
||||||
|
#define LCD_ENTRYSHIFTDECREMENT 0x00
|
||||||
|
|
||||||
|
// flags for display on/off control
|
||||||
|
#define LCD_DISPLAYON 0x04
|
||||||
|
#define LCD_DISPLAYOFF 0x00
|
||||||
|
#define LCD_CURSORON 0x02
|
||||||
|
#define LCD_CURSOROFF 0x00
|
||||||
|
#define LCD_BLINKON 0x01
|
||||||
|
#define LCD_BLINKOFF 0x00
|
||||||
|
|
||||||
|
// flags for display/cursor shift
|
||||||
|
#define LCD_DISPLAYMOVE 0x08
|
||||||
|
#define LCD_CURSORMOVE 0x00
|
||||||
|
#define LCD_MOVERIGHT 0x04
|
||||||
|
#define LCD_MOVELEFT 0x00
|
||||||
|
|
||||||
|
// flags for function set
|
||||||
|
#define LCD_8BITMODE 0x10
|
||||||
|
#define LCD_4BITMODE 0x00
|
||||||
|
#define LCD_2LINE 0x08
|
||||||
|
#define LCD_1LINE 0x00
|
||||||
|
#define LCD_5x10DOTS 0x04
|
||||||
|
#define LCD_5x8DOTS 0x00
|
||||||
|
|
||||||
|
// flags for backlight control
|
||||||
|
#define LCD_BACKLIGHT 0x08
|
||||||
|
#define LCD_NOBACKLIGHT 0x00
|
||||||
|
|
||||||
|
#endif //end of if header define
|
||||||
|
|
||||||
|
|
@ -1,10 +1,7 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
KD8CEC's uBITX Display Routine for LCD1602 Parrel
|
KD8CEC's uBITX Display Routine for LCD1602 Parrel
|
||||||
1.This is the display code for the default LCD mounted in uBITX.
|
1.This is the display code for the default LCD mounted in uBITX.
|
||||||
2.Display related functions of uBITX. Some functions moved from uBITX_Ui.
|
2.Some functions moved from uBITX_Ui.
|
||||||
3.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
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -20,12 +17,14 @@
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
#ifdef UBITX_DISPLAY_LCD1602P
|
#include "ubitx.h"
|
||||||
|
#include "ubitx_lcd.h"
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//Begin of TinyLCD Library by KD8CEC
|
//Begin of TinyLCD Library by KD8CEC
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
|
#ifdef UBITX_DISPLAY_LCD1602P
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
LCD1602_TINY Library for 16 x 2 LCD
|
LCD1602_TINY Library for 16 x 2 LCD
|
||||||
Referecnce Source : LiquidCrystal.cpp
|
Referecnce Source : LiquidCrystal.cpp
|
||||||
@ -39,52 +38,17 @@
|
|||||||
But keep it as long as the original author of the code.
|
But keep it as long as the original author of the code.
|
||||||
DE Ian KD8CEC
|
DE Ian KD8CEC
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#define LCD_Command(x) (LCD_Send(x, LOW))
|
#define LCD_Command(x) (LCD_Send(x, LOW))
|
||||||
#define LCD_Write(x) (LCD_Send(x, HIGH))
|
#define LCD_Write(x) (LCD_Send(x, HIGH))
|
||||||
|
|
||||||
|
#define UBITX_DISPLAY_LCD1602_BASE
|
||||||
|
|
||||||
//Define connected PIN
|
//Define connected PIN
|
||||||
#define LCD_PIN_RS 8
|
#define LCD_PIN_RS 8
|
||||||
#define LCD_PIN_EN 9
|
#define LCD_PIN_EN 9
|
||||||
uint8_t LCD_PIN_DAT[4] = {10, 11, 12, 13};
|
uint8_t LCD_PIN_DAT[4] = {10, 11, 12, 13};
|
||||||
|
|
||||||
// commands
|
|
||||||
#define LCD_CLEARDISPLAY 0x01
|
|
||||||
#define LCD_RETURNHOME 0x02
|
|
||||||
#define LCD_ENTRYMODESET 0x04
|
|
||||||
#define LCD_DISPLAYCONTROL 0x08
|
|
||||||
#define LCD_CURSORSHIFT 0x10
|
|
||||||
#define LCD_FUNCTIONSET 0x20
|
|
||||||
#define LCD_SETCGRAMADDR 0x40
|
|
||||||
#define LCD_SETDDRAMADDR 0x80
|
|
||||||
|
|
||||||
// flags for display entry mode
|
|
||||||
#define LCD_ENTRYRIGHT 0x00
|
|
||||||
#define LCD_ENTRYLEFT 0x02
|
|
||||||
#define LCD_ENTRYSHIFTINCREMENT 0x01
|
|
||||||
#define LCD_ENTRYSHIFTDECREMENT 0x00
|
|
||||||
|
|
||||||
// flags for display on/off control
|
|
||||||
#define LCD_DISPLAYON 0x04
|
|
||||||
#define LCD_DISPLAYOFF 0x00
|
|
||||||
#define LCD_CURSORON 0x02
|
|
||||||
#define LCD_CURSOROFF 0x00
|
|
||||||
#define LCD_BLINKON 0x01
|
|
||||||
#define LCD_BLINKOFF 0x00
|
|
||||||
|
|
||||||
// flags for display/cursor shift
|
|
||||||
#define LCD_DISPLAYMOVE 0x08
|
|
||||||
#define LCD_CURSORMOVE 0x00
|
|
||||||
#define LCD_MOVERIGHT 0x04
|
|
||||||
#define LCD_MOVELEFT 0x00
|
|
||||||
|
|
||||||
// flags for function set
|
|
||||||
#define LCD_8BITMODE 0x10
|
|
||||||
#define LCD_4BITMODE 0x00
|
|
||||||
#define LCD_2LINE 0x08
|
|
||||||
#define LCD_1LINE 0x00
|
|
||||||
#define LCD_5x10DOTS 0x04
|
|
||||||
#define LCD_5x8DOTS 0x00
|
|
||||||
|
|
||||||
void write4bits(uint8_t value)
|
void write4bits(uint8_t value)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
@ -146,9 +110,144 @@ void LCD1602_Init()
|
|||||||
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
//========================================================================
|
||||||
|
//End of TinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
//Begin of I2CTinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
#ifdef UBITX_DISPLAY_LCD1602I
|
||||||
|
#include <Wire.h>
|
||||||
|
/*************************************************************************
|
||||||
|
I2C Tiny LCD Library
|
||||||
|
Referecnce Source : LiquidCrystal_I2C.cpp // Based on the work by DFRobot
|
||||||
|
KD8CEC
|
||||||
|
|
||||||
|
This source code is modified version for small program memory
|
||||||
|
from Arduino LiquidCrystal_I2C Library
|
||||||
|
|
||||||
|
I wrote this code myself, so there is no license restriction.
|
||||||
|
So this code allows anyone to write with confidence.
|
||||||
|
But keep it as long as the original author of the code.
|
||||||
|
Ian KD8CEC
|
||||||
|
**************************************************************************/
|
||||||
|
#define UBITX_DISPLAY_LCD1602_BASE
|
||||||
|
|
||||||
|
#define En B00000100 // Enable bit
|
||||||
|
#define Rw B00000010 // Read/Write bit
|
||||||
|
#define Rs B00000001 // Register select bit
|
||||||
|
|
||||||
|
#define LCD_Command(x) (LCD_Send(x, 0))
|
||||||
|
#define LCD_Write(x) (LCD_Send(x, Rs))
|
||||||
|
|
||||||
|
uint8_t _Addr;
|
||||||
|
uint8_t _displayfunction;
|
||||||
|
uint8_t _displaycontrol;
|
||||||
|
uint8_t _displaymode;
|
||||||
|
uint8_t _numlines;
|
||||||
|
uint8_t _cols;
|
||||||
|
uint8_t _rows;
|
||||||
|
uint8_t _backlightval;
|
||||||
|
|
||||||
|
#define printIIC(args) Wire.write(args)
|
||||||
|
|
||||||
|
void expanderWrite(uint8_t _data)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(_Addr);
|
||||||
|
printIIC((int)(_data) | _backlightval);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void pulseEnable(uint8_t _data){
|
||||||
|
expanderWrite(_data | En); // En high
|
||||||
|
delayMicroseconds(1); // enable pulse must be >450ns
|
||||||
|
|
||||||
|
expanderWrite(_data & ~En); // En low
|
||||||
|
delayMicroseconds(50); // commands need > 37us to settle
|
||||||
|
}
|
||||||
|
|
||||||
|
void write4bits(uint8_t value)
|
||||||
|
{
|
||||||
|
expanderWrite(value);
|
||||||
|
pulseEnable(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_Send(uint8_t value, uint8_t mode)
|
||||||
|
{
|
||||||
|
uint8_t highnib=value&0xf0;
|
||||||
|
uint8_t lownib=(value<<4)&0xf0;
|
||||||
|
write4bits((highnib)|mode);
|
||||||
|
write4bits((lownib)|mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Turn the (optional) backlight off/on
|
||||||
|
void noBacklight(void) {
|
||||||
|
_backlightval=LCD_NOBACKLIGHT;
|
||||||
|
expanderWrite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlight(void) {
|
||||||
|
_backlightval=LCD_BACKLIGHT;
|
||||||
|
expanderWrite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD1602_Init()
|
||||||
|
{
|
||||||
|
//I2C Init
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
_cols = 16;
|
||||||
|
_rows = 2;
|
||||||
|
_backlightval = LCD_NOBACKLIGHT;
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
delay(50);
|
||||||
|
|
||||||
|
// Now we pull both RS and R/W low to begin commands
|
||||||
|
expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1)
|
||||||
|
delay(1000);
|
||||||
|
//put the LCD into 4 bit mode
|
||||||
|
// this is according to the hitachi HD44780 datasheet
|
||||||
|
// figure 24, pg 46
|
||||||
|
|
||||||
|
// we start in 8bit mode, try to set 4 bit mode
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// second try
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// third go!
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(150);
|
||||||
|
|
||||||
|
// finally, set to 4-bit interface
|
||||||
|
write4bits(0x02 << 4);
|
||||||
|
|
||||||
|
// finally, set # lines, font size, etc.
|
||||||
|
LCD_Command(LCD_FUNCTIONSET | LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_2LINE);
|
||||||
|
|
||||||
|
// turn the display on with no cursor or blinking default
|
||||||
|
LCD_Command(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
|
||||||
|
|
||||||
|
// clear it off
|
||||||
|
LCD_Command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||||
|
//delayMicroseconds(2000); // this command takes a long time!
|
||||||
|
delayMicroseconds(1000); // this command takes a long time!
|
||||||
|
|
||||||
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
|
|
||||||
|
backlight();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void LCD_Print(const char *c)
|
void LCD_Print(const char *c)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < strlen(c); i++)
|
for (uint8_t i = 0; i < strlen(c); i++)
|
||||||
{
|
{
|
||||||
if (*(c + i) == 0x00) return;
|
if (*(c + i) == 0x00) return;
|
||||||
LCD_Write(*(c + i));
|
LCD_Write(*(c + i));
|
||||||
@ -167,78 +266,46 @@ void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
|||||||
for (int i=0; i<8; i++)
|
for (int i=0; i<8; i++)
|
||||||
LCD_Write(charmap[i]);
|
LCD_Write(charmap[i]);
|
||||||
}
|
}
|
||||||
//========================================================================
|
|
||||||
//End of TinyLCD Library by KD8CEC
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <LiquidCrystal.h>
|
|
||||||
LiquidCrystal lcd(8,9,10,11,12,13);
|
|
||||||
*/
|
*/
|
||||||
|
#endif
|
||||||
|
//========================================================================
|
||||||
|
//End of I2CTinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
// 16 X 02 LCD Routines
|
||||||
//Begin of Display Base Routines (Init, printLine..)
|
//Begin of Display Base Routines (Init, printLine..)
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
#ifdef UBITX_DISPLAY_LCD1602_BASE
|
||||||
|
|
||||||
|
//SWR GRAPH, DrawMeter and drawingMeter Logic function by VK2ETA
|
||||||
|
#define OPTION_SKINNYBARS
|
||||||
|
|
||||||
char c[30], b[30];
|
char c[30], b[30];
|
||||||
char printBuff[2][17]; //mirrors what is showing on the two lines of the display
|
char printBuff[2][17]; //mirrors what is showing on the two lines of the display
|
||||||
|
|
||||||
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);
|
void LCD_Print(const char *c)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < strlen(c); i++)
|
||||||
|
{
|
||||||
|
if (*(c + i) == 0x00) return;
|
||||||
|
LCD_Write(*(c + i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const PROGMEM uint8_t lock_bitmap[8] = {
|
void LCD_SetCursor(uint8_t col, uint8_t row)
|
||||||
0b01110,
|
{
|
||||||
0b10001,
|
LCD_Command(LCD_SETDDRAMADDR | (col + row * 0x40)); //0 : 0x00, 1 : 0x40, only for 16 x 2 lcd
|
||||||
0b10001,
|
}
|
||||||
0b11111,
|
|
||||||
0b11011,
|
|
||||||
0b11011,
|
|
||||||
0b11111,
|
|
||||||
0b00000};
|
|
||||||
PGM_P plock_bitmap = reinterpret_cast<PGM_P>(lock_bitmap);
|
|
||||||
|
|
||||||
|
void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
||||||
// initializes the custom characters
|
{
|
||||||
// we start from char 1 as char 0 terminates the string!
|
location &= 0x7; // we only have 8 locations 0-7
|
||||||
void initMeter(){
|
LCD_Command(LCD_SETCGRAMADDR | (location << 3));
|
||||||
uint8_t tmpbytes[8];
|
for (int i=0; i<8; i++)
|
||||||
byte i;
|
LCD_Write(charmap[i]);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(plock_bitmap + i);
|
|
||||||
LCD_CreateChar(0, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i);
|
|
||||||
LCD_CreateChar(1, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 8);
|
|
||||||
LCD_CreateChar(2, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 16);
|
|
||||||
LCD_CreateChar(3, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 24);
|
|
||||||
LCD_CreateChar(4, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 32);
|
|
||||||
LCD_CreateChar(5, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 40);
|
|
||||||
LCD_CreateChar(6, tmpbytes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LCD_Init(void)
|
void LCD_Init(void)
|
||||||
@ -247,29 +314,6 @@ void LCD_Init(void)
|
|||||||
initMeter(); //for Meter Display
|
initMeter(); //for Meter Display
|
||||||
}
|
}
|
||||||
|
|
||||||
//by KD8CEC
|
|
||||||
//0 ~ 25 : 30 over : + 10
|
|
||||||
void drawMeter(int needle) {
|
|
||||||
//5Char + O over
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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)
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
@ -464,13 +508,15 @@ void updateDisplay() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
char line2Buffer[16];
|
char line2Buffer[17];
|
||||||
//KD8CEC 200Hz ST
|
//KD8CEC 200Hz ST
|
||||||
//L14.150 200Hz ST
|
//L14.150 200Hz ST
|
||||||
//U14.150 +150khz
|
//U14.150 +150khz
|
||||||
int freqScrollPosition = 0;
|
int freqScrollPosition = 0;
|
||||||
|
|
||||||
//Example Line2 Optinal Display
|
//Example Line2 Optinal Display
|
||||||
//immediate execution, not call by scheulder
|
//immediate execution, not call by scheulder
|
||||||
|
//warning : unused parameter 'displayType' <-- ignore, this is reserve
|
||||||
void updateLine2Buffer(char displayType)
|
void updateLine2Buffer(char displayType)
|
||||||
{
|
{
|
||||||
unsigned long tmpFreq = 0;
|
unsigned long tmpFreq = 0;
|
||||||
@ -480,6 +526,16 @@ void updateLine2Buffer(char displayType)
|
|||||||
|
|
||||||
//display frequency
|
//display frequency
|
||||||
tmpFreq = ritTxFrequency;
|
tmpFreq = ritTxFrequency;
|
||||||
|
|
||||||
|
//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;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 15; i >= 6; i--) {
|
for (int i = 15; i >= 6; i--) {
|
||||||
if (tmpFreq > 0) {
|
if (tmpFreq > 0) {
|
||||||
if (i == 12 || i == 8) line2Buffer[i] = '.';
|
if (i == 12 || i == 8) line2Buffer[i] = '.';
|
||||||
@ -522,13 +578,13 @@ void updateLine2Buffer(char displayType)
|
|||||||
|
|
||||||
//EXAMPLE #1
|
//EXAMPLE #1
|
||||||
if ((displayOption1 & 0x04) == 0x00) //none scroll display
|
if ((displayOption1 & 0x04) == 0x00) //none scroll display
|
||||||
line2Buffer[6] = 'k';
|
line2Buffer[6] = 'M';
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//example #2
|
//example #2
|
||||||
if (freqScrollPosition++ > 18) //none scroll display time
|
if (freqScrollPosition++ > 18) //none scroll display time
|
||||||
{
|
{
|
||||||
line2Buffer[6] = 'k';
|
line2Buffer[6] = 'M';
|
||||||
if (freqScrollPosition > 25)
|
if (freqScrollPosition > 25)
|
||||||
freqScrollPosition = -1;
|
freqScrollPosition = -1;
|
||||||
}
|
}
|
||||||
@ -613,7 +669,13 @@ void updateLine2Buffer(char displayType)
|
|||||||
line2Buffer[13] = ' ';
|
line2Buffer[13] = ' ';
|
||||||
|
|
||||||
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||||||
if (cwKeyType == 0)
|
if (sdrModeOn == 1)
|
||||||
|
{
|
||||||
|
line2Buffer[13] = 'S';
|
||||||
|
line2Buffer[14] = 'D';
|
||||||
|
line2Buffer[15] = 'R';
|
||||||
|
}
|
||||||
|
else if (cwKeyType == 0)
|
||||||
{
|
{
|
||||||
line2Buffer[14] = 'S';
|
line2Buffer[14] = 'S';
|
||||||
line2Buffer[15] = 'T';
|
line2Buffer[15] = 'T';
|
||||||
@ -636,20 +698,22 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
|||||||
{
|
{
|
||||||
if (meterType == 0 || meterType == 1 || meterType == 2)
|
if (meterType == 0 || meterType == 1 || meterType == 2)
|
||||||
{
|
{
|
||||||
drawMeter(meterValue); //call original source code
|
drawMeter(meterValue);
|
||||||
int lineNumber = 0;
|
int lineNumber = 0;
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
lineNumber = 1;
|
lineNumber = 1;
|
||||||
|
|
||||||
LCD_SetCursor(drawPosition, lineNumber);
|
LCD_SetCursor(drawPosition, lineNumber);
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++) //meter 5 + +db 1 = 6
|
LCD_Write(lcdMeter[0]);
|
||||||
LCD_Write(lcdMeter[i]);
|
LCD_Write(lcdMeter[1]);
|
||||||
|
LCD_Write(lcdMeter[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte testValue = 0;
|
|
||||||
char checkCount = 0;
|
char checkCount = 0;
|
||||||
|
char checkCountSMeter = 0;
|
||||||
|
|
||||||
void idle_process()
|
void idle_process()
|
||||||
{
|
{
|
||||||
//space for user graphic display
|
//space for user graphic display
|
||||||
@ -667,28 +731,60 @@ void idle_process()
|
|||||||
line2DisplayStatus = 2;
|
line2DisplayStatus = 2;
|
||||||
checkCount = 0;
|
checkCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//EX for Meters
|
|
||||||
/*
|
|
||||||
DisplayMeter(0, testValue++, 7);
|
|
||||||
if (testValue > 30)
|
|
||||||
testValue = 0;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//S-Meter Display
|
||||||
|
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
||||||
|
{
|
||||||
|
int newSMeter;
|
||||||
|
|
||||||
|
#ifdef USE_I2CSMETER
|
||||||
|
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
|
||||||
|
#else
|
||||||
|
//VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
|
||||||
|
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
||||||
|
|
||||||
|
//Faster attack, Slower release
|
||||||
|
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10) / 4;
|
||||||
|
currentSMeter = newSMeter;
|
||||||
|
|
||||||
|
scaledSMeter = 0;
|
||||||
|
for (byte s = 8; s >= 1; s--) {
|
||||||
|
if (currentSMeter > sMeterLevels[s]) {
|
||||||
|
scaledSMeter = s;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DisplayMeter(0, scaledSMeter, 13);
|
||||||
|
checkCountSMeter = 0; //Reset Latency time
|
||||||
|
} //end of S-Meter
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//AutoKey LCD Display Routine
|
//AutoKey LCD Display Routine
|
||||||
void Display_AutoKeyTextIndex(char textIndex)
|
void Display_AutoKeyTextIndex(byte textIndex)
|
||||||
{
|
{
|
||||||
byte diplayAutoCWLine = 0;
|
byte diplayAutoCWLine = 0;
|
||||||
|
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
diplayAutoCWLine = 1;
|
diplayAutoCWLine = 1;
|
||||||
LCD_SetCursor(0, diplayAutoCWLine);
|
LCD_SetCursor(0, diplayAutoCWLine);
|
||||||
LCD_Write(byteToChar(selectedCWTextIndex));
|
LCD_Write(byteToChar(textIndex));
|
||||||
LCD_Write(':');
|
LCD_Write(':');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DisplayCallsign(byte callSignLength)
|
||||||
|
{
|
||||||
|
printLineFromEEPRom(0, 0, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
||||||
|
//delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayVersionInfo(const __FlashStringHelper * fwVersionInfo)
|
||||||
|
{
|
||||||
|
printLineF(1, fwVersionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
727
ubitx_20/ubitx_lcd_1602Dual.ino
Normal file
727
ubitx_20/ubitx_lcd_1602Dual.ino
Normal file
@ -0,0 +1,727 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
KD8CEC's uBITX Display Routine for LCD1602 Dual LCD
|
||||||
|
1.This is the display code for the 16x02 Dual LCD
|
||||||
|
2.Some functions moved from uBITX_Ui.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
#include "ubitx.h"
|
||||||
|
#include "ubitx_lcd.h"
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
//Begin of I2CTinyLCD Library for Dual LCD by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
#ifdef UBITX_DISPLAY_LCD1602I_DUAL
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
/*************************************************************************
|
||||||
|
I2C Tiny LCD Library
|
||||||
|
Referecnce Source : LiquidCrystal_I2C.cpp // Based on the work by DFRobot
|
||||||
|
KD8CEC
|
||||||
|
|
||||||
|
This source code is modified version for small program memory
|
||||||
|
from Arduino LiquidCrystal_I2C Library
|
||||||
|
|
||||||
|
I wrote this code myself, so there is no license restriction.
|
||||||
|
So this code allows anyone to write with confidence.
|
||||||
|
But keep it as long as the original author of the code.
|
||||||
|
Ian KD8CEC
|
||||||
|
**************************************************************************/
|
||||||
|
#define UBITX_DISPLAY_LCD1602_BASE
|
||||||
|
|
||||||
|
#define En B00000100 // Enable bit
|
||||||
|
#define Rw B00000010 // Read/Write bit
|
||||||
|
#define Rs B00000001 // Register select bit
|
||||||
|
|
||||||
|
#define LCD_Command(x) (LCD_Send(x, 0))
|
||||||
|
#define LCD_Write(x) (LCD_Send(x, Rs))
|
||||||
|
|
||||||
|
uint8_t _Addr;
|
||||||
|
uint8_t _displayfunction;
|
||||||
|
uint8_t _displaycontrol;
|
||||||
|
uint8_t _displaymode;
|
||||||
|
uint8_t _numlines;
|
||||||
|
uint8_t _cols;
|
||||||
|
uint8_t _rows;
|
||||||
|
uint8_t _backlightval;
|
||||||
|
|
||||||
|
#define printIIC(args) Wire.write(args)
|
||||||
|
|
||||||
|
void expanderWrite(uint8_t _data)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(_Addr);
|
||||||
|
printIIC((int)(_data) | _backlightval);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void pulseEnable(uint8_t _data){
|
||||||
|
expanderWrite(_data | En); // En high
|
||||||
|
delayMicroseconds(1); // enable pulse must be >450ns
|
||||||
|
|
||||||
|
expanderWrite(_data & ~En); // En low
|
||||||
|
delayMicroseconds(50); // commands need > 37us to settle
|
||||||
|
}
|
||||||
|
|
||||||
|
void write4bits(uint8_t value)
|
||||||
|
{
|
||||||
|
expanderWrite(value);
|
||||||
|
pulseEnable(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_Send(uint8_t value, uint8_t mode)
|
||||||
|
{
|
||||||
|
uint8_t highnib=value&0xf0;
|
||||||
|
uint8_t lownib=(value<<4)&0xf0;
|
||||||
|
write4bits((highnib)|mode);
|
||||||
|
write4bits((lownib)|mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Turn the (optional) backlight off/on
|
||||||
|
void noBacklight(void) {
|
||||||
|
_backlightval=LCD_NOBACKLIGHT;
|
||||||
|
expanderWrite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlight(void) {
|
||||||
|
_backlightval=LCD_BACKLIGHT;
|
||||||
|
expanderWrite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD1602_Dual_Init()
|
||||||
|
{
|
||||||
|
//I2C Init
|
||||||
|
_cols = 16;
|
||||||
|
_rows = 2;
|
||||||
|
_backlightval = LCD_NOBACKLIGHT;
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
delay(50);
|
||||||
|
|
||||||
|
// Now we pull both RS and R/W low to begin commands
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1)
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1)
|
||||||
|
delay(1000);
|
||||||
|
//put the LCD into 4 bit mode
|
||||||
|
// this is according to the hitachi HD44780 datasheet
|
||||||
|
// figure 24, pg 46
|
||||||
|
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
// we start in 8bit mode, try to set 4 bit mode
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// second try
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// third go!
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(150);
|
||||||
|
|
||||||
|
// finally, set to 4-bit interface
|
||||||
|
write4bits(0x02 << 4);
|
||||||
|
|
||||||
|
// finally, set # lines, font size, etc.
|
||||||
|
LCD_Command(LCD_FUNCTIONSET | LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_2LINE);
|
||||||
|
|
||||||
|
// turn the display on with no cursor or blinking default
|
||||||
|
LCD_Command(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
|
||||||
|
|
||||||
|
// clear it off
|
||||||
|
LCD_Command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||||
|
//delayMicroseconds(2000); // this command takes a long time!
|
||||||
|
delayMicroseconds(1000); // this command takes a long time!
|
||||||
|
|
||||||
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
|
|
||||||
|
backlight();
|
||||||
|
|
||||||
|
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
// we start in 8bit mode, try to set 4 bit mode
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// second try
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// third go!
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(150);
|
||||||
|
|
||||||
|
// finally, set to 4-bit interface
|
||||||
|
write4bits(0x02 << 4);
|
||||||
|
|
||||||
|
// finally, set # lines, font size, etc.
|
||||||
|
LCD_Command(LCD_FUNCTIONSET | LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_2LINE);
|
||||||
|
|
||||||
|
// turn the display on with no cursor or blinking default
|
||||||
|
LCD_Command(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
|
||||||
|
|
||||||
|
// clear it off
|
||||||
|
LCD_Command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||||
|
//delayMicroseconds(2000); // this command takes a long time!
|
||||||
|
delayMicroseconds(1000); // this command takes a long time!
|
||||||
|
|
||||||
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
|
|
||||||
|
backlight();
|
||||||
|
|
||||||
|
//Change to Default LCD (Master)
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 16 X 02 LCD Routines
|
||||||
|
//Begin of Display Base Routines (Init, printLine..)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void LCD_Print(const char *c)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < strlen(c); i++)
|
||||||
|
{
|
||||||
|
if (*(c + i) == 0x00) return;
|
||||||
|
LCD_Write(*(c + i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
|
||||||
|
void LCD_SetCursor(uint8_t col, uint8_t row)
|
||||||
|
{
|
||||||
|
LCD_Command(LCD_SETDDRAMADDR | (col + row_offsets[row])); //0 : 0x00, 1 : 0x40, only for 20 x 4 lcd
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
||||||
|
{
|
||||||
|
location &= 0x7; // we only have 8 locations 0-7
|
||||||
|
LCD_Command(LCD_SETCGRAMADDR | (location << 3));
|
||||||
|
for (int i=0; i<8; i++)
|
||||||
|
LCD_Write(charmap[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//SWR GRAPH, DrawMeter and drawingMeter Logic function by VK2ETA
|
||||||
|
//#define OPTION_SKINNYBARS
|
||||||
|
|
||||||
|
char c[30], b[30];
|
||||||
|
char printBuff[4][20]; //mirrors what is showing on the two lines of the display
|
||||||
|
|
||||||
|
void LCD_Init(void)
|
||||||
|
{
|
||||||
|
LCD1602_Dual_Init();
|
||||||
|
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
initMeter(); //for Meter Display //when dual LCD, S.Meter on second LCD
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The generic routine to display one line on the LCD
|
||||||
|
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
|
||||||
|
LCD_SetCursor(0, linenmbr); // place the cursor at the beginning of the selected line
|
||||||
|
LCD_Print(c);
|
||||||
|
strcpy(printBuff[linenmbr], c);
|
||||||
|
|
||||||
|
for (byte i = strlen(c); i < 20; i++) { // add white spaces until the end of the 20 characters line is reached
|
||||||
|
LCD_Write(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printLineF(char linenmbr, const __FlashStringHelper *c)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char tmpBuff[21];
|
||||||
|
PGM_P p = reinterpret_cast<PGM_P>(c);
|
||||||
|
|
||||||
|
for (i = 0; i < 21; i++){
|
||||||
|
unsigned char fChar = pgm_read_byte(p++);
|
||||||
|
tmpBuff[i] = fChar;
|
||||||
|
if (fChar == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printLine(linenmbr, tmpBuff);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LCD_MAX_COLUMN 20
|
||||||
|
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetTtype) {
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
||||||
|
|
||||||
|
LCD_SetCursor(lcdColumn, linenmbr);
|
||||||
|
|
||||||
|
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||||||
|
{
|
||||||
|
if (++lcdColumn <= LCD_MAX_COLUMN)
|
||||||
|
LCD_Write(EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i));
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (byte i = lcdColumn; i < 20; i++) //Right Padding by Space
|
||||||
|
LCD_Write(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine1(const char *c)
|
||||||
|
{
|
||||||
|
printLine(1,c);
|
||||||
|
}
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine2(const char *c)
|
||||||
|
{
|
||||||
|
printLine(0,c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearLine2()
|
||||||
|
{
|
||||||
|
printLine2("");
|
||||||
|
line2DisplayStatus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine1Clear(){
|
||||||
|
printLine(1,"");
|
||||||
|
}
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine2Clear(){
|
||||||
|
printLine(0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
void printLine2ClearAndUpdate(){
|
||||||
|
printLine(0, "");
|
||||||
|
line2DisplayStatus = 0;
|
||||||
|
updateDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
//==================================================================================
|
||||||
|
//End of Display Base Routines
|
||||||
|
//==================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//==================================================================================
|
||||||
|
//Begin of User Interface Routines
|
||||||
|
//==================================================================================
|
||||||
|
|
||||||
|
//Main Display
|
||||||
|
// this builds up the top line of the display with frequency and mode
|
||||||
|
void updateDisplay() {
|
||||||
|
// tks Jack Purdum W8TEE
|
||||||
|
// replaced fsprint commmands by str commands for code size reduction
|
||||||
|
// replace code for Frequency numbering error (alignment, point...) by KD8CEC
|
||||||
|
// i also Very TNX Purdum for good source code
|
||||||
|
int i;
|
||||||
|
unsigned long tmpFreq = frequency; //
|
||||||
|
|
||||||
|
memset(c, 0, sizeof(c));
|
||||||
|
|
||||||
|
if (inTx){
|
||||||
|
if (isCWAutoMode == 2) {
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
c[3-i] = (i < autoCWSendReservCount ? byteToChar(autoCWSendReserv[i]) : ' ');
|
||||||
|
|
||||||
|
//display Sending Index
|
||||||
|
c[4] = byteToChar(sendingCWTextIndex);
|
||||||
|
c[5] = '=';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (cwTimeout > 0)
|
||||||
|
strcpy(c, " CW:");
|
||||||
|
else
|
||||||
|
strcpy(c, " TX:");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (ritOn)
|
||||||
|
strcpy(c, "RIT ");
|
||||||
|
else {
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
|
if (isUSB)
|
||||||
|
strcpy(c, "USB ");
|
||||||
|
else
|
||||||
|
strcpy(c, "LSB ");
|
||||||
|
}
|
||||||
|
else if (cwMode == 1)
|
||||||
|
{
|
||||||
|
strcpy(c, "CWL ");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(c, "CWU ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vfoActive == VFO_A) // VFO A is active
|
||||||
|
strcat(c, "A:");
|
||||||
|
else
|
||||||
|
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
|
||||||
|
for (int i = 15; i >= 6; i--) {
|
||||||
|
if (tmpFreq > 0) {
|
||||||
|
if (i == 12 || i == 8) c[i] = '.';
|
||||||
|
else {
|
||||||
|
c[i] = tmpFreq % 10 + 0x30;
|
||||||
|
tmpFreq /= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
c[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
//remarked by KD8CEC
|
||||||
|
//already RX/TX status display, and over index (16 x 2 LCD)
|
||||||
|
printLine(1, c);
|
||||||
|
|
||||||
|
byte diplayVFOLine = 1;
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
diplayVFOLine = 0;
|
||||||
|
|
||||||
|
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
||||||
|
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
|
||||||
|
LCD_SetCursor(5,diplayVFOLine);
|
||||||
|
LCD_Write((uint8_t)0);
|
||||||
|
}
|
||||||
|
else if (isCWAutoMode == 2){
|
||||||
|
LCD_SetCursor(5,diplayVFOLine);
|
||||||
|
LCD_Write(0x7E);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LCD_SetCursor(5,diplayVFOLine);
|
||||||
|
LCD_Write(':');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char line2Buffer[20];
|
||||||
|
//KD8CEC 200Hz ST
|
||||||
|
//L14.150 200Hz ST
|
||||||
|
//U14.150 +150khz
|
||||||
|
int freqScrollPosition = 0;
|
||||||
|
|
||||||
|
//Example Line2 Optinal Display
|
||||||
|
//immediate execution, not call by scheulder
|
||||||
|
//warning : unused parameter 'displayType' <-- ignore, this is reserve
|
||||||
|
void updateLine2Buffer(char displayType)
|
||||||
|
{
|
||||||
|
unsigned long tmpFreq = 0;
|
||||||
|
if (ritOn)
|
||||||
|
{
|
||||||
|
strcpy(line2Buffer, "RitTX:");
|
||||||
|
|
||||||
|
//display frequency
|
||||||
|
tmpFreq = ritTxFrequency;
|
||||||
|
|
||||||
|
//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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&line2Buffer[10], ' ', 10);
|
||||||
|
|
||||||
|
if (isIFShift)
|
||||||
|
{
|
||||||
|
line2Buffer[6] = 'M';
|
||||||
|
line2Buffer[7] = ' ';
|
||||||
|
//IFShift Offset Value
|
||||||
|
line2Buffer[8] = 'I';
|
||||||
|
line2Buffer[9] = 'F';
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
for (int i = 12; i < 17; i++)
|
||||||
|
{
|
||||||
|
if (line2Buffer[i] == 0)
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
} // end of display IF
|
||||||
|
else // step & Key Type display
|
||||||
|
{
|
||||||
|
//Step
|
||||||
|
long tmpStep = arTuneStep[tuneStepIndex -1];
|
||||||
|
|
||||||
|
byte isStepKhz = 0;
|
||||||
|
if (tmpStep >= 1000)
|
||||||
|
{
|
||||||
|
isStepKhz = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 13; i >= 11 - isStepKhz; i--) {
|
||||||
|
if (tmpStep > 0) {
|
||||||
|
line2Buffer[i + isStepKhz] = tmpStep % 10 + 0x30;
|
||||||
|
tmpStep /= 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line2Buffer[i +isStepKhz] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isStepKhz == 0)
|
||||||
|
{
|
||||||
|
line2Buffer[14] = 'H';
|
||||||
|
line2Buffer[15] = 'z';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//line2Buffer[17] = ' ';
|
||||||
|
/* ianlee
|
||||||
|
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||||||
|
if (cwKeyType == 0)
|
||||||
|
{
|
||||||
|
line2Buffer[18] = 'S';
|
||||||
|
line2Buffer[19] = 'T';
|
||||||
|
}
|
||||||
|
else if (cwKeyType == 1)
|
||||||
|
{
|
||||||
|
line2Buffer[18] = 'I';
|
||||||
|
line2Buffer[19] = 'A';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line2Buffer[18] = 'I';
|
||||||
|
line2Buffer[19] = '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);
|
||||||
|
|
||||||
|
LCD_SetCursor(drawPosition, 0);
|
||||||
|
LCD_Write('S');
|
||||||
|
|
||||||
|
LCD_Write(':');
|
||||||
|
for (int i = 0; i < 7; i++)
|
||||||
|
LCD_Write(lcdMeter[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char checkCount = 0;
|
||||||
|
char checkCountSMeter = 0;
|
||||||
|
|
||||||
|
char beforeKeyType = -1;
|
||||||
|
char displaySDRON = 0;
|
||||||
|
|
||||||
|
//execute interval : 0.25sec
|
||||||
|
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;
|
||||||
|
|
||||||
|
//check change CW Key Type
|
||||||
|
if (beforeKeyType != cwKeyType)
|
||||||
|
{
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
LCD_SetCursor(10, 0);
|
||||||
|
LCD_Write('K');
|
||||||
|
LCD_Write('E');
|
||||||
|
LCD_Write('Y');
|
||||||
|
LCD_Write(':');
|
||||||
|
|
||||||
|
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||||||
|
if (cwKeyType == 0)
|
||||||
|
{
|
||||||
|
LCD_Write('S');
|
||||||
|
LCD_Write('T');
|
||||||
|
}
|
||||||
|
else if (cwKeyType == 1)
|
||||||
|
{
|
||||||
|
LCD_Write('I');
|
||||||
|
LCD_Write('A');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LCD_Write('I');
|
||||||
|
LCD_Write('B');
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeKeyType = cwKeyType;
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
} //Display Second Screen
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//EX for Meters
|
||||||
|
|
||||||
|
//S-Meter Display
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
if (sdrModeOn == 1)
|
||||||
|
{
|
||||||
|
if (displaySDRON == 0) //once display
|
||||||
|
{
|
||||||
|
displaySDRON = 1;
|
||||||
|
LCD_SetCursor(0, 0);
|
||||||
|
LCD_Write('S');
|
||||||
|
LCD_Write('D');
|
||||||
|
LCD_Write('R');
|
||||||
|
LCD_Write(' ');
|
||||||
|
LCD_Write('M');
|
||||||
|
LCD_Write('O');
|
||||||
|
LCD_Write('D');
|
||||||
|
LCD_Write('E');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (((displayOption1 & 0x08) == 0x08) && (++checkCountSMeter > 3))
|
||||||
|
{
|
||||||
|
int newSMeter;
|
||||||
|
displaySDRON = 0;
|
||||||
|
|
||||||
|
#ifdef USE_I2CSMETER
|
||||||
|
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
|
||||||
|
#else
|
||||||
|
//VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
|
||||||
|
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
||||||
|
|
||||||
|
//Faster attack, Slower release
|
||||||
|
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10);
|
||||||
|
//currentSMeter = (currentSMeter * 3 + newSMeter * 7) / 10; //remarked becaused of have already Latency time
|
||||||
|
currentSMeter = newSMeter;
|
||||||
|
|
||||||
|
scaledSMeter = 0;
|
||||||
|
for (byte s = 8; s >= 1; s--) {
|
||||||
|
if (currentSMeter > sMeterLevels[s]) {
|
||||||
|
scaledSMeter = s;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DisplayMeter(0, scaledSMeter, 0);
|
||||||
|
checkCountSMeter = 0;
|
||||||
|
} //end of S-Meter
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//AutoKey LCD Display Routine
|
||||||
|
void Display_AutoKeyTextIndex(byte textIndex)
|
||||||
|
{
|
||||||
|
byte diplayAutoCWLine = 0;
|
||||||
|
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
diplayAutoCWLine = 1;
|
||||||
|
LCD_SetCursor(0, diplayAutoCWLine);
|
||||||
|
LCD_Write(byteToChar(textIndex));
|
||||||
|
LCD_Write(':');
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayCallsign(byte callSignLength)
|
||||||
|
{
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
printLineFromEEPRom(1, 16 - userCallsignLength, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayVersionInfo(const __FlashStringHelper * fwVersionInfo)
|
||||||
|
{
|
||||||
|
_Addr = I2C_LCD_SECOND_ADDRESS;
|
||||||
|
printLineF(1, fwVersionInfo);
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,552 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
KD8CEC, _______
|
|
||||||
uBITX Display Routine for LCD1602 I2C
|
|
||||||
|
|
||||||
1.Code for 16 x 2 LCD for I2C.
|
|
||||||
2.Display related functions of uBITX. Some functions moved from uBITX_Ui.
|
|
||||||
3.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/>.
|
|
||||||
|
|
||||||
**************************************************************************/
|
|
||||||
#ifdef UBITX_DISPLAY_LCD1602I
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
|
||||||
//Begin of LCD Hardware define
|
|
||||||
//========================================================================
|
|
||||||
#include <LiquidCrystal.h>
|
|
||||||
LiquidCrystal lcd(8,9,10,11,12,13);
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
|
||||||
//End of LCD Hardware define
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
//========================================================================
|
|
||||||
//Begin of Display Base Routines (Init, printLine..)
|
|
||||||
//========================================================================
|
|
||||||
char c[30], b[30];
|
|
||||||
char printBuff[2][17]; //mirrors what is showing on the two lines of the display
|
|
||||||
|
|
||||||
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] = {
|
|
||||||
0b01110,
|
|
||||||
0b10001,
|
|
||||||
0b10001,
|
|
||||||
0b11111,
|
|
||||||
0b11011,
|
|
||||||
0b11011,
|
|
||||||
0b11111,
|
|
||||||
0b00000};
|
|
||||||
PGM_P plock_bitmap = reinterpret_cast<PGM_P>(lock_bitmap);
|
|
||||||
|
|
||||||
|
|
||||||
// initializes the custom characters
|
|
||||||
// we start from char 1 as char 0 terminates the string!
|
|
||||||
void initMeter(){
|
|
||||||
uint8_t tmpbytes[8];
|
|
||||||
byte i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(plock_bitmap + i);
|
|
||||||
lcd.createChar(0, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i);
|
|
||||||
lcd.createChar(1, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 8);
|
|
||||||
lcd.createChar(2, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 16);
|
|
||||||
lcd.createChar(3, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 24);
|
|
||||||
lcd.createChar(4, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 32);
|
|
||||||
lcd.createChar(5, tmpbytes);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 40);
|
|
||||||
lcd.createChar(6, tmpbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LCD_Init(void)
|
|
||||||
{
|
|
||||||
lcd.begin(16, 2);
|
|
||||||
initMeter(); //for Meter Display
|
|
||||||
}
|
|
||||||
|
|
||||||
//by KD8CEC
|
|
||||||
//0 ~ 25 : 30 over : + 10
|
|
||||||
void drawMeter(int needle) {
|
|
||||||
//5Char + O over
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// The generic routine to display one line on the LCD
|
|
||||||
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
|
|
||||||
lcd.setCursor(0, linenmbr); // place the cursor at the beginning of the selected line
|
|
||||||
lcd.print(c);
|
|
||||||
strcpy(printBuff[linenmbr], c);
|
|
||||||
|
|
||||||
for (byte i = strlen(c); i < 16; i++) { // add white spaces until the end of the 16 characters line is reached
|
|
||||||
lcd.write(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void printLineF(char linenmbr, const __FlashStringHelper *c)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char tmpBuff[17];
|
|
||||||
PGM_P p = reinterpret_cast<PGM_P>(c);
|
|
||||||
|
|
||||||
for (i = 0; i < 17; i++){
|
|
||||||
unsigned char fChar = pgm_read_byte(p++);
|
|
||||||
tmpBuff[i] = fChar;
|
|
||||||
if (fChar == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
printLine(linenmbr, tmpBuff);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LCD_MAX_COLUMN 16
|
|
||||||
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetTtype) {
|
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
|
||||||
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
|
||||||
|
|
||||||
lcd.setCursor(lcdColumn, linenmbr);
|
|
||||||
|
|
||||||
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
|
||||||
{
|
|
||||||
if (++lcdColumn <= LCD_MAX_COLUMN)
|
|
||||||
lcd.write(EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i));
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (byte i = lcdColumn; i < 16; i++) //Right Padding by Space
|
|
||||||
lcd.write(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
// short cut to print to the first line
|
|
||||||
void printLine1(const char *c){
|
|
||||||
printLine(1,c);
|
|
||||||
}
|
|
||||||
// short cut to print to the first line
|
|
||||||
void printLine2(const char *c){
|
|
||||||
printLine(0,c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearLine2()
|
|
||||||
{
|
|
||||||
printLine2("");
|
|
||||||
line2DisplayStatus = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// short cut to print to the first line
|
|
||||||
void printLine1Clear(){
|
|
||||||
printLine(1,"");
|
|
||||||
}
|
|
||||||
// short cut to print to the first line
|
|
||||||
void printLine2Clear(){
|
|
||||||
printLine(0, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
void printLine2ClearAndUpdate(){
|
|
||||||
printLine(0, "");
|
|
||||||
line2DisplayStatus = 0;
|
|
||||||
updateDisplay();
|
|
||||||
}
|
|
||||||
//===================================================================================
|
|
||||||
//End of Display Base Routines
|
|
||||||
//===================================================================================
|
|
||||||
|
|
||||||
//===================================================================================
|
|
||||||
//Begin of User Interface Routines
|
|
||||||
//===================================================================================
|
|
||||||
|
|
||||||
// this builds up the top line of the display with frequency and mode
|
|
||||||
void updateDisplay() {
|
|
||||||
// tks Jack Purdum W8TEE
|
|
||||||
// replaced fsprint commmands by str commands for code size reduction
|
|
||||||
// replace code for Frequency numbering error (alignment, point...) by KD8CEC
|
|
||||||
int i;
|
|
||||||
unsigned long tmpFreq = frequency; //
|
|
||||||
|
|
||||||
memset(c, 0, sizeof(c));
|
|
||||||
|
|
||||||
if (inTx){
|
|
||||||
if (isCWAutoMode == 2) {
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
c[3-i] = (i < autoCWSendReservCount ? byteToChar(autoCWSendReserv[i]) : ' ');
|
|
||||||
|
|
||||||
//display Sending Index
|
|
||||||
c[4] = byteToChar(sendingCWTextIndex);
|
|
||||||
c[5] = '=';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (cwTimeout > 0)
|
|
||||||
strcpy(c, " CW:");
|
|
||||||
else
|
|
||||||
strcpy(c, " TX:");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (ritOn)
|
|
||||||
strcpy(c, "RIT ");
|
|
||||||
else {
|
|
||||||
if (cwMode == 0)
|
|
||||||
{
|
|
||||||
if (isUSB)
|
|
||||||
strcpy(c, "USB ");
|
|
||||||
else
|
|
||||||
strcpy(c, "LSB ");
|
|
||||||
}
|
|
||||||
else if (cwMode == 1)
|
|
||||||
{
|
|
||||||
strcpy(c, "CWL ");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy(c, "CWU ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (vfoActive == VFO_A) // VFO A is active
|
|
||||||
strcat(c, "A:");
|
|
||||||
else
|
|
||||||
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
|
|
||||||
for (int i = 15; i >= 6; i--) {
|
|
||||||
if (tmpFreq > 0) {
|
|
||||||
if (i == 12 || i == 8) c[i] = '.';
|
|
||||||
else {
|
|
||||||
c[i] = tmpFreq % 10 + 0x30;
|
|
||||||
tmpFreq /= 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
c[i] = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
//remarked by KD8CEC
|
|
||||||
//already RX/TX status display, and over index (16 x 2 LCD)
|
|
||||||
//if (inTx)
|
|
||||||
// strcat(c, " TX");
|
|
||||||
printLine(1, c);
|
|
||||||
|
|
||||||
byte diplayVFOLine = 1;
|
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
|
||||||
diplayVFOLine = 0;
|
|
||||||
|
|
||||||
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
|
||||||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
|
|
||||||
lcd.setCursor(5,diplayVFOLine);
|
|
||||||
lcd.write((uint8_t)0);
|
|
||||||
}
|
|
||||||
else if (isCWAutoMode == 2){
|
|
||||||
lcd.setCursor(5,diplayVFOLine);
|
|
||||||
lcd.write(0x7E);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lcd.setCursor(5,diplayVFOLine);
|
|
||||||
lcd.write(':');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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 displayType)
|
|
||||||
{
|
|
||||||
unsigned long tmpFreq = 0;
|
|
||||||
if (ritOn)
|
|
||||||
{
|
|
||||||
strcpy(line2Buffer, "RitTX:");
|
|
||||||
|
|
||||||
//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] = ' ';
|
|
||||||
|
|
||||||
if (isIFShift)
|
|
||||||
{
|
|
||||||
// if (isDirectCall == 1)
|
|
||||||
// for (int i = 0; i < 16; i++)
|
|
||||||
// line2Buffer[i] = ' ';
|
|
||||||
|
|
||||||
//IFShift Offset Value
|
|
||||||
line2Buffer[8] = 'I';
|
|
||||||
line2Buffer[9] = 'F';
|
|
||||||
|
|
||||||
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 & Key Type 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 == 0)
|
|
||||||
{
|
|
||||||
line2Buffer[11] = 'H';
|
|
||||||
line2Buffer[12] = 'z';
|
|
||||||
}
|
|
||||||
|
|
||||||
line2Buffer[13] = ' ';
|
|
||||||
|
|
||||||
//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;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Display_AutoKeyTextIndex(char textIndex)
|
|
||||||
{
|
|
||||||
byte diplayAutoCWLine = 0;
|
|
||||||
|
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
|
||||||
diplayAutoCWLine = 1;
|
|
||||||
lcd.setCursor(0, diplayAutoCWLine);
|
|
||||||
lcd.write(byteToChar(selectedCWTextIndex));
|
|
||||||
lcd.write(':');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
743
ubitx_20/ubitx_lcd_2004.ino
Normal file
743
ubitx_20/ubitx_lcd_2004.ino
Normal file
@ -0,0 +1,743 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
KD8CEC's uBITX Display Routine for LCD2004 Parrel & I2C
|
||||||
|
1.This is the display code for the 20x04 LCD
|
||||||
|
2.Some functions moved from uBITX_Ui.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
#include "ubitx.h"
|
||||||
|
#include "ubitx_lcd.h"
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
//Begin of TinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifdef UBITX_DISPLAY_LCD2004P
|
||||||
|
/*************************************************************************
|
||||||
|
LCD2004TINY Library for 20 x 4 LCD
|
||||||
|
Referecnce Source : LiquidCrystal.cpp
|
||||||
|
KD8CEC
|
||||||
|
|
||||||
|
This source code is modified version for small program memory
|
||||||
|
from Arduino LiquidCrystal Library
|
||||||
|
|
||||||
|
I wrote this code myself, so there is no license restriction.
|
||||||
|
So this code allows anyone to write with confidence.
|
||||||
|
But keep it as long as the original author of the code.
|
||||||
|
DE Ian KD8CEC
|
||||||
|
**************************************************************************/
|
||||||
|
#define LCD_Command(x) (LCD_Send(x, LOW))
|
||||||
|
#define LCD_Write(x) (LCD_Send(x, HIGH))
|
||||||
|
|
||||||
|
#define UBITX_DISPLAY_LCD2004_BASE
|
||||||
|
|
||||||
|
//Define connected PIN
|
||||||
|
#define LCD_PIN_RS 8
|
||||||
|
#define LCD_PIN_EN 9
|
||||||
|
uint8_t LCD_PIN_DAT[4] = {10, 11, 12, 13};
|
||||||
|
|
||||||
|
void write4bits(uint8_t value)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
digitalWrite(LCD_PIN_DAT[i], (value >> i) & 0x01);
|
||||||
|
|
||||||
|
digitalWrite(LCD_PIN_EN, LOW);
|
||||||
|
delayMicroseconds(1);
|
||||||
|
digitalWrite(LCD_PIN_EN, HIGH);
|
||||||
|
delayMicroseconds(1); // enable pulse must be >450ns
|
||||||
|
digitalWrite(LCD_PIN_EN, LOW);
|
||||||
|
delayMicroseconds(100); // commands need > 37us to settle
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_Send(uint8_t value, uint8_t mode)
|
||||||
|
{
|
||||||
|
digitalWrite(LCD_PIN_RS, mode);
|
||||||
|
write4bits(value>>4);
|
||||||
|
write4bits(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD2004_Init()
|
||||||
|
{
|
||||||
|
pinMode(LCD_PIN_RS, OUTPUT);
|
||||||
|
pinMode(LCD_PIN_EN, OUTPUT);
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
pinMode(LCD_PIN_DAT[i], OUTPUT);
|
||||||
|
|
||||||
|
delayMicroseconds(50);
|
||||||
|
|
||||||
|
// Now we pull both RS and R/W low to begin commands
|
||||||
|
digitalWrite(LCD_PIN_RS, LOW);
|
||||||
|
digitalWrite(LCD_PIN_EN, LOW);
|
||||||
|
|
||||||
|
// we start in 8bit mode, try to set 4 bit mode
|
||||||
|
write4bits(0x03);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// second try
|
||||||
|
write4bits(0x03);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// third go!
|
||||||
|
write4bits(0x03);
|
||||||
|
delayMicroseconds(150);
|
||||||
|
|
||||||
|
// finally, set to 4-bit interface
|
||||||
|
write4bits(0x02);
|
||||||
|
|
||||||
|
// finally, set # lines, font size, etc.
|
||||||
|
LCD_Command(LCD_FUNCTIONSET | LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_2LINE);
|
||||||
|
|
||||||
|
// turn the display on with no cursor or blinking default
|
||||||
|
LCD_Command(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
|
||||||
|
|
||||||
|
// clear it off
|
||||||
|
LCD_Command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||||
|
delayMicroseconds(2000); // this command takes a long time!
|
||||||
|
|
||||||
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//========================================================================
|
||||||
|
//End of TinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
//Begin of I2CTinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
#ifdef UBITX_DISPLAY_LCD2004I
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
/*************************************************************************
|
||||||
|
I2C Tiny LCD Library
|
||||||
|
Referecnce Source : LiquidCrystal_I2C.cpp // Based on the work by DFRobot
|
||||||
|
KD8CEC
|
||||||
|
|
||||||
|
This source code is modified version for small program memory
|
||||||
|
from Arduino LiquidCrystal_I2C Library
|
||||||
|
|
||||||
|
I wrote this code myself, so there is no license restriction.
|
||||||
|
So this code allows anyone to write with confidence.
|
||||||
|
But keep it as long as the original author of the code.
|
||||||
|
Ian KD8CEC
|
||||||
|
**************************************************************************/
|
||||||
|
#define UBITX_DISPLAY_LCD2004_BASE
|
||||||
|
|
||||||
|
#define En B00000100 // Enable bit
|
||||||
|
#define Rw B00000010 // Read/Write bit
|
||||||
|
#define Rs B00000001 // Register select bit
|
||||||
|
|
||||||
|
#define LCD_Command(x) (LCD_Send(x, 0))
|
||||||
|
#define LCD_Write(x) (LCD_Send(x, Rs))
|
||||||
|
|
||||||
|
uint8_t _Addr;
|
||||||
|
uint8_t _displayfunction;
|
||||||
|
uint8_t _displaycontrol;
|
||||||
|
uint8_t _displaymode;
|
||||||
|
uint8_t _numlines;
|
||||||
|
uint8_t _cols;
|
||||||
|
uint8_t _rows;
|
||||||
|
uint8_t _backlightval;
|
||||||
|
|
||||||
|
#define printIIC(args) Wire.write(args)
|
||||||
|
|
||||||
|
void expanderWrite(uint8_t _data)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(_Addr);
|
||||||
|
printIIC((int)(_data) | _backlightval);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void pulseEnable(uint8_t _data){
|
||||||
|
expanderWrite(_data | En); // En high
|
||||||
|
delayMicroseconds(1); // enable pulse must be >450ns
|
||||||
|
|
||||||
|
expanderWrite(_data & ~En); // En low
|
||||||
|
delayMicroseconds(50); // commands need > 37us to settle
|
||||||
|
}
|
||||||
|
|
||||||
|
void write4bits(uint8_t value)
|
||||||
|
{
|
||||||
|
expanderWrite(value);
|
||||||
|
pulseEnable(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_Send(uint8_t value, uint8_t mode)
|
||||||
|
{
|
||||||
|
uint8_t highnib=value&0xf0;
|
||||||
|
uint8_t lownib=(value<<4)&0xf0;
|
||||||
|
write4bits((highnib)|mode);
|
||||||
|
write4bits((lownib)|mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Turn the (optional) backlight off/on
|
||||||
|
void noBacklight(void) {
|
||||||
|
_backlightval=LCD_NOBACKLIGHT;
|
||||||
|
expanderWrite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlight(void) {
|
||||||
|
_backlightval=LCD_BACKLIGHT;
|
||||||
|
expanderWrite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD2004_Init()
|
||||||
|
{
|
||||||
|
//I2C Init
|
||||||
|
_Addr = I2C_LCD_MASTER_ADDRESS;
|
||||||
|
_cols = 20;
|
||||||
|
_rows = 4;
|
||||||
|
_backlightval = LCD_NOBACKLIGHT;
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
delay(50);
|
||||||
|
|
||||||
|
// Now we pull both RS and R/W low to begin commands
|
||||||
|
expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1)
|
||||||
|
delay(1000);
|
||||||
|
//put the LCD into 4 bit mode
|
||||||
|
// this is according to the hitachi HD44780 datasheet
|
||||||
|
// figure 24, pg 46
|
||||||
|
|
||||||
|
// we start in 8bit mode, try to set 4 bit mode
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// second try
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(4500); // wait min 4.1ms
|
||||||
|
|
||||||
|
// third go!
|
||||||
|
write4bits(0x03 << 4);
|
||||||
|
delayMicroseconds(150);
|
||||||
|
|
||||||
|
// finally, set to 4-bit interface
|
||||||
|
write4bits(0x02 << 4);
|
||||||
|
|
||||||
|
// finally, set # lines, font size, etc.
|
||||||
|
LCD_Command(LCD_FUNCTIONSET | LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_2LINE);
|
||||||
|
|
||||||
|
// turn the display on with no cursor or blinking default
|
||||||
|
LCD_Command(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
|
||||||
|
|
||||||
|
// clear it off
|
||||||
|
LCD_Command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||||
|
//delayMicroseconds(2000); // this command takes a long time!
|
||||||
|
delayMicroseconds(1000); // this command takes a long time!
|
||||||
|
|
||||||
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
|
|
||||||
|
backlight();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//========================================================================
|
||||||
|
//End of I2CTinyLCD Library by KD8CEC
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 20 X 04 LCD Routines
|
||||||
|
//Begin of Display Base Routines (Init, printLine..)
|
||||||
|
//========================================================================
|
||||||
|
#ifdef UBITX_DISPLAY_LCD2004_BASE
|
||||||
|
|
||||||
|
void LCD_Print(const char *c)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < strlen(c); i++)
|
||||||
|
{
|
||||||
|
if (*(c + i) == 0x00) return;
|
||||||
|
LCD_Write(*(c + i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
|
||||||
|
void LCD_SetCursor(uint8_t col, uint8_t row)
|
||||||
|
{
|
||||||
|
LCD_Command(LCD_SETDDRAMADDR | (col + row_offsets[row])); //0 : 0x00, 1 : 0x40, only for 20 x 4 lcd
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
||||||
|
{
|
||||||
|
location &= 0x7; // we only have 8 locations 0-7
|
||||||
|
LCD_Command(LCD_SETCGRAMADDR | (location << 3));
|
||||||
|
for (int i=0; i<8; i++)
|
||||||
|
LCD_Write(charmap[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//SWR GRAPH, DrawMeter and drawingMeter Logic function by VK2ETA
|
||||||
|
//#define OPTION_SKINNYBARS
|
||||||
|
|
||||||
|
char c[30], b[30];
|
||||||
|
char printBuff[4][21]; //mirrors what is showing on the two lines of the display
|
||||||
|
|
||||||
|
void LCD_Init(void)
|
||||||
|
{
|
||||||
|
LCD2004_Init();
|
||||||
|
initMeter(); //for Meter Display
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The generic routine to display one line on the LCD
|
||||||
|
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
|
||||||
|
LCD_SetCursor(0, linenmbr); // place the cursor at the beginning of the selected line
|
||||||
|
LCD_Print(c);
|
||||||
|
strcpy(printBuff[linenmbr], c);
|
||||||
|
|
||||||
|
for (byte i = strlen(c); i < 20; i++) { // add white spaces until the end of the 20 characters line is reached
|
||||||
|
LCD_Write(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printLineF(char linenmbr, const __FlashStringHelper *c)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char tmpBuff[21];
|
||||||
|
PGM_P p = reinterpret_cast<PGM_P>(c);
|
||||||
|
|
||||||
|
for (i = 0; i < 21; i++){
|
||||||
|
unsigned char fChar = pgm_read_byte(p++);
|
||||||
|
tmpBuff[i] = fChar;
|
||||||
|
if (fChar == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printLine(linenmbr, tmpBuff);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LCD_MAX_COLUMN 20
|
||||||
|
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetTtype) {
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
||||||
|
|
||||||
|
LCD_SetCursor(lcdColumn, linenmbr);
|
||||||
|
|
||||||
|
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||||||
|
{
|
||||||
|
if (++lcdColumn <= LCD_MAX_COLUMN)
|
||||||
|
LCD_Write(EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i));
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (byte i = lcdColumn; i < 20; i++) //Right Padding by Space
|
||||||
|
LCD_Write(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine1(const char *c)
|
||||||
|
{
|
||||||
|
printLine(1,c);
|
||||||
|
}
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine2(const char *c)
|
||||||
|
{
|
||||||
|
printLine(0,c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearLine2()
|
||||||
|
{
|
||||||
|
printLine2("");
|
||||||
|
line2DisplayStatus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine1Clear(){
|
||||||
|
printLine(1,"");
|
||||||
|
}
|
||||||
|
// short cut to print to the first line
|
||||||
|
void printLine2Clear(){
|
||||||
|
printLine(0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
void printLine2ClearAndUpdate(){
|
||||||
|
printLine(0, "");
|
||||||
|
line2DisplayStatus = 0;
|
||||||
|
updateDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
//==================================================================================
|
||||||
|
//End of Display Base Routines
|
||||||
|
//==================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//==================================================================================
|
||||||
|
//Begin of User Interface Routines
|
||||||
|
//==================================================================================
|
||||||
|
|
||||||
|
//Main Display
|
||||||
|
// this builds up the top line of the display with frequency and mode
|
||||||
|
void updateDisplay() {
|
||||||
|
// tks Jack Purdum W8TEE
|
||||||
|
// replaced fsprint commmands by str commands for code size reduction
|
||||||
|
// replace code for Frequency numbering error (alignment, point...) by KD8CEC
|
||||||
|
// i also Very TNX Purdum for good source code
|
||||||
|
int i;
|
||||||
|
unsigned long tmpFreq = frequency; //
|
||||||
|
|
||||||
|
memset(c, 0, sizeof(c));
|
||||||
|
|
||||||
|
if (inTx){
|
||||||
|
if (isCWAutoMode == 2) {
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
c[3-i] = (i < autoCWSendReservCount ? byteToChar(autoCWSendReserv[i]) : ' ');
|
||||||
|
|
||||||
|
//display Sending Index
|
||||||
|
c[4] = byteToChar(sendingCWTextIndex);
|
||||||
|
c[5] = '=';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (cwTimeout > 0)
|
||||||
|
strcpy(c, " CW:");
|
||||||
|
else
|
||||||
|
strcpy(c, " TX:");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (ritOn)
|
||||||
|
strcpy(c, "RIT ");
|
||||||
|
else {
|
||||||
|
if (cwMode == 0)
|
||||||
|
{
|
||||||
|
if (isUSB)
|
||||||
|
strcpy(c, "USB ");
|
||||||
|
else
|
||||||
|
strcpy(c, "LSB ");
|
||||||
|
}
|
||||||
|
else if (cwMode == 1)
|
||||||
|
{
|
||||||
|
strcpy(c, "CWL ");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(c, "CWU ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vfoActive == VFO_A) // VFO A is active
|
||||||
|
strcat(c, "A:");
|
||||||
|
else
|
||||||
|
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
|
||||||
|
for (int i = 15; i >= 6; i--) {
|
||||||
|
if (tmpFreq > 0) {
|
||||||
|
if (i == 12 || i == 8) c[i] = '.';
|
||||||
|
else {
|
||||||
|
c[i] = tmpFreq % 10 + 0x30;
|
||||||
|
tmpFreq /= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
c[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sdrModeOn)
|
||||||
|
strcat(c, " SDR");
|
||||||
|
else
|
||||||
|
strcat(c, " SPK");
|
||||||
|
|
||||||
|
//remarked by KD8CEC
|
||||||
|
//already RX/TX status display, and over index (20 x 4 LCD)
|
||||||
|
//if (inTx)
|
||||||
|
// strcat(c, " TX");
|
||||||
|
printLine(1, c);
|
||||||
|
|
||||||
|
byte diplayVFOLine = 1;
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
diplayVFOLine = 0;
|
||||||
|
|
||||||
|
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
||||||
|
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02))) {
|
||||||
|
LCD_SetCursor(5,diplayVFOLine);
|
||||||
|
LCD_Write((uint8_t)0);
|
||||||
|
}
|
||||||
|
else if (isCWAutoMode == 2){
|
||||||
|
LCD_SetCursor(5,diplayVFOLine);
|
||||||
|
LCD_Write(0x7E);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LCD_SetCursor(5,diplayVFOLine);
|
||||||
|
LCD_Write(':');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char line2Buffer[20];
|
||||||
|
//KD8CEC 200Hz ST
|
||||||
|
//L14.150 200Hz ST
|
||||||
|
//U14.150 +150khz
|
||||||
|
int freqScrollPosition = 0;
|
||||||
|
|
||||||
|
//Example Line2 Optinal Display
|
||||||
|
//immediate execution, not call by scheulder
|
||||||
|
//warning : unused parameter 'displayType' <-- ignore, this is reserve
|
||||||
|
void updateLine2Buffer(char displayType)
|
||||||
|
{
|
||||||
|
unsigned long tmpFreq = 0;
|
||||||
|
if (ritOn)
|
||||||
|
{
|
||||||
|
strcpy(line2Buffer, "RitTX:");
|
||||||
|
|
||||||
|
//display frequency
|
||||||
|
tmpFreq = ritTxFrequency;
|
||||||
|
|
||||||
|
//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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&line2Buffer[10], ' ', 10);
|
||||||
|
|
||||||
|
if (isIFShift)
|
||||||
|
{
|
||||||
|
line2Buffer[6] = 'M';
|
||||||
|
line2Buffer[7] = ' ';
|
||||||
|
//IFShift Offset Value
|
||||||
|
line2Buffer[8] = 'I';
|
||||||
|
line2Buffer[9] = 'F';
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
for (int i = 12; i < 17; i++)
|
||||||
|
{
|
||||||
|
if (line2Buffer[i] == 0)
|
||||||
|
line2Buffer[i] = ' ';
|
||||||
|
}
|
||||||
|
} // end of display IF
|
||||||
|
else // step & Key Type display
|
||||||
|
{
|
||||||
|
//Step
|
||||||
|
long tmpStep = arTuneStep[tuneStepIndex -1];
|
||||||
|
|
||||||
|
byte isStepKhz = 0;
|
||||||
|
if (tmpStep >= 1000)
|
||||||
|
{
|
||||||
|
isStepKhz = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 14; i >= 12 - isStepKhz; i--) {
|
||||||
|
if (tmpStep > 0) {
|
||||||
|
line2Buffer[i + isStepKhz] = tmpStep % 10 + 0x30;
|
||||||
|
tmpStep /= 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line2Buffer[i +isStepKhz] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isStepKhz == 0)
|
||||||
|
{
|
||||||
|
line2Buffer[15] = 'H';
|
||||||
|
line2Buffer[16] = 'z';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
line2Buffer[17] = ' ';
|
||||||
|
|
||||||
|
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||||||
|
if (cwKeyType == 0)
|
||||||
|
{
|
||||||
|
line2Buffer[18] = 'S';
|
||||||
|
line2Buffer[19] = 'T';
|
||||||
|
}
|
||||||
|
else if (cwKeyType == 1)
|
||||||
|
{
|
||||||
|
line2Buffer[18] = 'I';
|
||||||
|
line2Buffer[19] = 'A';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line2Buffer[18] = 'I';
|
||||||
|
line2Buffer[19] = '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);
|
||||||
|
|
||||||
|
LCD_SetCursor(drawPosition, 2);
|
||||||
|
LCD_Write('S');
|
||||||
|
LCD_Write(':');
|
||||||
|
for (int i = 0; i < 7; i++) //meter 5 + +db 1 = 6
|
||||||
|
LCD_Write(lcdMeter[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char checkCount = 0;
|
||||||
|
char checkCountSMeter = 0;
|
||||||
|
|
||||||
|
//execute interval : 0.25sec
|
||||||
|
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++, 0);
|
||||||
|
if (testValue > 30)
|
||||||
|
testValue = 0;
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Sample
|
||||||
|
//DisplayMeter(0, analogRead(ANALOG_SMETER) / 30, 0);
|
||||||
|
//DisplayMeter(0, analogRead(ANALOG_SMETER) / 10, 0);
|
||||||
|
//delay_background(10, 0);
|
||||||
|
//DisplayMeter(0, analogRead(ANALOG_SMETER), 0);
|
||||||
|
//if (testValue > 30)
|
||||||
|
// testValue = 0;
|
||||||
|
|
||||||
|
//S-Meter Display
|
||||||
|
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
||||||
|
{
|
||||||
|
int newSMeter;
|
||||||
|
|
||||||
|
#ifdef USE_I2CSMETER
|
||||||
|
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
|
||||||
|
#else
|
||||||
|
//VK2ETA S-Meter from MAX9814 TC pin
|
||||||
|
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
||||||
|
|
||||||
|
//Faster attack, Slower release
|
||||||
|
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10);
|
||||||
|
//currentSMeter = ((currentSMeter * 7 + newSMeter * 3) + 5) / 10;
|
||||||
|
currentSMeter = newSMeter;
|
||||||
|
|
||||||
|
scaledSMeter = 0;
|
||||||
|
for (byte s = 8; s >= 1; s--) {
|
||||||
|
if (currentSMeter > sMeterLevels[s]) {
|
||||||
|
scaledSMeter = s;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DisplayMeter(0, scaledSMeter, 0);
|
||||||
|
checkCountSMeter = 0; //Reset Latency time
|
||||||
|
} //end of S-Meter
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//AutoKey LCD Display Routine
|
||||||
|
void Display_AutoKeyTextIndex(byte textIndex)
|
||||||
|
{
|
||||||
|
byte diplayAutoCWLine = 0;
|
||||||
|
|
||||||
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
diplayAutoCWLine = 1;
|
||||||
|
LCD_SetCursor(0, diplayAutoCWLine);
|
||||||
|
LCD_Write(byteToChar(textIndex));
|
||||||
|
LCD_Write(':');
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayCallsign(byte callSignLength)
|
||||||
|
{
|
||||||
|
printLineFromEEPRom(3, 20 - userCallsignLength, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayVersionInfo(const __FlashStringHelper * fwVersionInfo)
|
||||||
|
{
|
||||||
|
printLineF(3, fwVersionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,22 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
KD8CEC's uBITX Display Routine for LCD2404 I2C
|
|
||||||
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/>.
|
|
||||||
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
KD8CEC's uBITX Display Routine for LCD2404 Parrel
|
|
||||||
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/>.
|
|
||||||
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
|
|
1107
ubitx_20/ubitx_lcd_nextion.ino
Normal file
1107
ubitx_20/ubitx_lcd_nextion.ino
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,11 +2,11 @@
|
|||||||
This source code started with Farhan's original source. The license rules are followed as well.
|
This source code started with Farhan's original source. The license rules are followed as well.
|
||||||
Calibration related functions kept the original source except for the minor ones.
|
Calibration related functions kept the original source except for the minor ones.
|
||||||
The part is collected in the last minute of this source.
|
The part is collected in the last minute of this source.
|
||||||
|
|
||||||
Ian KD8CEC
|
Ian KD8CEC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ubitx.h"
|
#include "ubitx.h"
|
||||||
|
#include "ubitx_eemap.h"
|
||||||
|
|
||||||
//Current Frequency and mode to active VFO by KD8CEC
|
//Current Frequency and mode to active VFO by KD8CEC
|
||||||
void FrequencyToVFO(byte isSaveFreq)
|
void FrequencyToVFO(byte isSaveFreq)
|
||||||
@ -59,12 +59,10 @@ void menuBand(int btn){
|
|||||||
btnPressCount = 0;
|
btnPressCount = 0;
|
||||||
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
|
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
|
||||||
tuneTXType = 0;
|
tuneTXType = 0;
|
||||||
//printLineF2(F("General mode"));
|
|
||||||
printLineF2(F("General"));
|
printLineF2(F("General"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tuneTXType = 2;
|
tuneTXType = 2;
|
||||||
//printLineF2(F("Ham band mode"));
|
|
||||||
printLineF2(F("Ham band"));
|
printLineF2(F("Ham band"));
|
||||||
}
|
}
|
||||||
delay_background(1000, 0);
|
delay_background(1000, 0);
|
||||||
@ -273,8 +271,10 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
|||||||
if (isMemoryToVfo == 1)
|
if (isMemoryToVfo == 1)
|
||||||
{
|
{
|
||||||
if (resultFreq > 3000 && resultFreq < 60000000)
|
if (resultFreq > 3000 && resultFreq < 60000000)
|
||||||
setFrequency(resultFreq);
|
{
|
||||||
byteToMode(loadMode, 1);
|
byteToMode(loadMode, 1);
|
||||||
|
setFrequency(resultFreq);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -389,7 +389,14 @@ void menuVfoToggle(int btn)
|
|||||||
|
|
||||||
ritDisable();
|
ritDisable();
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,18 +412,21 @@ void menuSplitOnOff(int btn){
|
|||||||
else {
|
else {
|
||||||
if (splitOn == 1){
|
if (splitOn == 1){
|
||||||
splitOn = 0;
|
splitOn = 0;
|
||||||
//printLineF2(F("Split Off!"));
|
printLineF2(F("SPT Off"));
|
||||||
printLineF2(F("[OFF]"));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
splitOn = 1;
|
splitOn = 1;
|
||||||
if (ritOn == 1)
|
if (ritOn == 1)
|
||||||
ritOn = 0;
|
ritOn = 0;
|
||||||
//printLineF2(F("Split On!"));
|
printLineF2(F("SPT On"));
|
||||||
printLineF2(F("[ON]"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,14 +442,19 @@ void menuTxOnOff(int btn, byte optionType){
|
|||||||
else {
|
else {
|
||||||
if ((isTxType & optionType) == 0){
|
if ((isTxType & optionType) == 0){
|
||||||
isTxType |= optionType;
|
isTxType |= optionType;
|
||||||
printLineF2(F("TX OFF!"));
|
printLineF2(F("TX OFF"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
isTxType &= ~(optionType);
|
isTxType &= ~(optionType);
|
||||||
printLineF2(F("TX ON!"));
|
printLineF2(F("TX ON"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,7 +470,7 @@ void menuSDROnOff(int btn)
|
|||||||
else {
|
else {
|
||||||
if (sdrModeOn == 1){
|
if (sdrModeOn == 1){
|
||||||
sdrModeOn = 0;
|
sdrModeOn = 0;
|
||||||
printLineF2(F("[OFF]"));
|
printLineF2(F("SPK MODE"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sdrModeOn = 1;
|
sdrModeOn = 1;
|
||||||
@ -466,12 +481,19 @@ void menuSDROnOff(int btn)
|
|||||||
if (splitOn == 1)
|
if (splitOn == 1)
|
||||||
splitOn = 0;
|
splitOn = 0;
|
||||||
|
|
||||||
printLineF2(F("[ON]"));
|
printLineF2(F("SDR MODE"));
|
||||||
}
|
}
|
||||||
|
|
||||||
EEPROM.put(ENABLE_SDR, sdrModeOn);
|
EEPROM.put(ENABLE_SDR, sdrModeOn);
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
SetCarrierFreq();
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,9 +519,9 @@ void menuCWAutoKey(int btn){
|
|||||||
|
|
||||||
printLineF1(F("PTT to Send"));
|
printLineF1(F("PTT to Send"));
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
updateDisplay();
|
|
||||||
beforeCWTextIndex = 255; //255 value is for start check
|
beforeCWTextIndex = 255; //255 value is for start check
|
||||||
isCWAutoMode = 1;
|
isCWAutoMode = 1;
|
||||||
|
updateDisplay();
|
||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -589,7 +611,6 @@ int getValueByKnob(int valueType, int targetValue, int minKnobValue, int maxKnob
|
|||||||
{
|
{
|
||||||
int knob;
|
int knob;
|
||||||
int moveDetectStep = 0;
|
int moveDetectStep = 0;
|
||||||
int negativeSensitivity;
|
|
||||||
char isInitDisplay = 1;
|
char isInitDisplay = 1;
|
||||||
delay_background(300, 0); //Default Delay
|
delay_background(300, 0); //Default Delay
|
||||||
|
|
||||||
@ -667,6 +688,10 @@ int getValueByKnob(int valueType, int targetValue, int minKnobValue, int maxKnob
|
|||||||
else
|
else
|
||||||
attLevel = targetValue;
|
attLevel = targetValue;
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn=2;
|
||||||
|
updateDisplay();
|
||||||
|
#endif
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
SetCarrierFreq();
|
SetCarrierFreq();
|
||||||
}
|
}
|
||||||
@ -679,7 +704,6 @@ int getValueByKnob(int valueType, int targetValue, int minKnobValue, int maxKnob
|
|||||||
}
|
}
|
||||||
|
|
||||||
void menuCWSpeed(int btn){
|
void menuCWSpeed(int btn){
|
||||||
int knob = 0;
|
|
||||||
int wpm;
|
int wpm;
|
||||||
|
|
||||||
wpm = 1200/cwSpeed;
|
wpm = 1200/cwSpeed;
|
||||||
@ -727,20 +751,26 @@ void menuCWSpeed(int btn){
|
|||||||
//printLineF2(F("CW Speed set!"));
|
//printLineF2(F("CW Speed set!"));
|
||||||
cwSpeed = 1200 / wpm;
|
cwSpeed = 1200 / wpm;
|
||||||
EEPROM.put(CW_SPEED, cwSpeed);
|
EEPROM.put(CW_SPEED, cwSpeed);
|
||||||
|
//menuClearExit(1000);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Modified by KD8CEC
|
//Modified by KD8CEC
|
||||||
void menuSetupCwTone(int btn){
|
void menuSetupCwTone(int btn){
|
||||||
int knob = 0;
|
//int prev_sideTone;
|
||||||
int prev_sideTone;
|
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
printLineF2(F("Change CW Tone"));
|
printLineF2(F("Change CW Tone"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_sideTone = sideTone;
|
//prev_sideTone = sideTone;
|
||||||
//printLineF1(F("Tune CW tone"));
|
//printLineF1(F("Tune CW tone"));
|
||||||
//printLineF2(F("PTT to confirm."));
|
//printLineF2(F("PTT to confirm."));
|
||||||
//printLineF1(F("Press to set WPM"));
|
//printLineF1(F("Press to set WPM"));
|
||||||
@ -749,47 +779,25 @@ void menuSetupCwTone(int btn){
|
|||||||
|
|
||||||
sideTone = getValueByKnob(1, sideTone, 100, 2000, 10, "Tone", 2); //1 : Generate Tone, targetValue, minKnobValue, maxKnobValue, stepSize
|
sideTone = getValueByKnob(1, sideTone, 100, 2000, 10, "Tone", 2); //1 : Generate Tone, targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
|
|
||||||
/*
|
|
||||||
//disable all clock 1 and clock 2
|
|
||||||
while (digitalRead(PTT) == HIGH && !btnDown())
|
|
||||||
{
|
|
||||||
knob = enc_read();
|
|
||||||
|
|
||||||
if (knob > 0 && sideTone < 2000)
|
|
||||||
sideTone += 10;
|
|
||||||
else if (knob < 0 && sideTone > 100 )
|
|
||||||
sideTone -= 10;
|
|
||||||
else
|
|
||||||
continue; //don't update the frequency or the display
|
|
||||||
|
|
||||||
tone(CW_TONE, sideTone);
|
|
||||||
itoa(sideTone, b, 10);
|
|
||||||
printLine2(b);
|
|
||||||
|
|
||||||
delay_background(100, 0);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
noTone(CW_TONE);
|
noTone(CW_TONE);
|
||||||
|
|
||||||
//save the setting
|
|
||||||
//if (digitalRead(PTT) == LOW){
|
|
||||||
printLineF2(F("Sidetone set!"));
|
printLineF2(F("Sidetone set!"));
|
||||||
EEPROM.put(CW_SIDETONE, sideTone);
|
EEPROM.put(CW_SIDETONE, sideTone);
|
||||||
|
|
||||||
|
//delay_background(2000, 0);
|
||||||
|
//menuClearExit(0);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
delay_background(2000, 0);
|
delay_background(2000, 0);
|
||||||
//}
|
|
||||||
//else
|
|
||||||
// sideTone = prev_sideTone;
|
|
||||||
|
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Modified by KD8CEC
|
//Modified by KD8CEC
|
||||||
void menuSetupCwDelay(int btn){
|
void menuSetupCwDelay(int btn){
|
||||||
int knob = 0;
|
//int knob = 0;
|
||||||
int tmpCWDelay = cwDelayTime * 10;
|
int tmpCWDelay = cwDelayTime * 10;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
@ -797,50 +805,24 @@ void menuSetupCwDelay(int btn){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//printLineF1(F("Press, set Delay"));
|
|
||||||
/*
|
|
||||||
strcpy(b, "DELAY:");
|
|
||||||
itoa(tmpCWDelay,c, 10);
|
|
||||||
strcat(b, c);
|
|
||||||
printLine2(b);
|
|
||||||
*/
|
|
||||||
//delay_background(300, 0);
|
|
||||||
|
|
||||||
tmpCWDelay = getValueByKnob(0, tmpCWDelay, 3, 2500, 10, "Delay", 2); //0 : Generate Tone, targetValue, minKnobValue, maxKnobValue, stepSize
|
tmpCWDelay = getValueByKnob(0, tmpCWDelay, 3, 2500, 10, "Delay", 2); //0 : Generate Tone, targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
|
|
||||||
/*
|
|
||||||
while(!btnDown()){
|
|
||||||
knob = enc_read();
|
|
||||||
if (knob != 0){
|
|
||||||
if (tmpCWDelay > 3 && knob < 0)
|
|
||||||
tmpCWDelay -= 10;
|
|
||||||
if (tmpCWDelay < 2500 && knob > 0)
|
|
||||||
tmpCWDelay += 10;
|
|
||||||
|
|
||||||
strcpy(b, "DELAY:");
|
|
||||||
itoa(tmpCWDelay,c, 10);
|
|
||||||
strcat(b, c);
|
|
||||||
printLine2(b);
|
|
||||||
}
|
|
||||||
//abort if this button is down
|
|
||||||
if (btnDown())
|
|
||||||
break;
|
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
//printLineF2(F("CW Delay set!"));
|
|
||||||
cwDelayTime = tmpCWDelay / 10;
|
cwDelayTime = tmpCWDelay / 10;
|
||||||
EEPROM.put(CW_DELAY, cwDelayTime);
|
EEPROM.put(CW_DELAY, cwDelayTime);
|
||||||
|
//menuClearExit(1000);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//CW Time delay by KD8CEC
|
//CW Time delay by KD8CEC
|
||||||
void menuSetupTXCWInterval(int btn){
|
void menuSetupTXCWInterval(int btn){
|
||||||
char needDisplayInformation = 1;
|
//char needDisplayInformation = 1;
|
||||||
int knob = 0;
|
//int knob = 0;
|
||||||
int tmpTXCWInterval = delayBeforeCWStartTime * 2;
|
int tmpTXCWInterval = delayBeforeCWStartTime * 2;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
@ -853,47 +835,23 @@ void menuSetupTXCWInterval(int btn){
|
|||||||
|
|
||||||
tmpTXCWInterval = getValueByKnob(0, tmpTXCWInterval, 0, 500, 2, "Delay", 2); //0 : Generate Tone, targetValue, minKnobValue, maxKnobValue, stepSize
|
tmpTXCWInterval = getValueByKnob(0, tmpTXCWInterval, 0, 500, 2, "Delay", 2); //0 : Generate Tone, targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
|
|
||||||
/*
|
|
||||||
while(!btnDown()){
|
|
||||||
|
|
||||||
if (needDisplayInformation == 1) {
|
|
||||||
strcpy(b, "Start Delay:");
|
|
||||||
itoa(tmpTXCWInterval,c, 10);
|
|
||||||
strcat(b, c);
|
|
||||||
printLine2(b);
|
|
||||||
needDisplayInformation = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
knob = enc_read();
|
|
||||||
if (knob != 0){
|
|
||||||
if (tmpTXCWInterval > 0 && knob < 0)
|
|
||||||
tmpTXCWInterval -= 2;
|
|
||||||
if (tmpTXCWInterval < 500 && knob > 0)
|
|
||||||
tmpTXCWInterval += 2;
|
|
||||||
|
|
||||||
needDisplayInformation = 1;
|
|
||||||
}
|
|
||||||
//abort if this button is down
|
|
||||||
//if (btnDown())
|
|
||||||
// break;
|
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
//save the setting
|
|
||||||
//printLineF2(F("CW Start set!"));
|
|
||||||
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
||||||
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
||||||
|
//menuClearExit(1000);
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//IF Shift function, BFO Change like RIT, by KD8CEC
|
//IF Shift function, BFO Change like RIT, by KD8CEC
|
||||||
void menuIFSSetup(int btn){
|
void menuIFSSetup(int btn){
|
||||||
int knob = 0;
|
//int knob = 0;
|
||||||
char needApplyChangeValue = 1;
|
//char needApplyChangeValue = 1;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
if (isIFShift == 1)
|
if (isIFShift == 1)
|
||||||
@ -905,36 +863,7 @@ void menuIFSSetup(int btn){
|
|||||||
{
|
{
|
||||||
isIFShift = 1;
|
isIFShift = 1;
|
||||||
|
|
||||||
//delay_background(500, 0);
|
|
||||||
//updateLine2Buffer(1);
|
|
||||||
//setFrequency(frequency);
|
|
||||||
|
|
||||||
ifShiftValue = getValueByKnob(2, ifShiftValue, -20000, 20000, 50, "IFS", 2); //2 : IF Setup (updateLine2Buffer(1), SetFrequency), targetValue, minKnobValue, maxKnobValue, stepSize
|
ifShiftValue = getValueByKnob(2, ifShiftValue, -20000, 20000, 50, "IFS", 2); //2 : IF Setup (updateLine2Buffer(1), SetFrequency), targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
|
|
||||||
/*
|
|
||||||
//Off or Change Value
|
|
||||||
while(!btnDown() ){
|
|
||||||
if (needApplyChangeValue ==1)
|
|
||||||
{
|
|
||||||
updateLine2Buffer(1);
|
|
||||||
setFrequency(frequency);
|
|
||||||
SetCarrierFreq();
|
|
||||||
needApplyChangeValue = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
knob = enc_read();
|
|
||||||
if (knob != 0){
|
|
||||||
if (knob < 0)
|
|
||||||
ifShiftValue -= 50;
|
|
||||||
else if (knob > 0)
|
|
||||||
ifShiftValue += 50;
|
|
||||||
|
|
||||||
needApplyChangeValue = 1;
|
|
||||||
}
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
delay_background(500, 0); //for check Long Press function key
|
delay_background(500, 0); //for check Long Press function key
|
||||||
|
|
||||||
if (btnDown() || ifShiftValue == 0)
|
if (btnDown() || ifShiftValue == 0)
|
||||||
@ -947,14 +876,20 @@ void menuIFSSetup(int btn){
|
|||||||
|
|
||||||
//Store IF Shiift
|
//Store IF Shiift
|
||||||
EEPROM.put(IF_SHIFTVALUE, ifShiftValue);
|
EEPROM.put(IF_SHIFTVALUE, ifShiftValue);
|
||||||
|
//menuClearExit(0);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//ATT SETUP (IF1(45MHZ) SHIFT), by KD8CEC
|
//ATT SETUP (IF1(45MHZ) SHIFT), by KD8CEC
|
||||||
void menuATTSetup(int btn){
|
void menuATTSetup(int btn){
|
||||||
int knob = 0;
|
//int knob = 0;
|
||||||
char needApplyChangeValue = 1;
|
//char needApplyChangeValue = 1;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
if (attLevel != 0)
|
if (attLevel != 0)
|
||||||
@ -973,16 +908,24 @@ void menuATTSetup(int btn){
|
|||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
//SetCarrierFreq();
|
//SetCarrierFreq();
|
||||||
}
|
}
|
||||||
|
//menuClearExit(0);
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Functions for CWL and CWU by KD8CEC
|
//Functions for CWL and CWU by KD8CEC
|
||||||
void menuSelectMode(int btn){
|
void menuSelectMode(int btn){
|
||||||
int knob = 0;
|
//int knob = 0;
|
||||||
int selectModeType = 0;
|
int selectModeType = 0;
|
||||||
int beforeMode = 0;
|
int beforeMode = 0;
|
||||||
int moveStep = 0;
|
//int moveStep = 0;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
printLineF2(F("Select Mode?"));
|
printLineF2(F("Select Mode?"));
|
||||||
@ -1000,44 +943,10 @@ void menuSelectMode(int btn){
|
|||||||
selectModeType = 3;
|
selectModeType = 3;
|
||||||
|
|
||||||
beforeMode = selectModeType;
|
beforeMode = selectModeType;
|
||||||
|
|
||||||
//delay_background(500, 0);
|
|
||||||
|
|
||||||
selectModeType = getValueByKnob(11, selectModeType, 0, 3, 1, " LSB USB CWL CWU", 4); //3 : Select Mode, targetValue, minKnobValue, maxKnobValue, stepSize
|
selectModeType = getValueByKnob(11, selectModeType, 0, 3, 1, " LSB USB CWL CWU", 4); //3 : Select Mode, targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
|
|
||||||
/*
|
if (beforeMode != selectModeType)
|
||||||
while(!btnDown()){
|
|
||||||
//Display Mode Name
|
|
||||||
memset(c, 0, sizeof(c));
|
|
||||||
strcpy(c, " LSB USB CWL CWU");
|
|
||||||
c[selectModeType * 4] = '>';
|
|
||||||
printLine1(c);
|
|
||||||
|
|
||||||
knob = enc_read();
|
|
||||||
|
|
||||||
if (knob != 0)
|
|
||||||
{
|
{
|
||||||
moveStep += (knob > 0 ? 1 : -1);
|
|
||||||
if (moveStep < -3) {
|
|
||||||
if (selectModeType > 0)
|
|
||||||
selectModeType--;
|
|
||||||
|
|
||||||
moveStep = 0;
|
|
||||||
}
|
|
||||||
else if (moveStep > 3) {
|
|
||||||
if (selectModeType < 3)
|
|
||||||
selectModeType++;
|
|
||||||
|
|
||||||
moveStep = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check_Cat(0); //To prevent disconnections
|
|
||||||
delay_background(50, 0);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (beforeMode != selectModeType) {
|
|
||||||
//printLineF1(F("Changed Mode"));
|
//printLineF1(F("Changed Mode"));
|
||||||
if (selectModeType == 0) {
|
if (selectModeType == 0) {
|
||||||
cwMode = 0; isUSB = 0;
|
cwMode = 0; isUSB = 0;
|
||||||
@ -1056,61 +965,31 @@ void menuSelectMode(int btn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetCarrierFreq();
|
SetCarrierFreq();
|
||||||
|
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
//menuClearExit(500);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Select CW Key Type by KD8CEC
|
//Select CW Key Type by KD8CEC
|
||||||
void menuSetupKeyType(int btn){
|
void menuSetupKeyType(int btn){
|
||||||
int knob = 0;
|
//int knob = 0;
|
||||||
int selectedKeyType = 0;
|
int selectedKeyType = 0;
|
||||||
int moveStep = 0;
|
//int moveStep = 0;
|
||||||
if (!btn){
|
if (!btn){
|
||||||
printLineF2(F("Change Key Type?"));
|
printLineF2(F("Change Key Type?"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//printLineF2(F("Press to set Key")); //for reduce usable flash memory
|
|
||||||
//delay_background(500, 0);
|
|
||||||
selectedKeyType = cwKeyType;
|
selectedKeyType = cwKeyType;
|
||||||
|
|
||||||
//selectedKeyType = getValueByKnob(12, selectedKeyType, 0, 2, 1, " KEY:", 5); //4 : Select Key Type, targetValue, minKnobValue, maxKnobValue, stepSize
|
//selectedKeyType = getValueByKnob(12, selectedKeyType, 0, 2, 1, " KEY:", 5); //4 : Select Key Type, targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
selectedKeyType = getValueByKnob(11, selectedKeyType, 0, 2, 1, " ST IA IB", 5); //4 : Select Key Type, targetValue, minKnobValue, maxKnobValue, stepSize
|
selectedKeyType = getValueByKnob(11, selectedKeyType, 0, 2, 1, " ST IA IB", 5); //4 : Select Key Type, targetValue, minKnobValue, maxKnobValue, stepSize
|
||||||
|
|
||||||
/*
|
|
||||||
while(!btnDown()){
|
|
||||||
|
|
||||||
//Display Key Type
|
|
||||||
if (selectedKeyType == 0)
|
|
||||||
printLineF1(F("Straight"));
|
|
||||||
else if (selectedKeyType == 1)
|
|
||||||
printLineF1(F("IAMBICA"));
|
|
||||||
else if (selectedKeyType == 2)
|
|
||||||
printLineF1(F("IAMBICB"));
|
|
||||||
|
|
||||||
knob = enc_read();
|
|
||||||
|
|
||||||
if (knob != 0)
|
|
||||||
{
|
|
||||||
moveStep += (knob > 0 ? 1 : -1);
|
|
||||||
if (moveStep < -3) {
|
|
||||||
if (selectedKeyType > 0)
|
|
||||||
selectedKeyType--;
|
|
||||||
moveStep = 0;
|
|
||||||
}
|
|
||||||
else if (moveStep > 3) {
|
|
||||||
if (selectedKeyType < 2)
|
|
||||||
selectedKeyType++;
|
|
||||||
moveStep = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
printLineF2(F("CW Key Type set!"));
|
printLineF2(F("CW Key Type set!"));
|
||||||
cwKeyType = selectedKeyType;
|
cwKeyType = selectedKeyType;
|
||||||
EEPROM.put(CW_KEY_TYPE, cwKeyType);
|
EEPROM.put(CW_KEY_TYPE, cwKeyType);
|
||||||
@ -1126,12 +1005,19 @@ void menuSetupKeyType(int btn){
|
|||||||
keyerControl |= IAMBICB;
|
keyerControl |= IAMBICB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//menuClearExit(1000);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================
|
//=====================================================
|
||||||
//END OF STANDARD Tune Setup for reduce Program Memory
|
//END OF STANDARD Set by Knob for reduce Program Memory
|
||||||
//=====================================================
|
//=====================================================
|
||||||
|
|
||||||
|
|
||||||
@ -1226,7 +1112,191 @@ void doMenu(){
|
|||||||
|
|
||||||
//Below codes are origial code with modified by KD8CEC
|
//Below codes are origial code with modified by KD8CEC
|
||||||
menuOn = 2;
|
menuOn = 2;
|
||||||
|
TriggerBySW = 0; //Nextion LCD and Other MCU
|
||||||
|
|
||||||
|
//*********************************************************************************
|
||||||
|
// New type menu for developer by KD8CEC
|
||||||
|
// Selectable menu
|
||||||
|
// Version : 1.097 ~
|
||||||
|
//*********************************************************************************
|
||||||
|
#ifndef ENABLE_ADCMONITOR
|
||||||
|
#define FN_ADCMONITOR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FN_DEFAULT_MENU 2 //Setup Onff / Exit
|
||||||
|
#define FN_DEFAULT_SETUP 1 //Exit
|
||||||
|
|
||||||
|
#define FN_BAND_IDX (FN_BAND -1) //0 or -1
|
||||||
|
#define FN_VFO_TOGGLE_IDX (FN_BAND_IDX + FN_VFO_TOGGLE)
|
||||||
|
#define FN_MODE_IDX (FN_VFO_TOGGLE_IDX + FN_MODE)
|
||||||
|
#define FN_RIT_IDX (FN_MODE_IDX + FN_RIT)
|
||||||
|
#define FN_IFSHIFT_IDX (FN_RIT_IDX + FN_IFSHIFT)
|
||||||
|
#define FN_ATT_IDX (FN_IFSHIFT_IDX + FN_ATT)
|
||||||
|
#define FN_CW_SPEED_IDX (FN_ATT_IDX + FN_CW_SPEED)
|
||||||
|
#define FN_SPLIT_IDX (FN_CW_SPEED_IDX + FN_SPLIT)
|
||||||
|
#define FN_VFOTOMEM_IDX (FN_SPLIT_IDX + FN_VFOTOMEM)
|
||||||
|
#define FN_MEMTOVFO_IDX (FN_VFOTOMEM_IDX + FN_MEMTOVFO)
|
||||||
|
#define FN_MEMORYKEYER_IDX (FN_MEMTOVFO_IDX + FN_MEMORYKEYER)
|
||||||
|
#define FN_WSPR_IDX (FN_MEMORYKEYER_IDX + FN_WSPR)
|
||||||
|
#define FN_SDRMODE_IDX (FN_WSPR_IDX + FN_SDRMODE)
|
||||||
|
#define FN_SETUP_IDX (FN_SDRMODE_IDX + 1)
|
||||||
|
#define FN_EXIT_IDX (FN_SETUP_IDX + 1)
|
||||||
|
#define FN_CALIBRATION_IDX (FN_EXIT_IDX + FN_CALIBRATION)
|
||||||
|
#define FN_CARRIER_IDX (FN_CALIBRATION_IDX + FN_CARRIER)
|
||||||
|
#define FN_CWCARRIER_IDX (FN_CARRIER_IDX + FN_CWCARRIER)
|
||||||
|
#define FN_CWTONE_IDX (FN_CWCARRIER_IDX + FN_CWTONE)
|
||||||
|
#define FN_CWDELAY_IDX (FN_CWTONE_IDX + FN_CWDELAY)
|
||||||
|
#define FN_TXCWDELAY_IDX (FN_CWDELAY_IDX + FN_TXCWDELAY)
|
||||||
|
#define FN_KEYTYPE_IDX (FN_TXCWDELAY_IDX + FN_KEYTYPE)
|
||||||
|
#define FN_ADCMONITOR_IDX (FN_KEYTYPE_IDX + FN_ADCMONITOR)
|
||||||
|
#define FN_TXONOFF_IDX (FN_ADCMONITOR_IDX + FN_TXONOFF)
|
||||||
|
|
||||||
|
#define FN_MENU_COUNT (FN_DEFAULT_MENU + FN_BAND + FN_VFO_TOGGLE + FN_MODE + FN_RIT + FN_IFSHIFT + FN_ATT + FN_CW_SPEED + FN_SPLIT + FN_VFOTOMEM + FN_MEMTOVFO + FN_MEMORYKEYER + FN_WSPR + FN_SDRMODE)
|
||||||
|
#define FN_SETUP_COUNT (FN_DEFAULT_SETUP + FN_CALIBRATION + FN_CARRIER + FN_CWCARRIER + FN_CWTONE + FN_CWDELAY + FN_TXCWDELAY + FN_KEYTYPE + FN_ADCMONITOR + FN_TXONOFF)
|
||||||
|
#define FN_STEP_COUNT (FN_MENU_COUNT + FN_SETUP_COUNT)
|
||||||
|
|
||||||
|
while (menuOn){
|
||||||
|
i = enc_read();
|
||||||
|
btnState = btnDown();
|
||||||
|
|
||||||
|
if (i > 0){
|
||||||
|
if (modeCalibrate && select + i < FN_STEP_COUNT * 10)
|
||||||
|
select += i;
|
||||||
|
else if (!modeCalibrate && select + i < FN_MENU_COUNT * 10)
|
||||||
|
select += i;
|
||||||
|
}
|
||||||
|
else if (i < 0 && select - i >= -10)
|
||||||
|
select += i;
|
||||||
|
|
||||||
|
switch (select / 10)
|
||||||
|
{
|
||||||
|
#if FN_BAND == 1
|
||||||
|
case FN_BAND_IDX :
|
||||||
|
menuBand(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_VFO_TOGGLE == 1
|
||||||
|
case FN_VFO_TOGGLE_IDX :
|
||||||
|
menuVfoToggle(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_MODE == 1
|
||||||
|
case FN_MODE_IDX :
|
||||||
|
menuSelectMode(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_RIT == 1
|
||||||
|
case FN_RIT_IDX :
|
||||||
|
menuRitToggle(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_IFSHIFT == 1
|
||||||
|
case FN_IFSHIFT_IDX :
|
||||||
|
menuIFSSetup(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_ATT == 1
|
||||||
|
case FN_ATT_IDX :
|
||||||
|
menuATTSetup(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_CW_SPEED == 1
|
||||||
|
case FN_CW_SPEED_IDX :
|
||||||
|
menuCWSpeed(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_SPLIT == 1
|
||||||
|
case FN_SPLIT_IDX :
|
||||||
|
menuSplitOnOff(btnState); //SplitOn / off
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_VFOTOMEM == 1
|
||||||
|
case FN_VFOTOMEM_IDX :
|
||||||
|
menuCHMemory(btnState, 0); //VFO to Memroy
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_MEMTOVFO == 1
|
||||||
|
case FN_MEMTOVFO_IDX :
|
||||||
|
menuCHMemory(btnState, 1); //Memory to VFO
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_MEMORYKEYER == 1
|
||||||
|
case FN_MEMORYKEYER_IDX :
|
||||||
|
menuCWAutoKey(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_WSPR == 1
|
||||||
|
case FN_WSPR_IDX :
|
||||||
|
menuWSPRSend(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_SDRMODE == 1
|
||||||
|
case FN_SDRMODE_IDX :
|
||||||
|
menuSDROnOff(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case FN_SETUP_IDX :
|
||||||
|
menuSetup(btnState);
|
||||||
|
break;
|
||||||
|
case FN_EXIT_IDX :
|
||||||
|
menuExit(btnState);
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if FN_CALIBRATION == 1
|
||||||
|
case FN_CALIBRATION_IDX :
|
||||||
|
menuSetupCalibration(btnState); //crystal
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_CARRIER == 1
|
||||||
|
case FN_CARRIER_IDX :
|
||||||
|
menuSetupCarrier(btnState); //ssb
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_CWCARRIER == 1
|
||||||
|
case FN_CWCARRIER_IDX :
|
||||||
|
menuSetupCWCarrier(btnState); //cw
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_CWTONE == 1
|
||||||
|
case FN_CWTONE_IDX :
|
||||||
|
menuSetupCwTone(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_CWDELAY == 1
|
||||||
|
case FN_CWDELAY_IDX :
|
||||||
|
menuSetupCwDelay(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_TXCWDELAY == 1
|
||||||
|
case FN_TXCWDELAY_IDX :
|
||||||
|
menuSetupTXCWInterval(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_KEYTYPE == 1
|
||||||
|
case FN_KEYTYPE_IDX :
|
||||||
|
menuSetupKeyType(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_ADCMONITOR == 1
|
||||||
|
case FN_ADCMONITOR_IDX :
|
||||||
|
menuADCMonitor(btnState);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if FN_TXONOFF == 1
|
||||||
|
case FN_TXONOFF_IDX :
|
||||||
|
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default :
|
||||||
|
menuExit(btnState); break;
|
||||||
|
} //end of switch
|
||||||
|
Check_Cat(0); //To prevent disconnections
|
||||||
|
} //end of while
|
||||||
|
|
||||||
|
//****************************************************************************
|
||||||
|
//Before change menu type (Version : ~ 0.95)
|
||||||
|
//****************************************************************************
|
||||||
|
/*
|
||||||
while (menuOn){
|
while (menuOn){
|
||||||
i = enc_read();
|
i = enc_read();
|
||||||
btnState = btnDown();
|
btnState = btnDown();
|
||||||
@ -1321,9 +1391,10 @@ void doMenu(){
|
|||||||
break;
|
break;
|
||||||
default :
|
default :
|
||||||
menuExit(btnState); break;
|
menuExit(btnState); break;
|
||||||
}
|
} //end of case
|
||||||
Check_Cat(0); //To prevent disconnections
|
Check_Cat(0); //To prevent disconnections
|
||||||
}
|
} //end of while
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************************
|
//*************************************************************************************
|
||||||
@ -1362,7 +1433,14 @@ void menuSetup(int btn){
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
modeCalibrate = ! modeCalibrate;
|
modeCalibrate = ! modeCalibrate;
|
||||||
|
//menuClearExit(1000);
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1393,13 +1471,17 @@ void menuRitToggle(int btn){
|
|||||||
ritDisable();
|
ritDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//menuClearExit(500);
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
menuOn = 0;
|
||||||
|
#else
|
||||||
|
//Only Clear And Delay for Character LCD
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Take a deep breath, math(ematics) ahead
|
* Take a deep breath, math(ematics) ahead
|
||||||
* The 25 mhz oscillator is multiplied by 35 to run the vco at 875 mhz
|
* The 25 mhz oscillator is multiplied by 35 to run the vco at 875 mhz
|
||||||
@ -1580,6 +1662,15 @@ void menuSetupCarrier(int btn){
|
|||||||
delay_background(1000, 0);
|
delay_background(1000, 0);
|
||||||
|
|
||||||
//usbCarrier = 11995000l; //Remarked by KD8CEC, Suggest from many user, if entry routine factoryrest
|
//usbCarrier = 11995000l; //Remarked by KD8CEC, Suggest from many user, if entry routine factoryrest
|
||||||
|
/*
|
||||||
|
//for uBITX V5.0, but not used by KD8CEC, if you want default value of carrier on Calibration, delete remark symbols
|
||||||
|
#if UBITX_BOARD_VERSION == 5
|
||||||
|
usbCarrier = 11053000l;
|
||||||
|
#else
|
||||||
|
usbCarrier = 11995000l;
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
si5351bx_setfreq(0, usbCarrier);
|
si5351bx_setfreq(0, usbCarrier);
|
||||||
printCarrierFreq(usbCarrier);
|
printCarrierFreq(usbCarrier);
|
||||||
@ -1623,4 +1714,3 @@ void menuSetupCarrier(int btn){
|
|||||||
//menuOn = 0;
|
//menuOn = 0;
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
* The output clock channel that controls the frequency is connected to the PLL-B.
|
* The output clock channel that controls the frequency is connected to the PLL-B.
|
||||||
* The WSPR protocol is generated by changing the clock of the PLL-B.
|
* The WSPR protocol is generated by changing the clock of the PLL-B.
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
#include "ubitx.h"
|
||||||
|
|
||||||
// ************* SI5315 routines - tks Jerry Gaffke, KE7ER ***********************
|
// ************* SI5315 routines - tks Jerry Gaffke, KE7ER ***********************
|
||||||
|
|
||||||
// An minimalist standalone set of Si5351 routines.
|
// An minimalist standalone set of Si5351 routines.
|
||||||
// VCOA is fixed at 875mhz, VCOB not used.
|
// VCOA is fixed at 875mhz, VCOB not used.
|
||||||
// The output msynth dividers are used to generate 3 independent clocks
|
// The output msynth dividers are used to generate 3 independent clocks
|
||||||
@ -48,7 +48,8 @@
|
|||||||
#define BB1(x) ((uint8_t)(x>>8))
|
#define BB1(x) ((uint8_t)(x>>8))
|
||||||
#define BB2(x) ((uint8_t)(x>>16))
|
#define BB2(x) ((uint8_t)(x>>16))
|
||||||
|
|
||||||
#define SI5351BX_ADDR 0x60 // I2C address of Si5351 (typical)
|
//#define SI5351BX_ADDR 0x60 // I2C address of Si5351 (typical)
|
||||||
|
uint8_t SI5351BX_ADDR; // I2C address of Si5351 (variable from Version 1.097)
|
||||||
#define SI5351BX_XTALPF 2 // 1:6pf 2:8pf 3:10pf
|
#define SI5351BX_XTALPF 2 // 1:6pf 2:8pf 3:10pf
|
||||||
|
|
||||||
// If using 27mhz crystal, set XTAL=27000000, MSA=33. Then vco=891mhz
|
// If using 27mhz crystal, set XTAL=27000000, MSA=33. Then vco=891mhz
|
||||||
@ -58,7 +59,13 @@
|
|||||||
// User program may have reason to poke new values into these 3 RAM variables
|
// User program may have reason to poke new values into these 3 RAM variables
|
||||||
uint32_t si5351bx_vcoa = (SI5351BX_XTAL*SI5351BX_MSA); // 25mhzXtal calibrate
|
uint32_t si5351bx_vcoa = (SI5351BX_XTAL*SI5351BX_MSA); // 25mhzXtal calibrate
|
||||||
uint8_t si5351bx_rdiv = 0; // 0-7, CLK pin sees fout/(2**rdiv)
|
uint8_t si5351bx_rdiv = 0; // 0-7, CLK pin sees fout/(2**rdiv)
|
||||||
|
|
||||||
|
#if UBITX_BOARD_VERSION == 5
|
||||||
|
uint8_t si5351bx_drive[3] = {3, 3, 3}; // 0=2ma 1=4ma 2=6ma 3=8ma for CLK 0,1,2
|
||||||
|
#else
|
||||||
uint8_t si5351bx_drive[3] = {1, 1, 1}; // 0=2ma 1=4ma 2=6ma 3=8ma for CLK 0,1,2
|
uint8_t si5351bx_drive[3] = {1, 1, 1}; // 0=2ma 1=4ma 2=6ma 3=8ma for CLK 0,1,2
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t si5351bx_clken = 0xFF; // Private, all CLK output drivers off
|
uint8_t si5351bx_clken = 0xFF; // Private, all CLK output drivers off
|
||||||
int32_t calibration = 0;
|
int32_t calibration = 0;
|
||||||
|
|
||||||
@ -92,6 +99,18 @@ void si5351bx_init() { // Call once at power-up, start PLLA
|
|||||||
|
|
||||||
i2cWriten(26, si5351Val, 8); // Write to 8 PLLA msynth regs
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
#if UBITX_BOARD_VERSION == 5
|
||||||
|
//why? TODO : CHECK by KD8CEC
|
||||||
|
//initializing the ppl2 as well
|
||||||
|
i2cWriten(34, si5351Val, 8); // Write to 8 PLLA msynth regs
|
||||||
|
i2cWrite(177, 0xa0); // Reset PLLA & PPLB (0x80 resets PLLB)
|
||||||
|
#else
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
@ -127,7 +146,9 @@ void si5351_set_calibration(int32_t cal){
|
|||||||
void SetCarrierFreq()
|
void SetCarrierFreq()
|
||||||
{
|
{
|
||||||
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
||||||
si5351bx_setfreq(0, (sdrModeOn ? 0 : appliedCarrier));
|
//si5351bx_setfreq(0, (sdrModeOn ? 0 : appliedCarrier));
|
||||||
|
si5351bx_setfreq(0, ((sdrModeOn && (inTx == 0)) ? 0 : appliedCarrier)); //found bug by KG4GEK
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (cwMode == 0)
|
if (cwMode == 0)
|
||||||
@ -167,6 +188,3 @@ void TXSubFreq(unsigned long P2)
|
|||||||
i2cWrite(40, (P2 & 65280) >> 8);
|
i2cWrite(40, (P2 & 65280) >> 8);
|
||||||
i2cWrite(41, P2 & 255);
|
i2cWrite(41, P2 & 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,6 +6,165 @@
|
|||||||
* quickly cleared up.
|
* quickly cleared up.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
//SWR GRAPH, DrawMeter and drawingMeter Logic function by VK2ETA
|
||||||
|
|
||||||
|
#ifdef OPTION_SKINNYBARS //We want skninny bars with more text
|
||||||
|
//VK2ETA modded "Skinny" bitmaps
|
||||||
|
const PROGMEM uint8_t meters_bitmap[] = {
|
||||||
|
// B01110, B10001, B10001, B11111, B11011, B11011, B11111, B00000, //Padlock Symbol, for merging. Not working, see below
|
||||||
|
B00000, B00000, B00000, B00000, B00000, B00000, B00000, B10000, //shortest bar
|
||||||
|
B00000, B00000, B00000, B00000, B00000, B00000, B00100, B10100,
|
||||||
|
B00000, B00000, B00000, B00000, B00000, B00001, B00101, B10101,
|
||||||
|
B00000, B00000, B00000, B00000, B10000, B10000, B10000, B10000,
|
||||||
|
B00000, B00000, B00000, B00100, B10100, B10100, B10100, B10100,
|
||||||
|
B00000, B00000, B00001, B00101, B10101, B10101, B10101, B10101, //tallest bar
|
||||||
|
B00000, B00010, B00111, B00010, B01000, B11100, B01000, B00000, // ++ sign
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
//VK2ETA "Fat" bars, easy to read, with less text
|
||||||
|
const PROGMEM uint8_t meters_bitmap[] = {
|
||||||
|
// B01110, B10001, B10001, B11111, B11011, B11011, B11111, B00000, //Padlock Symbol, for merging. Not working, see below
|
||||||
|
B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111, //shortest bar
|
||||||
|
B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111,
|
||||||
|
B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111,
|
||||||
|
B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111,
|
||||||
|
B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111,
|
||||||
|
B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111, //tallest bar
|
||||||
|
B00000, B00010, B00111, B00010, B01000, B11100, B01000, B00000, // ++ sign
|
||||||
|
};
|
||||||
|
#endif //OPTION_SKINNYBARS
|
||||||
|
PGM_P p_metes_bitmap = reinterpret_cast<PGM_P>(meters_bitmap);
|
||||||
|
|
||||||
|
const PROGMEM uint8_t lock_bitmap[8] = {
|
||||||
|
0b01110,
|
||||||
|
0b10001,
|
||||||
|
0b10001,
|
||||||
|
0b11111,
|
||||||
|
0b11011,
|
||||||
|
0b11011,
|
||||||
|
0b11111,
|
||||||
|
0b00000};
|
||||||
|
PGM_P plock_bitmap = reinterpret_cast<PGM_P>(lock_bitmap);
|
||||||
|
|
||||||
|
|
||||||
|
// initializes the custom characters
|
||||||
|
// we start from char 1 as char 0 terminates the string!
|
||||||
|
void initMeter(){
|
||||||
|
uint8_t tmpbytes[8];
|
||||||
|
byte i;
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(plock_bitmap + i);
|
||||||
|
LCD_CreateChar(0, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i);
|
||||||
|
LCD_CreateChar(1, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 8);
|
||||||
|
LCD_CreateChar(2, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 16);
|
||||||
|
LCD_CreateChar(3, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 24);
|
||||||
|
LCD_CreateChar(4, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 32);
|
||||||
|
LCD_CreateChar(5, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 40);
|
||||||
|
LCD_CreateChar(6, tmpbytes);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 48);
|
||||||
|
LCD_CreateChar(7, tmpbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//by KD8CEC
|
||||||
|
//0 ~ 25 : 30 over : + 10
|
||||||
|
/*
|
||||||
|
void drawMeter(int needle) {
|
||||||
|
//5Char + O over
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//VK2ETA meter for S.Meter, power and SWR
|
||||||
|
void drawMeter(int needle)
|
||||||
|
{
|
||||||
|
#ifdef OPTION_SKINNYBARS
|
||||||
|
//Fill buffer with growing set of bars, up to needle value
|
||||||
|
lcdMeter[0] = 0x20;
|
||||||
|
lcdMeter[1] = 0x20;
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
if (needle > i)
|
||||||
|
lcdMeter[i / 3] = byte(i + 1); //Custom characters above
|
||||||
|
//else if (i == 1 || i == 4) {
|
||||||
|
// lcdMeter[i / 3] = 0x20; //blank
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needle > 7) {
|
||||||
|
lcdMeter[2] = byte(7); //Custom character "++"
|
||||||
|
} else if (needle > 6) {
|
||||||
|
lcdMeter[2] = '+'; //"+"
|
||||||
|
} else lcdMeter[2] = 0x20;
|
||||||
|
|
||||||
|
|
||||||
|
#else //Must be "fat" bars
|
||||||
|
//Fill buffer with growing set of bars, up to needle value
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
if (needle > i)
|
||||||
|
lcdMeter[i] = byte(i + 1); //Custom characters above
|
||||||
|
else
|
||||||
|
lcdMeter[i] = 0x20; //blank
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needle > 7) {
|
||||||
|
lcdMeter[6] = byte(7); //Custom character "++"
|
||||||
|
} else if (needle > 6) {
|
||||||
|
lcdMeter[6] = '+'; //"+"
|
||||||
|
} else lcdMeter[6] = 0x20;
|
||||||
|
|
||||||
|
#endif //OPTION_FATBARS
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
char byteToChar(byte srcByte){
|
char byteToChar(byte srcByte){
|
||||||
if (srcByte < 10)
|
if (srcByte < 10)
|
||||||
return 0x30 + srcByte;
|
return 0x30 + srcByte;
|
||||||
@ -15,12 +174,40 @@
|
|||||||
|
|
||||||
//returns true if the button is pressed
|
//returns true if the button is pressed
|
||||||
int btnDown(void){
|
int btnDown(void){
|
||||||
|
#ifdef EXTEND_KEY_GROUP1
|
||||||
|
if (analogRead(FBUTTON) > FUNCTION_KEY_ADC)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
#else
|
||||||
if (digitalRead(FBUTTON) == HIGH)
|
if (digitalRead(FBUTTON) == HIGH)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef EXTEND_KEY_GROUP1
|
||||||
|
int getBtnStatus(void){
|
||||||
|
int readButtonValue = analogRead(FBUTTON);
|
||||||
|
|
||||||
|
if (analogRead(FBUTTON) < FUNCTION_KEY_ADC)
|
||||||
|
return FKEY_PRESS;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
readButtonValue = readButtonValue / 4;
|
||||||
|
//return FKEY_VFOCHANGE;
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
if (KeyValues[i][2] != 0 && KeyValues[i][0] <= readButtonValue && KeyValues[i][1] >= readButtonValue)
|
||||||
|
return KeyValues[i][2];
|
||||||
|
//return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int enc_prev_state = 3;
|
int enc_prev_state = 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -81,4 +268,32 @@ int enc_read(void) {
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===================================================================
|
||||||
|
//I2C Signal Meter, Version 1.097
|
||||||
|
//===================================================================
|
||||||
|
|
||||||
|
// 0xA0 ~ 0xCF : CW Decode Mode + 100Hz ~
|
||||||
|
// 0xD0 ~ 0xF3 : RTTY Decode Mode + 100Hz ~
|
||||||
|
// 0x10 ~ 0x30 : Spectrum Mode
|
||||||
|
int GetI2CSmeterValue(int valueType)
|
||||||
|
{
|
||||||
|
if (valueType > 0)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(I2CMETER_ADDR); //j : S-Meter
|
||||||
|
Wire.write(valueType); //Y : Get Value Type
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
Wire.requestFrom(I2CMETER_ADDR, 1);
|
||||||
|
|
||||||
|
if (Wire.available() > 0)
|
||||||
|
{
|
||||||
|
return Wire.read();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,8 +6,6 @@ Thanks to G3ZIL for sharing great code.
|
|||||||
Due to the limited memory of uBITX, I have implemented at least only a few of the codes in uBITX.
|
Due to the limited memory of uBITX, I have implemented at least only a few of the codes in uBITX.
|
||||||
|
|
||||||
Thanks for testing
|
Thanks for testing
|
||||||
Beta Tester :
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -23,21 +21,19 @@ Beta Tester :
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
|
|
||||||
#include <arduino.h>
|
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include "ubitx.h"
|
#include "ubitx.h"
|
||||||
|
|
||||||
//begin of test
|
//begin of test
|
||||||
byte WsprToneCode[164];
|
byte WsprToneCode[164];
|
||||||
|
|
||||||
long lastTime=0;
|
unsigned long lastTime=0;
|
||||||
unsigned long TX_MSNB_P2; // Si5351 register MSNB_P2 PLLB for Tx
|
unsigned long TX_MSNB_P2; // Si5351 register MSNB_P2 PLLB for Tx
|
||||||
unsigned long TX_P2; // Variable values for MSNB_P2 which defines the frequencies for the data
|
unsigned long TX_P2; // Variable values for MSNB_P2 which defines the frequencies for the data
|
||||||
|
|
||||||
extern int enc_read(void);
|
extern int enc_read(void);
|
||||||
|
|
||||||
byte WsprMSGCount = 0;
|
byte WsprMSGCount = 0;
|
||||||
#define PTT (A3)
|
|
||||||
|
|
||||||
#define WSPR_BAND1 401
|
#define WSPR_BAND1 401
|
||||||
|
|
||||||
@ -48,7 +44,7 @@ void SendWSPRManage()
|
|||||||
{
|
{
|
||||||
int knob = 0;
|
int knob = 0;
|
||||||
byte knobPosition = 0;
|
byte knobPosition = 0;
|
||||||
char isNeedDisplayInfo = 0;
|
//char isNeedDisplayInfo = 0;
|
||||||
char nowSelectedIndex = 0;
|
char nowSelectedIndex = 0;
|
||||||
char nowWsprStep = 0; //0 : select Message, 1 : select band, 2 : send
|
char nowWsprStep = 0; //0 : select Message, 1 : select band, 2 : send
|
||||||
char selectedWsprMessageIndex = -1;
|
char selectedWsprMessageIndex = -1;
|
||||||
@ -56,8 +52,8 @@ void SendWSPRManage()
|
|||||||
|
|
||||||
unsigned long WsprTXFreq = 0;
|
unsigned long WsprTXFreq = 0;
|
||||||
unsigned int WsprMultiChan = 0;
|
unsigned int WsprMultiChan = 0;
|
||||||
unsigned long prevFreq;
|
//unsigned long prevFreq;
|
||||||
char loopIndex;
|
byte loopIndex;
|
||||||
|
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
|
|
||||||
@ -75,13 +71,14 @@ void SendWSPRManage()
|
|||||||
|
|
||||||
if (nowWsprStep == 0) //select Message status
|
if (nowWsprStep == 0) //select Message status
|
||||||
{
|
{
|
||||||
printLineF2(F("WSPR:"));
|
//printLineF2(F("WSPR:"));
|
||||||
|
|
||||||
if (selectedWsprMessageIndex != nowSelectedIndex)
|
if (selectedWsprMessageIndex != nowSelectedIndex)
|
||||||
{
|
{
|
||||||
selectedWsprMessageIndex = nowSelectedIndex;
|
selectedWsprMessageIndex = nowSelectedIndex;
|
||||||
int wsprMessageBuffIndex = selectedWsprMessageIndex * 46;
|
int wsprMessageBuffIndex = selectedWsprMessageIndex * 46;
|
||||||
|
|
||||||
|
printLineF2(F("WSPR:"));
|
||||||
//Display WSPR Name tag
|
//Display WSPR Name tag
|
||||||
printLineFromEEPRom(0, 6, wsprMessageBuffIndex, wsprMessageBuffIndex + 4, 1);
|
printLineFromEEPRom(0, 6, wsprMessageBuffIndex, wsprMessageBuffIndex + 4, 1);
|
||||||
|
|
||||||
@ -115,22 +112,9 @@ void SendWSPRManage()
|
|||||||
EEPROM.get(bandBuffIndex, WsprTXFreq);
|
EEPROM.get(bandBuffIndex, WsprTXFreq);
|
||||||
EEPROM.get(bandBuffIndex + 4, WsprMultiChan);
|
EEPROM.get(bandBuffIndex + 4, WsprMultiChan);
|
||||||
|
|
||||||
/*
|
|
||||||
//3, 4, 5, 6, 7
|
|
||||||
Wspr_Reg1[3] = EEPROM.read(bandBuffIndex + 6);
|
|
||||||
Wspr_Reg1[4] = EEPROM.read(bandBuffIndex + 7);
|
|
||||||
Wspr_Reg1[5] = EEPROM.read(bandBuffIndex + 8);
|
|
||||||
Wspr_Reg1[6] = EEPROM.read(bandBuffIndex + 9);
|
|
||||||
Wspr_Reg1[7] = EEPROM.read(bandBuffIndex + 10);
|
|
||||||
*/
|
|
||||||
for (loopIndex = 3; loopIndex < 8; loopIndex++)
|
for (loopIndex = 3; loopIndex < 8; loopIndex++)
|
||||||
Wspr_Reg1[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 3);
|
Wspr_Reg1[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 3);
|
||||||
|
|
||||||
/*
|
|
||||||
Wspr_Reg2[2] = EEPROM.read(bandBuffIndex + 11);
|
|
||||||
Wspr_Reg2[3] = EEPROM.read(bandBuffIndex + 12);
|
|
||||||
Wspr_Reg2[4] = EEPROM.read(bandBuffIndex + 13);
|
|
||||||
*/
|
|
||||||
//2, 3, 4
|
//2, 3, 4
|
||||||
for (loopIndex = 2; loopIndex < 5; loopIndex++)
|
for (loopIndex = 2; loopIndex < 5; loopIndex++)
|
||||||
Wspr_Reg2[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 9);
|
Wspr_Reg2[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 9);
|
||||||
@ -138,18 +122,39 @@ void SendWSPRManage()
|
|||||||
TX_MSNB_P2 = ((unsigned long)Wspr_Reg1[5] & 0x0F) << 16 | ((unsigned long)Wspr_Reg1[6]) << 8 | Wspr_Reg1[7];
|
TX_MSNB_P2 = ((unsigned long)Wspr_Reg1[5] & 0x0F) << 16 | ((unsigned long)Wspr_Reg1[6]) << 8 | Wspr_Reg1[7];
|
||||||
}
|
}
|
||||||
|
|
||||||
ltoa(WsprTXFreq, b, DEC);
|
|
||||||
if (digitalRead(PTT) == 0)
|
if (digitalRead(PTT) == 0)
|
||||||
strcpy(c, "SEND:");
|
strcpy(c, "SEND: ");
|
||||||
else
|
else
|
||||||
strcpy(c, "PTT->");
|
strcpy(c, "PTT-> ");
|
||||||
|
|
||||||
|
//ltoa(WsprTXFreq, b, DEC);
|
||||||
|
//strcat(c, b);
|
||||||
|
|
||||||
|
//display frequency, Frequency to String for KD8CEC
|
||||||
|
unsigned long tmpFreq = WsprTXFreq;
|
||||||
|
for (int i = 15; i >= 6; i--) {
|
||||||
|
if (tmpFreq > 0) {
|
||||||
|
if (i == 12 || i == 8) c[i] = '.';
|
||||||
|
else {
|
||||||
|
c[i] = tmpFreq % 10 + 0x30;
|
||||||
|
tmpFreq /= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
c[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
strcat(c, b);
|
|
||||||
printLine1(c);
|
printLine1(c);
|
||||||
|
|
||||||
|
#ifdef USE_SW_SERIAL
|
||||||
|
SWS_Process();
|
||||||
|
if ((digitalRead(PTT) == 0) || (TriggerBySW == 1))
|
||||||
|
{
|
||||||
|
TriggerBySW = 0;
|
||||||
|
#else
|
||||||
if (digitalRead(PTT) == 0)
|
if (digitalRead(PTT) == 0)
|
||||||
{
|
{
|
||||||
//printLineF1(F("Transmitting"));
|
#endif
|
||||||
//SEND WSPR
|
//SEND WSPR
|
||||||
//If you need to consider the Rit and Sprite modes, uncomment them below.
|
//If you need to consider the Rit and Sprite modes, uncomment them below.
|
||||||
//remark = To reduce the size of the program
|
//remark = To reduce the size of the program
|
||||||
|
BIN
ubitxmanager ubuntu.odt
Normal file
BIN
ubitxmanager ubuntu.odt
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user