Files
smod_atsc_app/atsc_app/inc/gps.h
T

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