[refactor] Read protobuf messages
This commit is contained in:
		
							
								
								
									
										32
									
								
								part/part.go
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								part/part.go
									
									
									
									
									
								
							@@ -2,12 +2,12 @@ package part
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/cyrilix/robocar-base/mqttdevice"
 | 
			
		||||
	"github.com/cyrilix/robocar-base/service"
 | 
			
		||||
	"github.com/cyrilix/robocar-base/types"
 | 
			
		||||
	"github.com/cyrilix/robocar-led/led"
 | 
			
		||||
	"github.com/cyrilix/robocar-protobuf/go/events"
 | 
			
		||||
	mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
			
		||||
	"log"
 | 
			
		||||
	"github.com/golang/protobuf/proto"
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
@@ -19,7 +19,7 @@ func NewPart(client mqtt.Client, driveModeTopic, recordTopic string) *LedPart {
 | 
			
		||||
		onDriveModeTopic: driveModeTopic,
 | 
			
		||||
		onRecordTopic:    recordTopic,
 | 
			
		||||
		muDriveMode:      sync.Mutex{},
 | 
			
		||||
		m:                types.DriveModeInvalid,
 | 
			
		||||
		m:                events.DriveMode_INVALID,
 | 
			
		||||
		muRecord:         sync.Mutex{},
 | 
			
		||||
		recordEnabled:    false,
 | 
			
		||||
	}
 | 
			
		||||
@@ -33,7 +33,7 @@ type LedPart struct {
 | 
			
		||||
	onRecordTopic    string
 | 
			
		||||
 | 
			
		||||
	muDriveMode   sync.Mutex
 | 
			
		||||
	m             types.DriveMode
 | 
			
		||||
	m             events.DriveMode
 | 
			
		||||
	muRecord      sync.Mutex
 | 
			
		||||
	recordEnabled bool
 | 
			
		||||
}
 | 
			
		||||
@@ -56,13 +56,18 @@ func (p *LedPart) Stop() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *LedPart) onDriveMode(_ mqtt.Client, message mqtt.Message) {
 | 
			
		||||
	m := types.ParseString(string(message.Payload()))
 | 
			
		||||
	switch m {
 | 
			
		||||
	case types.DriveModeUser:
 | 
			
		||||
	var driveModeMessage events.DriveModeMessage
 | 
			
		||||
	err := proto.Unmarshal(message.Payload(), &driveModeMessage)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Errorf("unable to unmarchal %T message: %v", driveModeMessage, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	switch driveModeMessage.GetDriveMode() {
 | 
			
		||||
	case events.DriveMode_USER:
 | 
			
		||||
		p.led.SetRed(0)
 | 
			
		||||
		p.led.SetGreen(255)
 | 
			
		||||
		p.led.SetBlue(0)
 | 
			
		||||
	case types.DriveModePilot:
 | 
			
		||||
	case events.DriveMode_PILOT:
 | 
			
		||||
		p.led.SetRed(0)
 | 
			
		||||
		p.led.SetGreen(0)
 | 
			
		||||
		p.led.SetBlue(255)
 | 
			
		||||
@@ -70,13 +75,13 @@ func (p *LedPart) onDriveMode(_ mqtt.Client, message mqtt.Message) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *LedPart) onRecord(client mqtt.Client, message mqtt.Message) {
 | 
			
		||||
	mqttValue := mqttdevice.NewMqttValue(message.Payload())
 | 
			
		||||
	rec, err := mqttValue.BoolValue()
 | 
			
		||||
	var switchRecord events.SwitchRecordMessage
 | 
			
		||||
	err := proto.Unmarshal(message.Payload(), &switchRecord)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("unable to convert message payload '%v' to bool: %v", message.Payload(), err)
 | 
			
		||||
		log.Errorf("unable to unmarchal %T message: %v", switchRecord, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if rec {
 | 
			
		||||
	if switchRecord.GetEnabled() {
 | 
			
		||||
		p.led.SetBlink(2)
 | 
			
		||||
	} else {
 | 
			
		||||
		p.led.SetBlink(0)
 | 
			
		||||
@@ -95,4 +100,3 @@ func (p *LedPart) registerCallbacks() error {
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package part
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cyrilix/robocar-base/mqttdevice"
 | 
			
		||||
	"github.com/cyrilix/robocar-base/testtools"
 | 
			
		||||
	"github.com/cyrilix/robocar-protobuf/go/events"
 | 
			
		||||
	mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -41,9 +42,9 @@ func TestLedPart_OnDriveMode(t *testing.T) {
 | 
			
		||||
		msg              mqtt.Message
 | 
			
		||||
		red, green, blue int
 | 
			
		||||
	}{
 | 
			
		||||
		{testtools.NewFakeMessage("drive", mqttdevice.NewMqttValue("user")), 0, 255, 0},
 | 
			
		||||
		{testtools.NewFakeMessage("drive", mqttdevice.NewMqttValue("pilot")), 0, 0, 255},
 | 
			
		||||
		{testtools.NewFakeMessage("drive", mqttdevice.NewMqttValue("invalid")), 0, 0, 255},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("drive", &events.DriveModeMessage{DriveMode: events.DriveMode_USER}), 0, 255, 0},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("drive", &events.DriveModeMessage{DriveMode: events.DriveMode_PILOT}), 0, 0, 255},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("drive", &events.DriveModeMessage{DriveMode: events.DriveMode_INVALID}), 0, 0, 255},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cases {
 | 
			
		||||
@@ -84,10 +85,10 @@ func TestLedPart_OnRecord(t *testing.T) {
 | 
			
		||||
		record bool
 | 
			
		||||
		blink  bool
 | 
			
		||||
	}{
 | 
			
		||||
		{testtools.NewFakeMessage("record", mqttdevice.NewMqttValue(false)), true, false},
 | 
			
		||||
		{testtools.NewFakeMessage("record", mqttdevice.NewMqttValue(true)), false, true},
 | 
			
		||||
		{testtools.NewFakeMessage("record", mqttdevice.NewMqttValue(false)), true, false},
 | 
			
		||||
		{testtools.NewFakeMessage("record", mqttdevice.NewMqttValue(true)), false, true},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("record", &events.SwitchRecordMessage{Enabled: false}), true, false},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("record", &events.SwitchRecordMessage{Enabled: true}), false, true},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("record", &events.SwitchRecordMessage{Enabled: false}), true, false},
 | 
			
		||||
		{testtools.NewFakeMessageFromProtobuf("record", &events.SwitchRecordMessage{Enabled: true}), false, true},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cases {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user