diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-07 10:49:47 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-07 10:49:47 -0500 |
| commit | 44865db9ca695ba7ed90bb96812851776edf1317 (patch) | |
| tree | 38049978c5fb37fecdbf6feea03c0e0d289d4e34 | |
| parent | 4158981e549db6c5cc626cfd6d244c85485f5612 (diff) | |
| download | can-gauge-interface-44865db9ca695ba7ed90bb96812851776edf1317.zip | |
handle Signal Control DATA FRAME
| -rw-r--r-- | fw/main.c | 47 |
1 files changed, 46 insertions, 1 deletions
@@ -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. |