18 if (sentence.size() < 6 || sentence.at(0) !=
'$') {
21 const int star = sentence.lastIndexOf(
'*');
22 if (star < 2 || star + 3 > sentence.size()) {
25 const QByteArray body = sentence.mid(1, star - 1);
26 const QByteArray expected = QByteArray::number(
computeChecksum(body), 16).rightJustified(2,
'0').toUpper();
27 const QByteArray actual = sentence.mid(star + 1, 2).toUpper();
28 return actual == expected;
33 QByteArray line = sentence;
35 if (line.size() >= 5 && line.at(0) ==
'$') {
36 int star = line.lastIndexOf(
'*');
38 const QByteArray body = line.mid(1, star - 1);
39 const QByteArray calcCks = QByteArray::number(
computeChecksum(body), 16).rightJustified(2,
'0').toUpper();
41 bool needsRepair =
false;
42 if (star + 3 > line.size()) {
45 const QByteArray txCks = line.mid(star + 1, 2).toUpper();
46 if (txCks != calcCks) {
52 line = line.left(star + 1) + calcCks;
55 const QByteArray body = line.mid(1);
56 const QByteArray calcCks = QByteArray::number(
computeChecksum(body), 16).rightJustified(2,
'0').toUpper();
57 line.append(
'*').append(calcCks);
61 if (!line.endsWith(
"\r\n")) {
68QByteArray
makeGGA(
const QGeoCoordinate& coord,
double altitudeMsl,
int fixQuality,
int numSatellites)
70 const QTime utc = QDateTime::currentDateTimeUtc().time();
72 hhmmss += QByteArray::number(utc.hour()).rightJustified(2,
'0');
73 hhmmss += QByteArray::number(utc.minute()).rightJustified(2,
'0');
74 hhmmss += QByteArray::number(utc.second()).rightJustified(2,
'0');
76 auto dmm = [](
double deg,
bool lat) -> QByteArray {
77 const double a = qFabs(deg);
78 int d =
static_cast<int>(a);
79 double m = (a - d) * 60.0;
81 const int m10000 =
static_cast<int>(m * 10000.0 + 0.5);
82 double mRounded = m10000 / 10000.0;
83 if (mRounded >= 60.0) {
88 QByteArray mm = QByteArray::number(mRounded,
'f', 4);
89 if (mRounded < 10.0) {
93 const int dWidth = lat ? 2 : 3;
94 return QByteArray::number(d).rightJustified(dWidth,
'0') + mm;
97 const bool latNorth = coord.latitude() >= 0.0;
98 const bool lonEast = coord.longitude() >= 0.0;
100 const QByteArray latField = dmm(coord.latitude(),
true);
101 const QByteArray lonField = dmm(coord.longitude(),
false);
105 core += hhmmss +
',';
106 core += latField +
',';
107 core += (latNorth ?
"N" :
"S");
109 core += lonField +
',';
110 core += (lonEast ?
"E" :
"W");
111 core +=
',' + QByteArray::number(fixQuality) +
',' + QByteArray::number(numSatellites) +
",1.0,";
112 core += QByteArray::number(altitudeMsl,
'f', 1);
113 core +=
",M,0.0,M,,";
119 sentence += QByteArray::number(
computeChecksum(core), 16).rightJustified(2,
'0').toUpper();