ao_log: Change flight type to uint16_t, widen APIs dealing with flight numbers to...
authorKeith Packard <keithp@keithp.com>
Fri, 28 Jan 2022 23:06:18 +0000 (15:06 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 17 Feb 2022 01:26:49 +0000 (17:26 -0800)
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 <keithp@keithp.com>
src/kernel/ao_log.c
src/kernel/ao_log.h
src/kernel/ao_tracker.c
src/kernel/ao_tracker.h

index 2167d145d2ecd7211832ce01879fcd68bcc3bb17..53d6666929021c37e686074c64700fea699dae59 100644 (file)
@@ -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[] = {
index 09ae7add80b683f469454cf721c4ad5f7c185410..837fc31eed8ea6a3ecdadf274374e967e2701ce1 100644 (file)
@@ -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 {
index b7e634656285a2b823c9ff6cb088fbe4c81c5736..8cf797e966b42a8c98f62cbb71c0c919dbe579f7 100644 (file)
@@ -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();
index 7d534339808ef5950465acbc053cb0b884ce09c9..27fa15a896dc7a266fa7a385de37274ec7080679 100644 (file)
@@ -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);