JS8Call-Improved master
Loading...
Searching...
No Matches
Varicode.h
1#ifndef VARICODE_H
2#define VARICODE_H
3
7
8#include <QBitArray>
9#include <QRegularExpression>
10#include <QString>
11#include <QThread>
12#include <QVector>
13
14class Varicode {
15 public:
16 // extra information out of buildMessageFrames
17 struct MessageInfo {
18 QString dirTo;
19 QString dirCmd;
20 QString dirNum;
21 };
22
23 // submode types
24 enum SubmodeType {
25 JS8CallNormal = 0,
26 JS8CallFast = 1,
27 JS8CallTurbo = 2,
28 JS8CallSlow = 4,
29 JS8CallUltra = 8
30 };
31
32 // frame type transmitted via itype and decoded by the ft8 decoded
33 enum TransmissionType {
34 JS8Call = 0, // [000] <- any other frame of the message
35 JS8CallFirst = 1, // [001] <- the first frame of a message
36 JS8CallLast = 2, // [010] <- the last frame of a message
37 JS8CallData = 4, // [100] <- flagged frame (no frame type header)
38 };
39
40 /*
41
42 000 = heartbeat
43 001 = compound
44 010 = compound directed
45 011 = directed
46 1XX = data, with the X lsb bits dropped
47 */
48 enum FrameType {
49 FrameUnknown = 255, // [11111111] <- only used as a sentinel
50 FrameHeartbeat = 0, // [000]
51 FrameCompound = 1, // [001]
52 FrameCompoundDirected = 2, // [010]
53 FrameDirected = 3, // [011]
54 FrameData = 4, // [10X] // but this only encodes the first 2 msb bits
55 // and drops the lsb
56 FrameDataCompressed = 6, // [11X] // but this only encodes the first 2
57 // msb bits and drops the lsb
58 };
59
60 static const quint8 FrameTypeMax = 6;
61
62 static QString frameTypeString(quint8 type) {
63 const char *FrameTypeStrings[] = {
64 "FrameHeartbeat", "FrameCompound", "FrameCompoundDirected",
65 "FrameDirected", "FrameData",
66 "FrameUnknown", // 5
67 "FrameDataCompressed",
68 };
69
70 if (type > FrameTypeMax) {
71 return "FrameUnknown";
72 }
73 return FrameTypeStrings[type];
74 }
75
76 // Varicode();
77
78 static SubmodeType intToSubmode(int sm);
79
80 static QString extendedChars();
81
82 static QString escape(const QString &text);
83 static QString unescape(const QString &text);
84
85 static QString rstrip(const QString &str);
86 static QString lstrip(const QString &str);
87
88 static QMap<QString, QString> defaultHuffTable();
89 static QString cqString(int number);
90 static QString hbString(int number);
91 static bool startsWithCQ(QString text);
92 static bool startsWithHB(QString text);
93 static QString formatSNR(int snr);
94 static QString formatPWR(int dbm);
95
96 static QString checksum16(QString const &input);
97 static bool checksum16Valid(QString const &checksum, QString const &input);
98
99 static QString checksum32(QString const &input);
100 static bool checksum32Valid(QString const &checksum, QString const &input);
101
102 static QStringList parseCallsigns(QString const &input);
103 static QStringList parseGrids(QString const &input);
104
105 static QList<QPair<int, QVector<bool>>>
106 huffEncode(const QMap<QString, QString> &huff, QString const &text);
107 static QString huffDecode(const QMap<QString, QString> &huff,
108 QVector<bool> const &bitvec);
109 static QSet<QString> huffValidChars(const QMap<QString, QString> &huff);
110
111 static QVector<bool> bytesToBits(char *bitvec, int n);
112 static QVector<bool> strToBits(QString const &bitvec);
113 static QString bitsToStr(QVector<bool> const &bitvec);
114
115 static QVector<bool> intToBits(quint64 value, int expected = 0);
116 static quint64 bitsToInt(QVector<bool> const value);
117 static quint64 bitsToInt(QVector<bool>::ConstIterator start, int n);
118 static QVector<bool> bitsListToBits(QList<QVector<bool>> &list);
119
120 static quint8 unpack5bits(QString const &value);
121 static QString pack5bits(quint8 packed);
122
123 static quint8 unpack6bits(QString const &value);
124 static QString pack6bits(quint8 packed);
125
126 static quint16 unpack16bits(QString const &value);
127 static QString pack16bits(quint16 packed);
128
129 static quint32 unpack32bits(QString const &value);
130 static QString pack32bits(quint32 packed);
131
132 static quint64 unpack64bits(QString const &value);
133 static QString pack64bits(quint64 packed);
134
135 static quint64 unpack72bits(QString const &value, quint8 *pRem);
136 static QString pack72bits(quint64 value, quint8 rem);
137
138 static quint32 packAlphaNumeric22(QString const &value, bool isFlag);
139 static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);
140
141 static quint64 packAlphaNumeric50(QString const &value);
142 static QString unpackAlphaNumeric50(quint64 packed);
143
144 static quint32 packCallsign(QString const &value, bool *pPortable);
145 static QString unpackCallsign(quint32 value, bool portable);
146
147 static QString deg2grid(float dlong, float dlat);
148 static QPair<float, float> grid2deg(QString const &grid);
149 static quint16 packGrid(QString const &value);
150 static QString unpackGrid(quint16 value);
151
152 static quint8 packNum(QString const &num, bool *ok);
153 static quint8 packPwr(QString const &pwr, bool *ok);
154 static quint8 packCmd(quint8 cmd, quint8 num, bool *pPackedNum);
155 static quint8 unpackCmd(quint8 value, quint8 *pNum);
156
157 static bool isSNRCommand(const QString &cmd);
158 static bool isCommandAllowed(const QString &cmd);
159 static bool isCommandBuffered(const QString &cmd);
160 static int isCommandChecksumed(const QString &cmd);
161 static bool isCommandAutoreply(const QString &cmd);
162 static bool isValidCallsign(const QString &callsign, bool *pIsCompound);
163 static bool isCompoundCallsign(const QString &callsign);
164 static bool isGroupAllowed(const QString &group);
165
166 static QString packHeartbeatMessage(QString const &text,
167 QString const &callsign, int *n);
168 static QStringList unpackHeartbeatMessage(const QString &text,
169 quint8 *pType, bool *isAlt,
170 quint8 *pBits3);
171
172 static QString packCompoundMessage(QString const &text, int *n);
173 static QStringList unpackCompoundMessage(const QString &text, quint8 *pType,
174 quint8 *pBits3);
175
176 static QString packCompoundFrame(const QString &callsign, quint8 type,
177 quint16 num, quint8 bits3);
178 static QStringList unpackCompoundFrame(const QString &text, quint8 *pType,
179 quint16 *pNum, quint8 *pBits3);
180
181 static QString packDirectedMessage(QString const &text,
182 QString const &mycall, QString *pTo,
183 bool *pToCompound, QString *pCmd,
184 QString *pNum, int *n);
185 static QStringList unpackDirectedMessage(QString const &text,
186 quint8 *pType);
187
188 static QString packDataMessage(QString const &text, int *n);
189 static QString unpackDataMessage(QString const &text);
190
191 static QString packFastDataMessage(QString const &text, int *n);
192 static QString unpackFastDataMessage(QString const &text);
193
194 static QList<QPair<QString, int>>
195 buildMessageFrames(QString const &mycall, QString const &mygrid,
196 QString const &selectedCall, QString const &text,
197 bool forceIdentify, bool forceData, int submode,
198 MessageInfo *pInfo = nullptr);
199};
200
201class BuildMessageFramesThread : public QThread {
202 Q_OBJECT
203 public:
204 BuildMessageFramesThread(QString const &mycall, QString const &mygrid,
205 QString const &selectedCall, QString const &text,
206 bool forceIdentify, bool forceData, int submode,
207 QObject *parent = nullptr);
208 void run() override;
209 signals:
210 void resultReady(QString, int);
211
212 private:
213 QString m_mycall;
214 QString m_mygrid;
215 QString m_selectedCall;
216 QString m_text;
217 bool m_forceIdentify;
218 bool m_forceData;
219 int m_submode;
220};
221
222#endif // VARICODE_H
Definition Varicode.h:14
static QList< QPair< QString, int > > buildMessageFrames(QString const &mycall, QString const &mygrid, QString const &selectedCall, QString const &text, bool forceIdentify, bool forceData, int submode, MessageInfo *pInfo=nullptr)
Definition Varicode.cpp:2023
Definition Varicode.h:17