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 }