Example #1
0
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);
}
Example #2
0
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);

}
Example #3
0
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;
}
Example #4
0
//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);
}