Sig Gen Web page update

Still working out a good layout and method to change frequency on mobile platforms.
Now works, needs some formatting and pwr control adding, then duplicate for track gen
This commit is contained in:
M0WID 2020-10-03 23:17:19 +01:00
parent acd6e2b6f4
commit ed4563c0c9
6 changed files with 316 additions and 29 deletions

View File

@ -125,6 +125,7 @@ void doSigGenLow ()
{
static uint32_t oldIF; // to store the current IF
static uint16_t oldSigGenOutputOn;
float p; // temporary variable for slider percent
uint16_t t_x = 0, t_y = 0; // To store the touch coordinates
@ -133,6 +134,10 @@ void doSigGenLow ()
showUpDownButtons = 1;
#endif
if (changedSetting) {
att.SetAtten(sigGenSetting.Calibration - sigGenSetting.Power);
}
boolean changedSetting = false;
// Get current touch state and coordinates
@ -253,13 +258,15 @@ void doSigGenLow ()
// Check if slider touched
if ( sliderPressed( pressed, t_x, t_y) )
{
float p = sliderPercent( t_x ); // position of slider in %
p = sliderPercent( t_x ); // position of slider in %
float pwr = p * (ATTENUATOR_RANGE)/100.0 + sigGenSetting.Calibration - ATTENUATOR_RANGE;
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;
} else {
p = ( sigGenSetting.Power - (sigGenSetting.Calibration - ATTENUATOR_RANGE) ) * 100.0 / ATTENUATOR_RANGE;
drawSlider ( SLIDER_X, SLIDER_Y, p, sigGenSetting.Power, "dBm" );
}

38
cmd.cpp
View File

@ -186,6 +186,7 @@ extern uint8_t dBmToRSSI ( double dBm );
{ "EXTGAIN", MSG_EXTGAIN }, // External gain or attenuation
{ "SGON", MSG_SGON }, // turn on signal generator output
{ "SGOFF", MSG_SGOFF }, // turn off signal generator output
{ "SGFREQ", MSG_SGFREQ }, // Set Signal Generator Frequency
{ "TRACKON", MSG_TGON }, // turn on tracking generator output
{ "TRACKOFF", MSG_TGOFF }, // turn off tracking generator output
{ "TRACKSIG", MSG_TGSIG }, // turn off tracking generator output
@ -804,6 +805,18 @@ uint8_t reg69; // Ditto
SetSGState(0);
return true;
case MSG_SGFREQ:
if ( dataLen != 0 ) // Frequency specified?
{
freq1 = ParseFrequency ( dataBuff ); // Yes, get new frequency
SetSGFreq (freq1);
}
Serial.printf ( "Signal Generator frequency: %i\n", FormatFrequency ( sigGenSetting.Frequency ));
return true;
/*
* The "SGLODRIVE" command sets the local oscillator "drive" level in signal generator mode.
*/
@ -2365,6 +2378,7 @@ void RequestSetPowerLevel ( float o )
/*
* "SetPowerLevel"
* Adjusts displayed power to match the actual input signal power - calibration function
*/
void SetPowerLevel ( double o )
@ -2508,12 +2522,18 @@ int oldLevel = setting.Drive;
* Settings are saved when leaving the mode
* parameter is in Hz
*/
void SetSGFreq (uint32_t f)
bool SetSGFreq (uint32_t f)
{
if ( ( f >= MIN_SIGLO_FREQ ) && ( f <= MAX_SIGLO_FREQ ) )
{
sigGenSetting.Frequency = f;
return true;
}
else
return false;
}
/*
* Sig gen state is not saved - always want to start in off state
*/
@ -2593,6 +2613,20 @@ int oldLevel = sigGenSetting.RX_Drive;
}
void SetSGPower ( int16_t dBm )
{
// Add algorithm to set attenuator and IF drive level
// initially limit to just set attenuator
if ( dBm > sigGenSetting.Calibration )
dBm = sigGenSetting.Calibration;
if ( dBm < sigGenSetting.Calibration - ATTENUATOR_RANGE )
dBm = sigGenSetting.Calibration - ATTENUATOR_RANGE;
sigGenSetting.Power = dBm;
changedSetting = true;
}
#ifdef SI_TG_LO_CS
/*
* "SetTGLoDrive" sets the transmitter max output level for the tracking generator.
@ -2709,7 +2743,7 @@ int32_t GetTGOffset ( )
}
/*
* Set the IF frequency - M0WID addition
* Set the Track Gen frequency - M0WID addition
*/
bool SetTGFreq ( int32_t freq )

