forked from Elara6331/infinitime
141 lines
4.4 KiB
Go
141 lines
4.4 KiB
Go
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 NavigationEvent struct {
|
|
flag string
|
|
narrative string
|
|
dist string
|
|
progress uint8
|
|
}
|
|
|
|
var (
|
|
ErrNavProgress = errors.New("progress needs to between 0 and 100")
|
|
ErrNavInvalidFlag = errors.New("this flag is invalid")
|
|
)
|
|
|
|
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",
|
|
}
|
|
|
|
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) SetNavigation(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.Navigation.flagsChar, NavFlagsChar); err != nil {
|
|
return err
|
|
}
|
|
if err := i.Navigation.flagsChar.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.Navigation.narrativeChar, NavNarrativeChar); err != nil {
|
|
return err
|
|
}
|
|
if err := i.Navigation.narrativeChar.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.Navigation.mandistChar, NavManDistChar); err != nil {
|
|
return err
|
|
}
|
|
if err := i.Navigation.mandistChar.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.Navigation.progressChar, NavProgressChar); err != nil {
|
|
return err
|
|
}
|
|
buf := &bytes.Buffer{}
|
|
binary.Write(buf, binary.LittleEndian, progress)
|
|
if err := i.Navigation.progressChar.WriteValue(buf.Bytes(), nil); err != nil {
|
|
return err
|
|
}
|
|
i.navigationEv.progress = progress
|
|
}
|
|
|
|
return nil
|
|
}
|