@@ -329,6 +329,16 @@ void DevUBLOXGNSS::end(void)
329
329
packetUBXNAVSAT = nullptr;
330
330
}
331
331
332
+ if (packetUBXNAVSIG != nullptr)
333
+ {
334
+ if (packetUBXNAVSIG->callbackData != nullptr)
335
+ {
336
+ delete packetUBXNAVSIG->callbackData;
337
+ }
338
+ delete packetUBXNAVSIG;
339
+ packetUBXNAVSIG = nullptr;
340
+ }
341
+
332
342
if (packetUBXRXMPMP != nullptr)
333
343
{
334
344
if (packetUBXRXMPMP->callbackData != nullptr)
@@ -1409,6 +1419,12 @@ bool DevUBLOXGNSS::autoLookup(uint8_t Class, uint8_t ID, uint16_t *maxSize)
1409
1419
*maxSize = UBX_NAV_SAT_MAX_LEN;
1410
1420
return (packetUBXNAVSAT != nullptr);
1411
1421
}
1422
+ else if (ID == UBX_NAV_SIG)
1423
+ {
1424
+ if (maxSize != nullptr)
1425
+ *maxSize = UBX_NAV_SIG_MAX_LEN;
1426
+ return (packetUBXNAVSIG != nullptr);
1427
+ }
1412
1428
#endif
1413
1429
break;
1414
1430
case UBX_CLASS_RXM:
@@ -3868,6 +3884,49 @@ void DevUBLOXGNSS::processUBXpacket(ubxPacket *msg)
3868
3884
}
3869
3885
}
3870
3886
}
3887
+ else if (msg->id == UBX_NAV_SIG) // Note: length is variable
3888
+ {
3889
+ // Parse various byte fields into storage - but only if we have memory allocated for it
3890
+ if (packetUBXNAVSIG != nullptr)
3891
+ {
3892
+ packetUBXNAVSIG->data.header.iTOW = extractLong(msg, 0);
3893
+ packetUBXNAVSIG->data.header.version = extractByte(msg, 4);
3894
+ packetUBXNAVSIG->data.header.numSigs = extractByte(msg, 5);
3895
+
3896
+ // The NAV SIG message could potentially contain data for 255 signals. (numSigs is uint8_t. UBX_NAV_SIG_MAX_BLOCKS is 92)
3897
+ for (uint16_t i = 0; (i < UBX_NAV_SIG_MAX_BLOCKS) && (i < ((uint16_t)packetUBXNAVSIG->data.header.numSigs)) && ((i * 16) < (msg->len - 8)); i++)
3898
+ {
3899
+ uint16_t offset = (i * 16) + 8;
3900
+ packetUBXNAVSIG->data.blocks[i].gnssId = extractByte(msg, offset + 0);
3901
+ packetUBXNAVSIG->data.blocks[i].svId = extractByte(msg, offset + 1);
3902
+ packetUBXNAVSIG->data.blocks[i].sigId = extractByte(msg, offset + 2);
3903
+ packetUBXNAVSIG->data.blocks[i].freqId = extractByte(msg, offset + 3);
3904
+ packetUBXNAVSIG->data.blocks[i].prRes = extractSignedInt(msg, offset + 4);
3905
+ packetUBXNAVSIG->data.blocks[i].cno = extractByte(msg, offset + 6);
3906
+ packetUBXNAVSIG->data.blocks[i].qualityInd = extractByte(msg, offset + 7);
3907
+ packetUBXNAVSIG->data.blocks[i].corrSource = extractByte(msg, offset + 8);
3908
+ packetUBXNAVSIG->data.blocks[i].ionoModel = extractByte(msg, offset + 9);
3909
+ packetUBXNAVSIG->data.blocks[i].sigFlags.all = extractInt(msg, offset + 10);
3910
+ }
3911
+
3912
+ // Mark all datums as fresh (not read before)
3913
+ packetUBXNAVSIG->moduleQueried = true;
3914
+
3915
+ // Check if we need to copy the data for the callback
3916
+ if ((packetUBXNAVSIG->callbackData != nullptr) // If RAM has been allocated for the copy of the data
3917
+ && (packetUBXNAVSIG->automaticFlags.flags.bits.callbackCopyValid == false)) // AND the data is stale
3918
+ {
3919
+ memcpy(&packetUBXNAVSIG->callbackData->header.iTOW, &packetUBXNAVSIG->data.header.iTOW, sizeof(UBX_NAV_SIG_data_t));
3920
+ packetUBXNAVSIG->automaticFlags.flags.bits.callbackCopyValid = true;
3921
+ }
3922
+
3923
+ // Check if we need to copy the data into the file buffer
3924
+ if (packetUBXNAVSIG->automaticFlags.flags.bits.addToFileBuffer)
3925
+ {
3926
+ addedToFileBuffer = storePacket(msg);
3927
+ }
3928
+ }
3929
+ }
3871
3930
#endif
3872
3931
else if (msg->id == UBX_NAV_RELPOSNED && ((msg->len == UBX_NAV_RELPOSNED_LEN) || (msg->len == UBX_NAV_RELPOSNED_LEN_F9)))
3873
3932
{
@@ -5747,6 +5806,17 @@ void DevUBLOXGNSS::checkCallbacks(void)
5747
5806
}
5748
5807
packetUBXNAVSAT->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
5749
5808
}
5809
+
5810
+ if (packetUBXNAVSIG != nullptr) // If RAM has been allocated for message storage
5811
+ if (packetUBXNAVSIG->callbackData != nullptr) // If RAM has been allocated for the copy of the data
5812
+ if (packetUBXNAVSIG->automaticFlags.flags.bits.callbackCopyValid == true) // If the copy of the data is valid
5813
+ {
5814
+ if (packetUBXNAVSIG->callbackPointerPtr != nullptr) // If the pointer to the callback has been defined
5815
+ {
5816
+ packetUBXNAVSIG->callbackPointerPtr(packetUBXNAVSIG->callbackData); // Call the callback
5817
+ }
5818
+ packetUBXNAVSIG->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
5819
+ }
5750
5820
#endif
5751
5821
5752
5822
if (packetUBXNAVRELPOSNED != nullptr) // If RAM has been allocated for message storage
@@ -12958,6 +13028,177 @@ void DevUBLOXGNSS::logNAVSAT(bool enabled)
12958
13028
return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
12959
13029
packetUBXNAVSAT->automaticFlags.flags.bits.addToFileBuffer = (uint8_t)enabled;
12960
13030
}
13031
+
13032
+ // ***** NAV SIG automatic support
13033
+
13034
+ // Signal information
13035
+ // Returns true if commands was successful
13036
+ bool DevUBLOXGNSS::getNAVSIG(uint16_t maxWait)
13037
+ {
13038
+ if (packetUBXNAVSIG == nullptr)
13039
+ initPacketUBXNAVSIG(); // Check that RAM has been allocated for the NAVSIG data
13040
+ if (packetUBXNAVSIG == nullptr) // Bail if the RAM allocation failed
13041
+ return (false);
13042
+
13043
+ if (packetUBXNAVSIG->automaticFlags.flags.bits.automatic && packetUBXNAVSIG->automaticFlags.flags.bits.implicitUpdate)
13044
+ {
13045
+ // The GPS is automatically reporting, we just check whether we got unread data
13046
+ checkUbloxInternal(&packetCfg, 0, 0); // Call checkUbloxInternal to parse any incoming data. Don't overwrite the requested Class and ID
13047
+ return packetUBXNAVSIG->moduleQueried;
13048
+ }
13049
+ else if (packetUBXNAVSIG->automaticFlags.flags.bits.automatic && !packetUBXNAVSIG->automaticFlags.flags.bits.implicitUpdate)
13050
+ {
13051
+ // Someone else has to call checkUblox for us...
13052
+ return (false);
13053
+ }
13054
+ else
13055
+ {
13056
+ // The GPS is not automatically reporting NAVSIG so we have to poll explicitly
13057
+ packetCfg.cls = UBX_CLASS_NAV;
13058
+ packetCfg.id = UBX_NAV_SIG;
13059
+ packetCfg.len = 0;
13060
+ packetCfg.startingSpot = 0;
13061
+
13062
+ // The data is parsed as part of processing the response
13063
+ sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait);
13064
+
13065
+ if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED)
13066
+ return (true);
13067
+
13068
+ if (retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN)
13069
+ {
13070
+ return (true);
13071
+ }
13072
+
13073
+ return (false);
13074
+ }
13075
+ }
13076
+
13077
+ // Enable or disable automatic NAVSIG message generation by the GNSS. This changes the way getNAVSIG
13078
+ // works.
13079
+ bool DevUBLOXGNSS::setAutoNAVSIG(bool enable, uint8_t layer, uint16_t maxWait)
13080
+ {
13081
+ return setAutoNAVSIGrate(enable ? 1 : 0, true, layer, maxWait);
13082
+ }
13083
+
13084
+ // Enable or disable automatic NAVSIG message generation by the GNSS. This changes the way getNAVSIG
13085
+ // works.
13086
+ bool DevUBLOXGNSS::setAutoNAVSIG(bool enable, bool implicitUpdate, uint8_t layer, uint16_t maxWait)
13087
+ {
13088
+ return setAutoNAVSIGrate(enable ? 1 : 0, implicitUpdate, layer, maxWait);
13089
+ }
13090
+
13091
+ // Enable or disable automatic NAV SAT message generation by the GNSS. This changes the way getNAVSIG
13092
+ // works.
13093
+ bool DevUBLOXGNSS::setAutoNAVSIGrate(uint8_t rate, bool implicitUpdate, uint8_t layer, uint16_t maxWait)
13094
+ {
13095
+ if (packetUBXNAVSIG == nullptr)
13096
+ initPacketUBXNAVSIG(); // Check that RAM has been allocated for the data
13097
+ if (packetUBXNAVSIG == nullptr) // Only attempt this if RAM allocation was successful
13098
+ return false;
13099
+
13100
+ if (rate > 127)
13101
+ rate = 127;
13102
+
13103
+ uint32_t key = UBLOX_CFG_MSGOUT_UBX_NAV_SIG_I2C;
13104
+ if (_commType == COMM_TYPE_SPI)
13105
+ key = UBLOX_CFG_MSGOUT_UBX_NAV_SIG_SPI;
13106
+ else if (_commType == COMM_TYPE_SERIAL)
13107
+ {
13108
+ if (!_UART2)
13109
+ key = UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART1;
13110
+ else
13111
+ key = UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART2;
13112
+ }
13113
+
13114
+ bool ok = setVal8(key, rate, layer, maxWait);
13115
+ if (ok)
13116
+ {
13117
+ packetUBXNAVSIG->automaticFlags.flags.bits.automatic = (rate > 0);
13118
+ packetUBXNAVSIG->automaticFlags.flags.bits.implicitUpdate = implicitUpdate;
13119
+ }
13120
+ packetUBXNAVSIG->moduleQueried = false; // Mark data as stale
13121
+ return ok;
13122
+ }
13123
+
13124
+ // Enable automatic navigation message generation by the GNSS.
13125
+ bool DevUBLOXGNSS::setAutoNAVSIGcallbackPtr(void (*callbackPointerPtr)(UBX_NAV_SIG_data_t *), uint8_t layer, uint16_t maxWait)
13126
+ {
13127
+ // Enable auto messages. Set implicitUpdate to false as we expect the user to call checkUblox manually.
13128
+ bool result = setAutoNAVSIG(true, false, layer, maxWait);
13129
+ if (!result)
13130
+ return (result); // Bail if setAuto failed
13131
+
13132
+ if (packetUBXNAVSIG->callbackData == nullptr) // Check if RAM has been allocated for the callback copy
13133
+ {
13134
+ packetUBXNAVSIG->callbackData = new UBX_NAV_SIG_data_t; // Allocate RAM for the main struct
13135
+ }
13136
+
13137
+ if (packetUBXNAVSIG->callbackData == nullptr)
13138
+ {
13139
+ #ifndef SFE_UBLOX_REDUCED_PROG_MEM
13140
+ if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
13141
+ _debugSerial.println(F("setAutoNAVSIGcallbackPtr: RAM alloc failed!"));
13142
+ #endif
13143
+ return (false);
13144
+ }
13145
+
13146
+ packetUBXNAVSIG->callbackPointerPtr = callbackPointerPtr;
13147
+ return (true);
13148
+ }
13149
+
13150
+ // In case no config access to the GNSS is possible and NAV SAT is send cyclically already
13151
+ // set config to suitable parameters
13152
+ bool DevUBLOXGNSS::assumeAutoNAVSIG(bool enabled, bool implicitUpdate)
13153
+ {
13154
+ if (packetUBXNAVSIG == nullptr)
13155
+ initPacketUBXNAVSIG(); // Check that RAM has been allocated for the NAVSIG data
13156
+ if (packetUBXNAVSIG == nullptr) // Bail if the RAM allocation failed
13157
+ return (false);
13158
+
13159
+ bool changes = packetUBXNAVSIG->automaticFlags.flags.bits.automatic != enabled || packetUBXNAVSIG->automaticFlags.flags.bits.implicitUpdate != implicitUpdate;
13160
+ if (changes)
13161
+ {
13162
+ packetUBXNAVSIG->automaticFlags.flags.bits.automatic = enabled;
13163
+ packetUBXNAVSIG->automaticFlags.flags.bits.implicitUpdate = implicitUpdate;
13164
+ }
13165
+ return changes;
13166
+ }
13167
+
13168
+ // PRIVATE: Allocate RAM for packetUBXNAVSIG and initialize it
13169
+ bool DevUBLOXGNSS::initPacketUBXNAVSIG()
13170
+ {
13171
+ packetUBXNAVSIG = new UBX_NAV_SIG_t; // Allocate RAM for the main struct
13172
+ if (packetUBXNAVSIG == nullptr)
13173
+ {
13174
+ #ifndef SFE_UBLOX_REDUCED_PROG_MEM
13175
+ if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
13176
+ _debugSerial.println(F("initPacketUBXNAVSIG: RAM alloc failed!"));
13177
+ #endif
13178
+ return (false);
13179
+ }
13180
+ packetUBXNAVSIG->automaticFlags.flags.all = 0;
13181
+ packetUBXNAVSIG->callbackPointerPtr = nullptr;
13182
+ packetUBXNAVSIG->callbackData = nullptr;
13183
+ packetUBXNAVSIG->moduleQueried = false;
13184
+ return (true);
13185
+ }
13186
+
13187
+ // Mark all the data as read/stale
13188
+ void DevUBLOXGNSS::flushNAVSIG()
13189
+ {
13190
+ if (packetUBXNAVSIG == nullptr)
13191
+ return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
13192
+ packetUBXNAVSIG->moduleQueried = false; // Mark all datums as stale (read before)
13193
+ }
13194
+
13195
+ // Log this data in file buffer
13196
+ void DevUBLOXGNSS::logNAVSIG(bool enabled)
13197
+ {
13198
+ if (packetUBXNAVSIG == nullptr)
13199
+ return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
13200
+ packetUBXNAVSIG->automaticFlags.flags.bits.addToFileBuffer = (uint8_t)enabled;
13201
+ }
12961
13202
#endif
12962
13203
12963
13204
// ***** NAV RELPOSNED automatic support
0 commit comments