diff options
Diffstat (limited to 'sw/cal')
| -rw-r--r-- | sw/cal/dbc.go | 81 | ||||
| -rw-r--r-- | sw/cal/err.go | 10 | ||||
| -rw-r--r-- | sw/cal/main.go | 82 |
3 files changed, 91 insertions, 82 deletions
diff --git a/sw/cal/dbc.go b/sw/cal/dbc.go new file mode 100644 index 0000000..53ca852 --- /dev/null +++ b/sw/cal/dbc.go @@ -0,0 +1,81 @@ +package main + +import ( + "fmt" + "os" + "slices" + + "go.einride.tech/can/pkg/dbc" +) + +// Extract signals from the DBC file. +func parseSignals(filename string, names []string) ([]dbc.SignalDef, error) { + // Parse DBC file + msgDefs, err := parseDbcFile(filename) + if err != nil { + return nil, err + } + + // Search for signals + sigPtrs := make([]*dbc.SignalDef, len(names)) + for _, msg := range msgDefs { + for i := range names { + j := slices.IndexFunc(msg.Signals, func(sig dbc.SignalDef) bool { return sig.Name == dbc.Identifier(names[i]) }) + if j < 0 { + continue + } + if sigPtrs[i] != nil { + return nil, ErrDupSig{msg.Signals[j]} + } + sigPtrs[i] = &msg.Signals[j] + } + } + + // Check all signals are present + if i := slices.IndexFunc(sigPtrs, func(sp *dbc.SignalDef) bool { return sp == nil }); i >= 0 { + return nil, ErrNoSig{filename, names[i]} + } + + // Dereference + signals := make([]dbc.SignalDef, len(sigPtrs)) + for i := range sigPtrs { + signals[i] = *sigPtrs[i] + } + + return signals, nil +} + +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 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 + +} diff --git a/sw/cal/err.go b/sw/cal/err.go index 951ac12..452e5f0 100644 --- a/sw/cal/err.go +++ b/sw/cal/err.go @@ -2,10 +2,20 @@ package main import ( "fmt" + "os" "go.einride.tech/can/pkg/dbc" ) +func eprintf(format string, a ...any) { + weprintf(format, a...) + os.Exit(1) +} + +func weprintf(format string, a ...any) { + fmt.Fprintf(os.Stderr, format, a...) +} + type ErrDupSig struct { sig dbc.SignalDef } diff --git a/sw/cal/main.go b/sw/cal/main.go index e3794f4..3758a07 100644 --- a/sw/cal/main.go +++ b/sw/cal/main.go @@ -4,7 +4,6 @@ import ( "flag" "fmt" "os" - "slices" "go.einride.tech/can/pkg/dbc" ) @@ -67,84 +66,3 @@ func nonEmpty(ss ...string) []string { } return r } - -// Extract signals from the DBC file. -func parseSignals(filename string, names []string) ([]dbc.SignalDef, error) { - // Parse DBC file - msgDefs, err := parseDbcFile(filename) - if err != nil { - return nil, err - } - - // Search for signals - sigPtrs := make([]*dbc.SignalDef, len(names)) - for _, msg := range msgDefs { - for i := range names { - j := slices.IndexFunc(msg.Signals, func(sig dbc.SignalDef) bool { return sig.Name == dbc.Identifier(names[i]) }) - if j < 0 { - continue - } - if sigPtrs[i] != nil { - return nil, ErrDupSig{msg.Signals[j]} - } - sigPtrs[i] = &msg.Signals[j] - } - } - - // Check all signals are present - if i := slices.IndexFunc(sigPtrs, func(sp *dbc.SignalDef) bool { return sp == nil }); i >= 0 { - return nil, ErrNoSig{filename, names[i]} - } - - // Dereference - signals := make([]dbc.SignalDef, len(sigPtrs)) - for i := range sigPtrs { - signals[i] = *sigPtrs[i] - } - - return signals, nil -} - -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 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) -} - -func weprintf(format string, a ...any) { - fmt.Fprintf(os.Stderr, format, a...) -} |