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 | |
| 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.
| -rw-r--r-- | altimeter.c | 6 | ||||
| -rw-r--r-- | data_manager.c | 52 | ||||
| -rw-r--r-- | data_manager.h | 20 | ||||
| -rw-r--r-- | 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);  }  | 
