You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							176 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
	
	
							176 lines
						
					
					
						
							3.8 KiB
						
					
					
				| #pragma once
 | |
| 
 | |
| #include <stdint.h>
 | |
| #include "messaging.hpp"
 | |
| 
 | |
| #define min(x, y) ((x) <= (y) ? (x) : (y))
 | |
| 
 | |
| // NAV_PVT
 | |
| typedef struct __attribute__((packed)) {
 | |
|   uint32_t iTOW;
 | |
|   uint16_t year;
 | |
|   int8_t month;
 | |
|   int8_t day;
 | |
|   int8_t hour;
 | |
|   int8_t min;
 | |
|   int8_t sec;
 | |
|   int8_t valid;
 | |
|   uint32_t tAcc;
 | |
|   int32_t nano;
 | |
|   int8_t fixType;
 | |
|   int8_t flags;
 | |
|   int8_t flags2;
 | |
|   int8_t numSV;
 | |
|   int32_t lon;
 | |
|   int32_t lat;
 | |
|   int32_t height;
 | |
|   int32_t hMSL;
 | |
|   uint32_t hAcc;
 | |
|   uint32_t vAcc;
 | |
|   int32_t velN;
 | |
|   int32_t velE;
 | |
|   int32_t velD;
 | |
|   int32_t gSpeed;
 | |
|   int32_t headMot;
 | |
|   uint32_t sAcc;
 | |
|   uint32_t headAcc;
 | |
|   uint16_t pDOP;
 | |
|   int8_t reserverd1[6];
 | |
|   int32_t headVeh;
 | |
|   int16_t magDec;
 | |
|   uint16_t magAcc;
 | |
| } nav_pvt_msg;
 | |
| 
 | |
| // RXM_RAW
 | |
| typedef struct __attribute__((packed)) {
 | |
|   double rcvTow;
 | |
|   uint16_t week;
 | |
|   int8_t leapS;
 | |
|   int8_t numMeas;
 | |
|   int8_t recStat;
 | |
|   int8_t reserved1[3];
 | |
| } rxm_raw_msg;
 | |
| 
 | |
| // Extra data count is in numMeas
 | |
| typedef struct __attribute__((packed)) {
 | |
|   double prMes;
 | |
|   double cpMes;
 | |
|   float doMes;
 | |
|   int8_t gnssId;
 | |
|   int8_t svId;
 | |
|   int8_t sigId;
 | |
|   int8_t freqId;
 | |
|   uint16_t locktime;
 | |
|   int8_t cno;
 | |
|   int8_t prStdev;
 | |
|   int8_t cpStdev;
 | |
|   int8_t doStdev;
 | |
|   int8_t trkStat;
 | |
|   int8_t reserved3;
 | |
| } rxm_raw_msg_extra;
 | |
| // RXM_SFRBX
 | |
| typedef struct __attribute__((packed)) {
 | |
|   int8_t gnssId;
 | |
|   int8_t svid;
 | |
|   int8_t reserved1;
 | |
|   int8_t freqId;
 | |
|   int8_t numWords;
 | |
|   int8_t reserved2;
 | |
|   int8_t version;
 | |
|   int8_t reserved3;
 | |
| } rxm_sfrbx_msg;
 | |
| 
 | |
| // Extra data count is in numWords
 | |
| typedef struct __attribute__((packed)) {
 | |
|   uint32_t dwrd;
 | |
| } rxm_sfrbx_msg_extra;
 | |
| 
 | |
| // MON_HW
 | |
| typedef struct __attribute__((packed)) {
 | |
|   uint32_t pinSel;
 | |
|   uint32_t pinBank;
 | |
|   uint32_t pinDir;
 | |
|   uint32_t pinVal;
 | |
|   uint16_t noisePerMS;
 | |
|   uint16_t agcCnt;
 | |
|   uint8_t aStatus;
 | |
|   uint8_t aPower;
 | |
|   uint8_t flags;
 | |
|   uint8_t reserved1;
 | |
|   uint32_t usedMask;
 | |
|   uint8_t VP[17];
 | |
|   uint8_t jamInd;
 | |
|   uint8_t reserved2[2];
 | |
|   uint32_t pinIrq;
 | |
|   uint32_t pullH;
 | |
|   uint32_t pullL;
 | |
| } mon_hw_msg;
 | |
| 
 | |
| namespace ublox {
 | |
|   // protocol constants
 | |
|   const uint8_t PREAMBLE1 = 0xb5;
 | |
|   const uint8_t PREAMBLE2 = 0x62;
 | |
| 
 | |
|   // message classes
 | |
|   const uint8_t CLASS_NAV = 0x01;
 | |
|   const uint8_t CLASS_RXM = 0x02;
 | |
|   const uint8_t CLASS_MON = 0x0A;
 | |
| 
 | |
|   // NAV messages
 | |
|   const uint8_t MSG_NAV_PVT = 0x7;
 | |
| 
 | |
|   // RXM messages
 | |
|   const uint8_t MSG_RXM_RAW = 0x15;
 | |
|   const uint8_t MSG_RXM_SFRBX = 0x13;
 | |
| 
 | |
|   // MON messages
 | |
|   const uint8_t MSG_MON_HW = 0x09;
 | |
| 
 | |
|   const int UBLOX_HEADER_SIZE = 6;
 | |
|   const int UBLOX_CHECKSUM_SIZE = 2;
 | |
|   const int UBLOX_MAX_MSG_SIZE = 65536;
 | |
| 
 | |
|   typedef std::map<uint8_t, std::vector<uint32_t>> subframes_map;
 | |
| 
 | |
|   class UbloxMsgParser {
 | |
|     public:
 | |
| 
 | |
|       UbloxMsgParser();
 | |
|       kj::Array<capnp::word> gen_solution();
 | |
|       kj::Array<capnp::word> gen_raw();
 | |
|       kj::Array<capnp::word> gen_mon_hw();
 | |
| 
 | |
|       kj::Array<capnp::word> gen_nav_data();
 | |
|       bool add_data(const uint8_t *incoming_data, uint32_t incoming_data_len, size_t &bytes_consumed);
 | |
|       inline void reset() {bytes_in_parse_buf = 0;}
 | |
|       inline uint8_t msg_class() {
 | |
|         return msg_parse_buf[2];
 | |
|       }
 | |
| 
 | |
|       inline uint8_t msg_id() {
 | |
|         return msg_parse_buf[3];
 | |
|       }
 | |
|       inline int needed_bytes();
 | |
| 
 | |
|       void hexdump(uint8_t *d, int l) {
 | |
|         for (int i = 0; i < l; i++) {
 | |
|           if (i%0x10 == 0 && i != 0) printf("\n");
 | |
|           printf("%02X ", d[i]);
 | |
|         }
 | |
|         printf("\n");
 | |
|       }
 | |
|     private:
 | |
|       inline bool valid_cheksum();
 | |
|       inline bool valid();
 | |
|       inline bool valid_so_far();
 | |
| 
 | |
|       uint8_t msg_parse_buf[UBLOX_HEADER_SIZE + UBLOX_MAX_MSG_SIZE];
 | |
|       int bytes_in_parse_buf;
 | |
|       std::map<uint8_t, std::map<uint8_t, subframes_map>> nav_frame_buffer;
 | |
|   };
 | |
| 
 | |
| }
 | |
| 
 | |
| typedef Message * (*poll_ubloxraw_msg_func)(Poller *poller);
 | |
| typedef int (*send_gps_event_func)(PubSocket *s, const void *buf, size_t len);
 | |
| int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func);
 | |
| 
 |