Various fixes

Set actual power bug fixed, storage added to web page.  External gain part done - needs menu mods.  Some prep for RBW adjusts
This commit is contained in:
M0WID 2020-09-04 23:54:52 +01:00
parent 78becf0d64
commit c467ac55f1
12 changed files with 254 additions and 46 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)

22
cmd.cpp
View File

@ -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");
}
}

2
cmd.h
View File

@ -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

View File

@ -114,6 +114,8 @@
<div class="setting" >
<label for="setAtten" class="setting-label">Atten:</label>
<input class="value-input" name='setAtten' type="number" step="1" id ="setAtten" maxlength="3" min="0" max="31" required>
<label for="setExtern" class="setting-label">External:</label>
<input class="value-input" name='setExtern' type="number" step="1" id ="setExtern" maxlength="3" min="-60" max="60" required>
<!--<select class="select-input" id="setAtten" name="setAtten"></select> -->
dB
</div>
@ -135,15 +137,14 @@
<br />
<div id="spur">
<div class="setting" >
<label class="setting-label">Spur Reduction:</label>
<input class="value-input" type="checkbox" id="spurReduction" size="1" value="0" />
<label class="setting-label">Spur Reduce:</label>
<input class="checkbox-input" type="checkbox" id="spurReduction" size="1" value="0" />
</div>
</div>
<br />
<div id="tracking">
<div class="setting" >
<label class="setting-label">Tracking Generator:</label>
<input class="value-input" type="checkbox" id="trackGen" size="1" value="0" />
<label class="setting-label">TrackGen:</label>
<input class="checkbox-input" type="checkbox" id="trackGen" size="1" value="0" />
<input class="value-input" type="number" id="setTrackGenPower" placeholder="setTrackGenPower" maxlength = "9" min="-60" max="20" value="0" />
dBm
</div>
@ -158,7 +159,15 @@
ms
</div>
</div>
<div id="store">
<div class = "setting" >
<label class="setting-label">Store:</label>
<input class="checkbox-input" type="checkbox" id="store1" size="1" value="0" />
<input class="checkbox-input" type="checkbox" id="store2" size="1" value="0" />
<input class="checkbox-input" type="checkbox" id="store3" size="1" value="0" />
<input class="checkbox-input" type="checkbox" id="store4" size="1" value="0" />
</div>
</div>
<!-- form for device settings -->
@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -16,6 +16,7 @@
#include "ESPAsyncWebServer.h" // ESP32 Webserver library
#include "SPIFFS.h" // ESP32 File system
#include <TFT_eSPI.h> // Display library
#include "cmd.h"
#include <AsyncJson.h>
#include <ArduinoJson.h> // 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