diff --git a/SigLo.ino b/SigLo.ino index 9dd1788..8a44931 100644 --- a/SigLo.ino +++ b/SigLo.ino @@ -109,7 +109,7 @@ void initSigLow() #ifdef USE_WIFI if ( numberOfWebsocketClients > 0 ) - pushSettings (); + pushSigGenSettings (); #endif } @@ -126,6 +126,8 @@ void doSigGenLow () static uint32_t oldIF; // to store the current IF static uint16_t oldSigGenOutputOn; float p; // temporary variable for slider percent + static uint16_t sliderRange = ATTENUATOR_RANGE + RX_SI4432_MAX_DRIVE * 3; + uint16_t t_x = 0, t_y = 0; // To store the touch coordinates @@ -135,10 +137,28 @@ void doSigGenLow () #endif if (changedSetting) { - att.SetAtten(sigGenSetting.Calibration - sigGenSetting.Power); + // calculate required drive and attenuator settings + // keep drive as high as possible so nasties are attenuated + uint16_t sgRXDrive = RX_SI4432_MAX_DRIVE; + uint16_t attenuation = sigGenSetting.Calibration - sigGenSetting.Power; + if (attenuation > ATTENUATOR_RANGE ) + { + int16_t diff = sigGenSetting.Calibration - ATTENUATOR_RANGE - sigGenSetting.Power; + sgRXDrive = RX_SI4432_MAX_DRIVE - (int16_t)(diff/3) ; + attenuation = ATTENUATOR_RANGE - diff%3; + } + SetSGRxDrive(sgRXDrive); + att.SetAtten(attenuation); + Serial.printf("sigGenLow - rxDrive set to %i, attenuation set to %i, cal is %i\n", sgRXDrive, attenuation, sigGenSetting.Calibration); + + #ifdef USE_WIFI + if ( numberOfWebsocketClients > 0 ) + pushSigGenSettings (); + #endif + + changedSetting = false; } - boolean changedSetting = false; // Get current touch state and coordinates boolean pressed = tft.getTouch(&t_x, &t_y); // Just uses standard TFT_eSPI function as not bothered about speed @@ -259,13 +279,13 @@ void doSigGenLow () if ( sliderPressed( pressed, t_x, t_y) ) { p = sliderPercent( t_x ); // position of slider in % - float pwr = p * (ATTENUATOR_RANGE)/100.0 + sigGenSetting.Calibration - ATTENUATOR_RANGE; + float pwr = p * (sliderRange)/100.0 + sigGenSetting.Calibration - sliderRange; drawSlider ( SLIDER_X, SLIDER_Y, p, pwr, "dBm" ); sigGenSetting.Power = pwr; changedSetting = true; } else { - p = ( sigGenSetting.Power - (sigGenSetting.Calibration - ATTENUATOR_RANGE) ) * 100.0 / ATTENUATOR_RANGE; + p = ( sigGenSetting.Power - (sigGenSetting.Calibration - sliderRange) ) * 100.0 / sliderRange; drawSlider ( SLIDER_X, SLIDER_Y, p, sigGenSetting.Power, "dBm" ); } @@ -304,11 +324,6 @@ void doSigGenLow () oldIF = setting.IF_Freq; oldSigGenOutputOn = sigGenOutputOn; -#ifdef USE_WIFI - if ( numberOfWebsocketClients > 0 ) - pushSettings (); -#endif - } diff --git a/cmd.cpp b/cmd.cpp index 8f6f8d6..0b7b906 100644 --- a/cmd.cpp +++ b/cmd.cpp @@ -269,7 +269,9 @@ void ShowMenu () Serial.print ( " SGLODRIVE.....Local oscillator drive level in signal generator mode [0 to 7]; currently: " ); Serial.println ( sigGenSetting.LO_Drive ); - Serial.print ( " SGRXDRIVE.....Local oscillator drive level in signal generator mode [0 to 7]; currently: " ); + Serial.print ( " SGRXDRIVE.....RX SI4432 oscillator drive level in signal generator mode [0 to "); + Serial.print ( RX_SI4432_MAX_DRIVE ); + Serial.print ( "]; currently: " ); Serial.println ( sigGenSetting.RX_Drive ); #ifdef SI_TG_IF_CS @@ -811,7 +813,7 @@ uint8_t reg69; // Ditto freq1 = ParseFrequency ( dataBuff ); // Yes, get new frequency SetSGFreq (freq1); } - Serial.printf ( "Signal Generator frequency: %i\n", FormatFrequency ( sigGenSetting.Frequency )); + Serial.printf ( "Signal Generator frequency: %i\n", FormatFrequency ( freq1 )); return true; @@ -826,7 +828,7 @@ uint8_t reg69; // Ditto tempValue = atoi ( dataBuff ); // Yes, convert to a number if (( tempValue < MIN_DRIVE ) || ( tempValue > MAX_DRIVE )) - Serial.printf ( "Invalid drive specification: %d\n", tempValue ); + Serial.printf ( "Invalid LO drive: %d\n", tempValue ); else // Set the transmitter drive level SetSGLoDrive ( tempValue ); // "SetSGLoDrive" saves the settings } @@ -838,17 +840,17 @@ uint8_t reg69; // Ditto return true; /* - * The "SGLODRIVE" command sets the receiver (IF) oscillator "drive" level in signal generator mode. + * The "SGRXDRIVE" command sets the receiver (IF) oscillator "drive" level in signal generator mode. */ case MSG_SG_RX_DRIVE: if ( dataLen != 0 ) // Drive level specified? { tempValue = atoi ( dataBuff ); // Yes, convert to a number - if (( tempValue < MIN_DRIVE ) || ( tempValue > MAX_DRIVE )) - Serial.printf ( "Invalid drive specification: %d\n", tempValue ); + if (( tempValue < MIN_DRIVE ) || ( tempValue > RX_SI4432_MAX_DRIVE )) + Serial.printf ( "Invalid RX drive: %d - (%d-%d)\n", tempValue, MIN_DRIVE, RX_SI4432_MAX_DRIVE ); else // Set the transmitter drive level - SetSGRxDrive ( tempValue ); // "SetTGRxDrive" saves the settings + SetSGRxDrive ( tempValue ); // "SetSGRxDrive" saves the settings } Serial.printf ( "SigGen RX Drive: %d (+%udBm)\n", sigGenSetting.RX_Drive, driveLevel[sigGenSetting.RX_Drive] ); @@ -2589,13 +2591,16 @@ int oldLevel = sigGenSetting.LO_Drive; * 1 => +2dBm 5 => +14dBm * 2 => +5dBm 6 => +17dBm * 3 => +8dBm 7 => +20dBm + * Note the power limits of the B3555 SAW filter is 10dBm + * RX_SI4432_MAX_DRIVE is set in my_SA.h to suit the attenuator pad and losses + * in your build. */ void SetSGRxDrive ( uint8_t level ) { int oldLevel = sigGenSetting.RX_Drive; - if (( level < 0 ) || ( level > 7 )) + if (( level < 0 ) || ( level > RX_SI4432_MAX_DRIVE )) return; else @@ -2620,7 +2625,7 @@ void SetSGPower ( int16_t dBm ) if ( dBm > sigGenSetting.Calibration ) dBm = sigGenSetting.Calibration; - if ( dBm < sigGenSetting.Calibration - ATTENUATOR_RANGE ) + if ( dBm < (sigGenSetting.Calibration - ATTENUATOR_RANGE - RX_SI4432_MAX_DRIVE * 3) ) dBm = sigGenSetting.Calibration - ATTENUATOR_RANGE; sigGenSetting.Power = dBm; diff --git a/data/index.html b/data/index.html index 6cc665f..e1db512 100644 --- a/data/index.html +++ b/data/index.html @@ -60,30 +60,32 @@
Signal Generator

