| | |
| | | static gpsStatus_t gpsStatus; |
| | | |
| | | static int tra_hh, tra_mm, tra_ss, tra_dss; |
| | | struct rtk_info CurrRTKInfo; |
| | | static time_t recved_gprmc_time = 0, recved_gpgga_time = 0;; |
| | | |
| | | static rtk_info CurrRTKInfo; |
| | | |
| | | static void CheckPjkParam(void); |
| | | static void CheckPjkParamTimeout(union sigval sig); |
| | |
| | | void ConfigRTKModule(void) |
| | | { |
| | | // TODO |
| | | DEBUG("ConfigRTKModule"); |
| | | |
| | | memset(&CurrRTKInfo, 0, sizeof(CurrRTKInfo)); |
| | | tra_hh = tra_mm = tra_ss = tra_dss = 0; |
| | | memset(&gpsStatus, 0, sizeof(gpsStatus)); |
| | | gpsStatus.hh = -1; |
| | | |
| | | static struct serial_config serialConfig; |
| | | |
| | |
| | | { |
| | | DEBUG("handleGPGGA num = %d", s->nmea_num); |
| | | if (s->nmea_num >= 10) { |
| | | gpsStatus.gps_status = str2int(s->nmea_value[5].data, s->nmea_value[5].length); |
| | | |
| | | int hh = str2int(s->nmea_value[0].data, 2); |
| | | int mm = str2int(s->nmea_value[0].data + 2, 2); |
| | | int ss = str2int(s->nmea_value[0].data + 4, 2); |
| | | int mss = str2int(s->nmea_value[0].data + 7, 2); |
| | | |
| | | double lat1, lat2, lon1, lon2, alt; |
| | | int qf; |
| | | str2float(&lat1, s->nmea_value[1].data, 2); |
| | | str2float(&lat2, s->nmea_value[1].data+2, s->nmea_value[1].length-2); |
| | | |
| | | qf = str2int(s->nmea_value[5].data, s->nmea_value[5].length); |
| | | str2float(&lon1, s->nmea_value[3].data, 3); |
| | | str2float(&lon2, s->nmea_value[3].data+3, s->nmea_value[3].length-3); |
| | | |
| | | if (qf > 0) { |
| | | str2float(&lat1, s->nmea_value[1].data, 2); |
| | | str2float(&lat2, s->nmea_value[1].data+2, s->nmea_value[1].length-2); |
| | | lat1 = lat1 + lat2/60.0; |
| | | lon1 = lon1 + lon2/60.0; |
| | | |
| | | str2float(&lon1, s->nmea_value[3].data, 3); |
| | | str2float(&lon2, s->nmea_value[3].data+3, s->nmea_value[3].length-3); |
| | | str2float(&alt, s->nmea_value[8].data, s->nmea_value[8].length); |
| | | |
| | | lat1 = lat1 + lat2/60.0; |
| | | lon1 = lon1 + lon2/60.0; |
| | | gpsStatus.latitude = lat1; |
| | | gpsStatus.longitude = lon1; |
| | | gpsStatus.altitude = alt; |
| | | gpsStatus.satNum = str2int(s->nmea_value[6].data, s->nmea_value[6].length); |
| | | |
| | | str2float(&alt, s->nmea_value[8].data, s->nmea_value[8].length); |
| | | |
| | | gpsStatus.gps_status = 1; |
| | | gpsStatus.latitude = (uint32_t)(lat1 * 1000000); |
| | | gpsStatus.longitude = (uint32_t)(lon1 * 1000000); |
| | | |
| | | // char buff1[32] = {0}; |
| | | // char buff2[32] = {0}; |
| | | // char buff3[32] = {0}; |
| | | // |
| | | // memcpy(buff1, s->nmea_value[1].data, s->nmea_value[1].length); |
| | | // memcpy(buff2, s->nmea_value[3].data, s->nmea_value[3].length); |
| | | // memcpy(buff3, s->nmea_value[8].data, s->nmea_value[8].length); |
| | | // |
| | | // DEBUG("%s %s %s: lat = %ld lon = %ld alt = %f", buff1, buff2, buff3, gpsStatus.latitude, gpsStatus.longitude, alt); |
| | | |
| | | gpsStatus.altitude = (int) fabs(alt); |
| | | |
| | | recved_gpgga_time = AppTimer_GetTickCount(); |
| | | |
| | | if (abs(recved_gpgga_time - recved_gprmc_time) < 500) { |
| | | RequestRtkDownload(gpsStatus.latitude, gpsStatus.longitude, gpsStatus.altitude, |
| | | gpsStatus.bcd_time, 1); |
| | | } |
| | | } else { |
| | | gpsStatus.gps_status = 0; |
| | | if (hh == gpsStatus.hh && mm == gpsStatus.mm && ss == gpsStatus.ss && mss == gpsStatus.mss) { |
| | | // 同步的RMC消息也收集了 |
| | | PlatformStatusChanged(GPS_UPDATE_EVT, (uint8_t *)&gpsStatus, sizeof(gpsStatus)); |
| | | } |
| | | gpsStatus.hh = hh; |
| | | gpsStatus.mm = mm; |
| | | gpsStatus.ss = ss; |
| | | gpsStatus.mss = mss; |
| | | } |
| | | } |
| | | |
| | |
| | | void handleGPRMC(const struct nmea *s) |
| | | { |
| | | DEBUG("handleGPRMC num = %d", s->nmea_num); |
| | | if (s->nmea_num >= 9) { |
| | | |
| | | |
| | | if (s->nmea_num >= 9) { |
| | | int hh = str2int(s->nmea_value[0].data, 2); |
| | | int mm = str2int(s->nmea_value[0].data + 2, 2); |
| | | int ss = str2int(s->nmea_value[0].data + 4, 2); |
| | | int mss = str2int(s->nmea_value[0].data + 7, 2); |
| | | |
| | | int DD = str2int(s->nmea_value[8].data, 2); |
| | | int MM = str2int(s->nmea_value[8].data + 2, 2); |
| | | int YY = str2int(s->nmea_value[8].data + 4, 2); |
| | | gpsStatus.DD = str2int(s->nmea_value[8].data, 2); |
| | | gpsStatus.MM = str2int(s->nmea_value[8].data + 2, 2); |
| | | gpsStatus.YY = str2int(s->nmea_value[8].data + 4, 2); |
| | | |
| | | gpsStatus.bcd_time[0] = ((YY/10)<<4) + (YY%10); |
| | | gpsStatus.bcd_time[1] = ((MM/10)<<4) + (MM%10); |
| | | gpsStatus.bcd_time[2] = ((DD/10)<<4) + (DD%10); |
| | | gpsStatus.bcd_time[3] = ((hh/10)<<4) + (hh%10); |
| | | gpsStatus.bcd_time[4] = ((mm/10)<<4) + (mm%10); |
| | | gpsStatus.bcd_time[5] = ((ss/10)<<4) + (ss%10); |
| | | double speed; |
| | | |
| | | recved_gprmc_time = AppTimer_GetTickCount(); |
| | | str2float(&speed, s->nmea_value[6].data, s->nmea_value[6].length); |
| | | |
| | | if (abs(recved_gpgga_time - recved_gprmc_time) < 500) { |
| | | RequestRtkDownload(gpsStatus.latitude, gpsStatus.longitude, gpsStatus.altitude, |
| | | gpsStatus.bcd_time, 1); |
| | | gpsStatus.speed = speed * 1.85184; // 节 -> 公里 |
| | | |
| | | if (hh == gpsStatus.hh && mm == gpsStatus.mm && ss == gpsStatus.ss && mss == gpsStatus.mss) { |
| | | // 同步的GGA消息也收集了 |
| | | PlatformStatusChanged(GPS_UPDATE_EVT, (uint8_t *)&gpsStatus, sizeof(gpsStatus)); |
| | | } |
| | | gpsStatus.hh = hh; |
| | | gpsStatus.mm = mm; |
| | | gpsStatus.ss = ss; |
| | | gpsStatus.mss = mss; |
| | | } |
| | | } |
| | | |
| | |
| | | // } |
| | | |
| | | if (CurrRTKInfo.hh == tra_hh && CurrRTKInfo.mm == tra_mm && CurrRTKInfo.ss == tra_ss && CurrRTKInfo.dss == tra_dss) { |
| | | PlatformStatusChanged(RTK_UPDATE_EVT, (uint8_t *)&CurrRTKInfo, sizeof(CurrRTKInfo)); |
| | | UpdateRTKInfo(&CurrRTKInfo); |
| | | // up_num++; |
| | | /*if ((up_num % 5) == 0)*/ { |
| | |
| | | // CurrRTKInfo.heading = 60; |
| | | |
| | | if (CurrRTKInfo.hh == tra_hh && CurrRTKInfo.mm == tra_mm && CurrRTKInfo.ss == tra_ss && CurrRTKInfo.dss == tra_dss) { |
| | | PlatformStatusChanged(RTK_UPDATE_EVT, (uint8_t *)&CurrRTKInfo, sizeof(CurrRTKInfo)); |
| | | UpdateRTKInfo(&CurrRTKInfo); |
| | | // up_num++; |
| | | /*if ((up_num % 5) == 0)*/ { |