developer.mbed.org branch of Lancaster University's microbit library. The real home for this is https://github.com/lancaster-university/microbit

Dependencies:   microbit-dal

Dependents:   MB02 asteroid_shooting

Committer:
ikkeje
Date:
Mon Dec 23 10:31:28 2019 +0000
Revision:
0:ee31ccbe9919
1.1

Who changed what in which revision?

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