aboutsummaryrefslogtreecommitdiff
path: root/data_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'data_manager.c')
-rw-r--r--data_manager.c69
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;
+}