diff --git a/SigLo.ino b/SigLo.ino index d1a5f99..c589816 100644 --- a/SigLo.ino +++ b/SigLo.ino @@ -119,6 +119,7 @@ void initSigLow() void doSigGenLow () { static uint32_t oldIF; // to store the current IF + static uint16_t oldSigGenOutputOn; uint16_t t_x = 0, t_y = 0; // To store the touch coordinates @@ -172,21 +173,6 @@ void doSigGenLow () case 15: // toggle the output on/off sigGenOutputOn = !sigGenOutputOn; - if (sigGenOutputOn) { - SetRX(3); // both LO and RX in transmit. Output levels have been set in the init function - key[b].drawButton(true, sig_keys[b].activeText); - tft.setCursor(sig_keys[b].x + 30, sig_keys[b].y); - tft.fillRect(sig_keys[b].x + 30, sig_keys[b].y, sig_keys[b].x + 60, sig_keys[b].y + 10, SIG_BACKGROUND_COLOR); - tft.setTextColor(TFT_GREEN, SIG_BACKGROUND_COLOR ); - tft.print(" ON"); - } else { - SetRX(1); // Both in receive - key[b].drawButton(false, sig_keys[b].text); - tft.setCursor(sig_keys[b].x + 30, sig_keys[b].y); - tft.fillRect(sig_keys[b].x + 30, sig_keys[b].y, sig_keys[b].x + 60, sig_keys[b].y + 10, SIG_BACKGROUND_COLOR); - tft.setTextColor(TFT_WHITE, SIG_BACKGROUND_COLOR ); - tft.print("OFF"); - } break; case 16: // launch menu @@ -224,6 +210,32 @@ void doSigGenLow () return; } } + + // check if state changed - can change from command or from wifi + switch (b) { + case 15: // On/Off button + if (oldSigGenOutputOn != sigGenOutputOn) + { + if (sigGenOutputOn) { + SetRX(3); // both LO and RX in transmit. Output levels have been set in the init function + key[b].drawButton(true, sig_keys[b].activeText); + tft.setCursor(sig_keys[b].x + 30, sig_keys[b].y); + tft.fillRect(sig_keys[b].x + 30, sig_keys[b].y, sig_keys[b].x + 60, sig_keys[b].y + 10, SIG_BACKGROUND_COLOR); + tft.setTextColor(TFT_GREEN, SIG_BACKGROUND_COLOR ); + tft.print(" ON"); + } else { + SetRX(1); // Both in receive + key[b].drawButton(false, sig_keys[b].text); + tft.setCursor(sig_keys[b].x + 30, sig_keys[b].y); + tft.fillRect(sig_keys[b].x + 30, sig_keys[b].y, sig_keys[b].x + 60, sig_keys[b].y + 10, SIG_BACKGROUND_COLOR); + tft.setTextColor(TFT_WHITE, SIG_BACKGROUND_COLOR ); + tft.print("OFF"); + } + } + break; + + } // on of state change switch + } // end of keys loop @@ -272,6 +284,7 @@ void doSigGenLow () oldFreq = sigGenSetting.Frequency; oldIF = setting.IF_Freq; + oldSigGenOutputOn = sigGenOutputOn; } diff --git a/SweepLo.ino b/SweepLo.ino index 6fc658a..b319a19 100644 --- a/SweepLo.ino +++ b/SweepLo.ino @@ -73,6 +73,7 @@ static bool resetAverage; // Flag to indicate a setting has changed and avera static bool jsonDocInitialised = false; static uint16_t chunkIndex; static uint32_t offsetIF; // IF frequency offset by half the bandwidth to position in the centre of the filter +static uint32_t tgIF; // Track gen IF - SA IF plus any offset if both SI4432 defined @@ -181,6 +182,15 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos tg_lo.RxMode(); #endif +#if defined(SI_TG_IF_CS) && defined(SI_TG_LO_CS) + if (tgLO_OK && tgIF_OK && (trackGenSetting.Mode == 2) ) // tracking gen as signal generator + { + tg_if.SetFrequency ( setting.IF_Freq + trackGenSetting.Offset ); + tg_lo.SetFrequency ( setting.IF_Freq + trackGenSetting.Offset + trackGenSetting.Frequency ); + tg_lo.TxMode ( trackGenSetting.LO_Drive ); // Set tracking generator LO on + tg_if.TxMode ( trackGenSetting.IF_Drive ); // Set tracking generator IF on + } +#endif } // initSweep || changedSetting @@ -208,6 +218,12 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos tempIF = offsetIF; } + // track gen IF follows LO if only one SI4432, otherwise its offset by an amount to reduce blow by + if (tgLO_OK) + tgIF = tempIF + trackGenSetting.Offset; + else + tgIF = tempIF; + spurToggle = !spurToggle; @@ -226,7 +242,7 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos #ifdef SI_TG_IF_CS if (tgIF_OK && (trackGenSetting.Mode == 1) ) - tg_if.SetFrequency ( tempIF + trackGenSetting.Offset ); // Set tracking generator IF for the sweep + tg_if.SetFrequency ( tgIF ); // Set tracking generator IF for the sweep #endif } @@ -234,13 +250,11 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos #ifdef SI_TG_LO_CS if (tgLO_OK && (trackGenSetting.Mode == 1) ) - tg_lo.SetFrequency ( tempIF + autoSweepFreq + trackGenSetting.Offset ); // Set tracking generator LO + tg_lo.SetFrequency ( tgIF + autoSweepFreq ); // Set tracking generator LO #endif setFreqMicros = micros(); // Store the time the frequency was changed -// if (trackGenSetting.Mode == 1) // debug -// Serial.printf("tglo start %i at %i\n", tg_lo.GetFrequency(), setFreqMicros); /* * Actual frequency in the SI4432 is rounded and is limited by the possible resolution diff --git a/cmd.cpp b/cmd.cpp index 291f414..ee3eabb 100644 --- a/cmd.cpp +++ b/cmd.cpp @@ -106,6 +106,7 @@ extern uint32_t colourTest; extern Marker marker[MARKER_COUNT]; // Array of marker objects +extern uint16_t sigGenOutputOn; // signal generator state - 0 = off, 1 = on /* * Functions still in the main program file. Maybe some need to move here? @@ -183,6 +184,12 @@ extern uint8_t dBmToRSSI ( double dBm ); { "RXSWEEP", MSG_RX_SWEEP }, // Set RX Sweep Mode { "RXSIGNAL", MSG_RXSIGNAL }, // IF sweep signal frequency { "EXTGAIN", MSG_EXTGAIN }, // External gain or attenuation + { "SGON", MSG_SGON }, // turn on signal generator output + { "SGOFF", MSG_SGOFF }, // turn off signal generator output + { "TRACKON", MSG_TGON }, // turn on tracking generator output + { "TRACKOFF", MSG_TGOFF }, // turn off tracking generator output + { "TRACKSIG", MSG_TGSIG }, // turn off tracking generator output + { "TGFREQ", MSG_TGFREQ }, // Set Track gen freq for sig gen mode { "", MSG_NONE } // Unrecognized command }; @@ -248,10 +255,15 @@ void ShowMenu () Serial.printf ( " WFMIN.........Set the minimum RSSI level for waterfall colouring: %i\n", setting.WaterfallMin ); Serial.printf ( " WFGAIN........Set the gain for waterfall colouring: %d\n", setting.WaterfallGain ); - Serial.println ( "\nOther Commands:\n" ); - Serial.print ( " DRIVE.........Local oscillator drive level [0 to 7]; currently: " ); - Serial.println ( setting.Drive ); + Serial.println ( "\nSignal Generator Commands:\n" ); + + Serial.println ( " SGON..........Turn on signal generator output" ); + Serial.print ( " SGOFF.........Turn off signal generator output; currently " ); + Serial.println ( sigGenOutputOn ); + + Serial.print ( " SGFREQ........Signal Generator frequency, currently: " ); + Serial.println ( FormatFrequency ( sigGenSetting.Frequency )); Serial.print ( " SGLODRIVE.....Local oscillator drive level in signal generator mode [0 to 7]; currently: " ); Serial.println ( sigGenSetting.LO_Drive ); @@ -259,14 +271,35 @@ void ShowMenu () Serial.print ( " SGRXDRIVE.....Local oscillator drive level in signal generator mode [0 to 7]; currently: " ); Serial.println ( sigGenSetting.RX_Drive ); +#ifdef SI_TG_IF_CS + Serial.println ( "\nTracking Generator Commands:\n" ); + + Serial.println ( " TRACKON.......Turn on tracking generator output" ); +#ifdef SI_TG_LO_CS + Serial.println ( " TRACKSIG......Turn on tracking generator signal generator output" ); +#endif + Serial.print ( " TRACKOFF......Turn off tracking generator output; currently " ); + Serial.println ( trackGenSetting.Mode ); + +#ifdef SI_TG_LO_CS Serial.print ( " TGLODRIVE.....Local oscillator drive level in tracking generator mode [0 to 7]; currently: " ); Serial.println ( trackGenSetting.LO_Drive ); - +#endif Serial.print ( " TGIFDRIVE.....Local oscillator drive level in tracking generator mode [0 to 7]; currently: " ); Serial.println ( trackGenSetting.IF_Drive ); - +#ifdef SI_TG_LO_CS Serial.print ( " TGOFFSET......Tracking generator offset from SA IF; currently: " ); Serial.println ( trackGenSetting.Offset ); + Serial.print ( " TGFREQ........Tracking generator signal generator frequency; currently: " ); + Serial.println ( trackGenSetting.Frequency ); +#endif +#endif + + + Serial.println ( "\nOther Commands:\n" ); + + Serial.print ( " DRIVE.........Local oscillator drive level [0 to 7]; currently: " ); + Serial.println ( setting.Drive ); Serial.println ( " SAVE .........Save the current scan configuration [0 to 4]" ); @@ -759,6 +792,17 @@ uint8_t reg69; // Ditto return true; +/* + * Signal Generator On/Off commands + * + */ + case MSG_SGON: + SetSGState(1); + return true; + + case MSG_SGOFF: + SetSGState(0); + return true; /* * The "SGLODRIVE" command sets the local oscillator "drive" level in signal generator mode. @@ -800,8 +844,26 @@ uint8_t reg69; // Ditto return true; +/* + * Tracking Generator On/Off commands + * + */ + case MSG_TGON: + SetTracking(1); + return true; + + case MSG_TGOFF: + SetTracking(0); + return true; + #ifdef SI_TG_LO_CS + + case MSG_TGSIG: + SetTracking(2); + return true; + + /* * The "TGLODRIVE" command sets the local oscillator "drive" level in tracking generator mode. * (only valid if two SI4432 used for the tracking generator) @@ -1578,6 +1640,14 @@ uint8_t reg69; // Ditto Serial.printf ( "Tracking Generator IF offset: %i\n", trackGenSetting.Offset ); // sort out signed version of format frequency!!!!!!!!!!!!!!!!!!! return true; + case MSG_TGFREQ: + if ( dataLen != 0 ) // Frequency specified? + { + freq1 = ParseFrequency ( dataBuff ); // Yes, get new frequency + SetTGFreq (freq1); + } + Serial.printf ( "Tracking Signal Generator frequency: %i\n", FormatFrequency ( trackGenSetting.Frequency )); + return true; /* @@ -2433,6 +2503,26 @@ int oldLevel = setting.Drive; } +/* Set SGFreq sets the signal generator Frequency + * Signal generator frequency may change frequently, so don't save the setting + * Settings are saved when leaving the mode + * parameter is in Hz + */ +void SetSGFreq (uint32_t f) +{ + if ( ( f >= MIN_SIGLO_FREQ ) && ( f <= MAX_SIGLO_FREQ ) ) + sigGenSetting.Frequency = f; +} + +/* + * Sig gen state is not saved - always want to start in off state + */ + +void SetSGState (uint16_t s) +{ + sigGenOutputOn = s; +} + /* * "SetSGLoDrive" sets the transmitter max output level in signal generator mode. * @@ -2618,6 +2708,28 @@ int32_t GetTGOffset ( ) return trackGenSetting.Offset; } +/* + * Set the IF frequency - M0WID addition + */ + +bool SetTGFreq ( int32_t freq ) +{ +int32_t oldFreq = trackGenSetting.Frequency; + + if (( freq < MIN_SIGLO_FREQ ) || ( freq > MAX_SIGLO_FREQ )) // If out of limits + return false; // Don't change it + + trackGenSetting.Frequency = freq; + + if ( oldFreq != trackGenSetting.Frequency ) + { + changedSetting = true; + WriteTrackGenSettings (); + } + + return true; // Frequency was good +} + /* * "SetSweepStart" and "GetSweepStart" were added in Version 2.3. They used to be in diff --git a/cmd.h b/cmd.h index b09f970..90bff9b 100644 --- a/cmd.h +++ b/cmd.h @@ -78,6 +78,13 @@ #define MSG_RX_SWEEP 49 // Set the RX Sweep Mode #define MSG_RXSIGNAL 50 // Set frequency of injected signal for IF Sweep #define MSG_EXTGAIN 51 // Set external gain or attenuation +#define MSG_SGON 52 // Turn Signal Generator output on +#define MSG_SGOFF 53 // Turn Signal Generator output off +#define MSG_SG_FREQ 54 // Set Signal Generator Frequency +#define MSG_TGON 55 // Turn Tracking Generator output on +#define MSG_TGOFF 56 // Turn Tracking Generator output off +#define MSG_TGFREQ 57 // Set Track Gen frequency for sig gen mode +#define MSG_TGSIG 58 // Set Track Gen sig gen mode #define MSG_COLOURTEST 99 // test of waterfall colours - remove this when done! @@ -139,6 +146,7 @@ void SetGenerate ( int8_t g ); // Puts the unit into or out of signal generat bool SetIFFrequency ( int32_t f ); // Sets the IF frequency void SetLoDrive ( uint8_t level ); // Sets LO Si4432 output level +void SetSGState (uint16_t s); void SetSGLoDrive ( uint8_t level ); void SetSGRxDrive ( uint8_t level ); @@ -146,6 +154,7 @@ void SetTracking ( int8_t m ); // set tracking generator mode void SetTGLoDrive ( uint8_t level ); // set tracking generator drive void SetTGIfDrive ( uint8_t level ); bool SetTGOffset ( int32_t offset); // set tracking generator offset - returns false if invalid +bool SetTGFreq ( int32_t freq); // set tracking generator freq for sig gen mode - returns false if invalid int32_t GetTGOffset (void ); void SetTGPower ( int16_t dBm ); // Set TG attenuator and drive levels diff --git a/data/index.html b/data/index.html index 876cb09..4faeb04 100644 --- a/data/index.html +++ b/data/index.html @@ -739,7 +739,7 @@ function handleSettings (settings) setRBW.disabled = false; setRefOut.disabled = true; setSpur.disabled = true; - setTrackgen.disabled = true; + setTrackGen.disabled = true; setTrackGenPower.disabled = true; } else if (settings.mode == 4 ) { // IF Sweep (SAW test) setStart.max = settings.IF; @@ -752,7 +752,7 @@ function handleSettings (settings) setRBW.disabled = true; setRefOut.disabled = true; setSpur.disabled = true; - setTrackgen.disabled = true; + setTrackGen.disabled = true; setTrackGenPower.disabled = true; } else if (settings.mode == 7 ) { // BANDSCOPE setStart.max = 350; @@ -765,7 +765,7 @@ function handleSettings (settings) setRBW.disabled = false; setRefOut.disabled = true; setSpur.disabled = true; - setTrackgen.disabled = true; + setTrackGen.disabled = true; setTrackGenPower.disabled = true; } else { setStart.max = 350; @@ -778,7 +778,7 @@ function handleSettings (settings) setRBW.disabled = false; setRefOut.disabled = false; setSpur.disabled = false; - setTrackgen.disabled = false; + setTrackGen.disabled = false; setTrackGenPower.disabled = false; } diff --git a/data/siggen.html b/data/siggen.html new file mode 100644 index 0000000..876cb09 --- /dev/null +++ b/data/siggen.html @@ -0,0 +1,1339 @@ + + + + + +
+