Added callsign packing
This commit is contained in:
parent
808782b965
commit
4e0326ad6d
@ -1059,6 +1059,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
||||
auto encoded = Varicode::huffEncode(input) + QList<QVector<bool>> {Varicode::strToBits("000000000")};
|
||||
auto decoded = Varicode::huffDecode(Varicode::huffFlatten(encoded));
|
||||
qDebug() << input << Varicode::bitsToStr(Varicode::huffFlatten(encoded)) << decoded;
|
||||
qDebug() << Varicode::packCallsign("JY1") << Varicode::unpackCallsign(Varicode::packCallsign("JY1"));
|
||||
#endif
|
||||
|
||||
// this must be the last statement of constructor
|
||||
|
122
varicode.cpp
122
varicode.cpp
@ -11,6 +11,8 @@ QString alphabet = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?"};
|
||||
QString grid_pattern = {R"((?<grid>[A-R]{2}[0-9]{2})+)"};
|
||||
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_pattern3 = {R"(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))"};
|
||||
QString callsign_alphabet = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ "};
|
||||
|
||||
QMap<QChar, QString> huff = {
|
||||
// char code weight
|
||||
@ -64,6 +66,14 @@ QMap<QChar, QString> huff = {
|
||||
|
||||
QChar huffeot = '\x04';
|
||||
|
||||
quint32 nbasecall = 37 * 36 * 10 * 27 * 27 * 27;
|
||||
|
||||
QMap<QString, quint32> basecalls = {
|
||||
{ "CQ DX", nbasecall + 1 },
|
||||
{ "CQCQCQ", nbasecall + 2 },
|
||||
{ "ALLCALL", nbasecall + 3 },
|
||||
};
|
||||
|
||||
QStringList Varicode::parseCallsigns(QString const &input){
|
||||
QStringList callsigns;
|
||||
QRegularExpression re(callsign_pattern2);
|
||||
@ -216,8 +226,6 @@ QString Varicode::pack16bits(quint16 packed){
|
||||
tmp = packed % nalphabet;
|
||||
out.append(alphabet.at(tmp));
|
||||
|
||||
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
@ -240,3 +248,113 @@ QString Varicode::pack64bits(quint64 packed){
|
||||
quint32 b = packed & 0xFFFFFFFF;
|
||||
return pack32bits(a) + pack32bits(b);
|
||||
}
|
||||
|
||||
quint32 Varicode::packCallsign(QString const& value){
|
||||
quint32 packed = 0;
|
||||
|
||||
QString callsign = value.toUpper().trimmed();
|
||||
|
||||
if(basecalls.contains(callsign)){
|
||||
return basecalls[callsign];
|
||||
}
|
||||
|
||||
// workaround for swaziland
|
||||
if(callsign.startsWith("3DA0")){
|
||||
callsign = "3D0" + callsign.mid(4);
|
||||
}
|
||||
|
||||
// workaround for guinea
|
||||
if(callsign.startsWith("3X") && 'A' <= callsign.at(2) && callsign.at(2) <= 'Z'){
|
||||
callsign = "Q" + callsign.mid(2);
|
||||
}
|
||||
|
||||
int slen = callsign.length();
|
||||
if(slen < 2){
|
||||
return packed;
|
||||
}
|
||||
|
||||
if(slen > 6){
|
||||
return packed;
|
||||
}
|
||||
|
||||
QStringList permutations = { callsign };
|
||||
if(slen == 2){
|
||||
permutations.append(" " + callsign + " ");
|
||||
}
|
||||
if(slen == 3){
|
||||
permutations.append(" " + callsign + " ");
|
||||
permutations.append(callsign + " ");
|
||||
}
|
||||
if(slen == 4){
|
||||
permutations.append(" " + callsign + " ");
|
||||
permutations.append(callsign + " ");
|
||||
}
|
||||
if(slen == 5){
|
||||
permutations.append(" " + callsign);
|
||||
permutations.append(callsign + " ");
|
||||
}
|
||||
|
||||
QString matched;
|
||||
QRegularExpression m(callsign_pattern3);
|
||||
foreach(auto permutation, permutations){
|
||||
auto match = m.match(permutation);
|
||||
if(match.hasMatch()){
|
||||
matched = match.captured(0);
|
||||
}
|
||||
}
|
||||
if(matched.isEmpty()){
|
||||
return packed;
|
||||
}
|
||||
|
||||
packed = callsign_alphabet.indexOf(matched.at(0));
|
||||
packed = 36*packed + callsign_alphabet.indexOf(matched.at(1));
|
||||
packed = 10*packed + callsign_alphabet.indexOf(matched.at(2));
|
||||
packed = 27*packed + callsign_alphabet.indexOf(matched.at(3)) - 10;
|
||||
packed = 27*packed + callsign_alphabet.indexOf(matched.at(4)) - 10;
|
||||
packed = 27*packed + callsign_alphabet.indexOf(matched.at(5)) - 10;
|
||||
|
||||
return packed;
|
||||
}
|
||||
|
||||
QString Varicode::unpackCallsign(quint32 value){
|
||||
foreach(auto key, basecalls.keys()){
|
||||
if(basecalls[key] == value){
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
||||
QChar word[6];
|
||||
quint32 tmp = value % 27 + 10;
|
||||
word[5] = callsign_alphabet.at(tmp);
|
||||
value = value/27;
|
||||
|
||||
tmp = value % 27 + 10;
|
||||
word[4] = callsign_alphabet.at(tmp);
|
||||
value = value/27;
|
||||
|
||||
tmp = value % 27 + 10;
|
||||
word[3] = callsign_alphabet.at(tmp);
|
||||
value = value/27;
|
||||
|
||||
tmp = value % 10;
|
||||
word[2] = callsign_alphabet.at(tmp);
|
||||
value = value/10;
|
||||
|
||||
tmp = value % 36;
|
||||
word[1] = callsign_alphabet.at(tmp);
|
||||
value = value/36;
|
||||
|
||||
tmp = value;
|
||||
word[0] = callsign_alphabet.at(tmp);
|
||||
|
||||
QString callsign(word, 6);
|
||||
if(callsign.startsWith("3D0")){
|
||||
callsign = "3DA0" + callsign.mid(3);
|
||||
}
|
||||
|
||||
if(callsign.startsWith("Q") and 'A' <= callsign.at(1) && callsign.at(1) <= 'Z'){
|
||||
callsign = "3X" + callsign.mid(1);
|
||||
}
|
||||
|
||||
return callsign;
|
||||
}
|
||||
|
@ -41,6 +41,10 @@ public:
|
||||
|
||||
static quint64 unpack64bits(QString const& value);
|
||||
static QString pack64bits(quint64 packed);
|
||||
|
||||
static quint32 packCallsign(QString const& value);
|
||||
static QString unpackCallsign(quint32 value);
|
||||
|
||||
};
|
||||
|
||||
#endif // VARICODE_H
|
||||
|
Loading…
Reference in New Issue
Block a user