4
cmd.h
View File

@ -80,7 +80,7 @@
#define MSG_EXTGAIN 51 // Set external gain or attenuation
#define MSG_SGON 52 // Turn Signal Generator output on
#define MSG_SGOFF 53 // Turn Signal Generator output off
#define MSG_SG_FREQ 54 // Set Signal Generator Frequency
#define MSG_SGFREQ 54 // Set Signal Generator Frequency
#define MSG_TGON 55 // Turn Tracking Generator output on
#define MSG_TGOFF 56 // Turn Tracking Generator output off
#define MSG_TGFREQ 57 // Set Track Gen frequency for sig gen mode
@ -147,8 +147,10 @@ bool SetIFFrequency ( int32_t f ); // Sets the IF frequency
void SetLoDrive ( uint8_t level ); // Sets LO Si4432 output level
void SetSGState (uint16_t s);
bool SetSGFreq ( uint32_t freq); // set signal generator frequency - returns false if invalid
void SetSGLoDrive ( uint8_t level );
void SetSGRxDrive ( uint8_t level );
void SetSGPower ( int16_t dBm ); // Set signal generator attenuator and drive levels
void SetTracking ( int8_t m ); // set tracking generator mode
void SetTGLoDrive ( uint8_t level ); // set tracking generator drive

View File

@ -50,26 +50,42 @@
<button id="aboutButton" onclick="window.location.href='about.html';">About</button>
</div>
<div class ="Grid">
<div class = "Grid-cell" id="chartSA" >
<div class = "Grid-cell" id="chartSA" style="display:none">
<!-- container for chart -->
</div>
<div class = "Grid-cell" id="sigGen" style="display:none">
<div class = "Grid-cell" id="sigGen" style="display:block">
<!-- 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
<div class="sigTitle">Signal Generator</div>
<br />
<label for="setSigLevel" class = "SigLevel">Level:</label>
<input class="sigLevelInput" id="setSigLevel" name="setSigLevel" type="number" min="-70" max="20">
<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>
<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>
<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>
<span class="sigFreqText">Hz</span>
<button class = "set-button" id="incButton">+</button>
<button class = "set-button" id="decButton">-</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">
dBm
<br /><br />
<div class="slidecontainer">
<input type="range" min="-70" max="20" value="10" class="slider" id="sigLevelSlider">
</div>
</div>
<br />
@ -305,6 +321,9 @@
<script type="text/javascript">
var frequency = 0;
var freqStep = 1000000;
var chartDiv = document.getElementById('chartSA');
var sigDiv = document.getElementById('sigGen');
@ -342,8 +361,19 @@ var store4 = document.getElementById('store4');
var sigLevelSlider = document.getElementById('sigLevelSlider');
var setSigLevel = document.getElementById('setSigLevel');
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 tempCenter;
// initialise these to silly values to force an update first time round
@ -707,17 +737,164 @@ store4.addEventListener('change', (event) => {
});
setSigFreq.addEventListener('change', (event) => {
sendValue("F", setSigFreq.value);
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";
switch(freqStep) {
case 1:
setSigFreq0.style.color = "red";
break;
case 10:
setSigFreq1.style.color = "red";
break;
case 100:
setSigFreq2.style.color = "red";
break;
case 1000:
setSigFreq3.style.color = "red";
break;
case 10000:
setSigFreq4.style.color = "red";
break;
case 100000:
setSigFreq5.style.color = "red";
break;
case 1000000:
setSigFreq6.style.color = "red";
break;
case 10000000:
setSigFreq7.style.color = "red";
break;
case 100000000:
setSigFreq8.style.color = "red";
break;
}
};
changeStep(freqStep); // initial pass
function incdec(direction, factor) {
if (direction > 0) {
if ( (frequency + factor) <= 250000000)
frequency += factor;
} else {
if (frequency >= factor)
frequency -= factor;
}
if (frequency > 250000000)
frequency = 250000000;
if (frequency < 0)
frequency = 0;
console.log("incdec:", frequency);
var tempFreq = frequency;
setSigFreq0.value = frequency%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq1.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq2.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq3.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq4.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq5.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq6.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq7.value = tempFreq%10;
tempFreq = parseInt(tempFreq/10);
setSigFreq8.value = tempFreq%10;
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)};
setSigFreq0.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(1);
incdec(-event.deltaY,1);
});
setSigFreq1.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(10);
incdec(-event.deltaY,10);
});
setSigFreq2.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(100);
incdec(-event.deltaY,100);
});
setSigFreq3.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(1000);
incdec(-event.deltaY,1000);
});
setSigFreq4.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(10000);
incdec(-event.deltaY,10000);
});
setSigFreq5.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(100000);
incdec(-event.deltaY,100000);
});
setSigFreq6.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(1000000);
incdec(-event.deltaY,1000000);
});
setSigFreq7.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(10000000);
incdec(-event.deltaY,10000000);
});
setSigFreq8.addEventListener('wheel', (event) => {
event.preventDefault();
changeStep(100000000);
incdec(-event.deltaY,100000000);
});
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;
setSigLevel.value = this.value;
}

