Encoding of beacon messages that consist of compound call + (grid or arbitrary 15 bit number) + a flag (isCQ)
This commit is contained in:
parent
091b3b3ee8
commit
bf57a67c43
@ -98,7 +98,7 @@ bool DecodedText::tryUnpackCompound(){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList parts = Varicode::unpackCompoundMessage(m);
|
QStringList parts = Varicode::unpackCompoundMessage(m, nullptr);
|
||||||
|
|
||||||
if(parts.isEmpty() || parts.length() < 2){
|
if(parts.isEmpty() || parts.length() < 2){
|
||||||
return false;
|
return false;
|
||||||
|
@ -1210,6 +1210,20 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
auto packed = Varicode::packCompoundMessage(basecall, fix, prefix, 99);
|
auto packed = Varicode::packCompoundMessage(basecall, fix, prefix, 99);
|
||||||
qDebug() << packed << Varicode::unpackCompoundMessage(packed);
|
qDebug() << packed << Varicode::unpackCompoundMessage(packed);
|
||||||
|
|
||||||
|
bool isCQ = false;
|
||||||
|
|
||||||
|
auto packed = Varicode::packBeaconMessage("KN4CRD/P", "EM73", true);
|
||||||
|
qDebug() << packed << Varicode::unpackBeaconMessage(packed, &isCQ) << isCQ;
|
||||||
|
|
||||||
|
packed = Varicode::packBeaconMessage("VE3/KN4CRD", "EM73", false);
|
||||||
|
qDebug() << packed << Varicode::unpackBeaconMessage(packed, &isCQ) << isCQ;
|
||||||
|
|
||||||
|
|
||||||
|
bool isCQ = false;
|
||||||
|
|
||||||
|
auto packed = Varicode::packBeaconMessage("P/KN4CRD", "", true);
|
||||||
|
qDebug() << packed << Varicode::unpackBeaconMessage(packed, &isCQ) << isCQ;
|
||||||
|
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -5789,7 +5803,7 @@ QPair<QStringList, QStringList> MainWindow::buildFT8MessageFrames(QString const&
|
|||||||
#if 1
|
#if 1
|
||||||
qDebug() << "parsed frames:";
|
qDebug() << "parsed frames:";
|
||||||
foreach(auto frame, frames){
|
foreach(auto frame, frames){
|
||||||
qDebug() << "->" << frame << Varicode::unpackDataMessage(frame) << Varicode::unpackDirectedMessage(frame) << Varicode::unpackCompoundMessage(frame);
|
qDebug() << "->" << frame << Varicode::unpackDataMessage(frame) << Varicode::unpackDirectedMessage(frame) << Varicode::unpackCompoundMessage(frame, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "lines:";
|
qDebug() << "lines:";
|
||||||
|
58
varicode.cpp
58
varicode.cpp
@ -772,6 +772,9 @@ QPair<float, float> grid2deg(QString const &grid){
|
|||||||
// pack a 4-digit maidenhead grid locator into a 15-bit value
|
// pack a 4-digit maidenhead grid locator into a 15-bit value
|
||||||
quint16 Varicode::packGrid(QString const& grid){
|
quint16 Varicode::packGrid(QString const& grid){
|
||||||
// TODO: validate grid...
|
// TODO: validate grid...
|
||||||
|
if(grid.length() < 4){
|
||||||
|
return (1<<15)-1;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: encode non-grid data...
|
// TODO: encode non-grid data...
|
||||||
|
|
||||||
@ -784,7 +787,7 @@ quint16 Varicode::packGrid(QString const& grid){
|
|||||||
|
|
||||||
QString Varicode::unpackGrid(quint16 value){
|
QString Varicode::unpackGrid(quint16 value){
|
||||||
if(value > 180*180){
|
if(value > 180*180){
|
||||||
// TODO: decode non-grid data...
|
// TODO: decode non-grid data... for now just return an empty string...
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -802,6 +805,50 @@ bool Varicode::isCommandBuffered(const QString &cmd){
|
|||||||
return directed_cmds.contains(cmd) && buffered_cmds.contains(directed_cmds[cmd]);
|
return directed_cmds.contains(cmd) && buffered_cmds.contains(directed_cmds[cmd]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Varicode::packBeaconMessage(QString const &callsign, QString const &extra, bool isCQ){
|
||||||
|
QString frame;
|
||||||
|
|
||||||
|
auto parsedCall = QRegularExpression(compound_callsign_pattern).match(callsign);
|
||||||
|
if(!parsedCall.hasMatch()){
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString base = parsedCall.captured("base");
|
||||||
|
|
||||||
|
bool isPrefix = false;
|
||||||
|
QString fix = parsedCall.captured("prefix");
|
||||||
|
if(!fix.isEmpty()){
|
||||||
|
isPrefix = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!isPrefix){
|
||||||
|
fix = parsedCall.captured("suffix");
|
||||||
|
}
|
||||||
|
|
||||||
|
quint16 packed_extra = 180*180 + 1; // maximum grid + 1 (which will display an empty string)
|
||||||
|
if(extra.length() == 4 && QRegularExpression(grid_pattern).match(extra).hasMatch()){
|
||||||
|
packed_extra = Varicode::packGrid(extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isCQ){
|
||||||
|
packed_extra |= (1<<15);
|
||||||
|
}
|
||||||
|
|
||||||
|
return packCompoundMessage(base, fix, isPrefix, packed_extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList Varicode::unpackBeaconMessage(const QString &text, bool * isCQ){
|
||||||
|
quint16 num = 0;
|
||||||
|
|
||||||
|
QStringList unpacked = unpackCompoundMessage(text, &num);
|
||||||
|
|
||||||
|
if(isCQ) *isCQ = (num & (1<<15));
|
||||||
|
|
||||||
|
unpacked.append(Varicode::unpackGrid(num & ((1<<15)-1)));
|
||||||
|
|
||||||
|
return unpacked;
|
||||||
|
}
|
||||||
|
|
||||||
QString Varicode::packCompoundMessage(const QString &baseCallsign, const QString &fix, bool isPrefix, quint16 num){
|
QString Varicode::packCompoundMessage(const QString &baseCallsign, const QString &fix, bool isPrefix, quint16 num){
|
||||||
QString frame;
|
QString frame;
|
||||||
|
|
||||||
@ -834,7 +881,7 @@ QString Varicode::packCompoundMessage(const QString &baseCallsign, const QString
|
|||||||
return Varicode::pack64bits(Varicode::bitsToInt(bits)) + Varicode::pack5bits(packed_5 % 32);
|
return Varicode::pack64bits(Varicode::bitsToInt(bits)) + Varicode::pack5bits(packed_5 % 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Varicode::unpackCompoundMessage(const QString &text){
|
QStringList Varicode::unpackCompoundMessage(const QString &text, quint16 *pNum){
|
||||||
QStringList unpacked;
|
QStringList unpacked;
|
||||||
|
|
||||||
if(text.length() < 13 || text.contains(" ")){
|
if(text.length() < 13 || text.contains(" ")){
|
||||||
@ -856,20 +903,23 @@ QStringList Varicode::unpackCompoundMessage(const QString &text){
|
|||||||
quint8 is_prefix = Varicode::bitsToInt(Varicode::strToBits(bits.mid(2,1)));
|
quint8 is_prefix = Varicode::bitsToInt(Varicode::strToBits(bits.mid(2,1)));
|
||||||
quint32 packed_base = Varicode::bitsToInt(Varicode::strToBits(bits.mid(3, 28)));
|
quint32 packed_base = Varicode::bitsToInt(Varicode::strToBits(bits.mid(3, 28)));
|
||||||
quint32 packed_fix = Varicode::bitsToInt(Varicode::strToBits(bits.mid(31, 22)));
|
quint32 packed_fix = Varicode::bitsToInt(Varicode::strToBits(bits.mid(31, 22)));
|
||||||
quint8 packed_11 = Varicode::bitsToInt(Varicode::strToBits(bits.mid(53, 11)));
|
quint16 packed_11 = Varicode::bitsToInt(Varicode::strToBits(bits.mid(53, 11)));
|
||||||
|
|
||||||
QString base = Varicode::unpackCallsign(packed_base).trimmed();
|
QString base = Varicode::unpackCallsign(packed_base).trimmed();
|
||||||
QString fix = Varicode::unpackCallsignPrefixSuffix(packed_fix);
|
QString fix = Varicode::unpackCallsignPrefixSuffix(packed_fix);
|
||||||
quint16 num = (packed_11 << 5) | packed_5;
|
quint16 num = (packed_11 << 5) | packed_5;
|
||||||
|
|
||||||
|
if(pNum) *pNum = num;
|
||||||
|
|
||||||
if(is_prefix){
|
if(is_prefix){
|
||||||
unpacked.append(fix);
|
unpacked.append(fix);
|
||||||
}
|
}
|
||||||
|
|
||||||
unpacked.append(base);
|
unpacked.append(base);
|
||||||
|
|
||||||
if(!is_prefix){
|
if(!is_prefix){
|
||||||
unpacked.append(fix);
|
unpacked.append(fix);
|
||||||
}
|
}
|
||||||
unpacked.append(QString("%1").arg(num));
|
|
||||||
|
|
||||||
return unpacked;
|
return unpacked;
|
||||||
}
|
}
|
||||||
|
@ -83,8 +83,11 @@ public:
|
|||||||
static bool isCommandAllowed(const QString &cmd);
|
static bool isCommandAllowed(const QString &cmd);
|
||||||
static bool isCommandBuffered(const QString &cmd);
|
static bool isCommandBuffered(const QString &cmd);
|
||||||
|
|
||||||
|
static QString packBeaconMessage(QString const &callsign, QString const &extra, bool isCQ);
|
||||||
|
static QStringList unpackBeaconMessage(const QString &text, bool *isCQ);
|
||||||
|
|
||||||
static QString packCompoundMessage(const QString &baseCallsign, const QString &fix, bool isPrefix, quint16 num);
|
static QString packCompoundMessage(const QString &baseCallsign, const QString &fix, bool isPrefix, quint16 num);
|
||||||
static QStringList unpackCompoundMessage(const QString &text);
|
static QStringList unpackCompoundMessage(const QString &text, quint16 *pNum);
|
||||||
|
|
||||||
static QString packDirectedMessage(QString const& text, QString const& callsign, QString * pCmd, int *n);
|
static QString packDirectedMessage(QString const& text, QString const& callsign, QString * pCmd, int *n);
|
||||||
static QStringList unpackDirectedMessage(QString const& text);
|
static QStringList unpackDirectedMessage(QString const& text);
|
||||||
|
Loading…
Reference in New Issue
Block a user