10#ifndef LIBRTCM3_RTCM3_H 
   11#define LIBRTCM3_RTCM3_H 
   14#define READ_RESERVED   1 
   17#define READ_CHECKSUM   4 
   19#define RTCM3_PREAMBLE 0xD3 
   20#define RTCM3_MSG_1005 0x69 
   21#define RTCM3_MSG_4072 0x72 
   22#define RTCM3_MSG_1077 0xB1 
   23#define RTCM3_MSG_1087 0xBB 
   24#define RTCM3_MSG_1230 0xE6 
   36#define GOT_CHECKSUM1   8 
   38#define UBX_PREAMBLE1       0xB5                 
   39#define UBX_PREAMBLE2       0x62                 
   40#define UBX_NAV_SVIN        0x3B 
   41#define GPS_UBX_MAX_PAYLOAD 255 
   43#define GPS_UBX_ERR_NONE         0 
   44#define GPS_UBX_ERR_OVERRUN      1 
   45#define GPS_UBX_ERR_MSG_TOO_LONG 2 
   46#define GPS_UBX_ERR_CHECKSUM     3 
   47#define GPS_UBX_ERR_UNEXPECTED   4 
   48#define GPS_UBX_ERR_OUT_OF_SYNC  5 
   55#define UBX_NAV_SVIN_VERSION(_ubx_payload) (uint8_t)(*((uint8_t*)_ubx_payload+0)) 
   56#define UBX_NAV_SVIN_RES1(_ubx_payload) (uint8_t)(*((uint8_t*)_ubx_payload+1)) 
   57#define UBX_NAV_SVIN_RES2(_ubx_payload) (uint16_t)(*((uint8_t*)_ubx_payload+2)|*((uint8_t*)_ubx_payload+1+2)<<8) 
   58#define UBX_NAV_SVIN_ITOW(_ubx_payload) (uint32_t)(*((uint8_t*)_ubx_payload+4)|*((uint8_t*)_ubx_payload+1+4)<<8|((uint32_t)*((uint8_t*)_ubx_payload+2+4))<<16|((uint32_t)*((uint8_t*)_ubx_payload+3+4))<<24) 
   59#define UBX_NAV_SVIN_dur(_ubx_payload) (uint32_t)(*((uint8_t*)_ubx_payload+8)|*((uint8_t*)_ubx_payload+1+8)<<8|((uint32_t)*((uint8_t*)_ubx_payload+2+8))<<16|((uint32_t)*((uint8_t*)_ubx_payload+3+8))<<24) 
   60#define UBX_NAV_SVIN_meanX(_ubx_payload) (int32_t)(*((uint8_t*)_ubx_payload+12)|*((uint8_t*)_ubx_payload+1+12)<<8|((int32_t)*((uint8_t*)_ubx_payload+2+12))<<16|((int32_t)*((uint8_t*)_ubx_payload+3+12))<<24) 
   61#define UBX_NAV_SVIN_meanY(_ubx_payload) (int32_t)(*((uint8_t*)_ubx_payload+16)|*((uint8_t*)_ubx_payload+1+16)<<8|((int32_t)*((uint8_t*)_ubx_payload+2+16))<<16|((int32_t)*((uint8_t*)_ubx_payload+3+16))<<24) 
   62#define UBX_NAV_SVIN_meanZ(_ubx_payload) (int32_t)(*((uint8_t*)_ubx_payload+20)|*((uint8_t*)_ubx_payload+1+20)<<8|((int32_t)*((uint8_t*)_ubx_payload+2+20))<<16|((int32_t)*((uint8_t*)_ubx_payload+3+20))<<24) 
   63#define UBX_NAV_SVIN_meanXHP(_ubx_payload) (int8_t)(*((uint8_t*)_ubx_payload+24)) 
   64#define UBX_NAV_SVIN_meanYHP(_ubx_payload) (int8_t)(*((uint8_t*)_ubx_payload+25)) 
   65#define UBX_NAV_SVIN_meanZHP(_ubx_payload) (int8_t)(*((uint8_t*)_ubx_payload+26)) 
   66#define UBX_NAV_SVIN_RES3(_ubx_payload) (uint8_t)(*((uint8_t*)_ubx_payload+27)) 
   67#define UBX_NAV_SVIN_meanACC(_ubx_payload) (uint32_t)(*((uint8_t*)_ubx_payload+28)|*((uint8_t*)_ubx_payload+1+28)<<8|((uint32_t)*((uint8_t*)_ubx_payload+2+28))<<16|((uint32_t)*((uint8_t*)_ubx_payload+3+28))<<24) 
   68#define UBX_NAV_SVIN_OBS(_ubx_payload) (uint32_t)(*((uint8_t*)_ubx_payload+32)|*((uint8_t*)_ubx_payload+1+32)<<8|((uint32_t)*((uint8_t*)_ubx_payload+2+32))<<16|((uint32_t)*((uint8_t*)_ubx_payload+3+32))<<24) 
   69#define UBX_NAV_SVIN_Valid(_ubx_payload) (uint8_t)(*((uint8_t*)_ubx_payload+36)) 
   70#define UBX_NAV_SVIN_Active(_ubx_payload) (uint8_t)(*((uint8_t*)_ubx_payload+37)) 
   71#define UBX_NAV_SVIN_RES4(_ubx_payload) (uint16_t)(*((uint8_t*)_ubx_payload+38)|*((uint8_t*)_ubx_payload+1+38)<<8) 
   81#define RTCM_OK_CALLBACK_EXECUTED 1 
   83#define RTCM_OK_CALLBACK_UNDEFINED 2 
   85#define RTCM_CALLBACK_ERROR -1 
   87#define RTCM_CRC_ERROR      -2 
   89#define RTCM_SEND_ERROR     -3 
   91#define RTCM_NULL_ERROR     -4 
  117  u8 msg_buff[1024 + 6 + 1];
 
 
  136unsigned int                RTCMgetbitu(
unsigned char *, 
int, 
int);
 
  178  node->msg_type = msg_type;
 
  189  if (
s->rtcm3_msg_callbacks_head == 0) {
 
  190    s->rtcm3_msg_callbacks_head = 
node;
 
 
  213  s->rtcm3_msg_callbacks_head = 0;
 
 
  227  if (!
s->rtcm3_msg_callbacks_head) {
 
  237    if (
p->msg_type == msg_type) {
 
  241  while ((
p = 
p->next));
 
 
  324  if (
s->n_read == (1024 + 6) && 
s->state != 
UNINIT) {
 
  330#ifdef DEBUG_PRINT_PACKAGE 
  343        s->msg_buff[
s->n_read] = 
buff;
 
  361#ifdef DEBUG_PRINT_PACKAGE 
  373#ifdef DEBUG_PRINT_PACKAGE 
  379        s->msg_len   = 
s->n_read;
 
  387          (*
node->cb)(
s->msg_len, 
s->msg_buff);
 
 
  440      s->msg_len |= (
buff << 8);
 
  449      s->msg_buff[
s->n_read] = 
buff;
 
  451      if (
s->n_read >= 
s->msg_len) {
 
  456      if (
buff != 
s->ck_a) {
 
  463      if (
buff != 
s->ck_b) {
 
  476        (*
node->cb)(
s->msg_len, 
s->msg_buff);
 
  492  return s->error_last;
 
 
  497  unsigned int bits = 0;
 
  499  for (i = pos; i < pos + 
lenb; i++) { 
bits = (
bits << 1) + ((
buff[i / 8] >> (7 - i % 8)) & 1u); }
 
 
uint8_t u8
Unsigned 8-bit integer.
int8_t s8
Signed 8-bit integer.
uint16_t u16
Unsigned 16-bit integer.
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
uint8_t buff[25]
Buffer used for general comunication over SPI (in buffer)
#define GPS_UBX_ERR_UNEXPECTED
struct rtcm3_msg_callbacks_node rtcm3_msg_callbacks_node_t
RTCM3 callback node.
void(* rtcm3_msg_callback_t)(u8 len, u8 msg[])
RTCM3 callback function prototype definition.
s8 ubx_process(msg_state_t *s, unsigned char buff)
#define RTCM_OK
Return value indicating success.
#define RTCM_OK_CALLBACK_UNDEFINED
Return value indicating message decoded with no associated callback in rtcm3_process.
void msg_state_init(msg_state_t *s)
Initialize an msg_state_t struct before use.
#define GPS_UBX_ERR_MSG_TOO_LONG
rtcm3_msg_callbacks_node_t * rtcm3_find_callback(msg_state_t *s, u16 msg_type)
Find the callback function associated with a message type.
s8 rtcm3_register_callback(msg_state_t *s, u16 msg_type, rtcm3_msg_callback_t cb, rtcm3_msg_callbacks_node_t *node)
Register a callback for a message type.
#define RTCM_OK_CALLBACK_EXECUTED
Return value indicating message decoded and callback executed by rtcm3_process.
#define GPS_UBX_ERR_CHECKSUM
unsigned int RTCMgetbitu(unsigned char *, int, int)
#define RTCM_NULL_ERROR
Return value indicating an error occured because an argument was NULL.
#define RTCM_CALLBACK_ERROR
Return value indicating an error with the callback (function defined).
struct rtcm3_msg_callbacks_node * next
Pointer to next node in list.
s8 rtcm3_process(msg_state_t *s, unsigned char buff)
Read and process RTCM3 messages.
u16 msg_type
Message ID associated with callback.
rtcm3_msg_callback_t cb
Pointer to callback function.
#define GPS_UBX_MAX_PAYLOAD
rtcm3_msg_callbacks_node_t * rtcm3_msg_callbacks_head
void rtcm3_clear_callbacks(msg_state_t *s)
Clear all registered callbacks.
#define GPS_UBX_ERR_OUT_OF_SYNC
static double RTCMgetbits_38(unsigned char *, int)
int RTCMgetbits(unsigned char *, int, int)