Kris Scholte Lubberink
/
SSS_Ble
Ble for smart sOlutions
source/BleDeviceCentral.h@9:92d861703f96, 2019-06-11 (annotated)
- Committer:
- kris@kris-X682X
- Date:
- Tue Jun 11 11:16:55 2019 +0200
- Revision:
- 9:92d861703f96
- Parent:
- 8:369b80cef5ae
- Child:
- 10:d845189d146e
WS2812 working
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kris@kris-X682X | 6:ee9c86f06eae | 1 | // |
kris@kris-X682X | 6:ee9c86f06eae | 2 | // Created by kris on 20-4-19. |
kris@kris-X682X | 6:ee9c86f06eae | 3 | // |
kris@kris-X682X | 6:ee9c86f06eae | 4 | |
kris@kris-X682X | 6:ee9c86f06eae | 5 | #ifndef SSS_BLE_BLEDEVICECENTRAL_H |
kris@kris-X682X | 6:ee9c86f06eae | 6 | #define SSS_BLE_BLEDEVICECENTRAL_H |
kris@kris-X682X | 6:ee9c86f06eae | 7 | |
kris@kris-X682X | 6:ee9c86f06eae | 8 | #include <AdvertisingDataParser.h> |
kris@kris-X682X | 6:ee9c86f06eae | 9 | #include "BleDevice.h" |
kris@kris-X682X | 8:369b80cef5ae | 10 | |
kris@kris-X682X | 8:369b80cef5ae | 11 | |
kris@kris-X682X | 6:ee9c86f06eae | 12 | #include "list" |
kris@kris-X682X | 6:ee9c86f06eae | 13 | class BleDeviceCentral : public BleDevice { |
kris@kris-X682X | 6:ee9c86f06eae | 14 | public: |
kris@kris-X682X | 6:ee9c86f06eae | 15 | BleDeviceCentral(BLE &ble, events::EventQueue &event_queue) |
kris@kris-X682X | 9:92d861703f96 | 16 | : BleDevice(ble, event_queue) { |
kris@kris-X682X | 9:92d861703f96 | 17 | |
kris@kris-X682X | 9:92d861703f96 | 18 | } |
kris@kris-X682X | 6:ee9c86f06eae | 19 | std::list<ble::address_t::byte_array_t> addresses ; |
kris@kris-X682X | 6:ee9c86f06eae | 20 | |
kris@kris-X682X | 6:ee9c86f06eae | 21 | virtual void start() |
kris@kris-X682X | 6:ee9c86f06eae | 22 | { |
kris@kris-X682X | 8:369b80cef5ae | 23 | printf("[CENTRAL]\t Scan started\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 24 | ble::ScanParameters params; |
kris@kris-X682X | 6:ee9c86f06eae | 25 | ble_error_t error = _ble.gap().setScanParameters(params); |
kris@kris-X682X | 6:ee9c86f06eae | 26 | |
kris@kris-X682X | 6:ee9c86f06eae | 27 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 28 | print_error(error, "Error in Gap::startScan %d\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 29 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 30 | } |
kris@kris-X682X | 6:ee9c86f06eae | 31 | // |
kris@kris-X682X | 6:ee9c86f06eae | 32 | // /* start scanning, results will be handled by onAdvertisingReport */ |
kris@kris-X682X | 6:ee9c86f06eae | 33 | error = _ble.gap().startScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 34 | |
kris@kris-X682X | 6:ee9c86f06eae | 35 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 36 | print_error(error, "Error in Gap::startScan %d\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 37 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 38 | } |
kris@kris-X682X | 8:369b80cef5ae | 39 | |
kris@kris-X682X | 6:ee9c86f06eae | 40 | } |
kris@kris-X682X | 6:ee9c86f06eae | 41 | virtual void stop(){ |
kris@kris-X682X | 6:ee9c86f06eae | 42 | printf("[CENTRAL]\t Stopping \r\n"); |
kris@kris-X682X | 8:369b80cef5ae | 43 | |
kris@kris-X682X | 8:369b80cef5ae | 44 | |
kris@kris-X682X | 6:ee9c86f06eae | 45 | addresses.clear(); |
kris@kris-X682X | 6:ee9c86f06eae | 46 | _ble.gap().stopScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 47 | if (_ble.hasInitialized()) { |
kris@kris-X682X | 6:ee9c86f06eae | 48 | _ble.shutdown(); |
kris@kris-X682X | 6:ee9c86f06eae | 49 | } |
kris@kris-X682X | 6:ee9c86f06eae | 50 | } |
kris@kris-X682X | 6:ee9c86f06eae | 51 | |
kris@kris-X682X | 8:369b80cef5ae | 52 | public: |
kris@kris-X682X | 8:369b80cef5ae | 53 | |
kris@kris-X682X | 6:ee9c86f06eae | 54 | |
kris@kris-X682X | 9:92d861703f96 | 55 | |
kris@kris-X682X | 6:ee9c86f06eae | 56 | /** Look at scan payload to find a peer device and connect to it */ |
kris@kris-X682X | 9:92d861703f96 | 57 | virtual void onAdvertisingReport(const ble::AdvertisingReportEvent &event) { |
kris@kris-X682X | 6:ee9c86f06eae | 58 | /* don't bother with analysing scan result if we're already connecting */ |
kris@kris-X682X | 6:ee9c86f06eae | 59 | if (_is_connecting) { |
kris@kris-X682X | 6:ee9c86f06eae | 60 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 61 | } |
kris@kris-X682X | 6:ee9c86f06eae | 62 | bool found = false; |
kris@kris-X682X | 6:ee9c86f06eae | 63 | ble::address_t::byte_array_t actualdata = event.getPeerAddress().data(); |
kris@kris-X682X | 6:ee9c86f06eae | 64 | |
kris@kris-X682X | 6:ee9c86f06eae | 65 | //TODO: Start service discovery. |
kris@kris-X682X | 6:ee9c86f06eae | 66 | ble::AdvertisingDataParser adv_data(event.getPayload()); |
kris@kris-X682X | 6:ee9c86f06eae | 67 | while (adv_data.hasNext()) { |
kris@kris-X682X | 8:369b80cef5ae | 68 | if (addresses.size() > 0) { |
kris@kris-X682X | 8:369b80cef5ae | 69 | found = (std::find(addresses.begin(), addresses.end(), actualdata) != addresses.end()); |
kris@kris-X682X | 8:369b80cef5ae | 70 | } |
kris@kris-X682X | 8:369b80cef5ae | 71 | |
kris@kris-X682X | 8:369b80cef5ae | 72 | if (!found) { |
kris@kris-X682X | 8:369b80cef5ae | 73 | //TODO: Clear the list to prevent memory overflow |
kris@kris-X682X | 8:369b80cef5ae | 74 | addresses.push_back(actualdata); |
kris@kris-X682X | 8:369b80cef5ae | 75 | printf("\r\n Amount devices: %d \r\n", addresses.size()); |
kris@kris-X682X | 8:369b80cef5ae | 76 | return; |
kris@kris-X682X | 8:369b80cef5ae | 77 | } else { |
kris@kris-X682X | 8:369b80cef5ae | 78 | // TODO: Increment internal counter |
kris@kris-X682X | 8:369b80cef5ae | 79 | } |
kris@kris-X682X | 6:ee9c86f06eae | 80 | // printf("\n\t\t Has next"); |
kris@kris-X682X | 6:ee9c86f06eae | 81 | ble::AdvertisingDataParser::element_t field = adv_data.next(); |
kris@kris-X682X | 6:ee9c86f06eae | 82 | |
kris@kris-X682X | 6:ee9c86f06eae | 83 | /* connect to a discoverable device */ |
kris@kris-X682X | 6:ee9c86f06eae | 84 | //Deze if-statement kijkt naar de naam en MEMCMP vergelijkt de advertising-naam met de target-naam (sssble) |
kris@kris-X682X | 6:ee9c86f06eae | 85 | //Als het SSS BLE is, moet ik dus de services gaan ontdekken en de interest-service uitlezen. Dit is altijd een array van 5 bytes, allemaal |
kris@kris-X682X | 6:ee9c86f06eae | 86 | /*if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME && |
kris@kris-X682X | 6:ee9c86f06eae | 87 | field.value.size() == strlen("SSS BLE") && |
kris@kris-X682X | 6:ee9c86f06eae | 88 | (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {*/ |
kris@kris-X682X | 8:369b80cef5ae | 89 | if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME) { |
kris@kris-X682X | 6:ee9c86f06eae | 90 | if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME && |
kris@kris-X682X | 6:ee9c86f06eae | 91 | field.value.size() == strlen("SSS BLE") && |
kris@kris-X682X | 6:ee9c86f06eae | 92 | (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) { |
kris@kris-X682X | 9:92d861703f96 | 93 | printf("[CENTRAL]\t Found another wearable, let's try connecting to him.\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 94 | |
kris@kris-X682X | 6:ee9c86f06eae | 95 | |
kris@kris-X682X | 6:ee9c86f06eae | 96 | ble_error_t error = _ble.gap().stopScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 97 | |
kris@kris-X682X | 6:ee9c86f06eae | 98 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 99 | print_error(error, "Error caused by Gap::stopScan"); |
kris@kris-X682X | 6:ee9c86f06eae | 100 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 101 | } |
kris@kris-X682X | 9:92d861703f96 | 102 | printf("[CENTRAL]\t Stopped the scan.\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 103 | |
kris@kris-X682X | 6:ee9c86f06eae | 104 | const ble::ConnectionParameters connection_params; |
kris@kris-X682X | 6:ee9c86f06eae | 105 | |
kris@kris-X682X | 9:92d861703f96 | 106 | printf("[CENTRAL]\t Trying to connect.\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 107 | |
kris@kris-X682X | 6:ee9c86f06eae | 108 | error = _ble.gap().connect( |
kris@kris-X682X | 6:ee9c86f06eae | 109 | event.getPeerAddressType(), |
kris@kris-X682X | 6:ee9c86f06eae | 110 | event.getPeerAddress(), |
kris@kris-X682X | 6:ee9c86f06eae | 111 | connection_params |
kris@kris-X682X | 6:ee9c86f06eae | 112 | ); |
kris@kris-X682X | 9:92d861703f96 | 113 | printf("[CENTRAL]\t Trying to connect..\r\n"); |
kris@kris-X682X | 6:ee9c86f06eae | 114 | |
kris@kris-X682X | 6:ee9c86f06eae | 115 | if (error) { |
kris@kris-X682X | 6:ee9c86f06eae | 116 | _ble.gap().startScan(); |
kris@kris-X682X | 6:ee9c86f06eae | 117 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 118 | } |
kris@kris-X682X | 9:92d861703f96 | 119 | printf("[CENTRAL]\t Looks like I'm connected...\r\n"); |
kris@kris-X682X | 9:92d861703f96 | 120 | //TODO: Break the event queue, but keep doing what im doing |
kris@kris-X682X | 9:92d861703f96 | 121 | _event_queue.dispatch_forever(); |
kris@kris-X682X | 6:ee9c86f06eae | 122 | } |
kris@kris-X682X | 6:ee9c86f06eae | 123 | |
kris@kris-X682X | 6:ee9c86f06eae | 124 | char test[field.value.size()]; |
kris@kris-X682X | 6:ee9c86f06eae | 125 | memcpy(test, field.value.data(), field.value.size()); |
kris@kris-X682X | 6:ee9c86f06eae | 126 | |
kris@kris-X682X | 6:ee9c86f06eae | 127 | printf("\n\t\t Adv from: "); |
kris@kris-X682X | 6:ee9c86f06eae | 128 | printf("%s", test); |
kris@kris-X682X | 6:ee9c86f06eae | 129 | printf(" rssi: %d, scan response: %u, connectable: %u\r\n", |
kris@kris-X682X | 6:ee9c86f06eae | 130 | event.getRssi(), event.getType().scan_response(), event.getType().connectable()); |
kris@kris-X682X | 6:ee9c86f06eae | 131 | |
kris@kris-X682X | 6:ee9c86f06eae | 132 | |
kris@kris-X682X | 6:ee9c86f06eae | 133 | /* we may have already scan events waiting |
kris@kris-X682X | 6:ee9c86f06eae | 134 | * to be processed so we need to remember |
kris@kris-X682X | 6:ee9c86f06eae | 135 | * that we are already connecting and ignore them */ |
kris@kris-X682X | 6:ee9c86f06eae | 136 | // _is_connecting = true; |
kris@kris-X682X | 6:ee9c86f06eae | 137 | |
kris@kris-X682X | 6:ee9c86f06eae | 138 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 139 | } |
kris@kris-X682X | 6:ee9c86f06eae | 140 | } |
kris@kris-X682X | 6:ee9c86f06eae | 141 | |
kris@kris-X682X | 6:ee9c86f06eae | 142 | } |
kris@kris-X682X | 6:ee9c86f06eae | 143 | }; |
kris@kris-X682X | 6:ee9c86f06eae | 144 | |
kris@kris-X682X | 6:ee9c86f06eae | 145 | |
kris@kris-X682X | 6:ee9c86f06eae | 146 | #endif //SSS_BLE_BLEDEVICECENTRAL_H |