Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Mon May 20 13:20:35 2019 +0200
Revision:
7:9cda1b0f25ae
Parent:
6:ee9c86f06eae
Child:
10:d845189d146e
Working broadcast & advertise

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kris@kris-X682X 6:ee9c86f06eae 1 #include "BleDevicePeripheral.h"
kris@kris-X682X 6:ee9c86f06eae 2
kris@kris-X682X 7:9cda1b0f25ae 3
kris@kris-X682X 6:ee9c86f06eae 4 void BleDevicePeripheral::onConnectionComplete(const ble::ConnectionCompleteEvent &event) {
kris@kris-X682X 6:ee9c86f06eae 5 // ble_error_t error;
kris@kris-X682X 6:ee9c86f06eae 6
kris@kris-X682X 6:ee9c86f06eae 7 /* remember the device that connects to us now so we can connect to it
kris@kris-X682X 6:ee9c86f06eae 8 * during the next demonstration */
kris@kris-X682X 6:ee9c86f06eae 9 // memcpy(_peer_address, event.getPeerAddress().data(), sizeof(_peer_address));
kris@kris-X682X 6:ee9c86f06eae 10 //TODO: Connecting to the device breaks the event queue; it should. BUT there should start some new stuff
kris@kris-X682X 6:ee9c86f06eae 11 printf("[PERIPHERAL]\t Connected to peer: ");
kris@kris-X682X 6:ee9c86f06eae 12 print_address(event.getPeerAddress().data());
kris@kris-X682X 6:ee9c86f06eae 13 _handle = event.getConnectionHandle();
kris@kris-X682X 6:ee9c86f06eae 14 printf("[PERIPHERAL]\t I'm connected to someone, what should i do now?");
kris@kris-X682X 6:ee9c86f06eae 15 //Dispatch forever makes sure that we stay in this state until explicitly told otherwise (on disconnect).
kris@kris-X682X 6:ee9c86f06eae 16 _event_queue.dispatch_forever();
kris@kris-X682X 6:ee9c86f06eae 17 }
kris@kris-X682X 6:ee9c86f06eae 18
kris@kris-X682X 6:ee9c86f06eae 19 void BleDevicePeripheral::stop() {
kris@kris-X682X 6:ee9c86f06eae 20 printf("[PERIPHERAL]\t Stopping \r\n");
kris@kris-X682X 6:ee9c86f06eae 21 _ble.gap().stopAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
kris@kris-X682X 6:ee9c86f06eae 22 delete cs;
kris@kris-X682X 6:ee9c86f06eae 23 delete is;
kris@kris-X682X 6:ee9c86f06eae 24 if (_ble.hasInitialized()) {
kris@kris-X682X 6:ee9c86f06eae 25 _ble.shutdown();
kris@kris-X682X 6:ee9c86f06eae 26 }
kris@kris-X682X 6:ee9c86f06eae 27 }
kris@kris-X682X 6:ee9c86f06eae 28
kris@kris-X682X 7:9cda1b0f25ae 29 BleDevicePeripheral::~BleDevicePeripheral() {
kris@kris-X682X 7:9cda1b0f25ae 30 printf("[PERIPHERAL]\t Destructing the peripheral\r\n");
kris@kris-X682X 7:9cda1b0f25ae 31 }
kris@kris-X682X 7:9cda1b0f25ae 32
kris@kris-X682X 6:ee9c86f06eae 33 void BleDevicePeripheral::start() {
kris@kris-X682X 6:ee9c86f06eae 34
kris@kris-X682X 7:9cda1b0f25ae 35 ble_error_t error;
kris@kris-X682X 7:9cda1b0f25ae 36 /* Set up and start advertising */
kris@kris-X682X 7:9cda1b0f25ae 37 uint8_t adv_buffer[ble::LEGACY_ADVERTISING_MAX_SIZE];
kris@kris-X682X 7:9cda1b0f25ae 38 /* use the helper to build the payload */
kris@kris-X682X 7:9cda1b0f25ae 39 ble::AdvertisingDataBuilder adv_data_builder(
kris@kris-X682X 7:9cda1b0f25ae 40 adv_buffer
kris@kris-X682X 7:9cda1b0f25ae 41 );
kris@kris-X682X 6:ee9c86f06eae 42
kris@kris-X682X 7:9cda1b0f25ae 43 adv_data_builder.setFlags();
kris@kris-X682X 7:9cda1b0f25ae 44 adv_data_builder.setName("SSS BLE", true);
kris@kris-X682X 7:9cda1b0f25ae 45 ble::AdvertisingParameters adv_parameters(
kris@kris-X682X 7:9cda1b0f25ae 46 ble::advertising_type_t::CONNECTABLE_UNDIRECTED,
kris@kris-X682X 7:9cda1b0f25ae 47 ble::adv_interval_t(ble::millisecond_t(50))
kris@kris-X682X 7:9cda1b0f25ae 48 );
kris@kris-X682X 6:ee9c86f06eae 49
kris@kris-X682X 7:9cda1b0f25ae 50 error = _ble.gap().setAdvertisingParameters(
kris@kris-X682X 7:9cda1b0f25ae 51 ble::LEGACY_ADVERTISING_HANDLE,
kris@kris-X682X 7:9cda1b0f25ae 52 adv_parameters
kris@kris-X682X 7:9cda1b0f25ae 53 );
kris@kris-X682X 7:9cda1b0f25ae 54 if (error) {
kris@kris-X682X 7:9cda1b0f25ae 55 print_error(error, "[PERIPHERAL]\t Gap::setAdvertisingParameters() failed");
kris@kris-X682X 7:9cda1b0f25ae 56 return;
kris@kris-X682X 7:9cda1b0f25ae 57 }
kris@kris-X682X 7:9cda1b0f25ae 58 /* Set payload for the set */
kris@kris-X682X 7:9cda1b0f25ae 59 error = _ble.gap().setAdvertisingPayload(
kris@kris-X682X 7:9cda1b0f25ae 60 ble::LEGACY_ADVERTISING_HANDLE,
kris@kris-X682X 7:9cda1b0f25ae 61 adv_data_builder.getAdvertisingData()
kris@kris-X682X 7:9cda1b0f25ae 62 );
kris@kris-X682X 7:9cda1b0f25ae 63
kris@kris-X682X 7:9cda1b0f25ae 64 if (error) {
kris@kris-X682X 7:9cda1b0f25ae 65 print_error(error, "Gap::setAdvertisingPayload() failed");
kris@kris-X682X 7:9cda1b0f25ae 66 _event_queue.break_dispatch();
kris@kris-X682X 7:9cda1b0f25ae 67 return;
kris@kris-X682X 7:9cda1b0f25ae 68 }
kris@kris-X682X 6:ee9c86f06eae 69
kris@kris-X682X 6:ee9c86f06eae 70
kris@kris-X682X 6:ee9c86f06eae 71
kris@kris-X682X 7:9cda1b0f25ae 72 cs = new ColorService(_ble);
kris@kris-X682X 7:9cda1b0f25ae 73 is = new InterestService(_ble);
kris@kris-X682X 7:9cda1b0f25ae 74 printf("[PERIPHERAL]\t Starting advertising \r\n");
kris@kris-X682X 6:ee9c86f06eae 75
kris@kris-X682X 6:ee9c86f06eae 76 error = _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
kris@kris-X682X 6:ee9c86f06eae 77
kris@kris-X682X 6:ee9c86f06eae 78 if (error) {
kris@kris-X682X 6:ee9c86f06eae 79 print_error(error, "[PERIPHERAL]\t Gap::startAdvertising() failed");
kris@kris-X682X 6:ee9c86f06eae 80 return;
kris@kris-X682X 6:ee9c86f06eae 81 }
kris@kris-X682X 6:ee9c86f06eae 82
kris@kris-X682X 6:ee9c86f06eae 83 printf("[PERIPHERAL]\t Set up BLE. I should now be advertising \r\n");
kris@kris-X682X 6:ee9c86f06eae 84 printf("[PERIPHERAL]\t Please connect a device\r\n");
kris@kris-X682X 6:ee9c86f06eae 85 }
kris@kris-X682X 6:ee9c86f06eae 86
kris@kris-X682X 6:ee9c86f06eae 87 BleDevicePeripheral::BleDevicePeripheral(const BLE &ble, EventQueue &eventQueue)
kris@kris-X682X 6:ee9c86f06eae 88 : BleDevice(ble, eventQueue){
kris@kris-X682X 6:ee9c86f06eae 89 }