Merge pull request #40 from phdlee/version1.098

Version1.098
This commit is contained in:
phdlee 2018-08-10 16:08:13 +09:00 committed by GitHub
commit 948267bb39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 2045 additions and 347 deletions

View File

@ -252,12 +252,35 @@ void ReadEEPRom() //for remove warnings.
Serial.write(0x02); //STX
checkSum = 0x02;
for (uint16_t i = 0; i < eepromReadLength; i++)
//I2C Scanner
//Magic Key Start 59414, Length : 48583
//if (eepromStartIndex == 59414 && eepromReadLength == 48583)
if (CAT_BUFF[0] == 0x16 && CAT_BUFF[1] == 0xe8)
{
read1Byte = EEPROM.read(eepromStartIndex + i);
checkSum += read1Byte;
Serial.write(read1Byte);
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++)
{
read1Byte = EEPROM.read(eepromStartIndex + i);
checkSum += read1Byte;
Serial.write(read1Byte);
}
}
Serial.write(checkSum);
Serial.write(ACK);
}

View File

@ -235,30 +235,6 @@ void sendCWChar(char cwKeyChar)
}
}
/*
void sendAutoCW(int cwSendLength, char *sendString)
{
byte i;
if (!inTx){
keyDown = 0;
cwTimeout = millis() + cwDelayTime * 10;
startTx(TX_CW, 0); //disable updateDisplay Command for reduce latency time
updateDisplay();
delay_background(delayBeforeCWStartTime * 2, 2);
}
for (i = 0; i < cwSendLength; i++)
{
sendCWChar(sendString[i]);
if (i != cwSendLength -1) delay_background(cwSpeed * 3, 3);
}
delay_background(cwDelayTime * 10, 2);
stopTx();
}
*/
byte isNeedScroll = 0;
unsigned long scrollDispayTime = 0;
#define scrollSpeed 500
@ -296,18 +272,19 @@ void controlAutoCW(){
{
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);
//byte diplayAutoCWLine = 0;
//if ((displayOption1 & 0x01) == 0x01)
// diplayAutoCWLine = 1;
Display_AutoKeyTextIndex(selectedCWTextIndex);
//lcd.setCursor(0, diplayAutoCWLine);
//lcd.write(byteToChar(selectedCWTextIndex));
//lcd.write(':');
isNeedScroll = (cwEndIndex - cwStartIndex) > 14 ? 1 : 0;
Display_AutoKeyTextIndex(selectedCWTextIndex);
#endif
scrollDispayTime = millis() + scrollSpeed;
beforeCWTextIndex = selectedCWTextIndex;
}

View File

