ccb9c84db8
Use a new Duration type, which is used throughout the BLE stack for durations. The resolutions are sometimes different (connection parameters have half the resolution) but overall it should improve the ease of use of this type. This commit also provides a default advertisement interval that is recommended by Apple (which I think is as good as any recommendation). This might help to speed up discovery by Apple (and Android?) phones.
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"machine"
|
|
"time"
|
|
|
|
"github.com/tinygo-org/bluetooth"
|
|
)
|
|
|
|
var adapter = bluetooth.DefaultAdapter
|
|
|
|
// TODO: use atomics to access this value.
|
|
var ledColor = [3]byte{0xff, 0x00, 0x00} // start out with red
|
|
var leds = [3]machine.Pin{machine.LED_RED, machine.LED_GREEN, machine.LED_BLUE}
|
|
var hasColorChange = true
|
|
|
|
var (
|
|
serviceUUID = [16]byte{0xa0, 0xb4, 0x00, 0x01, 0x92, 0x6d, 0x4d, 0x61, 0x98, 0xdf, 0x8c, 0x5c, 0x62, 0xee, 0x53, 0xb3}
|
|
charUUID = [16]byte{0xa0, 0xb4, 0x00, 0x02, 0x92, 0x6d, 0x4d, 0x61, 0x98, 0xdf, 0x8c, 0x5c, 0x62, 0xee, 0x53, 0xb3}
|
|
)
|
|
|
|
func main() {
|
|
println("starting")
|
|
must("enable BLE stack", adapter.Enable())
|
|
adv := adapter.DefaultAdvertisement()
|
|
must("config adv", adv.Configure(bluetooth.AdvertisementOptions{
|
|
LocalName: "LED colors",
|
|
}))
|
|
must("start adv", adv.Start())
|
|
|
|
var ledColorCharacteristic bluetooth.Characteristic
|
|
must("add service", adapter.AddService(&bluetooth.Service{
|
|
UUID: bluetooth.NewUUID(serviceUUID),
|
|
Characteristics: []bluetooth.CharacteristicConfig{
|
|
{
|
|
Handle: &ledColorCharacteristic,
|
|
UUID: bluetooth.NewUUID(charUUID),
|
|
Value: ledColor[:],
|
|
Flags: bluetooth.CharacteristicReadPermission | bluetooth.CharacteristicWritePermission,
|
|
WriteEvent: func(client bluetooth.Connection, offset int, value []byte) {
|
|
if offset != 0 || len(value) != 3 {
|
|
return
|
|
}
|
|
ledColor[0] = value[0]
|
|
ledColor[1] = value[1]
|
|
ledColor[2] = value[2]
|
|
hasColorChange = true
|
|
},
|
|
},
|
|
},
|
|
}))
|
|
|
|
for _, led := range leds {
|
|
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
}
|
|
|
|
for {
|
|
for !hasColorChange {
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
hasColorChange = false
|
|
for i, led := range leds {
|
|
led.Set(ledColor[i] == 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
func must(action string, err error) {
|
|
if err != nil {
|
|
panic("failed to " + action + ": " + err.Error())
|
|
}
|
|
}
|