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:
Volodymyr Shymanskyy
Date:
Fri Jun 24 00:58:58 2016 +0300
Revision:
2:c5b857d4f9f6
Child:
4:fa1450a7dd08
Test commit

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