js8call/varicode.h

183 lines
6.7 KiB
C
Raw Normal View History

2018-07-11 23:09:22 -04:00
#ifndef VARICODE_H
#define VARICODE_H
2018-07-12 09:54:56 -04:00
/**
* (C) 2018 Jordan Sherer <kn4crd@gmail.com> - All Rights Reserved
**/
#include <QBitArray>
#include <QRegularExpression>
#include <QRegExp>
2018-07-11 23:09:22 -04:00
#include <QString>
2018-07-12 09:54:56 -04:00
#include <QVector>
#include <QThread>
2018-07-11 23:09:22 -04:00
class Varicode
{
public:
// frame type transmitted via itype and decoded by the ft8 decoded
enum TransmissionType {
2018-10-04 13:52:52 -04:00
JS8Call = 0, // [000] <- any other frame of the message
JS8CallFirst = 1, // [001] <- the first frame of a message
JS8CallLast = 2, // [010] <- the last frame of a message
JS8CallReserved = 4, // [100] <- a reserved flag for future use...
};
enum FrameType {
FrameUnknown = 255, // [11111111] <- only used as a sentinel
FrameBeacon = 0, // [000]
FrameCompound = 1, // [001]
FrameCompoundDirected = 2, // [010]
FrameDirected = 3, // [011]
FrameReservedA = 4, // [100] <- Reserved for future use, likely an extension of one of these formats.
FrameDataUncompressed = 5, // [101]
FrameDataCompressed = 6, // [110]
FrameReservedB = 7, // [111] <- Reserved for future use, likely binary data / other formats.
};
static const quint8 FrameTypeMax = 7;
static QString frameTypeString(quint8 type) {
const char* FrameTypeStrings[] = {
"FrameBeacon",
"FrameCompound",
"FrameCompoundDirected",
"FrameDirected",
"FrameReservedA",
"FrameDataUncompressed",
"FrameDataCompressed",
"FrameReservedB"
};
if(type > FrameTypeMax){
return "FrameUnknown";
}
return FrameTypeStrings[type];
}
2018-07-11 23:09:22 -04:00
//Varicode();
static QString rstrip(const QString& str);
static QString lstrip(const QString& str);
static QMap<QString, QString> defaultHuffTable();
static QString cqString(int number);
static bool startsWithCQ(QString text);
2018-07-20 11:40:55 -04:00
static QString formatSNR(int snr);
2018-07-21 02:18:15 -04:00
static QString formatPWR(int dbm);
2018-07-20 11:40:55 -04:00
static QString checksum16(QString const &input);
static bool checksum16Valid(QString const &checksum, QString const &input);
static QString checksum32(QString const &input);
static bool checksum32Valid(QString const &checksum, QString const &input);
2018-07-23 08:51:29 -04:00
static QStringList parseCallsigns(QString const &input);
static QStringList parseGrids(QString const &input);
static QList<QPair<int, QVector<bool>>> huffEncode(const QMap<QString, QString> &huff, QString const& text);
static QString huffDecode(const QMap<QString, QString> &huff, QVector<bool> const& bitvec);
static QSet<QString> huffValidChars(const QMap<QString, QString> &huff);
static QVector<bool> bytesToBits(char * bitvec, int n);
2018-07-12 18:02:54 -04:00
static QVector<bool> strToBits(QString const& bitvec);
static QString bitsToStr(QVector<bool> const& bitvec);
2018-07-12 09:54:56 -04:00
2018-07-12 18:02:54 -04:00
static QVector<bool> intToBits(quint64 value, int expected=0);
static quint64 bitsToInt(QVector<bool> const value);
static quint64 bitsToInt(QVector<bool>::ConstIterator start, int n);
static QVector<bool> bitsListToBits(QList<QVector<bool>> &list);
2018-07-12 09:54:56 -04:00
2018-07-12 18:02:54 -04:00
static quint8 unpack5bits(QString const& value);
static QString pack5bits(quint8 packed);
2018-07-12 09:54:56 -04:00
2018-07-23 15:28:36 -04:00
static quint8 unpack6bits(QString const& value);
static QString pack6bits(quint8 packed);
2018-07-12 18:02:54 -04:00
static quint16 unpack16bits(QString const& value);
static QString pack16bits(quint16 packed);
2018-07-12 09:54:56 -04:00
2018-07-12 18:02:54 -04:00
static quint32 unpack32bits(QString const& value);
static QString pack32bits(quint32 packed);
static quint64 unpack64bits(QString const& value);
static QString pack64bits(quint64 packed);
2018-07-13 00:55:48 -04:00
static quint64 unpack72bits(QString const& value, quint8 *pRem);
2018-08-06 09:37:43 -04:00
static QString pack72bits(quint64 value, quint8 rem);
static quint32 packAlphaNumeric22(QString const& value, bool isFlag);
static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);
2018-07-23 15:28:36 -04:00
2018-07-13 00:55:48 -04:00
static quint32 packCallsign(QString const& value);
static QString unpackCallsign(quint32 value);
static QString deg2grid(float dlong, float dlat);
static QPair<float, float> grid2deg(QString const &grid);
2018-07-13 21:59:54 -04:00
static quint16 packGrid(QString const& value);
static QString unpackGrid(quint16 value);
static quint8 packNum(QString const &num, bool *ok);
static quint8 packPwr(QString const &pwr, bool *ok);
static quint8 packCmd(quint8 cmd, quint8 num, bool *pPackedNum);
static quint8 unpackCmd(quint8 value, quint8 *pNum);
static bool isSNRCommand(const QString &cmd);
static bool isCommandAllowed(const QString &cmd);
2018-07-25 22:49:19 -04:00
static bool isCommandBuffered(const QString &cmd);
static int isCommandChecksumed(const QString &cmd);
static QPair<QString, QString> parseCompoundCallsign(const QString &callsign, bool *pIsPrefix);
static bool isCompoundCallsign(const QString &callsign);
2018-07-29 10:39:58 -04:00
static QString packBeaconMessage(QString const &text, QString const&callsign, int *n);
static QStringList unpackBeaconMessage(const QString &text, quint8 *pType, bool *isAlt, quint8 *pBits3);
static QString packCompoundMessage(QString const &text, int *n);
static QStringList unpackCompoundMessage(const QString &text, quint8 *pType, quint8 *pBits3);
static QString packCompoundFrame(const QString &baseCallsign, const QString &fix, bool isPrefix, quint8 type, quint16 num, quint8 bits3);
static QStringList unpackCompoundFrame(const QString &text, quint8 *pType, quint16 *pNum, quint8 *pBits3);
static QString packDirectedMessage(QString const& text, QString const& callsign, QString *pTo, QString * pCmd, QString *pNum, int *n);
static QStringList unpackDirectedMessage(QString const& text, quint8 *pType);
static QString packDataMessage(QString const& text, int *n);
static QString unpackDataMessage(QString const& text, quint8 *pType);
static QStringList buildMessageFrames(
QString const& mycall,
QString const& basecall,
QString const& mygrid,
bool compound,
QString const& selectedCall,
QString const& text
);
};
class BuildMessageFramesThread : public QThread
{
Q_OBJECT
public:
BuildMessageFramesThread(QString const& mycall,
QString const& basecall,
QString const& mygrid,
bool compound,
QString const& selectedCall,
QString const& text,
QObject *parent=nullptr);
void run() override;
signals:
void resultReady(const QStringList s);
private:
QString m_mycall;
QString m_basecall;
QString m_mygrid;
bool m_compound;
QString m_selectedCall;
QString m_text;
2018-07-11 23:09:22 -04:00
};
#endif // VARICODE_H