Updated varicode to support 72 bit message lengths
This commit is contained in:
parent
e2f06a629d
commit
ba0a2fe52d
59
varicode.cpp
59
varicode.cpp
@ -738,8 +738,8 @@ QString Varicode::pack64bits(quint64 packed){
|
|||||||
return pack32bits(a) + pack32bits(b);
|
return pack32bits(a) + pack32bits(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 64 bits in pValue and 8 bits in pRem
|
// returns the first 64 bits and sets the last 8 bits in pRem
|
||||||
bool Varicode::unpack72bits(QString const& text, quint64 *pValue, quint8 *pRem){
|
quint64 Varicode::unpack72bits(QString const& text, quint8 *pRem){
|
||||||
quint64 value = 0;
|
quint64 value = 0;
|
||||||
quint8 rem = 0;
|
quint8 rem = 0;
|
||||||
quint8 mask2 = ((1<<2)-1);
|
quint8 mask2 = ((1<<2)-1);
|
||||||
@ -754,10 +754,8 @@ bool Varicode::unpack72bits(QString const& text, quint64 *pValue, quint8 *pRem){
|
|||||||
quint8 remLow = alphabet72.indexOf(text.at(11));
|
quint8 remLow = alphabet72.indexOf(text.at(11));
|
||||||
rem = ((remHigh & mask2) << 6) | remLow;
|
rem = ((remHigh & mask2) << 6) | remLow;
|
||||||
|
|
||||||
if(pValue) *pValue = value;
|
|
||||||
if(pRem) *pRem = rem;
|
if(pRem) *pRem = rem;
|
||||||
|
return value;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Varicode::pack72bits(quint64 value, quint8 rem){
|
QString Varicode::pack72bits(quint64 value, quint8 rem){
|
||||||
@ -1310,7 +1308,7 @@ QString Varicode::packCompoundFrame(const QString &baseCallsign, const QString &
|
|||||||
quint16 packed_11 = (num & mask11) >> 5;
|
quint16 packed_11 = (num & mask11) >> 5;
|
||||||
quint8 packed_5 = num & mask5;
|
quint8 packed_5 = num & mask5;
|
||||||
|
|
||||||
// [3][28][22][11],[5] = 69
|
// [3][28][22][11],[3][5] = 72
|
||||||
auto bits = (
|
auto bits = (
|
||||||
Varicode::intToBits(packed_flag, 3) +
|
Varicode::intToBits(packed_flag, 3) +
|
||||||
Varicode::intToBits(packed_base, 28) +
|
Varicode::intToBits(packed_base, 28) +
|
||||||
@ -1318,27 +1316,19 @@ QString Varicode::packCompoundFrame(const QString &baseCallsign, const QString &
|
|||||||
Varicode::intToBits(packed_11, 11)
|
Varicode::intToBits(packed_11, 11)
|
||||||
);
|
);
|
||||||
|
|
||||||
//return Varicode::pack64bits(Varicode::bitsToInt(bits)) + Varicode::pack5bits(packed_5 % 32);
|
|
||||||
|
|
||||||
return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_5 % 32);
|
return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_5 % 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Varicode::unpackCompoundFrame(const QString &text, quint8 *pType, quint16 *pNum){
|
QStringList Varicode::unpackCompoundFrame(const QString &text, quint8 *pType, quint16 *pNum){
|
||||||
QStringList unpacked;
|
QStringList unpacked;
|
||||||
|
|
||||||
if(text.length() < 13 || text.contains(" ")){
|
if(text.length() < 12 || text.contains(" ")){
|
||||||
// return unpacked;
|
return unpacked;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [3][28][22][11],[5] = 69
|
// [3][28][22][11],[3][5] = 72
|
||||||
//auto bits = Varicode::intToBits(Varicode::unpack64bits(text.left(12)), 64);
|
quint8 packed_5 = 0;
|
||||||
//quint8 packed_5 = Varicode::unpack5bits(text.right(1));
|
auto bits = Varicode::intToBits(Varicode::unpack72bits(text, &packed_5), 64);
|
||||||
|
|
||||||
quint64 value = 0;
|
|
||||||
quint8 rem = 0;
|
|
||||||
Varicode::unpack72bits(text, &value, &rem);
|
|
||||||
auto bits = Varicode::intToBits(value);
|
|
||||||
quint8 packed_5 = rem;
|
|
||||||
|
|
||||||
quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));
|
quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));
|
||||||
|
|
||||||
@ -1448,7 +1438,7 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi
|
|||||||
quint8 packed_flag = inum < 31 ? FrameDirectedNegative : FrameDirectedPositive;
|
quint8 packed_flag = inum < 31 ? FrameDirectedNegative : FrameDirectedPositive;
|
||||||
quint8 packed_extra = inum < 31 ? inum : inum - 31;
|
quint8 packed_extra = inum < 31 ? inum : inum - 31;
|
||||||
|
|
||||||
// [3][28][28][5],[5] = 69
|
// [3][28][28][5],[3][5] = 72
|
||||||
auto bits = (
|
auto bits = (
|
||||||
Varicode::intToBits(packed_flag, 3) +
|
Varicode::intToBits(packed_flag, 3) +
|
||||||
Varicode::intToBits(packed_from, 28) +
|
Varicode::intToBits(packed_from, 28) +
|
||||||
@ -1458,19 +1448,19 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi
|
|||||||
|
|
||||||
if(pCmd) *pCmd = cmd;
|
if(pCmd) *pCmd = cmd;
|
||||||
if(n) *n = match.captured(0).length();
|
if(n) *n = match.captured(0).length();
|
||||||
return Varicode::pack64bits(Varicode::bitsToInt(bits)) + Varicode::pack5bits(packed_extra % 32);
|
return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_extra % 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
|
QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
|
||||||
QStringList unpacked;
|
QStringList unpacked;
|
||||||
|
|
||||||
if(text.length() < 13 || text.contains(" ")){
|
if(text.length() < 12 || text.contains(" ")){
|
||||||
return unpacked;
|
return unpacked;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [3][28][28][5],[5] = 69
|
// [3][28][22][11],[3][5] = 72
|
||||||
auto bits = Varicode::intToBits(Varicode::unpack64bits(text.left(12)), 64);
|
quint8 extra = 0;
|
||||||
quint8 extra = Varicode::unpack5bits(text.right(1));
|
auto bits = Varicode::intToBits(Varicode::unpack72bits(text, &extra), 64);
|
||||||
|
|
||||||
int numSign = 0;
|
int numSign = 0;
|
||||||
quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));
|
quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));
|
||||||
@ -1511,9 +1501,11 @@ QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString Varicode::packDataMessage(const QString &input, int *n){
|
QString Varicode::packDataMessage(const QString &input, int *n){
|
||||||
|
static const int frameSize = 72;
|
||||||
|
|
||||||
QString frame;
|
QString frame;
|
||||||
|
|
||||||
// [3][66] = 69
|
// [3][69] = 72
|
||||||
QVector<bool> frameDataBits;
|
QVector<bool> frameDataBits;
|
||||||
|
|
||||||
QVector<bool> frameHeaderBits = Varicode::intToBits(FrameDataUnpadded, 3);
|
QVector<bool> frameHeaderBits = Varicode::intToBits(FrameDataUnpadded, 3);
|
||||||
@ -1524,7 +1516,7 @@ QString Varicode::packDataMessage(const QString &input, int *n){
|
|||||||
foreach(auto pair, Varicode::huffEncode(hufftableescaped, input)){
|
foreach(auto pair, Varicode::huffEncode(hufftableescaped, input)){
|
||||||
auto charN = pair.first;
|
auto charN = pair.first;
|
||||||
auto charBits = pair.second;
|
auto charBits = pair.second;
|
||||||
if(frameHeaderBits.length() + frameDataBits.length() + charBits.length() <= 69){
|
if(frameHeaderBits.length() + frameDataBits.length() + charBits.length() <= frameSize){
|
||||||
frameDataBits += charBits;
|
frameDataBits += charBits;
|
||||||
i += charN;
|
i += charN;
|
||||||
continue;
|
continue;
|
||||||
@ -1534,7 +1526,7 @@ QString Varicode::packDataMessage(const QString &input, int *n){
|
|||||||
|
|
||||||
QVector<bool> framePadBits;
|
QVector<bool> framePadBits;
|
||||||
|
|
||||||
int pad = 69 - frameHeaderBits.length() - frameDataBits.length();
|
int pad = frameSize - frameHeaderBits.length() - frameDataBits.length();
|
||||||
if(pad){
|
if(pad){
|
||||||
frameHeaderBits = Varicode::intToBits(FrameDataPadded, 3);
|
frameHeaderBits = Varicode::intToBits(FrameDataPadded, 3);
|
||||||
|
|
||||||
@ -1548,7 +1540,10 @@ QString Varicode::packDataMessage(const QString &input, int *n){
|
|||||||
|
|
||||||
QVector<bool> allBits = frameHeaderBits + frameDataBits + framePadBits;
|
QVector<bool> allBits = frameHeaderBits + frameDataBits + framePadBits;
|
||||||
|
|
||||||
frame = Varicode::pack64bits(Varicode::bitsToInt(allBits.constBegin(), 64)) + Varicode::pack5bits(Varicode::bitsToInt(allBits.constBegin() + 64, 5));
|
quint64 value = Varicode::bitsToInt(allBits.constBegin(), 64);
|
||||||
|
quint8 rem = (quint8)Varicode::bitsToInt(allBits.constBegin() + 64, 8);
|
||||||
|
frame = Varicode::pack72bits(value, rem);
|
||||||
|
|
||||||
*n = i;
|
*n = i;
|
||||||
|
|
||||||
return frame;
|
return frame;
|
||||||
@ -1557,11 +1552,13 @@ QString Varicode::packDataMessage(const QString &input, int *n){
|
|||||||
QString Varicode::unpackDataMessage(const QString &text, quint8 *pType){
|
QString Varicode::unpackDataMessage(const QString &text, quint8 *pType){
|
||||||
QString unpacked;
|
QString unpacked;
|
||||||
|
|
||||||
if(text.length() < 13 || text.contains(" ")){
|
if(text.length() < 12 || text.contains(" ")){
|
||||||
return unpacked;
|
return unpacked;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto bits = Varicode::intToBits(Varicode::unpack64bits(text.left(12)), 64) + Varicode::intToBits(Varicode::unpack5bits(text.right(1)), 5);
|
quint8 rem = 0;
|
||||||
|
quint64 value = Varicode::unpack72bits(text, &rem);
|
||||||
|
auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);
|
||||||
|
|
||||||
quint8 type = Varicode::bitsToInt(bits.mid(0, 3));
|
quint8 type = Varicode::bitsToInt(bits.mid(0, 3));
|
||||||
if(type == FrameDataUnpadded){
|
if(type == FrameDataUnpadded){
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
// frame type transmitted via itype and decoded by the ft8 decoded
|
// frame type transmitted via itype and decoded by the ft8 decoded
|
||||||
enum TransmissionType {
|
enum TransmissionType {
|
||||||
FT8 = 0, // [000]
|
FT8 = 0, // [000]
|
||||||
FT8Fox = 1, // [001]
|
FT8Fox = 1, // [001] <- the decoder special cases this one frequently :|
|
||||||
FT8Call = 2, // [010]
|
FT8Call = 2, // [010]
|
||||||
FT8CallLast = 3, // [011] <- used to indicate the last frame in a transmission
|
FT8CallLast = 3, // [011] <- used to indicate the last frame in a transmission
|
||||||
FT8CallFirst = 4, // [100] <- used to indicate the first frmae in a transmission
|
FT8CallFirst = 4, // [100] <- used to indicate the first frmae in a transmission
|
||||||
@ -104,7 +104,7 @@ public:
|
|||||||
static quint64 unpack64bits(QString const& value);
|
static quint64 unpack64bits(QString const& value);
|
||||||
static QString pack64bits(quint64 packed);
|
static QString pack64bits(quint64 packed);
|
||||||
|
|
||||||
static bool unpack72bits(QString const& value, quint64 *pValue, quint8 *pRem);
|
static quint64 unpack72bits(QString const& value, quint8 *pRem);
|
||||||
static QString pack72bits(quint64 value, quint8 rem);
|
static QString pack72bits(quint64 value, quint8 rem);
|
||||||
|
|
||||||
static quint32 packAlphaNumeric22(QString const& value, bool isFlag);
|
static quint32 packAlphaNumeric22(QString const& value, bool isFlag);
|
||||||
|
Loading…
Reference in New Issue
Block a user