83 lines
2.3 KiB
Go
83 lines
2.3 KiB
Go
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
|
|
}
|