From 01bd9cbc6fe64f236a1b467f011e56dcae0306e7 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 24 Oct 2025 16:55:59 -0400 Subject: table module --- fw/table.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 fw/table.h (limited to 'fw/table.h') 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 + * #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); -- cgit v1.2.3