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
BlynkSimpleMicroBit.h@16:6d9bf99b263c, 2017-11-27 (annotated)
- Committer:
- Volodymyr Shymanskyy
- Date:
- Mon Nov 27 23:01:23 2017 +0200
- Revision:
- 16:6d9bf99b263c
- Parent:
- 15:975b60f7a8ff
- Child:
- 19:bae78e167b11
Update version
Who changed what in which revision?
User | Revision | Line number | New 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 |
15:975b60f7a8ff | 24 | #include <utility/BlynkFifo2.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 |