diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/kernel/ao_log.c | 22 | ||||
| -rw-r--r-- | src/kernel/ao_tracker.c | 43 | ||||
| -rw-r--r-- | src/kernel/ao_tracker.h | 6 | 
3 files changed, 58 insertions, 13 deletions
| diff --git a/src/kernel/ao_log.c b/src/kernel/ao_log.c index d9c3e00f..91617d93 100644 --- a/src/kernel/ao_log.c +++ b/src/kernel/ao_log.c @@ -18,6 +18,9 @@  #include "ao.h"  #include <ao_log.h>  #include <ao_config.h> +#if HAS_TRACKER +#include <ao_tracker.h> +#endif  __xdata uint8_t	ao_log_mutex;  __pdata uint32_t ao_log_current_pos; @@ -251,6 +254,7 @@ ao_log_delete(void) __reentrant  {  	uint8_t slot;  	uint8_t slots; +	uint32_t log_current_pos, log_end_pos;  	ao_cmd_decimal();  	if (ao_cmd_status != ao_cmd_success) @@ -261,10 +265,13 @@ ao_log_delete(void) __reentrant  	if (ao_cmd_lex_i) {  		for (slot = 0; slot < slots; slot++) {  			if (ao_log_flight(slot) == ao_cmd_lex_i) { +#if HAS_TRACKER +				ao_tracker_erase_start(ao_cmd_lex_i); +#endif  				ao_log_erase_mark(); -				ao_log_current_pos = ao_log_pos(slot); -				ao_log_end_pos = ao_log_current_pos + ao_config.flight_log_max; -				while (ao_log_current_pos < ao_log_end_pos) { +				log_current_pos = ao_log_pos(slot); +				log_end_pos = log_current_pos + ao_config.flight_log_max; +				while (log_current_pos < log_end_pos) {  					uint8_t	i;  					static __xdata uint8_t b; @@ -274,15 +281,18 @@ ao_log_delete(void) __reentrant  					 * memory over and over again  					 */  					for (i = 0; i < 16; i++) { -						if (ao_storage_read(ao_log_current_pos + i, &b, 1)) +						if (ao_storage_read(log_current_pos + i, &b, 1))  							if (b != 0xff)  								break;  					}  					if (i == 16)  						break; -					ao_storage_erase(ao_log_current_pos); -					ao_log_current_pos += ao_storage_block; +					ao_storage_erase(log_current_pos); +					log_current_pos += ao_storage_block;  				} +#if HAS_TRACKER +				ao_tracker_erase_end(); +#endif  				puts("Erased");  				return;  			} diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c index a6ad87a3..9febc7f0 100644 --- a/src/kernel/ao_tracker.c +++ b/src/kernel/ao_tracker.c @@ -50,6 +50,7 @@ struct gps_position	gps_position[GPS_RING];  static uint8_t	gps_head; +static uint8_t	tracker_mutex;  static uint8_t	log_started;  static struct ao_telemetry_location gps_data;  static uint8_t	tracker_running; @@ -100,17 +101,19 @@ ao_tracker(void)  			tracker_running = 0;  		} -		if (new_tracker_running && !tracker_running) { +		if (new_tracker_running && !tracker_running)  			ao_telemetry_set_interval(AO_SEC_TO_TICKS(tracker_interval)); -			ao_log_start(); -		} else if (!new_tracker_running && tracker_running) { +		else if (!new_tracker_running && tracker_running)  			ao_telemetry_set_interval(0); -			ao_log_stop(); -		}  		tracker_running = new_tracker_running; -		if (!tracker_running) +		if (new_tracker_running && !ao_log_running) +			ao_log_start(); +		else if (!new_tracker_running && ao_log_running) +			ao_log_stop(); + +		if (!ao_log_running)  			continue;  		if (new & AO_GPS_NEW_DATA) { @@ -138,10 +141,11 @@ ao_tracker(void)  					}  				}  				if (ao_tracker_force_telem) { -					printf ("moving %d\n", moving); +					printf ("moving %d started %d\n", moving, log_started);  					flush();  				}  				if (moving) { +					ao_mutex_get(&tracker_mutex);  					if (!log_started) {  						ao_log_gps_flight();  						log_started = 1; @@ -151,12 +155,37 @@ ao_tracker(void)  					gps_position[gps_head].longitude = gps_data.longitude;  					gps_position[gps_head].altitude = gps_data.altitude;  					gps_head = ao_gps_ring_next(gps_head); +					ao_mutex_put(&tracker_mutex);  				}  			}  		}  	}  } +static uint8_t erasing_current; + +void +ao_tracker_erase_start(uint16_t flight) +{ +	erasing_current = flight == ao_flight_number; +	if (erasing_current) { +		ao_mutex_get(&tracker_mutex); +		ao_log_stop(); +		if (++ao_flight_number == 0) +			ao_flight_number = 1; +	} +} + +void +ao_tracker_erase_end(void) +{ +	if (erasing_current) { +		ao_log_scan(); +		log_started = 0; +		ao_mutex_put(&tracker_mutex); +	} +} +  static struct ao_task ao_tracker_task;  static void diff --git a/src/kernel/ao_tracker.h b/src/kernel/ao_tracker.h index a0fd2f49..78c40cb4 100644 --- a/src/kernel/ao_tracker.h +++ b/src/kernel/ao_tracker.h @@ -28,4 +28,10 @@  void  ao_tracker_init(void); +void +ao_tracker_erase_start(uint16_t flight); + +void +ao_tracker_erase_end(void); +  #endif /* _AO_TRACKER_H_ */ | 
