Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Tue May 21 13:57:27 2019 +0200
Revision:
8:369b80cef5ae
Parent:
7:9cda1b0f25ae
Child:
9:92d861703f96
Removed WS2801

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 6:ee9c86f06eae 16 : BleDevice(ble, event_queue) {}
kris@kris-X682X 6:ee9c86f06eae 17 std::list<ble::address_t::byte_array_t> addresses ;
kris@kris-X682X 6:ee9c86f06eae 18
kris@kris-X682X 6:ee9c86f06eae 19 virtual void start()
kris@kris-X682X 6:ee9c86f06eae 20 {
kris@kris-X682X 8:369b80cef5ae 21 printf("[CENTRAL]\t Scan started\r\n");
kris@kris-X682X 6:ee9c86f06eae 22 ble::ScanParameters params;
kris@kris-X682X 6:ee9c86f06eae 23 ble_error_t error = _ble.gap().setScanParameters(params);
kris@kris-X682X 6:ee9c86f06eae 24
kris@kris-X682X 6:ee9c86f06eae 25 if (error) {
kris@kris-X682X 6:ee9c86f06eae 26 print_error(error, "Error in Gap::startScan %d\r\n");
kris@kris-X682X 6:ee9c86f06eae 27 return;
kris@kris-X682X 6:ee9c86f06eae 28 }
kris@kris-X682X 6:ee9c86f06eae 29 //
kris@kris-X682X 6:ee9c86f06eae 30 // /* start scanning, results will be handled by onAdvertisingReport */
kris@kris-X682X 6:ee9c86f06eae 31 error = _ble.gap().startScan();
kris@kris-X682X 6:ee9c86f06eae 32
kris@kris-X682X 6:ee9c86f06eae 33 if (error) {
kris@kris-X682X 6:ee9c86f06eae 34 print_error(error, "Error in Gap::startScan %d\r\n");
kris@kris-X682X 6:ee9c86f06eae 35 return;
kris@kris-X682X 6:ee9c86f06eae 36 }
kris@kris-X682X 8:369b80cef5ae 37
kris@kris-X682X 6:ee9c86f06eae 38 }
kris@kris-X682X 6:ee9c86f06eae 39 virtual void stop(){
kris@kris-X682X 6:ee9c86f06eae 40 printf("[CENTRAL]\t Stopping \r\n");
kris@kris-X682X 8:369b80cef5ae 41
kris@kris-X682X 8:369b80cef5ae 42
kris@kris-X682X 6:ee9c86f06eae 43 addresses.clear();
kris@kris-X682X 6:ee9c86f06eae 44 _ble.gap().stopScan();
kris@kris-X682X 6:ee9c86f06eae 45 if (_ble.hasInitialized()) {
kris@kris-X682X 6:ee9c86f06eae 46 _ble.shutdown();
kris@kris-X682X 6:ee9c86f06eae 47 }
kris@kris-X682X 6:ee9c86f06eae 48 }
kris@kris-X682X 6:ee9c86f06eae 49
kris@kris-X682X 8:369b80cef5ae 50 public:
kris@kris-X682X 8:369b80cef5ae 51
kris@kris-X682X 6:ee9c86f06eae 52
kris@kris-X682X 6:ee9c86f06eae 53 /** Look at scan payload to find a peer device and connect to it */
kris@kris-X682X 8:369b80cef5ae 54 virtual void onAdvertisingReport(const ble::AdvertisingReportEvent &event) {
kris@kris-X682X 6:ee9c86f06eae 55 /* don't bother with analysing scan result if we're already connecting */
kris@kris-X682X 6:ee9c86f06eae 56 if (_is_connecting) {
kris@kris-X682X 6:ee9c86f06eae 57 return;
kris@kris-X682X 6:ee9c86f06eae 58 }
kris@kris-X682X 6:ee9c86f06eae 59 // printf("found someone ");
kris@kris-X682X 6:ee9c86f06eae 60 /* parse the advertising payload, looking for a discoverable device */
kris@kris-X682X 6:ee9c86f06eae 61 //TODO: Hier checken ofhet een andere SSS wearable is. Zo niet, gewoon tellen.
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 8:369b80cef5ae 93 printf("[PERIPHERAL]\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 8:369b80cef5ae 102 printf("[PERIPHERAL]\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 8:369b80cef5ae 106 printf("[PERIPHERAL]\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 8:369b80cef5ae 113 printf("[PERIPHERAL]\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 8:369b80cef5ae 119 printf("[PERIPHERAL]\t Trying to connect...\r\n");
kris@kris-X682X 6:ee9c86f06eae 120
kris@kris-X682X 6:ee9c86f06eae 121 }
kris@kris-X682X 6:ee9c86f06eae 122
kris@kris-X682X 6:ee9c86f06eae 123 char test[field.value.size()];
kris@kris-X682X 6:ee9c86f06eae 124 memcpy(test, field.value.data(), field.value.size());
kris@kris-X682X 6:ee9c86f06eae 125
kris@kris-X682X 6:ee9c86f06eae 126 printf("\n\t\t Adv from: ");
kris@kris-X682X 6:ee9c86f06eae 127 printf("%s", test);
kris@kris-X682X 6:ee9c86f06eae 128 printf(" rssi: %d, scan response: %u, connectable: %u\r\n",
kris@kris-X682X 6:ee9c86f06eae 129 event.getRssi(), event.getType().scan_response(), event.getType().connectable());
kris@kris-X682X 6:ee9c86f06eae 130
kris@kris-X682X 6:ee9c86f06eae 131
kris@kris-X682X 6:ee9c86f06eae 132 /* we may have already scan events waiting
kris@kris-X682X 6:ee9c86f06eae 133 * to be processed so we need to remember
kris@kris-X682X 6:ee9c86f06eae 134 * that we are already connecting and ignore them */
kris@kris-X682X 6:ee9c86f06eae 135 // _is_connecting = true;
kris@kris-X682X 6:ee9c86f06eae 136
kris@kris-X682X 6:ee9c86f06eae 137 return;
kris@kris-X682X 6:ee9c86f06eae 138 }
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 #endif //SSS_BLE_BLEDEVICECENTRAL_H