@ -0,0 +1,334 @@
/*
Softserial for Nextion LCD and Control MCU
KD8CEC, Ian Lee
-----------------------------------------------------------------------
It is a library rewritten in C format based on SoftwareSerial.c.
I tried to use as much as possible without modifying the SoftwareSerial.
But eventually I had to modify the code.
I rewrote it in C for the following reasons.
- Problems occurred when increasing Program Size and Program Memory
- We had to reduce the program size.
Of course, Software Serial is limited to one.
- reduce the steps for transmitting and receiving
useage
extern void SWSerial_Begin(long speedBaud);
extern void SWSerial_Write(uint8_t b);
extern int SWSerial_Available(void);
extern int SWSerial_Read(void);
extern void SWSerial_Print(uint8_t *b);
If you use Softwreserial library instead of this library, you can modify the code as shown below.
I kept the function name of SoftwareSerial so you only need to modify a few lines of code.
define top of source code
#include <SoftwareSerial.h>
SoftwareSerial sSerial(10, 11); // RX, TX
replace source code
SWSerial_Begin to sSerial.begin
SWSerial_Write to sSerial.write
SWSerial_Available to sSerial.available
SWSerial_Read to sSerial.read
KD8CEC, Ian Lee
-----------------------------------------------------------------------
License
All licenses for the source code are subject to the license of the original source SoftwareSerial Library.
However, if you use or modify this code, please keep the all comments in this source code.
KD8CEC
-----------------------------------------------------------------------
License from SoftwareSerial
-----------------------------------------------------------------------
SoftwareSerial.cpp (formerly NewSoftSerial.cpp) -
Multi-instance software serial library for Arduino/Wiring
-- Interrupt-driven receive and other improvements by ladyada
(http://ladyada.net)
-- Tuning, circular buffer, derivation from class Print/Stream,
multi-instance support, porting to 8MHz processors,
various optimizations, PROGMEM delay tables, inverse logic and
direct port writing by Mikal Hart (http://www.arduiniana.org)
-- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com)
-- 20MHz processor support by Garrett Mace (http://www.macetech.com)
-- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
The latest version of this library can always be found at
http://arduiniana.org.
*/
#include <arduino.h>
//================================================================
//Public Variable
//================================================================
#define TX_PIN 9
#define RX_PIN 8
#define _SS_MAX_RX_BUFF 35 // RX buffer size
#define PRINT_MAX_LENGTH 30
//================================================================
//Internal Variable from SoftwareSerial.c and SoftwareSerial.h
//================================================================
//variable from softwareserial.c and softwareserial.h
static uint8_t swr_receive_buffer[_SS_MAX_RX_BUFF];
volatile uint8_t *_transmitPortRegister; //Write Port Register
uint8_t transmit_RegMask; //use Mask bit 1
uint8_t transmit_InvMask; //use mask bit 0
volatile uint8_t *_receivePortRegister; //Read Port Register
uint8_t _receiveBitMask;
//delay value for Bit
uint16_t _tx_delay;
//delay value for Receive
uint16_t _rx_delay_stopbit;
uint16_t _rx_delay_centering;
uint16_t _rx_delay_intrabit;
//Customize for uBITX Protocol
int8_t receiveIndex = 0;
uint8_t receivedCommandLength = 0;
int8_t ffCount = 0;
//Values for Receive Buffer
//uint16_t _buffer_overflow;
//static volatile uint8_t _receive_buffer_head;
//static volatile uint8_t _receive_buffer_tail;
//Values for Interrupt (check Start Bit)
volatile uint8_t *_pcint_maskreg;
uint8_t _pcint_maskvalue;
//================================================================
//Internal Function from SoftwareSerial.c
//================================================================
uint16_t subtract_cap(uint16_t num, uint16_t sub)
{
if (num > sub)
return num - sub;
else
return 1;
}
inline void tunedDelay(uint16_t delay)
{
_delay_loop_2(delay);
}
void setRxIntMsk(bool enable)
{
if (enable)
*_pcint_maskreg |= _pcint_maskvalue;
else
*_pcint_maskreg &= ~_pcint_maskvalue;
}
uint8_t rx_pin_read()
{
return *_receivePortRegister & _receiveBitMask;
}
//
// The receive routine called by the interrupt handler
//
void softSerail_Recv()
{
#if GCC_VERSION < 40302
// Work-around for avr-gcc 4.3.0 OSX version bug
// Preserve the registers that the compiler misses
// (courtesy of Arduino forum user *etracer*)
asm volatile(
"push r18 \n\t"
"push r19 \n\t"
"push r20 \n\t"
"push r21 \n\t"
"push r22 \n\t"
"push r23 \n\t"
"push r26 \n\t"
"push r27 \n\t"
::);
#endif
uint8_t d = 0;
// If RX line is high, then we don't see any start bit
// so interrupt is probably not for us
if (!rx_pin_read()) //Start Bit
{
// Disable further interrupts during reception, this prevents
// triggering another interrupt directly after we return, which can
// cause problems at higher baudrates.
setRxIntMsk(false);
// Wait approximately 1/2 of a bit width to "center" the sample
tunedDelay(_rx_delay_centering);
// Read each of the 8 bits
for (uint8_t i=8; i > 0; --i)
{
tunedDelay(_rx_delay_intrabit);
d >>= 1;
if (rx_pin_read())
d |= 0x80;
}
if (receivedCommandLength == 0) //check Already Command
{
//Set Received Data
swr_receive_buffer[receiveIndex++] = d;
//Finded Command
if (d == 0x73 && ffCount > 1 && receiveIndex > 6)
{
receivedCommandLength = receiveIndex;
receiveIndex = 0;
ffCount = 0;
}
else if (receiveIndex > _SS_MAX_RX_BUFF)
{
//Buffer Overflow
receiveIndex = 0;
ffCount = 0;
}
else if (d == 0xFF)
{
ffCount++;
}
else
{
ffCount = 0;
}
}
// skip the stop bit
tunedDelay(_rx_delay_stopbit);
// Re-enable interrupts when we're sure to be inside the stop bit
setRxIntMsk(true);
}
#if GCC_VERSION < 40302
// Work-around for avr-gcc 4.3.0 OSX version bug
// Restore the registers that the compiler misses
asm volatile(
"pop r27 \n\t"
"pop r26 \n\t"
"pop r23 \n\t"
"pop r22 \n\t"
"pop r21 \n\t"
"pop r20 \n\t"
"pop r19 \n\t"
"pop r18 \n\t"
::);
#endif
}
ISR(PCINT0_vect)
{
softSerail_Recv();
}
//================================================================
//Public Function from SoftwareSerial.c and modified and create
//================================================================
// Read data from buffer
void SWSerial_Read(uint8_t * receive_cmdBuffer)
{
for (int i = 0; i < receivedCommandLength; i++)
receive_cmdBuffer[i] = swr_receive_buffer[i];
}
void SWSerial_Write(uint8_t b)
{
volatile uint8_t *reg = _transmitPortRegister;
uint8_t oldSREG = SREG;
uint16_t delay = _tx_delay;
cli(); // turn off interrupts for a clean txmit
// Write the start bit
*reg &= transmit_InvMask;
tunedDelay(delay);
// Write each of the 8 bits
for (uint8_t i = 8; i > 0; --i)
{
if (b & 1) // choose bit
*reg |= transmit_RegMask; // send 1
else
*reg &= transmit_InvMask; // send 0
tunedDelay(delay);
b >>= 1;
}
// restore pin to natural state
*reg |= transmit_RegMask;
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
}
void SWSerial_Print(uint8_t *b)
{
for (int i = 0; i < PRINT_MAX_LENGTH; i++)
{
if (b[i] == 0x00)
break;
else
SWSerial_Write(b[i]);
}
}
void SWSerial_Begin(long speedBaud)
{
//INT TX_PIN
digitalWrite(TX_PIN, HIGH);
pinMode(TX_PIN, OUTPUT);
transmit_RegMask = digitalPinToBitMask(TX_PIN); //use Bit 1
transmit_InvMask = ~digitalPinToBitMask(TX_PIN); //use Bit 0
_transmitPortRegister = portOutputRegister(digitalPinToPort(TX_PIN));
//INIT RX_PIN
pinMode(RX_PIN, INPUT);
digitalWrite(RX_PIN, HIGH); // pullup for normal logic!
_receiveBitMask = digitalPinToBitMask(RX_PIN);
_receivePortRegister = portInputRegister(digitalPinToPort(RX_PIN));
//Set Values
uint16_t bit_delay = (F_CPU / speedBaud) / 4;
_tx_delay = subtract_cap(bit_delay, 15 / 4);
if (digitalPinToPCICR(RX_PIN))
{
_rx_delay_centering = subtract_cap(bit_delay / 2, (4 + 4 + 75 + 17 - 23) / 4);
_rx_delay_intrabit = subtract_cap(bit_delay, 23 / 4);
_rx_delay_stopbit = subtract_cap(bit_delay * 3 / 4, (37 + 11) / 4);
*digitalPinToPCICR(RX_PIN) |= _BV(digitalPinToPCICRbit(RX_PIN));
_pcint_maskreg = digitalPinToPCMSK(RX_PIN);
_pcint_maskvalue = _BV(digitalPinToPCMSKbit(RX_PIN));
tunedDelay(_tx_delay); // if we were low this establishes the end
}
//Start Listen
setRxIntMsk(true);
}

