Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Thu Jun 20 13:20:24 2019 +0200
Revision:
11:d6ed1437c2ee
Parent:
10:d845189d146e
Refactored

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 #include "BleDeviceCentral.h"
kris@kris-X682X 10:d845189d146e 6
kris@kris-X682X 10:d845189d146e 7 void hubDetection(){
kris@kris-X682X 10:d845189d146e 8 MyStripSingleton::getInstance()->rainbowCycle(2);
kris@kris-X682X 10:d845189d146e 9 }
kris@kris-X682X 10:d845189d146e 10
kris@kris-X682X 10:d845189d146e 11 void BleDeviceCentral::onAdvertisingReport(const ble::AdvertisingReportEvent &event) {
kris@kris-X682X 10:d845189d146e 12 {
kris@kris-X682X 10:d845189d146e 13
kris@kris-X682X 10:d845189d146e 14 /* don't bother with analysing scan result if we're already connecting */
kris@kris-X682X 10:d845189d146e 15 if (_is_connecting) {
kris@kris-X682X 10:d845189d146e 16 return;
kris@kris-X682X 10:d845189d146e 17 }
kris@kris-X682X 10:d845189d146e 18 bool found = false;
kris@kris-X682X 10:d845189d146e 19 ble::address_t::byte_array_t actualdata = event.getPeerAddress().data();
kris@kris-X682X 10:d845189d146e 20
kris@kris-X682X 10:d845189d146e 21 //TODO: Start service discovery.
kris@kris-X682X 10:d845189d146e 22 ble::AdvertisingDataParser adv_data(event.getPayload());
kris@kris-X682X 10:d845189d146e 23 while (adv_data.hasNext()) {
kris@kris-X682X 10:d845189d146e 24 if (addresses.size() > 0) {
kris@kris-X682X 10:d845189d146e 25 found = (std::find(addresses.begin(), addresses.end(), actualdata) != addresses.end());
kris@kris-X682X 10:d845189d146e 26 }
kris@kris-X682X 10:d845189d146e 27
kris@kris-X682X 10:d845189d146e 28 if (!found) {
kris@kris-X682X 10:d845189d146e 29 //TODO: Clear the list to prevent memory overflow
kris@kris-X682X 10:d845189d146e 30 addresses.push_back(actualdata);
kris@kris-X682X 10:d845189d146e 31 MyStripSingleton::getInstance()->crawlNextLed(1, 0xFF00FF);
kris@kris-X682X 10:d845189d146e 32
kris@kris-X682X 10:d845189d146e 33 printf("\r\n Amount devices: %d \r\n", addresses.size());
kris@kris-X682X 10:d845189d146e 34 return;
kris@kris-X682X 10:d845189d146e 35 } else {
kris@kris-X682X 10:d845189d146e 36 // TODO: Increment internal counter
kris@kris-X682X 10:d845189d146e 37 }
kris@kris-X682X 10:d845189d146e 38 // printf("\n\t\t Has next");
kris@kris-X682X 10:d845189d146e 39 ble::AdvertisingDataParser::element_t field = adv_data.next();
kris@kris-X682X 10:d845189d146e 40
kris@kris-X682X 10:d845189d146e 41 /* connect to a discoverable device */
kris@kris-X682X 10:d845189d146e 42 //Deze if-statement kijkt naar de naam en MEMCMP vergelijkt de advertising-naam met de target-naam (sssble)
kris@kris-X682X 10:d845189d146e 43 //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 10:d845189d146e 44 /*if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME &&
kris@kris-X682X 10:d845189d146e 45 field.value.size() == strlen("SSS BLE") &&
kris@kris-X682X 10:d845189d146e 46 (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {*/
kris@kris-X682X 10:d845189d146e 47 if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME) {
kris@kris-X682X 10:d845189d146e 48 if (field.type == ble::adv_data_type_t::COMPLETE_LOCAL_NAME &&
kris@kris-X682X 10:d845189d146e 49 field.value.size() == strlen("SSS BLE") &&
kris@kris-X682X 10:d845189d146e 50 (memcmp(field.value.data(), "SSS BLE", field.value.size()) == 0)) {
kris@kris-X682X 10:d845189d146e 51
kris@kris-X682X 10:d845189d146e 52 printf("[CENTRAL]\t Found another wearable, let's try connecting to him.\r\n");
kris@kris-X682X 10:d845189d146e 53 MyStripSingleton::getInstance()->resetCrawl();
kris@kris-X682X 10:d845189d146e 54 // wait_ms(200);
kris@kris-X682X 10:d845189d146e 55 ble_error_t error = _ble.gap().stopScan();
kris@kris-X682X 10:d845189d146e 56
kris@kris-X682X 10:d845189d146e 57 if (error) {
kris@kris-X682X 10:d845189d146e 58 print_error(error, "Error caused by Gap::stopScan");
kris@kris-X682X 10:d845189d146e 59 return;
kris@kris-X682X 10:d845189d146e 60 }
kris@kris-X682X 10:d845189d146e 61 printf("[CENTRAL]\t Stopped the scan.\r\n");
kris@kris-X682X 10:d845189d146e 62
kris@kris-X682X 10:d845189d146e 63 const ble::ConnectionParameters connection_params;
kris@kris-X682X 10:d845189d146e 64
kris@kris-X682X 10:d845189d146e 65 printf("[CENTRAL]\t Trying to connect.\r\n");
kris@kris-X682X 10:d845189d146e 66
kris@kris-X682X 10:d845189d146e 67 error = _ble.gap().connect(
kris@kris-X682X 10:d845189d146e 68 event.getPeerAddressType(),
kris@kris-X682X 10:d845189d146e 69 event.getPeerAddress(),
kris@kris-X682X 10:d845189d146e 70 connection_params
kris@kris-X682X 10:d845189d146e 71 );
kris@kris-X682X 10:d845189d146e 72 printf("[CENTRAL]\t Trying to connect..\r\n");
kris@kris-X682X 10:d845189d146e 73
kris@kris-X682X 10:d845189d146e 74 if (error) {
kris@kris-X682X 10:d845189d146e 75 _ble.gap().startScan();
kris@kris-X682X 10:d845189d146e 76 return;
kris@kris-X682X 10:d845189d146e 77 }
kris@kris-X682X 10:d845189d146e 78 printf("[CENTRAL]\t Looks like I'm connected...\r\n");
kris@kris-X682X 10:d845189d146e 79 //TODO: Break the event queue, but keep doing what im doing
kris@kris-X682X 10:d845189d146e 80 _event_queue.dispatch_forever();
kris@kris-X682X 10:d845189d146e 81 }
kris@kris-X682X 10:d845189d146e 82
kris@kris-X682X 10:d845189d146e 83 char test[field.value.size()];
kris@kris-X682X 10:d845189d146e 84 char GoogleHome[field.value.size()];
kris@kris-X682X 10:d845189d146e 85 char *output = NULL;
kris@kris-X682X 10:d845189d146e 86 output = strstr (test, "GoogleHome");
kris@kris-X682X 10:d845189d146e 87 memcpy(test, field.value.data(), field.value.size());
kris@kris-X682X 10:d845189d146e 88 //TODO: If name contains something like google home, do fancy shit but keep it at that
kris@kris-X682X 10:d845189d146e 89 if (output) {
kris@kris-X682X 10:d845189d146e 90 // do stuff
kris@kris-X682X 10:d845189d146e 91 printf("There seems to be a google home nearby!");
kris@kris-X682X 10:d845189d146e 92 MyStripSingleton::getInstance()->rainbowCycle(2);
kris@kris-X682X 10:d845189d146e 93 _event_queue.call(callback(hubDetection));
kris@kris-X682X 10:d845189d146e 94
kris@kris-X682X 10:d845189d146e 95 }
kris@kris-X682X 10:d845189d146e 96
kris@kris-X682X 10:d845189d146e 97 printf("\n\t\t Adv from: ");
kris@kris-X682X 10:d845189d146e 98 printf("%s", test);
kris@kris-X682X 10:d845189d146e 99 printf(" rssi: %d, scan response: %u, connectable: %u\r\n",
kris@kris-X682X 10:d845189d146e 100 event.getRssi(), event.getType().scan_response(), event.getType().connectable());
kris@kris-X682X 10:d845189d146e 101
kris@kris-X682X 10:d845189d146e 102
kris@kris-X682X 10:d845189d146e 103 /* we may have already scan events waiting
kris@kris-X682X 10:d845189d146e 104 * to be processed so we need to remember
kris@kris-X682X 10:d845189d146e 105 * that we are already connecting and ignore them */
kris@kris-X682X 10:d845189d146e 106 // _is_connecting = true;
kris@kris-X682X 10:d845189d146e 107
kris@kris-X682X 10:d845189d146e 108 return;
kris@kris-X682X 10:d845189d146e 109 }
kris@kris-X682X 10:d845189d146e 110 }
kris@kris-X682X 10:d845189d146e 111
kris@kris-X682X 10:d845189d146e 112 }
kris@kris-X682X 10:d845189d146e 113 }