aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sw/cal/err.go24
-rw-r--r--sw/cal/main.go91
2 files changed, 100 insertions, 15 deletions
diff --git a/sw/cal/err.go b/sw/cal/err.go
new file mode 100644
index 0000000..951ac12
--- /dev/null
+++ b/sw/cal/err.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "fmt"
+
+ "go.einride.tech/can/pkg/dbc"
+)
+
+type ErrDupSig struct {
+ sig dbc.SignalDef
+}
+
+func (e ErrDupSig) Error() string {
+ return fmt.Sprintf("%v: duplicate signal '%s'", e.sig.Pos, e.sig.Name)
+}
+
+type ErrNoSig struct {
+ filename string // DBC file
+ signal string // signal name
+}
+
+func (e ErrNoSig) Error() string {
+ return fmt.Sprintf("%s: no such signal '%s'", e.filename, e.signal)
+}
diff --git a/sw/cal/main.go b/sw/cal/main.go
index 98e021c..9a1d067 100644
--- a/sw/cal/main.go
+++ b/sw/cal/main.go
@@ -18,21 +18,21 @@ type Signals struct {
var (
// DBC file
dbcFilenameFlag = "dbc"
- dbcFilename = flag.String(dbcFilenameFlag, "", "DBC file name")
+ dbcFilename = flag.String(dbcFilenameFlag, "", "DBC file name")
// Signal names
- tachSigFlag = "tachSig"
+ 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")
+ 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
@@ -47,18 +47,68 @@ func main() {
os.Exit(1)
}
- // Parse DBC file
- msgDefs, err := parseDbcFile(*dbcFilename)
+ // Parse signals in DBC file
+ signals, err := parseSignals(*dbcFilename)
if err != nil {
eprintf("Error parsing %s: %v\n", *dbcFilename, err)
}
+ fmt.Println(signals)
+}
+// Parse signals in the DBC file.
+func parseSignals(filename string) (Signals, error) {
+ msgDefs, err := parseDbcFile(filename)
+ if err != nil {
+ return Signals{}, err
+ }
+
+ // Search for signals in messages
+ var signals Signals
for _, msg := range msgDefs {
for _, sig := range msg.Signals {
- fmt.Println(sig)
+ if err := tryAssignSignal(&signals.tach, sig, *tachSig); err != nil {
+ return signals, err
+ }
+ if err := tryAssignSignal(&signals.speed, sig, *speedSig); err != nil {
+ return signals, err
+ }
+ if err := tryAssignSignal(&signals.an1, sig, *an1Sig); err != nil {
+ return signals, err
+ }
+ if err := tryAssignSignal(&signals.an2, sig, *an2Sig); err != nil {
+ return signals, err
+ }
+ if err := tryAssignSignal(&signals.an3, sig, *an3Sig); err != nil {
+ return signals, err
+ }
+ if err := tryAssignSignal(&signals.an4, sig, *an4Sig); err != nil {
+ return signals, err
+ }
}
}
+
+ // Check all signals provided on command line are present in the DBC file
+ if *tachSig != "" && signals.tach == nil {
+ return signals, ErrNoSig{filename, *tachSig}
+ }
+ if *speedSig != "" && signals.speed == nil {
+ return signals, ErrNoSig{filename, *speedSig}
+ }
+ if *an1Sig != "" && signals.an1 == nil {
+ return signals, ErrNoSig{filename, *an1Sig}
+ }
+ if *an2Sig != "" && signals.an2 == nil {
+ return signals, ErrNoSig{filename, *an2Sig}
+ }
+ if *an3Sig != "" && signals.an3 == nil {
+ return signals, ErrNoSig{filename, *an3Sig}
+ }
+ if *an4Sig != "" && signals.an4 == nil {
+ return signals, ErrNoSig{filename, *an4Sig}
+ }
+
+ return signals, nil
}
func parseDbcFile(filename string) ([]*dbc.MessageDef, error) {
@@ -85,6 +135,17 @@ func parseDbcFile(filename string) ([]*dbc.MessageDef, error) {
return msgDefs, nil
}
+func tryAssignSignal(dst **dbc.SignalDef, sig dbc.SignalDef, targetName string) error {
+ if targetName != "" && string(sig.Name) == targetName {
+ if *dst != nil {
+ return fmt.Errorf("%v: duplicate signal '%s'", sig.Pos, sig.Name)
+ }
+ *dst = &sig
+ }
+ return nil
+
+}
+
func eprintf(format string, a ...any) {
weprintf(format, a...)
os.Exit(1)