From c2c05bc1584f271f3234b4e3754c5c40cc6cbc4d Mon Sep 17 00:00:00 2001 From: Bharat Kathi Date: Mon, 24 Feb 2025 18:48:29 -0800 Subject: [PATCH 1/3] parse new mqtt topic format --- gr25/service/message.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/gr25/service/message.go b/gr25/service/message.go index a2e02e7f..a5659f60 100644 --- a/gr25/service/message.go +++ b/gr25/service/message.go @@ -2,6 +2,7 @@ package service import ( "encoding/binary" + "fmt" "gr25/model" "gr25/mqtt" "gr25/utils" @@ -15,12 +16,13 @@ import ( func SubscribeTopics() { mqtt.Client.Subscribe("gr25/#", 0, func(client mq.Client, msg mq.Message) { topic := msg.Topic() - if len(strings.Split(topic, "/")) != 3 { + if len(strings.Split(topic, "/")) != 4 { utils.SugarLogger.Infof("[MQ] Received invalid topic: %s, ignoring", topic) return } vehicleID := strings.Split(topic, "/")[1] - canID := strings.Split(topic, "/")[2] + nodeID := strings.Split(topic, "/")[2] + canID := strings.Split(topic, "/")[3] message := msg.Payload() canIDInt, err := strconv.ParseInt(canID, 16, 64) if err != nil { @@ -28,14 +30,14 @@ func SubscribeTopics() { return } utils.SugarLogger.Infof("[MQ] Received message: %s", topic) - go HandleMessage(vehicleID, int(canIDInt), message) + go HandleMessage(vehicleID, nodeID, int(canIDInt), message) }) } -func HandleMessage(vehicleID string, canID int, message []byte) { +func HandleMessage(vehicleID string, nodeID string, canID int, message []byte) { // First 8 bytes are timestamp - if len(message) < 10 { // Need at least timestamp (8) + upload key (2) - utils.SugarLogger.Infof("[MQ] Message too short, ignoring") + if len(message) < 11 { // Need at least timestamp (8) + upload key (2) + at least 1 byte of data + utils.SugarLogger.Infof("[MQ] Message too short, ignoring %d bytes", len(message)) return } timestamp := message[:8] @@ -62,9 +64,10 @@ func HandleMessage(vehicleID string, canID int, message []byte) { signals := messageStruct.ExportSignals() for _, signal := range signals { + signal.Name = fmt.Sprintf("%s_%s", nodeID, signal.Name) signal.Timestamp = int(binary.BigEndian.Uint64(timestamp)) signal.VehicleID = vehicleID - signal.ProducedAt = time.UnixMicro(int64(signal.Timestamp)) + signal.ProducedAt = time.UnixMilli(int64(signal.Timestamp)) signal.CreatedAt = utils.WithPrecision(time.Now()) err := CreateSignal(signal) From e0e79c86589dac71b9af9dfa19eb8cb5b880a9a9 Mon Sep 17 00:00:00 2001 From: Bharat Kathi Date: Mon, 24 Feb 2025 18:48:55 -0800 Subject: [PATCH 2/3] Trigger Build From 7e8e1f4ffa7887fea7f31867736e5e69ae942ed1 Mon Sep 17 00:00:00 2001 From: Bharat Kathi Date: Mon, 24 Feb 2025 18:54:39 -0800 Subject: [PATCH 3/3] gr25: updated ecu can message definitions --- gr25/model/ecu.go | 74 +++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/gr25/model/ecu.go b/gr25/model/ecu.go index 8e06518e..9b035262 100644 --- a/gr25/model/ecu.go +++ b/gr25/model/ecu.go @@ -3,25 +3,25 @@ package model import mp "github.com/gaucho-racing/mapache-go" var ECUStatusOne = mp.Message{ - mp.NewField("ecu_state", 1, mp.Unsigned, mp.LittleEndian, nil), - mp.NewField("ecu_status_flags", 3, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("state", 1, mp.Unsigned, mp.LittleEndian, nil), + mp.NewField("status_flags", 3, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} bitMap := []string{ - "ecu_status_acu", - "ecu_status_inv_one", - "ecu_status_inv_two", - "ecu_status_inv_three", - "ecu_status_inv_four", - "ecu_status_fan_one", - "ecu_status_fan_two", - "ecu_status_fan_three", - "ecu_status_fan_four", - "ecu_status_fan_five", - "ecu_status_fan_six", - "ecu_status_fan_seven", - "ecu_status_fan_eight", - "ecu_status_dash", - "ecu_status_steering", + "acu_status", + "inv_one_status", + "inv_two_status", + "inv_three_status", + "inv_four_status", + "fan_one_status", + "fan_two_status", + "fan_three_status", + "fan_four_status", + "fan_five_status", + "fan_six_status", + "fan_seven_status", + "fan_eight_status", + "dash_status", + "steering_status", } for i := 0; i < len(bitMap); i++ { signals = append(signals, mp.Signal{ @@ -35,39 +35,39 @@ var ECUStatusOne = mp.Message{ mp.NewField("ecu_maps", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_power_level", + Name: "power_level", Value: float64((f.Value >> 4) & 0x0F), RawValue: (f.Value >> 4) & 0x0F, }) signals = append(signals, mp.Signal{ - Name: "ecu_torque_map", + Name: "torque_map", Value: float64(f.Value & 0x0F), RawValue: f.Value & 0x0F, }) return signals }), - mp.NewField("ecu_max_cell_temp", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("max_cell_temp", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_max_cell_temp", + Name: "max_cell_temp", Value: float64(f.Value) * 0.25, RawValue: f.Value, }) return signals }), - mp.NewField("ecu_acu_state_of_charge", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("acu_state_of_charge", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_acu_state_of_charge", + Name: "acu_state_of_charge", Value: float64(f.Value) * 20 / 51, RawValue: f.Value, }) return signals }), - mp.NewField("ecu_glv_state_of_charge", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("glv_state_of_charge", 1, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_glv_state_of_charge", + Name: "glv_state_of_charge", Value: float64(f.Value) * 20 / 51, RawValue: f.Value, }) @@ -76,37 +76,37 @@ var ECUStatusOne = mp.Message{ } var ECUStatusTwo = mp.Message{ - mp.NewField("ecu_tractive_system_voltage", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("tractive_system_voltage", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_tractive_system_voltage", + Name: "tractive_system_voltage", Value: float64(f.Value) * 0.01, RawValue: f.Value, }) return signals }), - mp.NewField("ecu_vehicle_speed", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("vehicle_speed", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_vehicle_speed", + Name: "vehicle_speed", Value: float64(f.Value) * 0.01, RawValue: f.Value, }) return signals }), - mp.NewField("ecu_fr_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("fr_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_fr_wheel_rpm", + Name: "fr_wheel_rpm", Value: float64(f.Value)*0.1 - 3276.8, RawValue: f.Value, }) return signals }), - mp.NewField("ecu_fl_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("fl_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_fl_wheel_rpm", + Name: "fl_wheel_rpm", Value: float64(f.Value)*0.1 - 3276.8, RawValue: f.Value, }) @@ -115,19 +115,19 @@ var ECUStatusTwo = mp.Message{ } var ECUStatusThree = mp.Message{ - mp.NewField("ecu_rr_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("rr_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_rr_wheel_rpm", + Name: "rr_wheel_rpm", Value: float64(f.Value)*0.1 - 3276.8, RawValue: f.Value, }) return signals }), - mp.NewField("ecu_rl_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { + mp.NewField("rl_wheel_rpm", 2, mp.Unsigned, mp.LittleEndian, func(f mp.Field) []mp.Signal { signals := []mp.Signal{} signals = append(signals, mp.Signal{ - Name: "ecu_rl_wheel_rpm", + Name: "rl_wheel_rpm", Value: float64(f.Value)*0.1 - 3276.8, RawValue: f.Value, })