mirror of
https://github.com/bettercap/bettercap
synced 2025-08-20 21:43:18 -07:00
refact: refactored can dbc logic
This commit is contained in:
parent
31d93e7c39
commit
840f819484
6 changed files with 214 additions and 108 deletions
169
modules/can/can_dbc.go
Normal file
169
modules/can/can_dbc.go
Normal file
|
@ -0,0 +1,169 @@
|
|||
package can
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/evilsocket/islazy/str"
|
||||
"go.einride.tech/can"
|
||||
"go.einride.tech/can/pkg/descriptor"
|
||||
)
|
||||
|
||||
type DBC struct {
|
||||
sync.RWMutex
|
||||
|
||||
path string
|
||||
db *descriptor.Database
|
||||
}
|
||||
|
||||
func (dbc *DBC) Loaded() bool {
|
||||
dbc.RLock()
|
||||
defer dbc.RUnlock()
|
||||
|
||||
return dbc.db != nil
|
||||
}
|
||||
|
||||
func (dbc *DBC) LoadFile(mod *CANModule, path string) error {
|
||||
input, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("can't read %s: %v", path, err)
|
||||
}
|
||||
return dbc.LoadData(mod, path, input)
|
||||
}
|
||||
|
||||
func (dbc *DBC) LoadData(mod *CANModule, name string, input []byte) error {
|
||||
dbc.Lock()
|
||||
defer dbc.Unlock()
|
||||
|
||||
mod.Debug("compiling %s ...", name)
|
||||
|
||||
result, err := dbcCompile(name, input)
|
||||
if err != nil {
|
||||
return fmt.Errorf("can't compile %s: %v", name, err)
|
||||
}
|
||||
|
||||
for _, warning := range result.Warnings {
|
||||
mod.Warning("%v", warning)
|
||||
}
|
||||
|
||||
dbc.path = name
|
||||
dbc.db = result.Database
|
||||
|
||||
mod.Info("%s loaded", name)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dbc *DBC) Parse(mod *CANModule, frame can.Frame, msg *Message) bool {
|
||||
dbc.RLock()
|
||||
defer dbc.RUnlock()
|
||||
|
||||
// did we load any DBC database?
|
||||
if dbc.db == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// if the database contains this message id
|
||||
if message, found := dbc.db.Message(frame.ID); found {
|
||||
msg.Name = message.Name
|
||||
|
||||
// find source full info in DBC nodes
|
||||
sourceName := message.SenderNode
|
||||
sourceDesc := ""
|
||||
if sender, found := dbc.db.Node(message.SenderNode); found {
|
||||
sourceName = sender.Name
|
||||
sourceDesc = sender.Description
|
||||
}
|
||||
|
||||
// add CAN source if new
|
||||
_, msg.Source = mod.Session.CAN.AddIfNew(sourceName, sourceDesc, frame.Data[:])
|
||||
|
||||
msg.Signals = make(map[string]string)
|
||||
|
||||
// parse signals
|
||||
for _, signal := range message.Signals {
|
||||
var value string
|
||||
|
||||
if signal.Length <= 32 && signal.IsFloat {
|
||||
value = fmt.Sprintf("%f", signal.UnmarshalFloat(frame.Data))
|
||||
} else if signal.Length == 1 {
|
||||
value = fmt.Sprintf("%v", signal.UnmarshalBool(frame.Data))
|
||||
} else if signal.IsSigned {
|
||||
value = fmt.Sprintf("%d", signal.UnmarshalSigned(frame.Data))
|
||||
} else {
|
||||
value = fmt.Sprintf("%d", signal.UnmarshalUnsigned(frame.Data))
|
||||
}
|
||||
|
||||
msg.Signals[signal.Name] = str.Trim(fmt.Sprintf("%s %s", value, signal.Unit))
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (dbc *DBC) MessagesBySender(senderId string) []*descriptor.Message {
|
||||
dbc.RLock()
|
||||
defer dbc.RUnlock()
|
||||
|
||||
fromSender := make([]*descriptor.Message, 0)
|
||||
|
||||
if dbc.db == nil {
|
||||
return fromSender
|
||||
}
|
||||
|
||||
for _, msg := range dbc.db.Messages {
|
||||
if msg.SenderNode == senderId {
|
||||
fromSender = append(fromSender, msg)
|
||||
}
|
||||
}
|
||||
|
||||
return fromSender
|
||||
}
|
||||
|
||||
func (dbc *DBC) MessageById(frameID uint32) *descriptor.Message {
|
||||
dbc.RLock()
|
||||
defer dbc.RUnlock()
|
||||
|
||||
if dbc.db == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if message, found := dbc.db.Message(frameID); found {
|
||||
return message
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dbc *DBC) Messages() []*descriptor.Message {
|
||||
dbc.RLock()
|
||||
defer dbc.RUnlock()
|
||||
|
||||
if dbc.db == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return dbc.db.Messages
|
||||
}
|
||||
|
||||
func (dbc *DBC) Senders() []string {
|
||||
dbc.RLock()
|
||||
defer dbc.RUnlock()
|
||||
|
||||
senders := make([]string, 0)
|
||||
if dbc.db == nil {
|
||||
return senders
|
||||
}
|
||||
|
||||
uniq := make(map[string]bool)
|
||||
for _, msg := range dbc.db.Messages {
|
||||
uniq[msg.SenderNode] = true
|
||||
}
|
||||
|
||||
for sender, _ := range uniq {
|
||||
senders = append(senders, sender)
|
||||
}
|
||||
|
||||
return senders
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue