141 lines
4.0 KiB
Go
141 lines
4.0 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
can "github.com/Fisker-Inc/project-ai-can-go/pkg/descriptor"
|
|
)
|
|
|
|
// SignalDesc is copied from project-ai-can-go and modified for local needs.
|
|
type SignalDesc struct {
|
|
DBCHash string `json:"dbc_hash" ch:"dbc_hash"`
|
|
MessageID uint16 `json:"message_id" ch:"message_id"`
|
|
// Description of the signal.
|
|
Name string `json:"name" ch:"signal_name"`
|
|
// Start bit.
|
|
Start uint16 `json:"start" ch:"start"`
|
|
// Length in bits.
|
|
Length uint16 `json:"length" ch:"length"`
|
|
// IsBigEndian is true if the signal is big-endian.
|
|
IsBigEndian bool `json:"big_endian" ch:"big_endian"`
|
|
// IsSigned is true if the signal uses raw signed values.
|
|
IsSigned bool `json:"signed" ch:"signed"`
|
|
// IsMultiplexer is true if the signal is the multiplexor of a multiplexed message.
|
|
IsMultiplexer bool `json:"multiplexer" ch:"multiplexer"`
|
|
// IsMultiplexed is true if the signal is multiplexed.
|
|
IsMultiplexed bool `json:"multiplexed" ch:"multiplexed"`
|
|
// MultiplexerValue is the value of the multiplexer when this signal is present.
|
|
MultiplexerValue uint8 `json:"multiplexer_value" ch:"multiplexer_value"`
|
|
// Offset for real-world transform.
|
|
Offset float64 `json:"offset" ch:"offset"`
|
|
// Scale for real-world transform.
|
|
Scale float64 `json:"scale" ch:"scale"`
|
|
// Min real-world value.
|
|
Min float64 `json:"min" ch:"min"`
|
|
// Max real-world value.
|
|
Max float64 `json:"max" ch:"max"`
|
|
// Unit of the signal.
|
|
Unit string `json:"unit" ch:"unit"`
|
|
// Description of the signal.
|
|
Description string `json:"description" ch:"description"`
|
|
// ValueDescriptions of the signal.
|
|
ValueDescriptions []string `json:"value_descriptions" ch:"value_descriptions"`
|
|
// ReceiverNodes is the list of names of the nodes receiving the signal.
|
|
ReceiverNodes []string `json:"receiver_nodes" ch:"receiver_nodes"`
|
|
// DefaultValue of the signal.
|
|
DefaultValue int64 `json:"default_value" ch:"default_value"`
|
|
// ECUName is a name of an ECU.
|
|
ECUName string
|
|
}
|
|
|
|
func (s *SignalDesc) CopyFromCAN(in *can.Signal) {
|
|
s.Name = in.Name
|
|
s.Start = in.Start
|
|
s.Length = in.Length
|
|
s.IsBigEndian = in.IsBigEndian
|
|
s.IsSigned = in.IsSigned
|
|
s.IsMultiplexer = in.IsMultiplexer
|
|
s.IsMultiplexed = in.IsMultiplexed
|
|
s.MultiplexerValue = uint8(in.MultiplexerValue)
|
|
s.Offset = in.Offset
|
|
s.Scale = in.Scale
|
|
s.Min = in.Min
|
|
s.Max = in.Max
|
|
s.Unit = in.Unit
|
|
s.Description = in.Description
|
|
s.ValueDescriptions = getDescriptions(in.ValueDescriptions)
|
|
s.ReceiverNodes = in.ReceiverNodes
|
|
s.DefaultValue = int64(in.DefaultValue)
|
|
}
|
|
|
|
func getDescriptions(ds []*can.ValueDescription) []string {
|
|
res := make([]string, len(ds))
|
|
for k, d := range ds {
|
|
if d == nil {
|
|
continue
|
|
}
|
|
|
|
res[k] = fmt.Sprintf("%d: %s", d.Value, d.Description)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
type SignalDescWithECU struct {
|
|
SignalDesc
|
|
ECUName string `json:"ecu_name" ch:"ecu_name"`
|
|
}
|
|
|
|
type MessageDesc struct {
|
|
DBCHash string
|
|
// Name of the message.
|
|
Name string
|
|
// ECUName is a name of an ECU.
|
|
ECUName string
|
|
// ID of the message.
|
|
ID uint32
|
|
// IsExtended is true if the message is an extended CAN message.
|
|
IsExtended bool
|
|
// SendType is the message's send type.
|
|
SendType string
|
|
// Length in bytes.
|
|
Length uint16
|
|
// Description of the message.
|
|
Description string
|
|
// SenderNode is the name of the node sending the message.
|
|
SenderNode string
|
|
// CycleTime is the cycle time (ns) of a cyclic message.
|
|
CycleTime int64
|
|
// DelayTime is the allowed delay (ns) between cyclic message sends.
|
|
DelayTime int64
|
|
}
|
|
|
|
func (m *MessageDesc) CopyFromCAN(in *can.Message) {
|
|
m.Name = in.Name
|
|
m.ID = in.ID
|
|
m.IsExtended = in.IsExtended
|
|
m.SendType = in.SendType.String()
|
|
m.Length = in.Length
|
|
m.Description = in.Description
|
|
m.SenderNode = in.SenderNode
|
|
m.CycleTime = int64(in.CycleTime)
|
|
m.DelayTime = int64(in.DelayTime)
|
|
m.ECUName = extractECUName(in.Name)
|
|
}
|
|
|
|
func extractECUName(msgName string) string {
|
|
names := strings.Split(msgName, "_")
|
|
ecuName := names[0]
|
|
if names[0] == "Diag" && len(names) > 1 {
|
|
ecuName = names[1]
|
|
}
|
|
|
|
return ecuName
|
|
}
|
|
|
|
type DBCDesc struct {
|
|
Hash string
|
|
Name string
|
|
}
|