View File

@ -194,22 +194,81 @@ input[type="number"] {
display: inline-block;
}
.freq-label {
width: 160px;
display: inline-block;
font-weight: bolder;
font-size: 32px;
.sigTitle {
font-size: 36px;
font-weight: bold;
}
.freq-input {
border: solid 1px grey;
text-align: right;
width: 160px;
display: inline-block;
.sigFreq {
font-weight: bolder;
font-size: 32px;
margin: 0;
padding: 0;
letter-spacing: -10px;
}
.sigFreqLabel {
width: 180px;
display: inline-block;
font-size: 32px;
margin: 0;
padding: 0;
letter-spacing: normal;
}
.sigFreqText {
display: inline-block;
font-size: 32px;
margin: 0;
padding: 0;
letter-spacing: normal;
}
input.sigFreqInput {
border: solid 1px grey;
text-align: right;
width: 18px;
display: inline-block;
font-size: 32px;
margin: 0;
padding: 0;
}
input.sigFrequencyInput {
border: solid 1px grey;
text-align: right;
width: 180px;
display: inline-block;
font-size: 32px;
margin: 0;
padding: 0;
}
input.sigFreqInput::-webkit-outer-spin-button,
input.sigFreqInput::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input.sigFreqInput {
-moz-appearance: textfield;
}
.sigLevelLabel {
width: 180px;
display: inline-block;
font-size: 32px;
letter-spacing: normal;
}
input.sigLevelInput {
border: solid 1px grey;
text-align: right;
width: 180px;
display: inline-block;
font-size: 32px;
}
TH, .bold {
background-color: lightblue;
color: black;
@ -217,7 +276,7 @@ TH, .bold {
.slider {
-webkit-appearance: none;
width: 100%;
width: 340px;
height: 15px;
border-radius: 5px;
background: #d3d3d3;

View File

@ -364,6 +364,14 @@ void webSocketEvent ( uint8_t num, WStype_t type, uint8_t* payload, size_t paylo
SetExtGain ( value );
break;
case 'F':
SetSGFreq ( value );
break;
case 'L': // Tracking Generator output power (dBm)
SetSGPower ( value );
break;
case 'R': // Requested RBW. 0=Auto
SetRBW ( value );
Serial.printf("Wifi RBW %f\n", value);