/*============================================================================================ Copyright(c) 2018 Quectel Wierless Solution,Co.,Ltd. All Rights Reserved. Quectel Wireless Solution Proprietary and Confidential. ============================================================================*/ #ifndef __QUEC_GPS_H__ #define __QUEC_GPS_H__ #ifdef __cplusplus extern "C" { #endif #include "quec_nmea_parse.h" #define HX_GSV_MAX_SATS 32 #define QUEC_GPS_CLOSE 0 #define QUEC_GPS_OPEN 1 #define QUEC_GPS_OUTPT_NMEA 2 #define QUEC_GPS_OPEN_EVENT (1<<0) #define QUEC_GPS_CLOSE_EVENT (1<<1) #define QUEC_GPS_NMEA_PARSE_EVENT (1<<2) #define QUEC_AGPS_DATA_REQ_EVENT (1<<3) #define QUEC_APFLSH_REQ_EVENT (1<<4) #define QUEC_GPS_APFLASH_EVENT (1<<5) #define QUEC_GPS_DOWNLOAD_FIRM (1<<6) #define QUEC_GPS_RESTART (1<<7) #define QUEC_GPS_EVENT_MASK (QUEC_GPS_OPEN_EVENT | QUEC_GPS_CLOSE_EVENT | QUEC_GPS_NMEA_PARSE_EVENT \ |QUEC_AGPS_DATA_REQ_EVENT |QUEC_APFLSH_REQ_EVENT| QUEC_GPS_APFLASH_EVENT | QUEC_GPS_RESTART) #define QUEC_GPS_INIT_STATE 0 #define QUEC_NMEA_PASRE_STATE (1<<0) #define QUEC_GPS_RESET_STATE (1<<1) #define QUEC_APFLASH_REQED (1<<2) /*开机第一次请求apflash数据已经完成*/ #define QUEC_POWER_ON 1 #define QUEC_POWER_OFF 0 #define NMEA_CLOSE 0 #define GGA_EN (1<<0) #define RMC_EN (1<<1) #define GSV_EN (1<<2) #define GSA_EN (1<<3) #define VTG_EN (1<<4) #define GLL_EN (1<<5) enum { GPS_SYS =0, GPS_BEIDOU_SYS, GPS_BEIDOU_GALILEO_GLONASS_SYS, GPS_GLONASS_GALILEO_SYS = 3, GPS_GLONASS_SYS, GPS_BEIDOU_GALILEO_SYS, GPS_GALILEO_SYS, BEIDOU_SYS, GPS_BEIDOU_GLONASS_SYS, };//CC1161新增2,8两个组合 typedef enum { GNSS_SYS=0, BEIDOU_ONLY, }hx_gnss_sys_t; enum { QUEC_GPS_NO_ERROR = 0, QUEC_GPS_NOT_OPEN_ERROR, QUEC_GPS_ALREADY_CLOSED_ERROR, QUEC_GPS_NOT_EXIST_ERROR, QUEC_GPS_RESP_MSG_ERROR, QUEC_GPS_CMD_MSG_ERROR, QUEC_GPS_ERROR, }; #define HX_GPS_MODULE 0xBDE33982 /*和芯星通制造商*/ typedef enum { GPS_UNKNOW, GPS_OK_CMD=0x01, GPS_FAIL_CMD, GPS_AIDINFO_RESP , GPS_CFGGEOID_RESP, GPS_PDTINFO_RESP }quec_gnss_cmd_resp; /**************************GNSS CMD***************************/ typedef enum { QUEC_GNSS_UNKNOW_TYPE, QUEC_GNSS_BAUD_SET, QUEC_GNSS_PDTINFO_CMD, QUEC_GNSS_NMEA_TYPE, QUEC_GNSS_CFGSYS, QUEC_GNSS_HOT_RESET, QUEC_GNSS_WARM_RESET, QUEC_GNSS_COLD_RESET, QUEC_GNSS_AGPS_AIDINFO_REQ, QUEC_GNSS_CFG_GEOID_REQ, QUEC_GNSS_CFG_GEOID_SET, QUEC_GNSS_AIDPOS_SET, QUEC_GNSS_AIDTIME_SET, QUEC_GNSS_1PPS_CONFIG, QUEC_GNSS_MAX_CMD, }quec_gnss_cmd; enum { SV_NEED_UPDATE, SV_UPDATING, SV_UPDATED, }; typedef struct hx_locate_struct { /*是否有效定位*/ unsigned char valid; /*经度*/ double longitude; /*经度E(东经)或W(西经)*/ unsigned char longitude_cardinal; /*纬度*/ double latitude; /*纬度N(北纬)或S(南纬)*/ unsigned char latitude_cardinal; /*hdop精度*/ float hdop; /*phop精度*/ float pdop; /*航向 0-360*/ float heading; /*速度 km/h*/ float gps_speed; /*信号强度,max=5, data from avg_snr*/ unsigned char gps_signal; /*最大信号?? db*/ unsigned int max_cnr; unsigned int max_cnr2; /*最小信号?? db*/ unsigned int min_cnr; /*平均信号?? db*/ unsigned int avg_cnr; /*信号值数??*/ unsigned int cnrs[HX_GSV_MAX_SATS]; unsigned int cnrs_index; /*定位卫星数量*/ unsigned int satellites_num; /*海拔高度*/ float altitude; /*FWVER*/ char fwver[32]; struct tm time; unsigned char quality; unsigned char navmode; /*定位模式*/ unsigned char fix_mode; /*VTG:地面速率 单位:节*/ double sog; /*VTG:地面速率 单位:km/h*/ double kph; /*VTG:地面航向*/ double cogt; /*一组GSV更新状态*/ unsigned char gsv_status; }hx_locationg_t; typedef struct { char gps_sate_num; char gps_sate_vaild_num; char bds_sate_num; char bds_sate_vaild_num; char gal_sate_num; char gal_sate_vaild_num; char glo_sate_num; char glo_sate_vaild_num; }quec_gnss_sate_num_t; typedef struct quec_gnps_msg { unsigned short cmd_id; int len; char *data; }quec_gps_msg_t; typedef void (*nmea_str_put) (struct tm *time ,char *nmea ,int length); typedef void (*location_update) (hx_locationg_t *gps_data); typedef void (*gps_open_success) (void); /*打开gps成功回调*/ typedef void (*gnss_ephemeris_info)(quec_gnss_sate_num_t * gnss_sate_num); typedef void (*gps_packet_put) (char *packet ,int length); typedef struct { int (*q_gps_open) (void); /*打开gps模块*/ int (*q_gps_close) (void); /*关闭gps模块*/ int (*q_gps_reset) (int type); /*重启gps模块*/ void (*q_reg_nmea_str_cb) (nmea_str_put cb); void (*q_reg_location_update_cb) (location_update cb); void (*q_reg_open_gps_success_cb) (gps_open_success cb); void (*q_reg_agps_sate_num_cb) (gnss_ephemeris_info cb); void (*q_reg_nmea_packet_cb) (gps_packet_put cb); }QUEC_GPS_OPS; typedef struct { gps_open_success open_gps_success_cb; nmea_str_put nmea_str_cb; /*nmea 解析回调,用于上层去获取单条nmea语句*/ location_update loaction_update_cb; /*位置更新回调,用于将解析后的位置信息更新到上层*/ gnss_ephemeris_info gnss_ephemeris_info_cb; /*星历检查是否有效回调*/ gps_packet_put nmea_packets_cb; }QUEC_NMEA_CB; typedef struct quec_gps_dev { unsigned int gps_manufacturer; /*gps模组制造商*/ char power_state; /*GPS上电状态*/ int worke_state; /*GPS工作状态*/ void *gps_event_flag_ref; void *gps_task_ref; void *gps_keep_alive_timer; QUEC_GPS_OPS *ops; QUEC_NMEA_CB *nmea_cb; }QUEC_GPS_DEV_T; typedef struct quec_gnss_quick_start { char reset_flag; hx_locationg_t data; }quec_gnss_quick_start_t; QUEC_GPS_DEV_T *quec_get_gps_dev(void); int quec_gps_open(void); int quec_gps_close(void); hx_locationg_t * hx_location_data_get(void); int quec_gnss_cmd_send(quec_gps_msg_t *rcv); int quec_gnss_resp_process(quec_gps_msg_t *rcv); void quec_apflash_req_flag_set(void); void quec_gps_init(void); int quec_hx_gnss_sys_set(int sys_type); int quec_hx_gnss_nmea_set(char value); void *quec_get_gnss_sate_num(void); void quec_agps_req_flag_set(void); #ifdef __cplusplus } #endif #endif