Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

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?

UserRevisionLine numberNew 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