diff options
| author | Keith Packard <keithp@keithp.com> | 2017-10-22 15:44:32 -0500 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-10-28 08:42:18 -0700 | 
| commit | 83929cd290279963b01b2ccd52c70d61bdeff6b0 (patch) | |
| tree | 1e76700f3322f9db686c661cbec036d8000510a9 /src/kernel/ao_log_big.c | |
| parent | 256ddea8c430b4b5dcb8bb95c19ad26032129e1b (diff) | |
altos: Share common logging code. Deal with corrupt initial flight records
Move common logging APIs from per-format files into ao_log.c. Then,
change that code to check the first log record in a slot (containing
the flight number) to see if it's invalid and deal with it. That
involves not re-using that slot, and allowing it to be erased.
Corrupted log blocks are reported with a negative flight number.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/kernel/ao_log_big.c')
| -rw-r--r-- | src/kernel/ao_log_big.c | 67 | 
1 files changed, 5 insertions, 62 deletions
| diff --git a/src/kernel/ao_log_big.c b/src/kernel/ao_log_big.c index e32abd1a..28a893c7 100644 --- a/src/kernel/ao_log_big.c +++ b/src/kernel/ao_log_big.c @@ -18,50 +18,6 @@  #include "ao.h" -static __xdata struct ao_log_record log; - -__code uint8_t ao_log_format = AO_LOG_FORMAT_FULL; - -static uint8_t -ao_log_csum(__xdata uint8_t *b) __reentrant -{ -	uint8_t	sum = 0x5a; -	uint8_t	i; - -	for (i = 0; i < sizeof (struct ao_log_record); i++) -		sum += *b++; -	return -sum; -} - -uint8_t -ao_log_data(__xdata struct ao_log_record *log) __reentrant -{ -	uint8_t wrote = 0; -	/* set checksum */ -	log->csum = 0; -	log->csum = ao_log_csum((__xdata uint8_t *) log); -	ao_mutex_get(&ao_log_mutex); { -		if (ao_log_current_pos >= ao_log_end_pos && ao_log_running) -			ao_log_stop(); -		if (ao_log_running) { -			wrote = 1; -			ao_storage_write(ao_log_current_pos, -					 log, -					 sizeof (struct ao_log_record)); -			ao_log_current_pos += sizeof (struct ao_log_record); -		} -	} ao_mutex_put(&ao_log_mutex); -	return wrote; -} - -static uint8_t -ao_log_dump_check_data(void) -{ -	if (ao_log_csum((uint8_t *) &log) != 0) -		return 0; -	return 1; -} -  static __data uint8_t	ao_log_data_pos;  /* a hack to make sure that ao_log_records fill the eeprom block in even units */ @@ -91,7 +47,7 @@ ao_log(void)  	log.u.flight.ground_accel = ao_ground_accel;  #endif  	log.u.flight.flight = ao_flight_number; -	ao_log_data(&log); +	ao_log_write(&log);  	/* Write the whole contents of the ring to the log  	 * when starting up. @@ -107,7 +63,7 @@ ao_log(void)  				log.type = AO_LOG_SENSOR;  				log.u.sensor.accel = ao_data_ring[ao_log_data_pos].adc.accel;  				log.u.sensor.pres = ao_data_ring[ao_log_data_pos].adc.pres; -				ao_log_data(&log); +				ao_log_write(&log);  				if (ao_log_state <= ao_flight_coast)  					next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;  				else @@ -117,11 +73,11 @@ ao_log(void)  				log.type = AO_LOG_TEMP_VOLT;  				log.u.temp_volt.temp = ao_data_ring[ao_log_data_pos].adc.temp;  				log.u.temp_volt.v_batt = ao_data_ring[ao_log_data_pos].adc.v_batt; -				ao_log_data(&log); +				ao_log_write(&log);  				log.type = AO_LOG_DEPLOY;  				log.u.deploy.drogue = ao_data_ring[ao_log_data_pos].adc.sense_d;  				log.u.deploy.main = ao_data_ring[ao_log_data_pos].adc.sense_m; -				ao_log_data(&log); +				ao_log_write(&log);  				next_other = log.tick + AO_OTHER_INTERVAL;  			}  			ao_log_data_pos = ao_data_ring_next(ao_log_data_pos); @@ -133,7 +89,7 @@ ao_log(void)  			log.tick = ao_sample_tick;  			log.u.state.state = ao_log_state;  			log.u.state.reason = 0; -			ao_log_data(&log); +			ao_log_write(&log);  			if (ao_log_state == ao_flight_landed)  				ao_log_stop(); @@ -147,16 +103,3 @@ ao_log(void)  			ao_sleep(&ao_log_running);  	}  } - -uint16_t -ao_log_flight(uint8_t slot) -{ -	if (!ao_storage_read(ao_log_pos(slot), -			     &log, -			     sizeof (struct ao_log_record))) -		return 0; - -	if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT) -		return log.u.flight.flight; -	return 0; -} | 
