aboutsummaryrefslogtreecommitdiffstats
path: root/fw
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-11-07 10:49:47 -0500
committerSam Anthony <sam@samanthony.xyz>2025-11-07 10:49:47 -0500
commit44865db9ca695ba7ed90bb96812851776edf1317 (patch)
tree38049978c5fb37fecdbf6feea03c0e0d289d4e34 /fw
parent4158981e549db6c5cc626cfd6d244c85485f5612 (diff)
downloadcan-gauge-interface-44865db9ca695ba7ed90bb96812851776edf1317.zip
handle Signal Control DATA FRAME
Diffstat (limited to 'fw')
-rw-r--r--fw/main.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/fw/main.c b/fw/main.c
index 80719f1..06f0774 100644
--- a/fw/main.c
+++ b/fw/main.c
@@ -221,7 +221,52 @@ respondSigCtrl(Signal sig) {
// to a Signal Control DATA FRAME.
static Status
setSigFmt(const CanFrame *frame) {
- // TODO
+ Signal sig;
+ SigFmt sigFmt;
+ Status status;
+
+ // Extract signal number from ID
+ sig = frame->id.eid & 0xF;
+ if (sig >= NSIG) {
+ return FAIL;
+ }
+
+ // Prepare to unpack DATA FIELD
+ if (frame->dlc != 7u) {
+ return FAIL;
+ }
+
+ // Unpack SigId
+ if (frame->data[0u] & 0x80) { // EXIDE
+ // Extended
+ sigFmt.id.isExt = true;
+ sigFmt.id.eid = (((U32)frame->data[0u] & 0x1F) << 24u)
+ | ((U32)frame->data[1u] << 16u)
+ | ((U32)frame->data[2u] << 8u)
+ | ((U32)frame->data[3u] << 0u);
+ } else {
+ // Standard
+ sigFmt.id.isExt = false;
+ sigFmt.id.sid = (((U16)frame->data[2u] & 0x07) << 8u)
+ | ((U16)frame->data[3u] << 0u);
+ }
+
+ // Unpack Encoding
+ sigFmt.start = frame->data[4u];
+ sigFmt.size = frame->data[5u];
+ sigFmt.order = (frame->data[6u] & 0x80) ? BIG_ENDIAN : LITTLE_ENDIAN;
+ sigFmt.isSigned = frame->data[6u] & 0x40;
+
+ // Save to EEPROM
+ status = serWriteSigFmt(sigFmtAddrs[sig], &sigFmt);
+ if (status != OK) {
+ return FAIL;
+ }
+
+ // Update copy in RAM
+ sigFmts[sig] = sigFmt;
+
+ return OK;
}
// Handle a Signal Control Frame.