From: p15692025051 <846603105@qq.com> Date: Thu, 12 Oct 2023 09:15:46 +0000 (+0800) Subject: GNSSc端解析,只改了K5 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=18fefb3accb0625b8c300ce49da472ddf7e8ea46;p=mirrors%2FASR1603_G5.git GNSSc端解析,只改了K5 --- diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgnss.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgnss.c index 02fe4d85..c46ba13f 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgnss.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgnss.c @@ -36,14 +36,15 @@ #include "runtime.h" -#if MICROPY_QPY_MODULE_QUECGNSS +#if 1 #include "helios_debug.h" #include "helios_gnss.h" -#define MOD_GNSS_LOG(msg, ...) custom_log(GNSS, msg, ##__VA_ARGS__) - +//#define MOD_GNSS_LOG(msg, ...) custom_log(GNSS, msg, ##__VA_ARGS__) +#define MOD_GNSS_LOG(msg, ...) +Helios_Thread_t GNSS_thread_id =0; static c_callback_t *g_usr_callback = NULL; @@ -76,15 +77,17 @@ STATIC mp_obj_t mp_gnss_register_usr_callback(mp_obj_t callback) } STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_gnss_register_usr_callback_obj, mp_gnss_register_usr_callback); -#if defined(PLAT_Unisoc_8850) +#if defined(PLAT_Unisoc_8850) || defined(PLAT_Qualcomm) STATIC mp_obj_t mp_gnss_set_priority(mp_obj_t priority) { - int ret=0; + int ret = 0; int pri = mp_obj_get_int(priority); - if ((pri < 0) || (pri > 3)) + if ((pri < HELIOS_GNSS_PRIORITY_GROUP_0) || (pri >= HELIOS_GNSS_PRIORITY_GROUP_MAX)) { - mp_raise_ValueError("invalid value, priority should be in [0,3]."); + char errmsg[64] = {0}; + sprintf(errmsg, "invalid value, priority should be in [%d,%d).", HELIOS_GNSS_PRIORITY_GROUP_0, HELIOS_GNSS_PRIORITY_GROUP_MAX); + mp_raise_ValueError(errmsg); } ret = Helios_GNSS_SetGnssLtePriority((Helios_GNSS_LTE_Priority)pri); return mp_obj_new_int(ret); @@ -104,18 +107,278 @@ STATIC mp_obj_t mp_gnss_get_priority(void) STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_gnss_get_priority_obj, mp_gnss_get_priority); #endif +//查找最近的相同字符,查到返回偏移量,查补到返回-1 +int Find_char(char *data ,char c) +{ + int i=0; + int len = strlen(data); + for(i = 0;i<65536;i++) + { + if(i > (len-1) || data[i] == c ) + break; + } + if(i > (len-1) || i >= 65536) + return -1; + else + return i; +} +int gnss_enable = 0; +#define GNSS_Parser_len 120 +#define GNSS_Parser_gsv_len 64 +typedef struct _GNSS_data +{ + char rmc_data[GNSS_Parser_len+1]; + char vtg_data[GNSS_Parser_len+1]; + char gga_data[GNSS_Parser_len+1]; + char unsigned gsv_data[GNSS_Parser_gsv_len*2]; + int gsv_data_len; +}GNSS_data; +GNSS_data GNSS_Parser_data = {0}; +void GNSS_Nmea_Parser(GNSS_data *data, char *recbuff) +{ + char* buff_tmp = NULL; + int Parser_len = 0; + + memset(data,0,sizeof(GNSS_data)); + while(*recbuff) + { + if(*recbuff == '$') + { + if(memcmp(recbuff+3,"GGA",3) == 0) + { + buff_tmp = strstr(recbuff,"\r\n"); + if(buff_tmp) + { + + Parser_len = buff_tmp - recbuff; + if (Parser_len > GNSS_Parser_len) + Parser_len = GNSS_Parser_len; + memcpy(data->gga_data,recbuff,Parser_len); + data->gga_data[Parser_len] = 0; + recbuff = buff_tmp; + //MOD_GNSS_LOG("gga_data:%s\n",data->gga_data); + } + }else if(memcmp(recbuff+3,"RMC",3) == 0) + { + buff_tmp = strstr(recbuff,"\r\n"); + if(buff_tmp) + { + + Parser_len = buff_tmp - recbuff; + if (Parser_len > GNSS_Parser_len) + Parser_len = GNSS_Parser_len; + memcpy(data->rmc_data,recbuff,Parser_len); + data->rmc_data[Parser_len] = 0; + recbuff = buff_tmp; + //MOD_GNSS_LOG("rmc_data:%s\n",data->rmc_data); + } + }else if(memcmp(recbuff+3,"VTG",3) == 0) + { + buff_tmp = strstr(recbuff,"\r\n"); + if(buff_tmp) + { + Parser_len = buff_tmp - recbuff; + if (Parser_len > GNSS_Parser_len) + Parser_len = GNSS_Parser_len; + memcpy(data->vtg_data,recbuff,Parser_len); + data->vtg_data[Parser_len] = 0; + recbuff = buff_tmp; + //MOD_GNSS_LOG("vtg_data:%s\n",data->vtg_data); + } + } + else if(memcmp(recbuff+3,"GSV",3) == 0) + { + buff_tmp = strstr(recbuff,"\r\n"); + if(buff_tmp) + { + //char *gsv_data = ; + char data_tmp[11] = {0}; + int gsv_count = 0; + Parser_len = buff_tmp - recbuff; + // if (Parser_len > GNSS_Parser_len) + // Parser_len = GNSS_Parser_len; + //memcpy(gsv_data,recbuff,Parser_len); + char *gsv_data_tmp = recbuff; + //MOD_GNSS_LOG("gsv_data:%s\n",gsv_data); + while(*gsv_data_tmp) + { + Parser_len--; + if(Parser_len <= 0) + break; + if(*gsv_data_tmp == ',') + { + gsv_data_tmp++; + gsv_count++; + if(gsv_count>3) + { + if(gsv_count%4 == 0 || gsv_count%4 == 3)//卫星信噪比 卫星编号 + { + memset(data_tmp,0,11); + int len_tmp = Find_char(gsv_data_tmp,','); + //MOD_GNSS_LOG("Find_char1:len:%d %s\n",len_tmp,gsv_data_tmp); + if( len_tmp == -1) + break; + if(len_tmp > 10) + len_tmp = 10; + memcpy(data_tmp,gsv_data_tmp,len_tmp); + // if(data->gsv_data_len%2 != 0 && data->gsv_data_len >= 1) + // data->gsv_data_len--; + if(len_tmp>0) + data->gsv_data[data->gsv_data_len] = (unsigned char)atoi(data_tmp); + else + data->gsv_data[data->gsv_data_len] = 0; + //MOD_GNSS_LOG("gsv_data: [%d]:",data->gsv_data[data->gsv_data_len]); + data->gsv_data_len++; + } + // if(gsv_count%4 == 3)//卫星信噪比 + // { + // memset(data_tmp,0,11); + // int len_tmp = Find_char(gsv_data_tmp,','); + // //MOD_GNSS_LOG("Find_char2:len:%d %s\n",len_tmp,gsv_data_tmp); + // if( len_tmp == -1) + // break; + // if(len_tmp > 10) + // len_tmp = 10; + // memcpy(data_tmp,gsv_data_tmp,len_tmp); + // // if(data->gsv_data_len%2 != 1 && data->gsv_data_len >= 1) + // // data->gsv_data_len--; + // if(len_tmp>0) + // data->gsv_data[data->gsv_data_len] = (char)atoi(data_tmp); + // else + // data->gsv_data[data->gsv_data_len] = 0; + // //MOD_GNSS_LOG("[%d]:%d \n",data->gsv_data[data->gsv_data_len-1],data->gsv_data[data->gsv_data_len]); + // data->gsv_data_len++; + // } + if(data->gsv_data_len >= GNSS_Parser_gsv_len*2) + break; + } + } + else if(*gsv_data_tmp == '*') + break; + else + gsv_data_tmp++; + } + + recbuff = buff_tmp; + } + } + } + recbuff++; + } +} +void GNSS_thread_entry(void * argv) +{ + MOD_GNSS_LOG("GNSS_thread_entry:1!!!\n"); + //MP_THREAD_GIL_EXIT(); + int ret = Helios_GNSS_Switch(HELIOS_GNSS_ENABLE);//开启 + //MP_THREAD_GIL_ENTER(); + int recbuff_len_max = 4096; + char *recbuff=NULL; + //MOD_GNSS_LOG("GNSS_thread_entry:2!!!\n"); + recbuff = calloc(1, recbuff_len_max + 1); + if(NULL==recbuff) + { + MOD_GNSS_LOG("malloc err.\r\n"); + return ; + } + //MOD_GNSS_LOG("GNSS_thread_entry:3!!!\n"); + while(gnss_enable) + { + memset(recbuff, 0, recbuff_len_max + 1); + //MP_THREAD_GIL_EXIT(); + ret = Helios_GNSS_GetNmea((unsigned char *)recbuff, recbuff_len_max); + //recbuff[recbuff_len_max] = 0; + MOD_GNSS_LOG("Helios_GNSS_GetNmea:%d\n",ret); + //MOD_GNSS_LOG("recbuff:\n%s\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",recbuff); + //MP_THREAD_GIL_ENTER(); + if (ret != 0) + { + break; + } + //GNSS_Parser_data = {0}; + GNSS_Nmea_Parser(&GNSS_Parser_data,recbuff); + MOD_GNSS_LOG("\nGNSS_Nmea_Parser!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + Helios_msleep(1000); + } + if(NULL != recbuff) + { + free(recbuff); + recbuff=NULL; + } + // MP_THREAD_GIL_EXIT(); + // Helios_GNSS_Switch(HELIOS_GNSS_DISABLE);//关闭 + // MP_THREAD_GIL_ENTER(); + + //Helios_Thread_Delete(GNSS_thread_id); + GNSS_thread_id = 0; + MOD_GNSS_LOG("GNSS_thread_entry1:end\n"); + Helios_Thread_Exit(); + MOD_GNSS_LOG("GNSS_thread_entry2:end\n"); +} +Helios_ThreadAttr ThreadAttr_GNSS = { + .name = "GNSS_thead", + .stack_size = 1024*10, + .priority = 100, + .entry = GNSS_thread_entry, + .argv = NULL + }; +STATIC mp_obj_t mp_get_gnss_gsv(void) +{ + mp_obj_t tuple[GNSS_Parser_gsv_len*2]; + for(int i = 0;i 2)) + int gnss_enable_t = mp_obj_get_int(opt); + if ((gnss_enable_t < 0) || (gnss_enable_t > 3)) { mp_raise_ValueError("invalid value, opt should be in [0,2]."); + return mp_obj_new_int(-1); } - MP_THREAD_GIL_EXIT(); - ret = Helios_GNSS_Switch((Helios_GnssSW)gnss_enable); - MP_THREAD_GIL_ENTER(); + MOD_GNSS_LOG("gnss_enable_t:%d\n",gnss_enable_t); + if(gnss_enable_t == HELIOS_GNSS_ENABLE_THREAD && gnss_enable != HELIOS_GNSS_ENABLE_THREAD)//需要开启线程解析 + { + GNSS_thread_id = Helios_Thread_Create(&ThreadAttr_GNSS); + MOD_GNSS_LOG("open GNSS_thread %d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",GNSS_thread_id); + }else + { + MP_THREAD_GIL_EXIT(); + + + ret = Helios_GNSS_Switch((Helios_GnssSW)gnss_enable_t);// + + MP_THREAD_GIL_ENTER(); + } + + gnss_enable = gnss_enable_t; + return mp_obj_new_int(ret); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_gnss_switch_obj, mp_gnss_switch); @@ -146,16 +409,16 @@ STATIC mp_obj_t mp_gnss_nmea_read(mp_obj_t size) recbuff_len_max = mp_obj_get_int(size); recbuff = calloc(1, recbuff_len_max + 1); - memset(recbuff, 0, recbuff_len_max + 1); + if(NULL==recbuff) { MOD_GNSS_LOG("malloc err.\r\n"); return mp_obj_new_int(-1); } - + memset(recbuff, 0, recbuff_len_max + 1); MP_THREAD_GIL_EXIT(); - int ret = Helios_GNSS_GetNmea(recbuff, recbuff_len_max); + int ret = Helios_GNSS_GetNmea((unsigned char*)recbuff, recbuff_len_max); MP_THREAD_GIL_ENTER(); if (ret != 0) @@ -229,7 +492,25 @@ STATIC mp_obj_t qpy_module_gnss_deinit(void) } STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_gnss_deinit_obj, qpy_module_gnss_deinit); +#if defined(PLAT_ASR_1606) +STATIC mp_obj_t qpy_module_gnss_config_set(mp_obj_t mp_config_type, mp_obj_t mp_config_value) +{ + int config_type = mp_obj_get_int(mp_config_type); + int config_value = mp_obj_get_int(mp_config_value); + int ret = Helios_GNSS_Configuration_Set((uint8_t)config_type, (uint8_t)config_value); + return mp_obj_new_int(ret); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_module_gnss_config_set_obj, qpy_module_gnss_config_set); +STATIC mp_obj_t qpy_module_gnss_config_get(mp_obj_t mp_config_type) +{ + int config_type = mp_obj_get_int(mp_config_type); + int ret = Helios_GNSS_Configuration_Get((uint8_t)config_type); + return mp_obj_new_int(ret); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_gnss_config_get_obj, qpy_module_gnss_config_get); +#endif + STATIC const mp_rom_map_elem_t gnss_module_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_quecgnss) }, { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mp_get_gnss_init_obj) }, @@ -237,16 +518,24 @@ STATIC const mp_rom_map_elem_t gnss_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_gnss_nmea_read_obj) }, { MP_ROM_QSTR(MP_QSTR_get_state), MP_ROM_PTR(&mp_get_gnss_state_obj) }, { MP_ROM_QSTR(MP_QSTR_gnssEnable), MP_ROM_PTR(&mp_gnss_switch_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_gsv), MP_ROM_PTR(&mp_get_gnss_gsv_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_gga), MP_ROM_PTR(&mp_get_gnss_gga_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_rmc), MP_ROM_PTR(&mp_get_gnss_rmc_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_vtg), MP_ROM_PTR(&mp_get_gnss_vtg_obj) }, { MP_ROM_QSTR(MP_QSTR_setCallback), MP_ROM_PTR(&mp_gnss_register_usr_callback_obj) }, #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) { MP_ROM_QSTR(MP_QSTR_enableGST), MP_ROM_PTR(&mp_gnss_nmea_set_gst_obj) }, //{ MP_ROM_QSTR(MP_QSTR_setSysType), MP_ROM_PTR(&mp_gnss_nmea_sys_type_cfg_obj) }, //{ MP_ROM_QSTR(MP_QSTR_getSysType), MP_ROM_PTR(&mp_gnss_nmea_sys_type_get_obj) }, #endif -#if defined(PLAT_Unisoc_8850) +#if defined(PLAT_Unisoc_8850) || defined(PLAT_Qualcomm) { MP_ROM_QSTR(MP_QSTR_setPriority), MP_ROM_PTR(&mp_gnss_set_priority_obj) }, { MP_ROM_QSTR(MP_QSTR_getPriority), MP_ROM_PTR(&mp_gnss_get_priority_obj) }, #endif +#if defined(PLAT_ASR_1606) + { MP_ROM_QSTR(MP_QSTR_configSet), MP_ROM_PTR(&qpy_module_gnss_config_set_obj) }, + { MP_ROM_QSTR(MP_QSTR_configGet), MP_ROM_PTR(&qpy_module_gnss_config_get_obj) }, +#endif }; STATIC MP_DEFINE_CONST_DICT(gnss_module_globals, gnss_module_globals_table); diff --git a/2.sdk/Helios_SDK/system/gnss/helios_gnss.h b/2.sdk/Helios_SDK/system/gnss/helios_gnss.h index 919d45c9..9537e903 100644 --- a/2.sdk/Helios_SDK/system/gnss/helios_gnss.h +++ b/2.sdk/Helios_SDK/system/gnss/helios_gnss.h @@ -44,6 +44,7 @@ typedef enum { HELIOS_GNSS_DISABLE, HELIOS_GNSS_ENABLE, + HELIOS_GNSS_ENABLE_THREAD, HELIOS_GNSS_RESET }Helios_GnssSW; diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py index a017c353..62b14c04 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py @@ -525,17 +525,19 @@ class FactoryModeLocationScreen(Screen): GNSS_DATA = GNSS_DATA + "{},{},{}\n".format("V",0,0) _DATA += "定位时间:{};{}秒\n".format(self.time_GNSS,time_tmp-self.time_count) + GSV_dict = msg[0][1] + #print("GET_LOCATION_DATA:{}".format(GSV_dict)) if GSV_dict : count = 0 try: for j in range(200): for key in GSV_dict : - if(int(key) != j): + if(key != j): continue #print("GSV_dict[key]:len:{}".format(len(GSV_dict[key]))) - if len(GSV_dict[key]) >= 1 : + if GSV_dict[key] >= 1 : GNSS_DATA+=" {:<3}:[{:<3}] ".format(key,GSV_dict[key])#:<3 宽度为3左对齐 count+=1 if count % 2 == 0: diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py index 0c2f10a5..4af04d30 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py @@ -23,6 +23,7 @@ import audio from machine import I2C from Gsensor import SC7A20 import pm +import ure try : from Hsensor import GH3018 except Exception as e: @@ -1868,8 +1869,8 @@ class LocationManager(Abstract): self.location_queue = Queue(100) self.lpm_fd = None self.start_agps = 0 - #quecgnss.init() - #quecgnss.gnssEnable(0) + quecgnss.init() + quecgnss.gnssEnable(0) @staticmethod def get_date(): return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) @@ -1879,20 +1880,20 @@ class LocationManager(Abstract): return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6]) def post_processor_after_instantiation(self): - _gps_cfg = { - "UARTn": UART.UART1, - "buadrate": 115200, - "databits": 8, - "parity": 0, - "stopbits": 1, - "flowctl": 0, - "PowerPin": Pin.GPIO2, - "StandbyPin": Pin.GPIO3, - "BackupPin": None, - "gps_mode": 0x01, - } - self.gps = GPS(**_gps_cfg) - self.gps.power_switch(0)#关闭GPS + # _gps_cfg = { + # "UARTn": UART.UART1, + # "buadrate": 115200, + # "databits": 8, + # "parity": 0, + # "stopbits": 1, + # "flowctl": 0, + # "PowerPin": Pin.GPIO2, + # "StandbyPin": Pin.GPIO3, + # "BackupPin": None, + # "gps_mode": 0x01, + # } + # self.gps = GPS(**_gps_cfg) + # self.gps.power_switch(0)#关闭GPS EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open) EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close) EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location) @@ -1917,6 +1918,7 @@ class LocationManager(Abstract): return self.location_thread_id = _thread.start_new_thread(self.location_thread, ()) self.location_flag = 1 + self.timer_read_GPS_info.start(1000, 1, self.location_timer) #self.gps_open(event, msg) @@ -1931,11 +1933,13 @@ class LocationManager(Abstract): self.location_flag = 1 #self.gps_open(event, msg) self.location_type = 1 + self.timer_read_GPS_info.start(1000, 1, self.location_timer) def close_location(self, event, msg): self.location_flag = 0 self.location_type = 0 + self.timer_read_GPS_info.stop() @@ -1946,8 +1950,6 @@ class LocationManager(Abstract): def WIFI_scan_open(self, event, msg): #print("WIFI_scan_open") - - if wifiScan.getState() == False : self.wifi_data = [] wifiScan.control(1) @@ -1960,8 +1962,8 @@ class LocationManager(Abstract): def gps_open(self, event, msg): #print("publish:gps_open") #quecgnss.init() - quecgnss.gnssEnable(1) - self.gps.__gps_nmea_data_clean() + quecgnss.gnssEnable(2) + #self.gps.__gps_nmea_data_clean() def gps_close(self, event, msg): quecgnss.gnssEnable(0) def location_timer(self, *args, **kwargs): @@ -2075,7 +2077,30 @@ class LocationManager(Abstract): else : break - + def GxGGA_latitude(self, gga_data): + """Parse latitude from GGA""" + if gga_data: + latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data) + if latitude_re: + latitude = latitude_re.group(0)[1:-3] + return str(float(latitude[:2]) + float(latitude[2:]) / 60) + return "" + def GxGGA_longitude(self, gga_data): + """Parse longitude from GGA""" + if gga_data: + longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data) + if longitude_re: + longitude = longitude_re.group(0)[1:-3] + return str(float(longitude[:3]) + float(longitude[3:]) / 60) + return "" + + def GxGGA_altitude(self, gga_data): + """Parse altitude from GGA""" + if gga_data: + altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data) + if altitude_re: + return altitude_re.group(0)[1:-3] + return "" def location_thread(self): self.wifi_data = [] @@ -2095,8 +2120,8 @@ class LocationManager(Abstract): print("location_thread:1") EventMesh.publish(constants.EVENT.GPSOPEN) print("location_thread:2") - self.timer_read_GPS_info.start(1000, 1, self.location_timer) - + #self.timer_read_GPS_info.start(1000, 1, self.location_timer) + print("location_thread:3") #utime.sleep_ms(1000) self.location_timer_count = 0 #quecgnss.read(4096)#去掉第一次错误数据 @@ -2113,99 +2138,70 @@ class LocationManager(Abstract): # if self.location_check_data_timer_count >= 3: # pm.autosleep(0)#唤醒 # pm.sclkEx_set(0, 1, 5) - if self.location_check_data_timer_count >= 3 :#3秒查一次基站数据和wifi数据 + if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据 self.location_check_data_timer_count = 0 #print(self.location_timer_count) GSV_dict= {} #检查GNSS数据 if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2: - - self.gps.__gps_nmea_data_clean() - #gnss_r_data = [0,1] - gnss_r_data = quecgnss.read(4096) - #EventMesh.txt_log("gps Datalen:{}".format(gnss_r_data[0])) - print("location gnss_r_data:len{}\n{}".format(gnss_r_data[0],gnss_r_data[1].decode())) - #print("gnss_r_data len:{}".format(gnss_r_data[0])) - if gnss_r_data[0] > 0 : #有数据 - tmp_ok_count = 0 - tmp_very_ok_count = 0 - gsv_data = gnss_r_data[1].split("GSV") - - if len(gsv_data) >= 2 : - gsv_data = gsv_data[1:] - for i in range(len(gsv_data)) : - gsv_data[i] = gsv_data[i].split("\r\n")[0] - gsv_tmp = gsv_data[i].split(",") - if len(gsv_tmp) < 7 : - break - - gsv_tmp = gsv_tmp[4:] - #print("gsv_tmp:{}".format(gsv_tmp)) - for i in range(len(gsv_tmp)) : - if i % 4 == 0: - GSV_dict[gsv_tmp[i]] = gsv_tmp[i+3] - try: - #print("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3])) - if gsv_tmp[i+3] != "" : - if int(gsv_tmp[i+3])>=20: - tmp_ok_count +=1 - if int(gsv_tmp[i+3])>=30: - tmp_very_ok_count +=1 - - except Exception as e: - usys.print_exception(e) - #print("GSV_dict:{}:[{}]".format(gsv_tmp[i],gsv_tmp[i+3])) - if len(gsv_tmp)-i < 4: - break - - if(tmp_ok_count > self.GSV_sig_ok_count ): - self.GSV_sig_ok_count = tmp_ok_count - if(tmp_very_ok_count > self.GSV_sig_very_ok_count ): - self.GSV_sig_very_ok_count = tmp_very_ok_count - - # if len(match_gga_data) > 8: - # #print(match_gga_data) - # if(match_gga_data[7] ): - # gga_count_tmp = int(match_gga_data[7]) #可用卫星 - # if(gga_count_tmp > self.GGA_count): - # self.GGA_count = gga_count_tmp - print("GGA_count:{} GSV_sig_ok_coun:{} ".format(self.GGA_count,self.GSV_sig_ok_count)) + + pass + tmp_ok_count = 0 + tmp_very_ok_count = 0 + gsv_data = quecgnss.get_gsv() + rmc_data = quecgnss.get_rmc() + gga_data = quecgnss.get_gga() + vtg_data = quecgnss.get_vtg() + print("gsv:{}".format(quecgnss.get_gsv())) + print("gga:{}".format(quecgnss.get_gga())) + print("rmc:{}".format(quecgnss.get_rmc())) + print("vtg:{}".format(quecgnss.get_vtg())) + for i in range(len(gsv_data)) : - match_rmc_data = self.match.GxRMC(gnss_r_data[1]).split(",") - - #print("match_rmc_data:\n{}".format(match_rmc_data)) - if len (match_rmc_data)>3: #有rmc数据 - if match_rmc_data[2] == 'A': - - if self.gps.__check_gps_valid(gnss_r_data[1].decode()): #数据齐全 : - - #print("hhhhhh:{}\n\n".format(self.gps.__gsv_data)) - match_vtg_data = self.gps.__vtg_data.split(",")#self.match.GxVTG(gnss_r_data[1]).split(",") - match_gga_data = self.gps.__gga_data.split(",")#self.match.GxGGA(gnss_r_data[1]).split(",") - #match_gga_data = self.match.GxGGA(gnss_r_data[1]).split(",") - - EventMesh.txt_log("GGA:{}".format(match_gga_data)) - # EventMesh.txt_log("VTG:{}".format(match_vtg_data)) - # EventMesh.txt_log("RMC:{}".format(match_rmc_data)) - #EventMesh.txt_log("timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count,self.GSV_sig_very_ok_count)) - print("LOCATION_ok :time:{}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n".format(self.location_timer_count)) + if i % 2 == 0: + if i+1 >= len(gsv_data) : + print("gsv_data num error!!") + break + GSV_dict[gsv_data[i]] = gsv_data[i+1] + #print("type:gsv_data{}".format(type(gsv_data[i+1]))) + try: + #print("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3])) + if gsv_data[i+1] : + if (gsv_data[i+1])>=20: + tmp_ok_count +=1 + if (gsv_data[i+1])>=30: + tmp_very_ok_count +=1 + + except Exception as e: + usys.print_exception(e) + + if(tmp_ok_count > self.GSV_sig_ok_count ): + self.GSV_sig_ok_count = tmp_ok_count + if(tmp_very_ok_count > self.GSV_sig_very_ok_count ): + self.GSV_sig_very_ok_count = tmp_very_ok_count + match_rmc_data = rmc_data.split(",") + if len (match_rmc_data)>3: #有rmc数据 + if match_rmc_data[2] == 'A': + match_gga_data = gga_data.split(",") + if len(match_gga_data) >4: #数据全 + match_vtg_data = vtg_data.split(",") gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期 - gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1]) + #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1]) latitude = "0,N" #纬度 - latitude_tmp = str(gps_data_tmp[1]).split(".") + latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".") if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5: latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6]) latitude = "%s,%s"%(latitude,match_rmc_data[4] ) longitude = "0,E"#经度 - longitude_tmp = str(gps_data_tmp[0]).split(".") + longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".") if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5: longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6]) longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1]) high = "0"#高度 - high = str(gps_data_tmp[2]) + high = str(self.GxGGA_altitude(gga_data)) number = "0"#可用卫星 precision = "5.8"#精度 if len(match_gga_data)>5 : @@ -2230,11 +2226,7 @@ class LocationManager(Abstract): "date": gps_date, "precision": precision } - else : - EventMesh.txt_log("gps数据不全") - else : - EventMesh.txt_log("gps 无数据") - +# *********************************************************************************** #检查wifi数据 @@ -2252,9 +2244,8 @@ class LocationManager(Abstract): if self.location_type == 1: #测试模式 self.location_timer_count = 0 - if len(gnss_r_data) >= 1: - if gnss_r_data[0] > 0: - EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) + + EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) if self.gps_data != {} : #发送数据 EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 self.location_queue.put(constants.PROTOCOL.UD_SEND) @@ -2305,9 +2296,11 @@ class LocationManager(Abstract): #self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 utime.sleep_ms(500) - self.timer_read_GPS_info.stop() - self.gps.power_switch(0) + + #self.timer_read_GPS_info.stop() + #self.gps.power_switch(0) wifiScan.control(0) + EventMesh.publish(constants.EVENT.GPSCLOSE) # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠 # pm.autosleep(1) # pm.sclkEx_set(1, 1, 5)