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

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?

UserRevisionLine numberNew 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 }