Files
cloud-services/pkg/common/dbc_desc.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
}