This commit is contained in:
PaulZC
2022-09-09 23:25:25 +01:00
parent e3d27ae7ce
commit 63cc68aff9
6 changed files with 236 additions and 148 deletions
+4 -112
View File
@@ -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
View File
@@ -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;