forked from Elara6331/infinitime
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			49544b9b47
			...
			navigation
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | c3a87278a6 | ||
|  | d46f5453f6 | ||
|  | e00a4fce70 | 
							
								
								
									
										132
									
								
								infinitime.go
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								infinitime.go
									
									
									
									
									
								
							| @@ -38,10 +38,6 @@ const ( | ||||
| 	FSTransferChar  = "adaf0200-4669-6c65-5472-616e73666572" | ||||
| 	FSVersionChar   = "adaf0100-4669-6c65-5472-616e73666572" | ||||
| 	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{ | ||||
| @@ -62,54 +58,8 @@ var charNames = map[string]string{ | ||||
| 	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 { | ||||
| 	device          *device.Device1 | ||||
| 	navflagsChar    *gatt.GattCharacteristic1 | ||||
| 	navnarrativeChar*gatt.GattCharacteristic1 | ||||
| 	navmandistChar  *gatt.GattCharacteristic1 | ||||
| 	navprogressChar *gatt.GattCharacteristic1 | ||||
| 	newAlertChar    *gatt.GattCharacteristic1 | ||||
| 	notifEventChar  *gatt.GattCharacteristic1 | ||||
| 	stepCountChar   *gatt.GattCharacteristic1 | ||||
| @@ -121,9 +71,11 @@ type Device struct { | ||||
| 	fsVersionChar   *gatt.GattCharacteristic1 | ||||
| 	fsTransferChar  *gatt.GattCharacteristic1 | ||||
| 	weatherDataChar *gatt.GattCharacteristic1 | ||||
| 	weatherdataChar *gatt.GattCharacteristic1 | ||||
| 	notifEventCh    chan uint8 | ||||
| 	notifEventDone  bool | ||||
| 	Music           MusicCtrl | ||||
| 	Navigation      NavigationCtrl | ||||
| 	DFU             DFU | ||||
| 	navigationEv    NavigationEvent | ||||
| } | ||||
| @@ -134,8 +86,6 @@ var ( | ||||
| 	ErrNotConnected     = errors.New("not connected") | ||||
| 	ErrNoTimelineHeader = errors.New("events must contain the timeline header") | ||||
| 	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 { | ||||
| @@ -452,13 +402,13 @@ func (i *Device) resolveChars() error { | ||||
| 		// Set correct characteristics | ||||
| 		switch char.Properties.UUID { | ||||
| 		case NavFlagsChar: | ||||
| 			i.navflagsChar = char | ||||
| 			i.Navigation.flagsChar = char | ||||
| 		case NavNarrativeChar: | ||||
| 			i.navnarrativeChar = char | ||||
| 			i.Navigation.narrativeChar = char | ||||
| 		case NavManDistChar: | ||||
| 			i.navmandistChar = char | ||||
| 			i.Navigation.mandistChar = char | ||||
| 		case NavProgressChar: | ||||
| 			i.navprogressChar = char | ||||
| 			i.Navigation.progressChar = char | ||||
| 		case NewAlertChar: | ||||
| 			i.newAlertChar = char | ||||
| 		case NotifEventChar: | ||||
| @@ -788,76 +738,6 @@ 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 | ||||
| const ( | ||||
|   | ||||
							
								
								
									
										188
									
								
								navigation.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								navigation.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,188 @@ | ||||
| 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 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user