aboutsummaryrefslogtreecommitdiffstats
path: root/fw/table.h
blob: a5cfb7b4b7c8758b57404f1790fbf3f34e1887f5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* 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 U32.
 * T: U32->U32
 * Numbers are stored little-endian.
 *
 * Keys must be monotonically increasing.
 *
 * Device: PIC16F1459
 * Compiler: XC8 v3.00
 *
 * Usage:
 *
 * #include <stdbool.h>
 * #include <stdint.h>
 * #include "types.h"
 * #include "can.h"
 * #include "eeprom.h"
 * #include "table.h"
 */

enum {
	TAB_KEY_SIZE = sizeof(U32),
	TAB_VAL_SIZE = sizeof(U16),
	TAB_ROWS = 32,
	TAB_ROW_SIZE = TAB_KEY_SIZE + TAB_VAL_SIZE,
	TAB_SIZE = TAB_ROWS * TAB_ROW_SIZE,
};

typedef struct {
	EepromAddr offset; // starting address
} Table;

// Set the key and value of row k.
Status tabWrite(const Table *tab, U8 k, U32 key, U16 val);

// Read row k.
Status tabRead(const Table *tab, U8 k, U32 *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, Number key, U16 *val);