void igc_step() { char line[79]; uint8_t sec; uint8_t min; uint8_t hour; char c; int16_t galt; DEBUG("igc_step %d %d\n", fc.gps_data.valid, fc.gps_data.fix); if (fc.gps_data.valid && fc.gps_data.fix == 3) { if (fc.logger_state == LOGGER_WAIT_FOR_GPS) fc.logger_state = LOGGER_ACTIVE; if (igc_last_timestamp >= fc.gps_data.utc_time) { // DEBUG("igc_last_timestamp >= fc.gps_data.utc_time\n"); return; } igc_last_timestamp = fc.gps_data.utc_time; time_from_epoch(fc.gps_data.utc_time, &sec, &min, &hour); //New igc specification require altitude above geoid //From L80_GPS_Protocol_Specification_V1.4.pdf //fc.gps_data.altitude - Altitude in meters according to WGS84 ellipsoid //fc.gps_data.geoid - Height of geoid above WGS84 ellipsoid //BUT datasheet is lying !!! fc.gps_data.altitude is MSL !!! galt = fc.gps_data.altitude; c = 'A'; } else { if (fc.logger_state == LOGGER_WAIT_FOR_GPS) return; if (igc_last_timestamp >= time_get_utc()) return; igc_last_timestamp = time_get_utc(); time_from_epoch(time_get_utc(), &sec, &min, &hour); galt = 0; c = 'V'; } uint16_t alt = fc_press_to_alt(fc.vario.pressure, 101325); //B record sprintf_P(line, PSTR("B%02d%02d%02d%s%s%c%05d%05d"), hour, min, sec, fc.gps_data.cache_igc_latitude, fc.gps_data.cache_igc_longtitude, c, alt, galt); igc_writeline(line); igc_write_grecord(); }
void widget_time_draw(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t flags) { uint8_t sec; uint8_t min; uint8_t hour; time_from_epoch(time_get_local(), &sec, &min, &hour); uint8_t lh = widget_label_P(PSTR("Time"), x, y); char tmp[7]; sprintf_P(tmp, PSTR("%02d:%02d"), hour, min); widget_value_int(tmp, x, y + lh, w, h - lh); }
void igc_pre_step() { int16_t galt; uint8_t sec; uint8_t min; uint8_t hour; if (fc.gps_data.fix < 2) //If there is no 2D or 3D fix return; if (igc_last_timestamp >= fc.gps_data.utc_time) return; igc_last_timestamp = fc.gps_data.utc_time; time_from_epoch(fc.gps_data.utc_time, &sec, &min, &hour); //if there is no 3D fix store INT16_MAX galt = (fc.gps_data.fix == 3) ? fc.gps_data.altitude : 0x7FFF; uint16_t alt = fc_press_to_alt(fc.vario.pressure, 101325); //record igc_pre_start_cache[igc_pre_start_index].hour = hour; igc_pre_start_cache[igc_pre_start_index].min = min; igc_pre_start_cache[igc_pre_start_index].sec = sec; strcpy(igc_pre_start_cache[igc_pre_start_index].cache_igc_latitude, (char*)fc.gps_data.cache_igc_latitude); strcpy(igc_pre_start_cache[igc_pre_start_index].cache_igc_longtitude, (char*)fc.gps_data.cache_igc_longtitude); igc_pre_start_cache[igc_pre_start_index].balt = alt; igc_pre_start_cache[igc_pre_start_index].galt = galt; // DEBUG("IGC PRE %d/%d\n", igc_pre_start_index, igc_pre_start_len); igc_pre_start_index = (igc_pre_start_index + 1) % IGC_PRE_START_BUFFER; if (igc_pre_start_len < IGC_PRE_START_BUFFER) igc_pre_start_len++; }
void gui_value_loop() { char tmp[20]; uint8_t f_h; uint8_t sec; uint8_t min; uint8_t hour; uint8_t day; uint8_t wday; uint8_t month; uint16_t year; gui_dialog(gui_value_label); disp.LoadFont(F_TEXT_L); f_h = disp.GetTextHeight(); switch(gui_value_type) { case(GUI_VAL_NUMBER): sprintf(tmp, gui_value_format, gui_value_tmp); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); break; case(GUI_VAL_NUMBER_DISABLE): if (gui_value_tmp > 0) sprintf(tmp, gui_value_format, gui_value_tmp); else strcpy_P(tmp, PSTR("disabled")); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); break; case(GUI_VAL_VARIO_TEST): sprintf(tmp, gui_value_format, gui_value_tmp); gui_raligh_text(tmp, GUI_DIALOG_RIGHT - 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); disp.LoadFont(F_TEXT_S); f_h = disp.GetTextHeight(); disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 2); fprintf(lcd_out, "f=%0.0f", audio_vario_freq); disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 4 + f_h); fprintf(lcd_out, "l=%4u", audio_vario_length / 31); disp.GotoXY(GUI_DIALOG_LEFT + 1, GUI_DIALOG_TOP + 6 + f_h * 2); fprintf(lcd_out, "p=%4u", audio_vario_pause / 31); break; case(GUI_VAL_TIME): time_from_epoch(time_get_actual(), &sec, &min, &hour); sprintf_P(tmp, PSTR("%02d : %02d . %02d"), hour, min, sec); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); if (gui_value_index == 0) disp.Invert(18, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 32, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 1) disp.Invert(36, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 50, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 2) disp.Invert(54, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 68, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); break; case(GUI_VAL_DATE): datetime_from_epoch(time_get_actual(), &sec, &min, &hour, &day, &wday, &month, &year); sprintf_P(tmp, PSTR("%02d / %02d / %04d"), day, month, year); gui_caligh_text(tmp, GUI_DISP_WIDTH / 2, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2); if (gui_value_index == 0) disp.Invert(10, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 24, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 1) disp.Invert(30, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 44, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); if (gui_value_index == 2) disp.Invert(50, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 - f_h / 2, 76, GUI_DIALOG_TOP + (GUI_DIALOG_BOTTOM - GUI_DIALOG_TOP) / 2 + f_h / 2 - 2); break; case(GUI_VAL_CONTRAST): gui_value_draw_bar(); break; case(GUI_VAL_BRIGTHNES): gui_value_draw_bar(); break; case(GUI_VAL_VOLUME): gui_value_draw_bar(); break; } if (button_hold(B_LEFT)) { uint8_t t_param = BE_CLICK; gui_value_irqh(TASK_IRQ_BUTTON_L, &t_param); } if (button_hold(B_RIGHT)) { uint8_t t_param = BE_CLICK; gui_value_irqh(TASK_IRQ_BUTTON_R, &t_param); } }