From 250c47a8e6dc1de1839f9717ec160ea7ec161105 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 7 Nov 2025 16:10:37 -0500 Subject: cal: parse dbc file --- sw/cal/main.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 sw/cal/main.go (limited to 'sw/cal/main.go') diff --git a/sw/cal/main.go b/sw/cal/main.go new file mode 100644 index 0000000..98e021c --- /dev/null +++ b/sw/cal/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "go.einride.tech/can/pkg/dbc" +) + +const dev = "can0" + +type Signals struct { + tach, speed, an1, an2, an3, an4 *dbc.SignalDef +} + +// Flags +var ( + // DBC file + dbcFilenameFlag = "dbc" + dbcFilename = flag.String(dbcFilenameFlag, "", "DBC file name") + + // Signal names + tachSigFlag = "tachSig" + speedSigFlag = "speedSig" + an1SigFlag = "an1Sig" + an2SigFlag = "an2Sig" + an3SigFlag = "an3Sig" + an4SigFlag = "an4Sig" + tachSig = flag.String(tachSigFlag, "", "tachometer signal name") + speedSig = flag.String(speedSigFlag, "", "speedometer signal name") + an1Sig = flag.String(an1SigFlag, "", "analog channel 1 signal name") + an2Sig = flag.String(an2SigFlag, "", "analog channel 2 signal name") + an3Sig = flag.String(an3SigFlag, "", "analog channel 3 signal name") + an4Sig = flag.String(an4SigFlag, "", "analog channel 4 signal name") + + // Calibration tables + // TODO +) + +func main() { + // Parse command line args + flag.Parse() + if *dbcFilename == "" { + weprintf("Missing '%s' flag.\n", dbcFilenameFlag) + flag.Usage() + os.Exit(1) + } + + // Parse DBC file + msgDefs, err := parseDbcFile(*dbcFilename) + if err != nil { + eprintf("Error parsing %s: %v\n", *dbcFilename, err) + } + + + for _, msg := range msgDefs { + for _, sig := range msg.Signals { + fmt.Println(sig) + } + } +} + +func parseDbcFile(filename string) ([]*dbc.MessageDef, error) { + // Read file + buf, err := os.ReadFile(filename) + if err != nil { + return nil, err + } + + // Parse file + parser := dbc.NewParser(filename, buf) + if err := parser.Parse(); err != nil { + return nil, err + } + + // Filter message definitions + defs := parser.Defs() + msgDefs := make([]*dbc.MessageDef, 0, len(defs)) + for _, def := range defs { + if msg, ok := def.(*dbc.MessageDef); ok { + msgDefs = append(msgDefs, msg) + } + } + return msgDefs, nil +} + +func eprintf(format string, a ...any) { + weprintf(format, a...) + os.Exit(1) +} + +func weprintf(format string, a ...any) { + fmt.Fprintf(os.Stderr, format, a...) +} -- cgit v1.2.3