aboutsummaryrefslogtreecommitdiff
path: root/data_manager.c
diff options
context:
space:
mode:
authorDavid Phillips <david@yeah.nah.nz>2021-02-13 23:47:57 +1300
committerDavid Phillips <david@yeah.nah.nz>2021-02-14 00:01:37 +1300
commit06c7bb3ab139320fcc6c4f1e94b8a58a872c7e14 (patch)
tree33217b73ba4e0362098fc7870b931dc291c0bdb5 /data_manager.c
parentbe60c165447251c77812f1d4e4678b474285bfe9 (diff)
downloadaltimeter-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.c52
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);
}