Files

259 lines
6.7 KiB
C

/*============================================================================================
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