155 lines
5.2 KiB
Go
155 lines
5.2 KiB
Go
|
package cbgo
|
||
|
|
||
|
/*
|
||
|
// See cutil.go for C compiler flags.
|
||
|
#import "bt.h"
|
||
|
*/
|
||
|
import "C"
|
||
|
|
||
|
import (
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
// PeripheralState: https://developer.apple.com/documentation/corebluetooth/cbperipheralstate
|
||
|
type PeripheralState int
|
||
|
|
||
|
const (
|
||
|
PeripheralStateDisconnected = PeripheralState(C.CBPeripheralStateDisconnected)
|
||
|
PeripheralStateConnecting = PeripheralState(C.CBPeripheralStateConnecting)
|
||
|
PeripheralStateConnected = PeripheralState(C.CBPeripheralStateConnected)
|
||
|
PeripheralStateDisconnecting = PeripheralState(C.CBPeripheralStateDisconnecting)
|
||
|
)
|
||
|
|
||
|
var prphPtrMap = newPtrMap()
|
||
|
|
||
|
// Peripheral: https://developer.apple.com/documentation/corebluetooth/cbperipheral
|
||
|
type Peripheral struct {
|
||
|
ptr unsafe.Pointer
|
||
|
}
|
||
|
|
||
|
func findPeripheralDlg(ptr unsafe.Pointer) PeripheralDelegate {
|
||
|
itf := prphPtrMap.find(ptr)
|
||
|
if itf == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return itf.(PeripheralDelegate)
|
||
|
}
|
||
|
|
||
|
func addPeripheralDlg(ptr unsafe.Pointer, dlg PeripheralDelegate) {
|
||
|
prphPtrMap.add(ptr, dlg)
|
||
|
}
|
||
|
|
||
|
// Identifier: https://developer.apple.com/documentation/corebluetooth/cbpeer/1620687-identifier
|
||
|
func (p Peripheral) Identifier() UUID {
|
||
|
cstr := C.cb_peer_identifier(p.ptr)
|
||
|
return MustParseUUID(C.GoString(cstr))
|
||
|
}
|
||
|
|
||
|
// Name: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519029-name
|
||
|
func (p Peripheral) Name() string {
|
||
|
cstr := C.cb_prph_name(p.ptr)
|
||
|
return C.GoString(cstr)
|
||
|
}
|
||
|
|
||
|
// SetDelegate: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518730-delegate
|
||
|
func (p Peripheral) SetDelegate(dlg PeripheralDelegate) {
|
||
|
addPeripheralDlg(p.ptr, dlg)
|
||
|
C.cb_prph_set_delegate(p.ptr, C.bool(dlg != nil))
|
||
|
}
|
||
|
|
||
|
// DiscoverServices: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518706-discoverservices
|
||
|
func (p Peripheral) DiscoverServices(svcUUIDs []UUID) {
|
||
|
arr := uuidsToStrArr(svcUUIDs)
|
||
|
defer freeStrArr(&arr)
|
||
|
|
||
|
C.cb_prph_discover_svcs(p.ptr, &arr)
|
||
|
}
|
||
|
|
||
|
// DiscoverIncludedServices: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519014-discoverincludedservices
|
||
|
func (p Peripheral) DiscoverIncludedServices(svcUUIDs []UUID, svc Service) {
|
||
|
arr := uuidsToStrArr(svcUUIDs)
|
||
|
defer freeStrArr(&arr)
|
||
|
|
||
|
C.cb_prph_discover_included_svcs(p.ptr, &arr, svc.ptr)
|
||
|
}
|
||
|
|
||
|
// Services: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518978-services
|
||
|
func (p Peripheral) Services() []Service {
|
||
|
oa := C.cb_prph_services(p.ptr)
|
||
|
defer C.free(unsafe.Pointer(oa.objs))
|
||
|
|
||
|
svcs := make([]Service, oa.count)
|
||
|
for i, _ := range svcs {
|
||
|
obj := getObjArrElem(&oa, i)
|
||
|
svcs[i] = Service{ptr: obj}
|
||
|
}
|
||
|
|
||
|
return svcs
|
||
|
}
|
||
|
|
||
|
// DiscoverCharacteristics: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518797-discovercharacteristics
|
||
|
func (p Peripheral) DiscoverCharacteristics(chrUUIDs []UUID, svc Service) {
|
||
|
arr := uuidsToStrArr(chrUUIDs)
|
||
|
defer freeStrArr(&arr)
|
||
|
|
||
|
C.cb_prph_discover_chrs(p.ptr, svc.ptr, &arr)
|
||
|
}
|
||
|
|
||
|
// DiscoverDescriptors: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519070-discoverdescriptorsforcharacteri
|
||
|
func (p Peripheral) DiscoverDescriptors(chr Characteristic) {
|
||
|
C.cb_prph_discover_dscs(p.ptr, chr.ptr)
|
||
|
}
|
||
|
|
||
|
// ReadCharacteristic: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518759-readvalueforcharacteristic
|
||
|
func (p Peripheral) ReadCharacteristic(chr Characteristic) {
|
||
|
C.cb_prph_read_chr(p.ptr, chr.ptr)
|
||
|
}
|
||
|
|
||
|
// ReadDescriptor: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518789-readvaluefordescriptor
|
||
|
func (p Peripheral) ReadDescriptor(dsc Descriptor) {
|
||
|
C.cb_prph_read_dsc(p.ptr, dsc.ptr)
|
||
|
}
|
||
|
|
||
|
// WriteCharacteristic: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518747-writevalue
|
||
|
func (p Peripheral) WriteCharacteristic(data []byte, chr Characteristic, withRsp bool) {
|
||
|
ba := byteSliceToByteArr(data)
|
||
|
defer C.free(unsafe.Pointer(ba.data))
|
||
|
|
||
|
C.cb_prph_write_chr(p.ptr, chr.ptr, &ba, chrWriteType(withRsp))
|
||
|
}
|
||
|
|
||
|
// WriteDescriptor: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519107-writevalue
|
||
|
func (p Peripheral) WriteDescriptor(data []byte, dsc Descriptor) {
|
||
|
ba := byteSliceToByteArr(data)
|
||
|
defer C.free(unsafe.Pointer(ba.data))
|
||
|
|
||
|
C.cb_prph_write_dsc(p.ptr, dsc.ptr, &ba)
|
||
|
}
|
||
|
|
||
|
// MaximumWriteValueLength: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1620312-maximumwritevaluelengthfortype
|
||
|
func (p Peripheral) MaximumWriteValueLength(withRsp bool) int {
|
||
|
val := C.cb_prph_max_write_len(p.ptr, chrWriteType(withRsp))
|
||
|
return int(val)
|
||
|
}
|
||
|
|
||
|
// SetNotify: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518949-setnotifyvalue
|
||
|
func (p Peripheral) SetNotify(enabled bool, chr Characteristic) {
|
||
|
C.cb_prph_set_notify(p.ptr, C.bool(enabled), chr.ptr)
|
||
|
}
|
||
|
|
||
|
// PeripheralState: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519113-state
|
||
|
func (p Peripheral) State() PeripheralState {
|
||
|
return PeripheralState(C.cb_prph_state(p.ptr))
|
||
|
}
|
||
|
|
||
|
// CanSendWriteWithoutResponse: https://developer.apple.com/documentation/corebluetooth/cbperipheral/2891512-cansendwritewithoutresponse
|
||
|
func (p Peripheral) CanSendWriteWithoutResponse() bool {
|
||
|
return bool(C.cb_prph_can_send_write_without_rsp(p.ptr))
|
||
|
}
|
||
|
|
||
|
// ReadRSSI: https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519111-readrssi
|
||
|
func (p Peripheral) ReadRSSI() {
|
||
|
C.cb_prph_read_rssi(p.ptr)
|
||
|
}
|