Started on sig gen web page

This commit is contained in:
M0WID 2020-09-29 23:16:59 +01:00
parent 8928adfeed
commit acd6e2b6f4
5 changed files with 181 additions and 402 deletions

View File

@ -107,6 +107,11 @@ void initSigLow()
oldFreq = 0; // Force write of frequency on first loop
#ifdef USE_WIFI
if ( numberOfWebsocketClients > 0 )
pushSettings ();
#endif
}
@ -128,6 +133,7 @@ void doSigGenLow ()
showUpDownButtons = 1;
#endif
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
@ -155,6 +161,7 @@ void doSigGenLow ()
case 5:
case 6:
incrementFreq( pow(10, 8-b) );
changedSetting=true;
break;
case 7: // Decrement buttons
@ -165,6 +172,7 @@ void doSigGenLow ()
case 12:
case 13:
decrementFreq( pow(10, 15-b) );
changedSetting=true;
break;
case 14: // Return to SAlo mode
@ -231,6 +239,7 @@ void doSigGenLow ()
tft.setTextColor(TFT_WHITE, SIG_BACKGROUND_COLOR );
tft.print("OFF");
}
changedSetting = true;
}
break;
@ -250,6 +259,7 @@ void doSigGenLow ()
drawSlider ( SLIDER_X, SLIDER_Y, p, pwr, "dBm" );
att.SetAtten ( ( 100.0 - p ) / 100.0 * ATTENUATOR_RANGE ); // set attenuator to give required output
sigGenSetting.Power = pwr;
changedSetting = true;
}
@ -278,13 +288,20 @@ void doSigGenLow ()
if (sigGenOutputOn)
{
delayMicroseconds(300);
SetRX(3);
SetRX(3); // both LO and RX in tx mode
}
changedSetting = true;
}
oldFreq = sigGenSetting.Frequency;
oldIF = setting.IF_Freq;
oldSigGenOutputOn = sigGenOutputOn;
#ifdef USE_WIFI
if ( numberOfWebsocketClients > 0 )
pushSettings ();
#endif
}

View File