View File

@ -24,14 +24,19 @@
//==============================================================================
//Depending on the type of LCD mounted on the uBITX, uncomment one of the options below.
//You must select only one.
#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX (Parallel)
//#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX (Parallel)
//#define UBITX_DISPLAY_LCD1602I //I2C type 16 x 02 LCD
//#define UBITX_DISPLAY_LCD1602I_DUAL //I2C type 16 x02 LCD Dual
//#define UBITX_DISPLAY_LCD2004P //24 x 04 LCD (Parallel)
//#define UBITX_DISPLAY_LCD2004I //I2C type 24 x 04 LCD
#define UBITX_DISPLAY_LCD2004I //I2C type 24 x 04 LCD
//#define UBITX_DISPLAY_NEXTION //NEXTION LCD
#define I2C_LCD_MASTER_ADDRESS_DEFAULT 0x3F //0x27 //DEFAULT, if Set I2C Address by uBITX Manager, read from EEProm
#define I2C_LCD_SECOND_ADDRESS_DEFAULT 0x27 //0x27 //only using Dual LCD Mode
//#define UBITX_DISPLAY_NEXTION_SAFE //Only EEProm Write 770~775
#define I2C_LCD_MASTER_ADDRESS_DEFAULT 0x27 //0x27 //DEFAULT, if Set I2C Address by uBITX Manager, read from EEProm
#define I2C_LCD_SECOND_ADDRESS_DEFAULT 0x3F //0x27 //only using Dual LCD Mode
//Select betwen Analog S-Meter and DSP (I2C) Meter
#define USE_I2CSMETER
#define EXTEND_KEY_GROUP1 //MODE, BAND(-), BAND(+), STEP
//#define EXTEND_KEY_GROUP2 //Numeric (0~9), Point(.), Enter //Not supported in Version 1.0x
@ -42,9 +47,116 @@
extern byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
#define SMeterLatency 3 //1 is 0.25 sec
//==============================================================================
// User Select feather list
//==============================================================================
//Enable all features
#define FN_BAND 1 //592
#define FN_VFO_TOGGLE 1 //78
#define FN_MODE 1 //20
#define FN_RIT 1 //58
#define FN_SPLIT 1 //62
#define FN_IFSHIFT 1 //238
#define FN_ATT 1 //128
#define FN_CW_SPEED 1 //152
#define FN_VFOTOMEM 1 //254
#define FN_MEMTOVFO 1 //188
#define FN_MEMORYKEYER 1 //156
#define FN_WSPR 1 //1044
#define FN_SDRMODE 1 //68
#define FN_CALIBRATION 1 //666
#define FN_CARRIER 1 //382
#define FN_CWCARRIER 1 //346
#define FN_CWTONE 1 //148
#define FN_CWDELAY 1 //98
#define FN_TXCWDELAY 1 //94
#define FN_KEYTYPE 1 //168
#define FN_ADCMONITOR 1 //516
#define FN_TXONOFF 1 //58
/*
//Test Configuration (88%)
#define FN_BAND 0 //592
#define FN_VFO_TOGGLE 0 //78
#define FN_MODE 0 //20
#define FN_RIT 0 //58
#define FN_SPLIT 0 //62
#define FN_IFSHIFT 0 //238
#define FN_ATT 0 //128
#define FN_CW_SPEED 1 //152
#define FN_VFOTOMEM 0 //254
#define FN_MEMTOVFO 0 //188
#define FN_MEMORYKEYER 1 //156
#define FN_WSPR 0 //1044
#define FN_SDRMODE 1 //68
#define FN_CALIBRATION 1 //666
#define FN_CARRIER 1 //382
#define FN_CWCARRIER 1 //346
#define FN_CWTONE 1 //148
#define FN_CWDELAY 1 //98
#define FN_TXCWDELAY 1 //94
#define FN_KEYTYPE 1 //168
#define FN_ADCMONITOR 1 //516
#define FN_TXONOFF 1 //58
*/
/*
//Recommended Character LCD Developer 87%
#define FN_BAND 1 //592
#define FN_VFO_TOGGLE 1 //78
#define FN_MODE 1 //20
#define FN_RIT 1 //58
#define FN_SPLIT 1 //62
#define FN_IFSHIFT 1 //238
#define FN_ATT 0 //128
#define FN_CW_SPEED 0 //152 //using MM
#define FN_VFOTOMEM 1 //254
#define FN_MEMTOVFO 1 //188
#define FN_MEMORYKEYER 1 //156
#define FN_WSPR 1 //1044
#define FN_SDRMODE 1 //68
#define FN_CALIBRATION 0 //667 //using MM
#define FN_CARRIER 0 //382 //using MM
#define FN_CWCARRIER 0 //346 //using MM
#define FN_CWTONE 0 //148 //using MM
#define FN_CWDELAY 0 //98 //using MM
#define FN_TXCWDELAY 0 //94 //using MM
#define FN_KEYTYPE 0 //168 //using MM
#define FN_ADCMONITOR 0 //516 //using MM
#define FN_TXONOFF 1 //58
*/
/*
//Recommended for Nextion, TJC LCD 88%
#define FN_BAND 1 //600
#define FN_VFO_TOGGLE 1 //90
#define FN_MODE 1 //318
#define FN_RIT 1 //62
#define FN_SPLIT 1 //2
#define FN_IFSHIFT 1 //358
#define FN_ATT 1 //250
#define FN_CW_SPEED 0 //286
#define FN_VFOTOMEM 0 //276
#define FN_MEMTOVFO 0 //234
#define FN_MEMORYKEYER 1 //168
#define FN_WSPR 1 //1130
#define FN_SDRMODE 1 //70
#define FN_CALIBRATION 0 //790
#define FN_CARRIER 0 //500
#define FN_CWCARRIER 0 //464
#define FN_CWTONE 0 //158
#define FN_CWDELAY 0 //108
#define FN_TXCWDELAY 0 //106
#define FN_KEYTYPE 0 //294
#define FN_ADCMONITOR 0 //526 //not available with Nextion or Serial UI
#define FN_TXONOFF 1 //70
*/
//==============================================================================
// End of User Select Mode and Compil options
//==============================================================================
#ifdef UBITX_DISPLAY_LCD1602I
#define USE_I2C_LCD
#elif defined(UBITX_DISPLAY_LCD1602I_DUAL)
@ -53,6 +165,17 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
#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
//==============================================================================
@ -64,7 +187,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
* either as an analog input, a digital input or a digital output.
* The pins are assigned as follows (left to right, display facing you):
* Pin 1 (Violet), A7, SPARE
* Pin 1 (Violet), A7, SPARE => Analog S-Meter
* Pin 2 (Blue), A6, KEYER (DATA)
* Pin 3 (Green), +5v
* Pin 4 (Yellow), Gnd
@ -94,7 +217,7 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
* The second set of 16 pins on the Raduino's bottom connector are have the three clock outputs and the digital lines to control the rig.
* This assignment is as follows :
* Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
* GND +5V CLK0 GND GND CLK1 GND GND CLK2 GND D2 D3 D4 D5 D6 D7
* GND +5V CLK2 GND GND CLK1 GND GND CLK0 GND D2 D3 D4 D5 D6 D7
* These too are flexible with what you may do with them, for the Raduino, we use them to :
* - TX_RX line : Switches between Transmit and Receive after sensing the PTT or the morse keyer
* - CW_KEY line : turns on the carrier for CW
@ -106,6 +229,24 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
#define TX_LPF_C (3) //Relay
#define CW_KEY (2)
//******************************************************
//DSP (I2C) Meter
//******************************************************
//S-Meter Address
#define I2CMETER_ADDR 0x58
//VALUE TYPE============================================
//Signal
#define I2CMETER_CALCS 0x59 //Calculated Signal Meter
#define I2CMETER_UNCALCS 0x58 //Uncalculated Signal Meter
//Power
#define I2CMETER_CALCP 0x57 //Calculated Power Meter
#define I2CMETER_UNCALCP 0x56 //UnCalculated Power Meter
//SWR
#define I2CMETER_CALCR 0x55 //Calculated SWR Meter
#define I2CMETER_UNCALCR 0x54 //Uncalculated SWR Meter
//==============================================================================
// for public, Variable, functions
//==============================================================================
@ -146,6 +287,8 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
#define FKEY_TYPE_MAX 0x1F
extern uint8_t SI5351BX_ADDR; //change typical -> variable at Version 1.097, address read from eeprom, default value is 0x60
//EEProm Address : 63
extern unsigned long frequency;
extern byte WsprMSGCount;
extern byte sMeterLevels[9];
@ -153,6 +296,7 @@ extern int currentSMeter; //ADC Value for S.Meter
extern byte scaledSMeter; //Calculated S.Meter Level
extern byte KeyValues[16][3]; //Set : Start Value, End Value, Key Type, 16 Set (3 * 16 = 48)
extern byte TriggerBySW; //Action Start from Nextion LCD, Other MCU
extern void printLine1(const char *c);
extern void printLine2(const char *c);
@ -179,6 +323,9 @@ extern char byteToChar(byte srcByte);
extern void DisplayCallsign(byte callSignLength);
extern void DisplayVersionInfo(const char* fwVersionInfo);
//I2C Signal Meter, Version 1.097
extern int GetI2CSmeterValue(int valueType); //ubitx_ui.ino
#endif //end of if header define

