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