From 8085261f5e086f1bbb091a4ca9ec4042e62c47a5 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 29 Dec 2016 21:52:52 +0100 Subject: Works for me --- cmd/experimental/main.go | 41 +++++++++++++++++++++++++++++++---------- protocol.go | 5 +++++ protocol.txt | 4 ++-- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/cmd/experimental/main.go b/cmd/experimental/main.go index 4e93d23..506cd2e 100644 --- a/cmd/experimental/main.go +++ b/cmd/experimental/main.go @@ -2,6 +2,7 @@ package main import ( "log" + "time" "dim13.org/anki" "github.com/currantlabs/gatt" @@ -65,14 +66,18 @@ func onConnect(p gatt.Peripheral, err error) { } } if (c.Properties() & gatt.CharWrite) != 0 { - //c.HandleReadFunc(onRead) - //log.Println("Send") - //c.SetValue([]byte{0x01, 0x18}) - //p.WriteCharacteristic(c, []byte{0x01, 0x90}, false) // sdk - p.WriteCharacteristic(c, []byte{0x01, 0x16}, false) // ping - p.WriteCharacteristic(c, []byte{0x01, 0x18}, false) // version - p.WriteCharacteristic(c, []byte{0x01, 0x1a}, false) // battery - p.WriteCharacteristic(c, []byte{0x02, 0x1d, 0xff}, true) // lights + //p.WriteCharacteristic(c, []byte{0x01, 0x90}, true) // sdk + go func(c *gatt.Characteristic) { + t := time.NewTicker(time.Second * 10) + defer t.Stop() + for range t.C { + log.Println("Ping") + p.WriteCharacteristic(c, []byte{0x01, 0x16}, true) // ping + time.Sleep(10 * time.Second) + } + }(c) + //p.WriteCharacteristic(c, []byte{0x01, 0x18}, true) // version + //p.WriteCharacteristic(c, []byte{0x01, 0x1a}, true) // battery lc := &anki.VehicleLightConfig{} lm := &anki.VehicleMsgLightsPattern{} @@ -85,8 +90,9 @@ func onConnect(p gatt.Peripheral, err error) { lb := anki.Encode(lm) p.WriteCharacteristic(c, lb, true) + time.Sleep(time.Second) ss := &anki.VehicleMsgSetSpeed{} - ss.Set(25000, 25000) + ss.Set(500, 2500) b := anki.Encode(ss) p.WriteCharacteristic(c, b, true) } @@ -99,7 +105,22 @@ func onNotify(c *gatt.Characteristic, b []byte, err error) { log.Println(c.UUID(), err) } id, payload := anki.SplitMsg(b) - log.Printf("ID: %v | % X\n", id, payload) + switch id { + case anki.VehicleMsgV2CStatusUpdate: + su := anki.VehicleMsgStatusUpdate{} + anki.Decode(b, &su) + log.Printf("%+v\n", su) + case anki.VehicleMsgV2CLocalizationTransitionUpdate: + tu := anki.VehicleMsgLocalizationTransitionUpdate{} + anki.Decode(b, &tu) + log.Printf("%+v\n", tu) + case anki.VehicleMsgV2CLocalizationPositionUpdate: + pu := anki.VehicleLocalizationPositionUpdate{} + anki.Decode(b, &pu) + log.Printf("%+v\n", pu) + default: + log.Printf("ID: %v | % X\n", id, payload) + } } func onDisconnect(p gatt.Peripheral, err error) { diff --git a/protocol.go b/protocol.go index 5c39db4..e23143c 100644 --- a/protocol.go +++ b/protocol.go @@ -79,6 +79,11 @@ func Encode(v interface{}) []byte { return z } +func Decode(b []byte, v interface{}) { + buf := bytes.NewBuffer(b) + binary.Read(buf, binary.LittleEndian, v) +} + type VehicleMsgVersionResponse struct { Size uint8 MsgID ID diff --git a/protocol.txt b/protocol.txt index 1f87d64..f6b94bb 100644 --- a/protocol.txt +++ b/protocol.txt @@ -44,7 +44,7 @@ 0x40 64 CarMsgSetTestMode 0x41 65 CarMsgLaneChangeUpdate 0x42 66 CarMsgMergeReactionUpdate -0x43 67 CarMsgDelocAutoRecoveryEntered +0x43 67 CarMsgDelocAutoRecoveryEntered seen on track 0x44 68 CarMsgDelocAutoRecoverySuccess 0x45 69 CarMsgVehicleSpecificParameters ok 0x46 70 CarMsgSetRoadPieceInfoC @@ -74,4 +74,4 @@ 0xc9 201 Debug? 0xcf 207 CarMsgMessageCycleCount -0xd0 208 CarMsgSteeringDiagnosticMetrics +0xd0 208 CarMsgSteeringDiagnosticMetrics seen on track -- cgit v1.2.3