electric baka
/
BLENano2_SimpleTemplate
for BLE Nano v2
Diff: main.cpp
- Revision:
- 0:5f632ba61cb5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Sep 24 09:49:58 2017 +0000 @@ -0,0 +1,197 @@ +/* + +Copyright (c) 2012-2014 RedBearLab + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/* + * The application works with the BlueJelly.js + * + * http://jellyware.jp/kurage/ + * https://github.com/electricbaka/bluejelly + * + */ + +//====================================================================== +//Grobal +//====================================================================== +//------------------------------------------------------------ +//Include Header Files +//------------------------------------------------------------ +#include "mbed.h" +#include "ble/BLE.h" + + +//------------------------------------------------------------ +//Definition +//------------------------------------------------------------ +#define TXRX_BUF_LEN 20 //max 20[byte] +#define DEVICE_LOCAL_NAME "BlueJelly" +#define ADVERTISING_INTERVAL 160 //160 * 0.625[ms] = 100[ms] +#define TICKER_TIME 200000 //200000[us] = 200[ms] +#define DIGITAL_OUT_PIN P0_29 +#define ANALOG_IN_PIN1 P0_5 +#define ANALOG_IN_PIN2 P0_4 + + +//------------------------------------------------------------ +//Object generation +//------------------------------------------------------------ +BLE ble; +DigitalOut LED_SET(DIGITAL_OUT_PIN); +AnalogIn ANALOG1(ANALOG_IN_PIN1); +AnalogIn ANALOG2(ANALOG_IN_PIN2); + + +//------------------------------------------------------------ +//Service & Characteristic Setting +//------------------------------------------------------------ +//Service UUID +static const uint8_t base_uuid[] = { 0x71, 0x3D, 0x00, 0x00, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E } ; + +//Characteristic UUID +static const uint8_t tx_uuid[] = { 0x71, 0x3D, 0x00, 0x03, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E } ; +static const uint8_t rx_uuid[] = { 0x71, 0x3D, 0x00, 0x02, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E } ; + +//Characteristic Value +uint8_t txPayload[TXRX_BUF_LEN] = {0,}; +uint8_t rxPayload[TXRX_BUF_LEN] = {0,}; + +//Characteristic Property Setting etc +GattCharacteristic txCharacteristic (tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +GattCharacteristic rxCharacteristic (rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +GattCharacteristic *myChars[] = {&txCharacteristic, &rxCharacteristic}; + +//Service Setting +GattService myService(base_uuid, myChars, sizeof(myChars) / sizeof(GattCharacteristic *)); + + +//====================================================================== +//onDisconnection +//====================================================================== +void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) +{ + ble.startAdvertising(); +} + + +//====================================================================== +//onDataWritten +//====================================================================== +void WrittenHandler(const GattWriteCallbackParams *Handler) +{ + uint8_t buf[TXRX_BUF_LEN]; + uint16_t bytesRead; + + if (Handler->handle == txCharacteristic.getValueAttribute().getHandle()) + { + ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead); + memset(txPayload, 0, TXRX_BUF_LEN); + memcpy(txPayload, buf, TXRX_BUF_LEN); + + if(buf[0] == 1) + LED_SET = 1; + else + LED_SET = 0; + } +} + + +//====================================================================== +//onTimeout +//====================================================================== +void m_status_check_handle(void) +{ + uint8_t buf[2]; + + //Read Analog port + float s1 = ANALOG1; + float s2 = ANALOG2; + uint16_t value = s1/s2 * 1024; + + buf[0] = (value >> 8); + buf[1] = value; + + //Send out + ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 2); +} + + +//====================================================================== +//convert reverse UUID +//====================================================================== +void reverseUUID(const uint8_t* src, uint8_t* dst) +{ + int i; + + for(i=0;i<16;i++) + dst[i] = src[15 - i]; +} + + +//====================================================================== +//main +//====================================================================== +int main(void) +{ + uint8_t base_uuid_rev[16]; + + //Timer Setting [us] + Ticker ticker; + ticker.attach_us(m_status_check_handle, TICKER_TIME); + + //BLE init + ble.init(); + + //EventListener + ble.onDisconnection(disconnectionCallback); + ble.onDataWritten(WrittenHandler); + + //------------------------------------------------------------ + //setup advertising + //------------------------------------------------------------ + //Classic BT not support + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); + + //Connectable to Central + ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + + //Local Name + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, + (const uint8_t *)DEVICE_LOCAL_NAME, sizeof(DEVICE_LOCAL_NAME) - 1); + + //GAP AdvertisingData + reverseUUID(base_uuid, base_uuid_rev); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, + (uint8_t *)base_uuid_rev, sizeof(base_uuid)); + + //Advertising Interval + ble.setAdvertisingInterval(ADVERTISING_INTERVAL); + + //Add Service + ble.addService(myService); + + //Start Advertising + ble.startAdvertising(); + + //------------------------------------------------------------ + //Loop + //------------------------------------------------------------ + while(1) + { + ble.waitForEvent(); + } +}