Blynk library for embedded hardware. Works with Arduino, ESP8266, Raspberry Pi, Intel Edison/Galileo, LinkIt ONE, Particle Core/Photon, Energia, ARM mbed, etc. http://www.blynk.cc/

Dependents:   Blynk_RBL_BLE_Nano Blynk_MicroBit Blynk_Serial Blynk_RBL_BLE_Nano

Committer:
vshymanskyy
Date:
Fri Jan 26 22:18:19 2018 +0000
Revision:
22:e1d3971fd902
Parent:
19:bae78e167b11
Fix BlynkSystemInit for MBED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Volodymyr Shymanskyy 15:975b60f7a8ff 1 /**
Volodymyr Shymanskyy 15:975b60f7a8ff 2 * @file BlynkSimpleRedBearLab_BLE_Nano.h
Volodymyr Shymanskyy 15:975b60f7a8ff 3 * @author Volodymyr Shymanskyy
Volodymyr Shymanskyy 15:975b60f7a8ff 4 * @license This project is released under the MIT License (MIT)
Volodymyr Shymanskyy 15:975b60f7a8ff 5 * @copyright Copyright (c) 2015 Volodymyr Shymanskyy
Volodymyr Shymanskyy 15:975b60f7a8ff 6 * @date May 2016
Volodymyr Shymanskyy 15:975b60f7a8ff 7 * @brief
Volodymyr Shymanskyy 15:975b60f7a8ff 8 *
Volodymyr Shymanskyy 15:975b60f7a8ff 9 */
Volodymyr Shymanskyy 15:975b60f7a8ff 10
Volodymyr Shymanskyy 15:975b60f7a8ff 11 #ifndef BlynkSimpleRedBearLab_BLE_Nano_h
Volodymyr Shymanskyy 15:975b60f7a8ff 12 #define BlynkSimpleRedBearLab_BLE_Nano_h
Volodymyr Shymanskyy 15:975b60f7a8ff 13
Volodymyr Shymanskyy 15:975b60f7a8ff 14 #ifndef BLYNK_INFO_CONNECTION
Volodymyr Shymanskyy 15:975b60f7a8ff 15 #define BLYNK_INFO_CONNECTION "MicroBit"
Volodymyr Shymanskyy 15:975b60f7a8ff 16 #endif
Volodymyr Shymanskyy 15:975b60f7a8ff 17
Volodymyr Shymanskyy 15:975b60f7a8ff 18 #define BLYNK_SEND_ATOMIC
Volodymyr Shymanskyy 15:975b60f7a8ff 19 #define BLYNK_SEND_CHUNK 20
Volodymyr Shymanskyy 15:975b60f7a8ff 20 #define BLYNK_SEND_THROTTLE 20
Volodymyr Shymanskyy 15:975b60f7a8ff 21
Volodymyr Shymanskyy 15:975b60f7a8ff 22 #include <BlynkApiMbed.h>
Volodymyr Shymanskyy 15:975b60f7a8ff 23 #include <Blynk/BlynkProtocol.h>
Volodymyr Shymanskyy 19:bae78e167b11 24 #include <utility/BlynkFifo.h>
Volodymyr Shymanskyy 15:975b60f7a8ff 25 #include <ble/BLE.h>
Volodymyr Shymanskyy 15:975b60f7a8ff 26
Volodymyr Shymanskyy 15:975b60f7a8ff 27 /*
Volodymyr Shymanskyy 15:975b60f7a8ff 28 * The Nordic UART Service
Volodymyr Shymanskyy 15:975b60f7a8ff 29 */
Volodymyr Shymanskyy 15:975b60f7a8ff 30 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
Volodymyr Shymanskyy 15:975b60f7a8ff 31 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
Volodymyr Shymanskyy 15:975b60f7a8ff 32 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
Volodymyr Shymanskyy 15:975b60f7a8ff 33 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
Volodymyr Shymanskyy 15:975b60f7a8ff 34
Volodymyr Shymanskyy 15:975b60f7a8ff 35 #define TXRX_BUF_LEN 20
Volodymyr Shymanskyy 15:975b60f7a8ff 36 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
Volodymyr Shymanskyy 15:975b60f7a8ff 37 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
Volodymyr Shymanskyy 15:975b60f7a8ff 38
Volodymyr Shymanskyy 15:975b60f7a8ff 39 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN,
Volodymyr Shymanskyy 15:975b60f7a8ff 40 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
Volodymyr Shymanskyy 15:975b60f7a8ff 41 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
Volodymyr Shymanskyy 15:975b60f7a8ff 42
Volodymyr Shymanskyy 15:975b60f7a8ff 43 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN,
Volodymyr Shymanskyy 15:975b60f7a8ff 44 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
Volodymyr Shymanskyy 15:975b60f7a8ff 45
Volodymyr Shymanskyy 15:975b60f7a8ff 46 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
Volodymyr Shymanskyy 15:975b60f7a8ff 47
Volodymyr Shymanskyy 15:975b60f7a8ff 48 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic*));
Volodymyr Shymanskyy 15:975b60f7a8ff 49
Volodymyr Shymanskyy 15:975b60f7a8ff 50 class BlynkTransportMicroBit
Volodymyr Shymanskyy 15:975b60f7a8ff 51 {
Volodymyr Shymanskyy 15:975b60f7a8ff 52 public:
Volodymyr Shymanskyy 15:975b60f7a8ff 53 BlynkTransportMicroBit()
Volodymyr Shymanskyy 15:975b60f7a8ff 54 : mConn (false)
Volodymyr Shymanskyy 15:975b60f7a8ff 55 {}
Volodymyr Shymanskyy 15:975b60f7a8ff 56
Volodymyr Shymanskyy 15:975b60f7a8ff 57 // IP redirect not available
Volodymyr Shymanskyy 15:975b60f7a8ff 58 void begin(char* h, uint16_t p) {}
Volodymyr Shymanskyy 15:975b60f7a8ff 59
Volodymyr Shymanskyy 15:975b60f7a8ff 60 void begin(BLEDevice& bleDevice) {
Volodymyr Shymanskyy 15:975b60f7a8ff 61 ble = &bleDevice;
Volodymyr Shymanskyy 15:975b60f7a8ff 62
Volodymyr Shymanskyy 15:975b60f7a8ff 63 ble->gattServer().addService(uartService);
Volodymyr Shymanskyy 15:975b60f7a8ff 64 ble->gattServer().onDataWritten(this, &BlynkTransportMicroBit::writeCallback);
Volodymyr Shymanskyy 15:975b60f7a8ff 65 ble->gattServer().onDataSent(this, &BlynkTransportMicroBit::sentCallback);
Volodymyr Shymanskyy 15:975b60f7a8ff 66
Volodymyr Shymanskyy 15:975b60f7a8ff 67 // Setup advertising
Volodymyr Shymanskyy 15:975b60f7a8ff 68 ble->gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
Volodymyr Shymanskyy 15:975b60f7a8ff 69 uart_base_uuid_rev, sizeof(uart_base_uuid));
Volodymyr Shymanskyy 15:975b60f7a8ff 70 }
Volodymyr Shymanskyy 15:975b60f7a8ff 71
Volodymyr Shymanskyy 15:975b60f7a8ff 72 bool connect() {
Volodymyr Shymanskyy 15:975b60f7a8ff 73 mBuffRX.clear();
Volodymyr Shymanskyy 15:975b60f7a8ff 74 return mConn = true;
Volodymyr Shymanskyy 15:975b60f7a8ff 75 }
Volodymyr Shymanskyy 15:975b60f7a8ff 76
Volodymyr Shymanskyy 15:975b60f7a8ff 77 void disconnect() {
Volodymyr Shymanskyy 15:975b60f7a8ff 78 mConn = false;
Volodymyr Shymanskyy 15:975b60f7a8ff 79 }
Volodymyr Shymanskyy 15:975b60f7a8ff 80
Volodymyr Shymanskyy 15:975b60f7a8ff 81 bool connected() {
Volodymyr Shymanskyy 15:975b60f7a8ff 82 return mConn;
Volodymyr Shymanskyy 15:975b60f7a8ff 83 }
Volodymyr Shymanskyy 15:975b60f7a8ff 84
Volodymyr Shymanskyy 15:975b60f7a8ff 85 size_t read(void* buf, size_t len) {
Volodymyr Shymanskyy 16:6d9bf99b263c 86 millis_time_t start = BlynkMillis();
Volodymyr Shymanskyy 16:6d9bf99b263c 87 while (BlynkMillis() - start < BLYNK_TIMEOUT_MS) {
Volodymyr Shymanskyy 15:975b60f7a8ff 88 if (available() < len) {
Volodymyr Shymanskyy 15:975b60f7a8ff 89 ble->waitForEvent();
Volodymyr Shymanskyy 15:975b60f7a8ff 90 } else {
Volodymyr Shymanskyy 15:975b60f7a8ff 91 break;
Volodymyr Shymanskyy 15:975b60f7a8ff 92 }
Volodymyr Shymanskyy 15:975b60f7a8ff 93 }
Volodymyr Shymanskyy 15:975b60f7a8ff 94 noInterrupts();
Volodymyr Shymanskyy 15:975b60f7a8ff 95 size_t res = mBuffRX.get((uint8_t*)buf, len);
Volodymyr Shymanskyy 15:975b60f7a8ff 96 interrupts();
Volodymyr Shymanskyy 15:975b60f7a8ff 97 return res;
Volodymyr Shymanskyy 15:975b60f7a8ff 98 }
Volodymyr Shymanskyy 15:975b60f7a8ff 99
Volodymyr Shymanskyy 15:975b60f7a8ff 100 size_t write(const void* buf, size_t len) {
Volodymyr Shymanskyy 15:975b60f7a8ff 101 ble->updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), (uint8_t*)buf, len);
Volodymyr Shymanskyy 15:975b60f7a8ff 102 return len;
Volodymyr Shymanskyy 15:975b60f7a8ff 103 }
Volodymyr Shymanskyy 15:975b60f7a8ff 104
Volodymyr Shymanskyy 15:975b60f7a8ff 105 size_t available() {
Volodymyr Shymanskyy 15:975b60f7a8ff 106 noInterrupts();
Volodymyr Shymanskyy 15:975b60f7a8ff 107 size_t rxSize = mBuffRX.size();
Volodymyr Shymanskyy 15:975b60f7a8ff 108 interrupts();
Volodymyr Shymanskyy 15:975b60f7a8ff 109 return rxSize;
Volodymyr Shymanskyy 15:975b60f7a8ff 110 }
Volodymyr Shymanskyy 15:975b60f7a8ff 111
Volodymyr Shymanskyy 15:975b60f7a8ff 112 private:
Volodymyr Shymanskyy 15:975b60f7a8ff 113
Volodymyr Shymanskyy 15:975b60f7a8ff 114 void writeCallback(const GattWriteCallbackParams *params)
Volodymyr Shymanskyy 15:975b60f7a8ff 115 {
Volodymyr Shymanskyy 15:975b60f7a8ff 116 noInterrupts();
Volodymyr Shymanskyy 15:975b60f7a8ff 117 //BLYNK_DBG_DUMP(">> ", params->data, params->len);
Volodymyr Shymanskyy 15:975b60f7a8ff 118 mBuffRX.put(params->data, params->len);
Volodymyr Shymanskyy 15:975b60f7a8ff 119 interrupts();
Volodymyr Shymanskyy 15:975b60f7a8ff 120 }
Volodymyr Shymanskyy 15:975b60f7a8ff 121
Volodymyr Shymanskyy 15:975b60f7a8ff 122 void sentCallback(unsigned count)
Volodymyr Shymanskyy 15:975b60f7a8ff 123 {
Volodymyr Shymanskyy 15:975b60f7a8ff 124 //Serial.print("SENT: ");
Volodymyr Shymanskyy 15:975b60f7a8ff 125 //Serial.println(count);
Volodymyr Shymanskyy 15:975b60f7a8ff 126 }
Volodymyr Shymanskyy 15:975b60f7a8ff 127
Volodymyr Shymanskyy 15:975b60f7a8ff 128 private:
Volodymyr Shymanskyy 15:975b60f7a8ff 129 bool mConn;
Volodymyr Shymanskyy 15:975b60f7a8ff 130 BLEDevice* ble;
Volodymyr Shymanskyy 15:975b60f7a8ff 131
Volodymyr Shymanskyy 15:975b60f7a8ff 132 BlynkFifo<uint8_t, BLYNK_MAX_READBYTES*2> mBuffRX;
Volodymyr Shymanskyy 15:975b60f7a8ff 133 };
Volodymyr Shymanskyy 15:975b60f7a8ff 134
Volodymyr Shymanskyy 15:975b60f7a8ff 135 class BlynkMicroBit
Volodymyr Shymanskyy 15:975b60f7a8ff 136 : public BlynkProtocol<BlynkTransportMicroBit>
Volodymyr Shymanskyy 15:975b60f7a8ff 137 {
Volodymyr Shymanskyy 15:975b60f7a8ff 138 typedef BlynkProtocol<BlynkTransportMicroBit> Base;
Volodymyr Shymanskyy 15:975b60f7a8ff 139 public:
Volodymyr Shymanskyy 15:975b60f7a8ff 140 BlynkMicroBit(BlynkTransportMicroBit& transp)
Volodymyr Shymanskyy 15:975b60f7a8ff 141 : Base(transp)
Volodymyr Shymanskyy 15:975b60f7a8ff 142 {}
Volodymyr Shymanskyy 15:975b60f7a8ff 143
Volodymyr Shymanskyy 15:975b60f7a8ff 144 void begin(BLEDevice& ble, const char* auth)
Volodymyr Shymanskyy 15:975b60f7a8ff 145 {
Volodymyr Shymanskyy 15:975b60f7a8ff 146 Base::begin(auth);
Volodymyr Shymanskyy 15:975b60f7a8ff 147 state = DISCONNECTED;
Volodymyr Shymanskyy 15:975b60f7a8ff 148 conn.begin(ble);
Volodymyr Shymanskyy 15:975b60f7a8ff 149 }
Volodymyr Shymanskyy 15:975b60f7a8ff 150 };
Volodymyr Shymanskyy 15:975b60f7a8ff 151
Volodymyr Shymanskyy 15:975b60f7a8ff 152 static BlynkTransportMicroBit _blynkTransport;
Volodymyr Shymanskyy 15:975b60f7a8ff 153 BlynkMicroBit Blynk(_blynkTransport);
Volodymyr Shymanskyy 15:975b60f7a8ff 154
Volodymyr Shymanskyy 15:975b60f7a8ff 155 #include <BlynkWidgets.h>
Volodymyr Shymanskyy 15:975b60f7a8ff 156
Volodymyr Shymanskyy 15:975b60f7a8ff 157 #endif