545 lines
12 KiB
C
545 lines
12 KiB
C
#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
|
|
|
|
|