From 9020a82d8b1496bc47dbe454b0735467b5a599b8 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 28 Jan 2022 15:06:18 -0800 Subject: [PATCH] ao_log: Change flight type to uint16_t, widen APIs dealing with flight numbers to int32_t Real Flight numbers are 16-bit unsigned values, but APIs using them pass values that areoverloaded to also represent broken log slots using negative numbers. This means that these APIs need to be able to represent all 65535 possible flight numbers *and* all possible log slots as negative values. Switch the variables holding only flight numbers to uint16_t and those holding either a flight number or log slot to int32_t. Signed-off-by: Keith Packard --- src/kernel/ao_log.c | 32 ++++++++++++++++---------------- src/kernel/ao_log.h | 18 +++++++++--------- src/kernel/ao_tracker.c | 4 ++-- src/kernel/ao_tracker.h | 2 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/kernel/ao_log.c b/src/kernel/ao_log.c index 2167d145..53d66669 100644 --- a/src/kernel/ao_log.c +++ b/src/kernel/ao_log.c @@ -29,7 +29,7 @@ uint32_t ao_log_end_pos; uint32_t ao_log_start_pos; uint8_t ao_log_running; enum ao_flight_state ao_log_state; -int16_t ao_flight_number; +uint16_t ao_flight_number; void ao_log_flush(void) @@ -77,7 +77,7 @@ ao_log_write_erase(uint8_t pos) if (pos == 0) { uint8_t i; for (i = 1; i < LOG_MAX_ERASE; i++) { - erase.mark = ~LOG_ERASE_MARK; + erase.mark = (uint8_t) ~LOG_ERASE_MARK; erase.flight = 0; ao_config_write(ao_log_erase_pos(i), &erase, sizeof (erase)); } @@ -180,7 +180,7 @@ ao_log_check_data(void) return 1; } -int16_t +int32_t ao_log_flight(uint8_t slot) { if (ao_storage_is_erased(ao_log_pos_block_start(slot))) @@ -189,12 +189,12 @@ ao_log_flight(uint8_t slot) if (!ao_storage_read(ao_log_pos(slot), &ao_log_data, sizeof (ao_log_type))) - return -(int16_t) (slot + 1); + return -(int32_t) (slot + 1); if (!ao_log_check_data() || ao_log_data.type != AO_LOG_FLIGHT) - return -(int16_t) (slot + 1); + return -(int32_t) (slot + 1); - return ao_log_data.u.flight.flight; + return (int32_t) ao_log_data.u.flight.flight; } #endif @@ -204,13 +204,13 @@ ao_log_slots(void) return (uint8_t) (ao_storage_log_max / ao_config.flight_log_max); } -static int16_t +static uint16_t ao_log_max_flight(void) { uint8_t log_slot; uint8_t log_slots; - int16_t log_flight; - int16_t max_flight = 0; + int32_t log_flight; + uint16_t max_flight = 0; /* Scan the log space looking for the biggest flight number */ log_slots = ao_log_slots(); @@ -219,7 +219,7 @@ ao_log_max_flight(void) if (log_flight <= 0) continue; if (max_flight == 0 || log_flight > max_flight) - max_flight = log_flight; + max_flight = (uint16_t) log_flight; } return max_flight; } @@ -340,7 +340,7 @@ ao_log_scan(void) /* Find a log slot for the next flight, if available */ ao_log_current_pos = ao_log_end_pos = 0; log_slots = ao_log_slots(); - log_want = (ao_flight_number - 1) % log_slots; + log_want = (uint8_t) ((ao_flight_number - 1) % log_slots); log_slot = log_want; do { if (ao_log_flight(log_slot) == 0) { @@ -396,14 +396,14 @@ ao_log_list(void) { uint8_t slot; uint8_t slots; - int16_t flight; + int32_t flight; slots = ao_log_slots(); for (slot = 0; slot < slots; slot++) { flight = ao_log_flight(slot); if (flight) - printf ("flight %d start %x end %x\n", + printf ("flight %ld start %x end %x\n", flight, (uint16_t) (ao_log_pos(slot) >> 8), (uint16_t) (ao_log_pos_block_end(slot) >> 8)); @@ -421,14 +421,14 @@ ao_log_delete(void) { uint8_t slot; uint8_t slots; - int16_t cmd_flight = 1; + int32_t cmd_flight = 1; ao_cmd_white(); if (ao_cmd_lex_c == '-') { cmd_flight = -1; ao_cmd_lex(); } - cmd_flight *= ao_cmd_decimal(); + cmd_flight *= (int32_t) ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; @@ -451,7 +451,7 @@ ao_log_delete(void) } } } - printf("No such flight: %d\n", cmd_flight); + printf("No such flight: %ld\n", cmd_flight); } const struct ao_cmds ao_log_cmds[] = { diff --git a/src/kernel/ao_log.h b/src/kernel/ao_log.h index 09ae7add..837fc31e 100644 --- a/src/kernel/ao_log.h +++ b/src/kernel/ao_log.h @@ -29,7 +29,7 @@ * the log. Tasks may wait for this to be initialized * by sleeping on this variable. */ -extern int16_t ao_flight_number; +extern uint16_t ao_flight_number; extern uint8_t ao_log_mutex; extern uint32_t ao_log_current_pos; extern uint32_t ao_log_end_pos; @@ -65,7 +65,7 @@ extern enum ao_flight_state ao_log_state; /* Return the flight number from the given log slot, 0 if none, -slot on failure */ -int16_t +int32_t ao_log_flight(uint8_t slot); /* Checksum the loaded log record */ @@ -230,7 +230,7 @@ struct ao_log_mega { struct { uint16_t flight; /* 4 */ int16_t ground_accel; /* 6 */ - uint32_t ground_pres; /* 8 */ + int32_t ground_pres; /* 8 */ int16_t ground_accel_along; /* 12 */ int16_t ground_accel_across; /* 14 */ int16_t ground_accel_through; /* 16 */ @@ -242,7 +242,7 @@ struct ao_log_mega { struct { uint16_t flight; /* 4 */ int16_t ground_accel; /* 6 */ - uint32_t ground_pres; /* 8 */ + int32_t ground_pres; /* 8 */ int16_t ground_accel_along; /* 12 */ int16_t ground_accel_across; /* 14 */ int16_t ground_accel_through; /* 16 */ @@ -390,7 +390,7 @@ struct ao_log_metrum { struct { uint16_t flight; /* 4 */ int16_t ground_accel; /* 6 */ - uint32_t ground_pres; /* 8 */ + int32_t ground_pres; /* 8 */ uint32_t ground_temp; /* 12 */ } flight; /* 16 */ /* AO_LOG_STATE */ @@ -450,7 +450,7 @@ struct ao_log_mini { struct { uint16_t flight; /* 4 */ uint16_t r6; - uint32_t ground_pres; /* 8 */ + int32_t ground_pres; /* 8 */ } flight; /* AO_LOG_STATE */ struct { @@ -469,9 +469,9 @@ struct ao_log_mini { }; /* 16 */ #define ao_log_pack24(dst,value) do { \ - (dst)[0] = (value); \ - (dst)[1] = (value) >> 8; \ - (dst)[2] = (value) >> 16; \ + (dst)[0] = (uint8_t) (value); \ + (dst)[1] = (uint8_t) ((value) >> 8); \ + (dst)[2] = (uint8_t) ((value) >> 16); \ } while (0) struct ao_log_gps { diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c index b7e63465..8cf797e9 100644 --- a/src/kernel/ao_tracker.c +++ b/src/kernel/ao_tracker.c @@ -186,9 +186,9 @@ ao_gps_lock(void) static uint8_t erasing_current; void -ao_tracker_erase_start(uint16_t flight) +ao_tracker_erase_start(int32_t flight) { - erasing_current = flight == ao_flight_number; + erasing_current = flight == (int32_t) ao_flight_number; if (erasing_current) { ao_mutex_get(&tracker_mutex); ao_log_stop(); diff --git a/src/kernel/ao_tracker.h b/src/kernel/ao_tracker.h index 7d534339..27fa15a8 100644 --- a/src/kernel/ao_tracker.h +++ b/src/kernel/ao_tracker.h @@ -30,7 +30,7 @@ void ao_tracker_init(void); void -ao_tracker_erase_start(uint16_t flight); +ao_tracker_erase_start(int32_t flight); void ao_tracker_erase_end(void); -- 2.30.2