An example using the DAL's radio module that sends and recieves messages to let you know when someone is nearby. This is a one-way translation of the microbit-samples repository on GitHub. Please don't try to push changes here, instead push them to the source repo at https://github.com/lancaster-university/microbit-samples
Dependencies: microbit
main.cpp@1:95cf7ca80ca2, 2016-07-22 (annotated)
- Committer:
- LancasterUniversity
- Date:
- Fri Jul 22 17:52:54 2016 +0100
- Revision:
- 1:95cf7ca80ca2
- Parent:
- 0:5bd253669996
Update to git: v2.0.0-rc4-7-gd548fec
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
LancasterUniversity | 0:5bd253669996 | 1 | /* |
LancasterUniversity | 0:5bd253669996 | 2 | The MIT License (MIT) |
LancasterUniversity | 0:5bd253669996 | 3 | |
LancasterUniversity | 0:5bd253669996 | 4 | Copyright (c) 2016 British Broadcasting Corporation. |
LancasterUniversity | 0:5bd253669996 | 5 | This software is provided by Lancaster University by arrangement with the BBC. |
LancasterUniversity | 0:5bd253669996 | 6 | |
LancasterUniversity | 0:5bd253669996 | 7 | Permission is hereby granted, free of charge, to any person obtaining a |
LancasterUniversity | 0:5bd253669996 | 8 | copy of this software and associated documentation files (the "Software"), |
LancasterUniversity | 0:5bd253669996 | 9 | to deal in the Software without restriction, including without limitation |
LancasterUniversity | 0:5bd253669996 | 10 | the rights to use, copy, modify, merge, publish, distribute, sublicense, |
LancasterUniversity | 0:5bd253669996 | 11 | and/or sell copies of the Software, and to permit persons to whom the |
LancasterUniversity | 0:5bd253669996 | 12 | Software is furnished to do so, subject to the following conditions: |
LancasterUniversity | 0:5bd253669996 | 13 | |
LancasterUniversity | 0:5bd253669996 | 14 | The above copyright notice and this permission notice shall be included in |
LancasterUniversity | 0:5bd253669996 | 15 | all copies or substantial portions of the Software. |
LancasterUniversity | 0:5bd253669996 | 16 | |
LancasterUniversity | 0:5bd253669996 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
LancasterUniversity | 0:5bd253669996 | 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
LancasterUniversity | 0:5bd253669996 | 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
LancasterUniversity | 0:5bd253669996 | 20 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
LancasterUniversity | 0:5bd253669996 | 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
LancasterUniversity | 0:5bd253669996 | 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
LancasterUniversity | 0:5bd253669996 | 23 | DEALINGS IN THE SOFTWARE. |
LancasterUniversity | 0:5bd253669996 | 24 | */ |
LancasterUniversity | 0:5bd253669996 | 25 | |
LancasterUniversity | 0:5bd253669996 | 26 | |
LancasterUniversity | 0:5bd253669996 | 27 | /* |
LancasterUniversity | 0:5bd253669996 | 28 | * This is a simple example that uses the micro:bit radio to show if another |
LancasterUniversity | 0:5bd253669996 | 29 | * micro:bit running the same code is nearby. |
LancasterUniversity | 0:5bd253669996 | 30 | * |
LancasterUniversity | 0:5bd253669996 | 31 | * Each micro:bit is periodically broadcasting a group name, and listening |
LancasterUniversity | 0:5bd253669996 | 32 | * to see if another micro:bit in that group is also in-range. |
LancasterUniversity | 0:5bd253669996 | 33 | * |
LancasterUniversity | 0:5bd253669996 | 34 | * When another micro:bit in the same group is detected, the display of the |
LancasterUniversity | 0:5bd253669996 | 35 | * detecting micro:bit will show a filled-in heart shape |
LancasterUniversity | 0:5bd253669996 | 36 | * |
LancasterUniversity | 0:5bd253669996 | 37 | * Otherwise, the display will show an empty heart shape |
LancasterUniversity | 0:5bd253669996 | 38 | * |
LancasterUniversity | 0:5bd253669996 | 39 | */ |
LancasterUniversity | 0:5bd253669996 | 40 | |
LancasterUniversity | 0:5bd253669996 | 41 | #include "MicroBit.h" |
LancasterUniversity | 0:5bd253669996 | 42 | |
LancasterUniversity | 0:5bd253669996 | 43 | #if MICROBIT_BLE_ENABLED |
LancasterUniversity | 1:95cf7ca80ca2 | 44 | #ifdef YOTTA_CFG |
LancasterUniversity | 0:5bd253669996 | 45 | #error "This example needs BLE to be disabled. Use the yotta config.json in the proximit-heart directory to do this" |
LancasterUniversity | 0:5bd253669996 | 46 | #else |
LancasterUniversity | 0:5bd253669996 | 47 | #error "This example needs BLE to be disabled in the microbit config file in the microbit-dal: MicroBitConfig.h" |
LancasterUniversity | 0:5bd253669996 | 48 | #endif |
LancasterUniversity | 0:5bd253669996 | 49 | #endif |
LancasterUniversity | 0:5bd253669996 | 50 | |
LancasterUniversity | 0:5bd253669996 | 51 | MicroBit uBit; |
LancasterUniversity | 0:5bd253669996 | 52 | |
LancasterUniversity | 0:5bd253669996 | 53 | // Have we seen a friend recently? |
LancasterUniversity | 0:5bd253669996 | 54 | uint8_t friend_seen = 0; |
LancasterUniversity | 0:5bd253669996 | 55 | |
LancasterUniversity | 0:5bd253669996 | 56 | // Are we currently sending out messages? |
LancasterUniversity | 0:5bd253669996 | 57 | uint8_t broadcast = 1; |
LancasterUniversity | 0:5bd253669996 | 58 | |
LancasterUniversity | 0:5bd253669996 | 59 | /* We have a group name, and if any micro:bit is in range and in the group |
LancasterUniversity | 0:5bd253669996 | 60 | * then the others will see it. |
LancasterUniversity | 0:5bd253669996 | 61 | */ |
LancasterUniversity | 0:5bd253669996 | 62 | const char group_name[] = "tiger"; |
LancasterUniversity | 0:5bd253669996 | 63 | |
LancasterUniversity | 0:5bd253669996 | 64 | const uint8_t empty_heart_arr[] { |
LancasterUniversity | 0:5bd253669996 | 65 | 0, 1, 0, 1, 0, |
LancasterUniversity | 0:5bd253669996 | 66 | 1, 0, 1, 0, 1, |
LancasterUniversity | 0:5bd253669996 | 67 | 1, 0, 0, 0, 1, |
LancasterUniversity | 0:5bd253669996 | 68 | 0, 1, 0, 1, 0, |
LancasterUniversity | 0:5bd253669996 | 69 | 0, 0, 1, 0, 0, }; |
LancasterUniversity | 0:5bd253669996 | 70 | |
LancasterUniversity | 0:5bd253669996 | 71 | const uint8_t full_heart_arr[] { |
LancasterUniversity | 0:5bd253669996 | 72 | 0, 1, 0, 1, 0, |
LancasterUniversity | 0:5bd253669996 | 73 | 1, 1, 1, 1, 1, |
LancasterUniversity | 0:5bd253669996 | 74 | 1, 1, 1, 1, 1, |
LancasterUniversity | 0:5bd253669996 | 75 | 0, 1, 1, 1, 0, |
LancasterUniversity | 0:5bd253669996 | 76 | 0, 0, 1, 0, 0, }; |
LancasterUniversity | 0:5bd253669996 | 77 | |
LancasterUniversity | 0:5bd253669996 | 78 | const uint8_t small_heart_arr[] { |
LancasterUniversity | 0:5bd253669996 | 79 | 0, 0, 0, 0, 0, |
LancasterUniversity | 0:5bd253669996 | 80 | 0, 1, 0, 1, 0, |
LancasterUniversity | 0:5bd253669996 | 81 | 0, 1, 1, 1, 0, |
LancasterUniversity | 0:5bd253669996 | 82 | 0, 1, 1, 0, 0, |
LancasterUniversity | 0:5bd253669996 | 83 | 0, 0, 0, 0, 0, }; |
LancasterUniversity | 0:5bd253669996 | 84 | |
LancasterUniversity | 0:5bd253669996 | 85 | MicroBitImage empty_heart(5,5,empty_heart_arr); |
LancasterUniversity | 0:5bd253669996 | 86 | MicroBitImage full_heart(5,5,full_heart_arr); |
LancasterUniversity | 0:5bd253669996 | 87 | MicroBitImage small_heart(5,5,small_heart_arr); |
LancasterUniversity | 0:5bd253669996 | 88 | |
LancasterUniversity | 0:5bd253669996 | 89 | /* We send messages when people press buttons 'A' and 'B'. |
LancasterUniversity | 0:5bd253669996 | 90 | * At the moment, all micro:bits listening for messages |
LancasterUniversity | 0:5bd253669996 | 91 | * will see these and can respond to them |
LancasterUniversity | 0:5bd253669996 | 92 | * Challenge: make only certain micro:bits respond to these |
LancasterUniversity | 0:5bd253669996 | 93 | */ |
LancasterUniversity | 0:5bd253669996 | 94 | void onButtonA(MicroBitEvent) |
LancasterUniversity | 0:5bd253669996 | 95 | { |
LancasterUniversity | 0:5bd253669996 | 96 | uBit.radio.datagram.send("1"); |
LancasterUniversity | 0:5bd253669996 | 97 | } |
LancasterUniversity | 0:5bd253669996 | 98 | |
LancasterUniversity | 0:5bd253669996 | 99 | void onButtonB(MicroBitEvent) |
LancasterUniversity | 0:5bd253669996 | 100 | { |
LancasterUniversity | 0:5bd253669996 | 101 | uBit.radio.datagram.send("2"); |
LancasterUniversity | 0:5bd253669996 | 102 | } |
LancasterUniversity | 0:5bd253669996 | 103 | |
LancasterUniversity | 0:5bd253669996 | 104 | /* We toggle broadcasting if both buttons are pressed together */ |
LancasterUniversity | 0:5bd253669996 | 105 | void onButtonAB(MicroBitEvent) |
LancasterUniversity | 0:5bd253669996 | 106 | { |
LancasterUniversity | 0:5bd253669996 | 107 | broadcast = !broadcast; |
LancasterUniversity | 0:5bd253669996 | 108 | uBit.display.print("!"); |
LancasterUniversity | 0:5bd253669996 | 109 | } |
LancasterUniversity | 0:5bd253669996 | 110 | |
LancasterUniversity | 0:5bd253669996 | 111 | |
LancasterUniversity | 0:5bd253669996 | 112 | void onData(MicroBitEvent) |
LancasterUniversity | 0:5bd253669996 | 113 | { |
LancasterUniversity | 0:5bd253669996 | 114 | ManagedString s = uBit.radio.datagram.recv(); |
LancasterUniversity | 0:5bd253669996 | 115 | int rssi = uBit.radio.getRSSI(); |
LancasterUniversity | 0:5bd253669996 | 116 | |
LancasterUniversity | 0:5bd253669996 | 117 | if (s == "1") |
LancasterUniversity | 0:5bd253669996 | 118 | uBit.display.print(full_heart); |
LancasterUniversity | 0:5bd253669996 | 119 | |
LancasterUniversity | 0:5bd253669996 | 120 | if (s == "2") |
LancasterUniversity | 0:5bd253669996 | 121 | uBit.display.print(small_heart); |
LancasterUniversity | 0:5bd253669996 | 122 | |
LancasterUniversity | 0:5bd253669996 | 123 | /* For detecting the presence of our friend, we require them to be sending |
LancasterUniversity | 0:5bd253669996 | 124 | * the same group name as we are in |
LancasterUniversity | 0:5bd253669996 | 125 | */ |
LancasterUniversity | 0:5bd253669996 | 126 | if (s == group_name && rssi < 70) { |
LancasterUniversity | 0:5bd253669996 | 127 | // We can make this larger to allow more missed packets |
LancasterUniversity | 0:5bd253669996 | 128 | friend_seen = 3; |
LancasterUniversity | 0:5bd253669996 | 129 | } |
LancasterUniversity | 0:5bd253669996 | 130 | } |
LancasterUniversity | 0:5bd253669996 | 131 | |
LancasterUniversity | 0:5bd253669996 | 132 | int main() |
LancasterUniversity | 0:5bd253669996 | 133 | { |
LancasterUniversity | 0:5bd253669996 | 134 | // Initialise the micro:bit runtime. |
LancasterUniversity | 0:5bd253669996 | 135 | uBit.init(); |
LancasterUniversity | 0:5bd253669996 | 136 | |
LancasterUniversity | 0:5bd253669996 | 137 | // Setup some button handlers to allow direct heartbeat control with buttons |
LancasterUniversity | 0:5bd253669996 | 138 | uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButtonA); |
LancasterUniversity | 0:5bd253669996 | 139 | uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButtonB); |
LancasterUniversity | 0:5bd253669996 | 140 | uBit.messageBus.listen(MICROBIT_ID_BUTTON_AB, MICROBIT_EVT_ANY, onButtonAB); |
LancasterUniversity | 0:5bd253669996 | 141 | |
LancasterUniversity | 0:5bd253669996 | 142 | //Setup a hander to run when data is received |
LancasterUniversity | 0:5bd253669996 | 143 | uBit.messageBus.listen(MICROBIT_ID_RADIO, MICROBIT_RADIO_EVT_DATAGRAM, onData); |
LancasterUniversity | 0:5bd253669996 | 144 | |
LancasterUniversity | 0:5bd253669996 | 145 | uBit.radio.enable(); |
LancasterUniversity | 0:5bd253669996 | 146 | |
LancasterUniversity | 0:5bd253669996 | 147 | while(1) { |
LancasterUniversity | 0:5bd253669996 | 148 | if (friend_seen) { |
LancasterUniversity | 0:5bd253669996 | 149 | uBit.display.print(full_heart); |
LancasterUniversity | 0:5bd253669996 | 150 | friend_seen -= 1; |
LancasterUniversity | 0:5bd253669996 | 151 | } else { |
LancasterUniversity | 0:5bd253669996 | 152 | uBit.display.print(empty_heart); |
LancasterUniversity | 0:5bd253669996 | 153 | } |
LancasterUniversity | 0:5bd253669996 | 154 | |
LancasterUniversity | 0:5bd253669996 | 155 | if (broadcast) |
LancasterUniversity | 0:5bd253669996 | 156 | uBit.radio.datagram.send(group_name); |
LancasterUniversity | 0:5bd253669996 | 157 | |
LancasterUniversity | 0:5bd253669996 | 158 | uBit.sleep(1000); |
LancasterUniversity | 0:5bd253669996 | 159 | } |
LancasterUniversity | 0:5bd253669996 | 160 | } |