v2.2.15
This commit is contained in:
@@ -4216,16 +4216,13 @@ void SFE_UBLOX_GNSS::processUBXpacket(ubxPacket *msg)
|
||||
packetUBXESFMEAS->data.timeTag = extractLong(msg, 0);
|
||||
packetUBXESFMEAS->data.flags.all = extractInt(msg, 4);
|
||||
packetUBXESFMEAS->data.id = extractInt(msg, 6);
|
||||
for (uint16_t i = 0; (i < DEF_NUM_SENS) && (i < packetUBXESFMEAS->data.flags.bits.numMeas) && ((i * 4) < (msg->len - 8)); i++)
|
||||
for (uint16_t i = 0; (i < DEF_MAX_NUM_ESF_MEAS) && (i < packetUBXESFMEAS->data.flags.bits.numMeas) && ((i * 4) < (msg->len - 8)); i++)
|
||||
{
|
||||
packetUBXESFMEAS->data.data[i].data.all = extractLong(msg, 8 + (i * 4));
|
||||
}
|
||||
if ((uint16_t)msg->len > (uint16_t)(8 + (packetUBXESFMEAS->data.flags.bits.numMeas * 4)))
|
||||
packetUBXESFMEAS->data.calibTtag = extractLong(msg, 8 + (packetUBXESFMEAS->data.flags.bits.numMeas * 4));
|
||||
|
||||
// Mark all datums as fresh (not read before)
|
||||
packetUBXESFMEAS->moduleQueried.moduleQueried.all = 0xFFFFFFFF;
|
||||
|
||||
// Check if we need to copy the data for the callback
|
||||
if ((packetUBXESFMEAS->callbackData != NULL) // If RAM has been allocated for the copy of the data
|
||||
&& (packetUBXESFMEAS->automaticFlags.flags.bits.callbackCopyValid == false)) // AND the data is stale
|
||||
@@ -14515,92 +14512,19 @@ void SFE_UBLOX_GNSS::logESFINS(bool enabled)
|
||||
|
||||
// ***** ESF MEAS automatic support
|
||||
|
||||
bool SFE_UBLOX_GNSS::getEsfDataInfo(uint16_t maxWait)
|
||||
{
|
||||
return (getESFMEAS(maxWait));
|
||||
}
|
||||
|
||||
bool SFE_UBLOX_GNSS::getESFMEAS(uint16_t maxWait)
|
||||
{
|
||||
if (packetUBXESFMEAS == NULL)
|
||||
initPacketUBXESFMEAS(); // Check that RAM has been allocated for the ESF MEAS data
|
||||
if (packetUBXESFMEAS == NULL) // Only attempt this if RAM allocation was successful
|
||||
return false;
|
||||
|
||||
if (packetUBXESFMEAS->automaticFlags.flags.bits.automatic && packetUBXESFMEAS->automaticFlags.flags.bits.implicitUpdate)
|
||||
{
|
||||
// The GPS is automatically reporting, we just check whether we got unread data
|
||||
// if (_printDebug == true)
|
||||
// {
|
||||
// _debugSerial->println(F("getEsfDataInfo: Autoreporting"));
|
||||
// }
|
||||
checkUbloxInternal(&packetCfg, UBX_CLASS_ESF, UBX_ESF_MEAS);
|
||||
return packetUBXESFMEAS->moduleQueried.moduleQueried.bits.all;
|
||||
}
|
||||
else if (packetUBXESFMEAS->automaticFlags.flags.bits.automatic && !packetUBXESFMEAS->automaticFlags.flags.bits.implicitUpdate)
|
||||
{
|
||||
// Someone else has to call checkUblox for us...
|
||||
// if (_printDebug == true)
|
||||
// {
|
||||
// _debugSerial->println(F("getEsfDataInfo: Exit immediately"));
|
||||
// }
|
||||
return (false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (_printDebug == true)
|
||||
// {
|
||||
// _debugSerial->println(F("getEsfDataInfo: Polling"));
|
||||
// }
|
||||
|
||||
// The GPS is not automatically reporting HNR PVT so we have to poll explicitly
|
||||
packetCfg.cls = UBX_CLASS_ESF;
|
||||
packetCfg.id = UBX_ESF_MEAS;
|
||||
packetCfg.len = 0;
|
||||
packetCfg.startingSpot = 0;
|
||||
|
||||
// The data is parsed as part of processing the response
|
||||
sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait);
|
||||
|
||||
if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED)
|
||||
return (true);
|
||||
|
||||
if (retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN)
|
||||
{
|
||||
// if (_printDebug == true)
|
||||
// {
|
||||
// _debugSerial->println(F("getEsfDataInfo: data in packetCfg was OVERWRITTEN by another message (but that's OK)"));
|
||||
// }
|
||||
return (true);
|
||||
}
|
||||
|
||||
// if (_printDebug == true)
|
||||
// {
|
||||
// _debugSerial->print(F("getEsfDataInfo retVal: "));
|
||||
// _debugSerial->println(statusString(retVal));
|
||||
// }
|
||||
return (false);
|
||||
}
|
||||
|
||||
return (false); // Trap. We should never get here...
|
||||
}
|
||||
|
||||
// Enable or disable automatic ESF MEAS message generation by the GNSS. This changes the way getESFDataInfo
|
||||
// works.
|
||||
// Enable or disable automatic ESF MEAS message generation by the GNSS
|
||||
bool SFE_UBLOX_GNSS::setAutoESFMEAS(bool enable, uint16_t maxWait)
|
||||
{
|
||||
return setAutoESFMEASrate(enable ? 1 : 0, true, maxWait);
|
||||
}
|
||||
|
||||
// Enable or disable automatic ESF MEAS message generation by the GNSS. This changes the way getESFDataInfo
|
||||
// works.
|
||||
// Enable or disable automatic ESF MEAS message generation by the GNSS
|
||||
bool SFE_UBLOX_GNSS::setAutoESFMEAS(bool enable, bool implicitUpdate, uint16_t maxWait)
|
||||
{
|
||||
return setAutoESFMEASrate(enable ? 1 : 0, implicitUpdate, maxWait);
|
||||
}
|
||||
|
||||
// Enable or disable automatic ESF MEAS message generation by the GNSS. This changes the way getESFDataInfo
|
||||
// works.
|
||||
// Enable or disable automatic ESF MEAS message generation by the GNSS
|
||||
bool SFE_UBLOX_GNSS::setAutoESFMEASrate(uint8_t rate, bool implicitUpdate, uint16_t maxWait)
|
||||
{
|
||||
if (packetUBXESFMEAS == NULL)
|
||||
@@ -14625,7 +14549,6 @@ bool SFE_UBLOX_GNSS::setAutoESFMEASrate(uint8_t rate, bool implicitUpdate, uint1
|
||||
packetUBXESFMEAS->automaticFlags.flags.bits.automatic = (rate > 0);
|
||||
packetUBXESFMEAS->automaticFlags.flags.bits.implicitUpdate = implicitUpdate;
|
||||
}
|
||||
packetUBXESFMEAS->moduleQueried.moduleQueried.bits.all = false; // Mark data as stale
|
||||
return ok;
|
||||
}
|
||||
|
||||
@@ -14714,18 +14637,9 @@ bool SFE_UBLOX_GNSS::initPacketUBXESFMEAS()
|
||||
packetUBXESFMEAS->callbackPointer = NULL;
|
||||
packetUBXESFMEAS->callbackPointerPtr = NULL;
|
||||
packetUBXESFMEAS->callbackData = NULL;
|
||||
packetUBXESFMEAS->moduleQueried.moduleQueried.all = 0;
|
||||
return (true);
|
||||
}
|
||||
|
||||
// Mark all the data as read/stale
|
||||
void SFE_UBLOX_GNSS::flushESFMEAS()
|
||||
{
|
||||
if (packetUBXESFMEAS == NULL)
|
||||
return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
|
||||
packetUBXESFMEAS->moduleQueried.moduleQueried.all = 0; // Mark all datums as stale (read before)
|
||||
}
|
||||
|
||||
// Log this data in file buffer
|
||||
void SFE_UBLOX_GNSS::logESFMEAS(bool enabled)
|
||||
{
|
||||
@@ -14868,13 +14782,6 @@ bool SFE_UBLOX_GNSS::initPacketUBXESFRAW()
|
||||
return (true);
|
||||
}
|
||||
|
||||
// Mark all the data as read/stale
|
||||
void SFE_UBLOX_GNSS::flushESFRAW()
|
||||
{
|
||||
if (packetUBXESFRAW == NULL)
|
||||
return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
|
||||
}
|
||||
|
||||
// Log this data in file buffer
|
||||
void SFE_UBLOX_GNSS::logESFRAW(bool enabled)
|
||||
{
|
||||
@@ -18046,21 +17953,6 @@ float SFE_UBLOX_GNSS::getESFyaw(uint16_t maxWait) // Returned as degrees
|
||||
return (((float)packetUBXESFALG->data.yaw) / 100.0); // Convert to degrees
|
||||
}
|
||||
|
||||
bool SFE_UBLOX_GNSS::getSensorFusionMeasurement(UBX_ESF_MEAS_sensorData_t *sensorData, uint8_t sensor, uint16_t maxWait)
|
||||
{
|
||||
if (packetUBXESFMEAS == NULL)
|
||||
initPacketUBXESFMEAS(); // Check that RAM has been allocated for the ESF MEAS data
|
||||
if (packetUBXESFMEAS == NULL) // Bail if the RAM allocation failed
|
||||
return (false);
|
||||
|
||||
if ((packetUBXESFMEAS->moduleQueried.moduleQueried.bits.data & (1 << sensor)) == 0)
|
||||
getESFMEAS(maxWait);
|
||||
packetUBXESFMEAS->moduleQueried.moduleQueried.bits.data &= ~(1 << sensor); // Since we are about to give this to user, mark this data as stale
|
||||
packetUBXESFMEAS->moduleQueried.moduleQueried.bits.all = false;
|
||||
sensorData->data.all = packetUBXESFMEAS->data.data[sensor].data.all;
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool SFE_UBLOX_GNSS::getSensorFusionMeasurement(UBX_ESF_MEAS_sensorData_t *sensorData, UBX_ESF_MEAS_data_t ubxDataStruct, uint8_t sensor)
|
||||
{
|
||||
sensorData->data.all = ubxDataStruct.data[sensor].data.all;
|
||||
|
||||
@@ -1272,15 +1272,12 @@ public:
|
||||
void flushESFINS(); // Mark all the data as read/stale
|
||||
void logESFINS(bool enabled = true); // Log data to file buffer
|
||||
|
||||
bool getEsfDataInfo(uint16_t maxWait = defaultMaxWait); // ESF MEAS Helper
|
||||
bool getESFMEAS(uint16_t maxWait = defaultMaxWait); // ESF MEAS
|
||||
bool setAutoESFMEAS(bool enabled, uint16_t maxWait = defaultMaxWait); // Enable/disable automatic ESF MEAS reports
|
||||
bool setAutoESFMEAS(bool enabled, bool implicitUpdate, uint16_t maxWait = defaultMaxWait); // Enable/disable automatic ESF MEAS reports, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update
|
||||
bool setAutoESFMEASrate(uint8_t rate, bool implicitUpdate = true, uint16_t maxWait = defaultMaxWait); // Set the rate for automatic MEAS reports
|
||||
bool setAutoESFMEAScallback(void (*callbackPointer)(UBX_ESF_MEAS_data_t), uint16_t maxWait = defaultMaxWait); // Enable automatic MEAS reports at the navigation frequency. Data is accessed from the callback.
|
||||
bool setAutoESFMEAScallbackPtr(void (*callbackPointerPtr)(UBX_ESF_MEAS_data_t *), uint16_t maxWait = defaultMaxWait); // Enable automatic MEAS reports at the navigation frequency. Data is accessed from the callback.
|
||||
bool assumeAutoESFMEAS(bool enabled, bool implicitUpdate = true); // In case no config access to the GPS is possible and ESF MEAS is send cyclically already
|
||||
void flushESFMEAS(); // Mark all the data as read/stale
|
||||
void logESFMEAS(bool enabled = true); // Log data to file buffer
|
||||
|
||||
bool setAutoESFRAW(bool enabled, uint16_t maxWait = defaultMaxWait); // Enable/disable automatic ESF RAW reports
|
||||
@@ -1289,7 +1286,6 @@ public:
|
||||
bool setAutoESFRAWcallback(void (*callbackPointer)(UBX_ESF_RAW_data_t), uint16_t maxWait = defaultMaxWait); // Enable automatic RAW reports at the navigation frequency. Data is accessed from the callback.
|
||||
bool setAutoESFRAWcallbackPtr(void (*callbackPointerPtr)(UBX_ESF_RAW_data_t *), uint16_t maxWait = defaultMaxWait); // Enable automatic RAW reports at the navigation frequency. Data is accessed from the callback.
|
||||
bool assumeAutoESFRAW(bool enabled, bool implicitUpdate = true); // In case no config access to the GPS is possible and ESF RAW is send cyclically already
|
||||
void flushESFRAW(); // Mark all the data as read/stale
|
||||
void logESFRAW(bool enabled = true); // Log data to file buffer
|
||||
|
||||
// High navigation rate (HNR)
|
||||
@@ -1466,7 +1462,6 @@ public:
|
||||
float getESFroll(uint16_t maxWait = defaultMaxWait); // Returned as degrees
|
||||
float getESFpitch(uint16_t maxWait = defaultMaxWait); // Returned as degrees
|
||||
float getESFyaw(uint16_t maxWait = defaultMaxWait); // Returned as degrees
|
||||
bool getSensorFusionMeasurement(UBX_ESF_MEAS_sensorData_t *sensorData, uint8_t sensor, uint16_t maxWait = defaultMaxWait);
|
||||
bool getSensorFusionMeasurement(UBX_ESF_MEAS_sensorData_t *sensorData, UBX_ESF_MEAS_data_t ubxDataStruct, uint8_t sensor);
|
||||
bool getRawSensorMeasurement(UBX_ESF_RAW_sensorData_t *sensorData, UBX_ESF_RAW_data_t ubxDataStruct, uint8_t sensor);
|
||||
bool getSensorFusionStatus(UBX_ESF_STATUS_sensorStatus_t *sensorStatus, uint8_t sensor, uint16_t maxWait = defaultMaxWait);
|
||||
|
||||
+7
-26
@@ -53,6 +53,10 @@
|
||||
#define DEF_MAX_NUM_ESF_RAW_REPEATS 10 // The NEO-M8U sends ESF RAW data in blocks / sets of ten readings. (The ZED-F9R sends them one at a time.)
|
||||
#endif
|
||||
|
||||
#ifndef DEF_MAX_NUM_ESF_MEAS
|
||||
#define DEF_MAX_NUM_ESF_MEAS 31 // numMeas is 5 bits, indicating up to 31 groups could be received
|
||||
#endif
|
||||
|
||||
// Additional flags and pointers that need to be stored with each message type
|
||||
struct ubxAutomaticFlags
|
||||
{
|
||||
@@ -2190,7 +2194,8 @@ typedef struct
|
||||
|
||||
// UBX-ESF-MEAS (0x10 0x02): External sensor fusion measurements
|
||||
// Note: length is variable
|
||||
const uint16_t UBX_ESF_MEAS_MAX_LEN = 8 + (4 * DEF_NUM_SENS) + 4;
|
||||
// Note: ESF RAW data cannot be polled. It is "Output" only
|
||||
const uint16_t UBX_ESF_MEAS_MAX_LEN = 8 + (4 * DEF_MAX_NUM_ESF_MEAS) + 4;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -2222,38 +2227,14 @@ typedef struct
|
||||
} bits;
|
||||
} flags;
|
||||
uint16_t id; // Identification number of data provider
|
||||
UBX_ESF_MEAS_sensorData_t data[DEF_NUM_SENS];
|
||||
UBX_ESF_MEAS_sensorData_t data[DEF_MAX_NUM_ESF_MEAS];
|
||||
uint32_t calibTtag; // OPTIONAL: Receiver local time calibrated: ms
|
||||
} UBX_ESF_MEAS_data_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
uint32_t all;
|
||||
struct
|
||||
{
|
||||
uint32_t all : 1;
|
||||
|
||||
uint32_t timeMarkSent : 1;
|
||||
uint32_t timeMarkEdge : 1;
|
||||
uint32_t calibTtagValid : 1;
|
||||
uint32_t numMeas : 1;
|
||||
|
||||
uint32_t id : 1;
|
||||
|
||||
uint32_t data : DEF_NUM_SENS;
|
||||
|
||||
uint32_t calibTtag : 1;
|
||||
} bits;
|
||||
} moduleQueried;
|
||||
} UBX_ESF_MEAS_moduleQueried_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ubxAutomaticFlags automaticFlags;
|
||||
UBX_ESF_MEAS_data_t data;
|
||||
UBX_ESF_MEAS_moduleQueried_t moduleQueried;
|
||||
void (*callbackPointer)(UBX_ESF_MEAS_data_t);
|
||||
void (*callbackPointerPtr)(UBX_ESF_MEAS_data_t *);
|
||||
UBX_ESF_MEAS_data_t *callbackData;
|
||||
|
||||
Reference in New Issue
Block a user