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:
parent
acd6e2b6f4
commit
ed4563c0c9
11
SigLo.ino
11
SigLo.ino
@ -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
38
cmd.cpp
@ -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
4
cmd.h
@ -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
|
||||
|
203
data/index.html
203
data/index.html
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user