diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-08 10:16:42 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-08 10:16:42 -0500 |
| commit | 9b562121464ea21ba8c8b4d3783d3f873746ee00 (patch) | |
| tree | 6ac231d72996efbd7356c462ddb06b183eb9181e /sw/cal/can.go | |
| parent | 413d894d0637d7a4e55025664043ffa1c29e9bbb (diff) | |
| download | can-gauge-interface-9b562121464ea21ba8c8b4d3783d3f873746ee00.zip | |
cal: send Signal Control framess
Diffstat (limited to 'sw/cal/can.go')
| -rw-r--r-- | sw/cal/can.go | 72 |
1 files changed, 65 insertions, 7 deletions
diff --git a/sw/cal/can.go b/sw/cal/can.go index 751ffd9..9feefa3 100644 --- a/sw/cal/can.go +++ b/sw/cal/can.go @@ -3,6 +3,8 @@ package main import ( "context" bin "encoding/binary" + "fmt" + "math" "strings" "time" @@ -11,12 +13,70 @@ import ( ) const ( - tblCtrlId = 0x1272000 - sigCtrlId = 0x1272100 + tblCtrlId uint32 = 0x1272000 + sigCtrlId uint32 = 0x1272100 - timeout = 5 * time.Second + stdMask = 0x7FF + extMask = 0x1FFFFFFF + + timeout = 1 * time.Second ) +// Transmit a signal's encoding in a Signal Control frame so the Interface can store it in its EEPROM. +func sendEncoding(def SignalDef, sig int, tx *socketcan.Transmitter) error { + // Serialize DATA FIELD + var data [8]byte + if err := serializeEncodingData(def, &data); err != nil { + return err + } + fmt.Println(data) + + // Construct ID and send frame + frame := can.Frame{ + ID: sigCtrlId | uint32(sig&0xF), + Length: 7, + Data: data, + IsExtended: true, + } + ctx, _ := context.WithTimeout(context.Background(), timeout) + return transmit(tx, frame, ctx) +} + +// Serialize the DATA FIELD of a Signal Control frame. +func serializeEncodingData(def SignalDef, data *[8]byte) error { + // SigId field + if _, err := bin.Encode(data[0:4], bin.BigEndian, uint32(def.id)&extMask); err != nil { + return err + } + if def.id.IsExtended() { + data[0] |= 0x80 // EXIDE + } + + // Start field + if def.start > math.MaxUint8 { + return fmt.Errorf("%s: start bit out of range: %d>%d", def.name, def.start, math.MaxUint8) + } + data[4] = uint8(def.start) + + // Size field + if def.size > math.MaxUint8 { + return fmt.Errorf("%s: size out of range: %d>%d", def.name, def.size, math.MaxUint8) + } + data[5] = uint8(def.size) + + // Order and sign flag bits + if def.isBigEndian { + data[6] |= 0x80 + } + if def.isSigned { + data[6] |= 0x40 + } + + fmt.Println(data) + + return nil +} + // Transmit a table in Table Control frames so the Interface can store it in its EEPROM. func sendTable(tx *socketcan.Transmitter, tbl Table, sig int) error { // Send populated rows @@ -43,12 +103,10 @@ func sendTable(tx *socketcan.Transmitter, tbl Table, sig int) error { func sendRow(tx *socketcan.Transmitter, key int32, val uint16, sig int, row int) error { // Serialize DATA FIELD var data [8]byte - _, err := bin.Encode(data[0:4], bin.BigEndian, key) - if err != nil { + if _, err := bin.Encode(data[0:4], bin.BigEndian, key); err != nil { return err } - _, err = bin.Encode(data[4:6], bin.BigEndian, val) - if err != nil { + if _, err := bin.Encode(data[4:6], bin.BigEndian, val); err != nil { return err } |