aboutsummaryrefslogtreecommitdiffstats
path: root/sw/cal
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-11-07 16:10:37 -0500
committerSam Anthony <sam@samanthony.xyz>2025-11-07 16:10:37 -0500
commit250c47a8e6dc1de1839f9717ec160ea7ec161105 (patch)
tree938d0768998d9e6cb793e470a063f71057834013 /sw/cal
parent085c7bba8dce915f098e5cdc53c2003b6f89769a (diff)
downloadcan-gauge-interface-250c47a8e6dc1de1839f9717ec160ea7ec161105.zip
cal: parse dbc file
Diffstat (limited to 'sw/cal')
-rw-r--r--sw/cal/go.mod14
-rw-r--r--sw/cal/go.sum16
-rw-r--r--sw/cal/main.go95
3 files changed, 125 insertions, 0 deletions
diff --git a/sw/cal/go.mod b/sw/cal/go.mod
new file mode 100644
index 0000000..16cb63c
--- /dev/null
+++ b/sw/cal/go.mod
@@ -0,0 +1,14 @@
+module git.samanthony.xyz/can_gauge_interface/sw/cal
+
+go 1.25.3
+
+require (
+ github.com/google/go-cmp v0.6.0 // indirect
+ github.com/josharian/native v1.1.0 // indirect
+ github.com/mdlayher/netlink v1.7.2 // indirect
+ github.com/mdlayher/socket v0.4.1 // indirect
+ go.einride.tech/can v0.16.1 // indirect
+ golang.org/x/net v0.38.0 // indirect
+ golang.org/x/sync v0.11.0 // indirect
+ golang.org/x/sys v0.31.0 // indirect
+)
diff --git a/sw/cal/go.sum b/sw/cal/go.sum
new file mode 100644
index 0000000..4005cd3
--- /dev/null
+++ b/sw/cal/go.sum
@@ -0,0 +1,16 @@
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
+github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
+github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
+github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
+github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
+github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
+go.einride.tech/can v0.16.1 h1:s9MqX1OR6ujGxvl+gOWAGL54MC3kaPE+cgxBCUfDrB8=
+go.einride.tech/can v0.16.1/go.mod h1:9pgqXNGpPfrd/WGXGmiKW8cUvIep/o+o76JgUKpQuWI=
+golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
+golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
+golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
+golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
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...)
+}