25#include "pprzlink/dl_protocol.h"
28#ifndef USE_GPS_UBX_RTCM
29#define USE_GPS_UBX_RTCM 0
35#define RTCM3_PREAMBLE 0xD3
36#define RTCM3_MSG_1005 0x69
37#define RTCM3_MSG_1077 0xB1
38#define RTCM3_MSG_4072 0x72
39#define RTCM3_MSG_1230 0xE6
40#define RTCM3_MSG_1087 0xBB
43#if PRINT_DEBUG_GPS_UBX
44#define DEBUG_PRINT(...) printf(__VA_ARGS__)
46#define DEBUG_PRINT(...) {}
50#include "ubx_protocol.h"
61#define GOT_CHECKSUM1 8
63#define RXM_RTCM_VERSION 0x02
64#define NAV_RELPOSNED_VERSION 0x01
66#define GPS_UBX_ERR_NONE 0
67#define GPS_UBX_ERR_OVERRUN 1
68#define GPS_UBX_ERR_MSG_TOO_LONG 2
69#define GPS_UBX_ERR_CHECKSUM 3
70#define GPS_UBX_ERR_UNEXPECTED 4
71#define GPS_UBX_ERR_OUT_OF_SYNC 5
73#define UTM_HEM_NORTH 0
74#define UTM_HEM_SOUTH 1
84#ifndef INJECT_BUFF_SIZE
85#define INJECT_BUFF_SIZE 1024 + 6
101#ifndef GPS_UBX_BOOTRESET
102#define GPS_UBX_BOOTRESET 0
105#define CFG_RST_Reset_Hardware 0x00
106#define CFG_RST_Reset_Controlled 0x01
107#define CFG_RST_Reset_Controlled_GPS_only 0x02
108#define CFG_RST_Reset_Controlled_GPS_stop 0x08
109#define CFG_RST_Reset_Controlled_GPS_start 0x09
111#define CFG_RST_BBR_Hotstart 0x0000
112#define CFG_RST_BBR_Warmstart 0x0001
113#define CFG_RST_BBR_Coldstart 0xffff
143 while (
dev->char_available(
dev->periph)) {
145 if (
gps_ubx[i].msg_available) {
167 if (
gps_ubx[0].msg_available) {
237 if (!
gubx->pacc_valid) {
239 gubx->state.pacc =
gubx->state.hacc;
250 gubx->state.fix = fix;
272 gubx->pacc_valid =
true;
287 gubx->pacc_valid =
true;
315 gubx->state.utm_pos.north -= 1000000000;
322 gubx->state.hmsl =
gubx->state.utm_pos.alt;
367 for (
uint8_t i = 0; i <
gubx->state.nb_channels; i++) {
390 for (
uint8_t i = 0; i <
gubx->state.nb_channels; i++) {
396 gubx->state.svinfos[i].qi = flags & 0x7;
397 gubx->state.svinfos[i].flags = (flags >> 3) & 0x1;
407 gubx->state.fix = fix;
464 switch (
gubx->msg_id) {
503 switch (
gubx->msg_id) {
528 switch (
gubx->status) {
544 if (
gubx->msg_available) {
561 gubx->len |= (c << 8);
577 if (c !=
gubx->ck_a) {
584 if (c !=
gubx->ck_b) {
588 gubx->msg_available =
true;
605 dev->put_byte(
dev->periph, 0,
byte);
641 dev->send_message(
dev->periph, 0);
647 for (i = 0; i < len; i++) {
659#ifndef GPS_UBX_UCENTER
660#define gps_ubx_ucenter_event() {}
692 gubx->msg_available =
false;
710 for (i = 0; i < n; i++) {
713 dev->send_message(
dev->periph, 0);
730#ifdef GPS_UBX_UCENTER
738 for (i = 0; i < length; i++) {
739 if (
rtcm.nbyte == 0) {
748 if (
rtcm.nbyte == 3) {
774 for (
j = 1;
j <
rtcm.len;
j++) {
unsigned int RTCMgetbitu(unsigned char *buff, int pos, int lenb)
unsigned int crc24q(const unsigned char *buff, int len)
Main include for ABI (AirBorneInterface).
uint32_t get_sys_time_usec(void)
Get the time in microseconds since startup.
uint16_t gps_week_number(uint16_t year, uint8_t month, uint8_t day)
Number of weeks since navigation epoch (6 January 1980)
void WEAK gps_inject_data(uint8_t packet_id, uint8_t length, uint8_t *data)
Default parser for GPS injected data.
void gps_periodic_check(struct GpsState *gps_s)
Periodic GPS check.
#define GPS_VALID_VEL_ECEF_BIT
#define GPS_VALID_VEL_NED_BIT
#define GPS_VALID_POS_LLA_BIT
#define GPS_VALID_POS_ECEF_BIT
#define GPS_VALID_HMSL_BIT
uint8_t comp_id
id of current gps
#define GPS_FIX_3D
3D GPS fix
#define GPS_VALID_COURSE_BIT
uint16_t reference_id
Reference station identification.
#define GPS_VALID_POS_UTM_BIT
#define CFG_RST_BBR_Coldstart
static void gps_ubx_parse_nav_sat(struct GpsUbx *gubx)
void gps_ubx_periodic_check(void)
void ubx_trailer(struct link_device *dev)
void gps_ubx_parse_HITL_UBX(uint8_t *buf)
void ubx_header(struct link_device *dev, uint8_t nav_id, uint8_t msg_id, uint16_t len)
#define GPS_UBX_ERR_UNEXPECTED
void gps_ubx_read_message(struct GpsUbx *gubx)
#define GPS_UBX_ERR_OVERRUN
#define GPS_UBX_BOOTRESET
static void gps_ubx_parse_nav_posecef(struct GpsUbx *gubx)
#define NAV_RELPOSNED_VERSION
static void ubx_send_1byte(struct link_device *dev, uint8_t byte)
static void gps_ubx_parse_nav_pvt(struct GpsUbx *gubx)
static void gps_ubx_parse_nav_posutm(struct GpsUbx *gubx)
void gps_ublox_write(struct link_device *dev, uint8_t *buff, uint32_t n)
#define GPS_UBX_ERR_MSG_TOO_LONG
#define UNINIT
Includes macros generated from ubx.xml.
#define CFG_RST_Reset_Controlled
#define CFG_RST_BBR_Hotstart
#define GPS_UBX_ERR_CHECKSUM
void ubx_send_cfg_rst(struct link_device *dev, uint16_t bbr, UNUSED uint8_t reset_mode)
static void gps_ubx_parse_nav_sol(struct GpsUbx *gubx)
void gps_ubx_msg(struct GpsUbx *gubx)
struct GpsUbx gps_ubx[GPS_UBX_NB]
#define gps_ubx_ucenter_event()
static void gps_ubx_parse_nav_posllh(struct GpsUbx *gubx)
#define CFG_RST_BBR_Warmstart
static void gps_ubx_parse_nav_velned(struct GpsUbx *gubx)
static void gps_ubx_parse_velecef(struct GpsUbx *gubx)
static void gps_ubx_parse_nav_svinfo(struct GpsUbx *gubx)
void gps_ubx_parse(struct GpsUbx *gubx, uint8_t c)
void ubx_send_bytes(struct link_device *dev, uint8_t len, uint8_t *bytes)
static void gps_ubx_parse_nav_status(struct GpsUbx *gubx)
static void gps_ubx_parse_nav_relposned(struct GpsUbx *gubx)
#define GPS_UBX_ERR_OUT_OF_SYNC
UBX protocol specific code.
#define GPS_UBX_MAX_PAYLOAD
int gps_ubx_ucenter_get_status(void)
uint8_t buff[25]
Buffer used for general comunication over SPI (in buffer)
arch independent LED (Light Emitting Diodes) API
static const struct usb_device_descriptor dev
volatile uint32_t nb_sec
full seconds since startup
volatile uint32_t nb_sec_rem
remainder of seconds since startup in CPU_TICKS
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.