1 #include <support/CHIPMem.h>
2 #include <support/logging/CHIPLogging.h>
4 #import <CoreBluetooth/CoreBluetooth.h>
6 /// MAC does not have specific adapters
7 @interface FakeBleAdapterInformation : NSObject <CBCentralManagerDelegate>
8 @property (strong, nonatomic) dispatch_queue_t workQueue;
9 @property (strong, nonatomic) CBCentralManager * centralManager;
10 @property (nonatomic) bool advanced;
11 @property (nonatomic) bool hasStatus;
12 @property (assign, nonatomic) dispatch_semaphore_t statusSemaphore;
19 @implementation FakeBleAdapterInformation
27 _workQueue = dispatch_queue_create("com.chip.python.ble.work_queue", DISPATCH_QUEUE_SERIAL);
28 _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:_workQueue];
29 _statusSemaphore = dispatch_semaphore_create(0);
36 if (!self.hasStatus) {
37 constexpr uint64_t kStateWaitTimeoutNs = 5 * 1000 * 1000 * 1000ll;
38 dispatch_semaphore_wait(self.statusSemaphore, dispatch_time(DISPATCH_TIME_NOW, kStateWaitTimeoutNs));
40 if (!self.hasStatus) {
41 ChipLogError(Ble, "Timeout waiting for central state update.");
44 return self.centralManager.state == CBManagerStatePoweredOn;
47 // Start CBCentralManagerDelegate
48 - (void)centralManagerDidUpdateState:(CBCentralManager *)central
50 switch (central.state) {
51 case CBManagerStatePoweredOn:
52 ChipLogDetail(Ble, "CBManagerState: ON");
54 case CBManagerStatePoweredOff:
55 ChipLogDetail(Ble, "CBManagerState: OFF");
57 case CBManagerStateUnauthorized:
58 ChipLogDetail(Ble, "CBManagerState: Unauthorized");
60 case CBManagerStateResetting:
61 ChipLogDetail(Ble, "CBManagerState: RESETTING");
63 case CBManagerStateUnsupported:
64 ChipLogDetail(Ble, "CBManagerState: UNSUPPORTED");
66 case CBManagerStateUnknown:
67 ChipLogDetail(Ble, "CBManagerState: UNKNOWN");
70 self.hasStatus = true;
71 dispatch_semaphore_signal(self.statusSemaphore);
74 - (void)centralManager:(CBCentralManager *)central
75 didDiscoverPeripheral:(CBPeripheral *)peripheral
76 advertisementData:(NSDictionary *)advertisementData
81 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
87 extern "C" void * pychip_ble_adapter_list_new() { return static_cast<void *>([[FakeBleAdapterInformation alloc] init]); }
89 extern "C" void pychip_ble_adapter_list_delete(FakeBleAdapterInformation * adapterIterator) { [adapterIterator release]; }
91 extern "C" bool pychip_ble_adapter_list_next(FakeBleAdapterInformation * adapterIterator)
93 if (!adapterIterator.advanced) {
94 adapterIterator.advanced = true;
100 extern "C" uint32_t pychip_ble_adapter_list_get_index(FakeBleAdapterInformation * adapterIterator) { return 0; }
102 extern "C" const char * pychip_ble_adapter_list_get_address(FakeBleAdapterInformation * adapterIterator)
104 return "NOT_IMPLEMENTED";
107 extern "C" const char * pychip_ble_adapter_list_get_alias(FakeBleAdapterInformation * adapterIterator) { return "DarwinBLE"; }
109 extern "C" const char * pychip_ble_adapter_list_get_name(FakeBleAdapterInformation * adapterIterator) { return "DarwinBLE"; }
111 extern "C" bool pychip_ble_adapter_list_is_powered(FakeBleAdapterInformation * adapterIterator)
113 return [adapterIterator isPoweredOn];
116 extern "C" void * pychip_ble_adapter_list_get_raw_adapter(FakeBleAdapterInformation * adapterIterator)
118 return static_cast<void *>(adapterIterator);