Added CRC-5 to directed messages to confirm message is valid
This commit is contained in:
parent
15d75f7397
commit
90ce372081
@ -1068,7 +1068,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
auto decoded = Varicode::huffDecode(Varicode::huffFlatten(encoded));
|
auto decoded = Varicode::huffDecode(Varicode::huffFlatten(encoded));
|
||||||
qDebug() << input << Varicode::bitsToStr(Varicode::huffFlatten(encoded)) << decoded;
|
qDebug() << input << Varicode::bitsToStr(Varicode::huffFlatten(encoded)) << decoded;
|
||||||
qDebug() << Varicode::packCallsign("JY1") << Varicode::unpackCallsign(Varicode::packCallsign("JY1"));
|
qDebug() << Varicode::packCallsign("JY1") << Varicode::unpackCallsign(Varicode::packCallsign("JY1"));
|
||||||
|
|
||||||
auto frames = buildFT8MessageFrames("OH8STN:KN4CRD?");
|
auto frames = buildFT8MessageFrames("OH8STN:KN4CRD?");
|
||||||
qDebug() << frames.first() << Varicode::unpackDirectedMessage(frames.first());
|
qDebug() << frames.first() << Varicode::unpackDirectedMessage(frames.first());
|
||||||
qDebug() << Varicode::packGrid("EM73tu") << Varicode::unpackGrid(Varicode::packGrid("EM73tu"));
|
qDebug() << Varicode::packGrid("EM73tu") << Varicode::unpackGrid(Varicode::packGrid("EM73tu"));
|
||||||
|
36
varicode.cpp
36
varicode.cpp
@ -21,6 +21,9 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
|
#define CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS
|
||||||
|
#include "crc.h"
|
||||||
|
|
||||||
#include "varicode.h"
|
#include "varicode.h"
|
||||||
|
|
||||||
const int nalphabet = 41;
|
const int nalphabet = 41;
|
||||||
@ -30,6 +33,8 @@ QString callsign_pattern1 = {R"((?<callsign>[A-Z0-9/]{2,}))"};
|
|||||||
QString callsign_pattern2 = {R"((?<callsign>(\d|[A-Z])+\/?((\d|[A-Z]){3,})(\/(\d|[A-Z])+)?(\/(\d|[A-Z])+)?))"};
|
QString callsign_pattern2 = {R"((?<callsign>(\d|[A-Z])+\/?((\d|[A-Z]){3,})(\/(\d|[A-Z])+)?(\/(\d|[A-Z])+)?))"};
|
||||||
QString callsign_pattern3 = {R"(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))"};
|
QString callsign_pattern3 = {R"(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))"};
|
||||||
QString callsign_alphabet = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ "};
|
QString callsign_alphabet = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ "};
|
||||||
|
QString directed_cmds("?$@&| ");
|
||||||
|
QRegularExpression directed_re(R"((?<from>[A-Z0-9/]+):(?<to>[A-Z0-9/]+)(?<cmd>[?$@&| ]))");
|
||||||
|
|
||||||
QMap<QChar, QString> huff = {
|
QMap<QChar, QString> huff = {
|
||||||
// char code weight
|
// char code weight
|
||||||
@ -461,12 +466,9 @@ QString Varicode::unpackGrid(quint16 value){
|
|||||||
return deg2grid(dlong, dlat).left(4);
|
return deg2grid(dlong, dlat).left(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QString directed_cmds("?$@&| ");
|
|
||||||
QRegularExpression directed_re(R"((?<from>[A-Z0-9/]+):(?<to>[A-Z0-9/]+)(?<cmd>[?$@&| ]))");
|
|
||||||
|
|
||||||
QString Varicode::packDirectedMessage(const QString &text, int *n){
|
QString Varicode::packDirectedMessage(const QString &text, int *n){
|
||||||
QString frame;
|
QString frame;
|
||||||
|
|
||||||
auto match = directed_re.match(text);
|
auto match = directed_re.match(text);
|
||||||
if(match.hasMatch()){
|
if(match.hasMatch()){
|
||||||
QString from = match.captured("from");
|
QString from = match.captured("from");
|
||||||
@ -478,19 +480,23 @@ QString Varicode::packDirectedMessage(const QString &text, int *n){
|
|||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto fromBytes = from.toLocal8Bit();
|
||||||
|
auto fromCRC = CRC::Calculate(fromBytes.data(), fromBytes.length(), CRC::CRC_5_ITU());
|
||||||
|
|
||||||
quint8 packed_flag = 0;
|
quint8 packed_flag = 0;
|
||||||
quint32 packed_from = Varicode::packCallsign(from);
|
quint32 packed_from = Varicode::packCallsign(from);
|
||||||
quint32 packed_to = Varicode::packCallsign(to);
|
quint32 packed_to = Varicode::packCallsign(to);
|
||||||
quint8 packed_cmd = directed_cmds.indexOf(cmd.at(0));
|
quint8 packed_cmd = directed_cmds.indexOf(cmd.at(0));
|
||||||
|
quint8 packed_extra = fromCRC;
|
||||||
|
|
||||||
// 3 + 28 + 28 + 5 = 64
|
// 3 + 28 + 28 + 5 = 64
|
||||||
auto bits = (
|
auto bits = (
|
||||||
Varicode::intToBits(packed_flag, 3) +
|
Varicode::intToBits(packed_flag, 3) +
|
||||||
Varicode::intToBits(packed_from, 28) +
|
Varicode::intToBits(packed_from, 28) +
|
||||||
Varicode::intToBits(packed_to, 28) +
|
Varicode::intToBits(packed_to, 28) +
|
||||||
Varicode::intToBits(packed_cmd & 7, 5)
|
Varicode::intToBits(packed_cmd & 5, 5)
|
||||||
);
|
);
|
||||||
frame = Varicode::pack64bits(Varicode::bitsToInt(bits));
|
frame = Varicode::pack64bits(Varicode::bitsToInt(bits)) + Varicode::pack5bits(packed_extra & 31);
|
||||||
*n = match.captured(0).length();
|
*n = match.captured(0).length();
|
||||||
}
|
}
|
||||||
return frame;
|
return frame;
|
||||||
@ -498,14 +504,28 @@ QString Varicode::packDirectedMessage(const QString &text, int *n){
|
|||||||
|
|
||||||
QStringList Varicode::unpackDirectedMessage(const QString &text){
|
QStringList Varicode::unpackDirectedMessage(const QString &text){
|
||||||
QStringList unpacked;
|
QStringList unpacked;
|
||||||
auto bits = Varicode::bitsToStr(Varicode::intToBits(Varicode::unpack64bits(text), 64));
|
|
||||||
|
if(text.length() < 13){
|
||||||
|
return unpacked;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto bits = Varicode::bitsToStr(Varicode::intToBits(Varicode::unpack64bits(text.left(12)), 64));
|
||||||
|
quint8 extra = Varicode::unpack5bits(text.right(1));
|
||||||
|
|
||||||
quint8 flag = Varicode::bitsToInt(Varicode::strToBits(bits.left(3)));
|
quint8 flag = Varicode::bitsToInt(Varicode::strToBits(bits.left(3)));
|
||||||
quint32 packed_from = Varicode::bitsToInt(Varicode::strToBits(bits.mid(3, 28)));
|
quint32 packed_from = Varicode::bitsToInt(Varicode::strToBits(bits.mid(3, 28)));
|
||||||
quint32 packed_to = Varicode::bitsToInt(Varicode::strToBits(bits.mid(31, 28)));
|
quint32 packed_to = Varicode::bitsToInt(Varicode::strToBits(bits.mid(31, 28)));
|
||||||
quint8 packed_cmd = Varicode::bitsToInt(Varicode::strToBits(bits.mid(59, 5)));
|
quint8 packed_cmd = Varicode::bitsToInt(Varicode::strToBits(bits.mid(59, 5)));
|
||||||
|
|
||||||
unpacked.append(Varicode::unpackCallsign(packed_from).trimmed());
|
QString from = Varicode::unpackCallsign(packed_from).trimmed();
|
||||||
|
|
||||||
|
auto fromBytes = from.toLocal8Bit();
|
||||||
|
auto fromCRC = CRC::Calculate(fromBytes.data(), fromBytes.length(), CRC::CRC_5_ITU());
|
||||||
|
if(fromCRC != extra){
|
||||||
|
return unpacked;
|
||||||
|
}
|
||||||
|
|
||||||
|
unpacked.append(from);
|
||||||
unpacked.append(Varicode::unpackCallsign(packed_to).trimmed());
|
unpacked.append(Varicode::unpackCallsign(packed_to).trimmed());
|
||||||
unpacked.append(QString(directed_cmds.at(packed_cmd & 5)));
|
unpacked.append(QString(directed_cmds.at(packed_cmd & 5)));
|
||||||
|
|
||||||
|
@ -87,7 +87,8 @@ HEADERS += qt_helpers.hpp \
|
|||||||
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp \
|
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp \
|
||||||
qorderedmap.h \
|
qorderedmap.h \
|
||||||
varicode.h \
|
varicode.h \
|
||||||
qpriorityqueue.h
|
qpriorityqueue.h \
|
||||||
|
crc.h
|
||||||
|
|
||||||
|
|
||||||
INCLUDEPATH += qmake_only
|
INCLUDEPATH += qmake_only
|
||||||
|
Loading…
Reference in New Issue
Block a user