- - - - + + + + , - - - + + + , - - - + + + Hz - - +   +   + +


- - + + dBm

- +
@@ -163,10 +165,10 @@
- + dB - + dB
@@ -188,18 +190,29 @@
- +
- - + +
+ - dBm + dBm
+
+ + + MHz +
+

@@ -353,6 +366,7 @@ var setPreAmp = document.getElementById('setPreAmp'); var setAverage = document.getElementById('Average'); var setTrackGen = document.getElementById('trackGen'); var setTrackGenPower = document.getElementById('setTrackGenPower'); +var setTGFreq = document.getElementById('setTGFreq'); var store1 = document.getElementById('store1'); var store2 = document.getElementById('store2'); var store3 = document.getElementById('store3'); @@ -360,19 +374,19 @@ var store4 = document.getElementById('store4'); //var messageWindow = document.getElementById('message'); var sigLevelSlider = document.getElementById('sigLevelSlider'); -var setSigLevel = document.getElementById('setSigLevel'); +var setSigGenPower = document.getElementById('setSigGenPower'); +var setSigGenFreq = document.getElementById('setSigGenFreq'); +var sigOnButton = document.getElementById('sigOnButton'); -var setSigFreq = document.getElementById('setSigFreq'); - -var setSigFreq0 = document.getElementById('setSigFreq0'); -var setSigFreq1 = document.getElementById('setSigFreq1'); -var setSigFreq2 = document.getElementById('setSigFreq2'); -var setSigFreq3 = document.getElementById('setSigFreq3'); -var setSigFreq4 = document.getElementById('setSigFreq4'); -var setSigFreq5 = document.getElementById('setSigFreq5'); -var setSigFreq6 = document.getElementById('setSigFreq6'); -var setSigFreq7 = document.getElementById('setSigFreq7'); -var setSigFreq8 = document.getElementById('setSigFreq8'); +var setSigGenFreq0 = document.getElementById('setSigGenFreq0'); +var setSigGenFreq1 = document.getElementById('setSigGenFreq1'); +var setSigGenFreq2 = document.getElementById('setSigGenFreq2'); +var setSigGenFreq3 = document.getElementById('setSigGenFreq3'); +var setSigGenFreq4 = document.getElementById('setSigGenFreq4'); +var setSigGenFreq5 = document.getElementById('setSigGenFreq5'); +var setSigGenFreq6 = document.getElementById('setSigGenFreq6'); +var setSigGenFreq7 = document.getElementById('setSigGenFreq7'); +var setSigGenFreq8 = document.getElementById('setSigGenFreq8'); var tempCenter; @@ -392,6 +406,13 @@ var oldSweepPoints = 0; var oldSpur = 2; var oldTrackGen = 2; var oldTrackGenPower = 1000; +var oldTGFreq = -1; +var oldSigGen = -1; +var oldSigGenPower = 1000; +var oldSigGenFreq = -1; +var oldSigGenMod = -1; +var oldSigGenModFreq = -1; +var oldSigOnButton = -1; // Chart configuration - Scope var RSSISamples = [ @@ -491,12 +512,23 @@ var chartSA = new CanvasJS.Chart("chartSA", }, axisX: { title: "Frequency (MHz)", - titleFontSize: 24 + titleFontSize: 24, + gridThickness: 1, + gridColor: "WhiteSmoke", + stripLines:[ + { + startValue:50, + thickness:1, + color:"#d8d8d8", + } + ] }, axisY: { title: "dB", titleFontSize: 24, + gridThickness: 1, + gridColor: "WhiteSmoke", minimum: -120 }, axisY2: [ @@ -515,6 +547,7 @@ var chartSA = new CanvasJS.Chart("chartSA", exportEnabled: true, legend: { cursor: "pointer", + fontSize: 16, itemclick: function (e) { //console.log("legend click: " + e.dataPointIndex); //console.log(e); @@ -672,13 +705,17 @@ setSpur.addEventListener('change', (event) => { }); setTrackGen.addEventListener('change', (event) => { - if (setTrackGen.checked) { - sendValue("t", 1); - } else { - sendValue("t", 0); - } + sendValue("t", setTrackGen.value); }); +setTrackGenPower.addEventListener('change', (event) => { + sendValue("T", setTrackGenPower.value); +}); + + +setTGFreq.addEventListener('change', (event) => { + sendValue("f", setTGFreq.value); +}); store1.addEventListener('change', (event) => { if (store1.checked) { @@ -740,43 +777,43 @@ store4.addEventListener('change', (event) => { function changeStep(newStep) { freqStep = newStep; - setSigFreq0.style.color = "black"; - setSigFreq1.style.color = "black"; - setSigFreq2.style.color = "black"; - setSigFreq3.style.color = "black"; - setSigFreq4.style.color = "black"; - setSigFreq5.style.color = "black"; - setSigFreq6.style.color = "black"; - setSigFreq7.style.color = "black"; - setSigFreq8.style.color = "black"; + setSigGenFreq0.style.color = "black"; + setSigGenFreq1.style.color = "black"; + setSigGenFreq2.style.color = "black"; + setSigGenFreq3.style.color = "black"; + setSigGenFreq4.style.color = "black"; + setSigGenFreq5.style.color = "black"; + setSigGenFreq6.style.color = "black"; + setSigGenFreq7.style.color = "black"; + setSigGenFreq8.style.color = "black"; switch(freqStep) { case 1: - setSigFreq0.style.color = "red"; + setSigGenFreq0.style.color = "red"; break; case 10: - setSigFreq1.style.color = "red"; + setSigGenFreq1.style.color = "red"; break; case 100: - setSigFreq2.style.color = "red"; + setSigGenFreq2.style.color = "red"; break; case 1000: - setSigFreq3.style.color = "red"; + setSigGenFreq3.style.color = "red"; break; case 10000: - setSigFreq4.style.color = "red"; + setSigGenFreq4.style.color = "red"; break; case 100000: - setSigFreq5.style.color = "red"; + setSigGenFreq5.style.color = "red"; break; case 1000000: - setSigFreq6.style.color = "red"; + setSigGenFreq6.style.color = "red"; break; case 10000000: - setSigFreq7.style.color = "red"; + setSigGenFreq7.style.color = "red"; break; case 100000000: - setSigFreq8.style.color = "red"; + setSigGenFreq8.style.color = "red"; break; } }; @@ -797,106 +834,126 @@ function incdec(direction, factor) { frequency = 0; console.log("incdec:", frequency); var tempFreq = frequency; - setSigFreq0.value = frequency%10; + setSigGenFreq0.value = frequency%10; tempFreq = parseInt(tempFreq/10); - setSigFreq1.value = tempFreq%10; + setSigGenFreq1.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq2.value = tempFreq%10; + setSigGenFreq2.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq3.value = tempFreq%10; + setSigGenFreq3.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq4.value = tempFreq%10; + setSigGenFreq4.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq5.value = tempFreq%10; + setSigGenFreq5.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq6.value = tempFreq%10; + setSigGenFreq6.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq7.value = tempFreq%10; + setSigGenFreq7.value = tempFreq%10; tempFreq = parseInt(tempFreq/10); - setSigFreq8.value = tempFreq%10; + setSigGenFreq8.value = tempFreq%10; - sendValue("F", frequency); + if (factor != 0) + sendValue("F", frequency); } incButton.onclick = function() {incdec(1, freqStep)}; decButton.onclick = function() {incdec(-1, freqStep)}; -setSigFreq0.onfocus = function() {changeStep(1)}; -setSigFreq1.onfocus = function() {changeStep(10)}; -setSigFreq2.onfocus = function() {changeStep(100)}; -setSigFreq3.onfocus = function() {changeStep(1000)}; -setSigFreq4.onfocus = function() {changeStep(10000)}; -setSigFreq5.onfocus = function() {changeStep(100000)}; -setSigFreq6.onfocus = function() {changeStep(1000000)}; -setSigFreq7.onfocus = function() {changeStep(10000000)}; -setSigFreq8.onfocus = function() {changeStep(100000000)}; +setSigGenFreq0.onfocus = function() {changeStep(1)}; +setSigGenFreq1.onfocus = function() {changeStep(10)}; +setSigGenFreq2.onfocus = function() {changeStep(100)}; +setSigGenFreq3.onfocus = function() {changeStep(1000)}; +setSigGenFreq4.onfocus = function() {changeStep(10000)}; +setSigGenFreq5.onfocus = function() {changeStep(100000)}; +setSigGenFreq6.onfocus = function() {changeStep(1000000)}; +setSigGenFreq7.onfocus = function() {changeStep(10000000)}; +setSigGenFreq8.onfocus = function() {changeStep(100000000)}; -setSigFreq0.addEventListener('wheel', (event) => { +setSigGenFreq0.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(1); incdec(-event.deltaY,1); }); -setSigFreq1.addEventListener('wheel', (event) => { +setSigGenFreq1.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(10); incdec(-event.deltaY,10); }); -setSigFreq2.addEventListener('wheel', (event) => { +setSigGenFreq2.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(100); incdec(-event.deltaY,100); }); -setSigFreq3.addEventListener('wheel', (event) => { +setSigGenFreq3.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(1000); incdec(-event.deltaY,1000); }); -setSigFreq4.addEventListener('wheel', (event) => { +setSigGenFreq4.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(10000); incdec(-event.deltaY,10000); }); -setSigFreq5.addEventListener('wheel', (event) => { +setSigGenFreq5.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(100000); incdec(-event.deltaY,100000); }); -setSigFreq6.addEventListener('wheel', (event) => { +setSigGenFreq6.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(1000000); incdec(-event.deltaY,1000000); }); -setSigFreq7.addEventListener('wheel', (event) => { +setSigGenFreq7.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(10000000); incdec(-event.deltaY,10000000); }); -setSigFreq8.addEventListener('wheel', (event) => { +setSigGenFreq8.addEventListener('wheel', (event) => { event.preventDefault(); changeStep(100000000); incdec(-event.deltaY,100000000); }); -setSigLevel.addEventListener('change', (event) => { - sendValue("L", setSigLevel.value); -}); +setSigGenPower.onchange = function() { + sendValue("L", setSigGenPower.value); + sigLevelSlider.value = this.value; +}; // Update the current level value (each time you drag the slider handle) sigLevelSlider.oninput = function() { - setSigLevel.value = this.value; + setSigGenPower.value = this.value; + setSigGenPower.onchange(); } +function styleSigGenButton ( val ) { + if (sigOnButton.value == 1) { + sigOnButton.style="background-color:green"; + } else { + sigOnButton.style="background-color:lightgrey"; + } +} + +sigOnButton.onclick = function() { + if (sigOnButton.value == 1) { + sigOnButton.value = 0; + } else { + sigOnButton.value = 1; + } + styleSigGenButton (sigOnButton.value); + sendValue("G", sigOnButton.value); +} //var roundtripTime = document.getElementById('roundtripTime'); //var messageCount = document.getElementById('messageCount'); @@ -962,6 +1019,7 @@ function handleSettings (settings) setRefOut.disabled = true; setSpur.disabled = true; setTrackGen.disabled = true; + setTGFreq.disabled = true; setTrackGenPower.disabled = true; sigDiv.style.display = "none"; chartDiv.style.display = "block"; @@ -978,6 +1036,7 @@ function handleSettings (settings) setRefOut.disabled = true; setSpur.disabled = true; setTrackGen.disabled = true; + setTGFreq.disabled = true; setTrackGenPower.disabled = true; sigDiv.style.display = "none"; chartDiv.style.display = "block"; @@ -1010,6 +1069,7 @@ function handleSettings (settings) setRefOut.disabled = true; setSpur.disabled = true; setTrackGen.disabled = true; + setTGFreq.disabled = true; setTrackGenPower.disabled = true; sigDiv.style.display = "block"; chartDiv.style.display = "none"; @@ -1026,6 +1086,7 @@ function handleSettings (settings) setRefOut.disabled = false; setSpur.disabled = false; setTrackGen.disabled = false; + setTGFreq.disabled = false; setTrackGenPower.disabled = false; sigDiv.style.display = "none"; chartDiv.style.display = "block"; @@ -1104,16 +1165,43 @@ function handleSettings (settings) oldSpur = settings.spur; } - if (settings.tg != oldTrackGen) { - if (settings.tg) { - setTrackGen.checked = true; // Tracking Generator checkbox - } else { - setTrackGen.checked = false; // Tracking Generator checkbox - } + if (settings.sg != oldSigGen) { // Sig gen on/off + sigOnButton.value = settings.sg; + oldSigGen = settings.sg; + styleSigGenButton (sigOnButton.value); + } + + if (settings.sgFreq != oldSigGenFreq) { // sig gen frequency + frequency = settings.sgFreq; + oldSigGenFreq = settings.sgFreq; + incdec(0,0); + console.log("sigGenFreq=" + settings.sgFreq); + } + + sigLevelSlider.max = settings.sgCal; // Limits for sig gen power + sigLevelSlider.min = settings.sgCal - settings.sgRange; + setSigGenPower.max = settings.sgCal; + setSigGenPower.min = settings.sgCal - settings.sgRange; + + if (settings.sgPower != oldSigGenPower) { + setSigGenPower.value = settings.sgPower; + sigLevelSlider.value = settings.sgPower; + oldSigGenPower = settings.sgPower; + } + + + if (settings.tg != oldTrackGen) { // tracking generator state + setTrackGen.value = settings.tg; oldTrackGen = settings.tg; } - if (settings.tgPower != oldTrackGenPower) { + if (settings.tgFreq != oldTGFreq) { // tracking generator frequency for sig gen mode + setTGFreq.value = settings.tgFreq; + oldTGFreq = settings.tgFreq; + } + + + if (settings.tgPower != oldTrackGenPower) { // tracking generator output power setTrackGenPower.value = settings.tgPower; oldTrackGenPower = settings.tgPower; } @@ -1451,6 +1539,18 @@ function connect(host) items[i].disabled = false; } + var items = document.querySelectorAll(".select-button"); + var i; + for (i = 0; i< items.length; i++) { + items[i].disabled = false; + } + + var items = document.querySelectorAll(".checkbox-input"); + var i; + for (i = 0; i< items.length; i++) { + items[i].disabled = false; + } + }; connection.onclose = function(event) @@ -1473,6 +1573,18 @@ function connect(host) items[i].disabled = true; } + var items = document.querySelectorAll(".select-button"); + var i; + for (i = 0; i< items.length; i++) { + items[i].disabled = true; + } + + var items = document.querySelectorAll(".checkbox-input"); + var i; + for (i = 0; i< items.length; i++) { + items[i].disabled = true; + } + }; connection.onerror = function(error) @@ -1560,8 +1672,12 @@ function sendValue(c, val) // P Sig Gen set max output level (dBm) // //connection.send("# " + messageCounter + " " + sampleThreshold + " " + sampleSize); - connection.send("#" + c + " " + val); - console.log("Command:" + c + val); + if (connectionStatus.value == "Connected") { + connection.send("#" + c + " " + val); + console.log("Command:" + c + val); + } else { + console.log("No connection - Command:" + c + val); + } } diff --git a/data/styles.css b/data/styles.css index f409209..b9c8b63 100644 --- a/data/styles.css +++ b/data/styles.css @@ -182,7 +182,9 @@ input[type="number"] { } .set-button { - font-size: 14px; + width: 60px; + font-size: 14px; + background-color: lightgrey; } .setting { @@ -194,6 +196,11 @@ input[type="number"] { display: inline-block; } +.setting-widelabel { + width: 138px; + display: inline-block; + } + .sigTitle { font-size: 36px; font-weight: bold; diff --git a/my_SA.h b/my_SA.h index 51d42ff..5ba9dd4 100644 --- a/my_SA.h +++ b/my_SA.h @@ -65,6 +65,9 @@ // #define SLIDER_MAX_POWER -13.0 #define ATTENUATOR_RANGE 30 // in dB +// the B3555 SAW filter has max power rating of 10dBm. +// Drive of 4 = 11dBm but 1 dB pad in my build. If you have a larger attenuator pad you can try higher powers + #define RX_SI4432_MAX_DRIVE 4 // corresponds to 11dBm /* * These definitions control the values that get set when you select "AUTO SETTINGS" from diff --git a/simpleSA_wifi.cpp b/simpleSA_wifi.cpp index 93bd453..6a5b713 100644 --- a/simpleSA_wifi.cpp +++ b/simpleSA_wifi.cpp @@ -57,6 +57,7 @@ extern uint8_t AGC_Reg; // Fixed value for preampGain if not auto extern uint32_t startFreq_IF; extern uint32_t stopFreq_IF; extern uint32_t sigFreq_IF; +extern uint16_t sigGenOutputOn; extern uint32_t startFreq_RX; extern uint32_t stopFreq_RX; @@ -307,6 +308,10 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo SetLoDrive ( (uint8_t) value ); break; + case 'f': + SetTGFreq ( value ); + break; + case 'g': SetPreampGain( (int) value ); // Set PreAmp gain register break; @@ -346,6 +351,10 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo pushBandscopeSettings(); break; + case (SIG_GEN_LOW_RANGE): + pushSigGenSettings(); + break; + default: Serial.println("Invalid mode in Request setting handler - simpleSA_wifi.cpp"); @@ -356,6 +365,10 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo SetSweepSpan ( (int32_t) ( value * 1000000.0 )); break; + case 't': // Tracking Generator off/on/generate + SetTracking ( (int8_t)value ); + break; + case 'A': // Internal Attenuation (PE4302) SetAttenuation ( value ); break; @@ -365,10 +378,14 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo break; case 'F': - SetSGFreq ( value ); + SetSGFreq ( value ); // Signal Generator Frequency break; - case 'L': // Tracking Generator output power (dBm) + case 'G': + SetSGState ( (uint16_t)value ); // Signal Generator output on/off + break; + + case 'L': // Signal Generator output power (dBm) SetSGPower ( value ); break; @@ -381,10 +398,6 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo SetSpur ( (int8_t)value ); break; - case 't': // Tracking Generator off/on/generate - SetTracking ( (int8_t)value ); - break; - case 'T': // Tracking Generator output power (dBm) SetTGPower ( value ); break; @@ -619,6 +632,18 @@ void onGetSettings (AsyncWebServerRequest *request) root["spur"] = setting.Spur; root["tg"] = trackGenSetting.Mode; root["tgPower"] = trackGenSetting.Power; + root["tgFreq"] = trackGenSetting.Frequency; + root["tgMod"] = trackGenSetting.ModulationType; + root["tgModFreq"] = trackGenSetting.ModFrequency; + root["sg"] = sigGenOutputOn; // + root["sgPower"] = sigGenSetting.Power; + root["sgMod"] = sigGenSetting.ModulationType; + root["sgModFreq"] = sigGenSetting.ModFrequency; + root["sgFreq"] = sigGenSetting.Frequency; + root["sgCal"] = sigGenSetting.Calibration; + root["sgRange"] = ATTENUATOR_RANGE + 11; // SI4432 output can be adjusted over 21dBm but max to SAW filter is 10dBm + root["tgCal"] = trackGenSetting.Calibration; + root["tgRange"] = ATTENUATOR_RANGE + 21; // no SAW filter so 20dBm output is possible. if ( AGC_On ) root["PreAmp"] = 0x60; // Auto @@ -662,10 +687,21 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["spur"] = setting.Spur; jsonDocument["tg"] = trackGenSetting.Mode; jsonDocument["tgPower"] = trackGenSetting.Power; - + jsonDocument["tgFreq"] = trackGenSetting.Frequency; + jsonDocument["tgMod"] = trackGenSetting.ModulationType; + jsonDocument["tgModFreq"] = trackGenSetting.ModFrequency; + jsonDocument["sg"] = sigGenOutputOn; // + jsonDocument["sgPower"] = sigGenSetting.Power; + jsonDocument["sgMod"] = sigGenSetting.ModulationType; + jsonDocument["sgModFreq"] = sigGenSetting.ModFrequency; + jsonDocument["sgFreq"] = sigGenSetting.Frequency; + jsonDocument["sgCal"] = sigGenSetting.Calibration; + jsonDocument["sgRange"] = ATTENUATOR_RANGE + 11; // SI4432 output can be adjusted over 21dBm but max to SAW filter is 10dBm + jsonDocument["tgCal"] = trackGenSetting.Calibration; + jsonDocument["tgRange"] = ATTENUATOR_RANGE + 21; // no SAW filter so 20dBm output is possible. + if ( AGC_On ) jsonDocument["PreAmp"] = 0x60; // Auto - else jsonDocument["PreAmp"] = setting.PreampGain; // Fixed gain @@ -676,7 +712,6 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to serializeJson ( jsonDocument, wsBuffer ); webSocket.broadcastTXT ( wsBuffer ); // Send to all connected websocket clients } - else Serial.println ( "No buffer :("); @@ -710,10 +745,19 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["spur"] = setting.Spur; jsonDocument["tg"] = trackGenSetting.Mode; jsonDocument["tgPower"] = trackGenSetting.Power; - + jsonDocument["tgFreq"] = trackGenSetting.Frequency; + jsonDocument["sg"] = sigGenOutputOn; // + jsonDocument["sgPower"] = sigGenSetting.Power; + jsonDocument["sgMod"] = sigGenSetting.ModulationType; + jsonDocument["sgModFreq"] = sigGenSetting.ModFrequency; + jsonDocument["sgFreq"] = sigGenSetting.Frequency; + jsonDocument["sgCal"] = sigGenSetting.Calibration; + jsonDocument["sgRange"] = ATTENUATOR_RANGE + 11; // SI4432 output can be adjusted over 21dBm but max to SAW filter is 10dBm + jsonDocument["tgCal"] = trackGenSetting.Calibration; + jsonDocument["tgRange"] = ATTENUATOR_RANGE + 21; // no SAW filter so 20dBm output is possible. + if ( AGC_On ) jsonDocument["PreAmp"] = 0x60; // Auto - else jsonDocument["PreAmp"] = setting.PreampGain; // Fixed gain @@ -724,7 +768,6 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to serializeJson ( jsonDocument, wsBuffer ); webSocket.broadcastTXT ( wsBuffer ); // Send to all connected websocket clients } - else Serial.println ( "No buffer :("); @@ -758,10 +801,19 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["spur"] = setting.Spur; jsonDocument["tg"] = trackGenSetting.Mode; jsonDocument["tgPower"] = trackGenSetting.Power; - + jsonDocument["tgFreq"] = trackGenSetting.Frequency; + jsonDocument["sg"] = sigGenOutputOn; // + jsonDocument["sgPower"] = sigGenSetting.Power; + jsonDocument["sgMod"] = sigGenSetting.ModulationType; + jsonDocument["sgModFreq"] = sigGenSetting.ModFrequency; + jsonDocument["sgFreq"] = sigGenSetting.Frequency; + jsonDocument["sgCal"] = sigGenSetting.Calibration; + jsonDocument["sgRange"] = ATTENUATOR_RANGE + 11; // SI4432 output can be adjusted over 21dBm but max to SAW filter is 10dBm + jsonDocument["tgCal"] = trackGenSetting.Calibration; + jsonDocument["tgRange"] = ATTENUATOR_RANGE + 21; // no SAW filter so 20dBm output is possible. + if ( AGC_On ) jsonDocument["PreAmp"] = 0x60; // Auto - else jsonDocument["PreAmp"] = setting.PreampGain; // Fixed gain @@ -772,7 +824,6 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to serializeJson ( jsonDocument, wsBuffer ); webSocket.broadcastTXT ( wsBuffer ); // Send to all connected websocket clients } - else Serial.println ( "No buffer :("); @@ -806,10 +857,19 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["spur"] = setting.Spur; jsonDocument["tg"] = trackGenSetting.Mode; jsonDocument["tgPower"] = trackGenSetting.Power; - + jsonDocument["tgFreq"] = trackGenSetting.Frequency; + jsonDocument["sg"] = sigGenOutputOn; // + jsonDocument["sgPower"] = sigGenSetting.Power; + jsonDocument["sgMod"] = sigGenSetting.ModulationType; + jsonDocument["sgModFreq"] = sigGenSetting.ModFrequency; + jsonDocument["sgFreq"] = sigGenSetting.Frequency; + jsonDocument["sgCal"] = sigGenSetting.Calibration; + jsonDocument["sgRange"] = ATTENUATOR_RANGE + 11; // SI4432 output can be adjusted over 21dBm but max to SAW filter is 10dBm + jsonDocument["tgCal"] = trackGenSetting.Calibration; + jsonDocument["tgRange"] = ATTENUATOR_RANGE + 21; // no SAW filter so 20dBm output is possible. + if ( AGC_On ) jsonDocument["PreAmp"] = 0x60; // Auto - else jsonDocument["PreAmp"] = setting.PreampGain; // Fixed gain @@ -820,13 +880,74 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to serializeJson ( jsonDocument, wsBuffer ); webSocket.broadcastTXT ( wsBuffer ); // Send to all connected websocket clients } - else Serial.println ( "No buffer :("); // Serial.printf ( "Push Settings sweepPoints %u\n", sweepPoints ); } + + +/* + * Push the settings data to the websocket clients + */ +void pushSigGenSettings () +{ +size_t capacity = JSON_ARRAY_SIZE ( SCREEN_WIDTH ) + + SCREEN_WIDTH*JSON_OBJECT_SIZE ( 2 ) + JSON_OBJECT_SIZE ( 17 ); +static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to be pushed to the web clients + + jsonDocument["mType"] = "Settings"; + jsonDocument["mode"] = setting.Mode; + jsonDocument["dispPoints"] = displayPoints; + jsonDocument["start"] = startFreq_IF / 1000.0; + jsonDocument["stop"] = stopFreq_IF / 1000.0; + jsonDocument["IF"] = setting.IF_Freq / 1000000.0; + jsonDocument["attenuation"] = setting.Attenuate; + jsonDocument["extGain"] = setting.ExternalGain; + jsonDocument["levelOffset"] = setting.LevelOffset; + jsonDocument["setRBW"] = setting.Bandwidth10; + jsonDocument["bandwidth"] = bandwidth; + jsonDocument["RefOut"] = setting.ReferenceOut; + jsonDocument["Drive"] = setting.Drive; + jsonDocument["sweepPoints"] = sweepPoints; + jsonDocument["spur"] = setting.Spur; + jsonDocument["tg"] = trackGenSetting.Mode; + jsonDocument["tgPower"] = trackGenSetting.Power; + jsonDocument["tgMod"] = trackGenSetting.ModulationType; + jsonDocument["tgModFreq"] = trackGenSetting.ModFrequency; + jsonDocument["tgFreq"] = trackGenSetting.Frequency; + jsonDocument["sg"] = sigGenOutputOn; // + jsonDocument["sgPower"] = sigGenSetting.Power; + jsonDocument["sgMod"] = sigGenSetting.ModulationType; + jsonDocument["sgModFreq"] = sigGenSetting.ModFrequency; + jsonDocument["sgFreq"] = sigGenSetting.Frequency; + jsonDocument["sgCal"] = sigGenSetting.Calibration; + jsonDocument["sgRange"] = (ATTENUATOR_RANGE + RX_SI4432_MAX_DRIVE * 3); // SI4432 output can be adjusted over 21dBm but max to SAW filter is 10dBm + jsonDocument["tgCal"] = trackGenSetting.Calibration; + jsonDocument["tgRange"] = ATTENUATOR_RANGE + 21; // no SAW filter so full 20dBm output is possible. + + if ( AGC_On ) + jsonDocument["PreAmp"] = 0x60; // Auto + else + jsonDocument["PreAmp"] = setting.PreampGain; // Fixed gain + + String wsBuffer; + + if ( wsBuffer ) + { + serializeJson ( jsonDocument, wsBuffer ); + webSocket.broadcastTXT ( wsBuffer ); // Send to all connected websocket clients + } + else + Serial.println ( "No buffer :("); + +// Serial.printf ( "Push Settings sweepPoints %u\n", sweepPoints ); +} + + + + /* * Prepare a response ready for push to web clients */ diff --git a/simpleSA_wifi.h b/simpleSA_wifi.h index a0acc22..114fd25 100644 --- a/simpleSA_wifi.h +++ b/simpleSA_wifi.h @@ -51,6 +51,7 @@ void pushIFSweepSettings (); void pushRXSweepSettings (); void pushBandscopeSettings (); + void pushSigGenSettings (); void initChunkSweepDoc (uint32_t startIndex); /*