@ -32,7 +32,7 @@
<html>
<head>
<title>TinySA-ESP</title>
<title>simpleSA</title>
<link rel="stylesheet" type="text/css" href="styles.css">
<!-- get file below from http://canvasjs.com/ -->
<script type="text/javascript" src="canvasjs.min.js"></script>
@ -41,7 +41,7 @@
</head>
<body style="min-width:100vw">
<div class='norm'>
<div class='norm' id="top">
<button id="homeButton" onclick="window.location.href='index.html';">Home</button>
<!-- <button id="settingsButton" onclick="window.location.href='settings.html';">Settings</button>
@ -50,7 +50,28 @@
<button id="aboutButton" onclick="window.location.href='about.html';">About</button>
</div>
<div class ="Grid">
<div class = "Grid-cell" id="chartSA" ></div>
<div class = "Grid-cell" id="chartSA" >
<!-- container for chart -->
</div>
<div class = "Grid-cell" id="sigGen" style="display:none">
<!-- container for sig gen controls -->
<br />
<label for="setSigFreq" class="FreqLabel">Frequency:</label>
<input class="sigFreqInput" id="setSigFreq" name="setSigFreq" type="number" min="0" max="250000000">
Hz
<br />
<label for="setSigLevel" class = "SigLevel">Level:</label>
<input class="sigLevelInput" id="setSigLevel" name="setSigLevel" type="number" min="-70" max="20">
dBm
<div class="slidecontainer">
<input type="range" min="-70" max="20" value="10" class="slider" id="sigLevelSlider">
</div>
</div>
<br />
<div class = "Grid-cell-side" id="postSweepSettings" >
@ -62,7 +83,7 @@
<option class="sweep-option" value="2">Sig Gen</option>
<!-- <option class="sweep-option" value="3">Sig Gen High</option> -->
<option class="sweep-option" value="4">SAW Test</option>
<option class="sweep-option" value="5">Zero Span</option>
<!-- <option class="sweep-option" value="5">Zero Span</option> -->
<!-- <option class="sweep-option" value="6">Zero Span High</option> -->
<option class="sweep-option" value="7">Bandscope</option>
<option class="sweep-option" value="8">RBW Test</option>
@ -283,6 +304,10 @@
</div>
<script type="text/javascript">
var chartDiv = document.getElementById('chartSA');
var sigDiv = document.getElementById('sigGen');
var refreshInterval = document.getElementById('refreshInterval');
var refresh = document.getElementById('refresh');
@ -315,6 +340,10 @@ var store3 = document.getElementById('store3');
var store4 = document.getElementById('store4');
//var messageWindow = document.getElementById('message');
var sigLevelSlider = document.getElementById('sigLevelSlider');
var setSigLevel = document.getElementById('setSigLevel');
var setSigFreq = document.getElementById('setSigFreq');
var tempCenter;
// initialise these to silly values to force an update first time round
@ -427,7 +456,7 @@ var chartSA = new CanvasJS.Chart("chartSA",
zoomType: "xy",
//height:800,
title: {
text: "ESP32 TinySA",
text: "simpleSA",
fontSize: 28
},
axisX: {
@ -677,6 +706,21 @@ store4.addEventListener('change', (event) => {
}
});
setSigFreq.addEventListener('change', (event) => {
sendValue("F", setSigFreq.value);
});
setSigLevel.addEventListener('change', (event) => {
sendValue("L", setSigLevel.value);
});
// Update the current level value (each time you drag the slider handle)
sigLevelSlider.oninput = function() {
setSigLevel.innerHTML = this.value;
}
//var roundtripTime = document.getElementById('roundtripTime');
//var messageCount = document.getElementById('messageCount');
//var missedReplies = document.getElementById('missedReplies');
@ -709,7 +753,7 @@ function renderChart()
//missedReplies.value = missedMessageCounter;
hostName.value = "ws://" + location.host + ":81";
// connect to TinySA server
// connect to simpleSA server
connect(hostName.value);
// At this point the page is running
@ -732,6 +776,7 @@ function handleSettings (settings)
setStart.max = settings.IF;
setStop.max = 600;
setStart.min = 350;
setStart.disabled = false;
setStop.min = settings.IF;
setStop.disabled = false;
setCenter.disabled = true;
@ -741,11 +786,14 @@ function handleSettings (settings)
setSpur.disabled = true;
setTrackGen.disabled = true;
setTrackGenPower.disabled = true;
sigDiv.style.display = "none";
chartDiv.style.display = "block";
} else if (settings.mode == 4 ) { // IF Sweep (SAW test)
setStart.max = settings.IF;
setStop.max = 460;
setStart.min = 400;
setStop.min = settings.IF;
setStart.disabled = false;
setStop.disabled = false;
setCenter.disabled = true;
setSpan.disabled = true;
@ -754,11 +802,14 @@ function handleSettings (settings)
setSpur.disabled = true;
setTrackGen.disabled = true;
setTrackGenPower.disabled = true;
sigDiv.style.display = "none";
chartDiv.style.display = "block";
} else if (settings.mode == 7 ) { // BANDSCOPE
setStart.max = 350;
setStop.max = 350;
setStart.min = 0;
setStop.min = 0;
setStart.disabled = false;
setStop.disabled = true;
setCenter.disabled = true;
setSpan.disabled = false;
@ -767,11 +818,30 @@ function handleSettings (settings)
setSpur.disabled = true;
setTrackGen.disabled = true;
setTrackGenPower.disabled = true;
sigDiv.style.display = "none";
chartDiv.style.display = "block";
} else if (settings.mode == 2 ) { // Signal Generator
setStart.max = 350;
setStop.max = 350;
setStart.min = 0;
setStop.min = 0;
setStart.disabled = true;
setStop.disabled = true;
setCenter.disabled = true;
setSpan.disabled = true;
setRBW.disabled = true;
setRefOut.disabled = true;
setSpur.disabled = true;
setTrackGen.disabled = true;
setTrackGenPower.disabled = true;
sigDiv.style.display = "block";
chartDiv.style.display = "none";
} else {
setStart.max = 350;
setStop.max = 350;
setStart.min = 0;
setStop.min = 0;
setStart.disabled = false;
setStop.disabled = false;
setCenter.disabled = false;
setSpan.disabled = false;
@ -780,6 +850,8 @@ function handleSettings (settings)
setSpur.disabled = false;
setTrackGen.disabled = false;
setTrackGenPower.disabled = false;
sigDiv.style.display = "none";
chartDiv.style.display = "block";
}
@ -1304,6 +1376,11 @@ function sendValue(c, val)
// S Spur reduction Off/On
// t trackGen Off/On/Fixed
// T trackGen output level
// f trackgen signal generator frequency
// F Sig Gen frequency
// L Sig Gen level (dBm)
// G Sig Gen Off/On
// P Sig Gen set max output level (dBm)
//
//connection.send("# " + messageCounter + " " + sampleThreshold + " " + sampleSize);
connection.send("#" + c + " " + val);

