Official Sheffield ARMBand micro:bit program

Committer:
MrBedfordVan
Date:
Mon Oct 17 12:41:20 2016 +0000
Revision:
0:b9164b348919
Official Sheffield ARMBand Micro:bit program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MrBedfordVan 0:b9164b348919 1 /*
MrBedfordVan 0:b9164b348919 2 The MIT License (MIT)
MrBedfordVan 0:b9164b348919 3
MrBedfordVan 0:b9164b348919 4 Copyright (c) 2016 British Broadcasting Corporation.
MrBedfordVan 0:b9164b348919 5 This software is provided by Lancaster University by arrangement with the BBC.
MrBedfordVan 0:b9164b348919 6
MrBedfordVan 0:b9164b348919 7 Permission is hereby granted, free of charge, to any person obtaining a
MrBedfordVan 0:b9164b348919 8 copy of this software and associated documentation files (the "Software"),
MrBedfordVan 0:b9164b348919 9 to deal in the Software without restriction, including without limitation
MrBedfordVan 0:b9164b348919 10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
MrBedfordVan 0:b9164b348919 11 and/or sell copies of the Software, and to permit persons to whom the
MrBedfordVan 0:b9164b348919 12 Software is furnished to do so, subject to the following conditions:
MrBedfordVan 0:b9164b348919 13
MrBedfordVan 0:b9164b348919 14 The above copyright notice and this permission notice shall be included in
MrBedfordVan 0:b9164b348919 15 all copies or substantial portions of the Software.
MrBedfordVan 0:b9164b348919 16
MrBedfordVan 0:b9164b348919 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
MrBedfordVan 0:b9164b348919 18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
MrBedfordVan 0:b9164b348919 19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
MrBedfordVan 0:b9164b348919 20 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
MrBedfordVan 0:b9164b348919 21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
MrBedfordVan 0:b9164b348919 22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
MrBedfordVan 0:b9164b348919 23 DEALINGS IN THE SOFTWARE.
MrBedfordVan 0:b9164b348919 24 */
MrBedfordVan 0:b9164b348919 25
MrBedfordVan 0:b9164b348919 26 #ifndef MICROBIT_H
MrBedfordVan 0:b9164b348919 27 #define MICROBIT_H
MrBedfordVan 0:b9164b348919 28
MrBedfordVan 0:b9164b348919 29 #include "mbed.h"
MrBedfordVan 0:b9164b348919 30
MrBedfordVan 0:b9164b348919 31 #include "MicroBitConfig.h"
MrBedfordVan 0:b9164b348919 32 #include "MicroBitHeapAllocator.h"
MrBedfordVan 0:b9164b348919 33 #include "MicroBitDevice.h"
MrBedfordVan 0:b9164b348919 34 #include "ErrorNo.h"
MrBedfordVan 0:b9164b348919 35 #include "MicroBitSystemTimer.h"
MrBedfordVan 0:b9164b348919 36 #include "Matrix4.h"
MrBedfordVan 0:b9164b348919 37 #include "MicroBitCompat.h"
MrBedfordVan 0:b9164b348919 38 #include "MicroBitComponent.h"
MrBedfordVan 0:b9164b348919 39 #include "ManagedType.h"
MrBedfordVan 0:b9164b348919 40 #include "ManagedString.h"
MrBedfordVan 0:b9164b348919 41 #include "MicroBitImage.h"
MrBedfordVan 0:b9164b348919 42 #include "MicroBitFont.h"
MrBedfordVan 0:b9164b348919 43 #include "MicroBitEvent.h"
MrBedfordVan 0:b9164b348919 44 #include "DynamicPwm.h"
MrBedfordVan 0:b9164b348919 45 #include "MicroBitI2C.h"
MrBedfordVan 0:b9164b348919 46 #include "NotifyEvents.h"
MrBedfordVan 0:b9164b348919 47
MrBedfordVan 0:b9164b348919 48 #include "MicroBitButton.h"
MrBedfordVan 0:b9164b348919 49 #include "MicroBitPin.h"
MrBedfordVan 0:b9164b348919 50 #include "MicroBitCompass.h"
MrBedfordVan 0:b9164b348919 51 #include "MicroBitCompassCalibrator.h"
MrBedfordVan 0:b9164b348919 52 #include "MicroBitAccelerometer.h"
MrBedfordVan 0:b9164b348919 53 #include "MicroBitThermometer.h"
MrBedfordVan 0:b9164b348919 54 #include "MicroBitLightSensor.h"
MrBedfordVan 0:b9164b348919 55 #include "MicroBitMultiButton.h"
MrBedfordVan 0:b9164b348919 56
MrBedfordVan 0:b9164b348919 57 #include "MicroBitSerial.h"
MrBedfordVan 0:b9164b348919 58 #include "MicroBitIO.h"
MrBedfordVan 0:b9164b348919 59 #include "MicroBitMatrixMaps.h"
MrBedfordVan 0:b9164b348919 60 #include "MicroBitDisplay.h"
MrBedfordVan 0:b9164b348919 61
MrBedfordVan 0:b9164b348919 62 #include "MicroBitFiber.h"
MrBedfordVan 0:b9164b348919 63 #include "MicroBitMessageBus.h"
MrBedfordVan 0:b9164b348919 64
MrBedfordVan 0:b9164b348919 65 #include "MicroBitBLEManager.h"
MrBedfordVan 0:b9164b348919 66 #include "MicroBitRadio.h"
MrBedfordVan 0:b9164b348919 67 #include "MicroBitStorage.h"
MrBedfordVan 0:b9164b348919 68
MrBedfordVan 0:b9164b348919 69 // MicroBit::flags values
MrBedfordVan 0:b9164b348919 70 #define MICROBIT_INITIALIZED 0x01
MrBedfordVan 0:b9164b348919 71
MrBedfordVan 0:b9164b348919 72 /**
MrBedfordVan 0:b9164b348919 73 * Class definition for a MicroBit device.
MrBedfordVan 0:b9164b348919 74 *
MrBedfordVan 0:b9164b348919 75 * Represents the device as a whole, and includes member variables that represent various device drivers
MrBedfordVan 0:b9164b348919 76 * used to control aspects of the micro:bit.
MrBedfordVan 0:b9164b348919 77 */
MrBedfordVan 0:b9164b348919 78 class MicroBit
MrBedfordVan 0:b9164b348919 79 {
MrBedfordVan 0:b9164b348919 80 private:
MrBedfordVan 0:b9164b348919 81
MrBedfordVan 0:b9164b348919 82 /**
MrBedfordVan 0:b9164b348919 83 * A listener to perform actions as a result of Message Bus reflection.
MrBedfordVan 0:b9164b348919 84 *
MrBedfordVan 0:b9164b348919 85 * In some cases we want to perform lazy instantiation of components, such as
MrBedfordVan 0:b9164b348919 86 * the compass and the accelerometer, where we only want to add them to the idle
MrBedfordVan 0:b9164b348919 87 * fiber when someone has the intention of using these components.
MrBedfordVan 0:b9164b348919 88 */
MrBedfordVan 0:b9164b348919 89 void onListenerRegisteredEvent(MicroBitEvent evt);
MrBedfordVan 0:b9164b348919 90
MrBedfordVan 0:b9164b348919 91 uint8_t status;
MrBedfordVan 0:b9164b348919 92
MrBedfordVan 0:b9164b348919 93 public:
MrBedfordVan 0:b9164b348919 94
MrBedfordVan 0:b9164b348919 95 // Serial Interface
MrBedfordVan 0:b9164b348919 96 MicroBitSerial serial;
MrBedfordVan 0:b9164b348919 97
MrBedfordVan 0:b9164b348919 98 // Reset Button
MrBedfordVan 0:b9164b348919 99 InterruptIn resetButton;
MrBedfordVan 0:b9164b348919 100
MrBedfordVan 0:b9164b348919 101 // Persistent key value store
MrBedfordVan 0:b9164b348919 102 MicroBitStorage storage;
MrBedfordVan 0:b9164b348919 103
MrBedfordVan 0:b9164b348919 104 // I2C Interface
MrBedfordVan 0:b9164b348919 105 MicroBitI2C i2c;
MrBedfordVan 0:b9164b348919 106
MrBedfordVan 0:b9164b348919 107 // Device level Message Bus abstraction
MrBedfordVan 0:b9164b348919 108 MicroBitMessageBus messageBus;
MrBedfordVan 0:b9164b348919 109
MrBedfordVan 0:b9164b348919 110 // Member variables to represent each of the core components on the device.
MrBedfordVan 0:b9164b348919 111 MicroBitDisplay display;
MrBedfordVan 0:b9164b348919 112 MicroBitButton buttonA;
MrBedfordVan 0:b9164b348919 113 MicroBitButton buttonB;
MrBedfordVan 0:b9164b348919 114 MicroBitMultiButton buttonAB;
MrBedfordVan 0:b9164b348919 115 MicroBitAccelerometer accelerometer;
MrBedfordVan 0:b9164b348919 116 MicroBitCompass compass;
MrBedfordVan 0:b9164b348919 117 MicroBitCompassCalibrator compassCalibrator;
MrBedfordVan 0:b9164b348919 118 MicroBitThermometer thermometer;
MrBedfordVan 0:b9164b348919 119
MrBedfordVan 0:b9164b348919 120 //An object of available IO pins on the device
MrBedfordVan 0:b9164b348919 121 MicroBitIO io;
MrBedfordVan 0:b9164b348919 122
MrBedfordVan 0:b9164b348919 123 // Bluetooth related member variables.
MrBedfordVan 0:b9164b348919 124 MicroBitBLEManager bleManager;
MrBedfordVan 0:b9164b348919 125 MicroBitRadio radio;
MrBedfordVan 0:b9164b348919 126 BLEDevice *ble;
MrBedfordVan 0:b9164b348919 127
MrBedfordVan 0:b9164b348919 128 /**
MrBedfordVan 0:b9164b348919 129 * Constructor.
MrBedfordVan 0:b9164b348919 130 *
MrBedfordVan 0:b9164b348919 131 * Create a representation of a MicroBit device, which includes member variables
MrBedfordVan 0:b9164b348919 132 * that represent various device drivers used to control aspects of the micro:bit.
MrBedfordVan 0:b9164b348919 133 */
MrBedfordVan 0:b9164b348919 134 MicroBit();
MrBedfordVan 0:b9164b348919 135
MrBedfordVan 0:b9164b348919 136 /**
MrBedfordVan 0:b9164b348919 137 * Post constructor initialisation method.
MrBedfordVan 0:b9164b348919 138 *
MrBedfordVan 0:b9164b348919 139 * This call will initialised the scheduler, memory allocator and Bluetooth stack.
MrBedfordVan 0:b9164b348919 140 *
MrBedfordVan 0:b9164b348919 141 * This is required as the Bluetooth stack can't be brought up in a
MrBedfordVan 0:b9164b348919 142 * static context i.e. in a constructor.
MrBedfordVan 0:b9164b348919 143 *
MrBedfordVan 0:b9164b348919 144 * @code
MrBedfordVan 0:b9164b348919 145 * uBit.init();
MrBedfordVan 0:b9164b348919 146 * @endcode
MrBedfordVan 0:b9164b348919 147 *
MrBedfordVan 0:b9164b348919 148 * @note This method must be called before user code utilises any functionality
MrBedfordVan 0:b9164b348919 149 * contained by uBit.
MrBedfordVan 0:b9164b348919 150 */
MrBedfordVan 0:b9164b348919 151 void init();
MrBedfordVan 0:b9164b348919 152
MrBedfordVan 0:b9164b348919 153 /**
MrBedfordVan 0:b9164b348919 154 * Return the friendly name for this device.
MrBedfordVan 0:b9164b348919 155 *
MrBedfordVan 0:b9164b348919 156 * @return A ManagedString representing the friendly name of this device.
MrBedfordVan 0:b9164b348919 157 *
MrBedfordVan 0:b9164b348919 158 * @code
MrBedfordVan 0:b9164b348919 159 * ManagedString name = uBit.getName();
MrBedfordVan 0:b9164b348919 160 * @endcode
MrBedfordVan 0:b9164b348919 161 */
MrBedfordVan 0:b9164b348919 162 static ManagedString getName();
MrBedfordVan 0:b9164b348919 163
MrBedfordVan 0:b9164b348919 164 /**
MrBedfordVan 0:b9164b348919 165 * Return the serial number of this device.
MrBedfordVan 0:b9164b348919 166 *
MrBedfordVan 0:b9164b348919 167 * @return A ManagedString representing the serial number of this device.
MrBedfordVan 0:b9164b348919 168 *
MrBedfordVan 0:b9164b348919 169 * @code
MrBedfordVan 0:b9164b348919 170 * ManagedString serialNumber = uBit.getSerial();
MrBedfordVan 0:b9164b348919 171 * @endcode
MrBedfordVan 0:b9164b348919 172 */
MrBedfordVan 0:b9164b348919 173 static ManagedString getSerial();
MrBedfordVan 0:b9164b348919 174
MrBedfordVan 0:b9164b348919 175 /**
MrBedfordVan 0:b9164b348919 176 * Will reset the micro:bit when called.
MrBedfordVan 0:b9164b348919 177 *
MrBedfordVan 0:b9164b348919 178 * @code
MrBedfordVan 0:b9164b348919 179 * uBit.reset();
MrBedfordVan 0:b9164b348919 180 * @endcode
MrBedfordVan 0:b9164b348919 181 */
MrBedfordVan 0:b9164b348919 182 void reset();
MrBedfordVan 0:b9164b348919 183
MrBedfordVan 0:b9164b348919 184 /**
MrBedfordVan 0:b9164b348919 185 * Delay execution for the given amount of time.
MrBedfordVan 0:b9164b348919 186 *
MrBedfordVan 0:b9164b348919 187 * If the scheduler is running, this will deschedule the current fiber and perform
MrBedfordVan 0:b9164b348919 188 * a power efficient, concurrent sleep operation.
MrBedfordVan 0:b9164b348919 189 *
MrBedfordVan 0:b9164b348919 190 * If the scheduler is disabled or we're running in an interrupt context, this
MrBedfordVan 0:b9164b348919 191 * will revert to a busy wait.
MrBedfordVan 0:b9164b348919 192 *
MrBedfordVan 0:b9164b348919 193 * Alternatively: wait, wait_ms, wait_us can be used which will perform a blocking sleep
MrBedfordVan 0:b9164b348919 194 * operation.
MrBedfordVan 0:b9164b348919 195 *
MrBedfordVan 0:b9164b348919 196 * @param milliseconds the amount of time, in ms, to wait for. This number cannot be negative.
MrBedfordVan 0:b9164b348919 197 *
MrBedfordVan 0:b9164b348919 198 * @return MICROBIT_OK on success, MICROBIT_INVALID_PARAMETER milliseconds is less than zero.
MrBedfordVan 0:b9164b348919 199 *
MrBedfordVan 0:b9164b348919 200 * @code
MrBedfordVan 0:b9164b348919 201 * uBit.sleep(20); //sleep for 20ms
MrBedfordVan 0:b9164b348919 202 * @endcode
MrBedfordVan 0:b9164b348919 203 *
MrBedfordVan 0:b9164b348919 204 * @note This operation is currently limited by the rate of the system timer, therefore
MrBedfordVan 0:b9164b348919 205 * the granularity of the sleep operation is limited to 6 ms unless the rate of
MrBedfordVan 0:b9164b348919 206 * the system timer is modified.
MrBedfordVan 0:b9164b348919 207 */
MrBedfordVan 0:b9164b348919 208 void sleep(uint32_t milliseconds);
MrBedfordVan 0:b9164b348919 209
MrBedfordVan 0:b9164b348919 210 /**
MrBedfordVan 0:b9164b348919 211 * Seed the pseudo random number generator using the hardware random number generator.
MrBedfordVan 0:b9164b348919 212 *
MrBedfordVan 0:b9164b348919 213 * @code
MrBedfordVan 0:b9164b348919 214 * uBit.seedRandom();
MrBedfordVan 0:b9164b348919 215 * @endcode
MrBedfordVan 0:b9164b348919 216 */
MrBedfordVan 0:b9164b348919 217 void seedRandom();
MrBedfordVan 0:b9164b348919 218
MrBedfordVan 0:b9164b348919 219 /**
MrBedfordVan 0:b9164b348919 220 * Seed the pseudo random number generator using the given value.
MrBedfordVan 0:b9164b348919 221 *
MrBedfordVan 0:b9164b348919 222 * @param seed The 32-bit value to seed the generator with.
MrBedfordVan 0:b9164b348919 223 *
MrBedfordVan 0:b9164b348919 224 * @code
MrBedfordVan 0:b9164b348919 225 * uBit.seedRandom(0xBB5EED);
MrBedfordVan 0:b9164b348919 226 * @endcode
MrBedfordVan 0:b9164b348919 227 */
MrBedfordVan 0:b9164b348919 228 void seedRandom(uint32_t seed);
MrBedfordVan 0:b9164b348919 229
MrBedfordVan 0:b9164b348919 230
MrBedfordVan 0:b9164b348919 231 /**
MrBedfordVan 0:b9164b348919 232 * Generate a random number in the given range.
MrBedfordVan 0:b9164b348919 233 * We use a simple Galois LFSR random number generator here,
MrBedfordVan 0:b9164b348919 234 * as a Galois LFSR is sufficient for our applications, and much more lightweight
MrBedfordVan 0:b9164b348919 235 * than the hardware random number generator built int the processor, which takes
MrBedfordVan 0:b9164b348919 236 * a long time and uses a lot of energy.
MrBedfordVan 0:b9164b348919 237 *
MrBedfordVan 0:b9164b348919 238 * KIDS: You shouldn't use this is the real world to generate cryptographic keys though...
MrBedfordVan 0:b9164b348919 239 * have a think why not. :-)
MrBedfordVan 0:b9164b348919 240 *
MrBedfordVan 0:b9164b348919 241 * @param max the upper range to generate a number for. This number cannot be negative.
MrBedfordVan 0:b9164b348919 242 *
MrBedfordVan 0:b9164b348919 243 * @return A random, natural number between 0 and the max-1. Or MICROBIT_INVALID_VALUE if max is <= 0.
MrBedfordVan 0:b9164b348919 244 *
MrBedfordVan 0:b9164b348919 245 * @code
MrBedfordVan 0:b9164b348919 246 * uBit.random(200); //a number between 0 and 199
MrBedfordVan 0:b9164b348919 247 * @endcode
MrBedfordVan 0:b9164b348919 248 */
MrBedfordVan 0:b9164b348919 249 int random(int max);
MrBedfordVan 0:b9164b348919 250
MrBedfordVan 0:b9164b348919 251 /**
MrBedfordVan 0:b9164b348919 252 * Determine the time since this MicroBit was last reset.
MrBedfordVan 0:b9164b348919 253 *
MrBedfordVan 0:b9164b348919 254 * @return The time since the last reset, in milliseconds.
MrBedfordVan 0:b9164b348919 255 *
MrBedfordVan 0:b9164b348919 256 * @note This will value overflow after 1.6 months.
MrBedfordVan 0:b9164b348919 257 */
MrBedfordVan 0:b9164b348919 258 //TODO: handle overflow case.
MrBedfordVan 0:b9164b348919 259 unsigned long systemTime();
MrBedfordVan 0:b9164b348919 260
MrBedfordVan 0:b9164b348919 261 /**
MrBedfordVan 0:b9164b348919 262 * Determine the version of the micro:bit runtime currently in use.
MrBedfordVan 0:b9164b348919 263 *
MrBedfordVan 0:b9164b348919 264 * @return A textual description of the version of the micro:bit runtime that
MrBedfordVan 0:b9164b348919 265 * is currently running on this device.
MrBedfordVan 0:b9164b348919 266 */
MrBedfordVan 0:b9164b348919 267 const char *systemVersion();
MrBedfordVan 0:b9164b348919 268
MrBedfordVan 0:b9164b348919 269 /**
MrBedfordVan 0:b9164b348919 270 * Triggers a microbit panic where an loop will display a panic face
MrBedfordVan 0:b9164b348919 271 * and the status code, if provided.
MrBedfordVan 0:b9164b348919 272 *
MrBedfordVan 0:b9164b348919 273 * This loop will continue for panic_timeout iterations, defaults to 0 (infinite).
MrBedfordVan 0:b9164b348919 274 *
MrBedfordVan 0:b9164b348919 275 * panic_timeout can be configured via a call to microbit_panic_timeout.
MrBedfordVan 0:b9164b348919 276 *
MrBedfordVan 0:b9164b348919 277 * @param statusCode the status code of the associated error.
MrBedfordVan 0:b9164b348919 278 *
MrBedfordVan 0:b9164b348919 279 * @code
MrBedfordVan 0:b9164b348919 280 * microbit_panic_timeout(4);
MrBedfordVan 0:b9164b348919 281 *
MrBedfordVan 0:b9164b348919 282 * // will display loop for 4 iterations.
MrBedfordVan 0:b9164b348919 283 * uBit.panic(10);
MrBedfordVan 0:b9164b348919 284 * @endcode
MrBedfordVan 0:b9164b348919 285 */
MrBedfordVan 0:b9164b348919 286 void panic(int statusCode = 0);
MrBedfordVan 0:b9164b348919 287
MrBedfordVan 0:b9164b348919 288 /**
MrBedfordVan 0:b9164b348919 289 * Add a component to the array of system components. This component will then receive
MrBedfordVan 0:b9164b348919 290 * periodic callbacks, once every tick period in interrupt context.
MrBedfordVan 0:b9164b348919 291 *
MrBedfordVan 0:b9164b348919 292 * @param component The component to add.
MrBedfordVan 0:b9164b348919 293 *
MrBedfordVan 0:b9164b348919 294 * @return MICROBIT_OK on success or MICROBIT_NO_RESOURCES if the component array is full.
MrBedfordVan 0:b9164b348919 295 *
MrBedfordVan 0:b9164b348919 296 * @code
MrBedfordVan 0:b9164b348919 297 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 298 * MicroBitDisplay* display = new MicroBitDisplay();
MrBedfordVan 0:b9164b348919 299 *
MrBedfordVan 0:b9164b348919 300 * uBit.addSystemComponent(display);
MrBedfordVan 0:b9164b348919 301 * @endcode
MrBedfordVan 0:b9164b348919 302 *
MrBedfordVan 0:b9164b348919 303 * @note This interface is now deprecated, and will be removed in the next major release. Please use system_timer_add_component().
MrBedfordVan 0:b9164b348919 304 */
MrBedfordVan 0:b9164b348919 305 int addSystemComponent(MicroBitComponent *component);
MrBedfordVan 0:b9164b348919 306
MrBedfordVan 0:b9164b348919 307 /**
MrBedfordVan 0:b9164b348919 308 * Remove a component from the array of system components. This component will no longer receive
MrBedfordVan 0:b9164b348919 309 * periodic callbacks.
MrBedfordVan 0:b9164b348919 310 *
MrBedfordVan 0:b9164b348919 311 * @param component The component to remove.
MrBedfordVan 0:b9164b348919 312 *
MrBedfordVan 0:b9164b348919 313 * @return MICROBIT_OK on success or MICROBIT_INVALID_PARAMETER is returned if the given component has not been previously added.
MrBedfordVan 0:b9164b348919 314 *
MrBedfordVan 0:b9164b348919 315 * @code
MrBedfordVan 0:b9164b348919 316 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 317 * MicroBitDisplay* display = new MicroBitDisplay();
MrBedfordVan 0:b9164b348919 318 *
MrBedfordVan 0:b9164b348919 319 * uBit.addSystemComponent(display);
MrBedfordVan 0:b9164b348919 320 *
MrBedfordVan 0:b9164b348919 321 * uBit.removeSystemComponent(display);
MrBedfordVan 0:b9164b348919 322 * @endcode
MrBedfordVan 0:b9164b348919 323 *
MrBedfordVan 0:b9164b348919 324 * @note This interface is now deprecated, and will be removed in the next major release. Please use system_timer_remove_component().
MrBedfordVan 0:b9164b348919 325 */
MrBedfordVan 0:b9164b348919 326 int removeSystemComponent(MicroBitComponent *component);
MrBedfordVan 0:b9164b348919 327
MrBedfordVan 0:b9164b348919 328 /**
MrBedfordVan 0:b9164b348919 329 * Adds a component to the array of idle thread components, which are processed
MrBedfordVan 0:b9164b348919 330 * when the run queue is empty.
MrBedfordVan 0:b9164b348919 331 *
MrBedfordVan 0:b9164b348919 332 * The system timer will poll isIdleCallbackNeeded on each component to determine
MrBedfordVan 0:b9164b348919 333 * if the scheduler should schedule the idle_task imminently.
MrBedfordVan 0:b9164b348919 334 *
MrBedfordVan 0:b9164b348919 335 * @param component The component to add to the array.
MrBedfordVan 0:b9164b348919 336 *
MrBedfordVan 0:b9164b348919 337 * @return MICROBIT_OK on success or MICROBIT_NO_RESOURCES if the fiber components array is full.
MrBedfordVan 0:b9164b348919 338 *
MrBedfordVan 0:b9164b348919 339 * @code
MrBedfordVan 0:b9164b348919 340 * MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MrBedfordVan 0:b9164b348919 341 *
MrBedfordVan 0:b9164b348919 342 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 343 * MicroBitAccelerometer* accelerometer = new MicroBitAccelerometer(i2c);
MrBedfordVan 0:b9164b348919 344 *
MrBedfordVan 0:b9164b348919 345 * fiber_add_idle_component(accelerometer);
MrBedfordVan 0:b9164b348919 346 * @endcode
MrBedfordVan 0:b9164b348919 347 *
MrBedfordVan 0:b9164b348919 348 * @note This interface is now deprecated, and will be removed in the next major release. Please use fiber_add_idle_component().
MrBedfordVan 0:b9164b348919 349 */
MrBedfordVan 0:b9164b348919 350 int addIdleComponent(MicroBitComponent *component);
MrBedfordVan 0:b9164b348919 351
MrBedfordVan 0:b9164b348919 352 /**
MrBedfordVan 0:b9164b348919 353 * Remove a component from the array of idle thread components
MrBedfordVan 0:b9164b348919 354 *
MrBedfordVan 0:b9164b348919 355 * @param component The component to remove from the idle component array.
MrBedfordVan 0:b9164b348919 356 *
MrBedfordVan 0:b9164b348919 357 * @return MICROBIT_OK on success. MICROBIT_INVALID_PARAMETER is returned if the given component has not been previously added.
MrBedfordVan 0:b9164b348919 358 *
MrBedfordVan 0:b9164b348919 359 * @code
MrBedfordVan 0:b9164b348919 360 * MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MrBedfordVan 0:b9164b348919 361 *
MrBedfordVan 0:b9164b348919 362 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 363 * MicroBitAccelerometer* accelerometer = new MicroBitAccelerometer(i2c);
MrBedfordVan 0:b9164b348919 364 *
MrBedfordVan 0:b9164b348919 365 * uBit.addIdleComponent(accelerometer);
MrBedfordVan 0:b9164b348919 366 *
MrBedfordVan 0:b9164b348919 367 * uBit.removeIdleComponent(accelerometer);
MrBedfordVan 0:b9164b348919 368 * @endcode
MrBedfordVan 0:b9164b348919 369 *
MrBedfordVan 0:b9164b348919 370 * @note This interface is now deprecated, and will be removed in the next major release. Please use fiber_remove_idle_component().
MrBedfordVan 0:b9164b348919 371 */
MrBedfordVan 0:b9164b348919 372 int removeIdleComponent(MicroBitComponent *component);
MrBedfordVan 0:b9164b348919 373 };
MrBedfordVan 0:b9164b348919 374
MrBedfordVan 0:b9164b348919 375 /**
MrBedfordVan 0:b9164b348919 376 * Return the friendly name for this device.
MrBedfordVan 0:b9164b348919 377 *
MrBedfordVan 0:b9164b348919 378 * @return A ManagedString representing the friendly name of this device.
MrBedfordVan 0:b9164b348919 379 *
MrBedfordVan 0:b9164b348919 380 * @code
MrBedfordVan 0:b9164b348919 381 * ManagedString name = uBit.getName();
MrBedfordVan 0:b9164b348919 382 * @endcode
MrBedfordVan 0:b9164b348919 383 */
MrBedfordVan 0:b9164b348919 384 inline ManagedString MicroBit::getName()
MrBedfordVan 0:b9164b348919 385 {
MrBedfordVan 0:b9164b348919 386 return ManagedString(microbit_friendly_name());
MrBedfordVan 0:b9164b348919 387 }
MrBedfordVan 0:b9164b348919 388
MrBedfordVan 0:b9164b348919 389 /**
MrBedfordVan 0:b9164b348919 390 * Return the serial number of this device.
MrBedfordVan 0:b9164b348919 391 *
MrBedfordVan 0:b9164b348919 392 * @return A ManagedString representing the serial number of this device.
MrBedfordVan 0:b9164b348919 393 *
MrBedfordVan 0:b9164b348919 394 * @code
MrBedfordVan 0:b9164b348919 395 * ManagedString serialNumber = uBit.getSerial();
MrBedfordVan 0:b9164b348919 396 * @endcode
MrBedfordVan 0:b9164b348919 397 */
MrBedfordVan 0:b9164b348919 398 inline ManagedString MicroBit::getSerial()
MrBedfordVan 0:b9164b348919 399 {
MrBedfordVan 0:b9164b348919 400 // We take to 16 bit numbers here, as we want the full range of ID bits, but don't want negative numbers...
MrBedfordVan 0:b9164b348919 401 int n1 = microbit_serial_number() & 0xffff;
MrBedfordVan 0:b9164b348919 402 int n2 = (microbit_serial_number() >> 16) & 0xffff;
MrBedfordVan 0:b9164b348919 403
MrBedfordVan 0:b9164b348919 404 // Simply concat the two numbers.
MrBedfordVan 0:b9164b348919 405 ManagedString s1(n1);
MrBedfordVan 0:b9164b348919 406 ManagedString s2(n2);
MrBedfordVan 0:b9164b348919 407
MrBedfordVan 0:b9164b348919 408 return s1 + s2;
MrBedfordVan 0:b9164b348919 409 }
MrBedfordVan 0:b9164b348919 410
MrBedfordVan 0:b9164b348919 411 /**
MrBedfordVan 0:b9164b348919 412 * Will reset the micro:bit when called.
MrBedfordVan 0:b9164b348919 413 *
MrBedfordVan 0:b9164b348919 414 * @code
MrBedfordVan 0:b9164b348919 415 * uBit.reset();
MrBedfordVan 0:b9164b348919 416 * @endcode
MrBedfordVan 0:b9164b348919 417 */
MrBedfordVan 0:b9164b348919 418 inline void MicroBit::reset()
MrBedfordVan 0:b9164b348919 419 {
MrBedfordVan 0:b9164b348919 420 if(ble && ble->getGapState().connected) {
MrBedfordVan 0:b9164b348919 421
MrBedfordVan 0:b9164b348919 422 // We have a connected BLE peer. Disconnect the BLE session.
MrBedfordVan 0:b9164b348919 423 ble->gap().disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION);
MrBedfordVan 0:b9164b348919 424
MrBedfordVan 0:b9164b348919 425 // Wait a little while for the connection to drop.
MrBedfordVan 0:b9164b348919 426 wait_ms(100);
MrBedfordVan 0:b9164b348919 427 }
MrBedfordVan 0:b9164b348919 428
MrBedfordVan 0:b9164b348919 429 microbit_reset();
MrBedfordVan 0:b9164b348919 430 }
MrBedfordVan 0:b9164b348919 431
MrBedfordVan 0:b9164b348919 432 /**
MrBedfordVan 0:b9164b348919 433 * Delay execution for the given amount of time.
MrBedfordVan 0:b9164b348919 434 *
MrBedfordVan 0:b9164b348919 435 * If the scheduler is running, this will deschedule the current fiber and perform
MrBedfordVan 0:b9164b348919 436 * a power efficient, concurrent sleep operation.
MrBedfordVan 0:b9164b348919 437 *
MrBedfordVan 0:b9164b348919 438 * If the scheduler is disabled or we're running in an interrupt context, this
MrBedfordVan 0:b9164b348919 439 * will revert to a busy wait.
MrBedfordVan 0:b9164b348919 440 *
MrBedfordVan 0:b9164b348919 441 * Alternatively: wait, wait_ms, wait_us can be used which will perform a blocking sleep
MrBedfordVan 0:b9164b348919 442 * operation.
MrBedfordVan 0:b9164b348919 443 *
MrBedfordVan 0:b9164b348919 444 * @param milliseconds the amount of time, in ms, to wait for. This number cannot be negative.
MrBedfordVan 0:b9164b348919 445 *
MrBedfordVan 0:b9164b348919 446 * @return MICROBIT_OK on success, MICROBIT_INVALID_PARAMETER milliseconds is less than zero.
MrBedfordVan 0:b9164b348919 447 *
MrBedfordVan 0:b9164b348919 448 * @code
MrBedfordVan 0:b9164b348919 449 * uBit.sleep(20); //sleep for 20ms
MrBedfordVan 0:b9164b348919 450 * @endcode
MrBedfordVan 0:b9164b348919 451 *
MrBedfordVan 0:b9164b348919 452 * @note This operation is currently limited by the rate of the system timer, therefore
MrBedfordVan 0:b9164b348919 453 * the granularity of the sleep operation is limited to 6 ms unless the rate of
MrBedfordVan 0:b9164b348919 454 * the system timer is modified.
MrBedfordVan 0:b9164b348919 455 */
MrBedfordVan 0:b9164b348919 456 inline void MicroBit::sleep(uint32_t milliseconds)
MrBedfordVan 0:b9164b348919 457 {
MrBedfordVan 0:b9164b348919 458 fiber_sleep(milliseconds);
MrBedfordVan 0:b9164b348919 459 }
MrBedfordVan 0:b9164b348919 460
MrBedfordVan 0:b9164b348919 461 /**
MrBedfordVan 0:b9164b348919 462 * Generate a random number in the given range.
MrBedfordVan 0:b9164b348919 463 * We use a simple Galois LFSR random number generator here,
MrBedfordVan 0:b9164b348919 464 * as a Galois LFSR is sufficient for our applications, and much more lightweight
MrBedfordVan 0:b9164b348919 465 * than the hardware random number generator built int the processor, which takes
MrBedfordVan 0:b9164b348919 466 * a long time and uses a lot of energy.
MrBedfordVan 0:b9164b348919 467 *
MrBedfordVan 0:b9164b348919 468 * KIDS: You shouldn't use this is the real world to generate cryptographic keys though...
MrBedfordVan 0:b9164b348919 469 * have a think why not. :-)
MrBedfordVan 0:b9164b348919 470 *
MrBedfordVan 0:b9164b348919 471 * @param max the upper range to generate a number for. This number cannot be negative.
MrBedfordVan 0:b9164b348919 472 *
MrBedfordVan 0:b9164b348919 473 * @return A random, natural number between 0 and the max-1. Or MICROBIT_INVALID_VALUE if max is <= 0.
MrBedfordVan 0:b9164b348919 474 *
MrBedfordVan 0:b9164b348919 475 * @code
MrBedfordVan 0:b9164b348919 476 * uBit.random(200); //a number between 0 and 199
MrBedfordVan 0:b9164b348919 477 * @endcode
MrBedfordVan 0:b9164b348919 478 */
MrBedfordVan 0:b9164b348919 479 inline int MicroBit::random(int max)
MrBedfordVan 0:b9164b348919 480 {
MrBedfordVan 0:b9164b348919 481 return microbit_random(max);
MrBedfordVan 0:b9164b348919 482 }
MrBedfordVan 0:b9164b348919 483
MrBedfordVan 0:b9164b348919 484 /**
MrBedfordVan 0:b9164b348919 485 * Seed the pseudo random number generator using the hardware random number generator.
MrBedfordVan 0:b9164b348919 486 *
MrBedfordVan 0:b9164b348919 487 * @code
MrBedfordVan 0:b9164b348919 488 * uBit.seedRandom();
MrBedfordVan 0:b9164b348919 489 * @endcode
MrBedfordVan 0:b9164b348919 490 */
MrBedfordVan 0:b9164b348919 491 inline void MicroBit::seedRandom()
MrBedfordVan 0:b9164b348919 492 {
MrBedfordVan 0:b9164b348919 493 microbit_seed_random();
MrBedfordVan 0:b9164b348919 494 }
MrBedfordVan 0:b9164b348919 495
MrBedfordVan 0:b9164b348919 496
MrBedfordVan 0:b9164b348919 497 /**
MrBedfordVan 0:b9164b348919 498 * Seed the pseudo random number generator using the given value.
MrBedfordVan 0:b9164b348919 499 *
MrBedfordVan 0:b9164b348919 500 * @param seed The 32-bit value to seed the generator with.
MrBedfordVan 0:b9164b348919 501 *
MrBedfordVan 0:b9164b348919 502 * @code
MrBedfordVan 0:b9164b348919 503 * uBit.seedRandom(0xBB5EED);
MrBedfordVan 0:b9164b348919 504 * @endcode
MrBedfordVan 0:b9164b348919 505 */
MrBedfordVan 0:b9164b348919 506 inline void MicroBit::seedRandom(uint32_t seed)
MrBedfordVan 0:b9164b348919 507 {
MrBedfordVan 0:b9164b348919 508 microbit_seed_random(seed);
MrBedfordVan 0:b9164b348919 509 }
MrBedfordVan 0:b9164b348919 510
MrBedfordVan 0:b9164b348919 511
MrBedfordVan 0:b9164b348919 512 /**
MrBedfordVan 0:b9164b348919 513 * Add a component to the array of system components. This component will then receive
MrBedfordVan 0:b9164b348919 514 * periodic callbacks, once every tick period in interrupt context.
MrBedfordVan 0:b9164b348919 515 *
MrBedfordVan 0:b9164b348919 516 * @param component The component to add.
MrBedfordVan 0:b9164b348919 517 *
MrBedfordVan 0:b9164b348919 518 * @return MICROBIT_OK on success or MICROBIT_NO_RESOURCES if the component array is full.
MrBedfordVan 0:b9164b348919 519 *
MrBedfordVan 0:b9164b348919 520 * @code
MrBedfordVan 0:b9164b348919 521 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 522 * MicroBitDisplay* display = new MicroBitDisplay();
MrBedfordVan 0:b9164b348919 523 *
MrBedfordVan 0:b9164b348919 524 * uBit.addSystemComponent(display);
MrBedfordVan 0:b9164b348919 525 * @endcode
MrBedfordVan 0:b9164b348919 526 *
MrBedfordVan 0:b9164b348919 527 * @note This interface is now deprecated, and will be removed in the next major release. Please use system_timer_add_component().
MrBedfordVan 0:b9164b348919 528 */
MrBedfordVan 0:b9164b348919 529 inline int MicroBit::addSystemComponent(MicroBitComponent *component)
MrBedfordVan 0:b9164b348919 530 {
MrBedfordVan 0:b9164b348919 531 return system_timer_add_component(component);
MrBedfordVan 0:b9164b348919 532 }
MrBedfordVan 0:b9164b348919 533
MrBedfordVan 0:b9164b348919 534 /**
MrBedfordVan 0:b9164b348919 535 * Remove a component from the array of system components. This component will no longer receive
MrBedfordVan 0:b9164b348919 536 * periodic callbacks.
MrBedfordVan 0:b9164b348919 537 *
MrBedfordVan 0:b9164b348919 538 * @param component The component to remove.
MrBedfordVan 0:b9164b348919 539 *
MrBedfordVan 0:b9164b348919 540 * @return MICROBIT_OK on success or MICROBIT_INVALID_PARAMETER is returned if the given component has not been previously added.
MrBedfordVan 0:b9164b348919 541 *
MrBedfordVan 0:b9164b348919 542 * @code
MrBedfordVan 0:b9164b348919 543 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 544 * MicroBitDisplay* display = new MicroBitDisplay();
MrBedfordVan 0:b9164b348919 545 *
MrBedfordVan 0:b9164b348919 546 * uBit.addSystemComponent(display);
MrBedfordVan 0:b9164b348919 547 *
MrBedfordVan 0:b9164b348919 548 * uBit.removeSystemComponent(display);
MrBedfordVan 0:b9164b348919 549 * @endcode
MrBedfordVan 0:b9164b348919 550 *
MrBedfordVan 0:b9164b348919 551 * @note This interface is now deprecated, and will be removed in the next major release. Please use system_timer_remove_component().
MrBedfordVan 0:b9164b348919 552 */
MrBedfordVan 0:b9164b348919 553 inline int MicroBit::removeSystemComponent(MicroBitComponent *component)
MrBedfordVan 0:b9164b348919 554 {
MrBedfordVan 0:b9164b348919 555 return system_timer_remove_component(component);
MrBedfordVan 0:b9164b348919 556 }
MrBedfordVan 0:b9164b348919 557
MrBedfordVan 0:b9164b348919 558 /**
MrBedfordVan 0:b9164b348919 559 * Adds a component to the array of idle thread components, which are processed
MrBedfordVan 0:b9164b348919 560 * when the run queue is empty.
MrBedfordVan 0:b9164b348919 561 *
MrBedfordVan 0:b9164b348919 562 * The system timer will poll isIdleCallbackNeeded on each component to determine
MrBedfordVan 0:b9164b348919 563 * if the scheduler should schedule the idle_task imminently.
MrBedfordVan 0:b9164b348919 564 *
MrBedfordVan 0:b9164b348919 565 * @param component The component to add to the array.
MrBedfordVan 0:b9164b348919 566 *
MrBedfordVan 0:b9164b348919 567 * @return MICROBIT_OK on success or MICROBIT_NO_RESOURCES if the fiber components array is full.
MrBedfordVan 0:b9164b348919 568 *
MrBedfordVan 0:b9164b348919 569 * @code
MrBedfordVan 0:b9164b348919 570 * MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MrBedfordVan 0:b9164b348919 571 *
MrBedfordVan 0:b9164b348919 572 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 573 * MicroBitAccelerometer* accelerometer = new MicroBitAccelerometer(i2c);
MrBedfordVan 0:b9164b348919 574 *
MrBedfordVan 0:b9164b348919 575 * fiber_add_idle_component(accelerometer);
MrBedfordVan 0:b9164b348919 576 * @endcode
MrBedfordVan 0:b9164b348919 577 *
MrBedfordVan 0:b9164b348919 578 * @note This interface is now deprecated, and will be removed in the next major release. Please use fiber_add_idle_component().
MrBedfordVan 0:b9164b348919 579 */
MrBedfordVan 0:b9164b348919 580 inline int MicroBit::addIdleComponent(MicroBitComponent *component)
MrBedfordVan 0:b9164b348919 581 {
MrBedfordVan 0:b9164b348919 582 return fiber_add_idle_component(component);
MrBedfordVan 0:b9164b348919 583 }
MrBedfordVan 0:b9164b348919 584
MrBedfordVan 0:b9164b348919 585 /**
MrBedfordVan 0:b9164b348919 586 * Remove a component from the array of idle thread components
MrBedfordVan 0:b9164b348919 587 *
MrBedfordVan 0:b9164b348919 588 * @param component The component to remove from the idle component array.
MrBedfordVan 0:b9164b348919 589 *
MrBedfordVan 0:b9164b348919 590 * @return MICROBIT_OK on success. MICROBIT_INVALID_PARAMETER is returned if the given component has not been previously added.
MrBedfordVan 0:b9164b348919 591 *
MrBedfordVan 0:b9164b348919 592 * @code
MrBedfordVan 0:b9164b348919 593 * MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
MrBedfordVan 0:b9164b348919 594 *
MrBedfordVan 0:b9164b348919 595 * // heap allocated - otherwise it will be paged out!
MrBedfordVan 0:b9164b348919 596 * MicroBitAccelerometer* accelerometer = new MicroBitAccelerometer(i2c);
MrBedfordVan 0:b9164b348919 597 *
MrBedfordVan 0:b9164b348919 598 * uBit.addIdleComponent(accelerometer);
MrBedfordVan 0:b9164b348919 599 *
MrBedfordVan 0:b9164b348919 600 * uBit.removeIdleComponent(accelerometer);
MrBedfordVan 0:b9164b348919 601 * @endcode
MrBedfordVan 0:b9164b348919 602 *
MrBedfordVan 0:b9164b348919 603 * @note This interface is now deprecated, and will be removed in the next major release. Please use fiber_remove_idle_component().
MrBedfordVan 0:b9164b348919 604 */
MrBedfordVan 0:b9164b348919 605 inline int MicroBit::removeIdleComponent(MicroBitComponent *component)
MrBedfordVan 0:b9164b348919 606 {
MrBedfordVan 0:b9164b348919 607 return fiber_remove_idle_component(component);
MrBedfordVan 0:b9164b348919 608 }
MrBedfordVan 0:b9164b348919 609
MrBedfordVan 0:b9164b348919 610
MrBedfordVan 0:b9164b348919 611 /**
MrBedfordVan 0:b9164b348919 612 * Determine the time since this MicroBit was last reset.
MrBedfordVan 0:b9164b348919 613 *
MrBedfordVan 0:b9164b348919 614 * @return The time since the last reset, in milliseconds.
MrBedfordVan 0:b9164b348919 615 *
MrBedfordVan 0:b9164b348919 616 * @note This will value overflow after 1.6 months.
MrBedfordVan 0:b9164b348919 617 */
MrBedfordVan 0:b9164b348919 618 inline unsigned long MicroBit::systemTime()
MrBedfordVan 0:b9164b348919 619 {
MrBedfordVan 0:b9164b348919 620 return system_timer_current_time();
MrBedfordVan 0:b9164b348919 621 }
MrBedfordVan 0:b9164b348919 622
MrBedfordVan 0:b9164b348919 623
MrBedfordVan 0:b9164b348919 624 /**
MrBedfordVan 0:b9164b348919 625 * Determine the version of the micro:bit runtime currently in use.
MrBedfordVan 0:b9164b348919 626 *
MrBedfordVan 0:b9164b348919 627 * @return A textual description of the version of the micro:bit runtime that
MrBedfordVan 0:b9164b348919 628 * is currently running on this device.
MrBedfordVan 0:b9164b348919 629 */
MrBedfordVan 0:b9164b348919 630 inline const char *MicroBit::systemVersion()
MrBedfordVan 0:b9164b348919 631 {
MrBedfordVan 0:b9164b348919 632 return microbit_dal_version();
MrBedfordVan 0:b9164b348919 633 }
MrBedfordVan 0:b9164b348919 634
MrBedfordVan 0:b9164b348919 635 /**
MrBedfordVan 0:b9164b348919 636 * Triggers a microbit panic where an loop will display a panic face
MrBedfordVan 0:b9164b348919 637 * and the status code, if provided.
MrBedfordVan 0:b9164b348919 638 *
MrBedfordVan 0:b9164b348919 639 * This loop will continue for panic_timeout iterations, defaults to 0 (infinite).
MrBedfordVan 0:b9164b348919 640 *
MrBedfordVan 0:b9164b348919 641 * panic_timeout can be configured via a call to microbit_panic_timeout.
MrBedfordVan 0:b9164b348919 642 *
MrBedfordVan 0:b9164b348919 643 * @param statusCode the status code of the associated error.
MrBedfordVan 0:b9164b348919 644 *
MrBedfordVan 0:b9164b348919 645 * @code
MrBedfordVan 0:b9164b348919 646 * microbit_panic_timeout(4);
MrBedfordVan 0:b9164b348919 647 *
MrBedfordVan 0:b9164b348919 648 * // will display loop for 4 iterations.
MrBedfordVan 0:b9164b348919 649 * uBit.panic(10);
MrBedfordVan 0:b9164b348919 650 * @endcode
MrBedfordVan 0:b9164b348919 651 */
MrBedfordVan 0:b9164b348919 652 inline void MicroBit::panic(int statusCode)
MrBedfordVan 0:b9164b348919 653 {
MrBedfordVan 0:b9164b348919 654 //show error and enter infinite while
MrBedfordVan 0:b9164b348919 655 microbit_panic(statusCode);
MrBedfordVan 0:b9164b348919 656 }
MrBedfordVan 0:b9164b348919 657
MrBedfordVan 0:b9164b348919 658 #endif