fermentord/vendor/github.com/JuulLabs-OSS/cbgo/peripheralmanager.go

147 lines
4.9 KiB
Go
Raw Normal View History

package cbgo
/*
// See cutil.go for C compiler flags.
#import "bt.h"
*/
import "C"
import (
"unsafe"
)
// PeripheralManagerConnectionLatency: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanagerconnectionlatency
type PeripheralManagerConnectionLatency int
const (
PeripheralManagerConnectionLatencyLow = PeripheralManagerConnectionLatency(C.CBPeripheralManagerConnectionLatencyLow)
PeripheralManagerConnectionLatencyMedium = PeripheralManagerConnectionLatency(C.CBPeripheralManagerConnectionLatencyMedium)
PeripheralManagerConnectionLatencyHigh = PeripheralManagerConnectionLatency(C.CBPeripheralManagerConnectionLatencyHigh)
)
// PeripheralManagerRestoreOpts: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanagerdelegate/peripheral_manager_state_restoration_options
type PeripheralManagerRestoreOpts struct {
Services []MutableService
AdvertisementData *AdvData
}
// PeripheralManager: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager
type PeripheralManager struct {
ptr unsafe.Pointer
}
var pmgrPtrMap = newPtrMap()
func findPeripheralManagerDlg(ptr unsafe.Pointer) PeripheralManagerDelegate {
itf := pmgrPtrMap.find(ptr)
if itf == nil {
return nil
}
return itf.(PeripheralManagerDelegate)
}
// NewPeripheralManager creates a peripheral manager. Specify a nil `opts`
// value for defaults. Don't forget to call `SetDelegate()` afterwards!
func NewPeripheralManager(opts *ManagerOpts) PeripheralManager {
if opts == nil {
opts = &DfltManagerOpts
}
pwrAlert := C.bool(opts.ShowPowerAlert)
restoreID := (*C.char)(nil)
if opts.RestoreIdentifier != "" {
restoreID = C.CString(opts.RestoreIdentifier)
defer C.free(unsafe.Pointer(restoreID))
}
return PeripheralManager{
ptr: unsafe.Pointer(C.cb_alloc_pmgr(pwrAlert, restoreID)),
}
}
// SetDelegate configures a receiver for a central manager's asynchronous
// callbacks.
func (pm PeripheralManager) SetDelegate(d PeripheralManagerDelegate) {
if d != nil {
pmgrPtrMap.add(pm.ptr, d)
}
C.cb_pmgr_set_delegate(pm.ptr, C.bool(d != nil))
}
// State: https://developer.apple.com/documentation/corebluetooth/cbmanager/1648600-state
func (pm PeripheralManager) State() ManagerState {
return ManagerState(C.cb_pmgr_state(pm.ptr))
}
// AddService: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393255-addservice
func (pm PeripheralManager) AddService(svc MutableService) {
C.cb_pmgr_add_svc(pm.ptr, svc.ptr)
}
// RemoveService: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393287-removeservice
func (pm PeripheralManager) RemoveService(svc MutableService) {
C.cb_pmgr_remove_svc(pm.ptr, svc.ptr)
}
// RemoveAllServices: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393269-removeallservices
func (pm PeripheralManager) RemoveAllServices() {
C.cb_pmgr_remove_all_svcs(pm.ptr)
}
// StartAdvertising: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393252-startadvertising
func (pm PeripheralManager) StartAdvertising(ad AdvData) {
cad := C.struct_adv_data{}
if len(ad.IBeaconData) > 0 {
cad.ibeacon_data = byteSliceToByteArr(ad.IBeaconData)
defer C.free(unsafe.Pointer(cad.ibeacon_data.data))
} else {
if len(ad.LocalName) > 0 {
cad.name = C.CString(ad.LocalName)
defer C.free(unsafe.Pointer(cad.name))
}
cad.svc_uuids = uuidsToStrArr(ad.ServiceUUIDs)
defer freeStrArr(&cad.svc_uuids)
}
C.cb_pmgr_start_adv(pm.ptr, &cad)
}
// StopAdvertising: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393275-stopadvertising
func (pm PeripheralManager) StopAdvertising() {
C.cb_pmgr_stop_adv(pm.ptr)
}
// IsAdvertising: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393291-isadvertising
func (pm PeripheralManager) IsAdvertising() bool {
return bool(C.cb_pmgr_is_adv(pm.ptr))
}
// UpdateValue: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393281-updatevalue
func (pm PeripheralManager) UpdateValue(value []byte, chr Characteristic, centrals []Central) bool {
ba := byteSliceToByteArr(value)
defer C.free(unsafe.Pointer(ba.data))
oa := mallocObjArr(len(centrals))
defer C.free(unsafe.Pointer(oa.objs))
for i, c := range centrals {
setObjArrElem(&oa, i, c.ptr)
}
return bool(C.cb_pmgr_update_val(pm.ptr, &ba, chr.ptr, &oa))
}
// RespondToRequest: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393293-respondtorequest
func (pm PeripheralManager) RespondToRequest(req ATTRequest, result ATTError) {
C.cb_pmgr_respond_to_req(pm.ptr, req.ptr, C.int(result))
}
// SetDesiredConnectionLatency: https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393277-setdesiredconnectionlatency
func (pm PeripheralManager) SetDesiredConnectionLatency(latency PeripheralManagerConnectionLatency, central Central) {
C.cb_pmgr_set_conn_latency(pm.ptr, C.int(latency), central.ptr)
}