for BLE Nano v2

Committer:
electricbaka
Date:
Sun Sep 24 09:49:58 2017 +0000
Revision:
0:5f632ba61cb5
for BLE Nano v2

Who changed what in which revision?

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