Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / src / controller / python / chip / ble / darwin / AdapterListing.mm
1 #include <support/CHIPMem.h>
2 #include <support/logging/CHIPLogging.h>
3
4 #import <CoreBluetooth/CoreBluetooth.h>
5
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;
13
14 - (id)init;
15 - (bool)isPoweredOn;
16
17 @end
18
19 @implementation FakeBleAdapterInformation
20
21 - (id)init
22 {
23     self = [super init];
24     if (self) {
25         _advanced = false;
26         _hasStatus = false;
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);
30     }
31     return self;
32 }
33
34 - (bool)isPoweredOn
35 {
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));
39
40         if (!self.hasStatus) {
41             ChipLogError(Ble, "Timeout waiting for central state update.");
42         }
43     }
44     return self.centralManager.state == CBManagerStatePoweredOn;
45 }
46
47 // Start CBCentralManagerDelegate
48 - (void)centralManagerDidUpdateState:(CBCentralManager *)central
49 {
50     switch (central.state) {
51     case CBManagerStatePoweredOn:
52         ChipLogDetail(Ble, "CBManagerState: ON");
53         break;
54     case CBManagerStatePoweredOff:
55         ChipLogDetail(Ble, "CBManagerState: OFF");
56         break;
57     case CBManagerStateUnauthorized:
58         ChipLogDetail(Ble, "CBManagerState: Unauthorized");
59         break;
60     case CBManagerStateResetting:
61         ChipLogDetail(Ble, "CBManagerState: RESETTING");
62         break;
63     case CBManagerStateUnsupported:
64         ChipLogDetail(Ble, "CBManagerState: UNSUPPORTED");
65         break;
66     case CBManagerStateUnknown:
67         ChipLogDetail(Ble, "CBManagerState: UNKNOWN");
68         break;
69     }
70     self.hasStatus = true;
71     dispatch_semaphore_signal(self.statusSemaphore);
72 }
73
74 - (void)centralManager:(CBCentralManager *)central
75     didDiscoverPeripheral:(CBPeripheral *)peripheral
76         advertisementData:(NSDictionary *)advertisementData
77                      RSSI:(NSNumber *)RSSI
78 {
79 }
80
81 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
82 {
83 }
84
85 @end
86
87 extern "C" void * pychip_ble_adapter_list_new() { return static_cast<void *>([[FakeBleAdapterInformation alloc] init]); }
88
89 extern "C" void pychip_ble_adapter_list_delete(FakeBleAdapterInformation * adapterIterator) { [adapterIterator release]; }
90
91 extern "C" bool pychip_ble_adapter_list_next(FakeBleAdapterInformation * adapterIterator)
92 {
93     if (!adapterIterator.advanced) {
94         adapterIterator.advanced = true;
95         return true;
96     }
97     return false;
98 }
99
100 extern "C" uint32_t pychip_ble_adapter_list_get_index(FakeBleAdapterInformation * adapterIterator) { return 0; }
101
102 extern "C" const char * pychip_ble_adapter_list_get_address(FakeBleAdapterInformation * adapterIterator)
103 {
104     return "NOT_IMPLEMENTED";
105 }
106
107 extern "C" const char * pychip_ble_adapter_list_get_alias(FakeBleAdapterInformation * adapterIterator) { return "DarwinBLE"; }
108
109 extern "C" const char * pychip_ble_adapter_list_get_name(FakeBleAdapterInformation * adapterIterator) { return "DarwinBLE"; }
110
111 extern "C" bool pychip_ble_adapter_list_is_powered(FakeBleAdapterInformation * adapterIterator)
112 {
113     return [adapterIterator isPoweredOn];
114 }
115
116 extern "C" void * pychip_ble_adapter_list_get_raw_adapter(FakeBleAdapterInformation * adapterIterator)
117 {
118     return static_cast<void *>(adapterIterator);
119 }