View File

@ -1,4 +1,4 @@
//Firmware Version
//Firmware Version
//+ : This symbol identifies the firmware.
// It was originally called 'CEC V1.072' but it is too long to waste the LCD window.
// I do not want to make this Firmware users's uBITX messy with my callsign.
@ -6,8 +6,8 @@
// So I put + in the sense that it was improved one by one based on Original Firmware.
// This firmware has been gradually changed based on the original firmware created by Farhan, Jack, Jerry and others.
#define FIRMWARE_VERSION_INFO F("+v1.080")
#define FIRMWARE_VERSION_NUM 0x03 //1st Complete Project : 1 (Version 1.061), 2st Project : 2
#define FIRMWARE_VERSION_INFO F("+v1.097")
#define FIRMWARE_VERSION_NUM 0x04 //1st Complete Project : 1 (Version 1.061), 2st Project : 2, 1.08: 3, 1.09 : 4
/**
Cat Suppoort uBITX CEC Version
@ -192,7 +192,9 @@ byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
byte KeyValues[16][3];
byte isIFShift = 0; //1 = ifShift, 2 extend
int ifShiftValue = 0; //
int ifShiftValue = 0; //
byte TriggerBySW = 0; //Action Start from Nextion LCD, Other MCU
/**
* Below are the basic functions that control the uBitx. Understanding the functions before
@ -465,13 +467,17 @@ void startTx(byte txMode, byte isDisplayUpdate){
}
else
{
if (splitOn == 1) {
if (vfoActive == VFO_B) {
if (splitOn == 1)
{
FrequencyToVFO(1); //Save current Frequency and Mode to eeprom
if (vfoActive == VFO_B)
{
vfoActive = VFO_A;
frequency = vfoA;
byteToMode(vfoA_mode, 0);
}
else if (vfoActive == VFO_A){
else if (vfoActive == VFO_A)
{
vfoActive = VFO_B;
frequency = vfoB;
byteToMode(vfoB_mode, 0);
@ -602,7 +608,18 @@ void checkButton(){
return;
if (keyStatus == FKEY_PRESS) //Menu Key
{
//for touch screen
#ifdef USE_SW_SERIAL
SetSWActivePage(1);
doMenu();
if (isCWAutoMode == 0)
SetSWActivePage(0);
#else
doMenu();
#endif
}
else if (keyStatus <= FKEY_TYPE_MAX) //EXTEND KEY GROUP #1
{
@ -665,74 +682,7 @@ void checkButton(){
menuRitToggle(1);
break;
}
/*
if (keyStatus == FKEY_MODE) //Press Mode Key
{
if (cwMode == 1)
{
cwMode = 2;
}
else if (cwMode == 2)
{
cwMode = 0;
isUSB = 0;
}
else if (isUSB == 0)
{
isUSB = 1;
}
else
{
cwMode = 1;
}
}
else if (keyStatus == FKEY_BANDUP || keyStatus == FKEY_BANDDOWN) //Press Mode Key
{
char currentBandIndex = -1;
//Save Band Information
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
currentBandIndex = getIndexHambanBbyFreq(frequency);
if (currentBandIndex >= 0) {
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
}
}
setNextHamBandFreq(frequency, keyStatus == FKEY_BANDDOWN ? -1 : 1); //Prior Band
}
else if (keyStatus == FKEY_STEP) //FKEY_BANDUP
{
if (++tuneStepIndex > 5)
tuneStepIndex = 1;
EEPROM.put(TUNING_STEP, tuneStepIndex);
printLine2ClearAndUpdate();
}
else if (keyStatus == FKEY_VFOCHANGE)
{
menuVfoToggle(1); //Vfo Toggle
}
else if (keyStatus == FKEY_SPLIT)
{
menuSplitOnOff(1);
}
else if (keyStatus == FKEY_TXOFF)
{
menuTxOnOff(1, 0x01);
}
else if (keyStatus == FKEY_SDRMODE)
{
menuSDROnOff(1);
}
else if (keyStatus == FKEY_RIT)
{
menuRitToggle(1);
}
*/
FrequencyToVFO(1);
SetCarrierFreq();
setFrequency(frequency);
@ -941,6 +891,15 @@ void initSettings(){
if (EEPROM.read(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) {
@ -1294,11 +1253,18 @@ void setup()
Init_Cat(38400, SERIAL_8N1);
initSettings();
initPorts();
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) {
#ifdef USE_SW_SERIAL
// if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80))
// {
userCallsignLength = userCallsignLength & 0x7F;
// }
#else
//for Chracter LCD
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80))
{
userCallsignLength = userCallsignLength & 0x7F;
//printLineFromEEPRom(0, 0, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
//delay(500);
DisplayCallsign(userCallsignLength);
}
else {
@ -1306,8 +1272,7 @@ void setup()
delay(500);
clearLine2();
}
initPorts();
#endif
#ifdef FACTORY_RECOVERY_BOOTUP
if (btnDown())
@ -1320,6 +1285,11 @@ void setup()
frequency = vfoA;
saveCheckFreq = frequency; //for auto save frequency
setFrequency(vfoA);
#ifdef USE_SW_SERIAL
SendUbitxData();
#endif
updateDisplay();
#ifdef ENABLE_FACTORYALIGN
@ -1383,4 +1353,9 @@ void loop(){
//we check CAT after the encoder as it might put the radio into TX
Check_Cat(inTx? 1 : 0);
//for SEND SW Serial
#ifdef USE_SW_SERIAL
SWS_Process();
#endif
}

View File

@ -35,10 +35,13 @@
//==============================================================================
// The spare space available in the original firmware #1
// Address : 32 ~ 63
// Address : 32 ~ 62
//==============================================================================
#define RESERVE_FOR_FACTORY1 32
//SI5351 I2C Address (Version 1.097)
#define I2C_ADDR_SI5351 63
//==============================================================================
// The spare space available in the original firmware #2
// (Enabled if the EEProm address is insufficient)
@ -112,7 +115,8 @@
#define CHANNEL_FREQ 630 //Channel 1 ~ 20, 1 Channel = 4 bytes
#define CHANNEL_DESC 710 //Channel 1 ~ 20, 1 Channel = 4 bytes
#define RESERVE3 770 //Reserve3 between Channel and Firmware id check
#define EXTERNAL_DEVICE_OPT1 770 //for External Deivce 4byte
#define EXTERNAL_DEVICE_OPT2 774 //for External Deivce 2byte
//Check Firmware type and version
#define FIRMWAR_ID_ADDR 776 //776 : 0x59, 777 :0x58, 778 : 0x68 : Id Number, if not found id, erase eeprom(32~1023) for prevent system error.

View File

@ -738,6 +738,9 @@ void idle_process()
{
int newSMeter;
#ifdef USE_I2CSMETER
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
#else
//VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
newSMeter = analogRead(ANALOG_SMETER) / 4;
@ -752,6 +755,7 @@ void idle_process()
break;
}
}
#endif
DisplayMeter(0, scaledSMeter, 13);
checkCountSMeter = 0; //Reset Latency time

