| 
									
										
										
										
											2018-03-09 22:02:10 +09:00
										 |  |  | /**********************************************************************************
 | 
					
						
							|  |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2018-03-13 01:17:06 +09:00
										 |  |  |         //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;
 | 
					
						
							| 
									
										
										
										
											2018-03-09 22:02:10 +09:00
										 |  |  |         startTx(TX_CW, 0); | 
					
						
							| 
									
										
										
										
											2018-03-25 03:17:04 +09:00
										 |  |  |         setTXFilters(WsprTXFreq); | 
					
						
							| 
									
										
										
										
											2018-03-09 22:02:10 +09:00
										 |  |  |          | 
					
						
							|  |  |  |         //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); | 
					
						
							| 
									
										
										
										
											2018-03-13 01:17:06 +09:00
										 |  |  |         stopTx(); //call setFrequency -> recovery TX Filter
 | 
					
						
							|  |  |  |         //frequency = prevFreq;
 | 
					
						
							| 
									
										
										
										
											2018-03-09 22:02:10 +09:00
										 |  |  |          | 
					
						
							|  |  |  |         selectedWsprBandIndex = -1; | 
					
						
							|  |  |  |       }     //end of PTT Check
 | 
					
						
							|  |  |  |       else if (btnDown()) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }  //end of status check
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     //delay_background(50, 1);
 | 
					
						
							|  |  |  |   } //end of while
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |