//GPS模块控制应答 static int proto_gps_ctlreply(int seq,const char *data,int len) { char ctl_no; ctl_no=data[4]; switch(ctl_no) { case GPS_GET_LATLON://获得经纬度 return gps_latlon(seq,data,len); break; case GPS_GET_TIME://获取卫星时间 return gps_time(seq,data,len); break; case GPS_GET_ALTITUDE://获取海拔高度 return gps_altitude(seq,data,len); break; case GPS_GET_ALL://所有数据 return gps_all(seq,data,len); break; } return 0; }
void measures_logFormat(char *buf, size_t len) { struct tm *t; time_t tim; udegree_t lat, lon; int32_t altitude; bool fix = gps_fixed(); if (fix) { lat = gps_info()->latitude; lon = gps_info()->longitude; altitude = gps_info()->altitude; } else { lat = 0; lon = 0; altitude = 0; } tim = gps_time(); t = gmtime(&tim); snprintf(buf, len, "%02d:%02d:%02d;%s;%02ld.%.06ld;%03ld.%.06ld;%ld;%.1f;%.1f;%.0f;%.0f;%.1f;%.2f;%.2f;%.2f;%.0f;%.2f;%.2f;%.2f;%d", t->tm_hour, t->tm_min, t->tm_sec, fix ? "FIX" : "NOFIX", lat/1000000, ABS(lat)%1000000, lon/1000000, ABS(lon)%1000000, altitude, sensor_read(ADC_T1), sensor_read(ADC_T2), sensor_read(ADC_PRESS), sensor_read(ADC_HUMIDITY), measures_intTemp(), sensor_read(ADC_VIN), sensor_read(ADC_5V), sensor_read(ADC_3V3), sensor_read(ADC_CURR), measures_acceleration(MMA_X), measures_acceleration(MMA_Y), measures_acceleration(MMA_Z), hadarp_read() ); buf[len - 1] = '\0'; }
void measures_logFormat(char *buf, size_t len) { struct tm *t; time_t tim; udegree_t lat, lon; bool fix = gps_fixed(); if (fix) { lat = gps_info()->latitude; lon = gps_info()->longitude; } else { lat = 0; lon = 0; } tim = gps_time(); t = gmtime(&tim); size_t cnt = snprintf(buf, len, "%02d:%02d:%02d;%s;%02ld.%.06ld;%03ld.%.06ld;", t->tm_hour, t->tm_min, t->tm_sec, fix ? "FIX" : "NOFIX", lat/1000000, ABS(lat)%1000000, lon/1000000, ABS(lon)%1000000); if (cnt < len) { buf += cnt; len -= cnt; measures_printMeasures(buf, len); } else buf[len-1] = '\0'; }
void gps_pool(void) { int i = 0; //zapis odczytanego znaku RxBuffer[RxCounter] = (USART_ReceiveData(GPS_USART) & 0x7F); //inkrementacja licznika danych RxCounter++; //zabezpieczenie przed wprowadzeniem zbyt dlugiego ciagiu znakow if((RxBuffer[RxCounter - 2] != '\r') && (RxBuffer[RxCounter - 1] != '\n') && (RxCounter == 255)) { RxCounter = 253; } //zakonczenie transmisji ciagu znakiem nowej linii else if( (RxBuffer[RxCounter - 2] == '\r') && (RxBuffer[RxCounter - 1] == '\n') ) { //odebrany ciag jest komunikatem VTG if( (RxBuffer[0] == '$') && (RxBuffer[1] == 'G') && (RxBuffer[2] == 'P') && (RxBuffer[3] == 'V') && (RxBuffer[4] == 'T') && (RxBuffer[5] == 'G') ) { //skopiowanie odebranego ciagu do RxBufferVTG //oraz wyzerowanie RxBuffer for(i=0; i<256; i++) { RxBufferVTG[i] = RxBuffer[i]; // printf("%c", RxBuffer[i]); RxBuffer[i] = 0; } //wyzerowanie licznika RxCounter = 0; } //odebrany ciag jest komunikatem RMC else if( (RxBuffer[0] == '$') && (RxBuffer[1] == 'G') && (RxBuffer[2] == 'P') && (RxBuffer[3] == 'R') && (RxBuffer[4] == 'M') && (RxBuffer[5] == 'C') ) { //skopiowanie odebranego ciagu do RxBufferRMC //oraz wyzerowanie RxBuffer for(i=0; i<256; i++) { RxBufferRMC[i] = RxBuffer[i]; // printf("%c", RxBuffer[i]); RxBuffer[i] = 0; } //wyzerowanie licznika RxCounter = 0; } //odebrany ciag nie nalezy do oczekiwanych komunikatów else { //wyczyszczenie bufora for(i=0; i<256; i++) {RxBuffer[i] = 0;} //wyzerowanie licznika RxCounter = 0; } } // create output string sprintf(gps_string, "X:%s,%s,%s,%s,%s", gps_time(), gps_latitude(), gps_longitude(), gps_speed(), gps_direction()); }