View File

@ -32,7 +32,7 @@
<html>
<head>
<title>TinySA-ESP</title>
<title>simpleSA-ESP</title>
<link rel="stylesheet" type="text/css" href="styles.css">
<!-- get file below from http://canvasjs.com/ -->
<script type="text/javascript" src="canvasjs.min.js"></script>
@ -62,7 +62,7 @@
<option class="sweep-option" value="2">Sig Gen</option>
<!-- <option class="sweep-option" value="3">Sig Gen High</option> -->
<option class="sweep-option" value="4">SAW Test</option>
<option class="sweep-option" value="5">Zero Span</option>
<!-- <option class="sweep-option" value="5">Zero Span</option> -->
<!-- <option class="sweep-option" value="6">Zero Span High</option> -->
<option class="sweep-option" value="7">Bandscope</option>
<option class="sweep-option" value="8">RBW Test</option>
@ -70,132 +70,26 @@
<img src="refresh.png" id="refresh" name = "refresh" height = "18">
</div>
<div class="setting" >
<label for="setStart" class="setting-label">Start:</label>
<input class="value-input" name='setStart' type="number" id="setStart" maxlength="9" min="0" max="350" required>
MHz
</div>
<div class="setting" >
<label for="setStop" class="setting-label">Stop:</label>
<input class="value-input" name='setStop' type="number" id ="setStop" maxlength="9" min="0" max="350" required>
<label for="setFreq" class="setting-label">Frequency:</label>
<input class="value-input" name='setFreq' type="number" id="setFreq" maxlength="9" min="0" max="350" required>
MHz
</div>
<br />
<div class="setting" >
<label for="setCenter" class="setting-label">Centre:</label>
<input class="value-input" name='setCenter' type="number" id ="setCenter" maxlength="9" min="0" max="350" required>
MHz
</div>
<div class="setting" >
<label for="setSpan" class="setting-label">Span:</label>
<!--<select class="select-input" id="setSpan" name="setSpan">
<option class="select-option" value="250">250</option>
<option class="select-option" value="100">100</option>
<option class="select-option" value="50">50</option>
<option class="select-option" value="20">20</option>
<option class="select-option" value="10">10</option>
<option class="select-option" value="4">4</option>
<option class="select-option" value="2">2</option>
<option class="select-option" value="1">1</option>
<option class="select-option" value="0.5">0.5</option>
</select> -->
<input class="value-input" name='setSpan' type="number" id ="setSpan" maxlength="9" min="0" max="350" step="0.1" required>
MHz
<label for="setLevel" class="setting-label">Level:</label>
<input class="value-input" name='setLevel' type="number" step="1" id ="setLevel" maxlength="4" min="-31" max="0" required>
dBm
</div>
<!--
<label class="setting-label">Width:</label>
<input class="value-input" name='setWidth' type="text" id ="setWidth" placeholder="width" maxlength="9" min="0" max="250" required>
MHz
</div> -->
<br />
<!-- <div style="width:180px; display: inline-block">Ext gain:<input style = "width:100px" name='setExtGain' type="text" placeholder="extGain" maxlength="9" min="-100" max="40" required></div> -->
<div id="signal_info">
<div class="setting" >
<label class="setting-label">RBW:</label>
<input class="value-display" type="text" disabled="1" id="actRBW" size="1" value="300" />
kHz
</div>
</div>
<div class="setting" >
<label for="setRBW" class="setting-label">RBW:</label>
<select class="select-input" id="setRBW" name="setRBW"></select>
kHz
</div>
<!-- <div style="width:150px; display: inline-block">
<button type="submit">Update</button>
</div> -->
<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>
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>
<!--<select class="select-input" id="setAtten" name="setAtten"></select> -->
dB
</div>
<br />
<div class="setting" >
<label for="setRefOut" class="setting-label">Reference:</label>
<select class="select-input" id="setRefOut" name="setRefOut">
<option class="select-option" value="-1">Off</option>
<option class="select-option" value="0">30</option>
<option class="select-option" value="1">15</option>
<option class="select-option" value="2">10</option>
<option class="select-option" value="3">4</option>
<option class="select-option" value="4">3</option>
<option class="select-option" value="5">2</option>
<option class="select-option" value="6">1</option>
</select>
MHz
</div>
<br />
<div id="spur">
<div class="setting" >
<label class="setting-label">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>
<input class="value-input" type="number" id="setTrackGenPower" placeholder="setTrackGenPower" maxlength = "6" min="-60" max="20" value="0" />
dBm
</div>
</div>
<br />
<div id="signal_info">
<div class="setting" >
<label class="setting-label">Points:</label>
<input class="value-display" type="text" disabled="1" id="sweepPoints" size="1" value="65000" />
<label class="setting-label">Time:</label>
<input class="value-display" type="text" disabled="1" id="sweepTime" size="1" value="290" />
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 -->
<hr />
<h1>Settings</h1>
<div class="setting" >
<label for="levelOffset" class="setting-label">Offset:</label>
<input class="value-display" type="text" disabled="1" id="levelOffset" size="1" value="10" />
<label for="calLevel" class="setting-label">Max Level:</label>
<input class="value-display" type="text" disabled="1" id="calLevel" size="1" value="0" />
dB
</div>
<div class="setting" >
<button class = "set-button" type="submit" id="setActPower">Set Actual</button>
<input class="value-input" type="number" id="setPowerValue" placeholder="setPowerValue" maxlength = "9" min="-60" max="20" value="0" />
<button class = "set-button" type="submit" id="setActPower">Set Max</button>
<input class="value-input" type="number" id="setMaxPower" placeholder="setMaxPower" maxlength = "9" min="-60" max="20" value="0" />
dBm
</div>
<br />
@ -213,39 +107,10 @@
</select>
dBm
</div>
<div class="setting" >
<label for="setPreAmp" class="setting-label">Pre-amp:</label>
<select class="select-input" id="setPreAmp" name="setPreAmp">
<option value="96">Auto</option> <!--0x60 Auto -->
<option value="0">5</option> <!--0x00 LNA Min 5dB-->
<option value="1">8</option> <!--0x01 -->
<option value="2">11</option> <!--0x02 -->
<option value="3">14</option> <!--0x03 -->
<option value="4">17</option> <!--0x04 -->
<option value="5">20</option> <!--0x05 -->
<option value="6">23</option> <!--0x06 -->
<option value="7">27</option> <!--0x07 -->
<option value="8">30</option> <!--0x08 -->
<option value="16">25</option> <!--0x10 LNA Max 25dB-->
<option value="17">28</option> <!--0x11 -->
<option value="18">31</option> <!--0x12 -->
<option value="19">34</option> <!--0x13 -->
<option value="20">37</option> <!--0x14 -->
<option value="21">40</option> <!--0x15 -->
<option value="22">43</option> <!--0x16 -->
<option value="23">46</option> <!--0x17 -->
<option value="24">49</option> <!--0x18 -->
</select>
dB
</div>
<div class="setting" >
<div class="setting" >
<label for="setIF" class="setting-label">IF:</label>
<input class="value-input" type="number" id="setIF" size="1" value="433.92" min="433" max=435 step=0.01 />
MHz
</div>
<div class="setting" >
<label for="Average" class="setting-label">Average:</label>
<input class="value-input" type="number" id="Average" size="1" value="10" min="2" max=100 step=1 />
</div>
</div>
@ -287,258 +152,27 @@ var refreshInterval = document.getElementById('refreshInterval');
var refresh = document.getElementById('refresh');
var setMode = document.getElementById('setMode');
var sweepStart = document.getElementById('sweepStart');
var sweepStop = document.getElementById('sweepStop');
var setStart = document.getElementById('setStart');
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 setFreq = document.getElementById('setFreq');
var setLevel = document.getElementById('setLevel');
var calLevel = document.getElementByID('calLevel');
var setActPower = document.getElementById('setActPower');
var levelOffset = document.getElementById('levelOffset');
var setRefOut = document.getElementById('setRefOut');
var sweepPoints = document.getElementById('sweepPoints');
var sweepTime = document.getElementById('sweepTime');
var setSpur = document.getElementById('spurReduction');
var actRBW = document.getElementById('actRBW');
var setRBW = document.getElementById('setRBW');
var setDrive = document.getElementById('setLODrive');
var setMaxPower = document.getElementByID('setMaxPower');
var setLODrive = document.getElementById('setLODrive');
var setIF = document.getElementById('setIF');
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;
// initialise these to silly values to force an update first time round
var oldSweepStart = -1;
var oldSweepStop = -1;
var oldSweepCenter = -1;
var oldSetRefOut = -2;
var oldSetRBW = -10;
var oldLevelOffset = 1000;
var oldAttenuation = 1000;
var oldExternalGain = 1000;
var oldDrive = -1;
var oldFreq = 0
var oldSetLevel = 100;
var oldCalLevel = 100;
var oldMaxPower = 100;
var oldLODrive = -1;
var oldIF = 0;
var oldPreAmp = 0;
var oldSweepPoints = 0;
var oldSpur = 2;
var oldTrackGen = 2;
var oldTrackGenPower = 1000;
// Chart configuration - Scope
var RSSISamples = [
{y:10},
{y:11},
{y:12},
{y:13},
{y:14},
{y:15},
{y:16},
{y:17},
{y:18},
]; // dummy for test
var dBSamples = [
{y:-10},
{y:-20},
{y:-23},
{y:-90},
{y:-120},
{y:-100},
{y:-80},
{y:-30},
{y:-40},
]; // dummy for test
var gainSamples = [
{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},
]; // 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",
fontSize: 28
},
axisX: {
title: "Frequency (MHz)",
titleFontSize: 24
},
axisY:
{
title: "dB",
titleFontSize: 24,
minimum: -120
},
axisY2: [
{
title: "RSSI",
titleFontSize: 24,
minimum: 0,
maximum: 255
},
{
title: "Gain",
titleFontSize: 24,
minimum: 0,
maximum: 50
}],
exportEnabled: true,
legend: {
cursor: "pointer",
itemclick: function (e) {
//console.log("legend click: " + e.dataPointIndex);
//console.log(e);
if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
e.dataSeries.visible = false;
} else {
e.dataSeries.visible = true;
}
e.chart.render();
}
},
data: [
{
type: "line",
name: "dB",
dataPoints : dBSamples,
showInLegend : true
},
{
type: "line",
name: "RSSI",
axisYType: "secondary",
dataPoints : RSSISamples,
showInLegend : true,
visible : false
},
{
type: "line",
name: "gain",
axisYType: "secondary",
axisYIndex: 1,
dataPoints : gainSamples,
showInLegend : true,
visible : false
},
{
type: "line",
name: "average",
dataPoints : dBSamples,
showInLegend : true,
visible : false
},
{
type: "line",
name: "min",
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
}
]
});
renderChart();
// Add handlers for the change events in the input fields
@ -551,7 +185,7 @@ setMode.addEventListener('change', (event) => {
sendValue("m", setMode.value);
});
setStart.addEventListener('change', (event) => {
setFreq.addEventListener('change', (event) => {
sendValue("a", setStart.value);
});
@ -1287,7 +921,7 @@ function sendValue(c, val)
//
// Message format
// #(code) value where code is a single char. Case is important
// a start freq (MHz)
// a start freq (MHz) - sig gen freq if in sig gen mode
// b stop frequency
// c centre frequency
// s Span
@ -1304,6 +938,9 @@ function sendValue(c, val)
// S Spur reduction Off/On
// t trackGen Off/On/Fixed
// T trackGen output level
// L Sig Gen level (dBm)
// G Sig Gen Off/On
// P Sig Gen set max output level (dBm)
//
//connection.send("# " + messageCounter + " " + sampleThreshold + " " + sampleSize);
connection.send("#" + c + " " + val);

View File

@ -192,8 +192,55 @@ input[type="number"] {
.setting-label {
width: 80px;
display: inline-block;
}
.freq-label {
width: 160px;
display: inline-block;
font-weight: bolder;
font-size: 32px;
}
.freq-input {
border: solid 1px grey;
text-align: right;
width: 160px;
display: inline-block;
font-weight: bolder;
font-size: 32px;
}
TH, .bold {
background-color: lightblue;
color: black;
}
.slider {
-webkit-appearance: none;
width: 100%;
height: 15px;
border-radius: 5px;
background: #d3d3d3;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 25px;
height: 25px;
border-radius: 50%;
background: #4CAF50;
cursor: pointer;
}
.slider::-moz-range-thumb {
width: 25px;
height: 25px;
border-radius: 50%;
background: #4CAF50;
cursor: pointer;
}

View File

@ -239,8 +239,9 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo
* E external gain ( eg attenuator(-ve) or preamp(+ve) )
* R requested RBW
* S Spur reduction Off/On
* t trackGen Off/On/Fixed
* t trackGen Off/On/Generate
* T trackGen output level
* f trackgen signal generator frequency
* F Sig Gen frequency
* L Sig Gen level (dBm)
* G Sig Gen Off/On
@ -372,7 +373,7 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo
SetSpur ( (int8_t)value );
break;
case 't': // Tracking Generator on/off
case 't': // Tracking Generator off/on/generate
SetTracking ( (int8_t)value );
break;