Compare commits
No commits in common. "master" and "version1.072" have entirely different histories.
master
...
version1.0
70
README.md
70
README.md
@ -1,21 +1,21 @@
|
|||||||
#KC4UPR'S NOTE
|
#IMPORTANT INFORMATION
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
This is a fork of the KD8CEC firmware that will be specific to my uBITX V5
|
- Now Release Version 1.061 on my blog (http://www.hamskey.com)
|
||||||
installation. My intent is to remove unnecessary code, as well as make some
|
- You can download and compiled hex file and uBITX Manager application on my blog (http://www.hamskey.com)
|
||||||
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
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
- Now Release Version 1.20 on my blog (http://www.hamskey.com)
|
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.
|
||||||
- You can download and compiled hex file and uBITX Manager application on release section (https://github.com/phdlee/ubitx/releases)
|
|
||||||
- For more information, see my blog (http://www.hamskey.com)
|
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.
|
||||||
|
|
||||||
http://www.hamskey.com
|
http://www.hamskey.com
|
||||||
|
|
||||||
Ian KD8CEC
|
DE KD8CEC
|
||||||
kd8cec@gmail.com
|
kd8cec@gmail.com
|
||||||
|
|
||||||
#uBITX
|
#uBITX
|
||||||
@ -26,53 +26,15 @@ 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
|
||||||
- Add TTS module
|
- Reduce Program size
|
||||||
|
- uBITX with RTL-SDR
|
||||||
- Direct control for Student
|
- Direct control for Student
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
## REVISION RECORD
|
## REVISION RECORD
|
||||||
1.20
|
1.07 (Working...)
|
||||||
- Support uBITX V5
|
- Please do not download it yet. The code will continue to change for the time being.
|
||||||
- Change to SDR Frequency (Remove just RTL-SDR's error Frequency (2390Hz))
|
- BetaVersion for Reduce program size
|
||||||
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
|
1.061
|
||||||
- Added WSPR
|
- Added WSPR
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
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))
|
||||||
#include "ubitx.h"
|
#define printLineF2(x) (printLineF(0, x))
|
||||||
|
|
||||||
//for broken protocol
|
//for broken protocol
|
||||||
#define CAT_RECEIVE_TIMEOUT 500
|
#define CAT_RECEIVE_TIMEOUT 500
|
||||||
@ -252,35 +252,12 @@ 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);
|
||||||
}
|
}
|
||||||
@ -300,20 +277,8 @@ 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);
|
||||||
}
|
}
|
||||||
@ -677,7 +642,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 = 0;
|
byte sMeterValue = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
http://www.ka7oei.com/ft817_meow.html
|
http://www.ka7oei.com/ft817_meow.html
|
||||||
@ -690,33 +655,6 @@ 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,6 +235,30 @@ 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
|
||||||
@ -273,18 +297,17 @@ 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);
|
||||||
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
|
|
||||||
|
//byte diplayAutoCWLine = 0;
|
||||||
|
//if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
// diplayAutoCWLine = 1;
|
||||||
|
|
||||||
Display_AutoKeyTextIndex(selectedCWTextIndex);
|
Display_AutoKeyTextIndex(selectedCWTextIndex);
|
||||||
#endif
|
//lcd.setCursor(0, diplayAutoCWLine);
|
||||||
|
//lcd.write(byteToChar(selectedCWTextIndex));
|
||||||
|
//lcd.write(':');
|
||||||
|
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
|
||||||
scrollDispayTime = millis() + scrollSpeed;
|
scrollDispayTime = millis() + scrollSpeed;
|
||||||
beforeCWTextIndex = selectedCWTextIndex;
|
beforeCWTextIndex = selectedCWTextIndex;
|
||||||
}
|
}
|
||||||
|
@ -1,334 +0,0 @@
|
|||||||
/*
|
|
||||||
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);
|
|
||||||
}
|
|
226
ubitx_20/ubitx.h
226
ubitx_20/ubitx.h
@ -14,174 +14,28 @@
|
|||||||
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/>.
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
#ifndef _UBITX_HEADER__
|
|
||||||
#define _UBITX_HEADER__
|
|
||||||
|
|
||||||
#include <Arduino.h> //for Linux, On Linux it is case sensitive.
|
#include <Arduino.h> //for Linux, On Linux it is case sensitive.
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// Compile Option
|
// 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.
|
//Depending on the type of LCD mounted on the uBITX, uncomment one of the options below.
|
||||||
//You must select only one.
|
//You must select only one.
|
||||||
//#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX (Parallel)
|
//#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX
|
||||||
//#define UBITX_DISPLAY_LCD1602I //I2C type 16 x 02 LCD
|
//#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_LCD2004P //24 x 04 LCD (Parallel)
|
|
||||||
//#define UBITX_DISPLAY_LCD2004I //I2C type 24 x 04 LCD
|
//#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_DISPLAY_ADDRESS 0x3F //0x27 //DEFAULT, if Set I2C Address by uBITX Manager, read from EEProm
|
||||||
#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 EXTEND_KEY_GROUP1 //MODE, BAND(-), BAND(+), STEP
|
||||||
#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
|
//#define EXTEND_KEY_GROUP2 //Numeric (0~9), Point(.), Enter //Not supported in Version 1.0x
|
||||||
|
|
||||||
//Custom LPF Filter Mod
|
#define ENABLE_FACTORYALIGN
|
||||||
//#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.
|
#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
|
#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
|
// Hardware, Define PIN Usage
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
@ -193,7 +47,7 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
|||||||
* ground and six pins. Each of these six pins can be individually programmed
|
* 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.
|
* either as an analog input, a digital input or a digital output.
|
||||||
* The pins are assigned as follows (left to right, display facing you):
|
* The pins are assigned as follows (left to right, display facing you):
|
||||||
* Pin 1 (Violet), A7, SPARE => Analog S-Meter
|
* Pin 1 (Violet), A7, SPARE
|
||||||
* Pin 2 (Blue), A6, KEYER (DATA)
|
* Pin 2 (Blue), A6, KEYER (DATA)
|
||||||
* Pin 3 (Green), +5v
|
* Pin 3 (Green), +5v
|
||||||
* Pin 4 (Yellow), Gnd
|
* Pin 4 (Yellow), Gnd
|
||||||
@ -219,11 +73,12 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
|||||||
#define ANALOG_SPARE (A7)
|
#define ANALOG_SPARE (A7)
|
||||||
#define ANALOG_SMETER (A7) //by KD8CEC
|
#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.
|
* 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 :
|
* This assignment is as follows :
|
||||||
* Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
* 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
|
* 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 :
|
* 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
|
* - 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
|
* - CW_KEY line : turns on the carrier for CW
|
||||||
@ -235,24 +90,6 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
|||||||
#define TX_LPF_C (3) //Relay
|
#define TX_LPF_C (3) //Relay
|
||||||
#define CW_KEY (2)
|
#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
|
// for public, Variable, functions
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
@ -262,47 +99,17 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
|||||||
#define printLineF1(x) (printLineF(1, x))
|
#define printLineF1(x) (printLineF(1, x))
|
||||||
#define printLineF2(x) (printLineF(0, 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 FUNCTION_KEY_ADC 80 //MODE, BAND(-), BAND(+), STEP
|
||||||
#define FKEY_PRESS 0x78
|
#define FKEY_PRESS 120
|
||||||
#define FKEY_MODE 0x01
|
#define FKEY_MODE 0
|
||||||
#define FKEY_BANDUP 0x02
|
#define FKEY_BANDUP 1
|
||||||
#define FKEY_BANDDOWN 0x03
|
#define FKEY_BANDDOWN 2
|
||||||
#define FKEY_STEP 0x04
|
#define FKEY_STEP 3
|
||||||
#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 unsigned long frequency;
|
||||||
extern byte WsprMSGCount;
|
extern byte WsprMSGCount;
|
||||||
extern byte sMeterLevels[9];
|
extern byte sMeterLevels[9];
|
||||||
extern int currentSMeter; //ADC Value for S.Meter
|
extern int KeyValues[16][2]; //ADC value Ranges for Extend Key
|
||||||
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);
|
||||||
@ -328,8 +135,3 @@ extern void SendWSPRManage(void);
|
|||||||
extern char byteToChar(byte srcByte);
|
extern char byteToChar(byte srcByte);
|
||||||
extern void DisplayCallsign(byte callSignLength);
|
extern void DisplayCallsign(byte callSignLength);
|
||||||
extern void DisplayVersionInfo(const char* fwVersionInfo);
|
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
|
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
// So I put + in the sense that it was improved one by one based on Original Firmware.
|
// 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.
|
// This firmware has been gradually changed based on the original firmware created by Farhan, Jack, Jerry and others.
|
||||||
|
|
||||||
#define FIRMWARE_VERSION_INFO F("+v1.200")
|
#define FIRMWARE_VERSION_INFO F("+v1.072")
|
||||||
#define FIRMWARE_VERSION_NUM 0x04 //1st Complete Project : 1 (Version 1.061), 2st Project : 2, 1.08: 3, 1.09 : 4
|
#define FIRMWARE_VERSION_NUM 0x02 //1st Complete Project : 1 (Version 1.061), 2st Project : 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Cat Suppoort uBITX CEC Version
|
Cat Suppoort uBITX CEC Version
|
||||||
@ -72,43 +72,10 @@
|
|||||||
|
|
||||||
// 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
|
||||||
|
|
||||||
#if UBITX_BOARD_VERSION == 5
|
|
||||||
//For Test //45005000
|
|
||||||
//#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_USB (56995000l)
|
||||||
#define SECOND_OSC_LSB (32995000l)
|
#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
|
//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)
|
#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)
|
||||||
@ -215,27 +182,34 @@ byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
|
|||||||
char lcdMeter[17];
|
char lcdMeter[17];
|
||||||
byte sMeterLevels[9];
|
byte sMeterLevels[9];
|
||||||
|
|
||||||
//Current ADC Value for S.Meter, and S Meter Level
|
int KeyValues[16][2];
|
||||||
int currentSMeter = 0;
|
/*= {
|
||||||
byte scaledSMeter = 0;
|
{1023, 1025}, //1
|
||||||
|
{707, 711}, //5
|
||||||
|
{570, 574}, //9
|
||||||
|
{493, 500}, //13
|
||||||
|
|
||||||
byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
|
{932, 936}, //2
|
||||||
byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
{860, 864}, //3
|
||||||
|
{800, 805}, //4
|
||||||
|
|
||||||
byte KeyValues[16][3];
|
{672, 676}, //6
|
||||||
|
{642, 646}, //7
|
||||||
|
{616, 620}, //8
|
||||||
|
|
||||||
|
{552, 556}, //10
|
||||||
|
{535, 539}, //11
|
||||||
|
{520, 524}, //12
|
||||||
|
|
||||||
|
{438, 442}, //14
|
||||||
|
{403, 407}, //15
|
||||||
|
{378, 382} //16
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
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
|
||||||
@ -296,8 +270,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;
|
||||||
|
|
||||||
byteToMode(loadMode, 1);
|
|
||||||
setFrequency(resultFreq);
|
setFrequency(resultFreq);
|
||||||
|
byteToMode(loadMode, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
||||||
@ -357,50 +331,7 @@ 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);
|
||||||
@ -421,10 +352,6 @@ 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -495,7 +422,7 @@ void setFrequency(unsigned long f){
|
|||||||
// 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);
|
moveFrequency = (f % 10000000);
|
||||||
}
|
}
|
||||||
else if (sdrOption == 3) //Khz move
|
else if (sdrOption == 3) //Khzz move
|
||||||
{
|
{
|
||||||
//Offset Frequency + Khz,
|
//Offset Frequency + Khz,
|
||||||
//Example : Offset Frequency : 30Mhz and current Frequncy is 7.080 => 30.080Mhz
|
//Example : Offset Frequency : 30Mhz and current Frequncy is 7.080 => 30.080Mhz
|
||||||
@ -503,23 +430,13 @@ void setFrequency(unsigned long f){
|
|||||||
moveFrequency = (f % 1000000);
|
moveFrequency = (f % 1000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if UBITX_BOARD_VERSION == 5
|
|
||||||
si5351bx_setfreq(2, 45002000 + if1AdjustValue + f);
|
|
||||||
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))
|
||||||
+ moveFrequency );
|
+ moveFrequency
|
||||||
//+ 2390); Do not add another SDR because the error is different. V1.3
|
+ 2390);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -537,6 +454,31 @@ void setFrequency(unsigned long f){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,17 +506,13 @@ 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);
|
||||||
@ -692,8 +630,6 @@ void checkPTT(){
|
|||||||
}
|
}
|
||||||
#ifdef EXTEND_KEY_GROUP1
|
#ifdef EXTEND_KEY_GROUP1
|
||||||
void checkButton(){
|
void checkButton(){
|
||||||
char currentBandIndex = -1;
|
|
||||||
|
|
||||||
//only if the button is pressed
|
//only if the button is pressed
|
||||||
int keyStatus = getBtnStatus();
|
int keyStatus = getBtnStatus();
|
||||||
if (keyStatus == -1)
|
if (keyStatus == -1)
|
||||||
@ -705,24 +641,11 @@ void checkButton(){
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (keyStatus == FKEY_PRESS) //Menu Key
|
if (keyStatus == FKEY_PRESS) //Menu Key
|
||||||
{
|
|
||||||
//for touch screen
|
|
||||||
#ifdef USE_SW_SERIAL
|
|
||||||
SetSWActivePage(1);
|
|
||||||
doMenu();
|
doMenu();
|
||||||
|
else if (keyStatus <= FKEY_STEP) //EXTEND KEY GROUP #1
|
||||||
if (isCWAutoMode == 0)
|
|
||||||
SetSWActivePage(0);
|
|
||||||
#else
|
|
||||||
doMenu();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else if (keyStatus <= FKEY_TYPE_MAX) //EXTEND KEY GROUP #1
|
|
||||||
{
|
{
|
||||||
|
if (keyStatus == FKEY_MODE) //Press Mode Key
|
||||||
switch(keyStatus)
|
|
||||||
{
|
{
|
||||||
case FKEY_MODE :
|
|
||||||
if (cwMode == 1)
|
if (cwMode == 1)
|
||||||
{
|
{
|
||||||
cwMode = 2;
|
cwMode = 2;
|
||||||
@ -740,9 +663,16 @@ void checkButton(){
|
|||||||
{
|
{
|
||||||
cwMode = 1;
|
cwMode = 1;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case FKEY_BANDUP :
|
//else if (keyStatus == FKEY_BANDDOWN) //Press Mode Key
|
||||||
case FKEY_BANDDOWN :
|
//{
|
||||||
|
// setNextHamBandFreq(frequency, -1); //Prior Band
|
||||||
|
//}
|
||||||
|
else if (keyStatus == FKEY_BANDUP || keyStatus == FKEY_BANDDOWN) //Press Mode Key
|
||||||
|
{
|
||||||
|
|
||||||
|
char currentBandIndex = -1;
|
||||||
|
|
||||||
//Save Band Information
|
//Save Band Information
|
||||||
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
|
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
|
||||||
currentBandIndex = getIndexHambanBbyFreq(frequency);
|
currentBandIndex = getIndexHambanBbyFreq(frequency);
|
||||||
@ -751,33 +681,16 @@ void checkButton(){
|
|||||||
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
|
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setNextHamBandFreq(frequency, keyStatus == FKEY_BANDDOWN ? -1 : 1); //Prior Band
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FKEY_STEP :
|
setNextHamBandFreq(frequency, keyStatus == FKEY_BANDDOWN ? -1 : 1); //Prior Band
|
||||||
|
}
|
||||||
|
else if (keyStatus == FKEY_STEP) //FKEY_BANDUP
|
||||||
|
{
|
||||||
if (++tuneStepIndex > 5)
|
if (++tuneStepIndex > 5)
|
||||||
tuneStepIndex = 1;
|
tuneStepIndex = 1;
|
||||||
|
|
||||||
EEPROM.put(TUNING_STEP, tuneStepIndex);
|
EEPROM.put(TUNING_STEP, tuneStepIndex);
|
||||||
printLine2ClearAndUpdate();
|
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);
|
FrequencyToVFO(1);
|
||||||
@ -988,24 +901,6 @@ 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
|
||||||
@ -1033,6 +928,7 @@ 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);
|
||||||
@ -1043,29 +939,10 @@ void initSettings(){
|
|||||||
|
|
||||||
//KeyValues
|
//KeyValues
|
||||||
for (byte i = 0; i < 16; i++) {
|
for (byte i = 0; i < 16; i++) {
|
||||||
KeyValues[i][0] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 3)); //RANGE : Start Value
|
KeyValues[i][0] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 2));
|
||||||
KeyValues[i][1] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 3) + 1); //RANGE : End Value
|
KeyValues[i][1] = EEPROM.read(EXTENDED_KEY_RANGE + (i * 2) + 1);
|
||||||
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
|
||||||
@ -1227,22 +1104,12 @@ 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;
|
||||||
@ -1292,16 +1159,6 @@ 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);
|
||||||
|
|
||||||
@ -1319,40 +1176,6 @@ 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()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -1368,19 +1191,6 @@ 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);
|
||||||
@ -1388,18 +1198,11 @@ void setup()
|
|||||||
|
|
||||||
Init_Cat(38400, SERIAL_8N1);
|
Init_Cat(38400, SERIAL_8N1);
|
||||||
initSettings();
|
initSettings();
|
||||||
initPorts();
|
|
||||||
|
|
||||||
#ifdef USE_SW_SERIAL
|
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) {
|
||||||
// if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80))
|
|
||||||
// {
|
|
||||||
userCallsignLength = userCallsignLength & 0x7F;
|
|
||||||
// }
|
|
||||||
#else
|
|
||||||
//for Chracter LCD
|
|
||||||
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);
|
||||||
DisplayCallsign(userCallsignLength);
|
DisplayCallsign(userCallsignLength);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1407,12 +1210,8 @@ void setup()
|
|||||||
delay(500);
|
delay(500);
|
||||||
clearLine2();
|
clearLine2();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FACTORY_RECOVERY_BOOTUP
|
initPorts();
|
||||||
if (btnDown())
|
|
||||||
factory_Recovery();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
byteToMode(vfoA_mode, 0);
|
byteToMode(vfoA_mode, 0);
|
||||||
initOscillators();
|
initOscillators();
|
||||||
@ -1420,18 +1219,12 @@ 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
|
||||||
@ -1488,9 +1281,4 @@ 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
|
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,6 @@
|
|||||||
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/>.
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
#ifndef _UBITX_EEPOM_HEADER__
|
|
||||||
#define _UBITX_EEPOM_HEADER__
|
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// Factory-shipped EEProm address
|
// Factory-shipped EEProm address
|
||||||
// (factory Firmware)
|
// (factory Firmware)
|
||||||
@ -35,35 +32,16 @@
|
|||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// The spare space available in the original firmware #1
|
// The spare space available in the original firmware #1
|
||||||
// Address : 32 ~ 62
|
// Address : 32 ~ 63
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
#define RESERVE_FOR_FACTORY1 32
|
#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
|
// The spare space available in the original firmware #2
|
||||||
// (Enabled if the EEProm address is insufficient)
|
// (Enabled if the EEProm address is insufficient)
|
||||||
// Address : 64 ~ 100
|
// Address : 64 ~ 100
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
#define RESERVE_FOR_FACTORY2 64 //use Factory backup from Version 1.075
|
#define RESERVE_FOR_FACTORY2 64
|
||||||
#define FACTORY_BACKUP_YN 64 //Check Backup //Magic : 0x13
|
|
||||||
#define FACTORY_VALUES 65 //65 ~ 65 + 32
|
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// KD8CEC EEPROM MAP
|
// KD8CEC EEPROM MAP
|
||||||
@ -72,13 +50,7 @@
|
|||||||
// 256 ~ 1023 (EEProm Section #1)
|
// 256 ~ 1023 (EEProm Section #1)
|
||||||
// 255 ~ 101 (EEProm Section #2)
|
// 255 ~ 101 (EEProm Section #2)
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
#define EXTENDED_KEY_RANGE 196 //Extended Key, KEY RANGE (MODE, BAND+, BAND-, TUNE_STEP, NUM0~NUM9, POINT, ENTER
|
||||||
//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 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 ADVANCED_FREQ_OPTION1 240 //Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency
|
||||||
@ -129,8 +101,7 @@
|
|||||||
|
|
||||||
#define CHANNEL_FREQ 630 //Channel 1 ~ 20, 1 Channel = 4 bytes
|
#define CHANNEL_FREQ 630 //Channel 1 ~ 20, 1 Channel = 4 bytes
|
||||||
#define CHANNEL_DESC 710 //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 RESERVE3 770 //Reserve3 between Channel and Firmware id check
|
||||||
#define EXTERNAL_DEVICE_OPT2 774 //for External Deivce 2byte
|
|
||||||
|
|
||||||
//Check Firmware type and version
|
//Check Firmware type and version
|
||||||
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
|
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.
|
||||||
@ -148,5 +119,3 @@
|
|||||||
#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_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
|
#define CW_STATION_LEN 1023 //value range : 4 ~ 30
|
||||||
|
|
||||||
#endif //end of if header define
|
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#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
|
||||||
@ -28,25 +27,14 @@ 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;
|
||||||
@ -100,3 +88,4 @@ void factory_alignment(){
|
|||||||
updateDisplay();
|
updateDisplay();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
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,7 +1,10 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
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.Some functions moved from uBITX_Ui.
|
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
|
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
|
||||||
@ -17,8 +20,48 @@
|
|||||||
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 "ubitx.h"
|
|
||||||
#include "ubitx_lcd.h"
|
//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
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//Begin of TinyLCD Library by KD8CEC
|
//Begin of TinyLCD Library by KD8CEC
|
||||||
@ -110,6 +153,27 @@ void LCD1602_Init()
|
|||||||
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
LCD_Command(LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LCD_Print(const char *c)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < strlen(c); i++)
|
||||||
|
{
|
||||||
|
if (*(c + i) == 0x00) return;
|
||||||
|
LCD_Write(*(c + i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_SetCursor(uint8_t col, uint8_t row)
|
||||||
|
{
|
||||||
|
LCD_Command(LCD_SETDDRAMADDR | (col + row * 0x40)); //0 : 0x00, 1 : 0x40, only for 16 x 2 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]);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//End of TinyLCD Library by KD8CEC
|
//End of TinyLCD Library by KD8CEC
|
||||||
@ -198,7 +262,7 @@ void backlight(void) {
|
|||||||
void LCD1602_Init()
|
void LCD1602_Init()
|
||||||
{
|
{
|
||||||
//I2C Init
|
//I2C Init
|
||||||
_Addr = I2C_LCD_MASTER_ADDRESS;
|
_Addr = I2C_DISPLAY_ADDRESS;
|
||||||
_cols = 16;
|
_cols = 16;
|
||||||
_rows = 2;
|
_rows = 2;
|
||||||
_backlightval = LCD_NOBACKLIGHT;
|
_backlightval = LCD_NOBACKLIGHT;
|
||||||
@ -244,7 +308,6 @@ void LCD1602_Init()
|
|||||||
backlight();
|
backlight();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void LCD_Print(const char *c)
|
void LCD_Print(const char *c)
|
||||||
{
|
{
|
||||||
for (uint8_t i = 0; i < strlen(c); i++)
|
for (uint8_t i = 0; i < strlen(c); i++)
|
||||||
@ -266,7 +329,6 @@ 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]);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//End of I2CTinyLCD Library by KD8CEC
|
//End of I2CTinyLCD Library by KD8CEC
|
||||||
@ -285,29 +347,6 @@ void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
|||||||
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
|
||||||
|
|
||||||
|
|
||||||
void LCD_Print(const char *c)
|
|
||||||
{
|
|
||||||
for (uint8_t i = 0; i < strlen(c); i++)
|
|
||||||
{
|
|
||||||
if (*(c + i) == 0x00) return;
|
|
||||||
LCD_Write(*(c + i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void LCD_SetCursor(uint8_t col, uint8_t row)
|
|
||||||
{
|
|
||||||
LCD_Command(LCD_SETDDRAMADDR | (col + row * 0x40)); //0 : 0x00, 1 : 0x40, only for 16 x 2 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]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LCD_Init(void)
|
void LCD_Init(void)
|
||||||
{
|
{
|
||||||
LCD1602_Init();
|
LCD1602_Init();
|
||||||
@ -508,7 +547,7 @@ void updateDisplay() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
char line2Buffer[17];
|
char line2Buffer[16];
|
||||||
//KD8CEC 200Hz ST
|
//KD8CEC 200Hz ST
|
||||||
//L14.150 200Hz ST
|
//L14.150 200Hz ST
|
||||||
//U14.150 +150khz
|
//U14.150 +150khz
|
||||||
@ -705,15 +744,19 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
|||||||
|
|
||||||
LCD_SetCursor(drawPosition, lineNumber);
|
LCD_SetCursor(drawPosition, lineNumber);
|
||||||
|
|
||||||
|
//for (int i = 0; i <26; i++) //meter 5 + +db 1 = 6
|
||||||
LCD_Write(lcdMeter[0]);
|
LCD_Write(lcdMeter[0]);
|
||||||
LCD_Write(lcdMeter[1]);
|
LCD_Write(lcdMeter[1]);
|
||||||
LCD_Write(lcdMeter[2]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
byte testValue = 0;
|
||||||
char checkCount = 0;
|
char checkCount = 0;
|
||||||
char checkCountSMeter = 0;
|
char checkCountSMeter = 0;
|
||||||
|
|
||||||
|
int currentSMeter = 0;
|
||||||
|
byte scaledSMeter = 0;
|
||||||
|
|
||||||
void idle_process()
|
void idle_process()
|
||||||
{
|
{
|
||||||
//space for user graphic display
|
//space for user graphic display
|
||||||
@ -733,20 +776,24 @@ void idle_process()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//EX for Meters
|
||||||
|
/*
|
||||||
|
DisplayMeter(0, testValue++, 7);
|
||||||
|
if (testValue > 30)
|
||||||
|
testValue = 0;
|
||||||
|
*/
|
||||||
|
|
||||||
//S-Meter Display
|
//S-Meter Display
|
||||||
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
||||||
{
|
{
|
||||||
int newSMeter;
|
int newSMeter;
|
||||||
|
checkCountSMeter = 0; //Reset Latency time
|
||||||
|
|
||||||
#ifdef USE_I2CSMETER
|
|
||||||
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
|
|
||||||
#else
|
|
||||||
//VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
|
//VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
|
||||||
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
newSMeter = analogRead(ANALOG_SMETER);
|
||||||
|
|
||||||
//Faster attack, Slower release
|
//Faster attack, Slower release
|
||||||
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10) / 4;
|
currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10) / 4;
|
||||||
currentSMeter = newSMeter;
|
|
||||||
|
|
||||||
scaledSMeter = 0;
|
scaledSMeter = 0;
|
||||||
for (byte s = 8; s >= 1; s--) {
|
for (byte s = 8; s >= 1; s--) {
|
||||||
@ -755,10 +802,8 @@ void idle_process()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
DisplayMeter(0, scaledSMeter, 13);
|
DisplayMeter(0, scaledSMeter, 14);
|
||||||
checkCountSMeter = 0; //Reset Latency time
|
|
||||||
} //end of S-Meter
|
} //end of S-Meter
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,727 +0,0 @@
|
|||||||
/*************************************************************************
|
|
||||||
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,7 +1,10 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
KD8CEC's uBITX Display Routine for LCD2004 Parrel & I2C
|
KD8CEC's uBITX Display Routine for LCD2004 Parrel
|
||||||
1.This is the display code for the 20x04 LCD
|
1.This is the display code for the default LCD mounted in uBITX.
|
||||||
2.Some functions moved from uBITX_Ui.
|
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
|
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
|
||||||
@ -17,8 +20,48 @@
|
|||||||
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 "ubitx.h"
|
|
||||||
#include "ubitx_lcd.h"
|
//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
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
//Begin of TinyLCD Library by KD8CEC
|
//Begin of TinyLCD Library by KD8CEC
|
||||||
@ -198,7 +241,7 @@ void backlight(void) {
|
|||||||
void LCD2004_Init()
|
void LCD2004_Init()
|
||||||
{
|
{
|
||||||
//I2C Init
|
//I2C Init
|
||||||
_Addr = I2C_LCD_MASTER_ADDRESS;
|
_Addr = I2C_DISPLAY_ADDRESS;
|
||||||
_cols = 20;
|
_cols = 20;
|
||||||
_rows = 4;
|
_rows = 4;
|
||||||
_backlightval = LCD_NOBACKLIGHT;
|
_backlightval = LCD_NOBACKLIGHT;
|
||||||
@ -282,7 +325,7 @@ void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
|||||||
//#define OPTION_SKINNYBARS
|
//#define OPTION_SKINNYBARS
|
||||||
|
|
||||||
char c[30], b[30];
|
char c[30], b[30];
|
||||||
char printBuff[4][21]; //mirrors what is showing on the two lines of the display
|
char printBuff[4][20]; //mirrors what is showing on the two lines of the display
|
||||||
|
|
||||||
void LCD_Init(void)
|
void LCD_Init(void)
|
||||||
{
|
{
|
||||||
@ -639,16 +682,90 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
|||||||
if (meterType == 0 || meterType == 1 || meterType == 2)
|
if (meterType == 0 || meterType == 1 || meterType == 2)
|
||||||
{
|
{
|
||||||
drawMeter(meterValue);
|
drawMeter(meterValue);
|
||||||
|
//int lineNumber = 0;
|
||||||
|
//if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
//lineNumber = 1;
|
||||||
|
|
||||||
LCD_SetCursor(drawPosition, 2);
|
LCD_SetCursor(drawPosition, 2);
|
||||||
LCD_Write('S');
|
LCD_Write('S');
|
||||||
LCD_Write(':');
|
LCD_Write(':');
|
||||||
for (int i = 0; i < 7; i++) //meter 5 + +db 1 = 6
|
for (int i = 0; i < 6; i++) //meter 5 + +db 1 = 6
|
||||||
LCD_Write(lcdMeter[i]);
|
LCD_Write(lcdMeter[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//meterType : 0 = S.Meter, 1 = Forward Power Meter, 2 = SWR Meter
|
||||||
|
void DisplayMeter(byte meterType, int meterValue, char drawPosition)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef OPTION_SKINNYBARS //We want skinny meter bars with more text/numbers
|
||||||
|
memcpy(&(line2Buffer[drawPosition]), " ", 8); //Blank that section of 8 characters first
|
||||||
|
if (meterType == 0) { //SWR meter
|
||||||
|
drawMeter(meterValue); //Only 2 characters
|
||||||
|
line2Buffer[drawPosition] = 'S';
|
||||||
|
byte sValue = round((float)meterValue * 1.5); //6 bars available only to show 9 S values
|
||||||
|
sValue = sValue > 9 ? 9 : sValue; //Max S9
|
||||||
|
line2Buffer[drawPosition + 1] = '0' + sValue; //0 to 9
|
||||||
|
memcpy(&(line2Buffer[drawPosition + 2]), lcdMeter, 2); //Copy the S-Meter bars
|
||||||
|
//Add the +10, +20, etc...
|
||||||
|
if (meterValue > 6) {
|
||||||
|
//We are over S9
|
||||||
|
line2Buffer[drawPosition + 4] = '+';
|
||||||
|
line2Buffer[drawPosition + 5] = '0' + meterValue - 6; //1,2,3 etc...
|
||||||
|
line2Buffer[drawPosition + 6] = '0';
|
||||||
|
}
|
||||||
|
} else if (meterType == 1) { //Forward Power
|
||||||
|
drawMeter(round((float)meterValue / 40)); //4 watts per bar
|
||||||
|
//meterValue contains power value x 10 (one decimal point)
|
||||||
|
line2Buffer[drawPosition] = 'P';
|
||||||
|
meterValue = meterValue > 999 ? 999 : meterValue; //Limit to 99.9 watts!!!!
|
||||||
|
//Remove decimal value and divide by 10
|
||||||
|
meterValue = round((float)meterValue / 10);
|
||||||
|
if (meterValue < 10) {
|
||||||
|
line2Buffer[drawPosition + 1] = ' ';
|
||||||
|
line2Buffer[drawPosition + 2] = '0' + meterValue; //0 to 9
|
||||||
|
} else {
|
||||||
|
line2Buffer[drawPosition + 1] = '0' + meterValue / 10;
|
||||||
|
line2Buffer[drawPosition + 2] = '0' + (meterValue - ((meterValue / 10) * 10));
|
||||||
|
}
|
||||||
|
line2Buffer[drawPosition + 3] = 'W';
|
||||||
|
memcpy(&(line2Buffer[drawPosition + 4]), lcdMeter, 2); //Copy the S-Meter bars
|
||||||
|
} else { //SWR
|
||||||
|
drawMeter((int)(((float)meterValue - 21) / 100)); //no bar = < 1.2, then 1 bar = 1.2 to 2.2, 2 bars = 2.2 to 3.2, etc...
|
||||||
|
//meterValue contains SWR x 100 (two decimal point)
|
||||||
|
memcpy(&(line2Buffer[drawPosition]), "SWR", 3);
|
||||||
|
meterValue = round((float)meterValue / 10); //We now have swr x 10 (1 decimal point)
|
||||||
|
if (meterValue < 100) { //10 to 99, no decimal point
|
||||||
|
//Draw the decimal value
|
||||||
|
line2Buffer[drawPosition + 3] = '0' + meterValue / 10;
|
||||||
|
line2Buffer[drawPosition + 4] = '.';
|
||||||
|
line2Buffer[drawPosition + 5] = '0' + (meterValue - ((meterValue / 10) * 10));
|
||||||
|
} else {
|
||||||
|
memcpy(&(line2Buffer[drawPosition + 3]), "10+", 3); //over 10
|
||||||
|
}
|
||||||
|
memcpy(&(line2Buffer[drawPosition + 6]), lcdMeter, 2); //Copy the S-Meter bars
|
||||||
|
}
|
||||||
|
#else //We want fat bars, easy to read, with less text/numbers
|
||||||
|
//Serial.print("In displaymeter, meterValue: "); Serial.println(meterValue);
|
||||||
|
drawMeter(meterValue);
|
||||||
|
//Always line 2
|
||||||
|
char sym = 'S';
|
||||||
|
if (meterType == 1) sym = 'P';
|
||||||
|
else if (meterType == 2) sym = 'R'; //For SWR
|
||||||
|
line2Buffer[drawPosition] = sym;
|
||||||
|
memcpy(&(line2Buffer[drawPosition + 1]), lcdMeter, 7);
|
||||||
|
#endif //OPTION_SKINNYBARS
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte testValue = 0;
|
||||||
char checkCount = 0;
|
char checkCount = 0;
|
||||||
|
|
||||||
|
int currentSMeter = 0;
|
||||||
|
//int sMeterLevels[] = {0, 5, 17, 41, 74, 140, 255, 365, 470};
|
||||||
|
byte scaledSMeter = 0;
|
||||||
char checkCountSMeter = 0;
|
char checkCountSMeter = 0;
|
||||||
|
|
||||||
//execute interval : 0.25sec
|
//execute interval : 0.25sec
|
||||||
@ -691,16 +808,11 @@ void idle_process()
|
|||||||
{
|
{
|
||||||
int newSMeter;
|
int newSMeter;
|
||||||
|
|
||||||
#ifdef USE_I2CSMETER
|
|
||||||
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
|
|
||||||
#else
|
|
||||||
//VK2ETA S-Meter from MAX9814 TC pin
|
//VK2ETA S-Meter from MAX9814 TC pin
|
||||||
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
newSMeter = analogRead(ANALOG_SMETER);
|
||||||
|
|
||||||
//Faster attack, Slower release
|
//Faster attack, Slower release
|
||||||
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10);
|
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;
|
scaledSMeter = 0;
|
||||||
for (byte s = 8; s >= 1; s--) {
|
for (byte s = 8; s >= 1; s--) {
|
||||||
@ -709,10 +821,8 @@ void idle_process()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
DisplayMeter(0, scaledSMeter, 0);
|
DisplayMeter(0, scaledSMeter, 0);
|
||||||
checkCountSMeter = 0; //Reset Latency time
|
|
||||||
} //end of S-Meter
|
} //end of S-Meter
|
||||||
|
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -271,10 +271,8 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
|||||||
if (isMemoryToVfo == 1)
|
if (isMemoryToVfo == 1)
|
||||||
{
|
{
|
||||||
if (resultFreq > 3000 && resultFreq < 60000000)
|
if (resultFreq > 3000 && resultFreq < 60000000)
|
||||||
{
|
|
||||||
byteToMode(loadMode, 1);
|
|
||||||
setFrequency(resultFreq);
|
setFrequency(resultFreq);
|
||||||
}
|
byteToMode(loadMode, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -389,14 +387,7 @@ 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
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,21 +403,18 @@ void menuSplitOnOff(int btn){
|
|||||||
else {
|
else {
|
||||||
if (splitOn == 1){
|
if (splitOn == 1){
|
||||||
splitOn = 0;
|
splitOn = 0;
|
||||||
printLineF2(F("SPT Off"));
|
//printLineF2(F("Split Off!"));
|
||||||
|
printLineF2(F("[OFF]"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
splitOn = 1;
|
splitOn = 1;
|
||||||
if (ritOn == 1)
|
if (ritOn == 1)
|
||||||
ritOn = 0;
|
ritOn = 0;
|
||||||
printLineF2(F("SPT On"));
|
//printLineF2(F("Split On!"));
|
||||||
|
printLineF2(F("[ON]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_SW_SERIAL
|
|
||||||
menuOn = 0;
|
|
||||||
#else
|
|
||||||
//Only Clear And Delay for Character LCD
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,19 +430,14 @@ 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,7 +453,7 @@ void menuSDROnOff(int btn)
|
|||||||
else {
|
else {
|
||||||
if (sdrModeOn == 1){
|
if (sdrModeOn == 1){
|
||||||
sdrModeOn = 0;
|
sdrModeOn = 0;
|
||||||
printLineF2(F("SPK MODE"));
|
printLineF2(F("[OFF]"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sdrModeOn = 1;
|
sdrModeOn = 1;
|
||||||
@ -481,19 +464,13 @@ void menuSDROnOff(int btn)
|
|||||||
if (splitOn == 1)
|
if (splitOn == 1)
|
||||||
splitOn = 0;
|
splitOn = 0;
|
||||||
|
|
||||||
printLineF2(F("SDR MODE"));
|
printLineF2(F("[ON]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
EEPROM.put(ENABLE_SDR, sdrModeOn);
|
EEPROM.put(ENABLE_SDR, sdrModeOn);
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
SetCarrierFreq();
|
SetCarrierFreq();
|
||||||
|
|
||||||
#ifdef USE_SW_SERIAL
|
|
||||||
menuOn = 0;
|
|
||||||
#else
|
|
||||||
//Only Clear And Delay for Character LCD
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,9 +496,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -688,10 +665,6 @@ 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();
|
||||||
}
|
}
|
||||||
@ -751,14 +724,7 @@ 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
|
||||||
@ -779,22 +745,44 @@ 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;
|
||||||
@ -805,18 +793,44 @@ 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
|
||||||
@ -835,17 +849,41 @@ 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
|
||||||
@ -863,7 +901,36 @@ 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)
|
||||||
@ -876,13 +943,7 @@ 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -908,15 +969,7 @@ 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
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -943,10 +996,44 @@ 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;
|
||||||
@ -965,14 +1052,9 @@ 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -985,11 +1067,46 @@ void menuSetupKeyType(int 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);
|
||||||
@ -1005,19 +1122,12 @@ 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 Set by Knob for reduce Program Memory
|
//END OF STANDARD Tune Setup for reduce Program Memory
|
||||||
//=====================================================
|
//=====================================================
|
||||||
|
|
||||||
|
|
||||||
@ -1112,191 +1222,7 @@ 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();
|
||||||
@ -1391,10 +1317,9 @@ 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
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************************
|
//*************************************************************************************
|
||||||
@ -1433,14 +1358,7 @@ 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1471,16 +1389,12 @@ 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
|
||||||
@ -1662,15 +1576,6 @@ 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);
|
||||||
@ -1714,3 +1619,4 @@ 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,8 +48,7 @@
|
|||||||
#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
|
||||||
@ -59,13 +58,7 @@ uint8_t SI5351BX_ADDR; // I2C address of Si5351 (variable f
|
|||||||
// 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;
|
||||||
|
|
||||||
@ -99,18 +92,6 @@ 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
|
||||||
@ -146,9 +127,7 @@ 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)
|
||||||
@ -188,3 +167,6 @@ void TXSubFreq(unsigned long P2)
|
|||||||
i2cWrite(40, (P2 & 65280) >> 8);
|
i2cWrite(40, (P2 & 65280) >> 8);
|
||||||
i2cWrite(41, P2 & 255);
|
i2cWrite(41, P2 & 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ void initMeter(){
|
|||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 48);
|
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 48);
|
||||||
LCD_CreateChar(7, tmpbytes);
|
LCD_CreateChar(6, tmpbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -128,23 +128,13 @@ void drawMeter(int needle)
|
|||||||
{
|
{
|
||||||
#ifdef OPTION_SKINNYBARS
|
#ifdef OPTION_SKINNYBARS
|
||||||
//Fill buffer with growing set of bars, up to needle value
|
//Fill buffer with growing set of bars, up to needle value
|
||||||
lcdMeter[0] = 0x20;
|
|
||||||
lcdMeter[1] = 0x20;
|
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
if (needle > i)
|
if (needle > i)
|
||||||
lcdMeter[i / 3] = byte(i + 1); //Custom characters above
|
lcdMeter[i / 3] = byte(i + 1); //Custom characters above
|
||||||
//else if (i == 1 || i == 4) {
|
else if (i == 1 || i == 4) {
|
||||||
// lcdMeter[i / 3] = 0x20; //blank
|
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
|
#else //Must be "fat" bars
|
||||||
//Fill buffer with growing set of bars, up to needle value
|
//Fill buffer with growing set of bars, up to needle value
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
@ -153,13 +143,11 @@ void drawMeter(int needle)
|
|||||||
else
|
else
|
||||||
lcdMeter[i] = 0x20; //blank
|
lcdMeter[i] = 0x20; //blank
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needle > 7) {
|
if (needle > 7) {
|
||||||
lcdMeter[6] = byte(7); //Custom character "++"
|
lcdMeter[6] = byte(7); //Custom character "++"
|
||||||
} else if (needle > 6) {
|
} else if (needle > 6) {
|
||||||
lcdMeter[6] = '+'; //"+"
|
lcdMeter[6] = 0x2B; //"+"
|
||||||
} else lcdMeter[6] = 0x20;
|
} else lcdMeter[6] = 0x20;
|
||||||
|
|
||||||
#endif //OPTION_FATBARS
|
#endif //OPTION_FATBARS
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,12 +184,9 @@ int getBtnStatus(void){
|
|||||||
return FKEY_PRESS;
|
return FKEY_PRESS;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
readButtonValue = readButtonValue / 4;
|
|
||||||
//return FKEY_VFOCHANGE;
|
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
if (KeyValues[i][2] != 0 && KeyValues[i][0] <= readButtonValue && KeyValues[i][1] >= readButtonValue)
|
if (KeyValues[i][0] <= readButtonValue && KeyValues[i][1] >= readButtonValue)
|
||||||
return KeyValues[i][2];
|
return i;
|
||||||
//return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -268,32 +253,4 @@ 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,6 +6,8 @@ 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
|
||||||
@ -34,6 +36,7 @@ unsigned long TX_P2; // Variable values for MSNB_P2 which defines the frequen
|
|||||||
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
|
||||||
|
|
||||||
@ -71,14 +74,13 @@ 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);
|
||||||
|
|
||||||
@ -112,9 +114,22 @@ 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);
|
||||||
@ -122,39 +137,18 @@ 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);
|
||||||
//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] = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
#endif
|
//printLineF1(F("Transmitting"));
|
||||||
//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
|
||||||
|
Loading…
Reference in New Issue
Block a user