diff --git a/source/examples/bluetooth-services/config.json b/source/examples/bluetooth-services/config.json new file mode 100755 index 0000000..f0502e0 --- /dev/null +++ b/source/examples/bluetooth-services/config.json @@ -0,0 +1,17 @@ +{ + "microbit-dal": { + "bluetooth": { + "enabled": 1, + "pairing_mode": 1, + "private_addressing": 0, + "open": 0, + "whitelist": 1, + "advertising_timeout": 0, + "tx_power": 0, + "dfu_service": 0, + "event_service": 0, + "device_info_service": 1 + }, + "gatt_table_size": "0x700" + } +} diff --git a/source/examples/bluetooth-services/main.cpp b/source/examples/bluetooth-services/main.cpp new file mode 100755 index 0000000..1edbb13 --- /dev/null +++ b/source/examples/bluetooth-services/main.cpp @@ -0,0 +1,106 @@ +/* +The MIT License (MIT) + +Copyright (c) 2016 British Broadcasting Corporation. +This software is provided by Lancaster University by arrangement with the BBC. + +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. +*/ + +#include "MicroBit.h" + +MicroBit uBit; + +// we use events abd the 'connected' variable to keep track of the status of the Bluetooth connection +void onConnected(MicroBitEvent e) +{ + uBit.display.print("C"); +} + +void onDisconnected(MicroBitEvent e) +{ + uBit.display.print("D"); +} + +int main() +{ + // Initialise the micro:bit runtime. + uBit.init(); + + // Configuration Tips + // + // config.json contains various Bluetooth related properties some of which are explained here: + // + // "dfu_service": 1, // 1 will cause the DFU service to be instantiated + // "event_service": 1, // 1 causes the event service to be instantiated + // "device_info_service": 1 + // "enabled": 1, // 1 means the Bluetooth stack will be included as standard. 0 means it will not. + // "pairing_mode": 1, // 1 means it's possible to go into pairing mode which will include bringing up the Bluetooth stack whilst in that mode. + // "open": 0, // 1 means there's no Bluetooth security i.e. no need to pair the micro:bit with other devices that want to communicate with it. + // "tx_power": 7, // Transmission power of the Bluetooth radio. A value of 0 - 7 with 0 the lowest power and 7 the highest power. + // "gatt_table_size": "0x700" // Amount of memory (in hex bytes) set aside for the Bluetooth GATT table + // "nested_heap_proportion": 0.75, // Reducing this can sometimes help make enough memory available for all the Bluetooth services you want. Only experiment with this as a last resort. + + // MicrobitConfig.h in yotta_modules\microbit-dal\inc\core contains MICROBIT_BLE_SECURITY_LEVEL which can be set to SECURITY_MODE_ENCRYPTION_WITH_MITM for passkey authentication when + // pairing or SECURITY_MODE_ENCRYPTION_NO_MITM to use Just Works pairing. + + // A cunning code to indicate during start-up the particular Bluetooth configuration in the build + // + // SERVICE CODES + // A: Accelerometer Service + // B: Button Service + // D: Device Information Service + // E: Event Service + // F: DFU Service + // I: IO Pin Service + // L: LED Service + // M: Magnetometer Service + // T: Temperature Service + // U: UART Service + // + // PAIRING CONFIG + // Note that switching pairing on or off is achieved by setting "open" in config.json to 1 or 0 respectively + + // P: PASSKEY + // J: Just Works + // N: No Pairing Required + // + // TX Power Level + // 0-7 taken from tx_power in config.json + + + // Services/Pairing Config/Power Level + uBit.display.scroll("BLE ABDILMT/P/0"); + + uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_CONNECTED, onConnected); + uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, onDisconnected); + + new MicroBitAccelerometerService(*uBit.ble, uBit.accelerometer); + new MicroBitButtonService(*uBit.ble); + new MicroBitIOPinService(*uBit.ble, uBit.io); + new MicroBitLEDService(*uBit.ble, uBit.display); + new MicroBitMagnetometerService(*uBit.ble, uBit.compass); + new MicroBitTemperatureService(*uBit.ble, uBit.thermometer); + + // If main exits, there may still be other fibers running or registered event handlers etc. + // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then + // sit in the idle task forever, in a power efficient sleep. + release_fiber(); +} + diff --git a/source/examples/bluetooth-uart/config.json b/source/examples/bluetooth-uart/config.json new file mode 100755 index 0000000..1be7a42 --- /dev/null +++ b/source/examples/bluetooth-uart/config.json @@ -0,0 +1,17 @@ +{ + "microbit-dal": { + "bluetooth": { + "enabled": 1, + "pairing_mode": 1, + "private_addressing": 0, + "open": 0, + "whitelist": 1, + "advertising_timeout": 0, + "tx_power": 0, + "dfu_service": 1, + "event_service": 0, + "device_info_service": 1 + }, + "gatt_table_size": "0x600" + } +} diff --git a/source/examples/bluetooth-uart/main.cpp b/source/examples/bluetooth-uart/main.cpp new file mode 100755 index 0000000..56818d1 --- /dev/null +++ b/source/examples/bluetooth-uart/main.cpp @@ -0,0 +1,108 @@ +/* +The MIT License (MIT) + +Copyright (c) 2016 British Broadcasting Corporation. +This software is provided by Lancaster University by arrangement with the BBC. + +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. +*/ + +// Works with the Animal Vegetable Mineral guessing game in the Android 'micro:bit Blue' app which is obtainable from +// https://play.google.com/store/apps/details?id=com.bluetooth.mwoolley.microbitbledemo + +#include "MicroBit.h" +#include "MicroBitUARTService.h" + +MicroBit uBit; +MicroBitUARTService *uart; + +int connected = 0; + +void onConnected(MicroBitEvent e) +{ + + uBit.display.scroll("C"); + + connected = 1; + + // mobile app will send ASCII strings terminated with the colon character + ManagedString eom(":"); + + while(1) { + ManagedString msg = uart->readUntil(eom); + uBit.display.scroll(msg); + } + +} + +void onDisconnected(MicroBitEvent e) +{ + uBit.display.scroll("D"); + connected = 0; +} + +void onButtonA(MicroBitEvent e) +{ + if (connected == 0) { + return; + } + uart->send(ManagedString("YES")); + uBit.display.scroll("Y"); +} + +void onButtonB(MicroBitEvent e) +{ + if (connected == 0) { + return; + } + uart->send(ManagedString("NO")); + uBit.display.scroll("N"); +} + +void onButtonAB(MicroBitEvent e) +{ + if (connected == 0) { + return; + } + uart->send(ManagedString("GOT IT!!")); + uBit.display.scroll("!"); +} + +int main() +{ + // Initialise the micro:bit runtime. + uBit.init(); + + uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_CONNECTED, onConnected); + uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, onDisconnected); + uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA); + uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB); + uBit.messageBus.listen(MICROBIT_ID_BUTTON_AB, MICROBIT_BUTTON_EVT_CLICK, onButtonAB); + + + // Note GATT table size increased from default in MicroBitConfig.h + // #define MICROBIT_SD_GATT_TABLE_SIZE 0x500 + uart = new MicroBitUARTService(*uBit.ble, 32, 32); + uBit.display.scroll("UART ready"); + + // If main exits, there may still be other fibers running or registered event handlers etc. + // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then + // sit in the idle task forever, in a power efficient sleep. + release_fiber(); +}