for BLENano v1 AD8232

Dependencies:   BLE_API mbed nRF51822

Fork of BLENano_SimpleTemplate by electric baka

Committer:
electricbaka
Date:
Thu Jul 12 16:20:59 2018 +0000
Revision:
6:11e7e28869cd
Parent:
5:95238da08cee
init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RedBearLab 1:81a97eb70d3d 1 /*
electricbaka 6:11e7e28869cd 2
RedBearLab 1:81a97eb70d3d 3 Copyright (c) 2012-2014 RedBearLab
electricbaka 6:11e7e28869cd 4
RedBearLab 1:81a97eb70d3d 5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
RedBearLab 1:81a97eb70d3d 6 and associated documentation files (the "Software"), to deal in the Software without restriction,
RedBearLab 1:81a97eb70d3d 7 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
RedBearLab 1:81a97eb70d3d 8 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
RedBearLab 1:81a97eb70d3d 9 subject to the following conditions:
RedBearLab 1:81a97eb70d3d 10 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
electricbaka 6:11e7e28869cd 11
RedBearLab 1:81a97eb70d3d 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
RedBearLab 1:81a97eb70d3d 13 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
RedBearLab 1:81a97eb70d3d 14 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
RedBearLab 1:81a97eb70d3d 15 FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
RedBearLab 1:81a97eb70d3d 16 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
electricbaka 6:11e7e28869cd 17
RedBearLab 1:81a97eb70d3d 18 */
electricbaka 6:11e7e28869cd 19
electricbaka 4:7e5d4a18cd22 20 /*
electricbaka 5:95238da08cee 21 * The application works with the BlueJelly.js
electricbaka 5:95238da08cee 22 *
electricbaka 6:11e7e28869cd 23 * http://jellyware.jp/kurage/
electricbaka 6:11e7e28869cd 24 * https://github.com/electricbaka/bluejelly
electricbaka 5:95238da08cee 25 *
electricbaka 4:7e5d4a18cd22 26 */
electricbaka 4:7e5d4a18cd22 27
electricbaka 4:7e5d4a18cd22 28 //======================================================================
electricbaka 4:7e5d4a18cd22 29 //Grobal
electricbaka 4:7e5d4a18cd22 30 //======================================================================
electricbaka 4:7e5d4a18cd22 31 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 32 //Include Header Files
electricbaka 4:7e5d4a18cd22 33 //------------------------------------------------------------
RedBearLab 0:be2e4095513a 34 #include "mbed.h"
RedBearLab 2:3cd654f42efa 35 #include "ble/BLE.h"
electricbaka 6:11e7e28869cd 36
electricbaka 6:11e7e28869cd 37
electricbaka 4:7e5d4a18cd22 38 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 39 //Definition
electricbaka 4:7e5d4a18cd22 40 //------------------------------------------------------------
electricbaka 5:95238da08cee 41 #define TXRX_BUF_LEN 20 //max 20[byte]
electricbaka 5:95238da08cee 42 #define DEVICE_LOCAL_NAME "BlueJelly"
electricbaka 6:11e7e28869cd 43 #define ADVERTISING_INTERVAL 160 //160 * 0.625[ms] = 100[ms]
electricbaka 6:11e7e28869cd 44 #define TICKER_TIME 1000 //1000[us] = 1[ms]
electricbaka 5:95238da08cee 45 #define DIGITAL_OUT_PIN P0_9
electricbaka 6:11e7e28869cd 46 #define ANALOG_IN_PIN1 P0_4
electricbaka 6:11e7e28869cd 47
electricbaka 6:11e7e28869cd 48 //HeartRate
electricbaka 6:11e7e28869cd 49 int timer_num = 0;
electricbaka 6:11e7e28869cd 50 int threshold_v = 650;
electricbaka 6:11e7e28869cd 51 int threshold_t = 300;
RedBearLab 0:be2e4095513a 52
electricbaka 6:11e7e28869cd 53
electricbaka 4:7e5d4a18cd22 54 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 55 //Object generation
electricbaka 4:7e5d4a18cd22 56 //------------------------------------------------------------
electricbaka 6:11e7e28869cd 57 BLE blenano;
electricbaka 5:95238da08cee 58 DigitalOut LED_SET(DIGITAL_OUT_PIN);
electricbaka 6:11e7e28869cd 59 AnalogIn ANALOG1(ANALOG_IN_PIN1);
electricbaka 6:11e7e28869cd 60
electricbaka 6:11e7e28869cd 61
electricbaka 4:7e5d4a18cd22 62 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 63 //Service & Characteristic Setting
electricbaka 4:7e5d4a18cd22 64 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 65 //Service UUID
electricbaka 4:7e5d4a18cd22 66 static const uint8_t base_uuid[] = { 0x71, 0x3D, 0x00, 0x00, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E } ;
electricbaka 6:11e7e28869cd 67
electricbaka 4:7e5d4a18cd22 68 //Characteristic UUID
electricbaka 4:7e5d4a18cd22 69 static const uint8_t tx_uuid[] = { 0x71, 0x3D, 0x00, 0x03, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E } ;
electricbaka 4:7e5d4a18cd22 70 static const uint8_t rx_uuid[] = { 0x71, 0x3D, 0x00, 0x02, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E } ;
electricbaka 6:11e7e28869cd 71
electricbaka 4:7e5d4a18cd22 72 //Characteristic Value
RedBearLab 0:be2e4095513a 73 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
RedBearLab 0:be2e4095513a 74 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
electricbaka 6:11e7e28869cd 75
electricbaka 4:7e5d4a18cd22 76 //Characteristic Property Setting etc
electricbaka 5:95238da08cee 77 GattCharacteristic txCharacteristic (tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
electricbaka 4:7e5d4a18cd22 78 GattCharacteristic rxCharacteristic (rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
electricbaka 4:7e5d4a18cd22 79 GattCharacteristic *myChars[] = {&txCharacteristic, &rxCharacteristic};
electricbaka 6:11e7e28869cd 80
electricbaka 4:7e5d4a18cd22 81 //Service Setting
electricbaka 4:7e5d4a18cd22 82 GattService myService(base_uuid, myChars, sizeof(myChars) / sizeof(GattCharacteristic *));
electricbaka 6:11e7e28869cd 83
electricbaka 6:11e7e28869cd 84
electricbaka 4:7e5d4a18cd22 85 //======================================================================
electricbaka 4:7e5d4a18cd22 86 //onDisconnection
electricbaka 4:7e5d4a18cd22 87 //======================================================================
electricbaka 4:7e5d4a18cd22 88 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
electricbaka 4:7e5d4a18cd22 89 {
electricbaka 6:11e7e28869cd 90 blenano.startAdvertising();
electricbaka 4:7e5d4a18cd22 91 }
electricbaka 6:11e7e28869cd 92
electricbaka 6:11e7e28869cd 93
electricbaka 4:7e5d4a18cd22 94 //======================================================================
electricbaka 4:7e5d4a18cd22 95 //onDataWritten
electricbaka 4:7e5d4a18cd22 96 //======================================================================
RedBearLab 2:3cd654f42efa 97 void WrittenHandler(const GattWriteCallbackParams *Handler)
RedBearLab 0:be2e4095513a 98 {
RedBearLab 0:be2e4095513a 99 uint8_t buf[TXRX_BUF_LEN];
RedBearLab 0:be2e4095513a 100 uint16_t bytesRead;
RedBearLab 0:be2e4095513a 101
RedBearLab 2:3cd654f42efa 102 if (Handler->handle == txCharacteristic.getValueAttribute().getHandle())
RedBearLab 0:be2e4095513a 103 {
electricbaka 6:11e7e28869cd 104 blenano.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
electricbaka 5:95238da08cee 105 memset(txPayload, 0, TXRX_BUF_LEN);
electricbaka 5:95238da08cee 106 memcpy(txPayload, buf, TXRX_BUF_LEN);
electricbaka 5:95238da08cee 107
electricbaka 5:95238da08cee 108 if(buf[0] == 1)
electricbaka 5:95238da08cee 109 LED_SET = 1;
electricbaka 5:95238da08cee 110 else
electricbaka 5:95238da08cee 111 LED_SET = 0;
RedBearLab 0:be2e4095513a 112 }
RedBearLab 0:be2e4095513a 113 }
electricbaka 6:11e7e28869cd 114
electricbaka 6:11e7e28869cd 115
electricbaka 4:7e5d4a18cd22 116 //======================================================================
electricbaka 4:7e5d4a18cd22 117 //onTimeout
electricbaka 4:7e5d4a18cd22 118 //======================================================================
electricbaka 4:7e5d4a18cd22 119 void m_status_check_handle(void)
electricbaka 4:7e5d4a18cd22 120 {
electricbaka 6:11e7e28869cd 121 timer_num ++;
electricbaka 4:7e5d4a18cd22 122 }
electricbaka 6:11e7e28869cd 123
electricbaka 6:11e7e28869cd 124
electricbaka 4:7e5d4a18cd22 125 //======================================================================
electricbaka 4:7e5d4a18cd22 126 //convert reverse UUID
electricbaka 4:7e5d4a18cd22 127 //======================================================================
electricbaka 4:7e5d4a18cd22 128 void reverseUUID(const uint8_t* src, uint8_t* dst)
electricbaka 4:7e5d4a18cd22 129 {
electricbaka 4:7e5d4a18cd22 130 int i;
electricbaka 4:7e5d4a18cd22 131
electricbaka 4:7e5d4a18cd22 132 for(i=0;i<16;i++)
electricbaka 4:7e5d4a18cd22 133 dst[i] = src[15 - i];
electricbaka 4:7e5d4a18cd22 134 }
electricbaka 6:11e7e28869cd 135
electricbaka 6:11e7e28869cd 136
electricbaka 4:7e5d4a18cd22 137 //======================================================================
electricbaka 4:7e5d4a18cd22 138 //main
electricbaka 4:7e5d4a18cd22 139 //======================================================================
RedBearLab 0:be2e4095513a 140 int main(void)
electricbaka 4:7e5d4a18cd22 141 {
electricbaka 4:7e5d4a18cd22 142 uint8_t base_uuid_rev[16];
electricbaka 6:11e7e28869cd 143
electricbaka 4:7e5d4a18cd22 144 //Timer Setting [us]
RedBearLab 0:be2e4095513a 145 Ticker ticker;
electricbaka 4:7e5d4a18cd22 146 ticker.attach_us(m_status_check_handle, TICKER_TIME);
RedBearLab 0:be2e4095513a 147
electricbaka 4:7e5d4a18cd22 148 //BLE init
electricbaka 6:11e7e28869cd 149 blenano.init();
electricbaka 4:7e5d4a18cd22 150
electricbaka 4:7e5d4a18cd22 151 //EventListener
electricbaka 6:11e7e28869cd 152 blenano.onDisconnection(disconnectionCallback);
electricbaka 6:11e7e28869cd 153 blenano.onDataWritten(WrittenHandler);
electricbaka 6:11e7e28869cd 154
electricbaka 4:7e5d4a18cd22 155 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 156 //setup advertising
electricbaka 4:7e5d4a18cd22 157 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 158 //Classic BT not support
electricbaka 6:11e7e28869cd 159 blenano.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
RedBearLab 0:be2e4095513a 160
electricbaka 4:7e5d4a18cd22 161 //Connectable to Central
electricbaka 6:11e7e28869cd 162 blenano.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
electricbaka 4:7e5d4a18cd22 163
electricbaka 4:7e5d4a18cd22 164 //Local Name
electricbaka 6:11e7e28869cd 165 blenano.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
electricbaka 4:7e5d4a18cd22 166 (const uint8_t *)DEVICE_LOCAL_NAME, sizeof(DEVICE_LOCAL_NAME) - 1);
electricbaka 4:7e5d4a18cd22 167
electricbaka 4:7e5d4a18cd22 168 //GAP AdvertisingData
electricbaka 4:7e5d4a18cd22 169 reverseUUID(base_uuid, base_uuid_rev);
electricbaka 6:11e7e28869cd 170 blenano.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
electricbaka 4:7e5d4a18cd22 171 (uint8_t *)base_uuid_rev, sizeof(base_uuid));
electricbaka 4:7e5d4a18cd22 172
electricbaka 4:7e5d4a18cd22 173 //Advertising Interval
electricbaka 6:11e7e28869cd 174 blenano.setAdvertisingInterval(ADVERTISING_INTERVAL);
electricbaka 6:11e7e28869cd 175
electricbaka 4:7e5d4a18cd22 176 //Add Service
electricbaka 6:11e7e28869cd 177 blenano.addService(myService);
RedBearLab 0:be2e4095513a 178
electricbaka 4:7e5d4a18cd22 179 //Start Advertising
electricbaka 6:11e7e28869cd 180 blenano.startAdvertising();
RedBearLab 0:be2e4095513a 181
electricbaka 4:7e5d4a18cd22 182 //------------------------------------------------------------
electricbaka 4:7e5d4a18cd22 183 //Loop
electricbaka 4:7e5d4a18cd22 184 //------------------------------------------------------------
electricbaka 6:11e7e28869cd 185 int timer_ms;
electricbaka 6:11e7e28869cd 186
RedBearLab 0:be2e4095513a 187 while(1)
RedBearLab 0:be2e4095513a 188 {
electricbaka 6:11e7e28869cd 189 blenano.waitForEvent();
electricbaka 6:11e7e28869cd 190
electricbaka 6:11e7e28869cd 191 float s = ANALOG1;
electricbaka 6:11e7e28869cd 192 uint16_t value = s * 1024;
electricbaka 6:11e7e28869cd 193
electricbaka 6:11e7e28869cd 194 //---------------------------------------------------------------------------------------------
electricbaka 6:11e7e28869cd 195 //Detect HeartRate Peak
electricbaka 6:11e7e28869cd 196 //---------------------------------------------------------------------------------------------
electricbaka 6:11e7e28869cd 197 timer_ms = TICKER_TIME/1000 * timer_num;
electricbaka 6:11e7e28869cd 198 if(value >= threshold_v && timer_ms > threshold_t)
electricbaka 6:11e7e28869cd 199 {
electricbaka 6:11e7e28869cd 200 //clear timer_num
electricbaka 6:11e7e28869cd 201 timer_num = 0;
electricbaka 6:11e7e28869cd 202
electricbaka 6:11e7e28869cd 203 uint8_t buf[2];
electricbaka 6:11e7e28869cd 204 buf[0] = (timer_ms >> 8);
electricbaka 6:11e7e28869cd 205 buf[1] = timer_ms;
electricbaka 6:11e7e28869cd 206
electricbaka 6:11e7e28869cd 207 //Send out
electricbaka 6:11e7e28869cd 208 blenano.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 2);
electricbaka 6:11e7e28869cd 209 }
RedBearLab 0:be2e4095513a 210 }
electricbaka 4:7e5d4a18cd22 211 }