Add 64-bit setval and getval functions

This commit is contained in:
PaulZC
2022-02-07 08:42:59 +00:00
parent fcf00c7997
commit df4fb4cdaa
2 changed files with 149 additions and 3 deletions
+142 -3
View File
@@ -7580,6 +7580,13 @@ uint32_t SFE_UBLOX_GNSS::getVal32(uint32_t key, uint8_t layer, uint16_t maxWait)
return (extractLong(&packetCfg, 8)); return (extractLong(&packetCfg, 8));
} }
uint64_t SFE_UBLOX_GNSS::getVal64(uint32_t key, uint8_t layer, uint16_t maxWait)
{
if (getVal(key, layer, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED)
return (0);
return (extractLongLong(&packetCfg, 8));
}
//Given a group, ID and size, return the value of this config spot //Given a group, ID and size, return the value of this config spot
//The 32-bit key is put together from group/ID/size. See other getVal to send key directly. //The 32-bit key is put together from group/ID/size. See other getVal to send key directly.
@@ -7599,6 +7606,11 @@ uint32_t SFE_UBLOX_GNSS::getVal32(uint16_t group, uint16_t id, uint8_t size, uin
uint32_t key = createKey(group, id, size); uint32_t key = createKey(group, id, size);
return getVal32(key, layer, maxWait); return getVal32(key, layer, maxWait);
} }
uint64_t SFE_UBLOX_GNSS::getVal64(uint16_t group, uint16_t id, uint8_t size, uint8_t layer, uint16_t maxWait)
{
uint32_t key = createKey(group, id, size);
return getVal64(key, layer, maxWait);
}
//Given a key, set a 16-bit value //Given a key, set a 16-bit value
//This function takes a full 32-bit key //This function takes a full 32-bit key
@@ -7703,9 +7715,83 @@ uint8_t SFE_UBLOX_GNSS::setVal32(uint32_t key, uint32_t value, uint8_t layer, ui
return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
} }
//Given a key, set a 64-bit value
//This function takes a full 32-bit key
//Default layer is all: RAM+BBR+Flash
//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GNSS::setVal64(uint32_t key, uint64_t value, uint8_t layer, uint16_t maxWait)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 8; //4 byte header, 4 byte key ID, 8 bytes of value
packetCfg.startingSpot = 0;
//Clear packet payload
memset(payloadCfg, 0, packetCfg.len);
payloadCfg[0] = 0; //Message Version - set to 0
payloadCfg[1] = layer; //By default we ask for the BBR layer
//Load key into outgoing payload
payloadCfg[4] = key >> 8 * 0; //Key LSB
payloadCfg[5] = key >> 8 * 1;
payloadCfg[6] = key >> 8 * 2;
payloadCfg[7] = key >> 8 * 3;
//Load user's value
payloadCfg[8] = value >> 8 * 0; //Value LSB
payloadCfg[9] = value >> 8 * 1;
payloadCfg[10] = value >> 8 * 2;
payloadCfg[11] = value >> 8 * 3;
payloadCfg[12] = value >> 8 * 4;
payloadCfg[13] = value >> 8 * 5;
payloadCfg[14] = value >> 8 * 6;
payloadCfg[15] = value >> 8 * 7;
//Send VALSET command with this key and value
return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
}
//Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 64-bit value
//Default layer is RAM+BBR+Flash
//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GNSS::newCfgValset64(uint32_t key, uint64_t value, uint8_t layer)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 8; //4 byte header, 4 byte key ID, 8 bytes of value
packetCfg.startingSpot = 0;
//Clear all of packet payload
memset(payloadCfg, 0, packetCfgPayloadSize);
payloadCfg[0] = 0; //Message Version - set to 0
payloadCfg[1] = layer; //By default we ask for the BBR layer
//Load key into outgoing payload
payloadCfg[4] = key >> 8 * 0; //Key LSB
payloadCfg[5] = key >> 8 * 1;
payloadCfg[6] = key >> 8 * 2;
payloadCfg[7] = key >> 8 * 3;
//Load user's value
payloadCfg[8] = value >> 8 * 0; //Value LSB
payloadCfg[9] = value >> 8 * 1;
payloadCfg[10] = value >> 8 * 2;
payloadCfg[11] = value >> 8 * 3;
payloadCfg[12] = value >> 8 * 4;
payloadCfg[13] = value >> 8 * 5;
payloadCfg[14] = value >> 8 * 6;
payloadCfg[15] = value >> 8 * 7;
//All done
return (true);
}
//Start defining a new UBX-CFG-VALSET ubxPacket //Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 32-bit value //This function takes a full 32-bit key and 32-bit value
//Default layer is BBR //Default layer is RAM+BBR+Flash
//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P //Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GNSS::newCfgValset32(uint32_t key, uint32_t value, uint8_t layer) uint8_t SFE_UBLOX_GNSS::newCfgValset32(uint32_t key, uint32_t value, uint8_t layer)
{ {
@@ -7738,7 +7824,7 @@ uint8_t SFE_UBLOX_GNSS::newCfgValset32(uint32_t key, uint32_t value, uint8_t lay
//Start defining a new UBX-CFG-VALSET ubxPacket //Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 16-bit value //This function takes a full 32-bit key and 16-bit value
//Default layer is BBR //Default layer is RAM+BBR+Flash
//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P //Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GNSS::newCfgValset16(uint32_t key, uint16_t value, uint8_t layer) uint8_t SFE_UBLOX_GNSS::newCfgValset16(uint32_t key, uint16_t value, uint8_t layer)
{ {
@@ -7769,7 +7855,7 @@ uint8_t SFE_UBLOX_GNSS::newCfgValset16(uint32_t key, uint16_t value, uint8_t lay
//Start defining a new UBX-CFG-VALSET ubxPacket //Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 8-bit value //This function takes a full 32-bit key and 8-bit value
//Default layer is BBR //Default layer is RAM+BBR+Flash
//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P //Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GNSS::newCfgValset8(uint32_t key, uint8_t value, uint8_t layer) uint8_t SFE_UBLOX_GNSS::newCfgValset8(uint32_t key, uint8_t value, uint8_t layer)
{ {
@@ -7797,6 +7883,33 @@ uint8_t SFE_UBLOX_GNSS::newCfgValset8(uint32_t key, uint8_t value, uint8_t layer
return (true); return (true);
} }
//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 64-bit value
uint8_t SFE_UBLOX_GNSS::addCfgValset64(uint32_t key, uint64_t value)
{
//Load key into outgoing payload
payloadCfg[packetCfg.len + 0] = key >> 8 * 0; //Key LSB
payloadCfg[packetCfg.len + 1] = key >> 8 * 1;
payloadCfg[packetCfg.len + 2] = key >> 8 * 2;
payloadCfg[packetCfg.len + 3] = key >> 8 * 3;
//Load user's value
payloadCfg[packetCfg.len + 4] = value >> 8 * 0; //Value LSB
payloadCfg[packetCfg.len + 5] = value >> 8 * 1;
payloadCfg[packetCfg.len + 6] = value >> 8 * 2;
payloadCfg[packetCfg.len + 7] = value >> 8 * 3;
payloadCfg[packetCfg.len + 8] = value >> 8 * 4;
payloadCfg[packetCfg.len + 9] = value >> 8 * 5;
payloadCfg[packetCfg.len + 10] = value >> 8 * 6;
payloadCfg[packetCfg.len + 11] = value >> 8 * 7;
//Update packet length: 4 byte key ID, 8 bytes of value
packetCfg.len = packetCfg.len + 4 + 8;
//All done
return (true);
}
//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket //Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 32-bit value //This function takes a full 32-bit key and 32-bit value
uint8_t SFE_UBLOX_GNSS::addCfgValset32(uint32_t key, uint32_t value) uint8_t SFE_UBLOX_GNSS::addCfgValset32(uint32_t key, uint32_t value)
@@ -7861,6 +7974,17 @@ uint8_t SFE_UBLOX_GNSS::addCfgValset8(uint32_t key, uint8_t value)
return (true); return (true);
} }
//Add a final keyID and value to an existing UBX-CFG-VALSET ubxPacket and send it
//This function takes a full 32-bit key and 64-bit value
uint8_t SFE_UBLOX_GNSS::sendCfgValset64(uint32_t key, uint64_t value, uint16_t maxWait)
{
//Load keyID and value into outgoing payload
addCfgValset64(key, value);
//Send VALSET command with this key and value
return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
}
//Add a final keyID and value to an existing UBX-CFG-VALSET ubxPacket and send it //Add a final keyID and value to an existing UBX-CFG-VALSET ubxPacket and send it
//This function takes a full 32-bit key and 32-bit value //This function takes a full 32-bit key and 32-bit value
uint8_t SFE_UBLOX_GNSS::sendCfgValset32(uint32_t key, uint32_t value, uint16_t maxWait) uint8_t SFE_UBLOX_GNSS::sendCfgValset32(uint32_t key, uint32_t value, uint16_t maxWait)
@@ -15160,6 +15284,21 @@ float SFE_UBLOX_GNSS::getHNRheading(uint16_t maxWait) // Returned as degrees
// Functions to extract signed and unsigned 8/16/32-bit data from a ubxPacket // Functions to extract signed and unsigned 8/16/32-bit data from a ubxPacket
// From v2.0: These are public. The user can call these to extract data from custom packets // From v2.0: These are public. The user can call these to extract data from custom packets
//Given a spot in the payload array, extract eight bytes and build a uint64_t
uint64_t SFE_UBLOX_GNSS::extractLongLong(ubxPacket *msg, uint16_t spotToStart)
{
uint64_t val = 0;
val |= (uint64_t)msg->payload[spotToStart + 0] << 8 * 0;
val |= (uint64_t)msg->payload[spotToStart + 1] << 8 * 1;
val |= (uint64_t)msg->payload[spotToStart + 2] << 8 * 2;
val |= (uint64_t)msg->payload[spotToStart + 3] << 8 * 3;
val |= (uint64_t)msg->payload[spotToStart + 4] << 8 * 4;
val |= (uint64_t)msg->payload[spotToStart + 5] << 8 * 5;
val |= (uint64_t)msg->payload[spotToStart + 6] << 8 * 6;
val |= (uint64_t)msg->payload[spotToStart + 7] << 8 * 7;
return (val);
}
//Given a spot in the payload array, extract four bytes and build a long //Given a spot in the payload array, extract four bytes and build a long
uint32_t SFE_UBLOX_GNSS::extractLong(ubxPacket *msg, uint16_t spotToStart) uint32_t SFE_UBLOX_GNSS::extractLong(ubxPacket *msg, uint16_t spotToStart)
{ {
@@ -901,22 +901,28 @@ public:
uint8_t getVal8(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location uint8_t getVal8(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location
uint16_t getVal16(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location uint16_t getVal16(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location
uint32_t getVal32(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location uint32_t getVal32(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location
uint64_t getVal64(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location
uint8_t getVal8(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location uint8_t getVal8(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location
uint16_t getVal16(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location uint16_t getVal16(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location
uint32_t getVal32(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location uint32_t getVal32(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location
uint64_t getVal64(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location
uint8_t setVal(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 16-bit value at a given group/id/size location uint8_t setVal(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 16-bit value at a given group/id/size location
uint8_t setVal8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 8-bit value at a given group/id/size location uint8_t setVal8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 8-bit value at a given group/id/size location
uint8_t setVal16(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 16-bit value at a given group/id/size location uint8_t setVal16(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 16-bit value at a given group/id/size location
uint8_t setVal32(uint32_t keyID, uint32_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 32-bit value at a given group/id/size location uint8_t setVal32(uint32_t keyID, uint32_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 32-bit value at a given group/id/size location
uint8_t setVal64(uint32_t keyID, uint64_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 64-bit value at a given group/id/size location
uint8_t newCfgValset8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 8-bit value uint8_t newCfgValset8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 8-bit value
uint8_t newCfgValset16(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 16-bit value uint8_t newCfgValset16(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 16-bit value
uint8_t newCfgValset32(uint32_t keyID, uint32_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 32-bit value uint8_t newCfgValset32(uint32_t keyID, uint32_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 32-bit value
uint8_t newCfgValset64(uint32_t keyID, uint64_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 64-bit value
uint8_t addCfgValset8(uint32_t keyID, uint8_t value); //Add a new KeyID and 8-bit value to an existing UBX-CFG-VALSET ubxPacket uint8_t addCfgValset8(uint32_t keyID, uint8_t value); //Add a new KeyID and 8-bit value to an existing UBX-CFG-VALSET ubxPacket
uint8_t addCfgValset16(uint32_t keyID, uint16_t value); //Add a new KeyID and 16-bit value to an existing UBX-CFG-VALSET ubxPacket uint8_t addCfgValset16(uint32_t keyID, uint16_t value); //Add a new KeyID and 16-bit value to an existing UBX-CFG-VALSET ubxPacket
uint8_t addCfgValset32(uint32_t keyID, uint32_t value); //Add a new KeyID and 32-bit value to an existing UBX-CFG-VALSET ubxPacket uint8_t addCfgValset32(uint32_t keyID, uint32_t value); //Add a new KeyID and 32-bit value to an existing UBX-CFG-VALSET ubxPacket
uint8_t addCfgValset64(uint32_t keyID, uint64_t value); //Add a new KeyID and 64-bit value to an existing UBX-CFG-VALSET ubxPacket
uint8_t sendCfgValset8(uint32_t keyID, uint8_t value, uint16_t maxWait = 250); //Add the final KeyID and 8-bit value to an existing UBX-CFG-VALSET ubxPacket and send it uint8_t sendCfgValset8(uint32_t keyID, uint8_t value, uint16_t maxWait = 250); //Add the final KeyID and 8-bit value to an existing UBX-CFG-VALSET ubxPacket and send it
uint8_t sendCfgValset16(uint32_t keyID, uint16_t value, uint16_t maxWait = 250); //Add the final KeyID and 16-bit value to an existing UBX-CFG-VALSET ubxPacket and send it uint8_t sendCfgValset16(uint32_t keyID, uint16_t value, uint16_t maxWait = 250); //Add the final KeyID and 16-bit value to an existing UBX-CFG-VALSET ubxPacket and send it
uint8_t sendCfgValset32(uint32_t keyID, uint32_t value, uint16_t maxWait = 250); //Add the final KeyID and 32-bit value to an existing UBX-CFG-VALSET ubxPacket and send it uint8_t sendCfgValset32(uint32_t keyID, uint32_t value, uint16_t maxWait = 250); //Add the final KeyID and 32-bit value to an existing UBX-CFG-VALSET ubxPacket and send it
uint8_t sendCfgValset64(uint32_t keyID, uint64_t value, uint16_t maxWait = 250); //Add the final KeyID and 64-bit value to an existing UBX-CFG-VALSET ubxPacket and send it
// get and set functions for all of the "automatic" message processing // get and set functions for all of the "automatic" message processing
@@ -1394,6 +1400,7 @@ public:
// Functions to extract signed and unsigned 8/16/32-bit data from a ubxPacket // Functions to extract signed and unsigned 8/16/32-bit data from a ubxPacket
// From v2.0: These are public. The user can call these to extract data from custom packets // From v2.0: These are public. The user can call these to extract data from custom packets
uint64_t extractLongLong(ubxPacket *msg, uint16_t spotToStart); //Combine eight bytes from payload into uint64_t
uint32_t extractLong(ubxPacket *msg, uint16_t spotToStart); //Combine four bytes from payload into long uint32_t extractLong(ubxPacket *msg, uint16_t spotToStart); //Combine four bytes from payload into long
int32_t extractSignedLong(ubxPacket *msg, uint16_t spotToStart); //Combine four bytes from payload into signed long (avoiding any ambiguity caused by casting) int32_t extractSignedLong(ubxPacket *msg, uint16_t spotToStart); //Combine four bytes from payload into signed long (avoiding any ambiguity caused by casting)
uint16_t extractInt(ubxPacket *msg, uint16_t spotToStart); //Combine two bytes from payload into int uint16_t extractInt(ubxPacket *msg, uint16_t spotToStart); //Combine two bytes from payload into int