Adafruit_uBlox/Adafruit_UBX.h
2025-07-21 11:55:56 -04:00

110 lines
4 KiB
C++
Raw Permalink Blame History

/*!
* @file Adafruit_UBX.h
*
* Arduino library for parsing UBX protocol from u-blox GPS/RTK modules.
*
* This library can use any Stream object as input (UART, DDC, or other).
*
* Adafruit invests time and resources providing this open source code,
* please support Adafruit and open-source hardware by purchasing
* products from Adafruit!
*
* Written by Limor Fried/Ladyada for Adafruit Industries.
*
* MIT license, all text here must be included in any redistribution.
*/
#ifndef ADAFRUIT_UBX_H
#define ADAFRUIT_UBX_H
#include "Adafruit_uBlox_Ubx_Messages.h"
#include "Adafruit_uBlox_typedef.h"
#include <Arduino.h>
#include <Stream.h>
// UBX protocol constants
#define UBX_SYNC_CHAR_1 0xB5 ///< First UBX protocol sync char (<28>)
#define UBX_SYNC_CHAR_2 0x62 ///< Second UBX protocol sync char (b)
// UBX ACK Message IDs
#define UBX_ACK_NAK 0x00 ///< Message Not Acknowledged
#define UBX_ACK_ACK 0x01 ///< Message Acknowledged
/*!
* @brief Callback function type for UBX messages - defined at global scope so
* other classes can use it
* @param msgClass Message class
* @param msgId Message ID
* @param payloadLen Length of payload data
* @param payload Pointer to payload data
*/
typedef void (*UBXMessageCallback)(uint8_t msgClass, uint8_t msgId,
uint16_t payloadLen, uint8_t *payload);
/*!
* @brief Class for parsing UBX protocol messages from u-blox GPS/RTK modules
*/
class Adafruit_UBX {
public:
Adafruit_UBX(Stream &stream);
~Adafruit_UBX();
uint8_t verbose_debug = 0; ///< 0=off, 1=basic, 2=verbose
// Basic methods
bool begin();
bool checkMessages(); // Message parsing
bool sendMessage(uint8_t msgClass, uint8_t msgId, uint8_t *payload,
uint16_t length); // Send a UBX message
UBXSendStatus sendMessageWithAck(uint8_t msgClass, uint8_t msgId,
uint8_t *payload, uint16_t length,
uint16_t timeout_ms = 500);
// Configure port to use UBX protocol only (disable NMEA)
UBXSendStatus setUBXOnly(UBXPortId portID, bool checkAck = true,
uint16_t timeout_ms = 500);
void setMessageCallback(UBXMessageCallback callback); // Set callback function
UBXMessageCallback onUBXMessage; ///< Callback for message received
private:
Stream *_stream; // Stream interface for reading data
// Buffer for reading messages
static const uint16_t MAX_PAYLOAD_SIZE = 64; // Maximum UBX payload size
uint8_t _buffer[MAX_PAYLOAD_SIZE +
8]; // Buffer for message (header, payload, checksum)
// Parser state machine
enum ParserState {
WAIT_SYNC_1, // Waiting for first sync char (0xB5)
WAIT_SYNC_2, // Waiting for second sync char (0x62)
GET_CLASS, // Reading message class
GET_ID, // Reading message ID
GET_LENGTH_1, // Reading length LSB
GET_LENGTH_2, // Reading length MSB
GET_PAYLOAD, // Reading payload
GET_CHECKSUM_A, // Reading checksum A
GET_CHECKSUM_B // Reading checksum B
};
ParserState _parserState = WAIT_SYNC_1; // Current state of the parser
uint8_t _msgClass; // Message class of current message
uint8_t _msgId; // Message ID of current message
uint16_t _payloadLength; // Length of current message payload
uint16_t _payloadCounter; // Counter for payload bytes received
uint8_t _checksumA; // Running checksum A
uint8_t _checksumB; // Running checksum B
// Calculate checksum for a block of data
void calculateChecksum(uint8_t *buffer, uint16_t len, uint8_t &checksumA,
uint8_t &checksumB);
// Reset parser state
void resetParser();
// Add to private section of Adafruit_UBX.h
uint8_t _lastMsgClass; // Class of last message
uint8_t _lastMsgId; // ID of last message
uint16_t _lastPayloadLength; // Length of last message payload
uint8_t _lastPayload[8]; // Buffer for small payloads (like ACK messages)
};
#endif // ADAFRUIT_UBX_H