Compare commits
75 Commits
version1.0
...
v1.061
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 | ||
|
c1d81d9d5b | ||
|
d69588d999 | ||
|
e915c21412 | ||
|
55cfeeb924 | ||
|
c8879e0e59 | ||
|
4f5ac283b7 | ||
|
3058d52551 | ||
|
04699ba074 | ||
|
aa61281c38 | ||
|
261215b1ad | ||
|
1a2f5b4fde | ||
|
8203427808 | ||
|
4e15f2150c | ||
|
82a5fd7df9 | ||
|
386a0b2d46 | ||
|
c6401af7d1 | ||
|
b153a305d6 | ||
|
e61e45d3dd | ||
|
a1f941f965 | ||
|
d1e72b3bd5 | ||
|
032e7f919f | ||
|
b6bc264332 | ||
|
b1cc5eb98a | ||
|
2fe1662d67 | ||
|
ebbc5aae5e | ||
|
209cd3a49c | ||
|
95e5c1dfe5 | ||
|
45a8479061 | ||
|
a6ad381c24 | ||
|
bcf80f851d | ||
|
16304efacd | ||
|
968024ab73 | ||
|
3e60728727 | ||
|
9781ef086b | ||
|
f27f504ea4 | ||
|
2b08a76fbf | ||
|
90655e03b8 | ||
|
8551ff1b68 | ||
|
5ce94e8e49 | ||
|
7ef9c29fa8 | ||
|
fda398046e |
117
README.md
117
README.md
@@ -1,28 +1,18 @@
|
||||
#IMPORTANT INFORMATION
|
||||
----------------------------------------------------------------------------
|
||||
- Beta 0.26 and Beta 0.261, Beta 0.262, Beta 0.27 is complete test
|
||||
- You can download and use it.
|
||||
- Now Release Version 1.061 on my blog (http://www.hamskey.com)
|
||||
- You can download and compiled hex file and uBITX Manager application on my blog (http://www.hamskey.com)
|
||||
|
||||
#NOTICE
|
||||
----------------------------------------------------------------------------
|
||||
I received uBITX a month ago and found that many features are required, and began coding with the idea of implementing minimal functionality as a general hf transceiver rather than an experimental device.
|
||||
|
||||
- fixed bugs...
|
||||
- Diallock for uBITX's sensitive encoders
|
||||
- built in softare Memory keyer and cw options control for CW communication
|
||||
- Implementation of CAT communication protocol for Digital Communication (as FT8, JT65, etc)
|
||||
- Delay Options for external Linear.
|
||||
- and more...
|
||||
|
||||
Most of the basic functions of the HF transceiver I thought were implemented.
|
||||
The minimum basic specification for uBITX to operate as a radio, I think it is finished.
|
||||
So I will release the 0.27 version and if I do not see the bug anymore, I will try to change the version name to 1.0.
|
||||
Now uBITX is an HF radio and will be able to join you in your happy hams life.
|
||||
Based on this source, you can use it by adding functions.
|
||||
|
||||
I am going to do a new project based on this source, linking with WSPR, WSJT-X and so on.
|
||||
Of course, this repository is still running. If you have any bugs or ideas, please feel free to email me.
|
||||
|
||||
http://www.hamskey.com
|
||||
|
||||
DE KD8CEC
|
||||
@@ -36,16 +26,105 @@ The copyright information of the original is below.
|
||||
KD8CEC
|
||||
----------------------------------------------------------------------------
|
||||
Prepared or finished tasks for the next version
|
||||
- Most of them are implemented and included in version 0.27.
|
||||
- User Interface on LCD -> Option by user (not need)
|
||||
- Include WSPR Beacone function - (implement other new repository)
|
||||
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
|
||||
- Reduce Program size
|
||||
- uBITX with RTL-SDR
|
||||
- Direct control for Student
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
## 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
|
||||
- Added CWL, CWU Mode, (dont complete test yet)
|
||||
- fixed VFO changed bug.
|
||||
- Added Additional BFO for CWL, CWL
|
||||
- Added IF Shift
|
||||
- Change confirmation key PTT -> function key (not critical menus)
|
||||
- Change CW Key Select type, (toggle -> select by dial)
|
||||
|
||||
0.32
|
||||
- Added function Scroll Frequencty on upper line
|
||||
- Added Example code for Draw meter and remarked (you can see and use this code in source codes)
|
||||
- Added Split function, just toggle VFOs when TX/RX
|
||||
|
||||
0.31
|
||||
- Fixed CW ADC Range error
|
||||
- Display Message on Upper Line (anothor VFO Frequency, Tune Step, Selected Key Type)
|
||||
|
||||
0.30
|
||||
- implemented the function to monitor the value of all analog inputs. This allows you to monitor the status of the CW keys connected to your uBITX.
|
||||
- possible to set the ADC range for CW Keying. If no setting is made, it will have the same range as the original code. If you set the CW Keying ADC Values using uBITX Manager 0.3, you can reduce the key error.
|
||||
- Added the function to select Straight Key, IAMBICA, IAMBICB key from the menu.
|
||||
- default Band select is Ham Band mode, if you want common type, long press function key at band select menu, uBITX Manager can be used to modify frequencies to suit your country.
|
||||
|
||||
0.29
|
||||
- Remove the use of initialization values in BFO settings - using crruent value, if factory reset
|
||||
- Select Tune Step, default 0, 20, 50, 100, 200, Use the uBITX Manager to set the steps value you want. You can select Step by pressing and holding the Function Key (1sec ~ 2sec).
|
||||
- Modify Dial Lock Function, Press the Function key for more than 3 seconds to toggle dial lock.
|
||||
- created a new frequency tune method. remove original source codes, Threshold has been applied to reduce malfunction. checked the continuity of the user operating to make natural tune possible.
|
||||
- stabilize and remove many warning messages - by Pullrequest and merge
|
||||
- Changed cw keying method. removed the original code and applied Ron's code and Improved compatibility with original hardware and CAT commnication. It can be used without modification of hardware.
|
||||
|
||||
0.28
|
||||
- Fixed CAT problem with hamlib on Linux
|
||||
- restore Protocol autorecovery logic
|
||||
|
||||
0.27
|
||||
(First alpha test version, This will be renamed to the major version 1.0)
|
||||
- Dual VFO Dial Lock (vfoA Dial lock)
|
||||
|
@@ -36,7 +36,7 @@
|
||||
//27 + 10 + 18 + 1(SPACE) = //56
|
||||
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
|
||||
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);
|
||||
|
||||
const PROGMEM uint8_t cw09Table[27] = {0b00011111, 0b00001111, 0b00000111, 0b00000011, 0b00000001, 0b00000000, 0b00010000, 0b00011000, 0b00011100, 0b00011110};
|
||||
@@ -297,7 +297,7 @@ void controlAutoCW(){
|
||||
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;
|
||||
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 <EEPROM.h>
|
||||
#include "ubitx.h"
|
||||
|
||||
/**
|
||||
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_TO 357 //CW ADC Range BOTH to (Lower 8 bit)
|
||||
#define CW_KEY_TYPE 358
|
||||
#define CW_DISPLAY_SHIFT 359 //Transmits on CWL, CWU Mode, LCD Frequency shifts Sidetone Frequency.
|
||||
//(7:Enable / Disable //0: enable, 1:disable, (default is applied shift)
|
||||
//6 : 0 : Adjust Pulus, 1 : Adjust Minus
|
||||
//0~5: Adjust Value : * 10 = Adjust Value (0~300)
|
||||
#define COMMON_OPTION0 360 //0: Confirm : CW Frequency Shift
|
||||
//1 : IF Shift Save
|
||||
//
|
||||
//
|
||||
//
|
||||
#define IF_SHIFTVALUE 363
|
||||
|
||||
#define DISPLAY_OPTION1 361 //Display Option1
|
||||
#define DISPLAY_OPTION2 362 //Display Option2
|
||||
@@ -268,6 +279,7 @@ byte isTxType = 0; //000000[0 - isSplit] [0 - isTXStop]
|
||||
long arTuneStep[5];
|
||||
byte tuneStepIndex; //default Value 0, start Offset is 0 because of check new user
|
||||
|
||||
byte commonOption0 = 0;
|
||||
byte displayOption1 = 0;
|
||||
byte displayOption2 = 0;
|
||||
|
||||
@@ -285,6 +297,9 @@ bool Iambic_Key = true;
|
||||
#define IAMBICB 0x10 // 0 for Iambic A, 1 for Iambic B
|
||||
unsigned char keyerControl = IAMBICB;
|
||||
|
||||
byte isShiftDisplayCWFreq = 1; //Display Frequency
|
||||
int shiftDisplayAdjustVal = 0; //
|
||||
|
||||
//Variables for auto cw mode
|
||||
byte isCWAutoMode = 0; //0 : none, 1 : CW_AutoMode_Menu_Selection, 2 : CW_AutoMode Sending
|
||||
byte cwAutoTextCount = 0; //cwAutoText Count
|
||||
@@ -323,7 +338,7 @@ byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
|
||||
char lcdMeter[17];
|
||||
|
||||
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
|
||||
@@ -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,
|
||||
so Create a new delay function that can do background processing.
|
||||
*/
|
||||
|
||||
unsigned long delayBeforeTime = 0;
|
||||
byte delay_background(unsigned delayTime, byte fromType){ //fromType : 4 autoCWKey -> Check Paddle
|
||||
delayBeforeTime = millis();
|
||||
@@ -485,28 +499,29 @@ void setTXFilters(unsigned long freq){
|
||||
|
||||
void setFrequency(unsigned long f){
|
||||
f = (f / arTuneStep[tuneStepIndex -1]) * arTuneStep[tuneStepIndex -1];
|
||||
|
||||
setTXFilters(f);
|
||||
|
||||
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
||||
|
||||
if (cwMode == 0)
|
||||
{
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -519,7 +534,6 @@ void setFrequency(unsigned long f){
|
||||
* 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
|
||||
*/
|
||||
|
||||
void startTx(byte txMode, byte isDisplayUpdate){
|
||||
//Check Hamband only TX //Not found Hamband index by now frequency
|
||||
if (tuneTXType >= 100 && getIndexHambanBbyFreq(ritOn ? ritTxFrequency : frequency) == -1) {
|
||||
@@ -537,7 +551,9 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
||||
ritRxFrequency = frequency;
|
||||
setFrequency(ritTxFrequency);
|
||||
}
|
||||
else if (splitOn == 1) {
|
||||
else
|
||||
{
|
||||
if (splitOn == 1) {
|
||||
if (vfoActive == VFO_B) {
|
||||
vfoActive = VFO_A;
|
||||
frequency = vfoA;
|
||||
@@ -548,10 +564,12 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
||||
frequency = vfoB;
|
||||
byteToMode(vfoB_mode, 0);
|
||||
}
|
||||
}
|
||||
|
||||
setFrequency(frequency);
|
||||
setFrequency(frequency);
|
||||
} //end of else
|
||||
|
||||
SetCarrierFreq();
|
||||
|
||||
if (txMode == TX_CW){
|
||||
//turn off the second local oscillator and the bfo
|
||||
@@ -584,19 +602,24 @@ void startTx(byte txMode, byte isDisplayUpdate){
|
||||
updateDisplay();
|
||||
}
|
||||
|
||||
void stopTx(){
|
||||
void stopTx(void){
|
||||
inTx = 0;
|
||||
|
||||
digitalWrite(TX_RX, 0); //turn off the tx
|
||||
|
||||
/*
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
else
|
||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
*/
|
||||
SetCarrierFreq();
|
||||
|
||||
if (ritOn)
|
||||
setFrequency(ritRxFrequency);
|
||||
else if (splitOn == 1) {
|
||||
else
|
||||
{
|
||||
if (splitOn == 1) {
|
||||
//vfo Change
|
||||
if (vfoActive == VFO_B){
|
||||
vfoActive = VFO_A;
|
||||
@@ -608,10 +631,10 @@ void stopTx(){
|
||||
frequency = vfoB;
|
||||
byteToMode(vfoB_mode, 0);
|
||||
}
|
||||
setFrequency(frequency);
|
||||
} //end of else
|
||||
else
|
||||
}
|
||||
|
||||
setFrequency(frequency);
|
||||
} //end of else
|
||||
|
||||
updateDisplay();
|
||||
}
|
||||
@@ -675,7 +698,7 @@ void checkButton(){
|
||||
delay(10);
|
||||
Check_Cat(0);
|
||||
}
|
||||
delay(50);//debounce
|
||||
//delay(50);//debounce
|
||||
}
|
||||
|
||||
|
||||
@@ -690,7 +713,7 @@ int encodedSumValue = 0;
|
||||
unsigned long lastTunetime = 0; //if continous moving, skip threshold processing
|
||||
byte lastMovedirection = 0; //0 : stop, 1 : cw, 2 : ccw
|
||||
|
||||
#define skipThresholdTime 100
|
||||
//#define skipThresholdTime 70
|
||||
#define encodeTimeOut 1000
|
||||
|
||||
void doTuningWithThresHold(){
|
||||
@@ -701,8 +724,7 @@ void doTuningWithThresHold(){
|
||||
(vfoActive == VFO_B && ((isDialLock & 0x02) == 0x02)))
|
||||
return;
|
||||
|
||||
if (isCWAutoMode == 0 || cwAutoDialType == 1)
|
||||
s = enc_read();
|
||||
s = enc_read();
|
||||
|
||||
//if time is exceeded, it is recognized as an error,
|
||||
//ignore exists values, because of errors
|
||||
@@ -719,7 +741,9 @@ void doTuningWithThresHold(){
|
||||
encodedSumValue += (s > 0 ? 1 : -1);
|
||||
|
||||
//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;
|
||||
|
||||
lastTunetime = millis();
|
||||
@@ -729,7 +753,8 @@ void doTuningWithThresHold(){
|
||||
|
||||
prev_freq = frequency;
|
||||
//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)
|
||||
isUSB = true;
|
||||
@@ -749,15 +774,16 @@ void doRIT(){
|
||||
unsigned long old_freq = frequency;
|
||||
|
||||
if (knob < 0)
|
||||
frequency -= 100l;
|
||||
frequency -= (arTuneStep[tuneStepIndex -1]); //
|
||||
else if (knob > 0)
|
||||
frequency += 100;
|
||||
frequency += (arTuneStep[tuneStepIndex -1]); //
|
||||
|
||||
if (old_freq != frequency){
|
||||
setFrequency(frequency);
|
||||
updateDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
save Frequency and mode to eeprom for Auto Save with protected eeprom cycle, by kd8cec
|
||||
*/
|
||||
@@ -877,6 +903,7 @@ void initSettings(){
|
||||
}
|
||||
|
||||
|
||||
EEPROM.get(COMMON_OPTION0, commonOption0);
|
||||
EEPROM.get(DISPLAY_OPTION1, displayOption1);
|
||||
EEPROM.get(DISPLAY_OPTION2, displayOption2);
|
||||
|
||||
@@ -961,6 +988,33 @@ void initSettings(){
|
||||
cwAdcBothFrom = EEPROM.read(CW_ADC_BOTH_FROM) | ((tmpMostBits & 0x30) << 4);
|
||||
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)
|
||||
if (cwAdcSTFrom >= cwAdcSTTo)
|
||||
{
|
||||
@@ -997,10 +1051,10 @@ void initSettings(){
|
||||
|
||||
//original code with modified by kd8cec
|
||||
if (usbCarrier > 12010000l || usbCarrier < 11990000l)
|
||||
usbCarrier = 11995000l;
|
||||
usbCarrier = 11997000l;
|
||||
|
||||
if (cwmCarrier > 12010000l || cwmCarrier < 11990000l)
|
||||
cwmCarrier = 11995000l;
|
||||
cwmCarrier = 11997000l;
|
||||
|
||||
if (vfoA > 35000000l || 3500000l > vfoA) {
|
||||
vfoA = 7150000l;
|
||||
@@ -1035,7 +1089,6 @@ void initSettings(){
|
||||
}
|
||||
|
||||
void initPorts(){
|
||||
|
||||
analogReference(DEFAULT);
|
||||
|
||||
//??
|
||||
@@ -1085,7 +1138,7 @@ void setup()
|
||||
|
||||
//Serial.begin(9600);
|
||||
lcd.begin(16, 2);
|
||||
printLineF(1, F("CECBT v1.01"));
|
||||
printLineF(1, F("CE v1.061"));
|
||||
|
||||
Init_Cat(38400, SERIAL_8N1);
|
||||
initMeter(); //not used in this build
|
||||
@@ -1093,7 +1146,7 @@ void setup()
|
||||
|
||||
if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) {
|
||||
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);
|
||||
}
|
||||
else {
|
||||
@@ -1116,11 +1169,6 @@ void setup()
|
||||
factory_alignment();
|
||||
}
|
||||
|
||||
|
||||
//for debug
|
||||
int dbgCnt = 0;
|
||||
byte flasher = 0;
|
||||
|
||||
//Auto save Frequency and Mode with Protected eeprom life by KD8CEC
|
||||
void checkAutoSaveFreqMode()
|
||||
{
|
||||
@@ -1139,21 +1187,8 @@ void checkAutoSaveFreqMode()
|
||||
//check time for Frequency auto save
|
||||
if (millis() - saveCheckTime > saveIntervalSec * 1000)
|
||||
{
|
||||
/*
|
||||
if (vfoActive == VFO_A)
|
||||
{
|
||||
vfoA = frequency;
|
||||
vfoA_mode = modeToByte();
|
||||
storeFrequencyAndMode(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
vfoB = frequency;
|
||||
vfoB_mode = modeToByte();
|
||||
storeFrequencyAndMode(2);
|
||||
}
|
||||
*/
|
||||
FrequencyToVFO(1);
|
||||
saveCheckTime = 0; //for reduce cpu use rate
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1171,20 +1206,21 @@ void loop(){
|
||||
|
||||
//tune only when not tranmsitting
|
||||
if (!inTx){
|
||||
if (ritOn)
|
||||
doRIT();
|
||||
//else if (isIFShift)
|
||||
// doIFShift();
|
||||
else
|
||||
doTuningWithThresHold();
|
||||
if (isCWAutoMode == 0 || cwAutoDialType == 1)
|
||||
{
|
||||
if (ritOn)
|
||||
doRIT();
|
||||
else
|
||||
doTuningWithThresHold();
|
||||
}
|
||||
|
||||
if (isCWAutoMode == 0 && beforeIdle_ProcessTime < millis() - 250) {
|
||||
idle_process();
|
||||
checkAutoSaveFreqMode(); //move here form out scope for reduce cpu use rate
|
||||
beforeIdle_ProcessTime = millis();
|
||||
}
|
||||
} //end of check TX Status
|
||||
|
||||
//we check CAT after the encoder as it might put the radio into TX
|
||||
Check_Cat(inTx? 1 : 0);
|
||||
checkAutoSaveFreqMode();
|
||||
}
|
||||
|
@@ -31,12 +31,7 @@ void updateLine2Buffer(char isDirectCall)
|
||||
{
|
||||
if (ritOn)
|
||||
{
|
||||
line2Buffer[0] = 'R';
|
||||
line2Buffer[1] = 'i';
|
||||
line2Buffer[2] = 't';
|
||||
line2Buffer[3] = 'T';
|
||||
line2Buffer[4] = 'X';
|
||||
line2Buffer[5] = ':';
|
||||
strcpy(line2Buffer, "RitTX:");
|
||||
|
||||
//display frequency
|
||||
tmpFreq = ritTxFrequency;
|
||||
@@ -61,12 +56,10 @@ void updateLine2Buffer(char isDirectCall)
|
||||
if (vfoActive == VFO_B)
|
||||
{
|
||||
tmpFreq = vfoA;
|
||||
//line2Buffer[0] = 'A';
|
||||
}
|
||||
else
|
||||
{
|
||||
tmpFreq = vfoB;
|
||||
//line2Buffer[0] = 'B';
|
||||
}
|
||||
|
||||
// EXAMPLE 1 & 2
|
||||
@@ -133,16 +126,18 @@ void updateLine2Buffer(char isDirectCall)
|
||||
line2Buffer[8] = 'I';
|
||||
line2Buffer[9] = 'F';
|
||||
|
||||
if (ifShiftValue == 0)
|
||||
{
|
||||
//if (ifShiftValue == 0)
|
||||
//{
|
||||
/*
|
||||
line2Buffer[10] = 'S';
|
||||
line2Buffer[11] = ':';
|
||||
line2Buffer[12] = 'O';
|
||||
line2Buffer[13] = 'F';
|
||||
line2Buffer[14] = 'F';
|
||||
}
|
||||
else
|
||||
{
|
||||
*/
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
|
||||
line2Buffer[11] = 0;
|
||||
line2Buffer[12] = ' ';
|
||||
@@ -151,7 +146,7 @@ void updateLine2Buffer(char isDirectCall)
|
||||
memset(b, 0, sizeof(b));
|
||||
ltoa(ifShiftValue, b, DEC);
|
||||
strncat(line2Buffer, b, 5);
|
||||
}
|
||||
//}
|
||||
|
||||
if (isDirectCall == 1) //if call by encoder (not scheduler), immediate print value
|
||||
printLine2(line2Buffer);
|
||||
|
@@ -168,14 +168,32 @@ void cwKeyer(void){
|
||||
break;
|
||||
|
||||
case KEYED_PREP:
|
||||
//modified KD8CEC
|
||||
/*
|
||||
ktimer += millis(); // set ktimer to interval end time
|
||||
keyerControl &= ~(DIT_L + DAH_L); // clear both paddle latch bits
|
||||
keyerState = KEYED; // next state
|
||||
if (!inTx){
|
||||
//DelayTime Option
|
||||
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||
|
||||
keyDown = 0;
|
||||
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||
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();
|
||||
break;
|
||||
|
||||
@@ -212,6 +230,9 @@ void cwKeyer(void){
|
||||
if (update_PaddleLatch(0) == DIT_L) {
|
||||
// if we are here, it is only because the key is pressed
|
||||
if (!inTx){
|
||||
//DelayTime Option
|
||||
delay_background(delayBeforeCWStartTime * 2, 2);
|
||||
|
||||
keyDown = 0;
|
||||
cwTimeout = millis() + cwDelayTime * 10; //+ CW_TIMEOUT;
|
||||
startTx(TX_CW, 1);
|
||||
@@ -229,13 +250,14 @@ void cwKeyer(void){
|
||||
keyDown = 0;
|
||||
stopTx();
|
||||
}
|
||||
if (!cwTimeout)
|
||||
return;
|
||||
//if (!cwTimeout) //removed by KD8CEC
|
||||
// return;
|
||||
// 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
|
||||
//delay(5);
|
||||
delay_background(5, 3);
|
||||
continue;
|
||||
//delay_background(5, 3); //removed by KD8CEC
|
||||
//continue; //removed by KD8CEC
|
||||
return; //Tx stop control by Main Loop
|
||||
}
|
||||
|
||||
Check_Cat(2);
|
||||
|
@@ -10,8 +10,7 @@
|
||||
* - 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
|
||||
*/
|
||||
#define printLineF1(x) (printLineF(1, x))
|
||||
#define printLineF2(x) (printLineF(0, x))
|
||||
#include "ubitx.h"
|
||||
|
||||
//Current Frequency and mode to active VFO by KD8CEC
|
||||
void FrequencyToVFO(byte isSaveFreq)
|
||||
@@ -56,7 +55,7 @@ void menuBand(int btn){
|
||||
return;
|
||||
}
|
||||
|
||||
printLineF2(F("Press to confirm"));
|
||||
//printLineF2(F("Press to confirm"));
|
||||
//wait for the button menu select button to be lifted)
|
||||
while (btnDown()) {
|
||||
delay_background(50, 0);
|
||||
@@ -64,17 +63,19 @@ void menuBand(int btn){
|
||||
btnPressCount = 0;
|
||||
if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2
|
||||
tuneTXType = 0;
|
||||
printLineF2(F("General mode"));
|
||||
//printLineF2(F("General mode"));
|
||||
printLineF2(F("General"));
|
||||
}
|
||||
else {
|
||||
tuneTXType = 2;
|
||||
printLineF2(F("Ham band mode"));
|
||||
//printLineF2(F("Ham band mode"));
|
||||
printLineF2(F("Ham band"));
|
||||
}
|
||||
delay_background(1000, 0);
|
||||
printLine2ClearAndUpdate();
|
||||
printLineF2(F("Press to confirm"));
|
||||
}
|
||||
}
|
||||
printLineF2(F("Press to confirm"));
|
||||
|
||||
char currentBandIndex = -1;
|
||||
//Save Band Information
|
||||
@@ -92,7 +93,6 @@ void menuBand(int btn){
|
||||
ritDisable();
|
||||
|
||||
while(!btnDown()){
|
||||
|
||||
knob = enc_read();
|
||||
if (knob != 0){
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
while(btnDown()) {
|
||||
delay(50);
|
||||
Check_Cat(0); //To prevent disconnections
|
||||
}
|
||||
*/
|
||||
FrequencyToVFO(1);
|
||||
|
||||
//printLine2ClearAndUpdate();
|
||||
//delay_background(500, 0);
|
||||
//menuOn = 0;
|
||||
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
|
||||
void menuIFSSetup(int btn){
|
||||
int knob = 0;
|
||||
@@ -209,14 +180,10 @@ void menuIFSSetup(int btn){
|
||||
if (isIFShift == 1)
|
||||
printLineF2(F("IF Shift Change?"));
|
||||
else
|
||||
printLineF2(F("IF Shift:Off, On?"));
|
||||
printLineF2(F("IF Shift On?"));
|
||||
}
|
||||
else {
|
||||
//if (isIFShift == 0){
|
||||
//printLineF2(F("IF Shift is ON"));
|
||||
//delay_background(500, 0);
|
||||
isIFShift = 1;
|
||||
//}
|
||||
|
||||
delay_background(500, 0);
|
||||
updateLine2Buffer(1);
|
||||
@@ -228,11 +195,13 @@ void menuIFSSetup(int btn){
|
||||
{
|
||||
updateLine2Buffer(1);
|
||||
setFrequency(frequency);
|
||||
|
||||
/*
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
else
|
||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
*/
|
||||
SetCarrierFreq();
|
||||
|
||||
needApplyChangeValue = 0;
|
||||
}
|
||||
@@ -240,12 +209,13 @@ void menuIFSSetup(int btn){
|
||||
knob = enc_read();
|
||||
if (knob != 0){
|
||||
if (knob < 0)
|
||||
ifShiftValue -= 50l;
|
||||
ifShiftValue -= 50;
|
||||
else if (knob > 0)
|
||||
ifShiftValue += 50;
|
||||
|
||||
needApplyChangeValue = 1;
|
||||
}
|
||||
Check_Cat(0); //To prevent disconnections
|
||||
}
|
||||
|
||||
delay_background(500, 0); //for check Long Press function key
|
||||
@@ -253,13 +223,18 @@ void menuIFSSetup(int btn){
|
||||
if (btnDown() || ifShiftValue == 0)
|
||||
{
|
||||
isIFShift = 0;
|
||||
printLineF2(F("IF Shift is OFF"));
|
||||
ifShiftValue = 0;
|
||||
//printLineF2(F("IF Shift is OFF"));
|
||||
//printLineF2(F("OFF"));
|
||||
//clearLine2();
|
||||
setFrequency(frequency);
|
||||
delay_background(500, 0);
|
||||
SetCarrierFreq();
|
||||
//delay_background(1500, 0);
|
||||
}
|
||||
|
||||
//menuOn = 0;
|
||||
//printLine2ClearAndUpdate();
|
||||
//Store IF Shiift
|
||||
EEPROM.put(IF_SHIFTVALUE, ifShiftValue);
|
||||
|
||||
menuClearExit(0);
|
||||
}
|
||||
}
|
||||
@@ -337,23 +312,21 @@ void menuSelectMode(int btn){
|
||||
FrequencyToVFO(1);
|
||||
}
|
||||
|
||||
/*
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
else
|
||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
*/
|
||||
SetCarrierFreq();
|
||||
|
||||
setFrequency(frequency);
|
||||
|
||||
//delay_background(500, 0);
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
menuClearExit(500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Memory to VFO, VFO to Memory by KD8CEC
|
||||
//select between MtoV and VtoM by isMemoryToVfo
|
||||
void menuCHMemory(int btn, byte isMemoryToVfo){
|
||||
int knob = 0;
|
||||
int selectChannel = 0;
|
||||
@@ -378,7 +351,8 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
||||
|
||||
if (selectChannel >= 20 || selectChannel <=-1)
|
||||
{
|
||||
strcpy(c, "Exit setup?");
|
||||
//strcpy(c, "Exit setup?");
|
||||
strcpy(c, "Exit?");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -407,10 +381,6 @@ void menuCHMemory(int btn, byte isMemoryToVfo){
|
||||
strcat(c, b); //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
|
||||
tmpFreq = resultFreq;
|
||||
@@ -624,25 +594,16 @@ void menuVfoToggle(int btn)
|
||||
FrequencyToVFO(1);
|
||||
|
||||
if (vfoActive == VFO_B){
|
||||
//vfoB = frequency;
|
||||
//vfoB_mode = modeToByte();
|
||||
//storeFrequencyAndMode(2); //vfoB -> eeprom
|
||||
|
||||
vfoActive = VFO_A;
|
||||
frequency = vfoA;
|
||||
saveCheckFreq = frequency;
|
||||
byteToMode(vfoA_mode, 0);
|
||||
}
|
||||
else {
|
||||
//vfoA = frequency;
|
||||
//vfoA_mode = modeToByte();
|
||||
//storeFrequencyAndMode(1); //vfoA -> eeprom
|
||||
|
||||
vfoActive = VFO_B;
|
||||
frequency = vfoB;
|
||||
saveCheckFreq = frequency;
|
||||
byteToMode(vfoB_mode, 0);
|
||||
//printLineF2(F("Selected VFO B"));
|
||||
}
|
||||
|
||||
ritDisable();
|
||||
@@ -655,18 +616,18 @@ void menuVfoToggle(int btn)
|
||||
void menuRitToggle(int btn){
|
||||
if (!btn){
|
||||
if (ritOn == 1)
|
||||
printLineF2(F("RIT:On, Off?"));
|
||||
printLineF2(F("RIT Off?"));
|
||||
else
|
||||
printLineF2(F("RIT:Off, On?"));
|
||||
printLineF2(F("RIT On?"));
|
||||
}
|
||||
else {
|
||||
if (ritOn == 0){
|
||||
printLineF2(F("RIT is ON"));
|
||||
//printLineF2(F("RIT is ON"));
|
||||
//enable RIT so the current frequency is used at transmit
|
||||
ritEnable(frequency);
|
||||
}
|
||||
else{
|
||||
printLineF2(F("RIT is OFF"));
|
||||
//printLineF2(F("RIT is OFF"));
|
||||
ritDisable();
|
||||
}
|
||||
|
||||
@@ -685,23 +646,21 @@ void menuSplitOnOff(int btn){
|
||||
else {
|
||||
if (splitOn == 1){
|
||||
splitOn = 0;
|
||||
printLineF2(F("Split Off!"));
|
||||
//printLineF2(F("Split Off!"));
|
||||
printLineF2(F("[OFF]"));
|
||||
}
|
||||
else {
|
||||
splitOn = 1;
|
||||
if (ritOn == 1)
|
||||
ritOn = 0;
|
||||
printLineF2(F("Split On!"));
|
||||
//printLineF2(F("Split On!"));
|
||||
printLineF2(F("[ON]"));
|
||||
}
|
||||
|
||||
//delay_background(500, 0);
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
menuClearExit(500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Function to disbled transmission
|
||||
//by KD8CEC
|
||||
void menuTxOnOff(int btn, byte optionType){
|
||||
@@ -721,9 +680,6 @@ void menuTxOnOff(int btn, byte optionType){
|
||||
printLineF2(F("TX ON!"));
|
||||
}
|
||||
|
||||
//delay_background(500, 0);
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
menuClearExit(500);
|
||||
}
|
||||
}
|
||||
@@ -751,9 +707,6 @@ void menuSetup(int btn){
|
||||
}
|
||||
*/
|
||||
|
||||
//delay_background(2000, 0);
|
||||
//printLine2Clear();
|
||||
//menuOn = 0;
|
||||
menuClearExit(1000);
|
||||
}
|
||||
}
|
||||
@@ -803,42 +756,43 @@ void menuCWSpeed(int btn){
|
||||
printLine2(b);
|
||||
}
|
||||
//abort if this button is down
|
||||
if (btnDown())
|
||||
//re-enable the clock1 and clock 2
|
||||
break;
|
||||
//if (btnDown())
|
||||
//re-enable the clock1 and clock 2
|
||||
// break;
|
||||
|
||||
Check_Cat(0); //To prevent disconnections
|
||||
}
|
||||
|
||||
//save the setting
|
||||
//if (digitalRead(PTT) == LOW){
|
||||
printLineF2(F("CW Speed set!"));
|
||||
cwSpeed = 1200/wpm;
|
||||
EEPROM.put(CW_SPEED, cwSpeed);
|
||||
//}
|
||||
//delay_background(2000, 0);
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
menuClearExit(1000);
|
||||
//save the setting
|
||||
//printLineF2(F("CW Speed set!"));
|
||||
cwSpeed = 1200 / wpm;
|
||||
EEPROM.put(CW_SPEED, cwSpeed);
|
||||
menuClearExit(1000);
|
||||
}
|
||||
|
||||
void displayEmptyData(void){
|
||||
printLineF2(F("Empty data"));
|
||||
delay_background(2000, 0);
|
||||
}
|
||||
|
||||
|
||||
//Builtin CW Keyer Logic by KD8CEC
|
||||
void menuCWAutoKey(int btn){
|
||||
if (!btn){
|
||||
printLineF2(F("CW AutoKey Mode?"));
|
||||
return;
|
||||
printLineF2(F("Memory Keyer"));
|
||||
return;
|
||||
}
|
||||
|
||||
//Check CW_AUTO_MAGIC_KEY and CW Text Count
|
||||
EEPROM.get(CW_AUTO_COUNT, cwAutoTextCount);
|
||||
if (EEPROM.read(CW_AUTO_MAGIC_KEY) != 0x73 || cwAutoTextCount < 1)
|
||||
{
|
||||
printLineF2(F("Empty CW data"));
|
||||
delay_background(2000, 0);
|
||||
displayEmptyData();
|
||||
return;
|
||||
}
|
||||
|
||||
printLineF1(F("Press PTT to Send"));
|
||||
//printLineF1(F("Press PTT to Send"));
|
||||
printLineF1(F("PTT to Send"));
|
||||
delay_background(500, 0);
|
||||
updateDisplay();
|
||||
beforeCWTextIndex = 255; //255 value is for start check
|
||||
@@ -846,6 +800,27 @@ void menuCWAutoKey(int btn){
|
||||
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
|
||||
void menuSetupCwDelay(int btn){
|
||||
int knob = 0;
|
||||
@@ -884,14 +859,9 @@ void menuSetupCwDelay(int btn){
|
||||
}
|
||||
|
||||
//save the setting
|
||||
//if (digitalRead(PTT) == LOW){
|
||||
printLineF2(F("CW Delay set!"));
|
||||
cwDelayTime = tmpCWDelay / 10;
|
||||
EEPROM.put(CW_DELAY, cwDelayTime);
|
||||
//delay_background(2000, 0);
|
||||
//}
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
//printLineF2(F("CW Delay set!"));
|
||||
cwDelayTime = tmpCWDelay / 10;
|
||||
EEPROM.put(CW_DELAY, cwDelayTime);
|
||||
menuClearExit(1000);
|
||||
}
|
||||
|
||||
@@ -907,12 +877,6 @@ void menuSetupTXCWInterval(int btn){
|
||||
}
|
||||
|
||||
printLineF1(F("Press, set Delay"));
|
||||
/*
|
||||
strcpy(b, "Start Delay:");
|
||||
itoa(tmpTXCWInterval,c, 10);
|
||||
strcat(b, c);
|
||||
printLine2(b);
|
||||
*/
|
||||
delay_background(300, 0);
|
||||
|
||||
while(!btnDown()){
|
||||
@@ -940,21 +904,17 @@ void menuSetupTXCWInterval(int btn){
|
||||
needDisplayInformation = 1;
|
||||
}
|
||||
//abort if this button is down
|
||||
if (btnDown())
|
||||
break;
|
||||
//if (btnDown())
|
||||
// break;
|
||||
|
||||
Check_Cat(0); //To prevent disconnections
|
||||
}
|
||||
|
||||
//save the setting
|
||||
//if (digitalRead(PTT) == LOW){
|
||||
printLineF2(F("CW Start set!"));
|
||||
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
||||
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
||||
//delay_background(2000, 0);
|
||||
//}
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
//printLineF2(F("CW Start set!"));
|
||||
delayBeforeCWStartTime = tmpTXCWInterval / 2;
|
||||
EEPROM.put(CW_START, delayBeforeCWStartTime);
|
||||
|
||||
menuClearExit(1000);
|
||||
}
|
||||
|
||||
@@ -1149,9 +1109,9 @@ void menuSetupCarrier(int btn){
|
||||
knob = enc_read();
|
||||
|
||||
if (knob > 0)
|
||||
usbCarrier -= 50;
|
||||
usbCarrier -= 5;
|
||||
else if (knob < 0)
|
||||
usbCarrier += 50;
|
||||
usbCarrier += 5;
|
||||
else
|
||||
continue; //don't update the frequency or the display
|
||||
|
||||
@@ -1215,8 +1175,6 @@ void menuSetupCWCarrier(int btn){
|
||||
si5351bx_setfreq(0, cwmCarrier);
|
||||
printCarrierFreq(cwmCarrier);
|
||||
|
||||
//Check_Cat(0); //To prevent disconnections
|
||||
//delay(100);
|
||||
delay_background(100, 0);
|
||||
}
|
||||
|
||||
@@ -1235,8 +1193,6 @@ void menuSetupCWCarrier(int btn){
|
||||
si5351bx_setfreq(0, cwmCarrier); //set back the carrier oscillator anyway, cw tx switches it off
|
||||
|
||||
setFrequency(frequency);
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
menuClearExit(0);
|
||||
}
|
||||
|
||||
@@ -1284,8 +1240,6 @@ void menuSetupCwTone(int btn){
|
||||
else
|
||||
sideTone = prev_sideTone;
|
||||
|
||||
//printLine2ClearAndUpdate();
|
||||
//menuOn = 0;
|
||||
menuClearExit(0);
|
||||
}
|
||||
|
||||
@@ -1298,15 +1252,7 @@ void setDialLock(byte tmpLock, byte fromMode) {
|
||||
|
||||
if (fromMode == 2 || fromMode == 3) return;
|
||||
|
||||
//for reduce using flash memory
|
||||
/*
|
||||
if (tmpLock == 1)
|
||||
printLineF2(F("Dial Lock ON"));
|
||||
else
|
||||
printLineF2(F("Dial Lock OFF"));
|
||||
*/
|
||||
|
||||
delay_background(1000, 0);
|
||||
//delay_background(1000, 0);
|
||||
printLine2ClearAndUpdate();
|
||||
}
|
||||
|
||||
@@ -1345,13 +1291,11 @@ void doMenu(){
|
||||
//ADJUST TUNE STEP
|
||||
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
|
||||
|
||||
while (!btnDown())
|
||||
{
|
||||
//Check_Cat(0); //To prevent disconnections
|
||||
//delay(50); //debounce
|
||||
delay_background(50, 0);
|
||||
|
||||
if (isNeedDisplay) {
|
||||
@@ -1382,8 +1326,6 @@ void doMenu(){
|
||||
}
|
||||
} //end of while
|
||||
|
||||
printLineF2(F("Changed Step!"));
|
||||
//SAVE EEPROM
|
||||
EEPROM.put(TUNING_STEP, tuneStepIndex);
|
||||
delay_background(500, 0);
|
||||
printLine2ClearAndUpdate();
|
||||
@@ -1398,41 +1340,88 @@ void doMenu(){
|
||||
btnState = btnDown();
|
||||
|
||||
if (i > 0){
|
||||
if (modeCalibrate && select + i < 220)
|
||||
if (modeCalibrate && select + i < 240)
|
||||
select += i;
|
||||
if (!modeCalibrate && select + i < 120)
|
||||
if (!modeCalibrate && select + i < 130)
|
||||
select += i;
|
||||
}
|
||||
//if (i < 0 && select - i >= 0)
|
||||
|
||||
if (i < 0 && select - i >= -10)
|
||||
select += i; //caught ya, i is already -ve here, so you add it
|
||||
|
||||
if (select < -5)
|
||||
menuExit(btnState);
|
||||
else if (select < 10)
|
||||
menuBand(btnState);
|
||||
else if (select < 20)
|
||||
menuVfoToggle(btnState);
|
||||
else if (select < 30)
|
||||
menuSelectMode(btnState);
|
||||
else if (select < 40)
|
||||
menuRitToggle(btnState);
|
||||
else if (select < 50)
|
||||
menuIFSSetup(btnState);
|
||||
else if (select < 60)
|
||||
menuCWSpeed(btnState);
|
||||
else if (select < 70)
|
||||
menuSplitOnOff(btnState); //SplitOn / off
|
||||
else if (select < 80)
|
||||
menuCHMemory(btnState, 0); //VFO to Memroy
|
||||
else if (select < 90)
|
||||
menuCHMemory(btnState, 1); //Memory to VFO
|
||||
else if (select < 100)
|
||||
menuCWAutoKey(btnState);
|
||||
else if (select < 110)
|
||||
menuSetup(btnState);
|
||||
else if (select < 120)
|
||||
menuExit(btnState);
|
||||
//if -> switch reduce program memory 200byte
|
||||
switch (select / 10)
|
||||
{
|
||||
case 0 :
|
||||
menuBand(btnState);
|
||||
break;
|
||||
case 1 :
|
||||
menuVfoToggle(btnState);
|
||||
break;
|
||||
case 2 :
|
||||
menuSelectMode(btnState);
|
||||
break;
|
||||
case 3 :
|
||||
menuRitToggle(btnState);
|
||||
break;
|
||||
case 4 :
|
||||
menuIFSSetup(btnState);
|
||||
break;
|
||||
case 5 :
|
||||
menuCWSpeed(btnState);
|
||||
break;
|
||||
case 6 :
|
||||
menuSplitOnOff(btnState); //SplitOn / off
|
||||
break;
|
||||
case 7 :
|
||||
menuCHMemory(btnState, 0); //VFO to Memroy
|
||||
break;
|
||||
case 8 :
|
||||
menuCHMemory(btnState, 1); //Memory to VFO
|
||||
break;
|
||||
case 9 :
|
||||
menuCWAutoKey(btnState);
|
||||
break;
|
||||
case 10 :
|
||||
menuWSPRSend(btnState);
|
||||
break;
|
||||
case 11 :
|
||||
menuSetup(btnState);
|
||||
break;
|
||||
case 12 :
|
||||
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)
|
||||
menuSetupCalibration(btnState); //crystal
|
||||
else if (select < 140 && modeCalibrate)
|
||||
@@ -1453,14 +1442,16 @@ void doMenu(){
|
||||
menuTxOnOff(btnState, 0x01); //TX OFF / ON
|
||||
else if (select < 220 && modeCalibrate)
|
||||
menuExit(btnState);
|
||||
*/
|
||||
|
||||
Check_Cat(0); //To prevent disconnections
|
||||
}
|
||||
|
||||
/*
|
||||
//debounce the button
|
||||
while(btnDown()){
|
||||
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 ***********************
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
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
|
||||
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(183, SI5351BX_XTALPF << 6); // Set 25mhz crystal load capacitance
|
||||
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};
|
||||
i2cWriten(26, vals, 8); // Write to 8 PLLA msynth regs
|
||||
//uint8_t vals[8] = {0, 1, BB2(msxp1), BB1(msxp1), BB0(msxp1), 0, 0, 0};
|
||||
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)
|
||||
// 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
|
||||
@@ -105,15 +124,48 @@ void si5351_set_calibration(int32_t cal){
|
||||
si5351bx_setfreq(0, usbCarrier);
|
||||
}
|
||||
|
||||
void SetCarrierFreq()
|
||||
{
|
||||
unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0));
|
||||
si5351bx_setfreq(0, appliedCarrier);
|
||||
|
||||
/*
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
|
||||
else
|
||||
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();
|
||||
}
|
||||
|
||||
if (cwMode == 0)
|
||||
si5351bx_setfreq(0, usbCarrier + (isIFShift ? ifShiftValue : 0));
|
||||
else
|
||||
si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0));
|
||||
//============================================================
|
||||
// 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))
|
||||
|
||||
//returns true if the button is pressed
|
||||
int btnDown(){
|
||||
int btnDown(void){
|
||||
if (digitalRead(FBUTTON) == HIGH)
|
||||
return 0;
|
||||
else
|
||||
@@ -173,7 +173,7 @@ void printLineF(char linenmbr, const __FlashStringHelper *c)
|
||||
}
|
||||
|
||||
#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)
|
||||
linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle
|
||||
|
||||
@@ -182,7 +182,7 @@ void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, b
|
||||
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||||
{
|
||||
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
|
||||
break;
|
||||
}
|
||||
@@ -281,6 +281,15 @@ void updateDisplay() {
|
||||
strcat(c, "B:");
|
||||
}
|
||||
|
||||
//Fixed by Mitani Massaru (JE4SMQ)
|
||||
if (isShiftDisplayCWFreq == 1)
|
||||
{
|
||||
if (cwMode == 1) //CWL
|
||||
tmpFreq = tmpFreq - sideTone + shiftDisplayAdjustVal;
|
||||
else if (cwMode == 2) //CWU
|
||||
tmpFreq = tmpFreq + sideTone + shiftDisplayAdjustVal;
|
||||
}
|
||||
|
||||
//display frequency
|
||||
for (int i = 15; i >= 6; i--) {
|
||||
if (tmpFreq > 0) {
|
||||
@@ -318,22 +327,6 @@ void updateDisplay() {
|
||||
lcd.setCursor(5,diplayVFOLine);
|
||||
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;
|
||||
|
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