#ifndef __GPS_NOVATEL_H #define __GPS_NOVATEL_H #include "stm32f7xx.h" #include "stm32f7xx_hal.h" #include #include "libcmn.h" #define B10_P1 (1.0E+1) /* B: base, P: positive */ #define B10_P2 (1.0E+2) #define B10_P3 (1.0E+3) #define B10_P4 (1.0E+4) #define B10_P5 (1.0E+5) #define B10_P6 (1.0E+6) #define B10_P7 (1.0E+7) #define B10_P8 (1.0E+8) #define B10_P9 (1.0E+9) #define B10_N1 (1.0E-1) /* B: base, N: negative */ #define B10_N2 (1.0E-2) #define B10_N3 (1.0E-3) #define B10_N4 (1.0E-4) #define B10_N5 (1.0E-5) #define B10_N6 (1.0E-6) #define B10_N7 (1.0E-7) #define B10_N8 (1.0E-8) #define B10_N9 (1.0E-9) /** novatel message id & length */ #define ID_TIME (101) // 0x65 #define ID_BESTPOS (42) // 0x2A #define ID_BESTVEL (99) #define ID_HEADING (971) #define ID_PSRDOP (174) #define LEN_TIME (28+44+4) /** header length + body length + crc check length */ #define LEN_BESTPOS (28+72+4) #define LEN_BESTVEL (28+44+4) #define LEN_HEADING (28+44+4) #define NOVATEL_HEADER_LENGTH (28) #define MIN_NOVATEL_MSG_LENGTH (LEN_TIME) /** ref LEN_TIME/LEN_BESTPOS/LEN_BESTVEL */ #define MAX_NOVATEL_MSG_LENGTH (LEN_SATMSG) typedef enum { Configing, ConfigDone }FlagConfig; typedef enum { NOVATEL_FIXTYPE_NONE = 0, NOVATEL_FIXTYPE_FIXEDPOS = 1, NOVATEL_FIXTYPE_FIXEDHEIGHT = 2, NOVATEL_FIXTYPE_DOPPLER_VELOCITY = 8, NOVATEL_FIXTYPE_SMOOTED_SINGLE= 9, NOVATEL_FIXTYPE_SINGLE = 16, NOVATEL_FIXTYPE_PSRDIFF = 17, NOVATEL_FIXTYPE_WAAS = 18, NOVATEL_FIXTYPE_PROPAGATED = 19, NOVATEL_FIXTYPE_OMNISTAR = 20, NOVATEL_FIXTYPE_L1_FLOAT = 32, NOVATEL_FIXTYPE_IONOFREE_FLOAT = 33, NOVATEL_FIXTYPE_NARROR_FLAOT = 34, NOVATEL_FIXTYPE_FIXED_RECKON = 35, NOVATEL_FIXTYPE_L1_INT = 48, NOVATEL_FIXTYPE_NARROW_INT = 50, NOVATEL_FIXTYPE_OMNISTAR_HP = 64, NOVATEL_FIXTYPE_OMNISTAR_XP = 65, NOVATEL_FIXTYPE_PPP_CONVERGING = 68, NOVATEL_FIXTYPE_PPP = 69, NOVATEL_FIXTYPE_OPERATIONAL = 70, NOVATEL_FIXTYPE_WARNING = 71, NOVATEL_FIXTYPE_OUT_OF_BOUNDS = 72 } NovatelFixtypeEnum; typedef struct { float velN,velE,velD; /** time */ uint16_t HeaderWeekOfTime; uint32_t HeaderMsecOfTime; uint8_t time_valid; UtcStruct utc; /** bestpos */ uint8_t flgPosUpd; uint16_t HeaderWeekOfBestpos; uint32_t HeaderMsecOfBestpos; double LatDeg,LonDeg,hgt; float diffage; uint8_t SolnSv; uint32_t baseid; GnssFixtypeEnum fix_type; NovatelFixtypeEnum PosType; // NovatelFixtypeEnum float LatSigma; float LonSigma; float HightSigma; /** srdop */ uint8_t flgDopUpd; float gdop; float Pdop; float Hdop; /** bestvel */ uint8_t flgVelUpd; uint16_t HeaderWeekOfBestvel; uint32_t HeaderMsecOfBestvel; uint32_t V_valid; double HorSpd; // m/s double TrkGnd; // degree double VertSpd; // m/s, up(+) /** heading */ uint8_t aAngHz; uint8_t flgAttUpd; NovatelFixtypeEnum NovatelAttType; // NovatelFixtypeEnum uint8_t att_type; /** 0: fixed ambiguity 1: float ambiguity */ uint8_t ang_sv_num; float heading; /** degree,0-360 */ float pitch; /** degree,+-90 */ float roll; /** degree,+-90 */ int CntNovatelTime; int CntNovatelBestpos; int CntNovatelBestvel; int CntNovatelHeading; int CntNovatelPsrdop; int LastCntNovatelTime; int LastCntNovatelBestpos; int LastCntNovatelBestvel; int LastCntNovatelHeading; int LastCntNovatelPsrdop; int PpsNovatelTime; int PpsNovatelBestpos; int PpsNovatelBestvel; int PpsNovatelHeading; int PpsNovatelPsrdop; } NovatelStruct; extern void NovatelDecodeTime(NovatelStruct *sol,uint8_t frame[]); extern void NovatelDecodeBestvel(NovatelStruct *sol,uint8_t frame[]); extern void NovatelDecodeHeading(NovatelStruct *sol,uint8_t frame[]); extern void NovatelDecodeBestpos(NovatelStruct *sol,uint8_t frame[]); extern void NovatelDecodePsrdop(NovatelStruct *sol,uint8_t frame[]); extern void NovatelDecodeInit(NovatelStruct *sol); extern void NovatelDecodeStats(NovatelStruct *sol); #endif