sd: update to prepare for changes in the TinyGo CGo implementation
For details, see: https://github.com/tinygo-org/tinygo/pull/3927 I ran the smoke tests and the binaries are exactly identical to what they were before, so this change cannot have had an effect on these smoke tests (which is expected, as this is mostly just changing some types without changing the machine data type).
This commit is contained in:
parent
d0c7887b81
commit
01243181c3
14 changed files with 127 additions and 107 deletions
|
@ -42,7 +42,7 @@ func handleEvent() {
|
||||||
gapEvent := eventBuf.evt.unionfield_gap_evt()
|
gapEvent := eventBuf.evt.unionfield_gap_evt()
|
||||||
switch id {
|
switch id {
|
||||||
case C.BLE_GAP_EVT_CONNECTED:
|
case C.BLE_GAP_EVT_CONNECTED:
|
||||||
currentConnection.Reg = gapEvent.conn_handle
|
currentConnection.handle.Reg = uint16(gapEvent.conn_handle)
|
||||||
DefaultAdapter.connectHandler(Address{}, true)
|
DefaultAdapter.connectHandler(Address{}, true)
|
||||||
case C.BLE_GAP_EVT_DISCONNECTED:
|
case C.BLE_GAP_EVT_DISCONNECTED:
|
||||||
if defaultAdvertisement.isAdvertising.Get() != 0 {
|
if defaultAdvertisement.isAdvertising.Get() != 0 {
|
||||||
|
@ -54,7 +54,7 @@ func handleEvent() {
|
||||||
// necessary.
|
// necessary.
|
||||||
defaultAdvertisement.start()
|
defaultAdvertisement.start()
|
||||||
}
|
}
|
||||||
currentConnection.Reg = C.BLE_CONN_HANDLE_INVALID
|
currentConnection.handle.Reg = C.BLE_CONN_HANDLE_INVALID
|
||||||
DefaultAdapter.connectHandler(Address{}, false)
|
DefaultAdapter.connectHandler(Address{}, false)
|
||||||
case C.BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
|
case C.BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
|
||||||
// Respond with the default PPCP connection parameters by passing
|
// Respond with the default PPCP connection parameters by passing
|
||||||
|
@ -109,5 +109,5 @@ func (a *Adapter) Address() (MACAddress, error) {
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return MACAddress{}, Error(errCode)
|
return MACAddress{}, Error(errCode)
|
||||||
}
|
}
|
||||||
return MACAddress{MAC: addr.addr}, nil
|
return MACAddress{MAC: makeAddress(addr.addr)}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ func handleEvent() {
|
||||||
if debug {
|
if debug {
|
||||||
println("evt: connected in peripheral role")
|
println("evt: connected in peripheral role")
|
||||||
}
|
}
|
||||||
currentConnection.Reg = gapEvent.conn_handle
|
currentConnection.handle.Reg = uint16(gapEvent.conn_handle)
|
||||||
DefaultAdapter.connectHandler(Address{}, true)
|
DefaultAdapter.connectHandler(Address{}, true)
|
||||||
case C.BLE_GAP_ROLE_CENTRAL:
|
case C.BLE_GAP_ROLE_CENTRAL:
|
||||||
if debug {
|
if debug {
|
||||||
|
@ -46,11 +46,11 @@ func handleEvent() {
|
||||||
}
|
}
|
||||||
// Clean up state for this connection.
|
// Clean up state for this connection.
|
||||||
for i, cb := range gattcNotificationCallbacks {
|
for i, cb := range gattcNotificationCallbacks {
|
||||||
if cb.connectionHandle == currentConnection.Reg {
|
if uint16(cb.connectionHandle) == currentConnection.handle.Reg {
|
||||||
gattcNotificationCallbacks[i].valueHandle = 0 // 0 means invalid
|
gattcNotificationCallbacks[i].valueHandle = 0 // 0 means invalid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
currentConnection.Reg = C.BLE_CONN_HANDLE_INVALID
|
currentConnection.handle.Reg = C.BLE_CONN_HANDLE_INVALID
|
||||||
// Auto-restart advertisement if needed.
|
// Auto-restart advertisement if needed.
|
||||||
if defaultAdvertisement.isAdvertising.Get() != 0 {
|
if defaultAdvertisement.isAdvertising.Get() != 0 {
|
||||||
// The advertisement was running but was automatically stopped
|
// The advertisement was running but was automatically stopped
|
||||||
|
@ -64,7 +64,7 @@ func handleEvent() {
|
||||||
DefaultAdapter.connectHandler(Address{}, false)
|
DefaultAdapter.connectHandler(Address{}, false)
|
||||||
case C.BLE_GAP_EVT_ADV_REPORT:
|
case C.BLE_GAP_EVT_ADV_REPORT:
|
||||||
advReport := gapEvent.params.unionfield_adv_report()
|
advReport := gapEvent.params.unionfield_adv_report()
|
||||||
if debug && &scanReportBuffer.data[0] != advReport.data.p_data {
|
if debug && &scanReportBuffer.data[0] != (*byte)(unsafe.Pointer(advReport.data.p_data)) {
|
||||||
// Sanity check.
|
// Sanity check.
|
||||||
panic("scanReportBuffer != advReport.p_data")
|
panic("scanReportBuffer != advReport.p_data")
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ func handleEvent() {
|
||||||
scanReportBuffer.len = byte(advReport.data.len)
|
scanReportBuffer.len = byte(advReport.data.len)
|
||||||
globalScanResult.RSSI = int16(advReport.rssi)
|
globalScanResult.RSSI = int16(advReport.rssi)
|
||||||
globalScanResult.Address = Address{
|
globalScanResult.Address = Address{
|
||||||
MACAddress{MAC: advReport.peer_addr.addr,
|
MACAddress{MAC: makeAddress(advReport.peer_addr.addr),
|
||||||
isRandom: advReport.peer_addr.bitfield_addr_type() != 0},
|
isRandom: advReport.peer_addr.bitfield_addr_type() != 0},
|
||||||
}
|
}
|
||||||
globalScanResult.AdvertisementPayload = &scanReportBuffer
|
globalScanResult.AdvertisementPayload = &scanReportBuffer
|
||||||
|
|
|
@ -27,13 +27,13 @@ func handleEvent() {
|
||||||
if debug {
|
if debug {
|
||||||
println("evt: connected in peripheral role")
|
println("evt: connected in peripheral role")
|
||||||
}
|
}
|
||||||
currentConnection.Reg = gapEvent.conn_handle
|
currentConnection.handle.Reg = uint16(gapEvent.conn_handle)
|
||||||
DefaultAdapter.connectHandler(Address{}, true)
|
DefaultAdapter.connectHandler(Address{}, true)
|
||||||
case C.BLE_GAP_EVT_DISCONNECTED:
|
case C.BLE_GAP_EVT_DISCONNECTED:
|
||||||
if debug {
|
if debug {
|
||||||
println("evt: disconnected")
|
println("evt: disconnected")
|
||||||
}
|
}
|
||||||
currentConnection.Reg = C.BLE_CONN_HANDLE_INVALID
|
currentConnection.handle.Reg = C.BLE_CONN_HANDLE_INVALID
|
||||||
// Auto-restart advertisement if needed.
|
// Auto-restart advertisement if needed.
|
||||||
if defaultAdvertisement.isAdvertising.Get() != 0 {
|
if defaultAdvertisement.isAdvertising.Get() != 0 {
|
||||||
// The advertisement was running but was automatically stopped
|
// The advertisement was running but was automatically stopped
|
||||||
|
|
|
@ -46,7 +46,7 @@ func (a *Adapter) enable() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable the BLE stack.
|
// Enable the BLE stack.
|
||||||
appRAMBase := uint32(uintptr(unsafe.Pointer(&appRAMBase)))
|
appRAMBase := C.uint32_t(uintptr(unsafe.Pointer(&appRAMBase)))
|
||||||
errCode = C.sd_ble_enable(&appRAMBase)
|
errCode = C.sd_ble_enable(&appRAMBase)
|
||||||
return makeError(errCode)
|
return makeError(errCode)
|
||||||
}
|
}
|
||||||
|
@ -57,5 +57,5 @@ func (a *Adapter) Address() (MACAddress, error) {
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return MACAddress{}, Error(errCode)
|
return MACAddress{}, Error(errCode)
|
||||||
}
|
}
|
||||||
return MACAddress{MAC: addr.addr}, nil
|
return MACAddress{MAC: makeAddress(addr.addr)}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
// There can only be one connection at a time in the default configuration.
|
// There can only be one connection at a time in the default configuration.
|
||||||
var currentConnection = volatile.Register16{C.BLE_CONN_HANDLE_INVALID}
|
var currentConnection = volatileHandle{handle: volatile.Register16{C.BLE_CONN_HANDLE_INVALID}}
|
||||||
|
|
||||||
// Globally allocated buffer for incoming SoftDevice events.
|
// Globally allocated buffer for incoming SoftDevice events.
|
||||||
var eventBuf struct {
|
var eventBuf struct {
|
||||||
|
@ -60,7 +60,7 @@ var DefaultAdapter = &Adapter{isDefault: true,
|
||||||
return
|
return
|
||||||
}}
|
}}
|
||||||
|
|
||||||
var eventBufLen uint16
|
var eventBufLen C.uint16_t
|
||||||
|
|
||||||
// Enable configures the BLE stack. It must be called before any
|
// Enable configures the BLE stack. It must be called before any
|
||||||
// Bluetooth-related calls (unless otherwise indicated).
|
// Bluetooth-related calls (unless otherwise indicated).
|
||||||
|
@ -72,8 +72,8 @@ func (a *Adapter) Enable() error {
|
||||||
// Enable the IRQ that handles all events.
|
// Enable the IRQ that handles all events.
|
||||||
intr := interrupt.New(nrf.IRQ_SWI2, func(interrupt.Interrupt) {
|
intr := interrupt.New(nrf.IRQ_SWI2, func(interrupt.Interrupt) {
|
||||||
for {
|
for {
|
||||||
eventBufLen = uint16(unsafe.Sizeof(eventBuf))
|
eventBufLen = C.uint16_t(unsafe.Sizeof(eventBuf))
|
||||||
errCode := C.sd_ble_evt_get((*uint8)(unsafe.Pointer(&eventBuf)), &eventBufLen)
|
errCode := C.sd_ble_evt_get((*C.uint8_t)(unsafe.Pointer(&eventBuf)), &eventBufLen)
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
// Possible error conditions:
|
// Possible error conditions:
|
||||||
// * NRF_ERROR_NOT_FOUND: no events left, break
|
// * NRF_ERROR_NOT_FOUND: no events left, break
|
||||||
|
@ -97,7 +97,7 @@ func (a *Adapter) Enable() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
errCode := C.sd_ble_gap_device_name_set(&secModeOpen, &defaultDeviceName[0], uint16(len(defaultDeviceName)))
|
errCode := C.sd_ble_gap_device_name_set(&secModeOpen, (*C.uint8_t)(unsafe.Pointer(&defaultDeviceName[0])), C.uint16_t(len(defaultDeviceName)))
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return Error(errCode)
|
return Error(errCode)
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ func (a *Adapter) Enable() error {
|
||||||
// play well with the SoftDevice. Restore interrupts to the previous state with
|
// play well with the SoftDevice. Restore interrupts to the previous state with
|
||||||
// RestoreInterrupts.
|
// RestoreInterrupts.
|
||||||
func DisableInterrupts() uintptr {
|
func DisableInterrupts() uintptr {
|
||||||
var is_nested_critical_region uint8
|
var is_nested_critical_region C.uint8_t
|
||||||
C.sd_nvic_critical_region_enter(&is_nested_critical_region)
|
C.sd_nvic_critical_region_enter(&is_nested_critical_region)
|
||||||
return uintptr(is_nested_critical_region)
|
return uintptr(is_nested_critical_region)
|
||||||
}
|
}
|
||||||
|
@ -125,5 +125,43 @@ func DisableInterrupts() uintptr {
|
||||||
// DisableInterrupts. The mask parameter must be the value returned by
|
// DisableInterrupts. The mask parameter must be the value returned by
|
||||||
// DisableInterrupts.
|
// DisableInterrupts.
|
||||||
func RestoreInterrupts(mask uintptr) {
|
func RestoreInterrupts(mask uintptr) {
|
||||||
C.sd_nvic_critical_region_exit(uint8(mask))
|
C.sd_nvic_critical_region_exit(C.uint8_t(mask))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper for volatile.Register16 that uses C.uint16_t instead of uint16, for
|
||||||
|
// easier interoperability with C.
|
||||||
|
type volatileHandle struct {
|
||||||
|
handle volatile.Register16
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *volatileHandle) Set(handle C.uint16_t) {
|
||||||
|
a.handle.Set(uint16(handle))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *volatileHandle) Get() C.uint16_t {
|
||||||
|
return C.uint16_t(a.handle.Get())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert a SoftDevice MAC address into a Go MAC address.
|
||||||
|
func makeAddress(mac [6]C.uint8_t) MAC {
|
||||||
|
return MAC{
|
||||||
|
uint8(mac[0]),
|
||||||
|
uint8(mac[1]),
|
||||||
|
uint8(mac[2]),
|
||||||
|
uint8(mac[3]),
|
||||||
|
uint8(mac[4]),
|
||||||
|
uint8(mac[5]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert a Go MAC address into a SoftDevice MAC Address.
|
||||||
|
func makeSDAddress(mac MAC) [6]C.uint8_t {
|
||||||
|
return [6]C.uint8_t{
|
||||||
|
C.uint8_t(mac[0]),
|
||||||
|
C.uint8_t(mac[1]),
|
||||||
|
C.uint8_t(mac[2]),
|
||||||
|
C.uint8_t(mac[3]),
|
||||||
|
C.uint8_t(mac[4]),
|
||||||
|
C.uint8_t(mac[5]),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
package bluetooth
|
package bluetooth
|
||||||
|
|
||||||
|
// #include <stdint.h>
|
||||||
// #include "nrf_error.h"
|
// #include "nrf_error.h"
|
||||||
// #include "nrf_error_sdm.h"
|
// #include "nrf_error_sdm.h"
|
||||||
import "C"
|
import "C"
|
||||||
|
@ -83,7 +84,7 @@ func (e Error) Error() string {
|
||||||
|
|
||||||
// makeError returns an error (using the Error type) if the error code is
|
// makeError returns an error (using the Error type) if the error code is
|
||||||
// non-zero, otherwise it returns nil. It is used with internal API calls.
|
// non-zero, otherwise it returns nil. It is used with internal API calls.
|
||||||
func makeError(code uint32) error {
|
func makeError(code C.uint32_t) error {
|
||||||
if code != 0 {
|
if code != 0 {
|
||||||
return Error(code)
|
return Error(code)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import "C"
|
||||||
import (
|
import (
|
||||||
"runtime/volatile"
|
"runtime/volatile"
|
||||||
"time"
|
"time"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Address contains a Bluetooth MAC address.
|
// Address contains a Bluetooth MAC address.
|
||||||
|
@ -52,7 +53,7 @@ func (a *Advertisement) Configure(options AdvertisementOptions) error {
|
||||||
return errAdvertisementPacketTooBig
|
return errAdvertisementPacketTooBig
|
||||||
}
|
}
|
||||||
|
|
||||||
errCode := C.sd_ble_gap_adv_data_set(&payload.data[0], payload.len, nil, 0)
|
errCode := C.sd_ble_gap_adv_data_set((*C.uint8_t)(unsafe.Pointer(&payload.data[0])), C.uint8_t(payload.len), nil, 0)
|
||||||
a.interval = options.Interval
|
a.interval = options.Interval
|
||||||
return makeError(errCode)
|
return makeError(errCode)
|
||||||
}
|
}
|
||||||
|
@ -73,11 +74,11 @@ func (a *Advertisement) Stop() error {
|
||||||
|
|
||||||
// Low-level version of Start. Used to restart advertisement when a connection
|
// Low-level version of Start. Used to restart advertisement when a connection
|
||||||
// is lost.
|
// is lost.
|
||||||
func (a *Advertisement) start() uint32 {
|
func (a *Advertisement) start() C.uint32_t {
|
||||||
params := C.ble_gap_adv_params_t{
|
params := C.ble_gap_adv_params_t{
|
||||||
_type: C.BLE_GAP_ADV_TYPE_ADV_IND,
|
_type: C.BLE_GAP_ADV_TYPE_ADV_IND,
|
||||||
fp: C.BLE_GAP_ADV_FP_ANY,
|
fp: C.BLE_GAP_ADV_FP_ANY,
|
||||||
interval: uint16(a.interval),
|
interval: C.uint16_t(a.interval),
|
||||||
timeout: 0, // no timeout
|
timeout: 0, // no timeout
|
||||||
}
|
}
|
||||||
return C.sd_ble_gap_adv_start_noescape(params)
|
return C.sd_ble_gap_adv_start_noescape(params)
|
||||||
|
|
|
@ -5,6 +5,7 @@ package bluetooth
|
||||||
import (
|
import (
|
||||||
"runtime/volatile"
|
"runtime/volatile"
|
||||||
"time"
|
"time"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -19,7 +20,7 @@ type Address struct {
|
||||||
|
|
||||||
// Advertisement encapsulates a single advertisement instance.
|
// Advertisement encapsulates a single advertisement instance.
|
||||||
type Advertisement struct {
|
type Advertisement struct {
|
||||||
handle uint8
|
handle C.uint8_t
|
||||||
isAdvertising volatile.Register8
|
isAdvertising volatile.Register8
|
||||||
payload rawAdvertisementPayload
|
payload rawAdvertisementPayload
|
||||||
}
|
}
|
||||||
|
@ -57,14 +58,14 @@ func (a *Advertisement) Configure(options AdvertisementOptions) error {
|
||||||
|
|
||||||
data := C.ble_gap_adv_data_t{}
|
data := C.ble_gap_adv_data_t{}
|
||||||
data.adv_data = C.ble_data_t{
|
data.adv_data = C.ble_data_t{
|
||||||
p_data: &a.payload.data[0],
|
p_data: (*C.uint8_t)(unsafe.Pointer(&a.payload.data[0])),
|
||||||
len: uint16(a.payload.len),
|
len: C.uint16_t(a.payload.len),
|
||||||
}
|
}
|
||||||
params := C.ble_gap_adv_params_t{
|
params := C.ble_gap_adv_params_t{
|
||||||
properties: C.ble_gap_adv_properties_t{
|
properties: C.ble_gap_adv_properties_t{
|
||||||
_type: C.BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED,
|
_type: C.BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED,
|
||||||
},
|
},
|
||||||
interval: uint32(options.Interval),
|
interval: C.uint32_t(options.Interval),
|
||||||
}
|
}
|
||||||
errCode := C.sd_ble_gap_adv_set_configure(&a.handle, &data, ¶ms)
|
errCode := C.sd_ble_gap_adv_set_configure(&a.handle, &data, ¶ms)
|
||||||
return makeError(errCode)
|
return makeError(errCode)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"runtime/volatile"
|
"runtime/volatile"
|
||||||
"time"
|
"time"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -40,12 +41,12 @@ func (a *Adapter) Scan(callback func(*Adapter, ScanResult)) error {
|
||||||
scanParams := C.ble_gap_scan_params_t{}
|
scanParams := C.ble_gap_scan_params_t{}
|
||||||
scanParams.set_bitfield_extended(0)
|
scanParams.set_bitfield_extended(0)
|
||||||
scanParams.set_bitfield_active(0)
|
scanParams.set_bitfield_active(0)
|
||||||
scanParams.interval = uint16(NewDuration(40 * time.Millisecond))
|
scanParams.interval = C.uint16_t(NewDuration(40 * time.Millisecond))
|
||||||
scanParams.window = uint16(NewDuration(30 * time.Millisecond))
|
scanParams.window = C.uint16_t(NewDuration(30 * time.Millisecond))
|
||||||
scanParams.timeout = C.BLE_GAP_SCAN_TIMEOUT_UNLIMITED
|
scanParams.timeout = C.BLE_GAP_SCAN_TIMEOUT_UNLIMITED
|
||||||
scanReportBufferInfo := C.ble_data_t{
|
scanReportBufferInfo := C.ble_data_t{
|
||||||
p_data: &scanReportBuffer.data[0],
|
p_data: (*C.uint8_t)(unsafe.Pointer(&scanReportBuffer.data[0])),
|
||||||
len: uint16(len(scanReportBuffer.data)),
|
len: C.uint16_t(len(scanReportBuffer.data)),
|
||||||
}
|
}
|
||||||
errCode := C.sd_ble_gap_scan_start(&scanParams, &scanReportBufferInfo)
|
errCode := C.sd_ble_gap_scan_start(&scanParams, &scanReportBufferInfo)
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
|
@ -93,13 +94,13 @@ func (a *Adapter) StopScan() error {
|
||||||
|
|
||||||
// Device is a connection to a remote peripheral.
|
// Device is a connection to a remote peripheral.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
connectionHandle uint16
|
connectionHandle C.uint16_t
|
||||||
}
|
}
|
||||||
|
|
||||||
// In-progress connection attempt.
|
// In-progress connection attempt.
|
||||||
var connectionAttempt struct {
|
var connectionAttempt struct {
|
||||||
state volatile.Register8 // 0 means unused, 1 means connecting, 2 means ready (connected or timeout)
|
state volatile.Register8 // 0 means unused, 1 means connecting, 2 means ready (connected or timeout)
|
||||||
connectionHandle uint16
|
connectionHandle C.uint16_t
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect starts a connection attempt to the given peripheral device address.
|
// Connect starts a connection attempt to the given peripheral device address.
|
||||||
|
@ -111,7 +112,7 @@ var connectionAttempt struct {
|
||||||
func (a *Adapter) Connect(address Address, params ConnectionParams) (*Device, error) {
|
func (a *Adapter) Connect(address Address, params ConnectionParams) (*Device, error) {
|
||||||
// Construct an address object as used in the SoftDevice.
|
// Construct an address object as used in the SoftDevice.
|
||||||
var addr C.ble_gap_addr_t
|
var addr C.ble_gap_addr_t
|
||||||
addr.addr = address.MAC
|
addr.addr = makeSDAddress(address.MAC)
|
||||||
if address.IsRandom() {
|
if address.IsRandom() {
|
||||||
switch address.MAC[5] >> 6 {
|
switch address.MAC[5] >> 6 {
|
||||||
case 0b11:
|
case 0b11:
|
||||||
|
@ -142,13 +143,13 @@ func (a *Adapter) Connect(address Address, params ConnectionParams) (*Device, er
|
||||||
scanParams := C.ble_gap_scan_params_t{}
|
scanParams := C.ble_gap_scan_params_t{}
|
||||||
scanParams.set_bitfield_extended(0)
|
scanParams.set_bitfield_extended(0)
|
||||||
scanParams.set_bitfield_active(0)
|
scanParams.set_bitfield_active(0)
|
||||||
scanParams.interval = uint16(NewDuration(40 * time.Millisecond))
|
scanParams.interval = C.uint16_t(NewDuration(40 * time.Millisecond))
|
||||||
scanParams.window = uint16(NewDuration(30 * time.Millisecond))
|
scanParams.window = C.uint16_t(NewDuration(30 * time.Millisecond))
|
||||||
scanParams.timeout = uint16(params.ConnectionTimeout)
|
scanParams.timeout = C.uint16_t(params.ConnectionTimeout)
|
||||||
|
|
||||||
connectionParams := C.ble_gap_conn_params_t{
|
connectionParams := C.ble_gap_conn_params_t{
|
||||||
min_conn_interval: uint16(params.MinInterval) / 2,
|
min_conn_interval: C.uint16_t(params.MinInterval) / 2,
|
||||||
max_conn_interval: uint16(params.MaxInterval) / 2,
|
max_conn_interval: C.uint16_t(params.MaxInterval) / 2,
|
||||||
slave_latency: 0, // mostly relevant to connected keyboards etc
|
slave_latency: 0, // mostly relevant to connected keyboards etc
|
||||||
conn_sup_timeout: 200, // 2 seconds (in 10ms units), the minimum recommended by Apple
|
conn_sup_timeout: 200, // 2 seconds (in 10ms units), the minimum recommended by Apple
|
||||||
}
|
}
|
||||||
|
|
43
gattc_sd.go
43
gattc_sd.go
|
@ -11,6 +11,7 @@ import (
|
||||||
"device/arm"
|
"device/arm"
|
||||||
"errors"
|
"errors"
|
||||||
"runtime/volatile"
|
"runtime/volatile"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -28,8 +29,8 @@ var (
|
||||||
// program and the event handler.
|
// program and the event handler.
|
||||||
var discoveringService struct {
|
var discoveringService struct {
|
||||||
state volatile.Register8 // 0 means nothing happening, 1 means in progress, 2 means found something
|
state volatile.Register8 // 0 means nothing happening, 1 means in progress, 2 means found something
|
||||||
startHandle volatile.Register16
|
startHandle volatileHandle
|
||||||
endHandle volatile.Register16
|
endHandle volatileHandle
|
||||||
uuid C.ble_uuid_t
|
uuid C.ble_uuid_t
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,9 +39,9 @@ var discoveringService struct {
|
||||||
type DeviceService struct {
|
type DeviceService struct {
|
||||||
uuid shortUUID
|
uuid shortUUID
|
||||||
|
|
||||||
connectionHandle uint16
|
connectionHandle C.uint16_t
|
||||||
startHandle uint16
|
startHandle C.uint16_t
|
||||||
endHandle uint16
|
endHandle C.uint16_t
|
||||||
}
|
}
|
||||||
|
|
||||||
// UUID returns the UUID for this DeviceService.
|
// UUID returns the UUID for this DeviceService.
|
||||||
|
@ -76,7 +77,7 @@ func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error) {
|
||||||
if len(uuids) > 0 {
|
if len(uuids) > 0 {
|
||||||
shortUUIDs = make([]C.ble_uuid_t, sz)
|
shortUUIDs = make([]C.ble_uuid_t, sz)
|
||||||
for i, uuid := range uuids {
|
for i, uuid := range uuids {
|
||||||
var errCode uint32
|
var errCode C.uint32_t
|
||||||
shortUUIDs[i], errCode = uuid.shortUUID()
|
shortUUIDs[i], errCode = uuid.shortUUID()
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return nil, Error(errCode)
|
return nil, Error(errCode)
|
||||||
|
@ -86,7 +87,7 @@ func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error) {
|
||||||
|
|
||||||
numFound := 0
|
numFound := 0
|
||||||
|
|
||||||
var startHandle uint16 = 1
|
var startHandle C.uint16_t = 1
|
||||||
|
|
||||||
for i := 0; i < sz; i++ {
|
for i := 0; i < sz; i++ {
|
||||||
var suuid C.ble_uuid_t
|
var suuid C.ble_uuid_t
|
||||||
|
@ -96,7 +97,7 @@ func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error) {
|
||||||
|
|
||||||
// Start discovery of this service.
|
// Start discovery of this service.
|
||||||
discoveringService.state.Set(1)
|
discoveringService.state.Set(1)
|
||||||
var errCode uint32
|
var errCode C.uint32_t
|
||||||
if len(uuids) > 0 {
|
if len(uuids) > 0 {
|
||||||
errCode = C.sd_ble_gattc_primary_services_discover(d.connectionHandle, startHandle, &suuid)
|
errCode = C.sd_ble_gattc_primary_services_discover(d.connectionHandle, startHandle, &suuid)
|
||||||
} else {
|
} else {
|
||||||
|
@ -159,9 +160,9 @@ func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error) {
|
||||||
type DeviceCharacteristic struct {
|
type DeviceCharacteristic struct {
|
||||||
uuid shortUUID
|
uuid shortUUID
|
||||||
|
|
||||||
connectionHandle uint16
|
connectionHandle C.uint16_t
|
||||||
valueHandle uint16
|
valueHandle C.uint16_t
|
||||||
cccdHandle uint16
|
cccdHandle C.uint16_t
|
||||||
permissions CharacteristicPermissions
|
permissions CharacteristicPermissions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +176,7 @@ func (c *DeviceCharacteristic) UUID() UUID {
|
||||||
var discoveringCharacteristic struct {
|
var discoveringCharacteristic struct {
|
||||||
uuid C.ble_uuid_t
|
uuid C.ble_uuid_t
|
||||||
char_props C.ble_gatt_char_props_t
|
char_props C.ble_gatt_char_props_t
|
||||||
handle_value volatile.Register16
|
handle_value volatileHandle
|
||||||
}
|
}
|
||||||
|
|
||||||
// DiscoverCharacteristics discovers characteristics in this service. Pass a
|
// DiscoverCharacteristics discovers characteristics in this service. Pass a
|
||||||
|
@ -204,7 +205,7 @@ func (s *DeviceService) DiscoverCharacteristics(uuids []UUID) ([]DeviceCharacter
|
||||||
if len(uuids) > 0 {
|
if len(uuids) > 0 {
|
||||||
shortUUIDs = make([]C.ble_uuid_t, sz)
|
shortUUIDs = make([]C.ble_uuid_t, sz)
|
||||||
for i, uuid := range uuids {
|
for i, uuid := range uuids {
|
||||||
var errCode uint32
|
var errCode C.uint32_t
|
||||||
shortUUIDs[i], errCode = uuid.shortUUID()
|
shortUUIDs[i], errCode = uuid.shortUUID()
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return nil, Error(errCode)
|
return nil, Error(errCode)
|
||||||
|
@ -324,8 +325,8 @@ func (c DeviceCharacteristic) WriteWithoutResponse(p []byte) (n int, err error)
|
||||||
write_op: C.BLE_GATT_OP_WRITE_CMD,
|
write_op: C.BLE_GATT_OP_WRITE_CMD,
|
||||||
handle: c.valueHandle,
|
handle: c.valueHandle,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
len: uint16(len(p)),
|
len: C.uint16_t(len(p)),
|
||||||
p_value: &p[0],
|
p_value: (*C.uint8_t)(unsafe.Pointer(&p[0])),
|
||||||
})
|
})
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return 0, Error(errCode)
|
return 0, Error(errCode)
|
||||||
|
@ -334,8 +335,8 @@ func (c DeviceCharacteristic) WriteWithoutResponse(p []byte) (n int, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type gattcNotificationCallback struct {
|
type gattcNotificationCallback struct {
|
||||||
connectionHandle uint16
|
connectionHandle C.uint16_t
|
||||||
valueHandle uint16 // may be 0 if the slot is empty
|
valueHandle C.uint16_t // may be 0 if the slot is empty
|
||||||
callback func([]byte)
|
callback func([]byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,7 +401,7 @@ func (c DeviceCharacteristic) EnableNotifications(callback func(buf []byte)) err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write to the CCCD to enable notifications. Don't wait for a response.
|
// Write to the CCCD to enable notifications. Don't wait for a response.
|
||||||
value := [2]byte{0x01, 0x00} // 0x0001 enables notifications (and disables indications)
|
value := [2]C.uint8_t{0x01, 0x00} // 0x0001 enables notifications (and disables indications)
|
||||||
errCode := C.sd_ble_gattc_write(c.connectionHandle, &C.ble_gattc_write_params_t{
|
errCode := C.sd_ble_gattc_write(c.connectionHandle, &C.ble_gattc_write_params_t{
|
||||||
write_op: C.BLE_GATT_OP_WRITE_CMD,
|
write_op: C.BLE_GATT_OP_WRITE_CMD,
|
||||||
handle: c.cccdHandle,
|
handle: c.cccdHandle,
|
||||||
|
@ -414,9 +415,9 @@ func (c DeviceCharacteristic) EnableNotifications(callback func(buf []byte)) err
|
||||||
// A global used to pass information from the event handler back to the
|
// A global used to pass information from the event handler back to the
|
||||||
// Read function below.
|
// Read function below.
|
||||||
var readingCharacteristic struct {
|
var readingCharacteristic struct {
|
||||||
handle_value volatile.Register16
|
handle_value volatileHandle
|
||||||
offset uint16
|
offset C.uint16_t
|
||||||
length uint16
|
length C.uint16_t
|
||||||
value []byte
|
value []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
35
gatts_sd.go
35
gatts_sd.go
|
@ -17,11 +17,12 @@ static inline uint32_t sd_ble_gatts_value_set_noescape(uint16_t conn_handle, uin
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
// Characteristic is a single characteristic in a service. It has an UUID and a
|
// Characteristic is a single characteristic in a service. It has an UUID and a
|
||||||
// value.
|
// value.
|
||||||
type Characteristic struct {
|
type Characteristic struct {
|
||||||
handle uint16
|
handle C.uint16_t
|
||||||
permissions CharacteristicPermissions
|
permissions CharacteristicPermissions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,18 +33,18 @@ func (a *Adapter) AddService(service *Service) error {
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return Error(errCode)
|
return Error(errCode)
|
||||||
}
|
}
|
||||||
errCode = C.sd_ble_gatts_service_add(C.BLE_GATTS_SRVC_TYPE_PRIMARY, &uuid, &service.handle)
|
errCode = C.sd_ble_gatts_service_add(C.BLE_GATTS_SRVC_TYPE_PRIMARY, &uuid, (*C.uint16_t)(unsafe.Pointer(&service.handle)))
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return Error(errCode)
|
return Error(errCode)
|
||||||
}
|
}
|
||||||
for _, char := range service.Characteristics {
|
for _, char := range service.Characteristics {
|
||||||
metadata := C.ble_gatts_char_md_t{}
|
metadata := C.ble_gatts_char_md_t{}
|
||||||
metadata.char_props.set_bitfield_broadcast(uint8(char.Flags>>0) & 1)
|
metadata.char_props.set_bitfield_broadcast(C.uint8_t(char.Flags>>0) & 1)
|
||||||
metadata.char_props.set_bitfield_read(uint8(char.Flags>>1) & 1)
|
metadata.char_props.set_bitfield_read(C.uint8_t(char.Flags>>1) & 1)
|
||||||
metadata.char_props.set_bitfield_write_wo_resp(uint8(char.Flags>>2) & 1)
|
metadata.char_props.set_bitfield_write_wo_resp(C.uint8_t(char.Flags>>2) & 1)
|
||||||
metadata.char_props.set_bitfield_write(uint8(char.Flags>>3) & 1)
|
metadata.char_props.set_bitfield_write(C.uint8_t(char.Flags>>3) & 1)
|
||||||
metadata.char_props.set_bitfield_notify(uint8(char.Flags>>4) & 1)
|
metadata.char_props.set_bitfield_notify(C.uint8_t(char.Flags>>4) & 1)
|
||||||
metadata.char_props.set_bitfield_indicate(uint8(char.Flags>>5) & 1)
|
metadata.char_props.set_bitfield_indicate(C.uint8_t(char.Flags>>5) & 1)
|
||||||
handles := C.ble_gatts_char_handles_t{}
|
handles := C.ble_gatts_char_handles_t{}
|
||||||
charUUID, errCode := char.UUID.shortUUID()
|
charUUID, errCode := char.UUID.shortUUID()
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
|
@ -55,16 +56,16 @@ func (a *Adapter) AddService(service *Service) error {
|
||||||
read_perm: secModeOpen,
|
read_perm: secModeOpen,
|
||||||
write_perm: secModeOpen,
|
write_perm: secModeOpen,
|
||||||
},
|
},
|
||||||
init_len: uint16(len(char.Value)),
|
init_len: C.uint16_t(len(char.Value)),
|
||||||
init_offs: 0,
|
init_offs: 0,
|
||||||
max_len: 20, // This is a conservative maximum length.
|
max_len: 20, // This is a conservative maximum length.
|
||||||
}
|
}
|
||||||
if len(char.Value) != 0 {
|
if len(char.Value) != 0 {
|
||||||
value.p_value = &char.Value[0]
|
value.p_value = (*C.uint8_t)(unsafe.Pointer(&char.Value[0]))
|
||||||
}
|
}
|
||||||
value.p_attr_md.set_bitfield_vloc(C.BLE_GATTS_VLOC_STACK)
|
value.p_attr_md.set_bitfield_vloc(C.BLE_GATTS_VLOC_STACK)
|
||||||
value.p_attr_md.set_bitfield_vlen(1)
|
value.p_attr_md.set_bitfield_vlen(1)
|
||||||
errCode = C.sd_ble_gatts_characteristic_add(service.handle, &metadata, &value, &handles)
|
errCode = C.sd_ble_gatts_characteristic_add(C.uint16_t(service.handle), &metadata, &value, &handles)
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return Error(errCode)
|
return Error(errCode)
|
||||||
}
|
}
|
||||||
|
@ -88,13 +89,13 @@ func (a *Adapter) AddService(service *Service) error {
|
||||||
// charWriteHandler contains a handler->callback mapping for characteristic
|
// charWriteHandler contains a handler->callback mapping for characteristic
|
||||||
// writes.
|
// writes.
|
||||||
type charWriteHandler struct {
|
type charWriteHandler struct {
|
||||||
handle uint16
|
handle C.uint16_t
|
||||||
callback func(connection Connection, offset int, value []byte)
|
callback func(connection Connection, offset int, value []byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getCharWriteHandler returns a characteristic write handler if one matches the
|
// getCharWriteHandler returns a characteristic write handler if one matches the
|
||||||
// handle, or nil otherwise.
|
// handle, or nil otherwise.
|
||||||
func (a *Adapter) getCharWriteHandler(handle uint16) *charWriteHandler {
|
func (a *Adapter) getCharWriteHandler(handle C.uint16_t) *charWriteHandler {
|
||||||
// Look through all handlers for a match.
|
// Look through all handlers for a match.
|
||||||
// There is probably a way to do this more efficiently (with a hashmap for
|
// There is probably a way to do this more efficiently (with a hashmap for
|
||||||
// example) but the number of event handlers is likely low and improving
|
// example) but the number of event handlers is likely low and improving
|
||||||
|
@ -124,8 +125,8 @@ func (c *Characteristic) Write(p []byte) (n int, err error) {
|
||||||
c.handle,
|
c.handle,
|
||||||
C.BLE_GATT_HVX_NOTIFICATION,
|
C.BLE_GATT_HVX_NOTIFICATION,
|
||||||
0,
|
0,
|
||||||
p_len,
|
C.uint16_t(p_len),
|
||||||
&p[0],
|
(*C.uint8_t)(unsafe.Pointer(&p[0])),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Check for some expected errors. Don't report them as errors, but
|
// Check for some expected errors. Don't report them as errors, but
|
||||||
|
@ -145,8 +146,8 @@ func (c *Characteristic) Write(p []byte) (n int, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
errCode := C.sd_ble_gatts_value_set_noescape(C.BLE_CONN_HANDLE_INVALID, c.handle, C.ble_gatts_value_t{
|
errCode := C.sd_ble_gatts_value_set_noescape(C.BLE_CONN_HANDLE_INVALID, c.handle, C.ble_gatts_value_t{
|
||||||
len: uint16(len(p)),
|
len: C.uint16_t(len(p)),
|
||||||
p_value: &p[0],
|
p_value: (*C.uint8_t)(unsafe.Pointer(&p[0])),
|
||||||
})
|
})
|
||||||
if errCode != 0 {
|
if errCode != 0 {
|
||||||
return 0, Error(errCode)
|
return 0, Error(errCode)
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -9,7 +9,7 @@ require (
|
||||||
github.com/saltosystems/winrt-go v0.0.0-20230921082907-2ab5b7d431e1
|
github.com/saltosystems/winrt-go v0.0.0-20230921082907-2ab5b7d431e1
|
||||||
github.com/tinygo-org/cbgo v0.0.4
|
github.com/tinygo-org/cbgo v0.0.4
|
||||||
golang.org/x/crypto v0.12.0
|
golang.org/x/crypto v0.12.0
|
||||||
tinygo.org/x/drivers v0.25.0
|
tinygo.org/x/drivers v0.26.1-0.20230922160320-ed51435c2ef6
|
||||||
tinygo.org/x/tinyfont v0.4.0
|
tinygo.org/x/tinyfont v0.4.0
|
||||||
tinygo.org/x/tinyterm v0.3.0
|
tinygo.org/x/tinyterm v0.3.0
|
||||||
)
|
)
|
||||||
|
|
28
go.sum
28
go.sum
|
@ -1,24 +1,18 @@
|
||||||
github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
|
|
||||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
||||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||||
github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
|
|
||||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
||||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/hajimehoshi/go-jisx0208 v1.0.0/go.mod h1:yYxEStHL7lt9uL+AbdWgW9gBumwieDoZCiB1f/0X0as=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/muka/go-bluetooth v0.0.0-20221213043340-85dc80edc4e1 h1:BuVRHr4HHJbk1DHyWkArJ7E8J/VA8ncCr/VLnQFazBo=
|
github.com/muka/go-bluetooth v0.0.0-20221213043340-85dc80edc4e1 h1:BuVRHr4HHJbk1DHyWkArJ7E8J/VA8ncCr/VLnQFazBo=
|
||||||
|
@ -28,7 +22,6 @@ github.com/paypal/gatt v0.0.0-20151011220935-4ae819d591cf/go.mod h1:+AwQL2mK3Pd3
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/sago35/go-bdf v0.0.0-20200313142241-6c17821c91c4/go.mod h1:rOebXGuMLsXhZAC6mF/TjxONsm45498ZyzVhel++6KM=
|
|
||||||
github.com/saltosystems/winrt-go v0.0.0-20230921082907-2ab5b7d431e1 h1:L2YoWezgwpAZ2SEKjXk6yLnwOkM3u7mXq/mKuJeEpFM=
|
github.com/saltosystems/winrt-go v0.0.0-20230921082907-2ab5b7d431e1 h1:L2YoWezgwpAZ2SEKjXk6yLnwOkM3u7mXq/mKuJeEpFM=
|
||||||
github.com/saltosystems/winrt-go v0.0.0-20230921082907-2ab5b7d431e1/go.mod h1:CIltaIm7qaANUIvzr0Vmz71lmQMAIbGJ7cvgzX7FMfA=
|
github.com/saltosystems/winrt-go v0.0.0-20230921082907-2ab5b7d431e1/go.mod h1:CIltaIm7qaANUIvzr0Vmz71lmQMAIbGJ7cvgzX7FMfA=
|
||||||
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
|
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
|
||||||
|
@ -43,19 +36,16 @@ github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324
|
||||||
github.com/suapapa/go_eddystone v1.3.1/go.mod h1:bXC11TfJOS+3g3q/Uzd7FKd5g62STQEfeEIhcKe4Qy8=
|
github.com/suapapa/go_eddystone v1.3.1/go.mod h1:bXC11TfJOS+3g3q/Uzd7FKd5g62STQEfeEIhcKe4Qy8=
|
||||||
github.com/tinygo-org/cbgo v0.0.4 h1:3D76CRYbH03Rudi8sEgs/YO0x3JIMdyq8jlQtk/44fU=
|
github.com/tinygo-org/cbgo v0.0.4 h1:3D76CRYbH03Rudi8sEgs/YO0x3JIMdyq8jlQtk/44fU=
|
||||||
github.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk=
|
github.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk=
|
||||||
github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
|
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
||||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
@ -64,38 +54,24 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
|
golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
|
||||||
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
|
tinygo.org/x/drivers v0.26.1-0.20230922160320-ed51435c2ef6 h1:w18u47MirULgAl+bP0piUGu5VUZDs7TvXwHASEVXqHk=
|
||||||
tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
|
tinygo.org/x/drivers v0.26.1-0.20230922160320-ed51435c2ef6/go.mod h1:X7utcg3yfFUFuKLOMTZD56eztXMjpkcf8OHldfTBsjw=
|
||||||
tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
|
|
||||||
tinygo.org/x/drivers v0.19.0/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI=
|
|
||||||
tinygo.org/x/drivers v0.25.0 h1:MFnec5lY8Sxk1bIfqQWsflIbxcpAFbohWhg/qZ7psdM=
|
|
||||||
tinygo.org/x/drivers v0.25.0/go.mod h1:v+mXaA4cgpz/YZJ3ZPm/86bYQJAXTaYtMkHlVwbodbw=
|
|
||||||
tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM=
|
|
||||||
tinygo.org/x/tinyfont v0.3.0/go.mod h1:+TV5q0KpwSGRWnN+ITijsIhrWYJkoUCp9MYELjKpAXk=
|
|
||||||
tinygo.org/x/tinyfont v0.4.0 h1:XexPKEKiHInf6p4CMCJwsIheVPY0T46HUs6ictYyZfE=
|
tinygo.org/x/tinyfont v0.4.0 h1:XexPKEKiHInf6p4CMCJwsIheVPY0T46HUs6ictYyZfE=
|
||||||
tinygo.org/x/tinyfont v0.4.0/go.mod h1:7nVj3j3geqBoPDzpFukAhF1C8AP9YocMsZy0HSAcGCA=
|
tinygo.org/x/tinyfont v0.4.0/go.mod h1:7nVj3j3geqBoPDzpFukAhF1C8AP9YocMsZy0HSAcGCA=
|
||||||
tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20=
|
|
||||||
tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4=
|
|
||||||
tinygo.org/x/tinyterm v0.3.0 h1:4MMZoMyrbWbjru1KP/Z2TGhaguy/Uh5Mdhf/niemM8c=
|
tinygo.org/x/tinyterm v0.3.0 h1:4MMZoMyrbWbjru1KP/Z2TGhaguy/Uh5Mdhf/niemM8c=
|
||||||
tinygo.org/x/tinyterm v0.3.0/go.mod h1:F1pQjxEwNZQIc5czeJSBtk57ucEvbR4u7vHaLhWhHtg=
|
tinygo.org/x/tinyterm v0.3.0/go.mod h1:F1pQjxEwNZQIc5czeJSBtk57ucEvbR4u7vHaLhWhHtg=
|
||||||
|
|
|
@ -10,9 +10,9 @@ import "unsafe"
|
||||||
|
|
||||||
type shortUUID C.ble_uuid_t
|
type shortUUID C.ble_uuid_t
|
||||||
|
|
||||||
func (uuid UUID) shortUUID() (C.ble_uuid_t, uint32) {
|
func (uuid UUID) shortUUID() (C.ble_uuid_t, C.uint32_t) {
|
||||||
var short C.ble_uuid_t
|
var short C.ble_uuid_t
|
||||||
short.uuid = uint16(uuid[3])
|
short.uuid = C.uint16_t(uuid[3])
|
||||||
if uuid.Is16Bit() {
|
if uuid.Is16Bit() {
|
||||||
short._type = C.BLE_UUID_TYPE_BLE
|
short._type = C.BLE_UUID_TYPE_BLE
|
||||||
return short, 0
|
return short, 0
|
||||||
|
@ -24,7 +24,7 @@ func (uuid UUID) shortUUID() (C.ble_uuid_t, uint32) {
|
||||||
// UUID returns the full length UUID for this short UUID.
|
// UUID returns the full length UUID for this short UUID.
|
||||||
func (s shortUUID) UUID() UUID {
|
func (s shortUUID) UUID() UUID {
|
||||||
if s._type == C.BLE_UUID_TYPE_BLE {
|
if s._type == C.BLE_UUID_TYPE_BLE {
|
||||||
return New16BitUUID(s.uuid)
|
return New16BitUUID(uint16(s.uuid))
|
||||||
}
|
}
|
||||||
var outLen C.uint8_t
|
var outLen C.uint8_t
|
||||||
var outUUID UUID
|
var outUUID UUID
|
||||||
|
|
Loading…
Reference in a new issue