Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Updated setVal and added 'multi' setVal #28

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 0 additions & 18 deletions ISSUE_TEMPLATE.md

This file was deleted.

296 changes: 294 additions & 2 deletions src/SparkFun_Ublox_Arduino_Library.cpp
Original file line number Diff line number Diff line change
@@ -28,6 +28,10 @@
- Modified ProcessUBXPacket to parse HPPOSLLH packet
- Added query staleness verification for HPPOSLLH data
Modified by Paul Clark, 1st July 2019
- Added 8 and 32 bit versions of setVal
- Added newCfgValset, addCfgValset and sendCfgValset to support the setting of multiple keyID and value pairs simultaneously
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@@ -951,19 +955,28 @@ uint8_t SFE_UBLOX_GPS::getVal8(uint32_t key, uint8_t layer, uint16_t maxWait)
return (extractByte(8));
}

//Given a key, set an 8-bit value
//Given a key, set a 16-bit value
//This function takes a full 32-bit key
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::setVal(uint32_t key, uint16_t value, uint8_t layer, uint16_t maxWait)
{
return setVal16(key, value, layer, maxWait);
}

//Given a key, set a 16-bit value
//This function takes a full 32-bit key
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::setVal16(uint32_t key, uint16_t value, uint8_t layer, uint16_t maxWait)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 2; //4 byte header, 4 byte key ID, 2 bytes of value
packetCfg.startingSpot = 0;

//Clear packet payload
for (uint8_t x = 0; x < packetCfg.len; x++)
for (uint16_t x = 0; x < packetCfg.len; x++)
packetCfg.payload[x] = 0;

payloadCfg[0] = 0; //Message Version - set to 0
@@ -987,6 +1000,285 @@ uint8_t SFE_UBLOX_GPS::setVal(uint32_t key, uint16_t value, uint8_t layer, uint1
return (true);
}

//Given a key, set an 8-bit value
//This function takes a full 32-bit key
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::setVal8(uint32_t key, uint8_t value, uint8_t layer, uint16_t maxWait)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 1; //4 byte header, 4 byte key ID, 1 byte value
packetCfg.startingSpot = 0;

//Clear packet payload
for (uint16_t x = 0; x < packetCfg.len; x++)
packetCfg.payload[x] = 0;

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; //Value

//Send VALSET command with this key and value
if (sendCommand(packetCfg, maxWait) == false)
return (false); //If command send fails then bail

//All done
return (true);
}

//Given a key, set a 32-bit value
//This function takes a full 32-bit key
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::setVal32(uint32_t key, uint32_t value, uint8_t layer, uint16_t maxWait)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 4; //4 byte header, 4 byte key ID, 4 bytes of value
packetCfg.startingSpot = 0;

//Clear packet payload
for (uint16_t x = 0; x < packetCfg.len; x++)
packetCfg.payload[x] = 0;

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;

//Send VALSET command with this key and value
if (sendCommand(packetCfg, maxWait) == false)
return (false); //If command send fails then bail

//All done
return (true);
}

//Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 32-bit value
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::newCfgValset32(uint32_t key, uint32_t value, uint8_t layer)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 4; //4 byte header, 4 byte key ID, 4 bytes of value
packetCfg.startingSpot = 0;

//Clear packet payload
for (uint16_t x = 0; x < MAX_PAYLOAD_SIZE; x++)
packetCfg.payload[x] = 0;

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;

//All done
return (true);
}

//Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 16-bit value
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::newCfgValset16(uint32_t key, uint16_t value, uint8_t layer)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 2; //4 byte header, 4 byte key ID, 2 bytes of value
packetCfg.startingSpot = 0;

//Clear packet payload
for (uint16_t x = 0; x < MAX_PAYLOAD_SIZE; x++)
packetCfg.payload[x] = 0;

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;

//All done
return (true);
}

//Start defining a new UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 8-bit value
//Default layer is BBR
//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P
uint8_t SFE_UBLOX_GPS::newCfgValset8(uint32_t key, uint8_t value, uint8_t layer)
{
packetCfg.cls = UBX_CLASS_CFG;
packetCfg.id = UBX_CFG_VALSET;
packetCfg.len = 4 + 4 + 1; //4 byte header, 4 byte key ID, 1 byte value
packetCfg.startingSpot = 0;

//Clear packet payload
for (uint16_t x = 0; x < MAX_PAYLOAD_SIZE; x++)
packetCfg.payload[x] = 0;

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; //Value

//All done
return (true);
}

//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 32-bit value
uint8_t SFE_UBLOX_GPS::addCfgValset32(uint32_t key, uint32_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;

//Update packet length: 4 byte key ID, 4 bytes of value
packetCfg.len = packetCfg.len + 4 + 4;

//All done
return (true);
}

