aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--altimeter.c6
-rw-r--r--data_manager.c52
-rw-r--r--data_manager.h20
-rw-r--r--test_data_manager.c14
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);
}