Added ability to encode power into dbm
This commit is contained in:
parent
92117aa791
commit
fe405cfba8
94
varicode.cpp
94
varicode.cpp
@ -46,6 +46,7 @@ QMap<QString, int> directed_cmds = {
|
|||||||
{"|", 4 }, // relay message
|
{"|", 4 }, // relay message
|
||||||
|
|
||||||
// directed responses
|
// directed responses
|
||||||
|
{" PWR", 24 }, // power level
|
||||||
{" SNR", 25 }, // seen a station at the provided snr
|
{" SNR", 25 }, // seen a station at the provided snr
|
||||||
{" NO", 26 }, // negative confirm
|
{" NO", 26 }, // negative confirm
|
||||||
{" YES", 27 }, // confirm
|
{" YES", 27 }, // confirm
|
||||||
@ -55,12 +56,14 @@ QMap<QString, int> directed_cmds = {
|
|||||||
{" ", 31 }, // send freetext
|
{" ", 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("^"
|
QRegularExpression directed_re("^"
|
||||||
"(?<to>[A-Z0-9/]+)"
|
"(?<to>[A-Z0-9/]+)"
|
||||||
"(?<cmd>\\s?(?:AGN[?]|RR|73|YES|NO|SNR|[?$@&| ]))"
|
"(?<cmd>\\s?(?:AGN[?]|RR|73|YES|NO|SNR|PWR|[?$@&| ]))"
|
||||||
"(?<num>\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?");
|
"(?<pwr>\\s?\\d+\\s?[KM]?W)?"
|
||||||
|
"(?<num>\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?"
|
||||||
|
);
|
||||||
|
|
||||||
QMap<QChar, QString> huff = {
|
QMap<QChar, QString> huff = {
|
||||||
// char code weight
|
// char code weight
|
||||||
@ -121,6 +124,52 @@ QMap<QString, quint32> basecalls = {
|
|||||||
{ "ALLCALL", nbasecall + 3 },
|
{ "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){
|
QString Varicode::formatSNR(int snr){
|
||||||
if(snr < -60 || snr > 60){
|
if(snr < -60 || snr > 60){
|
||||||
return QString();
|
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'));
|
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 Varicode::parseCallsigns(QString const &input){
|
||||||
QStringList callsigns;
|
QStringList callsigns;
|
||||||
QRegularExpression re(callsign_pattern2);
|
QRegularExpression re(callsign_pattern2);
|
||||||
@ -535,6 +597,7 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi
|
|||||||
QString to = match.captured("to");
|
QString to = match.captured("to");
|
||||||
QString cmd = match.captured("cmd");
|
QString cmd = match.captured("cmd");
|
||||||
QString num = match.captured("num").trimmed();
|
QString num = match.captured("num").trimmed();
|
||||||
|
QString pwr = match.captured("pwr").trimmed();
|
||||||
|
|
||||||
int inum = -31;
|
int inum = -31;
|
||||||
bool hasnum = false;
|
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));
|
inum = qMax(-30, qMin(num.toInt(&hasnum, 10), 30));
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "match" << match.captured(0);
|
// if we are packing a PWR command, pack pwr into dbm
|
||||||
qDebug() << "groups" << from << to << cmd << num;
|
int ipwr = -31;
|
||||||
qDebug() << "packed num" << num << inum << hasnum;
|
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){
|
if(to == callsign){
|
||||||
*n = 0;
|
*n = 0;
|
||||||
@ -625,7 +698,14 @@ QStringList Varicode::unpackDirectedMessage(const QString &text){
|
|||||||
|
|
||||||
int num = (flag ? -1 : 1) * extra;
|
int num = (flag ? -1 : 1) * extra;
|
||||||
if(num != -31){
|
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;
|
return unpacked;
|
||||||
|
@ -28,6 +28,7 @@ public:
|
|||||||
//Varicode();
|
//Varicode();
|
||||||
|
|
||||||
static QString formatSNR(int snr);
|
static QString formatSNR(int snr);
|
||||||
|
static QString formatPWR(int dbm);
|
||||||
|
|
||||||
static QStringList parseCallsigns(QString const &input);
|
static QStringList parseCallsigns(QString const &input);
|
||||||
static QStringList parseGrids(QString const &input);
|
static QStringList parseGrids(QString const &input);
|
||||||
|
Loading…
Reference in New Issue
Block a user