View File

@ -669,6 +669,9 @@ void idle_process()
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;
@ -684,9 +687,9 @@ void idle_process()
break;
}
}
#endif
DisplayMeter(0, scaledSMeter, 0);
checkCountSMeter = 0;
} //end of S-Meter
_Addr = I2C_LCD_MASTER_ADDRESS;

View File

@ -690,7 +690,10 @@ void idle_process()
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
{
int newSMeter;
#ifdef USE_I2CSMETER
scaledSMeter = GetI2CSmeterValue(I2CMETER_CALCS);
#else
//VK2ETA S-Meter from MAX9814 TC pin
newSMeter = analogRead(ANALOG_SMETER) / 4;
@ -706,6 +709,7 @@ void idle_process()
break;
}
}
#endif
DisplayMeter(0, scaledSMeter, 0);
checkCountSMeter = 0; //Reset Latency time

File diff suppressed because it is too large Load Diff

View File

@ -389,7 +389,14 @@ void menuVfoToggle(int btn)
ritDisable();
setFrequency(frequency);
menuClearExit(0);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(0);
#endif
}
}
@ -406,17 +413,20 @@ void menuSplitOnOff(int btn){
if (splitOn == 1){
splitOn = 0;
printLineF2(F("SPT Off"));
//printLineF2(F("[OFF]"));
}
else {
splitOn = 1;
if (ritOn == 1)
ritOn = 0;
printLineF2(F("SPT On"));
//printLineF2(F("[ON]"));
}
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(500);
#endif
}
}
@ -438,8 +448,13 @@ void menuTxOnOff(int btn, byte optionType){
isTxType &= ~(optionType);
printLineF2(F("TX ON"));
}
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(500);
#endif
}
}
@ -472,7 +487,13 @@ void menuSDROnOff(int btn)
EEPROM.put(ENABLE_SDR, sdrModeOn);
setFrequency(frequency);
SetCarrierFreq();
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(500);
#endif
}
}
@ -498,9 +519,9 @@ void menuCWAutoKey(int btn){
printLineF1(F("PTT to Send"));
delay_background(500, 0);
updateDisplay();
beforeCWTextIndex = 255; //255 value is for start check
isCWAutoMode = 1;
updateDisplay();
menuOn = 0;
}
@ -666,7 +687,11 @@ int getValueByKnob(int valueType, int targetValue, int minKnobValue, int maxKnob
ifShiftValue = targetValue;
else
attLevel = targetValue;
#ifdef USE_SW_SERIAL
menuOn=2;
updateDisplay();
#endif
setFrequency(frequency);
SetCarrierFreq();
}
@ -726,7 +751,14 @@ void menuCWSpeed(int btn){
//printLineF2(F("CW Speed set!"));
cwSpeed = 1200 / wpm;
EEPROM.put(CW_SPEED, cwSpeed);
menuClearExit(1000);
//menuClearExit(1000);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(1000);
#endif
}
//Modified by KD8CEC
@ -747,44 +779,22 @@ void menuSetupCwTone(int btn){
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);
//save the setting
//if (digitalRead(PTT) == LOW){
printLineF2(F("Sidetone set!"));
EEPROM.put(CW_SIDETONE, sideTone);
delay_background(2000, 0);
//}
//else
// sideTone = prev_sideTone;
menuClearExit(0);
printLineF2(F("Sidetone set!"));
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);
menuClearExit(0);
#endif
}
//Modified by KD8CEC
void menuSetupCwDelay(int btn){
//int knob = 0;
@ -795,44 +805,18 @@ void menuSetupCwDelay(int btn){
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
/*
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
//printLineF2(F("CW Delay set!"));
cwDelayTime = tmpCWDelay / 10;
EEPROM.put(CW_DELAY, cwDelayTime);
menuClearExit(1000);
//menuClearExit(1000);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(1000);
#endif
}
//CW Time delay by KD8CEC
@ -851,41 +835,17 @@ void menuSetupTXCWInterval(int btn){
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;
EEPROM.put(CW_START, delayBeforeCWStartTime);
//menuClearExit(1000);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(1000);
#endif
menuClearExit(1000);
}
//IF Shift function, BFO Change like RIT, by KD8CEC
@ -903,36 +863,7 @@ void menuIFSSetup(int btn){
{
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
/*
//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
if (btnDown() || ifShiftValue == 0)
@ -945,7 +876,13 @@ void menuIFSSetup(int btn){
//Store IF Shiift
EEPROM.put(IF_SHIFTVALUE, ifShiftValue);
menuClearExit(0);
//menuClearExit(0);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(0);
#endif
}
}
@ -971,7 +908,15 @@ void menuATTSetup(int btn){
setFrequency(frequency);
//SetCarrierFreq();
}
//menuClearExit(0);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(0);
#endif
}
}
@ -998,44 +943,10 @@ void menuSelectMode(int btn){
selectModeType = 3;
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
/*
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) {
if (beforeMode != selectModeType)
{
//printLineF1(F("Changed Mode"));
if (selectModeType == 0) {
cwMode = 0; isUSB = 0;
@ -1054,9 +965,14 @@ void menuSelectMode(int btn){
}
SetCarrierFreq();
setFrequency(frequency);
//menuClearExit(500);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(500);
#endif
}
}
@ -1069,45 +985,11 @@ void menuSetupKeyType(int btn){
printLineF2(F("Change Key Type?"));
}
else {
//printLineF2(F("Press to set Key")); //for reduce usable flash memory
//delay_background(500, 0);
selectedKeyType = cwKeyType;
//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
/*
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!"));
cwKeyType = selectedKeyType;
EEPROM.put(CW_KEY_TYPE, cwKeyType);
@ -1123,7 +1005,14 @@ void menuSetupKeyType(int btn){
keyerControl |= IAMBICB;
}
//menuClearExit(1000);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(1000);
#endif
}
}
@ -1223,7 +1112,191 @@ void doMenu(){
//Below codes are origial code with modified by KD8CEC
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){
i = enc_read();
btnState = btnDown();
@ -1318,9 +1391,10 @@ void doMenu(){
break;
default :
menuExit(btnState); break;
}
} //end of case
Check_Cat(0); //To prevent disconnections
}
} //end of while
*/
}
//*************************************************************************************
@ -1359,7 +1433,14 @@ void menuSetup(int btn){
else
{
modeCalibrate = ! modeCalibrate;
//menuClearExit(1000);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(1000);
#endif
}
}
@ -1390,13 +1471,17 @@ void menuRitToggle(int btn){
ritDisable();
}
//menuClearExit(500);
#ifdef USE_SW_SERIAL
menuOn = 0;
#else
//Only Clear And Delay for Character LCD
menuClearExit(500);
#endif
}
}
/**
* Take a deep breath, math(ematics) ahead
* The 25 mhz oscillator is multiplied by 35 to run the vco at 875 mhz

View File

@ -47,7 +47,8 @@
#define BB1(x) ((uint8_t)(x>>8))
#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
// If using 27mhz crystal, set XTAL=27000000, MSA=33. Then vco=891mhz

View File

@ -268,4 +268,32 @@ int enc_read(void) {
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;
}
}

View File

@ -6,8 +6,6 @@ Thanks to G3ZIL for sharing great code.
Due to the limited memory of uBITX, I have implemented at least only a few of the codes in uBITX.
Thanks for testing
Beta Tester :
-----------------------------------------------------------------------------
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
@ -73,13 +71,14 @@ void SendWSPRManage()
if (nowWsprStep == 0) //select Message status
{
printLineF2(F("WSPR:"));
//printLineF2(F("WSPR:"));
if (selectedWsprMessageIndex != nowSelectedIndex)
{
selectedWsprMessageIndex = nowSelectedIndex;
int wsprMessageBuffIndex = selectedWsprMessageIndex * 46;
printLineF2(F("WSPR:"));
//Display WSPR Name tag
printLineFromEEPRom(0, 6, wsprMessageBuffIndex, wsprMessageBuffIndex + 4, 1);
@ -146,9 +145,16 @@ void SendWSPRManage()
}
printLine1(c);
#ifdef USE_SW_SERIAL
SWS_Process();
if ((digitalRead(PTT) == 0) || (TriggerBySW == 1))
{
TriggerBySW = 0;
#else
if (digitalRead(PTT) == 0)
{
#endif
//SEND WSPR
//If you need to consider the Rit and Sprite modes, uncomment them below.
//remark = To reduce the size of the program