aboutsummaryrefslogtreecommitdiffstats
path: root/fw/table.h
diff options
context:
space:
mode:
Diffstat (limited to 'fw/table.h')
-rw-r--r--fw/table.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/fw/table.h b/fw/table.h
new file mode 100644
index 0000000..91e981a
--- /dev/null
+++ b/fw/table.h
@@ -0,0 +1,41 @@
+/* Table datastructure for storing calibrations in the EEPROM.
+ *
+ * A table has a fixed number of rows that define a key/value mapping.
+ * Keys and values are each U16.
+ * T: U16->U16
+ * Numbers are stored little-endian.
+ *
+ * Keys must be monotonically increasing.
+ *
+ * Device: PIC16F1459
+ * Compiler: XC8 v3.00
+ *
+ * Usage:
+ *
+ * #include <stdint.h>
+ * #include "types.h"
+ * #include "table.h"
+ */
+
+enum {
+ TAB_KEY_SIZE = 2, // U16
+ TAB_VAL_SIZE = 2, // U16
+ TAB_ROWS = 32,
+ TAB_ROW_SIZE = TAB_KEY_SIZE + TAB_VAL_SIZE,
+ TAB_SIZE = TAB_ROWS * TAB_ROW_SIZE,
+};
+
+typedef struct {
+ U16 offset; // starting address
+} Table;
+
+// Set the key and value of row k.
+Status tabWrite(const Table *tab, U8 k, U16 key, U16 val);
+
+// Read row k.
+Status tabRead(const Table *tab, U8 k, U16 *key, U16 *val);
+
+// Lookup the value associated with given key.
+// If key falls between two rows, the value is interpolated
+// from the two adjacent.
+Status tabLookup(const Table *tab, U16 key, U16 *val);