Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Mon May 20 09:55:38 2019 +0200
Revision:
6:ee9c86f06eae
Child:
7:9cda1b0f25ae
WIP

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 6:ee9c86f06eae 10 #include "list"
kris@kris-X682X 6:ee9c86f06eae 11
kris@kris-X682X 6:ee9c86f06eae 12 class BleDeviceCentral : public BleDevice {
kris@kris-X682X 6:ee9c86f06eae 13 public:
kris@kris-X682X 6:ee9c86f06eae 14 BleDeviceCentral(BLE &ble, events::EventQueue &event_queue)
kris@kris-X682X 6:ee9c86f06eae 15 : BleDevice(ble, event_queue) {}
kris@kris-X682X 6:ee9c86f06eae 16 std::list<ble::address_t::byte_array_t> addresses ;
kris@kris-X682X 6:ee9c86f06eae 17
kris@kris-X682X 6:ee9c86f06eae 18 virtual void start()
kris@kris-X682X 6:ee9c86f06eae 19 {
kris@kris-X682X 6:ee9c86f06eae 20 ble::ScanParameters params;
kris@kris-X682X 6:ee9c86f06eae 21 ble_error_t error = _ble.gap().setScanParameters(params);
kris@kris-X682X 6:ee9c86f06eae 22
kris@kris-X682X 6:ee9c86f06eae 23 if (error) {
kris@kris-X682X 6:ee9c86f06eae 24 print_error(error, "Error in Gap::startScan %d\r\n");
kris@kris-X682X 6:ee9c86f06eae 25 return;
kris@kris-X682X 6:ee9c86f06eae 26 }
kris@kris-X682X 6:ee9c86f06eae 27 //
kris@kris-X682X 6:ee9c86f06eae 28 // /* start scanning, results will be handled by onAdvertisingReport */
kris@kris-X682X 6:ee9c86f06eae 29 error = _ble.gap().startScan();
kris@kris-X682X 6:ee9c86f06eae 30
kris@kris-X682X 6:ee9c86f06eae 31
kris@kris-X682X 6:ee9c86f06eae 32 if (error) {
kris@kris-X682X 6:ee9c86f06eae 33 print_error(error, "Error in Gap::startScan %d\r\n");
kris@kris-X682X 6:ee9c86f06eae 34 return;
kris@kris-X682X 6:ee9c86f06eae 35 }
kris@kris-X682X 6:ee9c86f06eae 36 }
kris@kris-X682X 6:ee9c86f06eae 37 virtual void stop(){
kris@kris-X682X 6:ee9c86f06eae 38 printf("[CENTRAL]\t Stopping \r\n");
kris@kris-X682X 6:ee9c86f06eae 39 //TODO: Destroy the list with addresses
kris@kris-X682X 6:ee9c86f06eae 40 //FIXME: Out-of-memory error
kris@kris-X682X 6:ee9c86f06eae 41 addresses.clear();
kris@kris-X682X 6:ee9c86f06eae 42 _ble.gap().stopScan();
kris@kris-X682X 6:ee9c86f06eae 43 if (_ble.hasInitialized()) {
kris@kris-X682X 6:ee9c86f06eae 44 _ble.shutdown();
kris@kris-X682X 6:ee9c86f06eae 45 }
kris@kris-X682X 6:ee9c86f06eae 46 }
kris@kris-X682X 6:ee9c86f06eae 47
kris@kris-X682X 6:ee9c86f06eae 48 private:
kris@kris-X682X 6:ee9c86f06eae 49 /* Gap::EventHandler */
kris@kris-X682X 6:ee9c86f06eae 50
kris@kris-X682X 6:ee9c86f06eae 51 /** Look at scan payload to find a peer device and connect to it */
kris@kris-X682X 6:ee9c86f06eae 52 virtual void onAdvertisingReport(const ble::AdvertisingReportEvent &event)
kris@kris-X682X 6:ee9c86f06eae 53 {
kris@kris-X682X 6:ee9c86f06eae 54 /* don't bother with analysing scan result if we're already connecting */
kris@kris-X682X 6:ee9c86f06eae 55 if (_is_connecting) {
kris@kris-X682X 6:ee9c86f06eae 56 return;
kris@kris-X682X 6:ee9c86f06eae 57 }
kris@kris-X682X 6:ee9c86f06eae 58 // printf("found someone ");
kris@kris-X682X 6:ee9c86f06eae 59 /* parse the advertising payload, looking for a discoverable device */
kris@kris-X682X 6:ee9c86f06eae 60 //TODO: Hier checken ofhet een andere SSS wearable is. Zo niet, gewoon tellen.
kris@kris-X682X 6:ee9c86f06eae 61 bool found = false;
kris@kris-X682X 6:ee9c86f06eae 62 ble::address_t::byte_array_t actualdata = event.getPeerAddress().data();
kris@kris-X682X 6:ee9c86f06eae 63
kris@kris-X682X 6:ee9c86f06eae 64 //TODO: Start service discovery.
kris@kris-X682X 6:ee9c86f06eae 65 ble::AdvertisingDataParser adv_data(event.getPayload());
kris@kris-X682X 6:ee9c86f06eae 66 while (adv_data.hasNext()) {
kris@kris-X682X 6:ee9c86f06eae 67 // printf("\n\t\t Has next");
kris@kris-X682X 6:ee9c86f06eae 68 ble::AdvertisingDataParser::element_t field = adv_data.next();
kris@kris-X682X 6:ee9c86f06eae 69
kris@kris-X682X 6:ee9c86f06eae 70 /* connect to a discoverable device */
kris@kris-X682X 6:ee9c86f06eae 71 //Deze if-statement kijkt naar de naam en MEMCMP vergelijkt de advertising-naam met de target-naam (sssble)
kris@kris-X682X 6:ee9c86f06eae 72 //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 73 /*if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME &&
kris@kris-X682X 6:ee9c86f06eae 74 field.value.size() == strlen("SSS BLE") &&
kris@kris-X682X 6:ee9c86f06eae 75 (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {*/
kris@kris-X682X 6:ee9c86f06eae 76 if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME){
kris@kris-X682X 6:ee9c86f06eae 77 if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME &&
kris@kris-X682X 6:ee9c86f06eae 78 field.value.size() == strlen("SSS BLE") &&
kris@kris-X682X 6:ee9c86f06eae 79 (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {
kris@kris-X682X 6:ee9c86f06eae 80 printf("Found another wearable, let's try connecting to him.");
kris@kris-X682X 6:ee9c86f06eae 81
kris@kris-X682X 6:ee9c86f06eae 82
kris@kris-X682X 6:ee9c86f06eae 83 ble_error_t error = _ble.gap().stopScan();
kris@kris-X682X 6:ee9c86f06eae 84
kris@kris-X682X 6:ee9c86f06eae 85 if (error) {
kris@kris-X682X 6:ee9c86f06eae 86 print_error(error, "Error caused by Gap::stopScan");
kris@kris-X682X 6:ee9c86f06eae 87 return;
kris@kris-X682X 6:ee9c86f06eae 88 }
kris@kris-X682X 6:ee9c86f06eae 89
kris@kris-X682X 6:ee9c86f06eae 90 const ble::ConnectionParameters connection_params;
kris@kris-X682X 6:ee9c86f06eae 91
kris@kris-X682X 6:ee9c86f06eae 92
kris@kris-X682X 6:ee9c86f06eae 93 error = _ble.gap().connect(
kris@kris-X682X 6:ee9c86f06eae 94 event.getPeerAddressType(),
kris@kris-X682X 6:ee9c86f06eae 95 event.getPeerAddress(),
kris@kris-X682X 6:ee9c86f06eae 96 connection_params
kris@kris-X682X 6:ee9c86f06eae 97 );
kris@kris-X682X 6:ee9c86f06eae 98
kris@kris-X682X 6:ee9c86f06eae 99 if (error) {
kris@kris-X682X 6:ee9c86f06eae 100 _ble.gap().startScan();
kris@kris-X682X 6:ee9c86f06eae 101 return;
kris@kris-X682X 6:ee9c86f06eae 102 }
kris@kris-X682X 6:ee9c86f06eae 103
kris@kris-X682X 6:ee9c86f06eae 104 }
kris@kris-X682X 6:ee9c86f06eae 105
kris@kris-X682X 6:ee9c86f06eae 106 char test[field.value.size()];
kris@kris-X682X 6:ee9c86f06eae 107 memcpy(test, field.value.data(), field.value.size());
kris@kris-X682X 6:ee9c86f06eae 108
kris@kris-X682X 6:ee9c86f06eae 109 printf("\n\t\t Adv from: ");
kris@kris-X682X 6:ee9c86f06eae 110 printf("%s", test);
kris@kris-X682X 6:ee9c86f06eae 111 printf(" rssi: %d, scan response: %u, connectable: %u\r\n",
kris@kris-X682X 6:ee9c86f06eae 112 event.getRssi(), event.getType().scan_response(), event.getType().connectable());
kris@kris-X682X 6:ee9c86f06eae 113
kris@kris-X682X 6:ee9c86f06eae 114
kris@kris-X682X 6:ee9c86f06eae 115 /* we may have already scan events waiting
kris@kris-X682X 6:ee9c86f06eae 116 * to be processed so we need to remember
kris@kris-X682X 6:ee9c86f06eae 117 * that we are already connecting and ignore them */
kris@kris-X682X 6:ee9c86f06eae 118 // _is_connecting = true;
kris@kris-X682X 6:ee9c86f06eae 119
kris@kris-X682X 6:ee9c86f06eae 120 return;
kris@kris-X682X 6:ee9c86f06eae 121 }
kris@kris-X682X 6:ee9c86f06eae 122 }
kris@kris-X682X 6:ee9c86f06eae 123
kris@kris-X682X 6:ee9c86f06eae 124 if(addresses.size() > 0){
kris@kris-X682X 6:ee9c86f06eae 125 found = (std::find(addresses.begin(), addresses.end(),actualdata ) != addresses.end());
kris@kris-X682X 6:ee9c86f06eae 126 }
kris@kris-X682X 6:ee9c86f06eae 127
kris@kris-X682X 6:ee9c86f06eae 128 if (!found) {
kris@kris-X682X 6:ee9c86f06eae 129 //TODO: Clear the list to prevent memory overflow
kris@kris-X682X 6:ee9c86f06eae 130 addresses.push_back(actualdata);
kris@kris-X682X 6:ee9c86f06eae 131 printf("\r\n Amount devices: %d \r\n", addresses.size());
kris@kris-X682X 6:ee9c86f06eae 132
kris@kris-X682X 6:ee9c86f06eae 133 // printf("%02x:%02x:%02x:%02x:%02x:%02x\r\n", actualdata[5], actualdata[4], actualdata[3], actualdata[2], actualdata[1], actualdata[0]);
kris@kris-X682X 6:ee9c86f06eae 134 return;
kris@kris-X682X 6:ee9c86f06eae 135 } else {
kris@kris-X682X 6:ee9c86f06eae 136 // TODO: Increment internal counter
kris@kris-X682X 6:ee9c86f06eae 137 }
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 #endif //SSS_BLE_BLEDEVICECENTRAL_H