diff options
Diffstat (limited to 'data_manager.c')
-rw-r--r-- | data_manager.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/data_manager.c b/data_manager.c new file mode 100644 index 0000000..bd34426 --- /dev/null +++ b/data_manager.c @@ -0,0 +1,69 @@ +#include <stdbool.h> +#include <stdlib.h> +#include <math.h> + +#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) +{ + 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) +{ + /* FIXME load initial setting and force a tick synchronously */ +} + +void data_manager_tick(void) +{ + /* 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; + + /* 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; +} |