2 #include <platform/CHIPDeviceLayer.h>
3 #include <platform/Linux/bluez/AdapterIterator.h>
4 #include <platform/Linux/bluez/MainLoop.h>
5 #include <platform/internal/BLEManager.h>
6 #include <support/CHIPMem.h>
8 using namespace chip::DeviceLayer::Internal;
10 /////////// Listing adapters implementation //////////
12 extern "C" void * pychip_ble_adapter_list_new()
14 return static_cast<void *>(new AdapterIterator());
17 extern "C" void pychip_ble_adapter_list_delete(void * adapterIterator)
19 delete static_cast<AdapterIterator *>(adapterIterator);
22 extern "C" bool pychip_ble_adapter_list_next(void * adapterIterator)
24 return static_cast<AdapterIterator *>(adapterIterator)->Next();
27 extern "C" uint32_t pychip_ble_adapter_list_get_index(void * adapterIterator)
29 return static_cast<AdapterIterator *>(adapterIterator)->GetIndex();
32 extern "C" const char * pychip_ble_adapter_list_get_address(void * adapterIterator)
34 return static_cast<AdapterIterator *>(adapterIterator)->GetAddress();
37 extern "C" const char * pychip_ble_adapter_list_get_alias(void * adapterIterator)
39 return static_cast<AdapterIterator *>(adapterIterator)->GetAlias();
42 extern "C" const char * pychip_ble_adapter_list_get_name(void * adapterIterator)
44 return static_cast<AdapterIterator *>(adapterIterator)->GetName();
47 extern "C" bool pychip_ble_adapter_list_is_powered(void * adapterIterator)
49 return static_cast<AdapterIterator *>(adapterIterator)->IsPowered();
52 extern "C" void * pychip_ble_adapter_list_get_raw_adapter(void * adapterIterator)
54 return static_cast<AdapterIterator *>(adapterIterator)->GetAdapter();
57 /////////// CHIP Device scanner implementation //////////
61 // To avoid pythoon compatibility issues on inc/dec references,
62 // code assumes an abstract type and leaves it up to python to keep track of
66 class ScannerDelegateImpl : public ChipDeviceScannerDelegate
69 using DeviceScannedCallback = void (*)(PyObject * context, const char * address, uint16_t discriminator, uint16_t vendorId,
71 using ScanCompleteCallback = void (*)(PyObject * context);
73 ScannerDelegateImpl(PyObject * context, DeviceScannedCallback scanCallback, ScanCompleteCallback completeCallback) :
74 mContext(context), mScanCallback(scanCallback), mCompleteCallback(completeCallback)
77 void SetScanner(std::unique_ptr<ChipDeviceScanner> scanner) { mScanner = std::move(scanner); }
79 void OnDeviceScanned(BluezDevice1 * device, const chip::Ble::ChipBLEDeviceIdentificationInfo & info) override
83 mScanCallback(mContext, bluez_device1_get_address(device), info.GetDeviceDiscriminator(), info.GetProductId(),
88 void OnScanComplete() override
90 if (mCompleteCallback)
92 mCompleteCallback(mContext);
99 std::unique_ptr<ChipDeviceScanner> mScanner;
100 PyObject * const mContext;
101 const DeviceScannedCallback mScanCallback;
102 const ScanCompleteCallback mCompleteCallback;
107 extern "C" void * pychip_ble_start_scanning(PyObject * context, void * adapter, uint32_t timeout,
108 ScannerDelegateImpl::DeviceScannedCallback scanCallback,
109 ScannerDelegateImpl::ScanCompleteCallback completeCallback)
111 std::unique_ptr<ScannerDelegateImpl> delegate = std::make_unique<ScannerDelegateImpl>(context, scanCallback, completeCallback);
113 std::unique_ptr<ChipDeviceScanner> scanner = ChipDeviceScanner::Create(static_cast<BluezAdapter1 *>(adapter), delegate.get());
120 if (scanner->StartScan(timeout) != CHIP_NO_ERROR)
125 delegate->SetScanner(std::move(scanner));
127 return delegate.release();