Added ability to encode power into dbm

This commit is contained in:
Jordan Sherer 2018-07-21 02:18:15 -04:00
parent 92117aa791
commit fe405cfba8
2 changed files with 88 additions and 7 deletions

View File

@ -46,6 +46,7 @@ QMap<QString, int> directed_cmds = {
{"|", 4 }, // relay message
// directed responses
{" PWR", 24 }, // power level
{" SNR", 25 }, // seen a station at the provided snr
{" NO", 26 }, // negative confirm
{" YES", 27 }, // confirm
@ -55,12 +56,14 @@ QMap<QString, int> directed_cmds = {
{" ", 31 }, // send freetext
};
QSet<int> allowed_cmds = {0, 1, 2, 25, 26, 27, 28, 29, 30, 31};
QSet<int> allowed_cmds = {0, 1, 2, 24, 25, 26, 27, 28, 29, 30, 31};
QRegularExpression directed_re("^"
"(?<to>[A-Z0-9/]+)"
"(?<cmd>\\s?(?:AGN[?]|RR|73|YES|NO|SNR|[?$@&| ]))"
"(?<num>\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?");
"(?<cmd>\\s?(?:AGN[?]|RR|73|YES|NO|SNR|PWR|[?$@&| ]))"
"(?<pwr>\\s?\\d+\\s?[KM]?W)?"
"(?<num>\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?"
);
QMap<QChar, QString> huff = {
// char code weight
@ -121,6 +124,52 @@ QMap<QString, quint32> basecalls = {
{ "ALLCALL", nbasecall + 3 },
};
QMap<int, int> dbm2mw = {
{0 , 1},
{3 , 2},
{7 , 5},
{10 , 10},
{13 , 20},
{17 , 50},
{20 , 100},
{23 , 200},
{27 , 500},
{30 , 1000}, // 1W
{33 , 2000}, // 2W
{37 , 5000}, // 5W
{40 , 10000}, // 10W
{43 , 20000}, // 20W
{47 , 50000}, // 50W
{50 , 100000}, // 100W
{53 , 200000}, // 200W
{57 , 500000}, // 500W
{60 , 1000000}, // 1000W
};
int mwattsToDbm(int mwatts){
int dbm = 0;
auto values = dbm2mw.values();
qSort(values);
foreach(auto mw, values){
if(mw < mwatts){ continue; }
dbm = dbm2mw.key(mw);
break;
}
return dbm;
}
int dbmTomwatts(int dbm){
if(dbm2mw.contains(dbm)){
return dbm2mw[dbm];
}
auto iter = dbm2mw.lowerBound(dbm);
if(iter == dbm2mw.end()){
return dbm2mw.last();
}
return iter.value();
}
QString Varicode::formatSNR(int snr){
if(snr < -60 || snr > 60){
return QString();
@ -129,6 +178,19 @@ QString Varicode::formatSNR(int snr){
return QString("%1%2").arg(snr >= 0 ? "+" : "").arg(snr, snr < 0 ? 3 : 2, 10, QChar('0'));
}
QString Varicode::formatPWR(int dbm){
if(dbm < 0 || dbm > 60){
return QString();
}
int mwatts = dbmTomwatts(dbm);
if(mwatts < 1000){
return QString("%1MW").arg(mwatts);
}
return QString("%1W").arg(mwatts/1000);
}
QStringList Varicode::parseCallsigns(QString const &input){
QStringList callsigns;
QRegularExpression re(callsign_pattern2);
@ -535,6 +597,7 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi
QString to = match.captured("to");
QString cmd = match.captured("cmd");
QString num = match.captured("num").trimmed();
QString pwr = match.captured("pwr").trimmed();
int inum = -31;
bool hasnum = false;
@ -542,9 +605,19 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi
inum = qMax(-30, qMin(num.toInt(&hasnum, 10), 30));
}
qDebug() << "match" << match.captured(0);
qDebug() << "groups" << from << to << cmd << num;
qDebug() << "packed num" << num << inum << hasnum;
// if we are packing a PWR command, pack pwr into dbm
int ipwr = -31;
if(!pwr.isEmpty() && cmd.trimmed() == "PWR"){
int factor = 1000;
if(pwr.endsWith("KW")){
factor = 1000000;
}
else if(pwr.endsWith("MW")){
factor = 1;
}
ipwr = pwr.replace(QRegExp("[KM]?W"), "").toInt() * factor;
inum = mwattsToDbm(ipwr) - 30;
}
if(to == callsign){
*n = 0;
@ -625,7 +698,14 @@ QStringList Varicode::unpackDirectedMessage(const QString &text){
int num = (flag ? -1 : 1) * extra;
if(num != -31){
unpacked.append(Varicode::formatSNR(num));
// TODO: jsherer - should we decide which format to use on the command, or something else?
if(packed_cmd == directed_cmds[" PWR"]){
unpacked.append(Varicode::formatPWR(num + 30));
} else if(packed_cmd == directed_cmds[" SNR"]) {
unpacked.append(Varicode::formatSNR(num));
} else {
unpacked.append(QString("%1").arg(num));
}
}
return unpacked;

View File

@ -28,6 +28,7 @@ public:
//Varicode();
static QString formatSNR(int snr);
static QString formatPWR(int dbm);
static QStringList parseCallsigns(QString const &input);
static QStringList parseGrids(QString const &input);