#ifndef GPS_H #define GPS_H #include "type.h" #include "config.h" #define GPS_COMM_NUM 0 #define GPS_COMM_BAUD (9600) #ifndef SYSTICKHZ #define SYSTICKHZ OS_TICKS_PER_SEC #endif #define GPS_FRAME_DEBUG 0 #define GPS_INFO_DEBUG 0 #define GPS_TEST_DEBUG 0 //调试使用,正式版本关闭 #if GPS_FRAME_DEBUG #define gps_frame_printf printf #else #define gps_frame_printf(p,...) do{;}while(0) #endif #if GPS_INFO_DEBUG #define gps_info_printf printf #else #define gps_info_printf(p,...) do{;}while(0) #endif #define UBLOX_SYNC_CHAR1 (0XB5) #define UBLOX_SYNC_CHAR2 (0X62) #define UBLOX_MAX_DATE_SND_BUF_LEN 100 //发送缓冲区大小 #define UBLOX_MAX_DATE_REC_BUF_LEN 400 //接收缓冲区大小 #define UBLOX_CFG_MSG_MAX (10) #define UBLOX_MON_HW_READ_CYCLE 10 //单位s #define UBLOX_TP5_FREQ_PULSE_RATIO (50) #define UBLOX_TP5_FREQ_PERIOD (0) //默认配置为8M #define UBLOX_TP5_FREQ_PULSE_LEN_RATIO(per) ((uint32)(0xFFFFFFFFUL/(100/per)+1)) #define UBLOX_TIME_MODE_DISABLE 0 #define UBLOX_TIME_MODE_SURVEY_IN 1 #define UBLOX_TIME_MODE_FIXED_MODE 2 #define UBLOX_FIND_SAT_TIME 180 //配置为survey in模式时,配置的等待时间 #define UBLOX_FIND_SAT_ACCURACY 5 //配置为survey in模式时,配置的精度值 #define UBLOX_NO_SAT_TIMEOUT (UBLOX_FIND_SAT_TIME+100) //在配置时间基础上增加一定余量 #define UBLOX_LOCK_TO_UNLOCK_TIMEWAIT (3*60*SYSTICKHZ) //锁定变为失锁等待时间 #define UBLOX_RXM_RAW_READ_INTERVAL 0 //60 //读取卫星原始数据信息周期,单位秒,0,关闭 #define UBLOX_RXM_RAW_MAX_SV_NUM 12 //最多解析的卫星个数 typedef enum { UBLOX_STATE_ANT_CFG_READ = 0, UBLOX_STATE_ANT_CFG, UBLOX_STATE_TP5_CFG_READ, //先读取,在配置 UBLOX_STATE_TP5_CFG, UBLOX_STATE_TP5_CFG2, //需两条命令,此命令仅配置pulse 模式 UBLOX_STATE_MODE_READ, UBLOX_STATE_MODE_CFG, UBLOX_STATE_MSG_CFG, //仅需额外配置一个消息,若由多个,需重复配置 UBLOX_STATE_SAVE_CFG, UBLOX_STATE_INIT_OVER }E_UBLOX_STATE; #pragma pack(1) //__packed typedef struct { uint16 flag; uint16 pins; }S_UBLOX_ANT_PARA; //__packed typedef struct { uint8 tp_index; uint8 reserved0; uint16 reserved1; int16 ant_cable_delay; int16 rf_group_delay; uint32 freq_period; uint32 freq_period_lock; uint32 pulse_len_ratio; uint32 pulse_len_ratio_lock; int32 user_config_delay; uint32 flags; }S_UBLOX_TP5_PARA; //__packed typedef struct { uint32 time_mode; int32 fixed_posx; int32 fixed_posy; int32 fixed_posz; uint32 fixed_pos_var; uint32 svin_mindur; uint32 svin_varlinmit; }S_UBLOX_TMODE_PARA; //__packed typedef struct { uint32 pin_sel; uint32 pin_bank; uint32 pin_dir; uint32 pin_var; uint16 noise_perms; uint16 agc_cnt; uint8 a_status; uint8 a_power; uint8 flags; uint8 reserved1; int32 used_mask; uint8 vp[25]; uint8 jam_ind; uint16 reserved2; int32 pin_irq; int32 pull_h; int32 pull_l; }S_UBLOX_HW_PARA; //__packed typedef struct { uint32 clear_mask; uint32 save_mask; uint32 load_mask; uint8 device_mask; }S_UBLOX_CFG_PARA; //__packed typedef struct { uint16 nav_bbr_mask; uint8 reset_mode; uint8 reserved1; }S_UBLOX_RST_PARA; #pragma pack() typedef struct { double cp_mes; double pr_mes; float do_mes; uint8 sv; int8 mes_qi; int8 cno; uint8 lli; }S_UBLOX_RAW_SV_PARA; typedef struct { int32 i_tow; int16 week; uint8 num_sv; uint8 reserved1; S_UBLOX_RAW_SV_PARA sv_raw[UBLOX_RXM_RAW_MAX_SV_NUM]; }S_UBLOX_RAW_PARA; typedef struct { uint32 i_tow; uint8 gps_fix; uint8 flags; uint8 fix_stat; uint8 flags2; uint32 ttff; uint32 msss; }S_UBLOX_NAV_STATUS_PARA; typedef struct { S_UBLOX_ANT_PARA ant_para; S_UBLOX_TP5_PARA tp5_para; S_UBLOX_TMODE_PARA mode_para; S_UBLOX_HW_PARA hw_para; S_UBLOX_CFG_PARA cfg_para; S_UBLOX_RST_PARA rst_para; #if UBLOX_RXM_RAW_READ_INTERVAL!=0 S_UBLOX_RAW_PARA raw_para; #endif }S_UBLOX_PARA,*pS_UBLOX_PARA; typedef enum { UBLOX_MSG_ACK = 0X05, UBLOX_MSG_CFG = 0X06, UBLOX_MSG_MON = 0x0A, UBLOX_MSG_RXM = 0X02, UBLOX_MSG_NAV = 0X01, }E_UBLOX_MSG_TYPE; typedef enum { UBX_CFG_RST = 0x04, UBX_CFG_ANT = 0x13, UBX_CFG_CFG = 0x09, //保存参数 UBX_CFG_MSG = 0x01, UBX_CFG_NAV5 = 0x24, UBX_CFG_NAVX5 = 0x23, UBX_CFG_TP5 = 0x31, UBX_CFG_MODE = 0x1d, }E_UBLOX_CFG_INDEX; typedef enum { UBX_MON_HW = 0x09, UBX_MON_HW2 = 0x0B, }E_UBLOX_MON_INDEX; typedef enum { UBX_RXM_RAW = 0x10, }E_UBLOX_RXM_INDEX; typedef enum { UBX_NAV_STATUS = 0x03, }E_UBLOX_NAV_INDEX; typedef enum { UBX_ACK_NAK = 0x00, UBX_ACK_ACK = 0x01, }E_UBLOX_ACK_INDEX; typedef enum { UBX_CFG_READ, UBX_CFG_WRITE1, UBX_CFG_WRITE2, }E_UBLOX_CFG_TYPE; typedef enum { UBX_NAV_GPS_NO_FIX = 0, UBX_NAV_GPS_DEAD_RECKONING_ONLY, UBX_NAV_GPS_2D_FIX, UBX_NAV_GPS_3D_FIX, UBX_NAV_GPS_DEAD_RECKONING_COMBINED, UBX_NAV_GPS_TIME_ONLY_FIX, }E_UBLOX_NAV_STATE_GPS_FIX_STATE; /*CFG-ANT*/ //Antenna Flag Mask #define ENABLE_ANTENNA_VOLTAGE_SIGNAL (1<<0) #define ENABLE_SHORT_CIRCUIT_DETECTION (1<<1) #define ENABLE_OPEN_CIRCUIT_DETECTION (1<<2) #define ENABLE_POWER_DOWN_AUTO (1<<3) #define ENALBE_AUTOMATIC_RECOVERY (1<<4) //Antenna Pin Configuration #define ANT_PIN_SWITCH (1<<4) #define ANT_PIN_SCD (1<<9) #define ANT_PIN_OCD (1<<14) #define ANT_RECONFIG (1<<15) /*CFG-CFG*/ //Clear Mask Save Mask Load Mask #define MASK_IO_PORT (1<<0) #define MASK_MSG_CONF (1<<1) #define MASK_INF_MSG (1<<2) #define MASK_NAV_CONF (1<<3) #define MASK_RXM_CONF (1<<4) #define MASK_RINV_CONF (1<<9) #define MASK_ANT_CONF (1<<10) //device Mask #define MASK_DEV_BBR (1<<0) #define MASK_DEV_FLASH (1<<1) #define MASK_DEV_EEPROM (1<<2) #define MASK_DEV_SPI_FLASH (1<<4) /*CFG-NAV5*/ #define MASK_DYN_SET (1<<0) #define MASK_MIN_EL_SET (1<<1) #define MASK_FIX_MODE_SET (1<<2) #define MASK_DR_LIM_SET (1<<3) #define MASK_POS_SET (1<<4) #define MASK_TIME_SET (1<<5) #define MASK_STATIC_HOLD_SET (1<<6) #define MASK_DGPS_SET (1<<7) /*CFG-TP5*/ #define MASK_TP5_ACTIVE (1<<0) #define MASK_TP5_LOCK_GPS_FREQ (1<<1) #define MASK_TP5_LOCKED_OTHER_SET (1<<2) #define MASK_TP5_IS_FREQ (1<<3) #define MASK_TP5_IS_LENGTH (1<<4) #define MASK_TP5_ALIGN_TO_TOW (1<<5) #define MASK_TP5_PLOARITY (1<<6) #define MASK_TP5_GRID_UTC_GPS (1<<7) #define DYN_MODEL_PORTABLE 0 #define DYN_MODEL_STATIONARY 2 #define FIX_MODE_2D 1 #define FIX_MODE_3D 2 #define FIX_MODE_AUTO 3 enum { UBLOX_RST_BBR_HOTSTART = 0, UBLOX_RST_BBR_WARMSTART, UBLOX_RST_BBR_COLDSTART=0XFFFF, }; enum { UBLOX_RST_HARDWARE = 0, UBLOX_RST_SOFTWARE, UBLOX_RST_GPS_ONLY, UBLOX_RST_HARDWARE_AFTER_SHUTDOWN = 4, UBLOX_RST_GPS_STOP = 0X08, UBLOX_RST_GPS_START = 0X09 }; #pragma pack(1) //UBX配置命令结构 //__packed typedef struct { uint8 ck_a; uint8 ck_b; }UBLOX_UBX_SUM,*pUBLOX_UBX_SUM; //__packed typedef struct { uint8 frame_class; uint8 frame_id; }UBLOX_FRAME_CLASS_ID; //__packed typedef struct { uint8 sync_char1; //0XB5 uint8 sync_char2; //0X62 固定字节 uint8 cfg_class; uint8 cfg_id; uint16 length; uint8 *pdata; UBLOX_UBX_SUM sum; }S_UBLOX_UBX_MSG,*pS_UBLOX_UBX_MSG; #pragma pack() extern S_UBLOX_HW_PARA *gps_ublox_get_hw_info(void); typedef enum { GPS_ERROR_OK = 0, GPS_ERROR_HEADER, GPS_ERROR_FORMAT, GPS_ERROR_NUM, GPS_ERROR_SUM, GPS_ERROR_INVALID, GPS_ERROR_PTR_INVALID, }E_GPS_ERROR; #ifndef ERR #define ERR 1 #endif #ifndef OK #define OK 0 #endif #define MAX_GPS_UART_LENGTH (1024) //最大长度 #define MAX_REC_LENGTH (MAX_GPS_UART_LENGTH-64) //最大接收长度 #define LOCAL_AREA 8 #define LOCAL_AREA_HOURE (LOCAL_AREA*10000) #define INT_TO_FLOAT_PTR(i) (*((float *)&(i))) #define INT_TO_DOUBLE_PTR(i) (*((double *)&(i))) #define FLOAT_TO_INT_PTR(f) (*((uint32 *)&(f))) #define DOUBLE_TO_INT_PTR(f) (*((uint64 *)&(f))) typedef enum { MSG_UNKNOW, //未知 MSG_START, MSG_DA, //日期时间 MSG_SA, //卫星 MSG_POLYP, MSG_UBX, }MSG_E; typedef struct { MSG_E msgtype; uint16 rxReclen; uint16 procflag; uint8 rxRec[MAX_GPS_UART_LENGTH]; }PROC_BUFFER_S; typedef enum {AUTO,MANUAL} SMODE_E; typedef enum {NO_FIXED=1,FIXED2D,FIXED3D} FIX_STATUS_E; typedef struct { SMODE_E mode; FIX_STATUS_E fix_status; //Fix Status :1,2,3 与上边不一样1 No fix 2:2D fixed 3:3D fixed uint32 sv; //需要根据返回报文解析,根据协议,该字段共返回12个,若未使用,返回为空 uint32 pdop; uint32 hdop; uint32 vdop; }GPGSA_T; typedef struct { uint16 integer; //纬度的整数部分 ddmm uint32 ft; //纬度的小数部分 mmmmmm //十进制,最多6位 uint32 hemisphere; //半球 N(0), S(1) }LATITUDE_T; typedef struct { uint16 integer; //经度的整数部分 dddmm uint32 ft; //经度的小数部分 mmmmmm //十进制,最多6位 uint32 direction; //方向 E(0), W(1) }LONGITUDE_T; typedef struct { BOOL valid; LATITUDE_T latitude; //纬度信息 LONGITUDE_T longitude; //经度信息 }POLYP_T; //时间均为UTC标准 typedef struct { uint8 valid; uint8 sec; uint8 min; uint8 hour; uint16 ms; uint8 day; uint8 month; uint16 year; uint32 zone_hour; uint32 zone_min; uint32 kph; uint32 fix_kph; }GPZDA_T; typedef enum{NORTH,SOUTH}HEM_E; typedef struct { uint64 lat; HEM_E hem; }LAT_S; //纬度 typedef enum{EAST,WEST}DIRECT_E; typedef struct { uint64 lot; DIRECT_E direct; }LOT_S; //经度 typedef struct { uint16 sec; uint16 min; uint16 hour; uint16 day; uint16 month; uint16 year; uint32 valid; //结构体前半部分要与S_SYS_TIME变量内容保持一致 uint16 ms; LATITUDE_T latitude; //纬度信息 LONGITUDE_T longitude; //经度信息 uint32 speed; //浮点类型 uint32 cmg; //浮点类型 uint32 mv; uint32 mvd; uint32 mode; }GPRMC_T; extern void ublox_proc_state(void); extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); extern E_GPS_ERROR gps_proc_POLYP(uint8 *pbuf); extern E_GPS_ERROR gps_proc_GPRMC(uint8 *pbuf); extern E_GPS_ERROR gps_proc_GPGSA(uint8 *pbuf); extern uint32 check_delay_over(uint32 *ptick,uint32 cycle); extern uint32 str_to_int(uint8 *pbuf,uint8 len,uint32 *result); extern uint32 str_to_hex(uint8 *pbuf,uint8 len,uint32 *result); extern uint32 str_to_float(uint8 *pbuf,uint8 len,uint32 *result); extern uint32 str_to_double(uint8 *pbuf,uint8 len,uint64 *result); extern uint32 gps_check_sum(uint8 *pbuf); extern uint8 gps_get_sum(uint8 *pbuf,uint32 len); extern void utc_to_localtime(GPRMC_T *ptime); extern void inc_day(GPRMC_T *ptime); extern uint32 gps_set_date(uint8 *pbuf); extern uint32 gps_set_time(uint8 *pbuf); extern void inc_hour(GPRMC_T *p,uint8 num); extern void dec_hour(GPRMC_T *ptime,uint8 num); extern S_SYS_TIME *gps_get_time(void); extern GPGSA_T *gps_get_sa(void); extern POLYP_T *gps_get_polyp(void); extern void gps_lcd_show(void); extern uint32 gps_set_area(uint8 *pbuf); extern uint32 get_init_flag(void); extern pS_RUN_TIME sys_get_run_time(void); extern void gps_hw_reset(void); //void gps_task(void * pvParameters); extern void gps_ublox_init(void); #endif