CB FM working

This commit is contained in:
cnlohr
2024-07-12 01:54:24 -07:00
parent 8cf6fa53a9
commit e9f97f7757
2 changed files with 69 additions and 22 deletions
+6 -11
View File
@@ -4,20 +4,13 @@
<LINK rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> <LINK rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
<META charset="UTF-8"> <META charset="UTF-8">
<STYLE> <STYLE>
body { body { background-color: Canvas; color: CanvasText; }
background-color: Canvas; :root { color-scheme: dark; }
color: CanvasText;
}
:root {
color-scheme: dark;
}
</STYLE> </STYLE>
<SCRIPT src=webhidcontrol.js></SCRIPT> <SCRIPT src=webhidcontrol.js></SCRIPT>
<SCRIPT> <SCRIPT>
function DrawSpan( colspan, freq, target, docolor, extrastr = "" ) function DrawSpan( colspan, freq, target, docolor, extrastr = "" )
{ {
var fdist = Math.abs( freq - target ); var fdist = Math.abs( freq - target );
@@ -228,8 +221,10 @@ function onLoad()
Live Control: Live Control:
<TABLE><TR> <TABLE><TR>
<TD><INPUT TYPE=SUBMIT onClick="reqConnect()" VALUE="Open Device" ID=connectButton><INPUT TYPE=SUBMIT onClick="toggleAudio()" VALUE="Play Audio" ID="ToggleAudioButton"></TD> <TD><INPUT TYPE=SUBMIT onClick="reqConnect()" VALUE="Open Device" ID=connectButton>
<TD><DIV ID=STATUS></DIV></TD> <INPUT TYPE=SUBMIT onClick="toggleAudio()" VALUE="Play Audio" ID="ToggleAudioButton">
<INPUT TYPE=SUBMIT onClick="toggleAudioModulation()" VALUE="modulation" ID="ToggleAudioModulationButton">
<DIV ID=STATUS></DIV></TD>
</TR></TABLE> </TR></TABLE>
<DIV ID="StatusPerf"></DIV> <DIV ID="StatusPerf"></DIV>
</TD> </TD>
+61 -9
View File
@@ -61,6 +61,27 @@ async function closeDeviceTool()
var playingAudioProcessor = null; var playingAudioProcessor = null;
var audioContext = null; var audioContext = null;
var targetModulation = 0;
var targetGain = 0.0;
function UpdateButtonNames()
{
document.getElementById( "ToggleAudioButton" ).value = ( targetGain > 0.5 ) ? "Stop Audio" : "Start Audio";
document.getElementById( "ToggleAudioModulationButton" ).value = ( targetModulation > 0.5 ) ? "FM" : "AM";
}
async function toggleAudioModulation()
{
if( playingAudioProcessor != null )
{
var newVal = 1 - targetModulation;
let demodmodeParam = playingAudioProcessor.parameters.get("demodmode");
demodmodeParam.setValueAtTime( newVal, audioContext.currentTime);
targetModulation = newVal;
}
UpdateButtonNames();
}
async function toggleAudio() async function toggleAudio()
{ {
if( playingAudioProcessor == null ) if( playingAudioProcessor == null )
@@ -70,20 +91,26 @@ async function toggleAudio()
static get parameterDescriptors() {\ static get parameterDescriptors() {\
return [\ return [\
{ name: "gain", defaultValue: 0, },\ { name: "gain", defaultValue: 0, },\
{ name: "demodmode", defaultValue: 0, },\
{ name: "lastIntensity", defaultValue: 1, },\ { name: "lastIntensity", defaultValue: 1, },\
{ name: "sampleAdvance", defaultValue: 0.5, },\ { name: "sampleAdvance", defaultValue: 0.5, },\
]\ ]\
};\ };\
constructor() {\ constructor() {\
super();\ super();\
this.rbuffer = new Uint32Array(8192); \ this.rbuffer = new Float32Array(8192); \
this.rbufferhead = 0|0; \ this.rbufferhead = 0|0; \
this.rbuffertail = 0|0; \ this.rbuffertail = 0|0; \
this.sampleplace = 0.0; \ this.sampleplace = 0.0; \
this.lastIntensity = 0.0; \ this.lastIntensity = 0.0; \
this.totalsampcount = 0|0; \ this.totalsampcount = 0|0; \
this.lastDemodMode = 0|0; \
this.iirphase = 0.0; /* for FM */\
this.lastphase = 0.0; /* for FM */\
this.phaseout = 0.0; /* for FM */\
this.port.onmessage = (e) => { \ this.port.onmessage = (e) => { \
var mulcoeff = 500.0 / Math.fround( this.lastIntensity ); \ var mulcoeff = 100.0 / Math.fround( this.lastIntensity ); \
var demodmode = this.lastDemodMode | 0; \
for( var i = 0|0; i < e.data.length|0; i++ ) \ for( var i = 0|0; i < e.data.length|0; i++ ) \
{ \ { \
let n = (this.rbufferhead + (1|0))%(8192|0); \ let n = (this.rbufferhead + (1|0))%(8192|0); \
@@ -98,7 +125,25 @@ async function toggleAudio()
if( vi >= 32768 ) vi = vi-65535; \ if( vi >= 32768 ) vi = vi-65535; \
if( vq >= 32768 ) vq = vq-65535; \ if( vq >= 32768 ) vq = vq-65535; \
let power = Math.sqrt( vi * vi + vq * vq ) * mulcoeff; \ let power = Math.sqrt( vi * vi + vq * vq ) * mulcoeff; \
let phase = Math.atan2( vi, vq ) * 0.159155078 + 0.5; \
if( this.lastDemodMode == 0 ) \
{ /* AM */ \
this.rbuffer[this.rbufferhead] = power; \ this.rbuffer[this.rbufferhead] = power; \
} \
else if( this.lastDemodMode == 1 ) \
{ /* FM */ \
var diffphase = phase - this.lastphase; \
this.lastphase = phase; \
if( diffphase < 0.0 ) diffphase += 1.0; \
if( diffphase > 1.0 ) diffphase -= 1.0; \
this.iirphase = this.iirphase * 0.999 + diffphase * 0.001; \
diffphase -= this.iirphase; \
var po = this.phaseout = this.phaseout * 0.993 + diffphase; \
console.log( po ); \
if( po < 0.0 ) po += 1.0; \
if( po > 1.0 ) po -= 1.0; \
this.rbuffer[this.rbufferhead] = po; \
} \
this.rbufferhead = n; \ this.rbufferhead = n; \
} \ } \
}; \ }; \
@@ -108,6 +153,7 @@ async function toggleAudio()
/*console.log( parameters.gain[0] );*/ \ /*console.log( parameters.gain[0] );*/ \
/*console.log( this.ingestData );*/ \ /*console.log( this.ingestData );*/ \
this.lastIntensity = parameters.lastIntensity[0]; \ this.lastIntensity = parameters.lastIntensity[0]; \
this.lastDemodMode = parameters.demodmode[0]; \
let len = outputs[0][0].length; \ let len = outputs[0][0].length; \
const sa = Math.fround( parameters.sampleAdvance[0] ); /*float*/ \ const sa = Math.fround( parameters.sampleAdvance[0] ); /*float*/ \
var s = Math.fround( this.sampleplace ); /*float*/ \ var s = Math.fround( this.sampleplace ); /*float*/ \
@@ -172,11 +218,13 @@ async function toggleAudio()
gainParam.setValueAtTime( 0, audioContext.currentTime ); gainParam.setValueAtTime( 0, audioContext.currentTime );
} }
var newVal = 1 - targetGain;
console.log( "Setting gain to: " + newVal );
let gainParam = playingAudioProcessor.parameters.get("gain"); let gainParam = playingAudioProcessor.parameters.get("gain");
var newVal = 1 - gainParam.value;
gainParam.setValueAtTime( newVal, audioContext.currentTime); gainParam.setValueAtTime( newVal, audioContext.currentTime);
targetGain = newVal;
document.getElementById( "ToggleAudioButton" ).value = ( newVal > 0.5 ) ? "Stop Audio" : "Start Audio"; document.getElementById( "ToggleAudioButton" ).value = ( newVal > 0.5 ) ? "Stop Audio" : "Start Audio";
UpdateButtonNames();
} }
function onLoadWebHidControl() function onLoadWebHidControl()
@@ -185,6 +233,7 @@ function onLoadWebHidControl()
liveGraph.addEventListener( "mousedown", graphClick ); liveGraph.addEventListener( "mousedown", graphClick );
liveGraph.addEventListener( "mouseup", graphClick ); liveGraph.addEventListener( "mouseup", graphClick );
UpdateButtonNames();
setTimeout( sendLoop, 1 ); setTimeout( sendLoop, 1 );
if( !navigator.hid ) if( !navigator.hid )
@@ -305,7 +354,7 @@ async function sendLoop()
xActionSecAvg = xActionSecAvg * 0.9 + xActionSec * 0.1; xActionSecAvg = xActionSecAvg * 0.9 + xActionSec * 0.1;
document.getElementById( "StatusPerf" ).innerHTML = document.getElementById( "StatusPerf" ).innerHTML =
(kBsecAvg).toFixed(2) + " kBytes/s (Split between send and receive)<br>" + (kBsecAvg).toFixed(2) + " kBytes/s<br>" +
(xActionSecAvg).toFixed(2) + "transactions/sec<br>" + (xActionSecAvg).toFixed(2) + "transactions/sec<br>" +
"Count: " + goodCount + " / " + badCount; "Count: " + goodCount + " / " + badCount;
lastTime = thisTime; lastTime = thisTime;
@@ -336,8 +385,8 @@ async function sendLoop()
let mulcoeff = 10000.0 / lastIntensity; let mulcoeff = 10000.0 / lastIntensity;
var lot = 1.2; var lot = 1.2;
var x = 253+IQHistoryLen; var x = 253;
for( var i = (IQHistoryHead+1) & (IQHistoryLen-1); i != IQHistoryHead|0; i = (i + 1) & (IQHistoryLen-1) ) for( var i = (IQHistoryHead-1) & (IQHistoryLen-1); i != IQHistoryHead|0; i = (i - 1 + IQHistoryLen) & (IQHistoryLen-1) )
{ {
let v = IQHistoryArray[i]; let v = IQHistoryArray[i];
let real = (v >> 16); let real = (v >> 16);
@@ -352,9 +401,12 @@ async function sendLoop()
if( imag < 0 ) imag = 0; if( imag > 255 ) imag = 255; if( imag < 0 ) imag = 0; if( imag > 255 ) imag = 255;
ctx.fillRect(x,power+10,2,2); ctx.fillRect(x,power+10,2,2);
ctx.fillRect(x,phase*140+150,2,2); ctx.fillRect(x,phase*140+150,2,2);
x--; x++;
ctx.globalAlpha = (lot>0)?lot:0; if( lot > 0 )
{
ctx.globalAlpha = lot;
ctx.fillRect(real+50,imag,2,2); ctx.fillRect(real+50,imag,2,2);
}
ctx.globalAlpha = 1.0; ctx.globalAlpha = 1.0;
lot -= 0.0015; lot -= 0.0015;
} }