forked from Elara6331/infinitime
Compare commits
No commits in common. "c3a87278a65707960f370a6e0c7fafa3f018ab04" and "49544b9b47bbd6151f99cefb7c4770909ca5ad2d" have entirely different histories.
c3a87278a6
...
49544b9b47
132
infinitime.go
132
infinitime.go
@ -38,6 +38,10 @@ const (
|
|||||||
FSTransferChar = "adaf0200-4669-6c65-5472-616e73666572"
|
FSTransferChar = "adaf0200-4669-6c65-5472-616e73666572"
|
||||||
FSVersionChar = "adaf0100-4669-6c65-5472-616e73666572"
|
FSVersionChar = "adaf0100-4669-6c65-5472-616e73666572"
|
||||||
WeatherDataChar = "00040001-78fc-48fe-8e23-433b3a1942d0"
|
WeatherDataChar = "00040001-78fc-48fe-8e23-433b3a1942d0"
|
||||||
|
NavFlagsChar = "00010001-78fc-48fe-8e23-433b3a1942d0"
|
||||||
|
NavNarrativeChar= "00010002-78fc-48fe-8e23-433b3a1942d0"
|
||||||
|
NavManDistChar = "00010003-78fc-48fe-8e23-433b3a1942d0"
|
||||||
|
NavProgressChar = "00010004-78fc-48fe-8e23-433b3a1942d0"
|
||||||
)
|
)
|
||||||
|
|
||||||
var charNames = map[string]string{
|
var charNames = map[string]string{
|
||||||
@ -58,8 +62,54 @@ var charNames = map[string]string{
|
|||||||
NavProgressChar: "Navigation Progress",
|
NavProgressChar: "Navigation Progress",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var NavFlagNames = []string{
|
||||||
|
"arrive", "arrive-left", "arrive-right", "arrive-straight",
|
||||||
|
"close",
|
||||||
|
"continue", "continue-left", "continue-right", "continue-slight-left",
|
||||||
|
"continue-slight-right", "continue-straight", "continue-uturn",
|
||||||
|
"depart", "depart-left", "depart-right", "depart-straight",
|
||||||
|
"end-of-road-left", "end-of-road-right",
|
||||||
|
"ferry", "flag",
|
||||||
|
"fork", "fork-left", "fork-right", "fork-straight",
|
||||||
|
"fork-slight-left", "fork-slight-right",
|
||||||
|
"invalid", "invalid-left", "invalid-right",
|
||||||
|
"invalid-slight-left", "invalid-slight-right",
|
||||||
|
"invalid-straight", "invalid-uturn",
|
||||||
|
"merge-left", "merge-right", "merge-slight-left",
|
||||||
|
"merge-slight-right", "merge-straight",
|
||||||
|
"new-name-left", "new-name-right", "new-name-sharp-left", "new-name-sharp-right",
|
||||||
|
"new-name-slight-left", "new-name-slight-right", "new-name-straight",
|
||||||
|
"notification-left", "notification-right",
|
||||||
|
"notification-sharp-left", "notification-sharp-right",
|
||||||
|
"notification-slight-left", "notification-slight-right",
|
||||||
|
"notification-straight",
|
||||||
|
"off-ramp-left", "off-ramp-right", "off-ramp-sharp-left", "off-ramp-sharp-right",
|
||||||
|
"off-ramp-slight-left", "off-ramp-slight-right", "off-ramp-straight",
|
||||||
|
"on-ramp-left", "on-ramp-right", "on-ramp-sharp-left", "on-ramp-sharp-right",
|
||||||
|
"on-ramp-slight-left", "on-ramp-slight-right", "on-ramp-straight",
|
||||||
|
"rotary", "rotary-left", "rotary-right", "rotary-sharp-left", "rotary-sharp-right",
|
||||||
|
"rotary-slight-left", "rotary-slight-right", "rotary-straight",
|
||||||
|
"roundabout", "roundabout-left", "roundabout-right",
|
||||||
|
"roundabout-sharp-left", "roundabout-sharp-right",
|
||||||
|
"roundabout-slight-left", "roundabout-slight-right", "roundabout-straight",
|
||||||
|
"turn-left", "turn-right", "turn-sharp-left", "turn-sharp-right",
|
||||||
|
"turn-slight-left", "turn-slight-right", "turn-stright",
|
||||||
|
"updown", "uturn",
|
||||||
|
}
|
||||||
|
|
||||||
|
type NavigationEvent struct {
|
||||||
|
flag string
|
||||||
|
narrative string
|
||||||
|
dist string
|
||||||
|
progress uint8
|
||||||
|
}
|
||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
device *device.Device1
|
device *device.Device1
|
||||||
|
navflagsChar *gatt.GattCharacteristic1
|
||||||
|
navnarrativeChar*gatt.GattCharacteristic1
|
||||||
|
navmandistChar *gatt.GattCharacteristic1
|
||||||
|
navprogressChar *gatt.GattCharacteristic1
|
||||||
newAlertChar *gatt.GattCharacteristic1
|
newAlertChar *gatt.GattCharacteristic1
|
||||||
notifEventChar *gatt.GattCharacteristic1
|
notifEventChar *gatt.GattCharacteristic1
|
||||||
stepCountChar *gatt.GattCharacteristic1
|
stepCountChar *gatt.GattCharacteristic1
|
||||||
@ -71,11 +121,9 @@ type Device struct {
|
|||||||
fsVersionChar *gatt.GattCharacteristic1
|
fsVersionChar *gatt.GattCharacteristic1
|
||||||
fsTransferChar *gatt.GattCharacteristic1
|
fsTransferChar *gatt.GattCharacteristic1
|
||||||
weatherDataChar *gatt.GattCharacteristic1
|
weatherDataChar *gatt.GattCharacteristic1
|
||||||
weatherdataChar *gatt.GattCharacteristic1
|
|
||||||
notifEventCh chan uint8
|
notifEventCh chan uint8
|
||||||
notifEventDone bool
|
notifEventDone bool
|
||||||
Music MusicCtrl
|
Music MusicCtrl
|
||||||
Navigation NavigationCtrl
|
|
||||||
DFU DFU
|
DFU DFU
|
||||||
navigationEv NavigationEvent
|
navigationEv NavigationEvent
|
||||||
}
|
}
|
||||||
@ -86,6 +134,8 @@ var (
|
|||||||
ErrNotConnected = errors.New("not connected")
|
ErrNotConnected = errors.New("not connected")
|
||||||
ErrNoTimelineHeader = errors.New("events must contain the timeline header")
|
ErrNoTimelineHeader = errors.New("events must contain the timeline header")
|
||||||
ErrPairTimeout = errors.New("reached timeout while pairing")
|
ErrPairTimeout = errors.New("reached timeout while pairing")
|
||||||
|
ErrNavProgress = errors.New("progress needs to between 0 and 100")
|
||||||
|
ErrNavInvalidFlag = errors.New("this flag is invalid")
|
||||||
)
|
)
|
||||||
|
|
||||||
type ErrCharNotAvail struct {
|
type ErrCharNotAvail struct {
|
||||||
@ -402,13 +452,13 @@ func (i *Device) resolveChars() error {
|
|||||||
// Set correct characteristics
|
// Set correct characteristics
|
||||||
switch char.Properties.UUID {
|
switch char.Properties.UUID {
|
||||||
case NavFlagsChar:
|
case NavFlagsChar:
|
||||||
i.Navigation.flagsChar = char
|
i.navflagsChar = char
|
||||||
case NavNarrativeChar:
|
case NavNarrativeChar:
|
||||||
i.Navigation.narrativeChar = char
|
i.navnarrativeChar = char
|
||||||
case NavManDistChar:
|
case NavManDistChar:
|
||||||
i.Navigation.mandistChar = char
|
i.navmandistChar = char
|
||||||
case NavProgressChar:
|
case NavProgressChar:
|
||||||
i.Navigation.progressChar = char
|
i.navprogressChar = char
|
||||||
case NewAlertChar:
|
case NewAlertChar:
|
||||||
i.newAlertChar = char
|
i.newAlertChar = char
|
||||||
case NotifEventChar:
|
case NotifEventChar:
|
||||||
@ -738,6 +788,76 @@ func (i *Device) Notify(title, body string) error {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CheckValidNavFlag(flag string) error {
|
||||||
|
for _, v := range NavFlagNames {
|
||||||
|
if v == flag {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ErrNavInvalidFlag
|
||||||
|
}
|
||||||
|
|
||||||
|
// Navigation sends a NavigationEvent to the watch
|
||||||
|
func (i *Device) Navigation(flag string, narrative string, dist string, progress uint8) error {
|
||||||
|
if progress > 100 {
|
||||||
|
return ErrNavProgress
|
||||||
|
}
|
||||||
|
if err := CheckValidNavFlag(flag); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if flag != i.navigationEv.flag {
|
||||||
|
log.Debug().Str("func", "Navigation").
|
||||||
|
Msg("Sending flag")
|
||||||
|
if err := i.checkStatus(i.navflagsChar, NavFlagsChar); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := i.navflagsChar.WriteValue([]byte(flag), nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
i.navigationEv.flag = flag
|
||||||
|
}
|
||||||
|
|
||||||
|
if narrative != i.navigationEv.narrative {
|
||||||
|
log.Debug().Str("func", "Navigation").
|
||||||
|
Msg("Sending narrative")
|
||||||
|
if err := i.checkStatus(i.navnarrativeChar, NavNarrativeChar); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := i.navnarrativeChar.WriteValue([]byte(narrative), nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
i.navigationEv.narrative = narrative
|
||||||
|
}
|
||||||
|
|
||||||
|
if dist != i.navigationEv.dist {
|
||||||
|
log.Debug().Str("func", "Navigation").
|
||||||
|
Msg("Sending mandist")
|
||||||
|
if err := i.checkStatus(i.navmandistChar, NavManDistChar); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := i.navmandistChar.WriteValue([]byte(dist), nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
i.navigationEv.dist = dist
|
||||||
|
}
|
||||||
|
|
||||||
|
if progress != i.navigationEv.progress {
|
||||||
|
log.Debug().Str("func", "Navigation").
|
||||||
|
Msg("Sending progress")
|
||||||
|
if err := i.checkStatus(i.navprogressChar, NavProgressChar); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
binary.Write(buf, binary.LittleEndian, progress)
|
||||||
|
if err := i.navprogressChar.WriteValue(buf.Bytes(), nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
i.navigationEv.progress = progress
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// These constants represent the possible call statuses selected by the user
|
// These constants represent the possible call statuses selected by the user
|
||||||
const (
|
const (
|
||||||
|
188
navigation.go
188
navigation.go
@ -1,188 +0,0 @@
|
|||||||
package infinitime
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
|
||||||
"github.com/muka/go-bluetooth/bluez/profile/gatt"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
NavFlagsChar = "00010001-78fc-48fe-8e23-433b3a1942d0"
|
|
||||||
NavNarrativeChar= "00010002-78fc-48fe-8e23-433b3a1942d0"
|
|
||||||
NavManDistChar = "00010003-78fc-48fe-8e23-433b3a1942d0"
|
|
||||||
NavProgressChar = "00010004-78fc-48fe-8e23-433b3a1942d0"
|
|
||||||
)
|
|
||||||
|
|
||||||
type NavigationCtrl struct {
|
|
||||||
flagsChar *gatt.GattCharacteristic1
|
|
||||||
narrativeChar*gatt.GattCharacteristic1
|
|
||||||
mandistChar *gatt.GattCharacteristic1
|
|
||||||
progressChar *gatt.GattCharacteristic1
|
|
||||||
}
|
|
||||||
|
|
||||||
type NavFlag string
|
|
||||||
const (
|
|
||||||
NavFlagArrive NavFlag = "arrive"
|
|
||||||
NavFlagArriveLeft NavFlag = "arrive-left"
|
|
||||||
NavFlagArriveRight NavFlag = "arrive-right"
|
|
||||||
NavFlagArriveStraight NavFlag = "arrive-straight"
|
|
||||||
NavFlagClose NavFlag = "close"
|
|
||||||
NavFlagContinue NavFlag = "continue"
|
|
||||||
NavFlagContinueLeft NavFlag = "continue-left"
|
|
||||||
NavFlagContinueRight NavFlag = "continue-right"
|
|
||||||
NavFlagContinueSlightLeft NavFlag = "continue-slight-left"
|
|
||||||
NavFlagContinueSlightRight NavFlag = "continue-slight-right"
|
|
||||||
NavFlagContinueStraight NavFlag = "continue-straight"
|
|
||||||
NavFlagContinueUturn NavFlag = "continue-uturn"
|
|
||||||
NavFlagDepart NavFlag = "depart"
|
|
||||||
NavFlagDepartLeft NavFlag = "depart-left"
|
|
||||||
NavFlagDepartRight NavFlag = "depart-right"
|
|
||||||
NavFlagDepartStraight NavFlag = "depart-straight"
|
|
||||||
NavFlagEndOfRoadLeft NavFlag = "end-of-road-left"
|
|
||||||
NavFlagEndOfRoadRight NavFlag = "end-of-road-right"
|
|
||||||
NavFlagFerry NavFlag = "ferry"
|
|
||||||
NavFlagFlag NavFlag = "flag"
|
|
||||||
NavFlagFork NavFlag = "fork"
|
|
||||||
NavFlagForkLeft NavFlag = "fork-left"
|
|
||||||
NavFlagForkRight NavFlag = "fork-right"
|
|
||||||
NavFlagForkSlightLeft NavFlag = "fork-slight-left"
|
|
||||||
NavFlagForkSlightRight NavFlag = "fork-slight-right"
|
|
||||||
NavFlagForkStraight NavFlag = "fork-straight"
|
|
||||||
NavFlagInvalid NavFlag = "invalid"
|
|
||||||
NavFlagInvalidLeft NavFlag = "invalid-left"
|
|
||||||
NavFlagInvalidRight NavFlag = "invalid-right"
|
|
||||||
NavFlagInvalidSlightLeft NavFlag = "invalid-slight-left"
|
|
||||||
NavFlagInvalidSlightRight NavFlag = "invalid-slight-right"
|
|
||||||
NavFlagInvalidStraight NavFlag = "invalid-straight"
|
|
||||||
NavFlagInvalidUturn NavFlag = "invalid-uturn"
|
|
||||||
NavFlagMergeLeft NavFlag = "merge-left"
|
|
||||||
NavFlagMergeRight NavFlag = "merge-right"
|
|
||||||
NavFlagMergeSlightLeft NavFlag = "merge-slight-left"
|
|
||||||
NavFlagMergeSlightRight NavFlag = "merge-slight-right"
|
|
||||||
NavFlagMergeStraight NavFlag = "merge-straight"
|
|
||||||
NavFlagNewNameLeft NavFlag = "new-name-left"
|
|
||||||
NavFlagNewNameRight NavFlag = "new-name-right"
|
|
||||||
NavFlagNewNameSharpLeft NavFlag = "new-name-sharp-left"
|
|
||||||
NavFlagNewNameSharpRight NavFlag = "new-name-sharp-right"
|
|
||||||
NavFlagNewNameSlightLeft NavFlag = "new-name-slight-left"
|
|
||||||
NavFlagNewNameSlightRight NavFlag = "new-name-slight-right"
|
|
||||||
NavFlagNewNameStraight NavFlag = "new-name-straight"
|
|
||||||
NavFlagNotificationLeft NavFlag = "notification-left"
|
|
||||||
NavFlagNotificationRight NavFlag = "notification-right"
|
|
||||||
NavFlagNotificationSharpLeft NavFlag = "notification-sharp-left"
|
|
||||||
NavFlagNotificationSharpRight NavFlag = "notification-sharp-right"
|
|
||||||
NavFlagNotificationSlightLeft NavFlag = "notification-slight-left"
|
|
||||||
NavFlagNotificationSlightRight NavFlag = "notification-slight-right"
|
|
||||||
NavFlagNotificationStraight NavFlag = "notification-straight"
|
|
||||||
NavFlagOffRampLeft NavFlag = "off-ramp-left"
|
|
||||||
NavFlagOffRampRight NavFlag = "off-ramp-right"
|
|
||||||
NavFlagOffRampSharpLeft NavFlag = "off-ramp-sharp-left"
|
|
||||||
NavFlagOffRampSharpRight NavFlag = "off-ramp-sharp-right"
|
|
||||||
NavFlagOffRampSlightLeft NavFlag = "off-ramp-slight-left"
|
|
||||||
NavFlagOffRampSlightRight NavFlag = "off-ramp-slight-right"
|
|
||||||
NavFlagOffRampStraight NavFlag = "off-ramp-straight"
|
|
||||||
NavFlagOnRampLeft NavFlag = "on-ramp-left"
|
|
||||||
NavFlagOnRampRight NavFlag = "on-ramp-right"
|
|
||||||
NavFlagOnRampSharpLeft NavFlag = "on-ramp-sharp-left"
|
|
||||||
NavFlagOnRampSharpRight NavFlag = "on-ramp-sharp-right"
|
|
||||||
NavFlagOnRampSlightLeft NavFlag = "on-ramp-slight-left"
|
|
||||||
NavFlagOnRampSlightRight NavFlag = "on-ramp-slight-right"
|
|
||||||
NavFlagOnRampStraight NavFlag = "on-ramp-straight"
|
|
||||||
NavFlagRotary NavFlag = "rotary"
|
|
||||||
NavFlagRotaryLeft NavFlag = "rotary-left"
|
|
||||||
NavFlagRotaryRight NavFlag = "rotary-right"
|
|
||||||
NavFlagRotarySharpLeft NavFlag = "rotary-sharp-left"
|
|
||||||
NavFlagRotarySharpRight NavFlag = "rotary-sharp-right"
|
|
||||||
NavFlagRotarySlightLeft NavFlag = "rotary-slight-left"
|
|
||||||
NavFlagRotarySlightRight NavFlag = "rotary-slight-right"
|
|
||||||
NavFlagRotaryStraight NavFlag = "rotary-straight"
|
|
||||||
NavFlagRoundabout NavFlag = "roundabout"
|
|
||||||
NavFlagRoundaboutLeft NavFlag = "roundabout-left"
|
|
||||||
NavFlagRoundaboutRight NavFlag = "roundabout-right"
|
|
||||||
NavFlagRoundaboutSharpLeft NavFlag = "roundabout-sharp-left"
|
|
||||||
NavFlagRoundaboutSharpRight NavFlag = "roundabout-sharp-right"
|
|
||||||
NavFlagRoundaboutSlightLeft NavFlag = "roundabout-slight-left"
|
|
||||||
NavFlagRoundaboutSlightRight NavFlag = "roundabout-slight-right"
|
|
||||||
NavFlagRoundaboutStraight NavFlag = "roundabout-straight"
|
|
||||||
NavFlagTurnLeft NavFlag = "turn-left"
|
|
||||||
NavFlagTurnRight NavFlag = "turn-right"
|
|
||||||
NavFlagTurnSharpLeft NavFlag = "turn-sharp-left"
|
|
||||||
NavFlagTurnSharpRight NavFlag = "turn-sharp-right"
|
|
||||||
NavFlagTurnSlightLeft NavFlag = "turn-slight-left"
|
|
||||||
NavFlagTurnSlightRight NavFlag = "turn-slight-right"
|
|
||||||
NavFlagTurnStright NavFlag = "turn-stright"
|
|
||||||
NavFlagUpdown NavFlag = "updown"
|
|
||||||
NavFlagUturn NavFlag = "uturn"
|
|
||||||
)
|
|
||||||
|
|
||||||
type NavigationEvent struct {
|
|
||||||
Flag NavFlag
|
|
||||||
Narrative string
|
|
||||||
Dist string
|
|
||||||
Progress uint8
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrNavProgress = errors.New("progress needs to between 0 and 100")
|
|
||||||
ErrNavInvalidFlag = errors.New("this flag is invalid")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Navigation sends a NavigationEvent to the watch
|
|
||||||
func (i *Device) SetNavigation(ev NavigationEvent) error {
|
|
||||||
if ev.Progress > 100 {
|
|
||||||
return ErrNavProgress
|
|
||||||
}
|
|
||||||
|
|
||||||
if ev.Flag != i.navigationEv.Flag {
|
|
||||||
log.Debug().Str("func", "Navigation").
|
|
||||||
Msg("Sending flag")
|
|
||||||
if err := i.checkStatus(i.Navigation.flagsChar, NavFlagsChar); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := i.Navigation.flagsChar.WriteValue([]byte(ev.Flag), nil); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.navigationEv.Flag = ev.Flag
|
|
||||||
}
|
|
||||||
|
|
||||||
if ev.Narrative != i.navigationEv.Narrative {
|
|
||||||
log.Debug().Str("func", "Navigation").
|
|
||||||
Msg("Sending narrative")
|
|
||||||
if err := i.checkStatus(i.Navigation.narrativeChar, NavNarrativeChar); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := i.Navigation.narrativeChar.WriteValue([]byte(ev.Narrative), nil); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.navigationEv.Narrative = ev.Narrative
|
|
||||||
}
|
|
||||||
|
|
||||||
if ev.Dist != i.navigationEv.Dist {
|
|
||||||
log.Debug().Str("func", "Navigation").
|
|
||||||
Msg("Sending mandist")
|
|
||||||
if err := i.checkStatus(i.Navigation.mandistChar, NavManDistChar); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := i.Navigation.mandistChar.WriteValue([]byte(ev.Dist), nil); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.navigationEv.Dist = ev.Dist
|
|
||||||
}
|
|
||||||
|
|
||||||
if ev.Progress != i.navigationEv.Progress {
|
|
||||||
log.Debug().Str("func", "Navigation").
|
|
||||||
Msg("Sending progress")
|
|
||||||
if err := i.checkStatus(i.Navigation.progressChar, NavProgressChar); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
buf := &bytes.Buffer{}
|
|
||||||
binary.Write(buf, binary.LittleEndian, ev.Progress)
|
|
||||||
if err := i.Navigation.progressChar.WriteValue(buf.Bytes(), nil); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.navigationEv.Progress = ev.Progress
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user