diff options
author | David Phillips <david@yeah.nah.nz> | 2021-02-13 23:47:57 +1300 |
---|---|---|
committer | David Phillips <david@yeah.nah.nz> | 2021-02-14 00:01:37 +1300 |
commit | 06c7bb3ab139320fcc6c4f1e94b8a58a872c7e14 (patch) | |
tree | 33217b73ba4e0362098fc7870b931dc291c0bdb5 /data_manager.c | |
parent | be60c165447251c77812f1d4e4678b474285bfe9 (diff) | |
download | altimeter-06c7bb3ab139320fcc6c4f1e94b8a58a872c7e14.tar.xz |
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.
Diffstat (limited to 'data_manager.c')
-rw-r--r-- | data_manager.c | 52 |
1 files changed, 6 insertions, 46 deletions
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); } |