Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
9c4b694ce2 | ||
|
5afcdf2583 | ||
|
075f585a1e | ||
|
d0c04df9d8 | ||
|
dd6d4555a8 | ||
|
8f8850f4da | ||
|
4e9437a735 | ||
|
bad62ef728 | ||
|
384c3c41b2 | ||
|
93727e6b22 | ||
|
31a7f79569 | ||
|
d7858e35c3 | ||
|
ecd104b686 | ||
|
bd52de59d2 | ||
|
f0409d641d | ||
|
8326b1ade3 | ||
|
94a3e5ca1b | ||
|
a26978f573 | ||
|
a21dbe2fa5 | ||
|
9faa8bb44c | ||
|
d926b15e3d | ||
|
fb2c9d2cc3 | ||
|
bf68dd6c26 | ||
|
4a6909f361 | ||
|
c911d26163 | ||
|
98e3b41f5a | ||
|
e0f9148972 | ||
|
277666f82f | ||
|
e532dccce7 | ||
|
81333e7af4 | ||
|
04949cdb93 | ||
|
bbdd0947d3 | ||
|
ed767f2e34 | ||
|
a374297d49 | ||
|
1e9576ddc2 | ||
|
a7684284d2 | ||
|
c1d81d9d5b | ||
|
3b4aaa664c |
77
README.md
77
README.md
@@ -1,9 +1,7 @@
|
|||||||
#IMPORTANT INFORMATION
|
#IMPORTANT INFORMATION
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
- 0.33 Version Test only download. almost complete
|
- Now Release Version 1.061 on my blog (http://www.hamskey.com)
|
||||||
- Beta 0.26 and Beta 0.261, Beta 0.262,0.27 is complete test, 0.28 is tested.
|
- You can download and compiled hex file and uBITX Manager application on my blog (http://www.hamskey.com)
|
||||||
- 0.31 is tested but has not critical bug
|
|
||||||
- You can download and use it (Release section).
|
|
||||||
|
|
||||||
#NOTICE
|
#NOTICE
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
@@ -15,9 +13,6 @@ So I will release the 0.27 version and if I do not see the bug anymore, I will t
|
|||||||
Now uBITX is an HF radio and will be able to join you in your happy hams life.
|
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.
|
Based on this source, you can use it by adding functions.
|
||||||
|
|
||||||
I am going to do a new project based on this source, linking with WSPR, WSJT-X and so on.
|
|
||||||
Of course, this repository is still running. If you have any bugs or ideas, please feel free to email me.
|
|
||||||
|
|
||||||
http://www.hamskey.com
|
http://www.hamskey.com
|
||||||
|
|
||||||
DE KD8CEC
|
DE KD8CEC
|
||||||
@@ -31,16 +26,70 @@ The copyright information of the original is below.
|
|||||||
KD8CEC
|
KD8CEC
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
Prepared or finished tasks for the next version
|
Prepared or finished tasks for the next version
|
||||||
- Most of them are implemented and included in version 0.27.
|
- Reduce Program size
|
||||||
- User Interface on LCD -> Option by user (not need)
|
- uBITX with RTL-SDR
|
||||||
- Include WSPR Beacone function - (implement other new repository)
|
- Direct control for Student
|
||||||
complete experiment
|
|
||||||
need solve : Big code size (over 100%, then remove some functions for experment)
|
|
||||||
need replace Si5351 Library (increase risk and need more beta tester)
|
|
||||||
W3PM sent me his wonderful source - using BITX, GPS
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
## REVISION RECORD
|
## REVISION RECORD
|
||||||
|
1.07 (Working...)
|
||||||
|
- Please do not download it yet. The code will continue to change for the time being.
|
||||||
|
- BetaVersion for Reduce program size
|
||||||
|
|
||||||
|
1.061
|
||||||
|
- Added WSPR
|
||||||
|
You only need uBITX to use WSPR. No external devices are required.
|
||||||
|
Added Si5351 module for WSPR
|
||||||
|
- Update uBITX Manager to Version 1.0
|
||||||
|
- Reduce program size
|
||||||
|
for WSPR
|
||||||
|
for other Module
|
||||||
|
- Fixed IF Shift Bug
|
||||||
|
Disable IF Shift on TX
|
||||||
|
IF shift available in USB mode
|
||||||
|
Fixed cat routine in IF Shift setup
|
||||||
|
- Bugs fixed
|
||||||
|
cw start delay option
|
||||||
|
Auto key Bug
|
||||||
|
(found bug : LZ1LDO)
|
||||||
|
Message selection when Auto Key is used in RIT mode
|
||||||
|
(found bug : gerald)
|
||||||
|
- Improve CW Keying (start TX)
|
||||||
|
|
||||||
|
1.05
|
||||||
|
- include 1.05W, 1.051, 1.051W
|
||||||
|
- for WSPR Beta Test Version
|
||||||
|
|
||||||
|
1.04
|
||||||
|
- Optimized from Version1.03
|
||||||
|
- Reduce program size (97% -> 95%)
|
||||||
|
|
||||||
|
1.03
|
||||||
|
- Change eBFO Calibration Step (50 to 5)
|
||||||
|
- Change CW Frequency Display type
|
||||||
|
|
||||||
|
1.02
|
||||||
|
- Applied CW Start Delay to New CW Key logic (This is my mistake when applying the new CW Key Logic.Since uBITX operations are not significantly affected, this does not create a separate Release, It will be reflected in the next release.) - complete
|
||||||
|
- Modified CW Key Logic for Auto Key, (available AutoKey function by any cw keytype) - complete
|
||||||
|
- reduce cpu use usage (working)
|
||||||
|
- reduce (working)
|
||||||
|
|
||||||
|
1.01
|
||||||
|
- Fixed Cat problem with (IAMBIC A or B Selected)
|
||||||
|
1.0
|
||||||
|
- rename 0.30 to 1.0
|
||||||
|
|
||||||
|
0.35
|
||||||
|
- vfo to channel bug fixed (not saved mode -> fixed, channel has frequency and mode)
|
||||||
|
- add Channel tag (ch.1 ~ 10) by uBITX Manager
|
||||||
|
- add VFO to Channel, Channel To VFO
|
||||||
|
|
||||||
|
0.34
|
||||||
|
- TX Status check in auto Keysend logic
|
||||||
|
- optimize codes
|
||||||
|
- change default tune step size, and fixed bug
|
||||||
|
- change IF shift step (1Hz -> 50Hz)
|
||||||
|
|
||||||
0.33
|
0.33
|
||||||
- Added CWL, CWU Mode, (dont complete test yet)
|
- Added CWL, CWU Mode, (dont complete test yet)
|
||||||
- fixed VFO changed bug.
|
- fixed VFO changed bug.
|
||||||
|
@@ -109,7 +109,8 @@ void CatSetFreq(byte fromType)
|
|||||||
//#define BCD_LEN 9
|
//#define BCD_LEN 9
|
||||||
//PROTOCOL : 0x03
|
//PROTOCOL : 0x03
|
||||||
//Computer <-(frequency)-> TRCV CAT_BUFF
|
//Computer <-(frequency)-> TRCV CAT_BUFF
|
||||||
void CatGetFreqMode(unsigned long freq, byte fromType)
|
//void CatGetFreqMode(unsigned long freq, byte fromType)
|
||||||
|
void CatGetFreqMode(unsigned long freq) //for remove warning messages
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
byte tmpValue;
|
byte tmpValue;
|
||||||
@@ -149,15 +150,21 @@ void CatGetFreqMode(unsigned long freq, byte fromType)
|
|||||||
SendCatData(5);
|
SendCatData(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CatSetSplit(boolean isSplit, byte fromType)
|
//void CatSetSplit(boolean isSplit, byte fromType)
|
||||||
|
void CatSetSplit(boolean isSplit) //for remove warning messages
|
||||||
{
|
{
|
||||||
|
if (isSplit)
|
||||||
|
splitOn = 1;
|
||||||
|
else
|
||||||
|
splitOn = 0;
|
||||||
|
|
||||||
Serial.write(ACK);
|
Serial.write(ACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CatSetPTT(boolean isPTTOn, byte fromType)
|
void CatSetPTT(boolean isPTTOn, byte fromType)
|
||||||
{
|
{
|
||||||
if (fromType == 2 || fromType == 3) {
|
//
|
||||||
|
if ((!inTx) && (fromType == 2 || fromType == 3)) {
|
||||||
Serial.write(ACK);
|
Serial.write(ACK);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -193,7 +200,7 @@ void CatSetPTT(boolean isPTTOn, byte fromType)
|
|||||||
void CatVFOToggle(boolean isSendACK, byte fromType)
|
void CatVFOToggle(boolean isSendACK, byte fromType)
|
||||||
{
|
{
|
||||||
if (fromType != 2 && fromType != 3) {
|
if (fromType != 2 && fromType != 3) {
|
||||||
menuVfoToggle(1, 0);
|
menuVfoToggle(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSendACK)
|
if (isSendACK)
|
||||||
@@ -232,7 +239,8 @@ void CatSetMode(byte tmpMode, byte fromType)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Read EEProm by uBITX Manager Software
|
//Read EEProm by uBITX Manager Software
|
||||||
void ReadEEPRom(byte fromType)
|
//void ReadEEPRom(byte fromType)
|
||||||
|
void ReadEEPRom() //for remove warnings.
|
||||||
{
|
{
|
||||||
//5BYTES
|
//5BYTES
|
||||||
//CAT_BUFF[0] [1] [2] [3] [4] //4 COMMAND
|
//CAT_BUFF[0] [1] [2] [3] [4] //4 COMMAND
|
||||||
@@ -255,7 +263,8 @@ void ReadEEPRom(byte fromType)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Write just proecess 1byes
|
//Write just proecess 1byes
|
||||||
void WriteEEPRom(byte fromType)
|
//void WriteEEPRom(byte fromType)
|
||||||
|
void WriteEEPRom(void) //for remove warning
|
||||||
{
|
{
|
||||||
//5BYTES
|
//5BYTES
|
||||||
uint16_t eepromStartIndex = CAT_BUFF[0] + CAT_BUFF[1] * 256;
|
uint16_t eepromStartIndex = CAT_BUFF[0] + CAT_BUFF[1] * 256;
|
||||||
@@ -275,7 +284,8 @@ void WriteEEPRom(byte fromType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadEEPRom_FT817(byte fromType)
|
//void ReadEEPRom_FT817(byte fromType)
|
||||||
|
void ReadEEPRom_FT817(void) //for remove warnings
|
||||||
{
|
{
|
||||||
byte temp0 = CAT_BUFF[0];
|
byte temp0 = CAT_BUFF[0];
|
||||||
byte temp1 = CAT_BUFF[1];
|
byte temp1 = CAT_BUFF[1];
|
||||||
@@ -601,7 +611,8 @@ void WriteEEPRom_FT817(byte fromType)
|
|||||||
Serial.write(ACK);
|
Serial.write(ACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CatRxStatus(byte fromType)
|
//void CatRxStatus(byte fromType)
|
||||||
|
void CatRxStatus(void) //for remove warning
|
||||||
{
|
{
|
||||||
byte sMeterValue = 1;
|
byte sMeterValue = 1;
|
||||||
|
|
||||||
@@ -621,7 +632,8 @@ void CatRxStatus(byte fromType)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CatTxStatus(byte fromType)
|
//void CatTxStatus(byte fromType)
|
||||||
|
void CatTxStatus(void) //for remove warning
|
||||||
{
|
{
|
||||||
boolean isHighSWR = false;
|
boolean isHighSWR = false;
|
||||||
boolean isSplitOn = false;
|
boolean isSplitOn = false;
|
||||||
@@ -722,11 +734,11 @@ void Check_Cat(byte fromType)
|
|||||||
|
|
||||||
case 0x02 : //Split On
|
case 0x02 : //Split On
|
||||||
case 0x82: //Split Off
|
case 0x82: //Split Off
|
||||||
CatSetSplit(CAT_BUFF[4] == 0x02, fromType);
|
CatSetSplit(CAT_BUFF[4] == 0x02);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x03 : //Read Frequency and mode
|
case 0x03 : //Read Frequency and mode
|
||||||
CatGetFreqMode(frequency, fromType);
|
CatGetFreqMode(frequency);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x07 : //Set Operating Mode
|
case 0x07 : //Set Operating Mode
|
||||||
@@ -743,24 +755,24 @@ void Check_Cat(byte fromType)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xDB: //Read uBITX EEPROM Data
|
case 0xDB: //Read uBITX EEPROM Data
|
||||||
ReadEEPRom(fromType); //Call by uBITX Manager Program
|
ReadEEPRom(); //Call by uBITX Manager Program
|
||||||
break;
|
break;
|
||||||
case 0xBB: //Read FT-817 EEPROM Data (for comfirtable)
|
case 0xBB: //Read FT-817 EEPROM Data (for comfirtable)
|
||||||
ReadEEPRom_FT817(fromType);
|
ReadEEPRom_FT817();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xDC: //Write uBITX EEPROM Data
|
case 0xDC: //Write uBITX EEPROM Data
|
||||||
WriteEEPRom(fromType); //Call by uBITX Manager Program
|
WriteEEPRom(); //Call by uBITX Manager Program
|
||||||
break;
|
break;
|
||||||
case 0xBC: //Write FT-817 EEPROM Data (for comfirtable)
|
case 0xBC: //Write FT-817 EEPROM Data (for comfirtable)
|
||||||
WriteEEPRom_FT817(fromType);
|
WriteEEPRom_FT817(fromType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xE7 : //Read RX Status
|
case 0xE7 : //Read RX Status
|
||||||
CatRxStatus(fromType);
|
CatRxStatus();
|
||||||
break;
|
break;
|
||||||
case 0xF7: //Read TX Status
|
case 0xF7: //Read TX Status
|
||||||
CatTxStatus(fromType);
|
CatTxStatus();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/*
|
/*
|
||||||
|
@@ -36,7 +36,7 @@
|
|||||||
//27 + 10 + 18 + 1(SPACE) = //56
|
//27 + 10 + 18 + 1(SPACE) = //56
|
||||||
const PROGMEM uint8_t cwAZTable[27] = {0b00100100 , 0b01001000 , 0b01001010 , 0b00111000 , 0b00010000, 0b01000010, 0b00111100, 0b01000000 , //A ~ H
|
const PROGMEM uint8_t cwAZTable[27] = {0b00100100 , 0b01001000 , 0b01001010 , 0b00111000 , 0b00010000, 0b01000010, 0b00111100, 0b01000000 , //A ~ H
|
||||||
0b00100000, 0b01000111 ,0b00111010, 0b01000100, 0b00101100, 0b00101000 , 0b00111110, 0b01000110, 0b01001101, 0b00110100, //I ~ R
|
0b00100000, 0b01000111 ,0b00111010, 0b01000100, 0b00101100, 0b00101000 , 0b00111110, 0b01000110, 0b01001101, 0b00110100, //I ~ R
|
||||||
0b00110000, 0b00011000, 0b00110010, 0b01000001, 0b00110110, 0b01001001, 0b01001011, 0b00111000}; //S ~ Z
|
0b00110000, 0b00011000, 0b00110010, 0b01000001, 0b00110110, 0b01001001, 0b01001011, 0b01001100}; //S ~ Z
|
||||||
PGM_P pCwAZTable = reinterpret_cast<PGM_P>(cwAZTable);
|
PGM_P pCwAZTable = reinterpret_cast<PGM_P>(cwAZTable);
|
||||||
|
|
||||||
const PROGMEM uint8_t cw09Table[27] = {0b00011111, 0b00001111, 0b00000111, 0b00000011, 0b00000001, 0b00000000, 0b00010000, 0b00011000, 0b00011100, 0b00011110};
|
const PROGMEM uint8_t cw09Table[27] = {0b00011111, 0b00001111, 0b00000111, 0b00000011, 0b00000001, 0b00000000, 0b00010000, 0b00011000, 0b00011100, 0b00011110};
|
||||||
@@ -297,7 +297,7 @@ void controlAutoCW(){
|
|||||||
displayScrolStep = 0;
|
displayScrolStep = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ);
|
printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ, 0);
|
||||||
|
|
||||||
byte diplayAutoCWLine = 0;
|
byte diplayAutoCWLine = 0;
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
|
80
ubitx_20/ubitx.h
Normal file
80
ubitx_20/ubitx.h
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
header file for C++ 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/>.
|
||||||
|
**************************************************************************/
|
||||||
|
#define WSPR_COUNT 443 //WSPR_MESSAGE_COUNT
|
||||||
|
#define WSPR_MESSAGE1 444 //
|
||||||
|
#define WSPR_MESSAGE2 490 //
|
||||||
|
#define WSPR_MESSAGE3 536 //
|
||||||
|
#define WSPR_MESSAGE4 582 //
|
||||||
|
|
||||||
|
#define WSPR_BAND_COUNT 3
|
||||||
|
|
||||||
|
#define TX_SSB 0
|
||||||
|
#define TX_CW 1
|
||||||
|
|
||||||
|
|
||||||
|
extern void printLine1(const char *c);
|
||||||
|
extern void printLine2(const char *c);
|
||||||
|
extern void printLineF(char linenmbr, const __FlashStringHelper *c);
|
||||||
|
extern void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetType);
|
||||||
|
extern byte delay_background(unsigned delayTime, byte fromType);
|
||||||
|
extern int btnDown(void);
|
||||||
|
extern char c[30];
|
||||||
|
extern char b[30];
|
||||||
|
|
||||||
|
extern unsigned long frequency;
|
||||||
|
|
||||||
|
#define printLineF1(x) (printLineF(1, x))
|
||||||
|
#define printLineF2(x) (printLineF(0, x))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The second set of 16 pins on the Raduino's bottom connector are have the three clock outputs and the digital lines to control the rig.
|
||||||
|
* This assignment is as follows :
|
||||||
|
* Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||||
|
* GND +5V CLK0 GND GND CLK1 GND GND CLK2 GND D2 D3 D4 D5 D6 D7
|
||||||
|
* These too are flexible with what you may do with them, for the Raduino, we use them to :
|
||||||
|
* - TX_RX line : Switches between Transmit and Receive after sensing the PTT or the morse keyer
|
||||||
|
* - CW_KEY line : turns on the carrier for CW
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TX_RX (7)
|
||||||
|
#define CW_TONE (6)
|
||||||
|
#define TX_LPF_A (5)
|
||||||
|
#define TX_LPF_B (4)
|
||||||
|
#define TX_LPF_C (3)
|
||||||
|
#define CW_KEY (2)
|
||||||
|
|
||||||
|
//we directly generate the CW by programmin the Si5351 to the cw tx frequency, hence, both are different modes
|
||||||
|
//these are the parameter passed to startTx
|
||||||
|
#define TX_SSB 0
|
||||||
|
#define TX_CW 1
|
||||||
|
|
||||||
|
extern void si5351bx_init(void);
|
||||||
|
extern void si5351bx_setfreq(uint8_t clknum, uint32_t fout);
|
||||||
|
extern void si5351_set_calibration(int32_t cal);
|
||||||
|
extern void initOscillators(void);
|
||||||
|
extern void Set_WSPR_Param(void);
|
||||||
|
extern void TXSubFreq(unsigned long P2);
|
||||||
|
|
||||||
|
extern void startTx(byte txMode, byte isDisplayUpdate);
|
||||||
|
extern void stopTx(void);
|
||||||
|
extern void setTXFilters(unsigned long freq);
|
||||||
|
|
||||||
|
extern void SendWSPRManage(void);
|
||||||
|
extern byte WsprMSGCount;
|
||||||
|
|
||||||
|
|
@@ -38,6 +38,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
|
#include "ubitx.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The main chip which generates upto three oscillators of various frequencies in the
|
The main chip which generates upto three oscillators of various frequencies in the
|
||||||
@@ -176,6 +177,16 @@ int count = 0; //to generally count ticks, loops, etc
|
|||||||
#define CW_ADC_BOTH_FROM 356 //CW ADC Range BOTH from (Lower 8 bit)
|
#define CW_ADC_BOTH_FROM 356 //CW ADC Range BOTH from (Lower 8 bit)
|
||||||
#define CW_ADC_BOTH_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
#define CW_ADC_BOTH_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
||||||
#define CW_KEY_TYPE 358
|
#define CW_KEY_TYPE 358
|
||||||
|
#define CW_DISPLAY_SHIFT 359 //Transmits on CWL, CWU Mode, LCD Frequency shifts Sidetone Frequency.
|
||||||
|
//(7:Enable / Disable //0: enable, 1:disable, (default is applied shift)
|
||||||
|
//6 : 0 : Adjust Pulus, 1 : Adjust Minus
|
||||||
|
//0~5: Adjust Value : * 10 = Adjust Value (0~300)
|
||||||
|
#define COMMON_OPTION0 360 //0: Confirm : CW Frequency Shift
|
||||||
|
//1 : IF Shift Save
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#define IF_SHIFTVALUE 363
|
||||||
|
|
||||||
#define DISPLAY_OPTION1 361 //Display Option1
|
#define DISPLAY_OPTION1 361 //Display Option1
|
||||||
#define DISPLAY_OPTION2 362 //Display Option2
|
#define DISPLAY_OPTION2 362 //Display Option2
|
||||||
@@ -268,6 +279,7 @@ byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop]
|
|||||||
long arTuneStep[5];
|
long arTuneStep[5];
|
||||||
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
|
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
|
||||||
|
|
||||||
|
byte commonOption0 = 0;
|
||||||
byte displayOption1 = 0;
|
byte displayOption1 = 0;
|
||||||
byte displayOption2 = 0;
|
byte displayOption2 = 0;
|
||||||
|
|
||||||
@@ -285,6 +297,9 @@ bool Iambic_Key = true;
|
|||||||
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
||||||
unsigned char keyerControl = IAMBICB;
|
unsigned char keyerControl = IAMBICB;
|
||||||
|
|
||||||
|
byte isShiftDisplayCWFreq = 1; //Display Frequency
|
||||||
|
int shiftDisplayAdjustVal = 0; //
|
||||||
|
|
||||||
//Variables for auto cw mode
|
//Variables for auto cw mode
|
||||||
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
||||||
byte cwAutoTextCount = 0; //cwAutoText Count
|
byte cwAutoTextCount = 0; //cwAutoText Count
|
||||||
@@ -323,7 +338,7 @@ byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
|
|||||||
char lcdMeter[17];
|
char lcdMeter[17];
|
||||||
|
|
||||||
byte isIFShift = 0; //1 = ifShift, 2 extend
|
byte isIFShift = 0; //1 = ifShift, 2 extend
|
||||||
long ifShiftValue = 0; //
|
int ifShiftValue = 0; //
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Below are the basic functions that control the uBitx. Understanding the functions before
|
* Below are the basic functions that control the uBitx. Understanding the functions before
|
||||||
@@ -401,7 +416,6 @@ void saveBandFreqByIndex(unsigned long f, unsigned long mode, char bandIndex) {
|
|||||||
When the delay is used, the program will generate an error because it is not communicating,
|
When the delay is used, the program will generate an error because it is not communicating,
|
||||||
so Create a new delay function that can do background processing.
|
so Create a new delay function that can do background processing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
unsigned long delayBeforeTime = 0;
|
unsigned long delayBeforeTime = 0;
|
||||||
byte delay_background(unsigned delayTime, byte fromType){ //fromType : 4 autoCWKey -> Check Paddle
|
byte delay_background(unsigned delayTime, byte fromType){ //fromType : 4 autoCWKey -> Check Paddle
|
||||||
delayBeforeTime = millis();
|
delayBeforeTime = millis();
|
||||||
@@ -485,28 +499,29 @@ void setTXFilters(unsigned long freq){
|
|||||||
|
|
||||||
void setFrequency(unsigned long f){
|
void setFrequency(unsigned long f){
|
||||||
f = (f / arTuneStep[tuneStepIndex -1]) * arTuneStep[tuneStepIndex -1];
|
f = (f / arTuneStep[tuneStepIndex -1]) * arTuneStep[tuneStepIndex -1];
|
||||||
|
|
||||||
setTXFilters(f);
|
setTXFilters(f);
|
||||||
|
|
||||||
|
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
||||||
|
|
||||||
if (cwMode == 0)
|
if (cwMode == 0)
|
||||||
{
|
{
|
||||||
if (isUSB){
|
if (isUSB){
|
||||||
si5351bx_setfreq(2, SECOND_OSC_USB - usbCarrier + f + (isIFShift ? ifShiftValue : 0));
|
si5351bx_setfreq(2, SECOND_OSC_USB - appliedCarrier + f);
|
||||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
si5351bx_setfreq(1, SECOND_OSC_USB);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
si5351bx_setfreq(2, SECOND_OSC_LSB + usbCarrier + f + (isIFShift ? ifShiftValue : 0));
|
si5351bx_setfreq(2, SECOND_OSC_LSB + appliedCarrier + f);
|
||||||
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (cwMode == 1){ //CWL
|
if (cwMode == 1){ //CWL
|
||||||
si5351bx_setfreq(2, SECOND_OSC_LSB + cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
|
si5351bx_setfreq(2, SECOND_OSC_LSB + appliedCarrier + f);
|
||||||
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
si5351bx_setfreq(1, SECOND_OSC_LSB);
|
||||||
}
|
}
|
||||||
else{ //CWU
|
else{ //CWU
|
||||||
si5351bx_setfreq(2, SECOND_OSC_USB - cwmCarrier + f + (isIFShift ? ifShiftValue : 0));
|
si5351bx_setfreq(2, SECOND_OSC_USB - appliedCarrier + f);
|
||||||
si5351bx_setfreq(1, SECOND_OSC_USB);
|
si5351bx_setfreq(1, SECOND_OSC_USB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -519,7 +534,6 @@ void setFrequency(unsigned long f){
|
|||||||
* put the uBitx in tx mode. It takes care of rit settings, sideband settings
|
* put the uBitx in tx mode. It takes care of rit settings, sideband settings
|
||||||
* Note: In cw mode, doesnt key the radio, only puts it in tx mode
|
* Note: In cw mode, doesnt key the radio, only puts it in tx mode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void startTx(byte txMode, byte isDisplayUpdate){
|
void startTx(byte txMode, byte isDisplayUpdate){
|
||||||
//Check Hamband only TX //Not found Hamband index by now frequency
|
//Check Hamband only TX //Not found Hamband index by now frequency
|
||||||
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
|
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
|
||||||
@@ -537,7 +551,9 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
|||||||
ritRxFrequency = frequency;
|
ritRxFrequency = frequency;
|
||||||
setFrequency(ritTxFrequency);
|
setFrequency(ritTxFrequency);
|
||||||
}
|
}
|
||||||
else if (splitOn == 1) {
|
else
|
||||||
|
{
|
||||||
|
if (splitOn == 1) {
|
||||||
if (vfoActive == VFO_B) {
|
if (vfoActive == VFO_B) {
|
||||||
vfoActive = VFO_A;
|
vfoActive = VFO_A;
|
||||||
frequency = vfoA;
|
frequency = vfoA;
|
||||||
@@ -548,10 +564,12 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
|||||||
frequency = vfoB;
|
frequency = vfoB;
|
||||||
byteToMode(vfoB_mode, 0);
|
byteToMode(vfoB_mode, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
} //end of else
|
} //end of else
|
||||||
|
|
||||||
|
SetCarrierFreq();
|
||||||
|
|
||||||
if (txMode == TX_CW){
|
if (txMode == TX_CW){
|
||||||
//turn off the second local oscillator and the bfo
|
//turn off the second local oscillator and the bfo
|
||||||
@@ -584,19 +602,24 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
|||||||
updateDisplay();
|
updateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void stopTx(){
|
void stopTx(void){
|
||||||
inTx = 0;
|
inTx = 0;
|
||||||
|
|
||||||
digitalWrite(TX_RX, 0); //turn off the tx
|
digitalWrite(TX_RX, 0); //turn off the tx
|
||||||
|
|
||||||
|
/*
|
||||||
if (cwMode == 0)
|
if (cwMode == 0)
|
||||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
else
|
else
|
||||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
*/
|
||||||
|
SetCarrierFreq();
|
||||||
|
|
||||||
if (ritOn)
|
if (ritOn)
|
||||||
setFrequency(ritRxFrequency);
|
setFrequency(ritRxFrequency);
|
||||||
else if (splitOn == 1) {
|
else
|
||||||
|
{
|
||||||
|
if (splitOn == 1) {
|
||||||
//vfo Change
|
//vfo Change
|
||||||
if (vfoActive == VFO_B){
|
if (vfoActive == VFO_B){
|
||||||
vfoActive = VFO_A;
|
vfoActive = VFO_A;
|
||||||
@@ -608,10 +631,10 @@ void stopTx(){
|
|||||||
frequency = vfoB;
|
frequency = vfoB;
|
||||||
byteToMode(vfoB_mode, 0);
|
byteToMode(vfoB_mode, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
} //end of else
|
} //end of else
|
||||||
else
|
|
||||||
setFrequency(frequency);
|
|
||||||
|
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
}
|
}
|
||||||
@@ -675,7 +698,7 @@ void checkButton(){
|
|||||||
delay(10);
|
delay(10);
|
||||||
Check_Cat(0);
|
Check_Cat(0);
|
||||||
}
|
}
|
||||||
delay(50);//debounce
|
//delay(50);//debounce
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -690,19 +713,17 @@ int encodedSumValue = 0;
|
|||||||
unsigned long lastTunetime = 0; //if continous moving, skip threshold processing
|
unsigned long lastTunetime = 0; //if continous moving, skip threshold processing
|
||||||
byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw
|
byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw
|
||||||
|
|
||||||
#define skipThresholdTime 100
|
//#define skipThresholdTime 70
|
||||||
#define encodeTimeOut 1000
|
#define encodeTimeOut 1000
|
||||||
|
|
||||||
void doTuningWithThresHold(){
|
void doTuningWithThresHold(){
|
||||||
int s = 0;
|
int s = 0;
|
||||||
unsigned long prev_freq;
|
unsigned long prev_freq;
|
||||||
long incdecValue = 0;
|
|
||||||
|
|
||||||
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
if ((vfoActive == VFO_A && ((isDialLock & 0x01) == 0x01)) ||
|
||||||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02)))
|
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (isCWAutoMode == 0 || cwAutoDialType == 1)
|
|
||||||
s = enc_read();
|
s = enc_read();
|
||||||
|
|
||||||
//if time is exceeded, it is recognized as an error,
|
//if time is exceeded, it is recognized as an error,
|
||||||
@@ -720,7 +741,9 @@ void doTuningWithThresHold(){
|
|||||||
encodedSumValue += (s > 0 ? 1 : -1);
|
encodedSumValue += (s > 0 ? 1 : -1);
|
||||||
|
|
||||||
//check threshold and operator actions (hold dial speed = continous moving, skip threshold check)
|
//check threshold and operator actions (hold dial speed = continous moving, skip threshold check)
|
||||||
if ((lastTunetime < millis() - skipThresholdTime) && ((encodedSumValue * encodedSumValue) <= (threshold * threshold)))
|
//not use continues changing by Threshold
|
||||||
|
//if ((lastTunetime < (millis() - skipThresholdTime)) && ((encodedSumValue * encodedSumValue) <= (threshold * threshold)))
|
||||||
|
if (((encodedSumValue * encodedSumValue) <= (threshold * threshold)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lastTunetime = millis();
|
lastTunetime = millis();
|
||||||
@@ -730,7 +753,8 @@ void doTuningWithThresHold(){
|
|||||||
|
|
||||||
prev_freq = frequency;
|
prev_freq = frequency;
|
||||||
//incdecValue = tuningStep * s;
|
//incdecValue = tuningStep * s;
|
||||||
frequency += (arTuneStep[tuneStepIndex -1] * s * (s * s < 10 ? 1 : 3)); //appield weight (s is speed)
|
//frequency += (arTuneStep[tuneStepIndex -1] * s * (s * s < 10 ? 1 : 3)); //appield weight (s is speed)
|
||||||
|
frequency += (arTuneStep[tuneStepIndex -1] * s); //appield weight (s is speed) //if want need more increase size, change step size
|
||||||
|
|
||||||
if (prev_freq < 10000000l && frequency > 10000000l)
|
if (prev_freq < 10000000l && frequency > 10000000l)
|
||||||
isUSB = true;
|
isUSB = true;
|
||||||
@@ -750,15 +774,16 @@ void doRIT(){
|
|||||||
unsigned long old_freq = frequency;
|
unsigned long old_freq = frequency;
|
||||||
|
|
||||||
if (knob < 0)
|
if (knob < 0)
|
||||||
frequency -= 100l;
|
frequency -= (arTuneStep[tuneStepIndex -1]); //
|
||||||
else if (knob > 0)
|
else if (knob > 0)
|
||||||
frequency += 100;
|
frequency += (arTuneStep[tuneStepIndex -1]); //
|
||||||
|
|
||||||
if (old_freq != frequency){
|
if (old_freq != frequency){
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
save Frequency and mode to eeprom for Auto Save with protected eeprom cycle, by kd8cec
|
save Frequency and mode to eeprom for Auto Save with protected eeprom cycle, by kd8cec
|
||||||
*/
|
*/
|
||||||
@@ -878,6 +903,7 @@ void initSettings(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
@@ -908,13 +934,13 @@ void initSettings(){
|
|||||||
if ((3 < tuneTXType && tuneTXType < 100) || 103 < tuneTXType || useHamBandCount < 1 || findedValidValueCount < 5)
|
if ((3 < tuneTXType && tuneTXType < 100) || 103 < tuneTXType || useHamBandCount < 1 || findedValidValueCount < 5)
|
||||||
{
|
{
|
||||||
tuneTXType = 2;
|
tuneTXType = 2;
|
||||||
//if empty band Information, auto insert default region 1 frequency range
|
//if empty band Information, auto insert default region 2 frequency range
|
||||||
//This part is made temporary for people who have difficulty setting up, so can remove it when you run out of memory.
|
//This part is made temporary for people who have difficulty setting up, so can remove it when you run out of memory.
|
||||||
useHamBandCount = 10;
|
useHamBandCount = 10;
|
||||||
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
|
hamBandRange[0][0] = 1810; hamBandRange[0][1] = 2000;
|
||||||
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
|
hamBandRange[1][0] = 3500; hamBandRange[1][1] = 3800;
|
||||||
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367;
|
hamBandRange[2][0] = 5351; hamBandRange[2][1] = 5367;
|
||||||
hamBandRange[3][0] = 7000; hamBandRange[3][1] = 7300; //region 1
|
hamBandRange[3][0] = 7000; hamBandRange[3][1] = 7300; //region 2
|
||||||
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
|
hamBandRange[4][0] = 10100; hamBandRange[4][1] = 10150;
|
||||||
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
|
hamBandRange[5][0] = 14000; hamBandRange[5][1] = 14350;
|
||||||
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
|
hamBandRange[6][0] = 18068; hamBandRange[6][1] = 18168;
|
||||||
@@ -962,6 +988,33 @@ void initSettings(){
|
|||||||
cwAdcBothFrom = EEPROM.read(CW_ADC_BOTH_FROM) | ((tmpMostBits & 0x30) << 4);
|
cwAdcBothFrom = EEPROM.read(CW_ADC_BOTH_FROM) | ((tmpMostBits & 0x30) << 4);
|
||||||
cwAdcBothTo = EEPROM.read(CW_ADC_BOTH_TO) | ((tmpMostBits & 0xC0) << 2);
|
cwAdcBothTo = EEPROM.read(CW_ADC_BOTH_TO) | ((tmpMostBits & 0xC0) << 2);
|
||||||
|
|
||||||
|
//Display Type for CW mode
|
||||||
|
isShiftDisplayCWFreq = EEPROM.read(CW_DISPLAY_SHIFT);
|
||||||
|
|
||||||
|
//Enable / Diable Check for CW Display Cofiguration Group
|
||||||
|
if ((commonOption0 & 0x80) != 0x00)
|
||||||
|
{
|
||||||
|
//Adjust CW Mode Freq
|
||||||
|
shiftDisplayAdjustVal = (isShiftDisplayCWFreq & 0x3F) * 10;
|
||||||
|
|
||||||
|
//check Minus
|
||||||
|
if ((isShiftDisplayCWFreq & 0x40) == 0x40)
|
||||||
|
shiftDisplayAdjustVal = shiftDisplayAdjustVal * -1;
|
||||||
|
|
||||||
|
//Shift Display Check (Default : 0)
|
||||||
|
if ((isShiftDisplayCWFreq & 0x80) == 0) //Enabled
|
||||||
|
isShiftDisplayCWFreq = 1;
|
||||||
|
else //Disabled
|
||||||
|
isShiftDisplayCWFreq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Stored IF Shift Option
|
||||||
|
if ((commonOption0 & 0x40) != 0x00)
|
||||||
|
{
|
||||||
|
EEPROM.get(IF_SHIFTVALUE, ifShiftValue);
|
||||||
|
isIFShift = ifShiftValue != 0;
|
||||||
|
}
|
||||||
|
|
||||||
//default Value (for original hardware)
|
//default Value (for original hardware)
|
||||||
if (cwAdcSTFrom >= cwAdcSTTo)
|
if (cwAdcSTFrom >= cwAdcSTTo)
|
||||||
{
|
{
|
||||||
@@ -998,10 +1051,10 @@ void initSettings(){
|
|||||||
|
|
||||||
//original code with modified by kd8cec
|
//original code with modified by kd8cec
|
||||||
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
||||||
usbCarrier = 11995000l;
|
usbCarrier = 11997000l;
|
||||||
|
|
||||||
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
||||||
cwmCarrier = 11995000l;
|
cwmCarrier = 11997000l;
|
||||||
|
|
||||||
if (vfoA > 35000000l || 3500000l > vfoA) {
|
if (vfoA > 35000000l || 3500000l > vfoA) {
|
||||||
vfoA = 7150000l;
|
vfoA = 7150000l;
|
||||||
@@ -1036,7 +1089,6 @@ void initSettings(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initPorts(){
|
void initPorts(){
|
||||||
|
|
||||||
analogReference(DEFAULT);
|
analogReference(DEFAULT);
|
||||||
|
|
||||||
//??
|
//??
|
||||||
@@ -1086,7 +1138,7 @@ void setup()
|
|||||||
|
|
||||||
//Serial.begin(9600);
|
//Serial.begin(9600);
|
||||||
lcd.begin(16, 2);
|
lcd.begin(16, 2);
|
||||||
printLineF(1, F("CECBT v0.35"));
|
printLineF(1, F("CE v1.061"));
|
||||||
|
|
||||||
Init_Cat(38400, SERIAL_8N1);
|
Init_Cat(38400, SERIAL_8N1);
|
||||||
initMeter(); //not used in this build
|
initMeter(); //not used in this build
|
||||||
@@ -1094,7 +1146,7 @@ void setup()
|
|||||||
|
|
||||||
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) {
|
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) {
|
||||||
userCallsignLength = userCallsignLength & 0x7F;
|
userCallsignLength = userCallsignLength & 0x7F;
|
||||||
printLineFromEEPRom(0, 0, 0, userCallsignLength -1); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
printLineFromEEPRom(0, 0, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
||||||
delay(500);
|
delay(500);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -1117,11 +1169,6 @@ void setup()
|
|||||||
factory_alignment();
|
factory_alignment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//for debug
|
|
||||||
int dbgCnt = 0;
|
|
||||||
byte flasher = 0;
|
|
||||||
|
|
||||||
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
|
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
|
||||||
void checkAutoSaveFreqMode()
|
void checkAutoSaveFreqMode()
|
||||||
{
|
{
|
||||||
@@ -1140,18 +1187,8 @@ void checkAutoSaveFreqMode()
|
|||||||
//check time for Frequency auto save
|
//check time for Frequency auto save
|
||||||
if (millis() - saveCheckTime > saveIntervalSec * 1000)
|
if (millis() - saveCheckTime > saveIntervalSec * 1000)
|
||||||
{
|
{
|
||||||
if (vfoActive == VFO_A)
|
FrequencyToVFO(1);
|
||||||
{
|
saveCheckTime = 0; //for reduce cpu use rate
|
||||||
vfoA = frequency;
|
|
||||||
vfoA_mode = modeToByte();
|
|
||||||
storeFrequencyAndMode(1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vfoB = frequency;
|
|
||||||
vfoB_mode = modeToByte();
|
|
||||||
storeFrequencyAndMode(2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1169,20 +1206,21 @@ void loop(){
|
|||||||
|
|
||||||
//tune only when not tranmsitting
|
//tune only when not tranmsitting
|
||||||
if (!inTx){
|
if (!inTx){
|
||||||
|
if (isCWAutoMode == 0 || cwAutoDialType == 1)
|
||||||
|
{
|
||||||
if (ritOn)
|
if (ritOn)
|
||||||
doRIT();
|
doRIT();
|
||||||
//else if (isIFShift)
|
|
||||||
// doIFShift();
|
|
||||||
else
|
else
|
||||||
doTuningWithThresHold();
|
doTuningWithThresHold();
|
||||||
|
}
|
||||||
|
|
||||||
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 250) {
|
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 250) {
|
||||||
idle_process();
|
idle_process();
|
||||||
|
checkAutoSaveFreqMode(); //move here form out scope for reduce cpu use rate
|
||||||
beforeIdle_ProcessTime = millis();
|
beforeIdle_ProcessTime = millis();
|
||||||
}
|
}
|
||||||
} //end of check TX Status
|
} //end of check TX Status
|
||||||
|
|
||||||
//we check CAT after the encoder as it might put the radio into TX
|
//we check CAT after the encoder as it might put the radio into TX
|
||||||
Check_Cat(inTx? 1 : 0);
|
Check_Cat(inTx? 1 : 0);
|
||||||
checkAutoSaveFreqMode();
|
|
||||||
}
|
}
|
||||||
|
@@ -31,12 +31,7 @@ void updateLine2Buffer(char isDirectCall)
|
|||||||
{
|
{
|
||||||
if (ritOn)
|
if (ritOn)
|
||||||
{
|
{
|
||||||
line2Buffer[0] = 'R';
|
strcpy(line2Buffer, "RitTX:");
|
||||||
line2Buffer[1] = 'i';
|
|
||||||
line2Buffer[2] = 't';
|
|
||||||
line2Buffer[3] = 'T';
|
|
||||||
line2Buffer[4] = 'X';
|
|
||||||
line2Buffer[5] = ':';
|
|
||||||
|
|
||||||
//display frequency
|
//display frequency
|
||||||
tmpFreq = ritTxFrequency;
|
tmpFreq = ritTxFrequency;
|
||||||
@@ -61,12 +56,10 @@ void updateLine2Buffer(char isDirectCall)
|
|||||||
if (vfoActive == VFO_B)
|
if (vfoActive == VFO_B)
|
||||||
{
|
{
|
||||||
tmpFreq = vfoA;
|
tmpFreq = vfoA;
|
||||||
//line2Buffer[0] = 'A';
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tmpFreq = vfoB;
|
tmpFreq = vfoB;
|
||||||
//line2Buffer[0] = 'B';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EXAMPLE 1 & 2
|
// EXAMPLE 1 & 2
|
||||||
@@ -133,16 +126,18 @@ void updateLine2Buffer(char isDirectCall)
|
|||||||
line2Buffer[8] = 'I';
|
line2Buffer[8] = 'I';
|
||||||
line2Buffer[9] = 'F';
|
line2Buffer[9] = 'F';
|
||||||
|
|
||||||
if (ifShiftValue == 0)
|
//if (ifShiftValue == 0)
|
||||||
{
|
//{
|
||||||
|
/*
|
||||||
line2Buffer[10] = 'S';
|
line2Buffer[10] = 'S';
|
||||||
line2Buffer[11] = ':';
|
line2Buffer[11] = ':';
|
||||||
line2Buffer[12] = 'O';
|
line2Buffer[12] = 'O';
|
||||||
line2Buffer[13] = 'F';
|
line2Buffer[13] = 'F';
|
||||||
line2Buffer[14] = 'F';
|
line2Buffer[14] = 'F';
|
||||||
}
|
*/
|
||||||
else
|
//}
|
||||||
{
|
//else
|
||||||
|
//{
|
||||||
line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
|
line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
|
||||||
line2Buffer[11] = 0;
|
line2Buffer[11] = 0;
|
||||||
line2Buffer[12] = ' ';
|
line2Buffer[12] = ' ';
|
||||||
@@ -151,7 +146,7 @@ void updateLine2Buffer(char isDirectCall)
|
|||||||
memset(b, 0, sizeof(b));
|
memset(b, 0, sizeof(b));
|
||||||
ltoa(ifShiftValue, b, DEC);
|
ltoa(ifShiftValue, b, DEC);
|
||||||
strncat(line2Buffer, b, 5);
|
strncat(line2Buffer, b, 5);
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (isDirectCall == 1) //if call by encoder (not scheduler), immediate print value
|
if (isDirectCall == 1) //if call by encoder (not scheduler), immediate print value
|
||||||
printLine2(line2Buffer);
|
printLine2(line2Buffer);
|
||||||
@@ -212,6 +207,8 @@ void updateLine2Buffer(char isDirectCall)
|
|||||||
|
|
||||||
//meterType : 0 = S.Meter, 1 : P.Meter
|
//meterType : 0 = S.Meter, 1 : P.Meter
|
||||||
void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
||||||
|
{
|
||||||
|
if (meterType == 0 || meterType == 1 || meterType == 2)
|
||||||
{
|
{
|
||||||
drawMeter(meterValue); //call original source code
|
drawMeter(meterValue); //call original source code
|
||||||
int lineNumber = 0;
|
int lineNumber = 0;
|
||||||
@@ -222,7 +219,7 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
|
|||||||
|
|
||||||
for (int i = 0; i < 6; 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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte testValue = 0;
|
byte testValue = 0;
|
||||||
|
@@ -90,13 +90,13 @@ void cwKeyUp(){
|
|||||||
#define PDLSWAP 0x08 // 0 for normal, 1 for swap
|
#define PDLSWAP 0x08 // 0 for normal, 1 for swap
|
||||||
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
||||||
enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT };
|
enum KSTYPE {IDLE, CHK_DIT, CHK_DAH, KEYED_PREP, KEYED, INTER_ELEMENT };
|
||||||
static long ktimer;
|
static unsigned long ktimer;
|
||||||
unsigned char keyerState = IDLE;
|
unsigned char keyerState = IDLE;
|
||||||
|
|
||||||
//Below is a test to reduce the keying error. do not delete lines
|
//Below is a test to reduce the keying error. do not delete lines
|
||||||
//create by KD8CEC for compatible with new CW Logic
|
//create by KD8CEC for compatible with new CW Logic
|
||||||
char update_PaddleLatch(byte isUpdateKeyState) {
|
char update_PaddleLatch(byte isUpdateKeyState) {
|
||||||
unsigned char tmpKeyerControl;
|
unsigned char tmpKeyerControl = 0;
|
||||||
int paddle = analogRead(ANALOG_KEYER);
|
int paddle = analogRead(ANALOG_KEYER);
|
||||||
|
|
||||||
if (paddle >= cwAdcDashFrom && paddle <= cwAdcDashTo)
|
if (paddle >= cwAdcDashFrom && paddle <= cwAdcDashTo)
|
||||||
@@ -126,9 +126,7 @@ char update_PaddleLatch(byte isUpdateKeyState) {
|
|||||||
// modified by KD8CEC
|
// modified by KD8CEC
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void cwKeyer(void){
|
void cwKeyer(void){
|
||||||
byte paddle;
|
|
||||||
lastPaddle = 0;
|
lastPaddle = 0;
|
||||||
int dot,dash;
|
|
||||||
bool continue_loop = true;
|
bool continue_loop = true;
|
||||||
unsigned tmpKeyControl = 0;
|
unsigned tmpKeyControl = 0;
|
||||||
|
|
||||||
@@ -170,14 +168,32 @@ void cwKeyer(void){
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEYED_PREP:
|
case KEYED_PREP:
|
||||||
|
//modified KD8CEC
|
||||||
|
/*
|
||||||
ktimer += millis(); // set ktimer to interval end time
|
ktimer += millis(); // set ktimer to interval end time
|
||||||
keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits
|
keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits
|
||||||
keyerState = KEYED; // next state
|
keyerState = KEYED; // next state
|
||||||
if (!inTx){
|
if (!inTx){
|
||||||
|
//DelayTime Option
|
||||||
|
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||||
|
|
||||||
keyDown = 0;
|
keyDown = 0;
|
||||||
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||||
startTx(TX_CW, 1);
|
startTx(TX_CW, 1);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
if (!inTx){
|
||||||
|
//DelayTime Option
|
||||||
|
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||||
|
|
||||||
|
keyDown = 0;
|
||||||
|
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||||
|
startTx(TX_CW, 1);
|
||||||
|
}
|
||||||
|
ktimer += millis(); // set ktimer to interval end time
|
||||||
|
keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits
|
||||||
|
keyerState = KEYED; // next state
|
||||||
|
|
||||||
cwKeydown();
|
cwKeydown();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -206,7 +222,7 @@ void cwKeyer(void){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Check_Cat(3);
|
Check_Cat(2);
|
||||||
} //end of while
|
} //end of while
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -214,6 +230,9 @@ void cwKeyer(void){
|
|||||||
if (update_PaddleLatch(0) == DIT_L) {
|
if (update_PaddleLatch(0) == DIT_L) {
|
||||||
// if we are here, it is only because the key is pressed
|
// if we are here, it is only because the key is pressed
|
||||||
if (!inTx){
|
if (!inTx){
|
||||||
|
//DelayTime Option
|
||||||
|
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||||
|
|
||||||
keyDown = 0;
|
keyDown = 0;
|
||||||
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||||
startTx(TX_CW, 1);
|
startTx(TX_CW, 1);
|
||||||
@@ -231,13 +250,14 @@ void cwKeyer(void){
|
|||||||
keyDown = 0;
|
keyDown = 0;
|
||||||
stopTx();
|
stopTx();
|
||||||
}
|
}
|
||||||
if (!cwTimeout)
|
//if (!cwTimeout) //removed by KD8CEC
|
||||||
return;
|
// return;
|
||||||
// got back to the beginning of the loop, if no further activity happens on straight key
|
// got back to the beginning of the loop, if no further activity happens on straight key
|
||||||
// we will time out, and return out of this routine
|
// we will time out, and return out of this routine
|
||||||
//delay(5);
|
//delay(5);
|
||||||
delay_background(5, 3);
|
//delay_background(5, 3); //removed by KD8CEC
|
||||||
continue;
|
//continue; //removed by KD8CEC
|
||||||
|
return; //Tx stop control by Main Loop
|
||||||
}
|
}
|
||||||
|
|
||||||
Check_Cat(2);
|
Check_Cat(2);
|
||||||
|
@@ -10,8 +10,7 @@
|
|||||||
* - If the menu item is clicked on, then it is selected,
|
* - If the menu item is clicked on, then it is selected,
|
||||||
* - If the menu item is NOT clicked on, then the menu's prompt is to be displayed
|
* - If the menu item is NOT clicked on, then the menu's prompt is to be displayed
|
||||||
*/
|
*/
|
||||||
#define printLineF1(x) (printLineF(1, x))
|
#include "ubitx.h"
|
||||||
#define printLineF2(x) (printLineF(0, x))
|
|
||||||
|
|
||||||
//Current Frequency and mode to active VFO by KD8CEC
|
//Current Frequency and mode to active VFO by KD8CEC
|
||||||
void FrequencyToVFO(byte isSaveFreq)
|
void FrequencyToVFO(byte isSaveFreq)
|
||||||
@@ -56,7 +55,7 @@ void menuBand(int btn){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF2(F("Press to confirm"));
|
//printLineF2(F("Press to confirm"));
|
||||||
//wait for the button menu select button to be lifted)
|
//wait for the button menu select button to be lifted)
|
||||||
while (btnDown()) {
|
while (btnDown()) {
|
||||||
delay_background(50, 0);
|
delay_background(50, 0);
|
||||||
@@ -64,17 +63,19 @@ void menuBand(int btn){
|
|||||||
btnPressCount = 0;
|
btnPressCount = 0;
|
||||||
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
|
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
|
||||||
tuneTXType = 0;
|
tuneTXType = 0;
|
||||||
printLineF2(F("Full range mode"));
|
//printLineF2(F("General mode"));
|
||||||
|
printLineF2(F("General"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tuneTXType = 2;
|
tuneTXType = 2;
|
||||||
printLineF2(F("Ham band mode"));
|
//printLineF2(F("Ham band mode"));
|
||||||
|
printLineF2(F("Ham band"));
|
||||||
}
|
}
|
||||||
delay_background(1000, 0);
|
delay_background(1000, 0);
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
printLineF2(F("Press to confirm"));
|
printLineF2(F("Press to confirm"));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char currentBandIndex = -1;
|
char currentBandIndex = -1;
|
||||||
//Save Band Information
|
//Save Band Information
|
||||||
@@ -92,7 +93,6 @@ void menuBand(int btn){
|
|||||||
ritDisable();
|
ritDisable();
|
||||||
|
|
||||||
while(!btnDown()){
|
while(!btnDown()){
|
||||||
|
|
||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
if (knob != 0){
|
if (knob != 0){
|
||||||
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
|
||||||
@@ -127,17 +127,7 @@ void menuBand(int btn){
|
|||||||
delay_background(20, 0);
|
delay_background(20, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
while(btnDown()) {
|
|
||||||
delay(50);
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
FrequencyToVFO(1);
|
FrequencyToVFO(1);
|
||||||
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//delay_background(500, 0);
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,25 +171,6 @@ void byteToMode(byte modeValue, byte autoSetModebyFreq){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
//Convert Number to Mode by KD8CEC
|
|
||||||
void byteWithFreqToMode(byte modeValue){
|
|
||||||
if (modeValue == 4)
|
|
||||||
cwMode = 1;
|
|
||||||
else if (modeValue == 5)
|
|
||||||
cwMode = 2;
|
|
||||||
else {
|
|
||||||
cwMode = 0;
|
|
||||||
if (modeValue == 3)
|
|
||||||
isUSB = 1;
|
|
||||||
else if (modeValue == 0) //Not Set
|
|
||||||
isUSB = (frequency > 10000000l) ? true : false;
|
|
||||||
else
|
|
||||||
isUSB = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//IF Shift function, BFO Change like RIT, by KD8CEC
|
//IF Shift function, BFO Change like RIT, by KD8CEC
|
||||||
void menuIFSSetup(int btn){
|
void menuIFSSetup(int btn){
|
||||||
int knob = 0;
|
int knob = 0;
|
||||||
@@ -209,14 +180,10 @@ void menuIFSSetup(int btn){
|
|||||||
if (isIFShift == 1)
|
if (isIFShift == 1)
|
||||||
printLineF2(F("IF Shift Change?"));
|
printLineF2(F("IF Shift Change?"));
|
||||||
else
|
else
|
||||||
printLineF2(F("IF Shift:Off, On?"));
|
printLineF2(F("IF Shift On?"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//if (isIFShift == 0){
|
|
||||||
//printLineF2(F("IF Shift is ON"));
|
|
||||||
//delay_background(500, 0);
|
|
||||||
isIFShift = 1;
|
isIFShift = 1;
|
||||||
//}
|
|
||||||
|
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
updateLine2Buffer(1);
|
updateLine2Buffer(1);
|
||||||
@@ -228,11 +195,13 @@ void menuIFSSetup(int btn){
|
|||||||
{
|
{
|
||||||
updateLine2Buffer(1);
|
updateLine2Buffer(1);
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
/*
|
||||||
if (cwMode == 0)
|
if (cwMode == 0)
|
||||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
else
|
else
|
||||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
*/
|
||||||
|
SetCarrierFreq();
|
||||||
|
|
||||||
needApplyChangeValue = 0;
|
needApplyChangeValue = 0;
|
||||||
}
|
}
|
||||||
@@ -240,12 +209,13 @@ void menuIFSSetup(int btn){
|
|||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
if (knob != 0){
|
if (knob != 0){
|
||||||
if (knob < 0)
|
if (knob < 0)
|
||||||
ifShiftValue -= 50l;
|
ifShiftValue -= 50;
|
||||||
else if (knob > 0)
|
else if (knob > 0)
|
||||||
ifShiftValue += 50;
|
ifShiftValue += 50;
|
||||||
|
|
||||||
needApplyChangeValue = 1;
|
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
|
||||||
@@ -253,13 +223,18 @@ void menuIFSSetup(int btn){
|
|||||||
if (btnDown() || ifShiftValue == 0)
|
if (btnDown() || ifShiftValue == 0)
|
||||||
{
|
{
|
||||||
isIFShift = 0;
|
isIFShift = 0;
|
||||||
printLineF2(F("IF Shift is OFF"));
|
ifShiftValue = 0;
|
||||||
|
//printLineF2(F("IF Shift is OFF"));
|
||||||
|
//printLineF2(F("OFF"));
|
||||||
|
//clearLine2();
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
delay_background(500, 0);
|
SetCarrierFreq();
|
||||||
|
//delay_background(1500, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//menuOn = 0;
|
//Store IF Shiift
|
||||||
//printLine2ClearAndUpdate();
|
EEPROM.put(IF_SHIFTVALUE, ifShiftValue);
|
||||||
|
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,17 +264,12 @@ void menuSelectMode(int btn){
|
|||||||
|
|
||||||
beforeMode = selectModeType;
|
beforeMode = selectModeType;
|
||||||
|
|
||||||
while(!btnDown() && digitalRead(PTT) == HIGH){
|
while(!btnDown()){
|
||||||
//Display Mode Name
|
//Display Mode Name
|
||||||
printLineF1(F("LSB USB CWL CWU"));
|
memset(c, 0, sizeof(c));
|
||||||
if (selectModeType == 0)
|
strcpy(c, " LSB USB CWL CWU");
|
||||||
printLineF1(F("LSB"));
|
c[selectModeType * 4] = '>';
|
||||||
else if (selectModeType == 1)
|
printLine1(c);
|
||||||
printLineF1(F("USB"));
|
|
||||||
else if (selectModeType == 2)
|
|
||||||
printLineF1(F("CWL"));
|
|
||||||
else if (selectModeType == 3)
|
|
||||||
printLineF1(F("CWU"));
|
|
||||||
|
|
||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
|
|
||||||
@@ -320,7 +290,8 @@ void menuSelectMode(int btn){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
//Check_Cat(0); //To prevent disconnections
|
||||||
|
delay_background(50, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (beforeMode != selectModeType) {
|
if (beforeMode != selectModeType) {
|
||||||
@@ -341,37 +312,34 @@ void menuSelectMode(int btn){
|
|||||||
FrequencyToVFO(1);
|
FrequencyToVFO(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
if (cwMode == 0)
|
if (cwMode == 0)
|
||||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
else
|
else
|
||||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
*/
|
||||||
|
SetCarrierFreq();
|
||||||
|
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
|
||||||
//delay_background(500, 0);
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Memory to VFO, VFO to Memory by KD8CEC
|
//Memory to VFO, VFO to Memory by KD8CEC
|
||||||
//select between MtoV and VtoM by isMemoryToVfo
|
|
||||||
void menuCHMemory(int btn, byte isMemoryToVfo){
|
void menuCHMemory(int btn, byte isMemoryToVfo){
|
||||||
int knob = 0;
|
int knob = 0;
|
||||||
int selectChannel = 0;
|
int selectChannel = 0;
|
||||||
byte isDisplayInfo = 1;
|
byte isDisplayInfo = 1;
|
||||||
byte isCancel = 0;
|
|
||||||
int moveStep = 0;
|
int moveStep = 0;
|
||||||
unsigned long resultFreq, tmpFreq = 0;
|
unsigned long resultFreq, tmpFreq = 0;
|
||||||
byte loadMode = 0;
|
byte loadMode = 0;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
if (isMemoryToVfo == 1)
|
if (isMemoryToVfo == 1)
|
||||||
printLine2("Channel To VFO?");
|
printLineF2(F("Channel To VFO?"));
|
||||||
else
|
else
|
||||||
printLine2("VFO To Channel?");
|
printLineF2(F("VFO To Channel?"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
@@ -383,7 +351,8 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
|||||||
|
|
||||||
if (selectChannel >= 20 || selectChannel <=-1)
|
if (selectChannel >= 20 || selectChannel <=-1)
|
||||||
{
|
{
|
||||||
strcpy(c, "Exit setup?");
|
//strcpy(c, "Exit setup?");
|
||||||
|
strcpy(c, "Exit?");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -412,10 +381,6 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
|||||||
strcat(c, b); //append channel Number;
|
strcat(c, b); //append channel Number;
|
||||||
strcat(c, " :"); //append channel Number;
|
strcat(c, " :"); //append channel Number;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (selectChannel < 10)
|
|
||||||
printLineFromEEPRom(0, 4, 0, userCallsignLength -1); //eeprom to lcd use offset (USER_CALLSIGN_DAT)
|
|
||||||
*/
|
|
||||||
|
|
||||||
//display frequency
|
//display frequency
|
||||||
tmpFreq = resultFreq;
|
tmpFreq = resultFreq;
|
||||||
@@ -472,7 +437,7 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Save current Frequency to Channel (selectChannel)
|
//Save current Frequency to Channel (selectChannel)
|
||||||
EEPROM.put(CHANNEL_FREQ + 4 * selectChannel, (frequency & 0x1FFFFFFF) | (modeToByte() << 29) );
|
EEPROM.put(CHANNEL_FREQ + 4 * selectChannel, (frequency & 0x1FFFFFFF) | (((unsigned long)modeToByte()) << 29) );
|
||||||
printLine2("Saved Frequency");
|
printLine2("Saved Frequency");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -491,7 +456,7 @@ void menuSetupKeyType(int btn){
|
|||||||
printLineF2(F("Change Key Type?"));
|
printLineF2(F("Change Key Type?"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printLineF2(F("Press to set Key"));
|
//printLineF2(F("Press to set Key")); //for reduce usable flash memory
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
selectedKeyType = cwKeyType;
|
selectedKeyType = cwKeyType;
|
||||||
|
|
||||||
@@ -540,9 +505,6 @@ void menuSetupKeyType(int btn){
|
|||||||
keyerControl |= IAMBICB;
|
keyerControl |= IAMBICB;
|
||||||
}
|
}
|
||||||
|
|
||||||
//delay_background(2000, 0);
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -573,18 +535,11 @@ void menuADCMonitor(int btn){
|
|||||||
adcPinA0 = analogRead(A0); //A0(BLACK, EncoderA)
|
adcPinA0 = analogRead(A0); //A0(BLACK, EncoderA)
|
||||||
adcPinA1 = analogRead(A1); //A1(BROWN, EncoderB)
|
adcPinA1 = analogRead(A1); //A1(BROWN, EncoderB)
|
||||||
adcPinA2 = analogRead(A2); //A2(RED, Function Key)
|
adcPinA2 = analogRead(A2); //A2(RED, Function Key)
|
||||||
adcPinA3 = analogRead(A3); //A3(ORANGE, CW Key)
|
adcPinA3 = analogRead(A3); //A3(PTT)
|
||||||
adcPinA6 = analogRead(A6); //A6(BLUE, Ptt)
|
adcPinA6 = analogRead(A6); //A6(KEYER)
|
||||||
adcPinA7 = analogRead(A7); //A7(VIOLET, Spare)
|
adcPinA7 = analogRead(A7); //A7(VIOLET, Spare)
|
||||||
|
|
||||||
/*
|
if (adcPinA3 < 50) {
|
||||||
sprintf(c, "%4d %4d %4d", adcPinA0, adcPinA1, adcPinA2);
|
|
||||||
printLine1(c);
|
|
||||||
sprintf(c, "%4d %4d %4d", adcPinA3, adcPinA6, adcPinA7);
|
|
||||||
printLine2(c);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (adcPinA6 < 10) {
|
|
||||||
if (pressKeyTime == 0)
|
if (pressKeyTime == 0)
|
||||||
pressKeyTime = millis();
|
pressKeyTime = millis();
|
||||||
else if (pressKeyTime < (millis() - 3000))
|
else if (pressKeyTime < (millis() - 3000))
|
||||||
@@ -623,13 +578,11 @@ void menuADCMonitor(int btn){
|
|||||||
delay_background(200, 0);
|
delay_background(200, 0);
|
||||||
} //end of while
|
} //end of while
|
||||||
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//VFO Toggle and save VFO Information, modified by KD8CEC
|
//VFO Toggle and save VFO Information, modified by KD8CEC
|
||||||
void menuVfoToggle(int btn, char isUseDelayTime)
|
void menuVfoToggle(int btn)
|
||||||
{
|
{
|
||||||
if (!btn){
|
if (!btn){
|
||||||
if (vfoActive == VFO_A)
|
if (vfoActive == VFO_A)
|
||||||
@@ -641,60 +594,43 @@ void menuVfoToggle(int btn, char isUseDelayTime)
|
|||||||
FrequencyToVFO(1);
|
FrequencyToVFO(1);
|
||||||
|
|
||||||
if (vfoActive == VFO_B){
|
if (vfoActive == VFO_B){
|
||||||
//vfoB = frequency;
|
|
||||||
//vfoB_mode = modeToByte();
|
|
||||||
//storeFrequencyAndMode(2); //vfoB -> eeprom
|
|
||||||
|
|
||||||
vfoActive = VFO_A;
|
vfoActive = VFO_A;
|
||||||
frequency = vfoA;
|
frequency = vfoA;
|
||||||
saveCheckFreq = frequency;
|
saveCheckFreq = frequency;
|
||||||
byteToMode(vfoA_mode, 0);
|
byteToMode(vfoA_mode, 0);
|
||||||
//printLineF2(F("Selected VFO A"));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//vfoA = frequency;
|
|
||||||
//vfoA_mode = modeToByte();
|
|
||||||
//storeFrequencyAndMode(1); //vfoA -> eeprom
|
|
||||||
|
|
||||||
vfoActive = VFO_B;
|
vfoActive = VFO_B;
|
||||||
frequency = vfoB;
|
frequency = vfoB;
|
||||||
saveCheckFreq = frequency;
|
saveCheckFreq = frequency;
|
||||||
byteToMode(vfoB_mode, 0);
|
byteToMode(vfoB_mode, 0);
|
||||||
//printLineF2(F("Selected VFO B"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ritDisable();
|
ritDisable();
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
|
|
||||||
//if (isUseDelayTime == 1) //Found Issue in wsjt-x Linux 32bit
|
|
||||||
// delay_background(500, 0);
|
|
||||||
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//modified for reduce used flash memory by KD8CEC
|
||||||
void menuRitToggle(int btn){
|
void menuRitToggle(int btn){
|
||||||
if (!btn){
|
if (!btn){
|
||||||
if (ritOn == 1)
|
if (ritOn == 1)
|
||||||
printLineF2(F("RIT:On, Off?"));
|
printLineF2(F("RIT Off?"));
|
||||||
else
|
else
|
||||||
printLineF2(F("RIT:Off, On?"));
|
printLineF2(F("RIT On?"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (ritOn == 0){
|
if (ritOn == 0){
|
||||||
printLineF2(F("RIT is ON"));
|
//printLineF2(F("RIT is ON"));
|
||||||
//enable RIT so the current frequency is used at transmit
|
//enable RIT so the current frequency is used at transmit
|
||||||
ritEnable(frequency);
|
ritEnable(frequency);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
printLineF2(F("RIT is OFF"));
|
//printLineF2(F("RIT is OFF"));
|
||||||
ritDisable();
|
ritDisable();
|
||||||
}
|
}
|
||||||
//delay_background(500, 0);
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -710,23 +646,21 @@ void menuSplitOnOff(int btn){
|
|||||||
else {
|
else {
|
||||||
if (splitOn == 1){
|
if (splitOn == 1){
|
||||||
splitOn = 0;
|
splitOn = 0;
|
||||||
printLineF2(F("Split 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("Split On!"));
|
//printLineF2(F("Split On!"));
|
||||||
|
printLineF2(F("[ON]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//delay_background(500, 0);
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Function to disbled transmission
|
//Function to disbled transmission
|
||||||
//by KD8CEC
|
//by KD8CEC
|
||||||
void menuTxOnOff(int btn, byte optionType){
|
void menuTxOnOff(int btn, byte optionType){
|
||||||
@@ -746,9 +680,6 @@ void menuTxOnOff(int btn, byte optionType){
|
|||||||
printLineF2(F("TX ON!"));
|
printLineF2(F("TX ON!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//delay_background(500, 0);
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(500);
|
menuClearExit(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -764,17 +695,18 @@ void menuSetup(int btn){
|
|||||||
else
|
else
|
||||||
printLineF2(F("Setup Off?"));
|
printLineF2(F("Setup Off?"));
|
||||||
}else {
|
}else {
|
||||||
|
modeCalibrate = ! modeCalibrate;
|
||||||
|
/*
|
||||||
if (!modeCalibrate){
|
if (!modeCalibrate){
|
||||||
modeCalibrate = true;
|
modeCalibrate = true;
|
||||||
printLineF2(F("Setup:On"));
|
//printLineF2(F("Setup:On"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
modeCalibrate = false;
|
modeCalibrate = false;
|
||||||
printLineF2(F("Setup:Off"));
|
//printLineF2(F("Setup:Off"));
|
||||||
}
|
}
|
||||||
//delay_background(2000, 0);
|
*/
|
||||||
//printLine2Clear();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -802,14 +734,14 @@ void menuCWSpeed(int btn){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF1(F("Press to set WPm"));
|
printLineF1(F("Press to set WPM"));
|
||||||
strcpy(b, "WPM:");
|
strcpy(b, "WPM:");
|
||||||
itoa(wpm,c, 10);
|
itoa(wpm,c, 10);
|
||||||
strcat(b, c);
|
strcat(b, c);
|
||||||
printLine2(b);
|
printLine2(b);
|
||||||
delay_background(300, 0);
|
delay_background(300, 0);
|
||||||
|
|
||||||
while(!btnDown() && digitalRead(PTT) == HIGH){
|
while(!btnDown()){
|
||||||
|
|
||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
if (knob != 0){
|
if (knob != 0){
|
||||||
@@ -824,29 +756,30 @@ void menuCWSpeed(int btn){
|
|||||||
printLine2(b);
|
printLine2(b);
|
||||||
}
|
}
|
||||||
//abort if this button is down
|
//abort if this button is down
|
||||||
if (btnDown())
|
//if (btnDown())
|
||||||
//re-enable the clock1 and clock 2
|
//re-enable the clock1 and clock 2
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
Check_Cat(0); //To prevent disconnections
|
||||||
}
|
}
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
//if (digitalRead(PTT) == LOW){
|
//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);
|
||||||
//}
|
|
||||||
//delay_background(2000, 0);
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void displayEmptyData(void){
|
||||||
|
printLineF2(F("Empty data"));
|
||||||
|
delay_background(2000, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//Builtin CW Keyer Logic by KD8CEC
|
//Builtin CW Keyer Logic by KD8CEC
|
||||||
void menuCWAutoKey(int btn){
|
void menuCWAutoKey(int btn){
|
||||||
if (!btn){
|
if (!btn){
|
||||||
printLineF2(F("CW AutoKey Mode?"));
|
printLineF2(F("Memory Keyer"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -854,12 +787,12 @@ void menuCWAutoKey(int btn){
|
|||||||
EEPROM.get(CW_AUTO_COUNT, cwAutoTextCount);
|
EEPROM.get(CW_AUTO_COUNT, cwAutoTextCount);
|
||||||
if (EEPROM.read(CW_AUTO_MAGIC_KEY) != 0x73 || cwAutoTextCount < 1)
|
if (EEPROM.read(CW_AUTO_MAGIC_KEY) != 0x73 || cwAutoTextCount < 1)
|
||||||
{
|
{
|
||||||
printLineF2(F("Empty CW data"));
|
displayEmptyData();
|
||||||
delay_background(2000, 0);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF1(F("Press PTT to Send"));
|
//printLineF1(F("Press PTT to Send"));
|
||||||
|
printLineF1(F("PTT to Send"));
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
beforeCWTextIndex = 255; //255 value is for start check
|
beforeCWTextIndex = 255; //255 value is for start check
|
||||||
@@ -867,14 +800,34 @@ void menuCWAutoKey(int btn){
|
|||||||
menuOn = 0;
|
menuOn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Standalone WSPR Beacone
|
||||||
|
void menuWSPRSend(int btn){
|
||||||
|
if (!btn){
|
||||||
|
printLineF2(F("WSPR Beacon"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WsprMSGCount = EEPROM.read(WSPR_COUNT);
|
||||||
|
|
||||||
|
if (WsprMSGCount < 1)
|
||||||
|
{
|
||||||
|
displayEmptyData();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendWSPRManage();
|
||||||
|
menuClearExit(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Modified by KD8CEC
|
//Modified by KD8CEC
|
||||||
void menuSetupCwDelay(int btn){
|
void menuSetupCwDelay(int btn){
|
||||||
int knob = 0;
|
int knob = 0;
|
||||||
int tmpCWDelay = cwDelayTime * 10;
|
int tmpCWDelay = cwDelayTime * 10;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
strcpy(b, "CW TX->RX Delay");
|
printLineF2(F("CW TX->RX Delay"));
|
||||||
printLine2(b);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -885,7 +838,7 @@ void menuSetupCwDelay(int btn){
|
|||||||
printLine2(b);
|
printLine2(b);
|
||||||
delay_background(300, 0);
|
delay_background(300, 0);
|
||||||
|
|
||||||
while(!btnDown() && digitalRead(PTT) == HIGH){
|
while(!btnDown()){
|
||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
if (knob != 0){
|
if (knob != 0){
|
||||||
if (tmpCWDelay > 3 && knob < 0)
|
if (tmpCWDelay > 3 && knob < 0)
|
||||||
@@ -906,64 +859,62 @@ void menuSetupCwDelay(int btn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
//if (digitalRead(PTT) == LOW){
|
//printLineF2(F("CW Delay set!"));
|
||||||
printLineF2(F("CW Delay set!"));
|
|
||||||
cwDelayTime = tmpCWDelay / 10;
|
cwDelayTime = tmpCWDelay / 10;
|
||||||
EEPROM.put(CW_DELAY, cwDelayTime);
|
EEPROM.put(CW_DELAY, cwDelayTime);
|
||||||
//delay_background(2000, 0);
|
|
||||||
//}
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CW Time delay by KD8CEC
|
//CW Time delay by KD8CEC
|
||||||
void menuSetupTXCWInterval(int btn){
|
void menuSetupTXCWInterval(int btn){
|
||||||
|
char needDisplayInformation = 1;
|
||||||
int knob = 0;
|
int knob = 0;
|
||||||
int tmpTXCWInterval = delayBeforeCWStartTime * 2;
|
int tmpTXCWInterval = delayBeforeCWStartTime * 2;
|
||||||
|
|
||||||
if (!btn){
|
if (!btn){
|
||||||
strcpy(b, "CW Start Delay");
|
printLineF2(F("CW Start Delay"));
|
||||||
printLine2(b);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printLineF1(F("Press, set Delay"));
|
printLineF1(F("Press, set Delay"));
|
||||||
|
delay_background(300, 0);
|
||||||
|
|
||||||
|
while(!btnDown()){
|
||||||
|
|
||||||
|
if (needDisplayInformation == 1) {
|
||||||
strcpy(b, "Start Delay:");
|
strcpy(b, "Start Delay:");
|
||||||
itoa(tmpTXCWInterval,c, 10);
|
itoa(tmpTXCWInterval,c, 10);
|
||||||
strcat(b, c);
|
strcat(b, c);
|
||||||
printLine2(b);
|
printLine2(b);
|
||||||
delay_background(300, 0);
|
needDisplayInformation = 0;
|
||||||
|
}
|
||||||
|
|
||||||
while(!btnDown() && digitalRead(PTT) == HIGH){
|
|
||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
if (knob != 0){
|
if (knob != 0){
|
||||||
if (tmpTXCWInterval > 0 && knob < 0)
|
if (tmpTXCWInterval > 0 && knob < 0)
|
||||||
tmpTXCWInterval -= 2;
|
tmpTXCWInterval -= 2;
|
||||||
if (tmpTXCWInterval < 500 && knob > 0)
|
if (tmpTXCWInterval < 500 && knob > 0)
|
||||||
tmpTXCWInterval += 2;
|
tmpTXCWInterval += 2;
|
||||||
|
/*
|
||||||
strcpy(b, "Start Delay:");
|
strcpy(b, "Start Delay:");
|
||||||
itoa(tmpTXCWInterval,c, 10);
|
itoa(tmpTXCWInterval,c, 10);
|
||||||
strcat(b, c);
|
strcat(b, c);
|
||||||
printLine2(b);
|
printLine2(b);
|
||||||
|
*/
|
||||||
|
needDisplayInformation = 1;
|
||||||
}
|
}
|
||||||
//abort if this button is down
|
//abort if this button is down
|
||||||
if (btnDown())
|
//if (btnDown())
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
Check_Cat(0); //To prevent disconnections
|
||||||
}
|
}
|
||||||
|
|
||||||
//save the setting
|
//save the setting
|
||||||
//if (digitalRead(PTT) == LOW){
|
//printLineF2(F("CW Start set!"));
|
||||||
printLineF2(F("CW Start set!"));
|
|
||||||
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
||||||
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
||||||
//delay_background(2000, 0);
|
|
||||||
//}
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(1000);
|
menuClearExit(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1158,9 +1109,9 @@ void menuSetupCarrier(int btn){
|
|||||||
knob = enc_read();
|
knob = enc_read();
|
||||||
|
|
||||||
if (knob > 0)
|
if (knob > 0)
|
||||||
usbCarrier -= 50;
|
usbCarrier -= 5;
|
||||||
else if (knob < 0)
|
else if (knob < 0)
|
||||||
usbCarrier += 50;
|
usbCarrier += 5;
|
||||||
else
|
else
|
||||||
continue; //don't update the frequency or the display
|
continue; //don't update the frequency or the display
|
||||||
|
|
||||||
@@ -1224,8 +1175,6 @@ void menuSetupCWCarrier(int btn){
|
|||||||
si5351bx_setfreq(0, cwmCarrier);
|
si5351bx_setfreq(0, cwmCarrier);
|
||||||
printCarrierFreq(cwmCarrier);
|
printCarrierFreq(cwmCarrier);
|
||||||
|
|
||||||
//Check_Cat(0); //To prevent disconnections
|
|
||||||
//delay(100);
|
|
||||||
delay_background(100, 0);
|
delay_background(100, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1244,8 +1193,6 @@ void menuSetupCWCarrier(int btn){
|
|||||||
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||||
|
|
||||||
setFrequency(frequency);
|
setFrequency(frequency);
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1281,8 +1228,6 @@ void menuSetupCwTone(int btn){
|
|||||||
itoa(sideTone, b, 10);
|
itoa(sideTone, b, 10);
|
||||||
printLine2(b);
|
printLine2(b);
|
||||||
|
|
||||||
//delay(100);
|
|
||||||
//Check_Cat(0); //To prevent disconnections
|
|
||||||
delay_background(100, 0);
|
delay_background(100, 0);
|
||||||
}
|
}
|
||||||
noTone(CW_TONE);
|
noTone(CW_TONE);
|
||||||
@@ -1295,8 +1240,6 @@ void menuSetupCwTone(int btn){
|
|||||||
else
|
else
|
||||||
sideTone = prev_sideTone;
|
sideTone = prev_sideTone;
|
||||||
|
|
||||||
//printLine2ClearAndUpdate();
|
|
||||||
//menuOn = 0;
|
|
||||||
menuClearExit(0);
|
menuClearExit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1309,19 +1252,14 @@ void setDialLock(byte tmpLock, byte fromMode) {
|
|||||||
|
|
||||||
if (fromMode == 2 || fromMode == 3) return;
|
if (fromMode == 2 || fromMode == 3) return;
|
||||||
|
|
||||||
if (tmpLock == 1)
|
//delay_background(1000, 0);
|
||||||
printLineF2(F("Dial Lock ON"));
|
|
||||||
else
|
|
||||||
printLineF2(F("Dial Lock OFF"));
|
|
||||||
|
|
||||||
delay_background(1000, 0);
|
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int btnDownTimeCount;
|
byte btnDownTimeCount;
|
||||||
|
|
||||||
#define PRESS_ADJUST_TUNE 1000
|
#define PRESS_ADJUST_TUNE 20 //1000msec 20 * 50 = 1000milisec
|
||||||
#define PRESS_LOCK_CONTROL 2000
|
#define PRESS_LOCK_CONTROL 40 //2000msec 40 * 50 = 2000milisec
|
||||||
|
|
||||||
//Modified by KD8CEC
|
//Modified by KD8CEC
|
||||||
void doMenu(){
|
void doMenu(){
|
||||||
@@ -1335,14 +1273,12 @@ void doMenu(){
|
|||||||
|
|
||||||
//Appened Lines by KD8CEC for Adjust Tune step and Set Dial lock
|
//Appened Lines by KD8CEC for Adjust Tune step and Set Dial lock
|
||||||
while(btnDown()){
|
while(btnDown()){
|
||||||
//delay(50);
|
|
||||||
//Check_Cat(0); //To prevent disconnections
|
|
||||||
delay_background(50, 0);
|
delay_background(50, 0);
|
||||||
|
|
||||||
if (btnDownTimeCount++ == (PRESS_ADJUST_TUNE / 50)) { //Set Tune Step
|
if (btnDownTimeCount++ == (PRESS_ADJUST_TUNE)) { //Set Tune Step
|
||||||
printLineF2(F("Set Tune Step?"));
|
printLineF2(F("Set Tune Step?"));
|
||||||
}
|
}
|
||||||
else if (btnDownTimeCount > (PRESS_LOCK_CONTROL / 50)) { //check long time Down Button -> 2.5 Second => Lock
|
else if (btnDownTimeCount > (PRESS_LOCK_CONTROL)) { //check long time Down Button -> 2.5 Second => Lock
|
||||||
if (vfoActive == VFO_A)
|
if (vfoActive == VFO_A)
|
||||||
setDialLock((isDialLock & 0x01) == 0x01 ? 0 : 1, 0); //Reverse Dial lock
|
setDialLock((isDialLock & 0x01) == 0x01 ? 0 : 1, 0); //Reverse Dial lock
|
||||||
else
|
else
|
||||||
@@ -1353,15 +1289,13 @@ void doMenu(){
|
|||||||
delay(50); //debounce
|
delay(50); //debounce
|
||||||
|
|
||||||
//ADJUST TUNE STEP
|
//ADJUST TUNE STEP
|
||||||
if (btnDownTimeCount > (PRESS_ADJUST_TUNE / 50))
|
if (btnDownTimeCount > PRESS_ADJUST_TUNE)
|
||||||
{
|
{
|
||||||
printLineF1(F("Press to set step"));
|
printLineF1(F("Press to set"));
|
||||||
isNeedDisplay = 1; //check to need display for display current value
|
isNeedDisplay = 1; //check to need display for display current value
|
||||||
|
|
||||||
while (digitalRead(PTT) == HIGH && !btnDown())
|
while (!btnDown())
|
||||||
{
|
{
|
||||||
//Check_Cat(0); //To prevent disconnections
|
|
||||||
//delay(50); //debounce
|
|
||||||
delay_background(50, 0);
|
delay_background(50, 0);
|
||||||
|
|
||||||
if (isNeedDisplay) {
|
if (isNeedDisplay) {
|
||||||
@@ -1392,8 +1326,6 @@ void doMenu(){
|
|||||||
}
|
}
|
||||||
} //end of while
|
} //end of while
|
||||||
|
|
||||||
printLineF2(F("Changed Step!"));
|
|
||||||
//SAVE EEPROM
|
|
||||||
EEPROM.put(TUNING_STEP, tuneStepIndex);
|
EEPROM.put(TUNING_STEP, tuneStepIndex);
|
||||||
delay_background(500, 0);
|
delay_background(500, 0);
|
||||||
printLine2ClearAndUpdate();
|
printLine2ClearAndUpdate();
|
||||||
@@ -1408,41 +1340,88 @@ void doMenu(){
|
|||||||
btnState = btnDown();
|
btnState = btnDown();
|
||||||
|
|
||||||
if (i > 0){
|
if (i > 0){
|
||||||
if (modeCalibrate && select + i < 220)
|
if (modeCalibrate && select + i < 240)
|
||||||
select += i;
|
select += i;
|
||||||
if (!modeCalibrate && select + i < 120)
|
if (!modeCalibrate && select + i < 130)
|
||||||
select += i;
|
select += i;
|
||||||
}
|
}
|
||||||
//if (i < 0 && select - i >= 0)
|
|
||||||
if (i < 0 && select - i >= -10)
|
if (i < 0 && select - i >= -10)
|
||||||
select += i; //caught ya, i is already -ve here, so you add it
|
select += i; //caught ya, i is already -ve here, so you add it
|
||||||
|
|
||||||
if (select < -5)
|
//if -> switch reduce program memory 200byte
|
||||||
menuExit(btnState);
|
switch (select / 10)
|
||||||
else if (select < 10)
|
{
|
||||||
|
case 0 :
|
||||||
menuBand(btnState);
|
menuBand(btnState);
|
||||||
else if (select < 20)
|
break;
|
||||||
menuVfoToggle(btnState, 1);
|
case 1 :
|
||||||
else if (select < 30)
|
menuVfoToggle(btnState);
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
menuSelectMode(btnState);
|
menuSelectMode(btnState);
|
||||||
else if (select < 40)
|
break;
|
||||||
|
case 3 :
|
||||||
menuRitToggle(btnState);
|
menuRitToggle(btnState);
|
||||||
else if (select < 50)
|
break;
|
||||||
|
case 4 :
|
||||||
menuIFSSetup(btnState);
|
menuIFSSetup(btnState);
|
||||||
else if (select < 60)
|
break;
|
||||||
|
case 5 :
|
||||||
menuCWSpeed(btnState);
|
menuCWSpeed(btnState);
|
||||||
else if (select < 70)
|
break;
|
||||||
|
case 6 :
|
||||||
menuSplitOnOff(btnState); //SplitOn / off
|
menuSplitOnOff(btnState); //SplitOn / off
|
||||||
else if (select < 80)
|
break;
|
||||||
|
case 7 :
|
||||||
menuCHMemory(btnState, 0); //VFO to Memroy
|
menuCHMemory(btnState, 0); //VFO to Memroy
|
||||||
else if (select < 90)
|
break;
|
||||||
|
case 8 :
|
||||||
menuCHMemory(btnState, 1); //Memory to VFO
|
menuCHMemory(btnState, 1); //Memory to VFO
|
||||||
else if (select < 100)
|
break;
|
||||||
|
case 9 :
|
||||||
menuCWAutoKey(btnState);
|
menuCWAutoKey(btnState);
|
||||||
else if (select < 110)
|
break;
|
||||||
|
case 10 :
|
||||||
|
menuWSPRSend(btnState);
|
||||||
|
break;
|
||||||
|
case 11 :
|
||||||
menuSetup(btnState);
|
menuSetup(btnState);
|
||||||
else if (select < 120)
|
break;
|
||||||
|
case 12 :
|
||||||
menuExit(btnState);
|
menuExit(btnState);
|
||||||
|
break;
|
||||||
|
case 13 :
|
||||||
|
menuSetupCalibration(btnState); //crystal
|
||||||
|
break;
|
||||||
|
case 14 :
|
||||||
|
menuSetupCarrier(btnState); //lsb
|
||||||
|
break;
|
||||||
|
case 15 :
|
||||||
|
menuSetupCWCarrier(btnState); //lsb
|
||||||
|
break;
|
||||||
|
case 16 :
|
||||||
|
menuSetupCwTone(btnState);
|
||||||
|
break;
|
||||||
|
case 17 :
|
||||||
|
menuSetupCwDelay(btnState);
|
||||||
|
break;
|
||||||
|
case 18 :
|
||||||
|
menuSetupTXCWInterval(btnState);
|
||||||
|
break;
|
||||||
|
case 19 :
|
||||||
|
menuSetupKeyType(btnState);
|
||||||
|
break;
|
||||||
|
case 20 :
|
||||||
|
menuADCMonitor(btnState);
|
||||||
|
break;
|
||||||
|
case 21 :
|
||||||
|
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
menuExit(btnState); break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
else if (select < 130 && modeCalibrate)
|
else if (select < 130 && modeCalibrate)
|
||||||
menuSetupCalibration(btnState); //crystal
|
menuSetupCalibration(btnState); //crystal
|
||||||
else if (select < 140 && modeCalibrate)
|
else if (select < 140 && modeCalibrate)
|
||||||
@@ -1463,14 +1442,16 @@ void doMenu(){
|
|||||||
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
||||||
else if (select < 220 && modeCalibrate)
|
else if (select < 220 && modeCalibrate)
|
||||||
menuExit(btnState);
|
menuExit(btnState);
|
||||||
|
*/
|
||||||
|
|
||||||
Check_Cat(0); //To prevent disconnections
|
Check_Cat(0); //To prevent disconnections
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
//debounce the button
|
//debounce the button
|
||||||
while(btnDown()){
|
while(btnDown()){
|
||||||
delay_background(50, 0); //To prevent disconnections
|
delay_background(50, 0); //To prevent disconnections
|
||||||
}
|
}
|
||||||
//delay(50);
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,19 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* KD8CEC
|
||||||
|
* kd8cec@gmail.com http://www.hamskey.com
|
||||||
|
*
|
||||||
|
* Merge two SI5351 Librarys
|
||||||
|
* KE7ER's fixed vco and variable Clocks Configure values
|
||||||
|
* G3ZIL's fixed Clock Configure Value and variable VCO
|
||||||
|
* * I have combined the two libraries above. All licenses follow the above library.
|
||||||
|
*
|
||||||
|
* PLL-A is generated by fixing 850Mhz clock. All output clocks use PLL-A to
|
||||||
|
* generate the frequency. This is the method used in QRP radios such as uBITX.
|
||||||
|
* When switching to WSPR transmission mode, PLL-B operates for the base frequency to transmit WSPR.
|
||||||
|
* 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.
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
// ************* 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.
|
||||||
@@ -60,6 +76,7 @@ void i2cWriten(uint8_t reg, uint8_t *vals, uint8_t vcnt) { // write array
|
|||||||
Wire.endTransmission();
|
Wire.endTransmission();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t si5351Val[8] = {0, 1, 0, 0, 0, 0, 0, 0}; //for reduce program memory size
|
||||||
|
|
||||||
void si5351bx_init() { // Call once at power-up, start PLLA
|
void si5351bx_init() { // Call once at power-up, start PLLA
|
||||||
uint32_t msxp1;
|
uint32_t msxp1;
|
||||||
@@ -68,11 +85,13 @@ void si5351bx_init() { // Call once at power-up, start PLLA
|
|||||||
i2cWrite(3, si5351bx_clken); // Disable all CLK output drivers
|
i2cWrite(3, si5351bx_clken); // Disable all CLK output drivers
|
||||||
i2cWrite(183, SI5351BX_XTALPF << 6); // Set 25mhz crystal load capacitance
|
i2cWrite(183, SI5351BX_XTALPF << 6); // Set 25mhz crystal load capacitance
|
||||||
msxp1 = 128 * SI5351BX_MSA - 512; // and msxp2=0, msxp3=1, not fractional
|
msxp1 = 128 * SI5351BX_MSA - 512; // and msxp2=0, msxp3=1, not fractional
|
||||||
uint8_t vals[8] = {0, 1, BB2(msxp1), BB1(msxp1), BB0(msxp1), 0, 0, 0};
|
//uint8_t vals[8] = {0, 1, BB2(msxp1), BB1(msxp1), BB0(msxp1), 0, 0, 0};
|
||||||
i2cWriten(26, vals, 8); // Write to 8 PLLA msynth regs
|
si5351Val[2] = BB2(msxp1);
|
||||||
|
si5351Val[3] = BB1(msxp1);
|
||||||
|
si5351Val[4] = BB0(msxp1);
|
||||||
|
|
||||||
|
i2cWriten(26, si5351Val, 8); // Write to 8 PLLA msynth regs
|
||||||
i2cWrite(177, 0x20); // Reset PLLA (0x80 resets PLLB)
|
i2cWrite(177, 0x20); // Reset PLLA (0x80 resets PLLB)
|
||||||
// for (reg=16; reg<=23; reg++) i2cWrite(reg, 0x80); // Powerdown CLK's
|
|
||||||
// i2cWrite(187, 0); // No fannout of clkin, xtal, ms0, ms4
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void si5351bx_setfreq(uint8_t clknum, uint32_t fout) { // Set a CLK to fout Hz
|
void si5351bx_setfreq(uint8_t clknum, uint32_t fout) { // Set a CLK to fout Hz
|
||||||
@@ -105,15 +124,48 @@ void si5351_set_calibration(int32_t cal){
|
|||||||
si5351bx_setfreq(0, usbCarrier);
|
si5351bx_setfreq(0, usbCarrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initOscillators(){
|
void SetCarrierFreq()
|
||||||
//initialize the SI5351
|
{
|
||||||
si5351bx_init();
|
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
||||||
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
|
si5351bx_setfreq(0, appliedCarrier);
|
||||||
|
|
||||||
|
/*
|
||||||
if (cwMode == 0)
|
if (cwMode == 0)
|
||||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
|
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
|
||||||
else
|
else
|
||||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0));
|
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void initOscillators(){
|
||||||
|
//initialize the SI5351
|
||||||
|
si5351bx_init();
|
||||||
|
si5351bx_vcoa = (SI5351BX_XTAL * SI5351BX_MSA) + calibration; // apply the calibration correction factor
|
||||||
|
SetCarrierFreq();
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================
|
||||||
|
// ADD FUNCTIONS by KD8CEC
|
||||||
|
//============================================================
|
||||||
|
uint8_t Wspr_Reg1[8] = {0xFF,0xFE, 0x00, 0, 0, 0, 0, 0}; //3, 4, 5, 6, 7
|
||||||
|
uint8_t Wspr_Reg2[8] = {0, 1, 0, 0, 0, 0, 0, 0}; //2, 3, 4
|
||||||
|
|
||||||
|
void Set_WSPR_Param(void)
|
||||||
|
{
|
||||||
|
i2cWrite(18, 128);
|
||||||
|
i2cWriten(34, Wspr_Reg1, 8);
|
||||||
|
i2cWriten(58, Wspr_Reg2, 8);
|
||||||
|
i2cWrite(177, 128);
|
||||||
|
i2cWrite(18, 111);
|
||||||
|
|
||||||
|
si5351bx_clken &= ~(1 << 2);
|
||||||
|
i2cWrite(3, si5351bx_clken);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TXSubFreq(unsigned long P2)
|
||||||
|
{
|
||||||
|
i2cWrite(40, (P2 & 65280) >> 8);
|
||||||
|
i2cWrite(41, P2 & 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
//#define printLineF2(x) (printLineF(0, x))
|
//#define printLineF2(x) (printLineF(0, x))
|
||||||
|
|
||||||
//returns true if the button is pressed
|
//returns true if the button is pressed
|
||||||
int btnDown(){
|
int btnDown(void){
|
||||||
if (digitalRead(FBUTTON) == HIGH)
|
if (digitalRead(FBUTTON) == HIGH)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
@@ -99,8 +99,6 @@ void initMeter(){
|
|||||||
//0 ~ 25 : 30 over : + 10
|
//0 ~ 25 : 30 over : + 10
|
||||||
void drawMeter(int needle) {
|
void drawMeter(int needle) {
|
||||||
//5Char + O over
|
//5Char + O over
|
||||||
int drawCharLength = needle / 5;
|
|
||||||
int drawCharLengthLast = needle % 5;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 5; i++) {
|
for (i = 0; i < 5; i++) {
|
||||||
@@ -175,7 +173,7 @@ void printLineF(char linenmbr, const __FlashStringHelper *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define LCD_MAX_COLUMN 16
|
#define LCD_MAX_COLUMN 16
|
||||||
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex) {
|
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetTtype) {
|
||||||
if ((displayOption1 & 0x01) == 0x01)
|
if ((displayOption1 & 0x01) == 0x01)
|
||||||
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
||||||
|
|
||||||
@@ -184,7 +182,7 @@ void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, b
|
|||||||
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||||||
{
|
{
|
||||||
if (++lcdColumn <= LCD_MAX_COLUMN)
|
if (++lcdColumn <= LCD_MAX_COLUMN)
|
||||||
lcd.write(EEPROM.read(USER_CALLSIGN_DAT + i));
|
lcd.write(EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i));
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -283,6 +281,15 @@ void updateDisplay() {
|
|||||||
strcat(c, "B:");
|
strcat(c, "B:");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Fixed by Mitani Massaru (JE4SMQ)
|
||||||
|
if (isShiftDisplayCWFreq == 1)
|
||||||
|
{
|
||||||
|
if (cwMode == 1) //CWL
|
||||||
|
tmpFreq = tmpFreq - sideTone + shiftDisplayAdjustVal;
|
||||||
|
else if (cwMode == 2) //CWU
|
||||||
|
tmpFreq = tmpFreq + sideTone + shiftDisplayAdjustVal;
|
||||||
|
}
|
||||||
|
|
||||||
//display frequency
|
//display frequency
|
||||||
for (int i = 15; i >= 6; i--) {
|
for (int i = 15; i >= 6; i--) {
|
||||||
if (tmpFreq > 0) {
|
if (tmpFreq > 0) {
|
||||||
@@ -320,22 +327,6 @@ void updateDisplay() {
|
|||||||
lcd.setCursor(5,diplayVFOLine);
|
lcd.setCursor(5,diplayVFOLine);
|
||||||
lcd.write(":");
|
lcd.write(":");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
//now, the second line
|
|
||||||
memset(c, 0, sizeof(c));
|
|
||||||
memset(b, 0, sizeof(b));
|
|
||||||
|
|
||||||
if (inTx)
|
|
||||||
strcat(c, "TX ");
|
|
||||||
else if (ritOn)
|
|
||||||
strcpy(c, "RIT");
|
|
||||||
|
|
||||||
strcpy(c, " \xff");
|
|
||||||
drawMeter(meter_reading);
|
|
||||||
strcat(c, meter);
|
|
||||||
strcat(c, "\xff");
|
|
||||||
printLine2(c);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int enc_prev_state = 3;
|
int enc_prev_state = 3;
|
||||||
|
193
ubitx_20/ubitx_wspr.cpp
Normal file
193
ubitx_20/ubitx_wspr.cpp
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
/**********************************************************************************
|
||||||
|
WSPR SENDER for uBITX by KD8CEC
|
||||||
|
Some of the code that sends WSPR referenced the code in G3ZIL.
|
||||||
|
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
|
||||||
|
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 <arduino.h>
|
||||||
|
#include <EEPROM.h>
|
||||||
|
#include "ubitx.h"
|
||||||
|
|
||||||
|
//begin of test
|
||||||
|
byte WsprToneCode[164];
|
||||||
|
|
||||||
|
long lastTime=0;
|
||||||
|
unsigned long TX_MSNB_P2; // Si5351 register MSNB_P2 PLLB for Tx
|
||||||
|
unsigned long TX_P2; // Variable values for MSNB_P2 which defines the frequencies for the data
|
||||||
|
|
||||||
|
extern int enc_read(void);
|
||||||
|
|
||||||
|
byte WsprMSGCount = 0;
|
||||||
|
#define PTT (A3)
|
||||||
|
|
||||||
|
#define WSPR_BAND1 401
|
||||||
|
|
||||||
|
extern uint8_t Wspr_Reg1[8]; //3, 4, 5, 6, 7
|
||||||
|
extern uint8_t Wspr_Reg2[8]; //2, 3, 4
|
||||||
|
|
||||||
|
void SendWSPRManage()
|
||||||
|
{
|
||||||
|
int knob = 0;
|
||||||
|
byte knobPosition = 0;
|
||||||
|
char isNeedDisplayInfo = 0;
|
||||||
|
char nowSelectedIndex = 0;
|
||||||
|
char nowWsprStep = 0; //0 : select Message, 1 : select band, 2 : send
|
||||||
|
char selectedWsprMessageIndex = -1;
|
||||||
|
char selectedWsprBandIndex = -1;
|
||||||
|
|
||||||
|
unsigned long WsprTXFreq = 0;
|
||||||
|
unsigned int WsprMultiChan = 0;
|
||||||
|
unsigned long prevFreq;
|
||||||
|
char loopIndex;
|
||||||
|
|
||||||
|
delay_background(500, 0);
|
||||||
|
|
||||||
|
//Readed WsprMSGCount, WsprTone
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
knob = enc_read();
|
||||||
|
|
||||||
|
if (knobPosition > 0 && knob < 0)
|
||||||
|
knobPosition--;
|
||||||
|
else if (knob > 0 && (knobPosition <= (nowWsprStep == 0 ? WsprMSGCount : WSPR_BAND_COUNT) * 10 -2))
|
||||||
|
knobPosition++;
|
||||||
|
|
||||||
|
nowSelectedIndex = knobPosition / 10;
|
||||||
|
|
||||||
|
if (nowWsprStep == 0) //select Message status
|
||||||
|
{
|
||||||
|
printLineF2(F("WSPR:"));
|
||||||
|
|
||||||
|
if (selectedWsprMessageIndex != nowSelectedIndex)
|
||||||
|
{
|
||||||
|
selectedWsprMessageIndex = nowSelectedIndex;
|
||||||
|
int wsprMessageBuffIndex = selectedWsprMessageIndex * 46;
|
||||||
|
|
||||||
|
//Display WSPR Name tag
|
||||||
|
printLineFromEEPRom(0, 6, wsprMessageBuffIndex, wsprMessageBuffIndex + 4, 1);
|
||||||
|
|
||||||
|
//Load WSPR Tonecode
|
||||||
|
//Read Tone Code
|
||||||
|
for (int i = 0; i < 41; i++)
|
||||||
|
{
|
||||||
|
byte readData = EEPROM.read(WSPR_MESSAGE1 + 5 + (wsprMessageBuffIndex) + i); //NAME TAG 5, MESSAGE 41 = 46
|
||||||
|
WsprToneCode[i * 4 + 0] = readData & 3;
|
||||||
|
WsprToneCode[i * 4 + 1] = (readData >> 2) & 3;
|
||||||
|
WsprToneCode[i * 4 + 2] = (readData >> 4) & 3;
|
||||||
|
WsprToneCode[i * 4 + 3] = (readData >> 6) & 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (btnDown())
|
||||||
|
{
|
||||||
|
nowWsprStep = 1; //Change Status to Select Band
|
||||||
|
knobPosition = 0;
|
||||||
|
nowSelectedIndex = 0;
|
||||||
|
delay_background(500, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nowWsprStep == 1)
|
||||||
|
{
|
||||||
|
//printLineF2(F("Select Band"));
|
||||||
|
if (selectedWsprBandIndex != nowSelectedIndex)
|
||||||
|
{
|
||||||
|
selectedWsprBandIndex = nowSelectedIndex;
|
||||||
|
int bandBuffIndex = WSPR_BAND1 + selectedWsprBandIndex * 14;
|
||||||
|
|
||||||
|
EEPROM.get(bandBuffIndex, WsprTXFreq);
|
||||||
|
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++)
|
||||||
|
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
|
||||||
|
for (loopIndex = 2; loopIndex < 5; loopIndex++)
|
||||||
|
Wspr_Reg2[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 9);
|
||||||
|
|
||||||
|
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)
|
||||||
|
strcpy(c, "SEND:");
|
||||||
|
else
|
||||||
|
strcpy(c, "PTT->");
|
||||||
|
|
||||||
|
strcat(c, b);
|
||||||
|
printLine1(c);
|
||||||
|
|
||||||
|
if (digitalRead(PTT) == 0)
|
||||||
|
{
|
||||||
|
//printLineF1(F("Transmitting"));
|
||||||
|
//SEND WSPR
|
||||||
|
//If you need to consider the Rit and Sprite modes, uncomment them below.
|
||||||
|
//remark = To reduce the size of the program
|
||||||
|
//prevFreq = frequency;
|
||||||
|
//frequency = WsprTXFreq;
|
||||||
|
startTx(TX_CW, 0);
|
||||||
|
setTXFilters(WsprTXFreq);
|
||||||
|
|
||||||
|
//Start WSPR
|
||||||
|
Set_WSPR_Param();
|
||||||
|
digitalWrite(CW_KEY, 1);
|
||||||
|
|
||||||
|
for (int i = 0; i < 162; i++)
|
||||||
|
{ // Now this is the message loop
|
||||||
|
lastTime = millis(); // Store away the time when the last message symbol was sent
|
||||||
|
TX_P2 = TX_MSNB_P2 + WsprMultiChan * WsprToneCode[i]; // This represents the 1.46 Hz shift and is correct only for the bands specified in the array
|
||||||
|
TXSubFreq(TX_P2); // TX at the appropriate channel frequency for....
|
||||||
|
|
||||||
|
//if (btnDown())
|
||||||
|
// break;
|
||||||
|
|
||||||
|
while (millis() < lastTime + 683){} // .... 0,683 seconds
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(CW_KEY, 0);
|
||||||
|
stopTx(); //call setFrequency -> recovery TX Filter
|
||||||
|
//frequency = prevFreq;
|
||||||
|
|
||||||
|
selectedWsprBandIndex = -1;
|
||||||
|
} //end of PTT Check
|
||||||
|
else if (btnDown())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
} //end of status check
|
||||||
|
|
||||||
|
//delay_background(50, 1);
|
||||||
|
} //end of while
|
||||||
|
}
|
||||||
|
|
BIN
ubitxmanager ubuntu.odt
Normal file
BIN
ubitxmanager ubuntu.odt
Normal file
Binary file not shown.
Reference in New Issue
Block a user