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:
Ayke van Laethem 2023-09-22 17:48:50 +02:00 committed by Ron Evans
parent d0c7887b81
commit 01243181c3
14 changed files with 127 additions and 107 deletions

View file

@ -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
} }

View file

@ -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

View file

@ -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

View file

@ -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
} }

View file

@ -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]),
}
} }

View file

@ -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)
} }

View file

@ -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)

View file

@ -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, &params) errCode := C.sd_ble_gap_adv_set_configure(&a.handle, &data, &params)
return makeError(errCode) return makeError(errCode)

View file

@ -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
} }

View file

@ -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
} }

View file

@ -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
View file

@ -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
View file

@ -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=

View file

@ -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