void logger_next_flight() { uint8_t sec, min, hour, day, wday, month; uint16_t year; uint32_t today; datetime_from_epoch(time_get_local(), &sec, &min, &hour, &day, &wday, &month, &year); today = datetime_to_epoch(0, 0, 0, day, month, year); if (today == logger_flight_day) { logger_flight_number++; eeprom_busy_wait(); eeprom_update_byte(&config_ro.flight_number, logger_flight_number); } else { logger_flight_number = 0; logger_flight_day = today; eeprom_busy_wait(); eeprom_update_block((void *)&logger_flight_day, &config_ro.flight_date, sizeof(logger_flight_day)); eeprom_update_byte(&config_ro.flight_number, logger_flight_number); } DEBUG("date is: "); print_datetime(today); DEBUG("flight number is: %d\n", logger_flight_number); }
void logger_init() { log_fil = new FIL; fc.logger_state = LOGGER_IDLE; uint8_t sec, min, hour, day, wday, month; uint16_t year; uint32_t today; datetime_from_epoch(time_get_local(), &sec, &min, &hour, &day, &wday, &month, &year); today = datetime_to_epoch(0, 0, 0, day, month, year); eeprom_busy_wait(); eeprom_read_block((void *)&logger_flight_day, &config_ro.flight_date, sizeof(logger_flight_day)); logger_flight_number = eeprom_read_byte(&config_ro.flight_number); if (logger_flight_day != today) { logger_flight_number = 0; logger_flight_day = today; eeprom_busy_wait(); eeprom_update_block((void *)&logger_flight_day, &config_ro.flight_date, sizeof(logger_flight_day)); eeprom_update_byte(&config_ro.flight_number, logger_flight_number); } DEBUG("date is: "); print_datetime(today); DEBUG("flight number is: %d\n", logger_flight_number); }
void gui_value_date_irqh(uint8_t type, uint8_t * buff) { int16_t inc = 0; switch (type) { case(TASK_IRQ_BUTTON_L): if (*buff == BE_CLICK) inc += -gui_value_step; // if (*buff == BE_DBL_CLICK) // inc += -gui_value_step; break; case(TASK_IRQ_BUTTON_R): if (*buff == BE_CLICK) inc += +gui_value_step; // if (*buff == BE_DBL_CLICK) // inc += +gui_value_step; break; case(TASK_IRQ_BUTTON_M): if (*buff == BE_CLICK) { if (gui_value_index == 2) gui_value_cb(gui_value_tmp); else gui_value_index++; } break; } uint8_t sec; uint8_t min; uint8_t hour; uint8_t day; uint8_t wday; uint8_t month; uint16_t year; datetime_from_epoch(time_get_actual(), &sec, &min, &hour, &day, &wday, &month, &year); switch (gui_value_index) { case(0): day += inc; if (day < 1) day = monthDays[month - 1]; if ((((!(year % 4)) && (year % 100) ) || (!(year % 400))) && month == 2) { if (day > 29) day = 29; } else { if (day > monthDays[month - 1]) day = monthDays[month - 1]; } break; case(1): month += inc; if (month < 1) month = 1; if (month > 12) month = 12; break; case(2): year += inc; if (year < 2015) year = 2015; if (year > 2100) year = 2100; break; } uint32_t diff = 0; //do not change flight time during update if (fc.flight_state == FLIGHT_FLIGHT) diff = time_get_actual() - fc.flight_timer; time_set_actual(datetime_to_epoch(sec, min, hour, day, month, year)); //do not change flight time during update if (fc.flight_state == FLIGHT_FLIGHT) fc.flight_timer = time_get_actual() - diff; }
//132405.000,A,4809.2356,N,01704.4263,E,0.15,317.49,270115,,,A //hhmmss.XXX, void gps_parse_rmc() { // DEBUG("\nRMC\n"); gps_init_ok = true; // strcpy(gps_parser_buffer, "$GPRMC,044434.000,A,3319.1312,S,14805.03,E,24.00,37.86,090116,,,A*71"); char * ptr = find_comma(gps_parser_buffer); //UTC time uint8_t hour = atoi_n(ptr + 0, 2); uint8_t min = atoi_n(ptr + 2, 2); uint8_t sec = atoi_n(ptr + 4, 2); // DEBUG("%02d:%02d:%02d\n", hour, min, sec); ptr = find_comma(ptr); //Valid (A = valid) fc.gps_data.valid = (*ptr) == 'A'; if (fc.gps_data.valid) { if (fc.gps_data.fix_cnt < GPS_FIX_CNT_MAX) fc.gps_data.fix_cnt++; } else { fc.gps_data.fix_cnt = 0; } ptr = find_comma(ptr); uint32_t loc_deg; uint32_t loc_min; //Latitude loc_deg = atoi_n(ptr, 2); loc_min = atoi_n(ptr + 2, 6); int32_t latitude = (loc_min * 100ul) / 6; latitude = loc_deg * 10000000ul + latitude; ptr = find_comma(ptr); //Latitude sign if ((*ptr) == 'S') latitude *= -1; fc.gps_data.latitude = latitude; sprintf_P((char *)fc.gps_data.cache_igc_latitude, PSTR("%02lu%05lu%c"), loc_deg, loc_min / 10, (*ptr)); ptr = find_comma(ptr); //Longitude loc_deg = atoi_n(ptr, 3); loc_min = atoi_n(ptr + 3, 6); int32_t longitude = (loc_min * 100ul) / 6; longitude = loc_deg * 10000000ul + longitude; ptr = find_comma(ptr); // DEBUG("ptr = '%s'\n", ptr); //Longitude sign if ((*ptr) == 'W') longitude *= -1; fc.gps_data.longtitude = longitude; sprintf_P((char *)fc.gps_data.cache_igc_longtitude, PSTR("%03lu%05lu%c"), loc_deg, loc_min / 10, (*ptr)); ptr = find_comma(ptr); // DEBUG("lat+lon %07ld %08ld\n", latitude, longitude); fc.gps_data.groud_speed = atoi_f(ptr); //in knots ptr = find_comma(ptr); //Ground course fc.gps_data.heading = atoi_f(ptr); ptr = find_comma(ptr); //UTC date uint8_t day = atoi_n(ptr + 0, 2); uint8_t month = atoi_n(ptr + 2, 2); uint16_t year = atoi_n(ptr + 4, 2) + 2000; // DEBUG("%02d.%02d.%04d\n", day, month, year); fc.gps_data.utc_time = datetime_to_epoch(sec, min, hour, day, month, year); if (config.connectivity.forward_gps) { char tmp[NMEA_MAX_LEN]; sprintf(tmp, "$%s", gps_parser_buffer); bt_send(tmp); if (config.connectivity.uart_function > UART_FORWARD_OFF) uart_send(tmp); } uint16_t tdeg, tmin, tsec; int32_t tmp; switch (config.connectivity.gps_format_flags & GPS_FORMAT_MASK) { case(GPS_DDdddddd): sprintf_P((char *)fc.gps_data.cache_gui_latitude, PSTR(" %+010ld"), fc.gps_data.latitude); memcpy((void *)fc.gps_data.cache_gui_latitude, (void *)(fc.gps_data.cache_gui_latitude + 1), 3); fc.gps_data.cache_gui_latitude[3] = '.'; if (fc.gps_data.cache_gui_latitude[1] == '0') memcpy((void *)(fc.gps_data.cache_gui_latitude + 1), (void *)(fc.gps_data.cache_gui_latitude + 2), 10); sprintf_P((char *)fc.gps_data.cache_gui_longtitude, PSTR(" %+011ld"), fc.gps_data.longtitude); memcpy((void *)fc.gps_data.cache_gui_longtitude, (void *)(fc.gps_data.cache_gui_longtitude + 1), 4); fc.gps_data.cache_gui_longtitude[4] = '.'; if (fc.gps_data.cache_gui_longtitude[1] == '0') { if (fc.gps_data.cache_gui_longtitude[2] == '0') memcpy((void *)(fc.gps_data.cache_gui_longtitude + 1), (void *)(fc.gps_data.cache_gui_longtitude + 3), 10); else memcpy((void *)(fc.gps_data.cache_gui_longtitude + 1), (void *)(fc.gps_data.cache_gui_longtitude + 2), 11); } break; case(GPS_DDMMmmm): memcpy((void *)fc.gps_data.cache_gui_latitude, (void *)fc.gps_data.cache_igc_latitude, 2); fc.gps_data.cache_gui_latitude[2] = '*'; memcpy((void *)(fc.gps_data.cache_gui_latitude + 3), (void *)(fc.gps_data.cache_igc_latitude + 2), 2); fc.gps_data.cache_gui_latitude[5] = '.'; memcpy((void *)(fc.gps_data.cache_gui_latitude + 6), (void *)(fc.gps_data.cache_igc_latitude + 4), 4); fc.gps_data.cache_gui_latitude[10] = 0; memcpy((void *)fc.gps_data.cache_gui_longtitude, (void *)fc.gps_data.cache_igc_longtitude, 3); fc.gps_data.cache_gui_longtitude[3] = '*'; memcpy((void *)(fc.gps_data.cache_gui_longtitude + 4), (void *)(fc.gps_data.cache_igc_longtitude + 3), 2); fc.gps_data.cache_gui_longtitude[6] = '.'; memcpy((void *)(fc.gps_data.cache_gui_longtitude + 7), (void *)(fc.gps_data.cache_igc_longtitude + 5), 4); fc.gps_data.cache_gui_longtitude[11] = 0; break; case(GPS_DDMMSS): tdeg = abs(fc.gps_data.latitude) / 10000000ul; tmp = ((abs(fc.gps_data.latitude) % 10000000ul) * 60); tmin = tmp / 10000000ul; tsec = ((tmp % 10000000ul) * 60) / 10000000ul; sprintf_P((char *)fc.gps_data.cache_gui_latitude, PSTR("%02u*%02u'%02u\"%c"), tdeg, tmin, tsec, (*(fc.gps_data.cache_igc_latitude + 7))); tdeg = abs(fc.gps_data.longtitude) / 10000000ul; tmp = ((abs(fc.gps_data.longtitude) % 10000000ul) * 60); tmin = tmp / 10000000ul; tsec = ((tmp % 10000000ul) * 60) / 10000000ul; sprintf_P((char *)fc.gps_data.cache_gui_longtitude, PSTR("%03u*%02u'%02u\"%c"), tdeg, tmin, tsec, (*(fc.gps_data.cache_igc_longtitude + 8))); break; } // DEBUG("clat = %s\n", fc.gps_data.cache_gui_latitude); // DEBUG("clon = %s\n", fc.gps_data.cache_gui_longtitude); }