Files
protoloon/js/WSPR.js
2026-04-02 17:39:02 -06:00

179 lines
5.3 KiB
JavaScript

/*
Copyright (c) 2023-forever Douglas Malnati. All rights reserved.
See the /faq/tos page for details.
(If this generated header is stamped on a file which is a 3rd party file or under a different license or copyright, then ignore this copyright statement and use that file's terms.)
*/
import * as utl from './Utl.js';
export class WSPR
{
static bandFreqList_ = [
["2190m", 136000],
["630m", 474200],
["160m", 1836600],
["80m", 3568600],
["60m", 5287200],
["40m", 7038600],
["30m", 10138700],
["20m", 14095600],
["17m", 18104600],
["15m", 21094600],
["12m", 24924600],
["10m", 28124600],
["6m", 50293000],
["4m", 70091000],
["2m", 144489000],
["70cm", 432300000],
["23cm", 1296500000],
];
static GetDialFreqFromBandStr(bandStr)
{
bandStr = WSPR.GetDefaultBandIfNotValid(bandStr);
let bandStr__dialFreq = new Map(WSPR.bandFreqList_);
let dialFreq = bandStr__dialFreq.get(bandStr);
return dialFreq;
}
static GetDefaultBandIfNotValid(bandStr)
{
let bandStr__dialFreq = new Map(WSPR.bandFreqList_);
if (bandStr__dialFreq.has(bandStr) == false)
{
bandStr = "20m";
}
return bandStr;
}
static GetDefaultChannelIfNotValid(channel)
{
channel = parseInt(channel);
let retVal = 0;
if (0 <= channel && channel <= 599)
{
retVal = channel;
}
return retVal;
}
// minute list, some bands are defined as rotation from 20m
static GetMinuteListForBand(band)
{
band = WSPR.GetDefaultBandIfNotValid(band);
// get index into list (guaranteed to be found)
let idx = WSPR.bandFreqList_.findIndex(bandFreq => {
return bandFreq[0] == band;
});
// rotation is modded place within this list
let rotationList = [4, 2, 0, 3, 1];
let rotation = rotationList[idx % 5];
let minuteList = [8, 0, 2, 4, 6];
minuteList = utl.Rotate(minuteList, rotation);
return minuteList;
}
static band__channelDataMap = new Map();
static GetChannelDetails(bandStr, channelIn)
{
bandStr = WSPR.GetDefaultBandIfNotValid(bandStr);
channelIn = WSPR.GetDefaultChannelIfNotValid(channelIn);
// lazy load
if (WSPR.band__channelDataMap.has(bandStr) == false)
{
let channelDataMap = new Map();
let id1List = ['0', '1', 'Q'];
let id3List = [`0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`];
let dialFreq = WSPR.GetDialFreqFromBandStr(bandStr);
let freqTxLow = dialFreq + 1500 - 100;
let freqTxHigh = dialFreq + 1500 + 100;
let freqTxWindow = freqTxHigh - freqTxLow;
let freqBandCount = 5;
let bandSizeHz = freqTxWindow / freqBandCount;
let freqBandList = [1, 2, 4, 5]; // skip middle band 3, but really label as 1,2,3,4
let minuteList = WSPR.GetMinuteListForBand(bandStr);
let rowCount = 0;
for (const freqBand of freqBandList)
{
// figure out the frequency
let freqBandLow = (freqBand - 1) * bandSizeHz;
let freqBandHigh = freqBandLow + bandSizeHz;
let freqBandCenter = (freqBandHigh + freqBandLow) / 2;
let rowsPerCol = freqBandCount * freqBandList.length;
for (const minute of minuteList)
{
let freqBandLabel = freqBand;
if (freqBandLabel >= 4) { freqBandLabel = freqBandLabel - 1; }
for (const id1 of id1List)
{
let colCount = 0;
let id1Offset = 0;
if (id1 == `1`) { id1Offset = 200; }
if (id1 == 'Q') { id1Offset = 400; }
for (const id3 of id3List)
{
let channel = id1Offset + (colCount * rowsPerCol) + rowCount;
channelDataMap.set(channel, {
band : bandStr,
channel: channel,
id1: id1,
id3: id3,
id13: id1 + id3,
min: minute,
lane: freqBandLabel,
freqLow: freqTxLow + freqBandLow,
freq: freqTxLow + freqBandCenter,
freqHigh: freqTxLow + freqBandHigh,
freqDial: dialFreq,
});
++colCount;
}
}
++rowCount;
}
}
WSPR.band__channelDataMap.set(bandStr, channelDataMap);
}
let channelDataMap = WSPR.band__channelDataMap.get(bandStr);
let channelData = channelDataMap.get(channelIn);
return channelData;
}
}