Web Sig Gen again

Bug remains in attenuation calc
Formatting of buttons on web page to do
Add track Gen to signal generator web page if present (need to send a config state in settings)
Add track gen level control
This commit is contained in:
M0WID 2020-10-04 22:36:46 +01:00
parent ed4563c0c9
commit 96a27b6005
7 changed files with 404 additions and 136 deletions

View File

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

23
cmd.cpp
View File

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

View File

@ -60,30 +60,32 @@
<div class="sigTitle">Signal Generator</div>
<br />
<div class="sigFreq">
<label for="setSigFreq8" class="sigFreqLabel">Frequency:</label>
<input class="sigFreqInput" id="setSigFreq8" name="setSigFreq8" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigFreq7" name="setSigFreq7" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigFreq6" name="setSigFreq6" type="number" min=-1 max=10 value=0>
<label for="setSigGenFreq8" class="sigFreqLabel">Frequency:</label>
<input class="sigFreqInput" id="setSigGenFreq8" name="setSigGenFreq8" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq7" name="setSigGenFreq7" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq6" name="setSigGenFreq6" type="number" min=-1 max=10 value=0>
<span class="sigFreqText">,</span>
<input class="sigFreqInput" id="setSigFreq5" name="setSigFreq5" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigFreq4" name="setSigFreq4" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigFreq3" name="setSigFreq3" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq5" name="setSigGenFreq5" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq4" name="setSigGenFreq4" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq3" name="setSigGenFreq3" type="number" min=-1 max=10 value=0>
<span class="sigFreqText">,</span>
<input class="sigFreqInput" id="setSigFreq2" name="setSigFreq2" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigFreq1" name="setSigFreq1" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigFreq0" name="setSigFreq0" type="number" min=0 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq2" name="setSigGenFreq2" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq1" name="setSigGenFreq1" type="number" min=-1 max=10 value=0>
<input class="sigFreqInput" id="setSigGenFreq0" name="setSigGenFreq0" type="number" min=0 max=10 value=0>
<span class="sigFreqText">Hz</span>
<button class = "set-button" id="incButton">+</button>
<button class = "set-button" id="decButton">-</button>
<button class = "set-button" id="incButton">+</button> &nbsp;
<button class = "set-button" id="decButton">-</button> &nbsp;
<button class = "set-button" id="sigOnButton">On/Off</button>
</div>
<br /><br />
<label for="setSigLevel" class = "sigLevelLabel">Level:</label>
<input class="sigLevelInput" id="setSigLevel" name="setSigLevel" type="number" min="-70" max="20" value="0">
<label for="setSigGenPower" class = "sigLevelLabel">Level:</label>
<input class="sigLevelInput" id="setSigGenPower" name="setSigGenPower" type="number" min=-70 max=20 value=0>
dBm
<br /><br />
<div class="slidecontainer">
<input type="range" min="-70" max="20" value="10" class="slider" id="sigLevelSlider">
<input type="range" min=-70 max=20 value=0 class="slider" id="sigLevelSlider">
</div>
</div>
@ -163,10 +165,10 @@
<br />
<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>
<input class="value-input" name='setAtten' type="number" step="1" id ="setAtten" maxlength=3 min=0 max=31 required>
dB
<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>
<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>
@ -188,18 +190,29 @@
<br />
<div id="spur">
<div class="setting" >
<label class="setting-label">Spur Reduce:</label>
<label class="setting-widelabel">Spur Reduce:</label>
<input class="checkbox-input" type="checkbox" id="spurReduction" size="1" value="0" />
</div>
</div>
<div id="tracking">
<div class="setting" >
<label class="setting-label">TrackGen:</label>
<input class="checkbox-input" type="checkbox" id="trackGen" size="1" value="0" />
<label class="setting-label">Level:</label>
<select class="select-input" id="trackGen" name="trackGen">
<option class="select-option" value=0>Off</option>
<option class="select-option" value=1>Track</option>
<option class="select-option" value=2>Generate</option>
</select>
<br />
<label class="setting-label">Level:</label>
<input class="value-input" type="number" id="setTrackGenPower" placeholder="setTrackGenPower" maxlength = "6" min="-60" max="20" value="0" />
dBm
dBm
</div>
<div class="setting" >
<label for="setTGFreq" class="setting-label">TG Freq:</label>
<input class="value-input" name='setTGFreq' type="number" id="setTGFreq" maxlength="9" min=0 max=350 required>
MHz
</div>
</div>
<br />
<div id="signal_info">
@ -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);
}
}

View File

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

View File

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

View File

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

View File

@ -51,6 +51,7 @@
void pushIFSweepSettings ();
void pushRXSweepSettings ();
void pushBandscopeSettings ();
void pushSigGenSettings ();
void initChunkSweepDoc (uint32_t startIndex);
/*