diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-01 20:32:55 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-01 20:32:55 -0400 |
| commit | b71dd676b5ebe3feec1eb2194e20453a3d01705d (patch) | |
| tree | 10e19b6fa21d27c97376cdaf2bcfa03c05b2a75a /fw/types.c | |
| parent | 96a85a2bb8e52cb8b15745bca617e3cc788d02ad (diff) | |
| download | can-gauge-interface-b71dd676b5ebe3feec1eb2194e20453a3d01705d.zip | |
lookup output value in table
Diffstat (limited to 'fw/types.c')
| -rw-r--r-- | fw/types.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/fw/types.c b/fw/types.c new file mode 100644 index 0000000..24a7c3a --- /dev/null +++ b/fw/types.c @@ -0,0 +1,108 @@ +#include <stdint.h> + +#include "types.h" + +#define cmp(a, b) (((a) > (b)) ? 1 : (((a) < (b)) ? -1 : 0)) + +Status +u32ToNum(U32 x, NumType t, Number *n) { + n->type = t; + + switch (t) { + case NUM_U8: + n->u8 = x & 0xFF; + return OK; + case NUM_U16: + n->u16 = x & 0xFFFF; + return OK; + case NUM_U32: + n->u32 = x; + return OK; + case NUM_I8: + n->u8 = x & 0xFF; + n->i8 = *(I8 *)&n->u8; + return OK; + case NUM_I16: + n->u16 = x & 0xFFFF; + n->i16 = *(I16 *)&n->u16; + return OK; + case NUM_I32: + n->i32 = *(I32 *)&x; + return OK; + default: + return FAIL; + } +} + +static Status +cmpU32Num(U32 a, Number b, int *ord) { + switch (b.type) { + case NUM_U8: + *ord = cmp(a, b.u8); + return OK; + case NUM_U16: + *ord = cmp(a, b.u16); + return OK; + case NUM_U32: + *ord = cmp(a, b.u32); + return OK; + case NUM_I8: + *ord = cmp(a, b.i8); + return OK; + case NUM_I16: + *ord = cmp(a, b.i16); + return OK; + case NUM_I32: + *ord = cmp(a, b.i32); + return OK; + default: + return FAIL; + } +} + +Status +cmpNum(Number a, Number b, int *ord) { + switch (a.type) { + case NUM_U8: + a.i32 = a.u8; + break; + case NUM_U16: + a.i32 = a.u16; + break; + case NUM_U32: + return cmpU32Num(a.u32, b, ord); + case NUM_I8: + a.i32 = a.i8; + break; + case NUM_I16: + a.i32 = a.i16; + break; + case NUM_I32: + break; // do nothing + default: + return FAIL; + } + + switch (b.type) { + case NUM_U8: + *ord = cmp(a.i32, b.u8); + return OK; + case NUM_U16: + *ord = cmp(a.i32, b.u16); + return OK; + case NUM_U32: + *ord = cmp(a.i32, b.u32); + return OK; + case NUM_I8: + *ord = cmp(a.i32, b.i8); + return OK; + case NUM_I16: + *ord = cmp(a.i32, b.i16); + return OK; + case NUM_I32: + *ord = cmp(a.i32, b.i32); + return OK; + default: + return FAIL; + } +} |