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