package infinitime import "github.com/muka/go-bluetooth/bluez/profile/gatt" type MusicEvent uint8 const ( MusicEventChar = "00000001-78fc-48fe-8e23-433b3a1942d0" MusicStatusChar = "00000002-78fc-48fe-8e23-433b3a1942d0" MusicArtistChar = "00000003-78fc-48fe-8e23-433b3a1942d0" MusicTrackChar = "00000004-78fc-48fe-8e23-433b3a1942d0" MusicAlbumChar = "00000005-78fc-48fe-8e23-433b3a1942d0" ) const ( MusicEventOpen MusicEvent = 0xe0 MusicEventPlay MusicEvent = 0x00 MusicEventPause MusicEvent = 0x01 MusicEventNext MusicEvent = 0x03 MusicEventPrev MusicEvent = 0x04 MusicEventVolUp MusicEvent = 0x05 MusicEventVolDown MusicEvent = 0x06 ) // MusicCtrl stores everything required to control music type MusicCtrl struct { eventChar *gatt.GattCharacteristic1 statusChar *gatt.GattCharacteristic1 artistChar *gatt.GattCharacteristic1 trackChar *gatt.GattCharacteristic1 albumChar *gatt.GattCharacteristic1 } // SetStatus sets the playing status func (mc MusicCtrl) SetStatus(playing bool) error { if playing { return mc.statusChar.WriteValue([]byte{0x1}, nil) } return mc.statusChar.WriteValue([]byte{0x0}, nil) } // SetArtist sets the artist on InfniTime func (mc MusicCtrl) SetArtist(artist string) error { return mc.artistChar.WriteValue([]byte(artist), nil) } // SetTrack sets the track name on InfniTime func (mc MusicCtrl) SetTrack(track string) error { return mc.trackChar.WriteValue([]byte(track), nil) } // SetAlbum sets the album on InfniTime func (mc MusicCtrl) SetAlbum(album string) error { return mc.albumChar.WriteValue([]byte(album), nil) } // WatchEvents watches music events from InfiniTime func (mc MusicCtrl) WatchEvents() (<-chan MusicEvent, error) { // Start notifications on music event characteristic err := mc.eventChar.StartNotify() if err != nil { return nil, err } // Watch music event properties ch, err := mc.eventChar.WatchProperties() if err != nil { return nil, err } musicEventCh := make(chan MusicEvent, 5) go func() { // For every event for event := range ch { // If value changes if event.Name == "Value" { log.Debug("Received music event from watch").Bytes("value", event.Value.([]byte)).Send() // Send music event to channel musicEventCh <- MusicEvent(event.Value.([]byte)[0]) } } }() return musicEventCh, nil }