From c467ac55f17217a3a15f7825286e4441a7bb1d1c Mon Sep 17 00:00:00 2001 From: M0WID Date: Fri, 4 Sep 2020 23:54:52 +0100 Subject: [PATCH] Various fixes Set actual power bug fixed, storage added to web page. External gain part done - needs menu mods. Some prep for RBW adjusts --- Bandscope.ino | 5 ++ IFsweep.ino | 5 ++ RXsweep.ino | 5 ++ SweepLo.ino | 22 +++--- cmd.cpp | 22 +++--- cmd.h | 2 +- data/index.html | 176 +++++++++++++++++++++++++++++++++++++++++++--- data/index2.html | 27 ++++++- simpleSA.h | 2 +- simpleSA.ino | 9 +-- simpleSA_wifi.cpp | 4 ++ simpleSA_wifi.h | 21 +++--- 12 files changed, 254 insertions(+), 46 deletions(-) diff --git a/Bandscope.ino b/Bandscope.ino index 7a23125..7521f93 100644 --- a/Bandscope.ino +++ b/Bandscope.ino @@ -184,6 +184,11 @@ static uint16_t chunkIndex; old_settingAttenuate = setting.Attenuate; } + // pre-calculate adjustment for RSSI values + dBadjust = (double)setting.Attenuate - 120.0 + setting.LevelOffset - setting.ExternalGain; + Serial.printf("Bandscope dBadjust = %f; leveloffset = %f; attenuate = %i, ext gain = %f\n", + dBadjust, setting.LevelOffset, setting.Attenuate, setting.ExternalGain); + resetAverage = changedSetting; maxGrid = setting.BandscopeMaxGrid; diff --git a/IFsweep.ino b/IFsweep.ino index 263d51c..6a84b20 100644 --- a/IFsweep.ino +++ b/IFsweep.ino @@ -93,6 +93,11 @@ static uint16_t chunkIndex; att.SetAtten ( 0 ); // Set the internal attenuator + // pre-calculate adjustment for RSSI values + dBadjust = 120.0 + setting.LevelOffset - setting.ExternalGain; + Serial.printf("IFSweep dBadjust = %f; leveloffset = %f; attenuate = %i, ext gain = %f\n", + dBadjust, setting.LevelOffset, setting.Attenuate, setting.ExternalGain); + xmit.SetPowerReference ( setting.ReferenceOut ); // Set the GPIO reference output maxGrid = setting.MaxGrid; diff --git a/RXsweep.ino b/RXsweep.ino index 7fbd054..0853cce 100644 --- a/RXsweep.ino +++ b/RXsweep.ino @@ -99,6 +99,11 @@ static uint16_t chunkIndex; att.SetAtten ( 0 ); // Set the internal attenuator + // pre-calculate adjustment for RSSI values + dBadjust = 120.0 + setting.LevelOffset - setting.ExternalGain; + Serial.printf("RXSweep dBadjust = %f; leveloffset = %f; attenuate = %i, ext gain = %f\n", + dBadjust, setting.LevelOffset, setting.Attenuate, setting.ExternalGain); + xmit.SetPowerReference ( setting.ReferenceOut ); // Set the GPIO reference output maxGrid = setting.MaxGrid; diff --git a/SweepLo.ino b/SweepLo.ino index 7d6fe7b..ef9c9d9 100644 --- a/SweepLo.ino +++ b/SweepLo.ino @@ -91,7 +91,7 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos { if ( initSweep || changedSetting ) // Something has changed, or a first start, so need to owrk out some basic things { - //Serial.println("InitSweep or changedSetting"); + Serial.println("InitSweep or changedSetting"); autoSweepFreqStep = ( setting.ScanStop - setting.ScanStart ) / displayPoints; vbw = autoSweepFreqStep / 1000.0; // Set the video resolution @@ -137,6 +137,11 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos old_settingAttenuate = setting.Attenuate; } + // pre-calculate adjustment for RSSI values + dBadjust = (double)setting.Attenuate - 120.0 + setting.LevelOffset - setting.ExternalGain; + Serial.printf("SweepLo dBadjust = %f; leveloffset = %f; attenuate = %i, ext gain = %f\n", + dBadjust, setting.LevelOffset, setting.Attenuate, setting.ExternalGain); + resetAverage = changedSetting; xmit.SetPowerReference ( setting.ReferenceOut ); // Set the GPIO reference output if wanted @@ -258,14 +263,6 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos startFreq = setting.ScanStart + tempIF; // Start freq for the LO stopFreq = setting.ScanStop + tempIF; // Stop freq for the LO - if ( setActualPowerRequested ) - { - SetPowerLevel ( actualPower ); - setActualPowerRequested = false; - -// Serial.printf ( "Setting actual Power %f \n", actualPower ); - } - pointMinGain = 100; // Reset min/max values pointMaxRSSI = 0; @@ -301,6 +298,13 @@ static uint32_t offsetIF; // IF frequency offset by half the bandwidth to pos initSweep = false; changedSetting = false; + if ( setActualPowerRequested ) + { + SetPowerLevel ( actualPower ); + setActualPowerRequested = false; +// Serial.printf ( "Setting actual Power %f \n", actualPower ); + } + lastSweepStartMicros = sweepStartMicros; // Set last time we got here sweepStartMicros = micros(); // Current time sweepMicros = sweepStartMicros - lastSweepStartMicros; // Calculate sweep time (no rollover handling) diff --git a/cmd.cpp b/cmd.cpp index 39d6632..291f414 100644 --- a/cmd.cpp +++ b/cmd.cpp @@ -1446,9 +1446,9 @@ uint8_t reg69; // Ditto case MSG_ACT_PWR: // Calibrate the indicated power level if ( dataLen != 0 ) // Value specified? { - tempValue = atoi ( dataBuff ); // Yes, get new power reading + tempValue = atof ( dataBuff ); // Yes, get new power reading RequestSetPowerLevel ( tempValue ); - Serial.printf ( "Indicated power set to: %d\n", tempValue ); + Serial.printf ( "Indicated power set to: %f\n", tempValue ); return true; } @@ -2229,7 +2229,10 @@ int oldAtten = setting.Attenuate; */ void SetExtGain ( double a ) { - setting.ExternalGain = a; + setting.ExternalGain = a; + changedSetting = true; + WriteSettings (); + pushSettings(); } double GetExtGain (void ) @@ -2294,16 +2297,16 @@ void RequestSetPowerLevel ( float o ) * "SetPowerLevel" */ -void SetPowerLevel ( int o ) +void SetPowerLevel ( double o ) { -int oldOffset = setting.LevelOffset; +double oldOffset = setting.LevelOffset; - if ( o != 100 ) - setting.LevelOffset = (int) ( o - (( oldPeakLevel / 2.0 + setting.Attenuate ) - 120.0 )); // WA2FZW + if ( o != 100.0 ) + setting.LevelOffset = ( o - ( (double)oldPeakLevel / 2.0 + setting.Attenuate - setting.ExternalGain - 120.0) ); // WA2FZW else - setting.LevelOffset = 0; + setting.LevelOffset = 0.0; -// Serial.printf ( "Peak level: %i, Actual: %i, Level offset: %i \n", +// Serial.printf ( "Peak level: %i, Actual: %f, Level offset: %f \n", // oldPeakLevel, o, setting.LevelOffset ); if ( oldOffset != setting.LevelOffset ) @@ -2312,6 +2315,7 @@ int oldOffset = setting.LevelOffset; RedrawHisto (); // Redraw labels and restart sweep with new settings WriteSettings (); pushSettings(); +// Serial.println("Power level changed"); } } diff --git a/cmd.h b/cmd.h index 5b47225..b09f970 100644 --- a/cmd.h +++ b/cmd.h @@ -159,7 +159,7 @@ void SetClearStorage ( void ); // Logically erases the saved scan void SetSubtractStorage(void); // Sets the "setting.SubtractStorage" flag void RequestSetPowerLevel ( float o ); // Power level calibration -void SetPowerLevel ( int o ); // ??? +void SetPowerLevel ( double o ); // ??? void SetRBW ( int v ); // Sets the resolution bandwidth diff --git a/data/index.html b/data/index.html index 908d9d3..72a02e2 100644 --- a/data/index.html +++ b/data/index.html @@ -114,6 +114,8 @@
+ + dB
@@ -135,15 +137,14 @@
- - + +
-
- - + + dBm
@@ -158,7 +159,15 @@ ms
- +
+
+ + + + + +
+
@@ -268,6 +277,7 @@ var setStop = document.getElementById('setStop'); var setCenter = document.getElementById('setCenter'); var setSpan = document.getElementById('setSpan'); var setAtten = document.getElementById('setAtten'); +var setExtern = document.getElementById('setExtern'); var setActPower = document.getElementById('setActPower'); var levelOffset = document.getElementById('levelOffset'); var setRefOut = document.getElementById('setRefOut'); @@ -282,7 +292,10 @@ var setPreAmp = document.getElementById('setPreAmp'); var setAverage = document.getElementById('Average'); var setTrackGen = document.getElementById('trackGen'); var setTrackGenPower = document.getElementById('setTrackGenPower'); - +var store1 = document.getElementById('store1'); +var store2 = document.getElementById('store2'); +var store3 = document.getElementById('store3'); +var store4 = document.getElementById('store4'); //var messageWindow = document.getElementById('message'); var tempCenter; @@ -295,6 +308,7 @@ var oldSetRefOut = -2; var oldSetRBW = -10; var oldLevelOffset = 1000; var oldAttenuation = 1000; +var oldExternalGain = 1000; var oldDrive = -1; var oldIF = 0; var oldPreAmp = 0; @@ -340,11 +354,60 @@ var gainSamples = [ {x:100, y:40}, ]; // dummy for test +var store1Samples = [ + {x:0, y:42}, + {x:10, y:43}, + {x:20, y:44}, + {x:30, y:45}, + {x:40, y:46}, + {x:50, y:47}, + {x:80, y:48}, + {x:90, y:49}, + {x:100, y:40}, + ]; + +var store2Samples = [ + {x:0, y:42}, + {x:10, y:43}, + {x:20, y:44}, + {x:30, y:45}, + {x:40, y:46}, + {x:50, y:47}, + {x:80, y:48}, + {x:90, y:49}, + {x:100, y:40}, + ]; + + var store3Samples = [ + {x:0, y:42}, + {x:10, y:43}, + {x:20, y:44}, + {x:30, y:45}, + {x:40, y:46}, + {x:50, y:47}, + {x:80, y:48}, + {x:90, y:49}, + {x:100, y:40}, + ]; + + var store4Samples = [ + {x:0, y:42}, + {x:10, y:43}, + {x:20, y:44}, + {x:30, y:45}, + {x:40, y:46}, + {x:50, y:47}, + {x:80, y:48}, + {x:90, y:49}, + {x:100, y:40}, + ]; + var chartSA = new CanvasJS.Chart("chartSA", { animationEnabled: false, zoomEnabled: true, + zoomType: "xy", //height:800, title: { text: "ESP32 TinySA", @@ -425,6 +488,34 @@ var chartSA = new CanvasJS.Chart("chartSA", dataPoints : dBSamples, showInLegend : true, visible : false + }, + { + type: "line", + name: "store1", + dataPoints : store1Samples, + showInLegend : true, + visible : false + }, + { + type: "line", + name: "store2", + dataPoints : store2Samples, + showInLegend : true, + visible : false + }, + { + type: "line", + name: "store3", + dataPoints : store3Samples, + showInLegend : true, + visible : false + }, + { + type: "line", + name: "store4", + dataPoints : store4Samples, + showInLegend : true, + visible : false } ] }); @@ -473,6 +564,10 @@ setAtten.addEventListener('change', (event) => { sendValue("A", setAtten.value); }); +setExtern.addEventListener('change', (event) => { + sendValue("E", setExtern.value); +}); + setRBW.addEventListener('change', (event) => { sendValue("R", setRBW.value); }); @@ -502,6 +597,62 @@ setTrackGen.addEventListener('change', (event) => { }); +store1.addEventListener('change', (event) => { + if (store1.checked) { + var b = parseFloat(levelOffset.value) + parseFloat(setAtten.value) - 120 - parseFloat(setExtern.value); + chartSA.options.data[5].dataPoints = chartSA.options.data[1].dataPoints.map(obj => { + let rObj = {} + rObj.x = obj.x + rObj.y = obj.y/2+b + return rObj + }) + } else { + chartSA.options.data[5].dataPoints.length = 2; // reset + } +}); + +store2.addEventListener('change', (event) => { + if (store2.checked) { + var b = parseInt(levelOffset.value) + parseInt(setAtten.value) - 120 - parseFloat(setExtern.value); + chartSA.options.data[6].dataPoints = chartSA.options.data[1].dataPoints.map(obj => { + let rObj = {} + rObj.x = obj.x + rObj.y = obj.y/2+b + return rObj + }) + } else { + chartSA.options.data[6].dataPoints.length = 2; // reset + } +}); + +store3.addEventListener('change', (event) => { + if (store3.checked) { + var b = parseInt(levelOffset.value) + parseInt(setAtten.value) - 120 - parseFloat(setExtern.value); + chartSA.options.data[7].dataPoints = chartSA.options.data[1].dataPoints.map(obj => { + let rObj = {} + rObj.x = obj.x + rObj.y = obj.y/2+b + return rObj + }) + } else { + chartSA.options.data[7].dataPoints.length = 2; // reset + } +}); + +store4.addEventListener('change', (event) => { + if (store4.checked) { + var b = parseInt(levelOffset.value) + parseInt(setAtten.value) - 120 - parseFloat(setExtern.value); + chartSA.options.data[8].dataPoints = chartSA.options.data[1].dataPoints.map(obj => { + let rObj = {} + rObj.x = obj.x + rObj.y = obj.y/2+b + return rObj + }) + } else { + chartSA.options.data[8].dataPoints.length = 2; // reset + } +}); + //var roundtripTime = document.getElementById('roundtripTime'); //var messageCount = document.getElementById('messageCount'); //var missedReplies = document.getElementById('missedReplies'); @@ -583,6 +734,11 @@ function handleSettings (settings) oldAttenuation = settings.attenuation; } + if (settings.extGain != oldExternalGain) { + setExtern.value = settings.extGain; + oldExternalGain = settings.extGain; + } + if (settings.setRBW != oldSetRBW) { setRBW.value = settings.setRBW; oldSetRBW = settings.setRBW; @@ -639,7 +795,7 @@ function handleSettings (settings) } -function handleData (data) +function handleData (data) // rarely used! see handleChunkData for most sweeps { if (data.sweepPoints != sweepPoints.value) { @@ -651,7 +807,7 @@ function handleData (data) } - var b = parseInt(levelOffset.value) + parseInt(setAtten.value) - 120; + var b = parseFloat(levelOffset.value) + parseFloat(setAtten.value) - 120 - parseFloat(setExtern.value); //chartSA.options.data[0].dataPoints = data.Points; // First series dB chartSA.options.data[0].dataPoints = data.Points.map(obj => { let rObj = {} @@ -732,7 +888,7 @@ function handleChunkData (data) var dataStart = data.StartIndex; - var b = parseInt(levelOffset.value) + parseInt(setAtten.value) - 120; + var b = parseInt(levelOffset.value) + parseInt(setAtten.value) - 120 - parseFloat(setExtern.value); var a = 1/setAverage.value; diff --git a/data/index2.html b/data/index2.html index a98d212..f32f7b0 100644 --- a/data/index2.html +++ b/data/index2.html @@ -406,6 +406,7 @@ var chartSA = new CanvasJS.Chart("chartSA", { animationEnabled: false, zoomEnabled: true, + zoomType: "xy", //height:800, title: { text: "ESP32 TinySA", @@ -413,13 +414,34 @@ var chartSA = new CanvasJS.Chart("chartSA", }, axisX: { title: "Frequency (MHz)", - titleFontSize: 24 + titleFontSize: 24, + crosshair: { + enabled:true + }, + stripLines:[ + { + startValue:434.12, + thickness:1, + color:"#d8d8d8", + } + ] }, axisY: { title: "dB", titleFontSize: 24, - minimum: -120 + minimum: -120, + crosshair: { + enabled:true + }, + stripLines:[ + { + startValue:-33, + endValue:-30, + color:"#d8d8d8", + } + ] + }, axisY2: [ { @@ -822,6 +844,7 @@ function handleData (data) chartSA.options.axisX.minimum = setStart.value; chartSA.options.axisX.maximum = setStop.value; + chartSA.options.axisX.stripLines[0].value = setIF.value; // chartSA.options.axisY.minimum = -120; // chartSA.options.axisY.maximum = 0; chartSA.options.axisY2.minimum = 0; diff --git a/simpleSA.h b/simpleSA.h index f433b54..675a4e5 100644 --- a/simpleSA.h +++ b/simpleSA.h @@ -234,7 +234,7 @@ typedef struct { double ExternalGain = 0.0; // External gain or attenuation int8_t Generate = 0; // Signal generator mode if not zero (***) int16_t Bandwidth10 = 0; // Resolution Bandwidth setting*10; 0 = auto - int16_t LevelOffset = 0; // Calibration value (move to config?) + double LevelOffset = 0; // Calibration value (move to config?) int8_t ReferenceOut = 1; // Transmitter GPIO2 set to 15MHz int16_t PowerGrid = 10; // dB/vertical divison on the grid bool Spur = 0; // Spur reduction on or off diff --git a/simpleSA.ino b/simpleSA.ino index fdafcc8..228c229 100644 --- a/simpleSA.ino +++ b/simpleSA.ino @@ -391,6 +391,7 @@ uint32_t sweepPoints; // Number of points in the sweep. Can be more than DIS uint32_t startFreq = 0; // Default start frequency is 0MHz uint32_t stopFreq = 100000000; // Default stop frequency is 100MHz uint32_t tempIF; // IF used for this sweep. Changes if Spur reduction is on +double dBadjust; // Sum of attenuation, external gain, calibration offset and RBW correction /* * Variables for offset frequency tuning @@ -1746,7 +1747,7 @@ uint16_t rssiToImgY ( uint8_t rSSI ) double rssiTodBm ( uint8_t rSSI ) { - return (( rSSI / 2.0 + setting.Attenuate ) - 120.0 ) + setting.LevelOffset; + return ( rSSI / 2.0 + dBadjust ); } @@ -1756,7 +1757,7 @@ double rssiTodBm ( uint8_t rSSI ) uint8_t dBmToRSSI ( double dBm ) { - return ( 2 * ( dBm - setting.Attenuate + 120.0 - setting.LevelOffset ) ); + return ( 2 * ( dBm - dBadjust ) ); } @@ -1775,7 +1776,7 @@ void DisplayPoint ( uint8_t* data, int i, int color ) int lastPoint = i - 1; int delta = maxGrid - minGrid; - double f0 = (( data[i] / 2.0 + setting.Attenuate ) - 120.0 ) + setting.LevelOffset; // Current point + double f0 = data[i] / 2.0 + dBadjust; // Current point f0 = ( f0 - minGrid ) * gridHeight / delta; if ( f0 >= gridHeight ) @@ -1784,7 +1785,7 @@ void DisplayPoint ( uint8_t* data, int i, int color ) if ( f0 < 0 ) f0 = 0; - double f1 = (( data[lastPoint] / 2.0 + setting.Attenuate ) - 120.0) + setting.LevelOffset; // Previous point + double f1 = data[lastPoint] / 2.0 + dBadjust; // Previous point f1 = ( f1 - minGrid ) * gridHeight / delta; diff --git a/simpleSA_wifi.cpp b/simpleSA_wifi.cpp index 0a3be28..812d9ae 100644 --- a/simpleSA_wifi.cpp +++ b/simpleSA_wifi.cpp @@ -468,6 +468,7 @@ void onGetSweep ( AsyncWebServerRequest *request ) root["stop"] = setting.ScanStop / 1000.0; root["IF"] = setting.IF_Freq / 1000000.0; root["attenuation"] = setting.Attenuate; + root["extGain"] = setting.ExternalGain; root["levelOffset"] = setting.LevelOffset; root["setRBW"] = setting.Bandwidth10; root["bandwidth"] = bandwidth; @@ -601,6 +602,7 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["stop"] = stopFreq_IF / 1000.0; jsonDocument["IF"] = sigFreq_IF / 1000000.0; jsonDocument["attenuation"] = setting.Attenuate; + jsonDocument["extGain"] = setting.ExternalGain; jsonDocument["levelOffset"] = setting.LevelOffset; jsonDocument["setRBW"] = setting.Bandwidth10; jsonDocument["bandwidth"] = bandwidth; @@ -645,6 +647,7 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["stop"] = stopFreq_RX / 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; @@ -689,6 +692,7 @@ static DynamicJsonDocument jsonDocument ( capacity ); // buffer for json data to jsonDocument["stop"] = ( setting.BandscopeStart + setting.BandscopeSpan ) / 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; diff --git a/simpleSA_wifi.h b/simpleSA_wifi.h index ea6f972..bf2265a 100644 --- a/simpleSA_wifi.h +++ b/simpleSA_wifi.h @@ -16,6 +16,7 @@ #include "ESPAsyncWebServer.h" // ESP32 Webserver library #include "SPIFFS.h" // ESP32 File system #include // Display library +#include "cmd.h" #include #include // Install using Library Manager or go to arduinojson.org @@ -53,17 +54,17 @@ */ int GetPointsAsXML ( void textHandler (char *s) ); - void set_sweep_frequency ( int type, int32_t frequency ); - void SetRBW ( int ); - void SetAttenuation ( int a ); - void RequestSetPowerLevel ( float o ); - void SetPowerLevel ( int o ); - void SetPowerReference (int freq ); - void SetLoDrive ( uint8_t level ); - bool SetIFFrequency ( int32_t f ); - void SetPreAmpGain ( int g ); +// void set_sweep_frequency ( int type, int32_t frequency ); +// void SetRBW ( int ); +// void SetAttenuation ( int a ); +// void RequestSetPowerLevel ( float o ); +// void SetPowerLevel ( double o ); +// void SetPowerReference (int freq ); +// void SetLoDrive ( uint8_t level ); +// bool SetIFFrequency ( int32_t f ); +// void SetPreAmpGain ( int g ); void WriteSettings (); - void SetSpur ( int v ); +// void SetSpur ( int v ); /* * variables and objects outside of TinySA_wifi