From 06c7bb3ab139320fcc6c4f1e94b8a58a872c7e14 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sat, 13 Feb 2021 23:47:57 +1300 Subject: Refactor data_manager to use contexts This should be more testable and flexible. Note that the barometer has internal non-resettable state which enforces a certain test order. This should be fixed soon. --- altimeter.c | 6 ++++-- data_manager.c | 52 ++++++---------------------------------------------- data_manager.h | 20 ++++++-------------- test_data_manager.c | 14 ++++++++------ 4 files changed, 24 insertions(+), 68 deletions(-) diff --git a/altimeter.c b/altimeter.c index 77c897e..861b054 100644 --- a/altimeter.c +++ b/altimeter.c @@ -34,10 +34,12 @@ #define DEBUG_MARK_5_SET do{PORTB |= 1 << 5;}while(0) #define DEBUG_MARK_5_CLEAR do{PORTB &= ~(1 << 5);}while(0) +static struct data_ctx dctx = {}; + /* ISR for collecting and displaying pressure, altitude data etc */ ISR(TIMER1_COMPA_vect) { - data_manager_tick(); + data_manager_tick(&dctx); //ui_tick(); WDT_PAT_MAYBE(); @@ -48,7 +50,7 @@ int main(void) /* Initialise display before enabling interrupts */ display_init(); display_clear(); - data_manager_init(); + data_manager_init(&dctx); DEBUG_INIT; diff --git a/data_manager.c b/data_manager.c index 62dcd14..76a70c7 100644 --- a/data_manager.c +++ b/data_manager.c @@ -5,9 +5,6 @@ #include "data_manager.h" #include "barometer.h" -static float pressure[PRESSURE_UNIT_MAX]; -static float setting[PRESSURE_UNIT_MAX]; -static float altitude[ALTITUDE_UNIT_MAX]; /* utility functions */ static float pressure_to_metres_asl(float real, float setting) @@ -15,57 +12,20 @@ static float pressure_to_metres_asl(float real, float setting) return 44330.f*(1.f-powf(real/setting, 1/5.255)); } - -/* exported functions */ -#define DATA_MANAGER_GETTER(name, store, bound, enum_type, return_type) \ -float name(enum_type unit) \ -{ \ - if (unit >= 0 && unit < bound) { \ - return store[unit]; \ - } else { \ - abort(); \ - } \ -} - -DATA_MANAGER_GETTER( - data_manager_get_pressure, - pressure, - PRESSURE_UNIT_MAX, - enum pressure_unit, - float) -DATA_MANAGER_GETTER( - data_manager_get_setting, - setting, - PRESSURE_UNIT_MAX, - enum pressure_unit, - float) -DATA_MANAGER_GETTER( - data_manager_get_altitude, - altitude, - ALTITUDE_UNIT_MAX, - enum altitude_unit, - float) - -void data_manager_init(void) +void data_manager_init(struct data_ctx *ctx) { - /* FIXME load initial setting and force a tick synchronously */ - setting[PRESSURE_UNIT_HPA] = 1013.25; - data_manager_tick(); + ctx->setting = 1013.25; + data_manager_tick(ctx); } -void data_manager_tick(void) +void data_manager_tick(struct data_ctx *ctx) { /* FIXME alt rate */ /* FIXME calculate on demand? */ - /* FIXME hardcoding the conversion factors here is gross */ - float p = barometer_read(); - pressure[PRESSURE_UNIT_HPA] = p; - pressure[PRESSURE_UNIT_INHG] = p / 3.38639; + ctx->pressure = barometer_read(); /* FIXME we need atomic access to alt setting once user can set it. Check * if AVR allows multiple/nested ISRs to run concurrently, pretty sure not */ - float a = pressure_to_metres_asl(p, setting[PRESSURE_UNIT_HPA]); - altitude[ALTITUDE_UNIT_METRE] = a; - altitude[ALTITUDE_UNIT_FT] = a * 3.048; + ctx->altitude = pressure_to_metres_asl(ctx->pressure, ctx->setting); } diff --git a/data_manager.h b/data_manager.h index 293d7d5..83126f6 100644 --- a/data_manager.h +++ b/data_manager.h @@ -1,18 +1,10 @@ #pragma once -enum pressure_unit { - PRESSURE_UNIT_HPA, - PRESSURE_UNIT_INHG, - PRESSURE_UNIT_MAX +struct data_ctx { + float setting; + float pressure; + float altitude; }; -enum altitude_unit { - ALTITUDE_UNIT_METRE, - ALTITUDE_UNIT_FT, - ALTITUDE_UNIT_MAX -}; - -float data_manager_get_setting(enum pressure_unit); -float data_manager_get_pressure(enum pressure_unit); -void data_manager_init(void); -void data_manager_tick(void); +void data_manager_init(struct data_ctx*); +void data_manager_tick(struct data_ctx*); diff --git a/test_data_manager.c b/test_data_manager.c index 8edd781..4673cab 100644 --- a/test_data_manager.c +++ b/test_data_manager.c @@ -4,14 +4,16 @@ RUNNER_DECLARE_TEST(test_data_manager_init_setting) { - data_manager_init(); - TEST_ASSERT_FLOAT_WITHIN(0.001, 1013.25, data_manager_get_setting(PRESSURE_UNIT_HPA)); + struct data_ctx ctx; + data_manager_init(&ctx); + TEST_ASSERT_FLOAT_WITHIN(0.001, 1013.25, ctx.setting); } RUNNER_DECLARE_TEST(test_data_manager_first_readings) { - data_manager_init(); - TEST_ASSERT_FLOAT_WITHIN(0.001, 1019.5, data_manager_get_pressure(PRESSURE_UNIT_HPA)); - data_manager_tick(); - TEST_ASSERT_FLOAT_WITHIN(0.001, 1019.45, data_manager_get_pressure(PRESSURE_UNIT_HPA)); + struct data_ctx ctx; + data_manager_init(&ctx); + TEST_ASSERT_FLOAT_WITHIN(0.001, 1019.5, ctx.pressure); + data_manager_tick(&ctx); + TEST_ASSERT_FLOAT_WITHIN(0.001, 1019.45, ctx.pressure); } -- cgit v1.1