179 lines
5.3 KiB
JavaScript
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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|