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 2:c5b857d4f9f6 1 /**
Volodymyr Shymanskyy 2:c5b857d4f9f6 2 * @file BlynkSimpleRedBearLab_BLE_Nano.h
Volodymyr Shymanskyy 2:c5b857d4f9f6 3 * @author Volodymyr Shymanskyy
Volodymyr Shymanskyy 2:c5b857d4f9f6 4 * @license This project is released under the MIT License (MIT)
Volodymyr Shymanskyy 2:c5b857d4f9f6 5 * @copyright Copyright (c) 2015 Volodymyr Shymanskyy
Volodymyr Shymanskyy 2:c5b857d4f9f6 6 * @date May 2016
Volodymyr Shymanskyy 2:c5b857d4f9f6 7 * @brief
Volodymyr Shymanskyy 2:c5b857d4f9f6 8 *
Volodymyr Shymanskyy 2:c5b857d4f9f6 9 */
Volodymyr Shymanskyy 2:c5b857d4f9f6 10
Volodymyr Shymanskyy 2:c5b857d4f9f6 11 #ifndef BlynkSimpleRedBearLab_BLE_Nano_h
Volodymyr Shymanskyy 2:c5b857d4f9f6 12 #define BlynkSimpleRedBearLab_BLE_Nano_h
Volodymyr Shymanskyy 2:c5b857d4f9f6 13
Volodymyr Shymanskyy 2:c5b857d4f9f6 14 #ifndef BLYNK_INFO_CONNECTION
Volodymyr Shymanskyy 2:c5b857d4f9f6 15 #define BLYNK_INFO_CONNECTION "RBL_BLE_Nano"
Volodymyr Shymanskyy 2:c5b857d4f9f6 16 #endif
Volodymyr Shymanskyy 2:c5b857d4f9f6 17
Volodymyr Shymanskyy 2:c5b857d4f9f6 18 #define BLYNK_SEND_ATOMIC
Volodymyr Shymanskyy 2:c5b857d4f9f6 19 #define BLYNK_SEND_CHUNK 20
Volodymyr Shymanskyy 2:c5b857d4f9f6 20 #define BLYNK_SEND_THROTTLE 20
Volodymyr Shymanskyy 2:c5b857d4f9f6 21
vshymanskyy 4:fa1450a7dd08 22 #include <BlynkApiMbed.h>
Volodymyr Shymanskyy 2:c5b857d4f9f6 23 #include <Blynk/BlynkProtocol.h>
Volodymyr Shymanskyy 19:bae78e167b11 24 #include <utility/BlynkFifo.h>
vshymanskyy 4:fa1450a7dd08 25 #include <ble/BLE.h>
Volodymyr Shymanskyy 2:c5b857d4f9f6 26
Volodymyr Shymanskyy 2:c5b857d4f9f6 27 /*
Volodymyr Shymanskyy 2:c5b857d4f9f6 28 * The Nordic UART Service
Volodymyr Shymanskyy 2:c5b857d4f9f6 29 */
Volodymyr Shymanskyy 2:c5b857d4f9f6 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 2:c5b857d4f9f6 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 2:c5b857d4f9f6 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 2:c5b857d4f9f6 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 2:c5b857d4f9f6 34 static const uint8_t uart_dev_name[] = "Blynk";
Volodymyr Shymanskyy 2:c5b857d4f9f6 35
Volodymyr Shymanskyy 2:c5b857d4f9f6 36 #define TXRX_BUF_LEN 20
Volodymyr Shymanskyy 2:c5b857d4f9f6 37 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
Volodymyr Shymanskyy 2:c5b857d4f9f6 38 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
Volodymyr Shymanskyy 2:c5b857d4f9f6 39
Volodymyr Shymanskyy 2:c5b857d4f9f6 40 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN,
Volodymyr Shymanskyy 2:c5b857d4f9f6 41 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
Volodymyr Shymanskyy 2:c5b857d4f9f6 42 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
Volodymyr Shymanskyy 2:c5b857d4f9f6 43
Volodymyr Shymanskyy 2:c5b857d4f9f6 44 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN,
Volodymyr Shymanskyy 2:c5b857d4f9f6 45 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
Volodymyr Shymanskyy 2:c5b857d4f9f6 46
Volodymyr Shymanskyy 2:c5b857d4f9f6 47 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
Volodymyr Shymanskyy 2:c5b857d4f9f6 48
Volodymyr Shymanskyy 2:c5b857d4f9f6 49 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic*));
Volodymyr Shymanskyy 2:c5b857d4f9f6 50
Volodymyr Shymanskyy 2:c5b857d4f9f6 51 BLE ble;
Volodymyr Shymanskyy 2:c5b857d4f9f6 52
Volodymyr Shymanskyy 2:c5b857d4f9f6 53 class BlynkTransportRedBearLab_BLE_Nano
Volodymyr Shymanskyy 2:c5b857d4f9f6 54 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 55 public:
Volodymyr Shymanskyy 9:7369ec77a3ea 56 BlynkTransportRedBearLab_BLE_Nano()
Volodymyr Shymanskyy 2:c5b857d4f9f6 57 : mConn (false)
Volodymyr Shymanskyy 2:c5b857d4f9f6 58 {}
Volodymyr Shymanskyy 2:c5b857d4f9f6 59
Volodymyr Shymanskyy 9:7369ec77a3ea 60 // IP redirect not available
Volodymyr Shymanskyy 9:7369ec77a3ea 61 void begin(char* h, uint16_t p) {}
Volodymyr Shymanskyy 9:7369ec77a3ea 62
Volodymyr Shymanskyy 2:c5b857d4f9f6 63 void begin() {
Volodymyr Shymanskyy 2:c5b857d4f9f6 64 instance = this;
Volodymyr Shymanskyy 2:c5b857d4f9f6 65
Volodymyr Shymanskyy 2:c5b857d4f9f6 66 ble.gap().onConnection(connectCallback);
Volodymyr Shymanskyy 2:c5b857d4f9f6 67 ble.gap().onDisconnection(disconnectCallback);
Volodymyr Shymanskyy 2:c5b857d4f9f6 68
Volodymyr Shymanskyy 2:c5b857d4f9f6 69 ble.gattServer().addService(uartService);
Volodymyr Shymanskyy 2:c5b857d4f9f6 70 ble.gattServer().onDataWritten(writeCallback);
Volodymyr Shymanskyy 2:c5b857d4f9f6 71 ble.gattServer().onDataSent(sentCallback);
Volodymyr Shymanskyy 2:c5b857d4f9f6 72
Volodymyr Shymanskyy 2:c5b857d4f9f6 73 // Setup advertising
Volodymyr Shymanskyy 2:c5b857d4f9f6 74 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
Volodymyr Shymanskyy 2:c5b857d4f9f6 75 uart_base_uuid_rev, sizeof(uart_base_uuid));
Volodymyr Shymanskyy 2:c5b857d4f9f6 76
Volodymyr Shymanskyy 2:c5b857d4f9f6 77 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 78
Volodymyr Shymanskyy 2:c5b857d4f9f6 79 bool connect() {
Volodymyr Shymanskyy 2:c5b857d4f9f6 80 mBuffRX.clear();
Volodymyr Shymanskyy 2:c5b857d4f9f6 81 return mConn = true;
Volodymyr Shymanskyy 2:c5b857d4f9f6 82 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 83
Volodymyr Shymanskyy 2:c5b857d4f9f6 84 void disconnect() {
Volodymyr Shymanskyy 2:c5b857d4f9f6 85 mConn = false;
Volodymyr Shymanskyy 2:c5b857d4f9f6 86 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 87
Volodymyr Shymanskyy 2:c5b857d4f9f6 88 bool connected() {
Volodymyr Shymanskyy 2:c5b857d4f9f6 89 return mConn;
Volodymyr Shymanskyy 2:c5b857d4f9f6 90 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 91
Volodymyr Shymanskyy 2:c5b857d4f9f6 92 size_t read(void* buf, size_t len) {
Volodymyr Shymanskyy 16:6d9bf99b263c 93 millis_time_t start = BlynkMillis();
Volodymyr Shymanskyy 16:6d9bf99b263c 94 while (BlynkMillis() - start < BLYNK_TIMEOUT_MS) {
Volodymyr Shymanskyy 2:c5b857d4f9f6 95 if (available() < len) {
Volodymyr Shymanskyy 2:c5b857d4f9f6 96 ble.waitForEvent();
Volodymyr Shymanskyy 2:c5b857d4f9f6 97 } else {
Volodymyr Shymanskyy 2:c5b857d4f9f6 98 break;
Volodymyr Shymanskyy 2:c5b857d4f9f6 99 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 100 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 101 noInterrupts();
Volodymyr Shymanskyy 2:c5b857d4f9f6 102 size_t res = mBuffRX.get((uint8_t*)buf, len);
Volodymyr Shymanskyy 2:c5b857d4f9f6 103 interrupts();
Volodymyr Shymanskyy 2:c5b857d4f9f6 104 return res;
Volodymyr Shymanskyy 2:c5b857d4f9f6 105 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 106
Volodymyr Shymanskyy 2:c5b857d4f9f6 107 size_t write(const void* buf, size_t len) {
Volodymyr Shymanskyy 2:c5b857d4f9f6 108 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), (uint8_t*)buf, len);
Volodymyr Shymanskyy 2:c5b857d4f9f6 109 return len;
Volodymyr Shymanskyy 2:c5b857d4f9f6 110 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 111
Volodymyr Shymanskyy 2:c5b857d4f9f6 112 size_t available() {
Volodymyr Shymanskyy 2:c5b857d4f9f6 113 noInterrupts();
Volodymyr Shymanskyy 2:c5b857d4f9f6 114 size_t rxSize = mBuffRX.size();
Volodymyr Shymanskyy 2:c5b857d4f9f6 115 interrupts();
Volodymyr Shymanskyy 2:c5b857d4f9f6 116 return rxSize;
Volodymyr Shymanskyy 2:c5b857d4f9f6 117 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 118
Volodymyr Shymanskyy 2:c5b857d4f9f6 119 private:
Volodymyr Shymanskyy 2:c5b857d4f9f6 120 static BlynkTransportRedBearLab_BLE_Nano* instance;
Volodymyr Shymanskyy 2:c5b857d4f9f6 121
Volodymyr Shymanskyy 2:c5b857d4f9f6 122 static
Volodymyr Shymanskyy 2:c5b857d4f9f6 123 void writeCallback(const GattWriteCallbackParams *params)
Volodymyr Shymanskyy 2:c5b857d4f9f6 124 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 125 if (!instance)
Volodymyr Shymanskyy 2:c5b857d4f9f6 126 return;
Volodymyr Shymanskyy 2:c5b857d4f9f6 127 noInterrupts();
Volodymyr Shymanskyy 2:c5b857d4f9f6 128 //BLYNK_DBG_DUMP(">> ", params->data, params->len);
Volodymyr Shymanskyy 2:c5b857d4f9f6 129 instance->mBuffRX.put(params->data, params->len);
Volodymyr Shymanskyy 2:c5b857d4f9f6 130 interrupts();
Volodymyr Shymanskyy 2:c5b857d4f9f6 131 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 132
Volodymyr Shymanskyy 2:c5b857d4f9f6 133 static
Volodymyr Shymanskyy 2:c5b857d4f9f6 134 void sentCallback(unsigned count)
Volodymyr Shymanskyy 2:c5b857d4f9f6 135 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 136 //Serial.print("SENT: ");
Volodymyr Shymanskyy 2:c5b857d4f9f6 137 //Serial.println(count);
Volodymyr Shymanskyy 2:c5b857d4f9f6 138 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 139
Volodymyr Shymanskyy 2:c5b857d4f9f6 140 static
Volodymyr Shymanskyy 2:c5b857d4f9f6 141 void connectCallback(const Gap::ConnectionCallbackParams_t *params);
Volodymyr Shymanskyy 2:c5b857d4f9f6 142
Volodymyr Shymanskyy 2:c5b857d4f9f6 143 static
Volodymyr Shymanskyy 2:c5b857d4f9f6 144 void disconnectCallback(const Gap::DisconnectionCallbackParams_t *params);
Volodymyr Shymanskyy 2:c5b857d4f9f6 145
Volodymyr Shymanskyy 2:c5b857d4f9f6 146 private:
Volodymyr Shymanskyy 2:c5b857d4f9f6 147 bool mConn;
Volodymyr Shymanskyy 2:c5b857d4f9f6 148
Volodymyr Shymanskyy 2:c5b857d4f9f6 149 BlynkFifo<uint8_t, BLYNK_MAX_READBYTES*2> mBuffRX;
Volodymyr Shymanskyy 2:c5b857d4f9f6 150 };
Volodymyr Shymanskyy 2:c5b857d4f9f6 151
Volodymyr Shymanskyy 2:c5b857d4f9f6 152 class BlynkRedBearLab_BLE_Nano
Volodymyr Shymanskyy 2:c5b857d4f9f6 153 : public BlynkProtocol<BlynkTransportRedBearLab_BLE_Nano>
Volodymyr Shymanskyy 2:c5b857d4f9f6 154 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 155 typedef BlynkProtocol<BlynkTransportRedBearLab_BLE_Nano> Base;
Volodymyr Shymanskyy 2:c5b857d4f9f6 156 public:
Volodymyr Shymanskyy 2:c5b857d4f9f6 157 BlynkRedBearLab_BLE_Nano(BlynkTransportRedBearLab_BLE_Nano& transp)
Volodymyr Shymanskyy 2:c5b857d4f9f6 158 : Base(transp)
Volodymyr Shymanskyy 2:c5b857d4f9f6 159 {}
Volodymyr Shymanskyy 2:c5b857d4f9f6 160
Volodymyr Shymanskyy 2:c5b857d4f9f6 161 void begin(const char* auth)
Volodymyr Shymanskyy 2:c5b857d4f9f6 162 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 163 Base::begin(auth);
Volodymyr Shymanskyy 2:c5b857d4f9f6 164 state = DISCONNECTED;
Volodymyr Shymanskyy 2:c5b857d4f9f6 165 conn.begin();
Volodymyr Shymanskyy 2:c5b857d4f9f6 166 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 167 };
Volodymyr Shymanskyy 2:c5b857d4f9f6 168
Volodymyr Shymanskyy 2:c5b857d4f9f6 169 BlynkTransportRedBearLab_BLE_Nano* BlynkTransportRedBearLab_BLE_Nano::instance = NULL;
Volodymyr Shymanskyy 2:c5b857d4f9f6 170
Volodymyr Shymanskyy 2:c5b857d4f9f6 171 static BlynkTransportRedBearLab_BLE_Nano _blynkTransport;
Volodymyr Shymanskyy 2:c5b857d4f9f6 172 BlynkRedBearLab_BLE_Nano Blynk(_blynkTransport);
Volodymyr Shymanskyy 2:c5b857d4f9f6 173
Volodymyr Shymanskyy 2:c5b857d4f9f6 174 void BlynkTransportRedBearLab_BLE_Nano::connectCallback(const Gap::ConnectionCallbackParams_t *params)
Volodymyr Shymanskyy 2:c5b857d4f9f6 175 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 176 BLYNK_LOG1("Device connected");
Volodymyr Shymanskyy 2:c5b857d4f9f6 177 Blynk.startSession();
Volodymyr Shymanskyy 2:c5b857d4f9f6 178 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 179
Volodymyr Shymanskyy 2:c5b857d4f9f6 180 void BlynkTransportRedBearLab_BLE_Nano::disconnectCallback(const Gap::DisconnectionCallbackParams_t *params)
Volodymyr Shymanskyy 2:c5b857d4f9f6 181 {
Volodymyr Shymanskyy 2:c5b857d4f9f6 182 BLYNK_LOG1("Device disconnected");
Volodymyr Shymanskyy 2:c5b857d4f9f6 183 //__disable_irq();
Volodymyr Shymanskyy 2:c5b857d4f9f6 184 Blynk.disconnect();
Volodymyr Shymanskyy 2:c5b857d4f9f6 185 //__enable_irq();
Volodymyr Shymanskyy 2:c5b857d4f9f6 186 ble.startAdvertising();
Volodymyr Shymanskyy 2:c5b857d4f9f6 187 }
Volodymyr Shymanskyy 2:c5b857d4f9f6 188
Volodymyr Shymanskyy 2:c5b857d4f9f6 189 #include <BlynkWidgets.h>
Volodymyr Shymanskyy 2:c5b857d4f9f6 190
Volodymyr Shymanskyy 2:c5b857d4f9f6 191 #endif