diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-07 19:10:23 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-07 19:10:23 -0500 |
| commit | c43588e172917783843133eb0061bf0d118ae5d5 (patch) | |
| tree | c748fecb1b530422c57dae449064cd8a5beb6c6a /sw/cal/can.go | |
| parent | 688972df9daa1f80d24feff5c056ab3a66c4eee9 (diff) | |
| download | can-gauge-interface-c43588e172917783843133eb0061bf0d118ae5d5.zip | |
cal: transmit table to CAN bus
Diffstat (limited to 'sw/cal/can.go')
| -rw-r--r-- | sw/cal/can.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/sw/cal/can.go b/sw/cal/can.go new file mode 100644 index 0000000..53f00a0 --- /dev/null +++ b/sw/cal/can.go @@ -0,0 +1,54 @@ +package main + +import ( + "context" + bin "encoding/binary" + + "go.einride.tech/can" + "go.einride.tech/can/pkg/socketcan" +) + +const ( + + // CAN IDs + tblCtrlId = 0x1272000 + sigCtrlId = 0x1272100 +) + +// Write a calibration table to the EEPROM. +func writeTable(tx *socketcan.Transmitter, tbl Table, sig int) error { + var i int + for i = 0; i < len(tbl.keys); i++ { + err := writeRow(tx, tbl.keys[i], tbl.vals[i], sig, i) + if err != nil { + return err + } + } + for ; i < tabRows; i++ { + err := writeRow(tx, tbl.keys[len(tbl.keys)-1], tbl.vals[len(tbl.keys)-1], sig, i) + if err != nil { + return err + } + } + return nil +} + +func writeRow(tx *socketcan.Transmitter, key int32, val uint16, sig int, row int) error { + var data [8]byte + _, err := bin.Encode(data[0:4], bin.BigEndian, key) + if err != nil { + return err + } + _, err = bin.Encode(data[4:6], bin.BigEndian, val) + if err != nil { + return err + } + + frame := can.Frame{ + ID: uint32(tblCtrlId) | uint32((sig<<5)&0xE0) | uint32(row&0x1F), + Length: 6, + Data: data, + IsExtended: true, + } + return tx.TransmitFrame(context.Background(), frame) +} |