diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-01 15:23:59 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-01 15:23:59 -0400 |
| commit | d0ceeb4e2ad98c2f5698d78513143a39c6f36b95 (patch) | |
| tree | 23f2fb355c01a3acd4b64f40a77cf3750d35784d /fw/serial.c | |
| parent | 98b07898f98fb667adcece3348e63941673327c0 (diff) | |
| download | can-gauge-interface-d0ceeb4e2ad98c2f5698d78513143a39c6f36b95.zip | |
serialization module
Diffstat (limited to 'fw/serial.c')
| -rw-r--r-- | fw/serial.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/fw/serial.c b/fw/serial.c new file mode 100644 index 0000000..42a37b4 --- /dev/null +++ b/fw/serial.c @@ -0,0 +1,69 @@ +#include <xc.h> + +#include <stdbool.h> +#include <stdint.h> + +#include "types.h" +#include "eeprom.h" +#include "can.h" +#include "signal.h" + +#include "serial.h" + +Status +serWriteCanId(U16 addr, const CanId *id) { + U8 buf[4u]; + + // Copy ID to buffer + if (id->isExt) { // extended + buf[0u] = (id->eid>>0u) & 0xFF; + buf[1u] = (id->eid>>8u) & 0xFF; + buf[2u] = (id->eid>>16u) & 0xFF; + buf[3u] = (id->eid>>24u) & 0x1F; + buf[3u] |= 0x80; // set EID flag in bit 31 + } else { // standard + buf[0u] = (id->sid>>0u) & 0xFF; + buf[1u] = (id->sid>>8u) & 0x07; + buf[2u] = 0u; + buf[3u] = 0u; // clear EID flag in bit 32 + } + + return eepromWrite(addr, buf, sizeof(buf)); +} + +Status +serReadCanId(U16 addr, CanId *id) { + U8 buf[sizeof(U32)]; + Status status; + + // Read + status = eepromRead(addr, buf, sizeof(buf)); + if (status != OK) { + return FAIL; + } + + // Unpack + if (buf[3u] & 0x80) { // bit 31 is standard/extended flag + id->isExt = true; // extended + id->eid = ((U32)buf[0u] << 0u) + | ((U32)buf[1u] << 8u) + | ((U32)buf[2u] << 16u) + | (((U32)buf[3u] & 0x1F) << 24u); + } else { + id->isExt = false; // standard + id->sid = ((U16)buf[0u] << 0u) + | (((U16)buf[1u] & 0x07) << 8u); + } + + return OK; +} + +Status +serWriteSigFmt(EepromAddr addr, const SigFmt *sig) { + // TODO +} + +Status +serReadSigFmt(EepromAddr addr, SigFmt *sig) { + // TODO +} |