Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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++;
}
Exemplo n.º 4
0
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);
	}
}