//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 16-bit value
uint8_t SFE_UBLOX_GPS::addCfgValset16(uint32_t key, uint16_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;

//Update packet length: 4 byte key ID, 2 bytes of value
packetCfg.len = packetCfg.len + 4 + 2;

//All done
return (true);
}

//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket
//This function takes a full 32-bit key and 8-bit value
uint8_t SFE_UBLOX_GPS::addCfgValset8(uint32_t key, uint8_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; //Value

//Update packet length: 4 byte key ID, 1 byte value
packetCfg.len = packetCfg.len + 4 + 1;

//All done
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 32-bit value
uint8_t SFE_UBLOX_GPS::sendCfgValset32(uint32_t key, uint32_t value, uint16_t maxWait)
{
//Load keyID and value into outgoing payload
addCfgValset32(key, value);

//Send VALSET command with this key and value
if (sendCommand(packetCfg, maxWait) == false)
return (false); //If command send fails then bail

//All done
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 16-bit value
uint8_t SFE_UBLOX_GPS::sendCfgValset16(uint32_t key, uint16_t value, uint16_t maxWait)
{
//Load keyID and value into outgoing payload
addCfgValset16(key, value);

//Send VALSET command with this key and value
if (sendCommand(packetCfg, maxWait) == false)
return (false); //If command send fails then bail

//All done
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 8-bit value
uint8_t SFE_UBLOX_GPS::sendCfgValset8(uint32_t key, uint8_t value, uint16_t maxWait)
{
//Load keyID and value into outgoing payload
addCfgValset8(key, value);

//Send VALSET command with this key and value
if (sendCommand(packetCfg, maxWait) == false)
return (false); //If command send fails then bail

//All done
return (true);
}

//Get the current TimeMode3 settings - these contain survey in statuses
boolean SFE_UBLOX_GPS::getSurveyMode(uint16_t maxWait)
{
81 changes: 49 additions & 32 deletions src/SparkFun_Ublox_Arduino_Library.h
Original file line number Diff line number Diff line change
@@ -27,6 +27,10 @@
getMeanSeaLevel(), getHorizontalAccuracy(), getVerticalAccuracy(), getHPPOSLLH()
- Modified ProcessUBXPacket to parse HPPOSLLH packet
- Added query staleness verification for HPPOSLLH data
Modified by Paul Clark, 1st July 2019
- Added 8 and 32 bit versions of setVal
- Added newCfgValset, addCfgValset and sendCfgValset to support the setting of multiple keyID and value pairs simultaneously
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -152,6 +156,7 @@ const uint8_t VAL_SIZE_64 = 0x05; //Eight bytes
const uint8_t VAL_LAYER_RAM = (1 << 0);
const uint8_t VAL_LAYER_BBR = (1 << 1);
const uint8_t VAL_LAYER_FLASH = (1 << 2);
const uint8_t VAL_LAYER_DEFAULT = 7;

//Below are various Groups, IDs, and sizes for various settings
//These can be used to call getVal/setVal/delVal
@@ -169,7 +174,7 @@ const uint8_t VAL_ID_I2C_ADDRESS = 0x01;

#ifndef MAX_PAYLOAD_SIZE

#define MAX_PAYLOAD_SIZE 64 //Some commands are larger than 64 bytes but this covers most
#define MAX_PAYLOAD_SIZE 768 //Worst case: UBX_CFG_VALSET packet with 64 keyIDs each with 64 bit values

#endif

@@ -234,8 +239,8 @@ class SFE_UBLOX_GPS

boolean setAutoPVT(boolean enabled, uint16_t maxWait = 250); //Enable/disable automatic PVT reports at the navigation frequency
boolean getPVT(uint16_t maxWait = 1000); //Query module for latest group of datums and load global vars: lat, long, alt, speed, SIV, accuracies, etc. If autoPVT is disabled, performs an explicit poll and waits, if enabled does not block. Retruns true if new PVT is available.
boolean getHPPOSLLH(uint16_t maxWait = 1000); //Query module for latest group of datums and load global vars: lat, long, alt, speed, SIV, accuracies, etc. If autoPVT is disabled, performs an explicit poll and waits, if enabled does not block. Retruns true if new PVT is available.

boolean getHPPOSLLH(uint16_t maxWait = 1000); //Query module for latest group of datums and load global vars: lat, long, alt, speed, SIV, accuracies, etc. If autoPVT is disabled, performs an explicit poll and waits, if enabled does not block. Retruns true if new PVT is available.
int32_t getLatitude(uint16_t maxWait = 250); //Returns the current latitude in degrees * 10^-7. Auto selects between HighPrecision and Regular depending on ability of module.
int32_t getLongitude(uint16_t maxWait = 250); //Returns the current longitude in degrees * 10-7. Auto selects between HighPrecision and Regular depending on ability of module.
int32_t getAltitude(uint16_t maxWait = 250); //Returns the current altitude in mm above ellipsoid
@@ -253,14 +258,14 @@ class SFE_UBLOX_GPS
uint8_t getMinute(uint16_t maxWait = 250);
uint8_t getSecond(uint16_t maxWait = 250);

uint32_t getTimeOfWeek(uint16_t maxWait = 250);
int32_t getHighResLatitude(uint16_t maxWait = 250);
int32_t getHighResLongitude(uint16_t maxWait = 250);
int32_t getElipsoid(uint16_t maxWait = 250);
int32_t getMeanSeaLevel(uint16_t maxWait = 250);
int32_t getGeoidSeparation(uint16_t maxWait = 250);
uint32_t getHorizontalAccuracy(uint16_t maxWait = 250);
uint32_t getVerticalAccuracy(uint16_t maxWait = 250);
uint32_t getTimeOfWeek(uint16_t maxWait = 250);
int32_t getHighResLatitude(uint16_t maxWait = 250);
int32_t getHighResLongitude(uint16_t maxWait = 250);
int32_t getElipsoid(uint16_t maxWait = 250);
int32_t getMeanSeaLevel(uint16_t maxWait = 250);
int32_t getGeoidSeparation(uint16_t maxWait = 250);
uint32_t getHorizontalAccuracy(uint16_t maxWait = 250);
uint32_t getVerticalAccuracy(uint16_t maxWait = 250);

//Port configurations
boolean setPortOutput(uint8_t portID, uint8_t comSettings, uint16_t maxWait = 250); //Configure a given port to output UBX, NMEA, RTCM3 or a combination thereof
@@ -276,7 +281,19 @@ class SFE_UBLOX_GPS
//General configuration (used only on protocol v27 and higher - ie, ZED-F9P)
uint8_t getVal8(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_BBR, uint16_t maxWait = 250); //Returns the value at a given group/id/size location
uint8_t getVal8(uint32_t keyID, uint8_t layer = VAL_LAYER_BBR, 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_BBR, 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_BBR, 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_BBR, 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_BBR, 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_BBR, uint16_t maxWait = 250); //Sets the 32-bit value at a given group/id/size location
uint8_t newCfgValset8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_BBR); //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_BBR); //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_BBR); //Define a new UBX-CFG-VALSET with the given KeyID and 32-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 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 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 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

//Functions used for RTK and base station setup
boolean getSurveyMode(uint16_t maxWait = 250); //Get the current TimeMode3 settings
@@ -359,14 +376,14 @@ class SFE_UBLOX_GPS
uint8_t versionLow; //Loaded from getProtocolVersion().
uint8_t versionHigh;

uint32_t timeOfWeek;
int32_t highResLatitude;
int32_t highResLongitude;
int32_t elipsoid;
int32_t meanSeaLevel;
int32_t geoidSeparation;
uint32_t horizontalAccuracy;
uint32_t verticalAccuracy;
uint32_t timeOfWeek;
int32_t highResLatitude;
int32_t highResLongitude;
int32_t elipsoid;
int32_t meanSeaLevel;
int32_t geoidSeparation;
uint32_t horizontalAccuracy;
uint32_t verticalAccuracy;

uint16_t rtcmFrameCounter = 0; //Tracks the type of incoming byte inside RTCM frame

@@ -456,18 +473,18 @@ class SFE_UBLOX_GPS
uint16_t versionNumber : 1;
} moduleQueried;

struct
{
uint16_t all : 1;
uint16_t timeOfWeek : 1;
uint16_t highResLatitude : 1;
uint16_t highResLongitude : 1;
uint16_t elipsoid : 1;
uint16_t meanSeaLevel : 1;
uint16_t geoidSeparation : 1;
uint16_t horizontalAccuracy : 1;
uint16_t verticalAccuracy : 1;
} highResModuleQueried;
struct
{
uint16_t all : 1;
uint16_t timeOfWeek : 1;
uint16_t highResLatitude : 1;
uint16_t highResLongitude : 1;
uint16_t elipsoid : 1;
uint16_t meanSeaLevel : 1;
uint16_t geoidSeparation : 1;
uint16_t horizontalAccuracy : 1;
uint16_t verticalAccuracy : 1;
} highResModuleQueried;

uint16_t rtcmLen = 0;
};