There was no common place to track event codes used in Events intended
for the shared channel using the ID MICROBIT_ID_NOTIFY. This commit
adds a common place for these Event codes.
There was a bug with Bluetooth pairing. If a user were to bond with the
micro:bit, and the KeyValueStore region had not been configured, the
class would attempt to write to flash in interrupt context, which
conflicted with soft device.
The fix is to do this initialisation in the constructor for
MicroBitStorage.
Added condition into MicroBitMessageBus::process(), such that all event
listeners are diretly invoked if no scheduler is present.
This provides a best effort base case for builds running without a scheduler.
Updated parameter of scheduler_init() to accpet a reference to an EventModel,
rather than a pointer. This is simply to promote consistency with the other
components.
module.json has now been updated to include changes to the interrupt
priority of the system ticker, as there were some interoperability
issues with the nordic softdevice stack.
- Introduction of core, drivers, types and bluetooth folders in source and inc
- Added all inc subfolfers to the search path
- Removed MicroBit.cpp and MicroBit.h (yay!)
MicroBitImage::paste() now assumes the image to be pasted should be positioned
at the top left of the image by default, with no transparency.
MicroBitImage::print() now assumes the char to be printed should be positioned
at the top left of the image by default.
The C type system connaot easily distinguish integer literals from character
literals. To promote a simpler API, the print() overload for numeric values
has been replaced with an explicit printChar() method.
Print operation on single byte strings have been ammended to act consistently
with printing a single digit.
MicroBitSerial now uses a #define in MicroBitConfig.h to configure the default mode
for send and read calls.
send(char c, MicroBitSerialMode mode) has now been renamed to sendChar(char c, MicroBitSerialMode mode),
which means if users want to send an integer as a char, they have to do so explicitly.
MicroBitRadioDatagram
- Added constructor into managedString to allow conversion from PcketBuffer
- Added overload of MicroBitRadioDatagram::send() to accpet a string
Previously, MicroBitSerial inherited from Serial, which had a large
memory overhead.
n.b. This is due to a setbuf call in the underlying stdio library that
mallocs a massive struct, which is largely unused.
MicroBitSerial now inherits from RawSerial, which doesn’t use any
setbuf calls, thus reducing the static memory overhead of
MicroBitSerial to 8 bytes (448 bytes), when unused.
The definition for SERIAL_DEBUG in MicroBitConfig has now been updated
to use RawSerial instead of Serial.
Added additional information for the arrangement memory for a
KeyValueStore in persistent storage.
Also moved the storage page to an unused page after the BLE bond data,
and the scratch page to where application storage page was previously
located.
Added a new call fiber_wake_on_event which does not call schedule. This
means that execution continues after the context has been set until the
next use of schedule (i.e. fiber_sleep).
Removed references to direct nrf51 sdk calls, in favour of the mbed
PortOut class, which provides equivalent functionality whilst remaining
platform agnostic.
- moved all device specific utility funcitons into MicroBitDevice.cpp
- moved compass calibration funcitonality into a dedicated class
- moved panic() from MicroBitDisplay into MicroBitDevice
- introduced inline utility functions into MicroBit to promote a degree of
backward compatibility and easy of use.
- updated panic() to use platform agnostic mbed calls.
- Updates to ordering and default values for component constructors to improve
consistency, and to common default default values for parameters where
applicable.
- Updates to MiroBitDisplay MatrixMap to record physical geometry in addition
to logical geometry of LED matrix display layouts. This removes the need for
explicit (and unecessary) definition of display size by the user.
This implementation uses a circular buffer for both transmission and reception of data.
There are a number of new methods:
* redirect - which dynamically redirects the output of the serial module
* eventOn and eventAfter - which fire events based on delimeters, or x number of characters.
* operations on the circular buffers.
A main difference is the ability to select the mode you want to perform your operation in:
* ASYNC - reads directly from the circular buffer, returning immediately.
* SYNC_SPINWAIT - spins whilst reading from the circular buffer.
* SYNC_SLEEP - blocks the current fiber, but doesn't lock out the processor,
whilst reading from the circular buffer.
This should support a wide variety of operations. To see more specific details of the different methods,
it is advised to read the doxygen comments for each method.
MicroBitStorage accepts both ManagedString and char * variants, this
caused ambiguity at compile time, and meant that the ManagedString
variant was never selected when given character literals. This meant
that the only way to access the ManagedString variant, was to explicitly
wrap the character literals.
This applies to:
* put
* get
* remove
The fix was to apply a const prefix to all member functions accepting
a char *.
Previously, MicroBitThermometer was always added to fiber_components,
even in the case where it wasn't actually in use.
This commit introduces a similar behaviour to that introduced to the compass
and accelerometer classes in previous commits, where these components
are only added to fiber_components when in use.
Similarly, MicroBitThermometer now has an exposed updateSample() member
function that can be used to manually drive temperature updates, if
the fiber scheduler is not in use.
MicroBitThermometer now persists data using MicroBitStorage. An instance
of MicroBitStorage must be given at construction, if data is required to
be persisted.
The ability to calibrate the thermometer using an offset has been added
as well, produces the data that is then persisted by MicroBitStorage.
MicroBitStorage used to rely on a static struct as a memory
map when writing to flash "MicroBitConfigBlock", this solution
was constraining, and not fit for general purpose.
Whilst modularising the runtime, a cyclic dependency between
MicroBitStorage and MicroBitCompass was discovered, which meant
these two class could not be fully decoupled.
This version of MicroBitStorage is a Key Value Store, and allows
3 base operations:
* put - add a new KeyValuePair to flash
* get - retreive a KeyValuePair from flash
* remove - delete a KeyValuePair from flash
An instance of MicroBitStorage is also now a part of uBit (uBit.storage)
and this is now passed as a parameter to the constructors of BLEManager
and compass, both of which require the persistence of data.
There are also overloads for the constructors of MicroBitBLEManager
and MicroBitCompass, which do not require an instance of
MicroBitStorage to be passed.
MicroBitSystemTimer uses a statically allocated Ticker object as a timer
source. This both incurs a static memory overhead when the timer is never
initialised, and causes temporal dependencies for applicaitons that
initialise the timer from within a static context.
This patch simply changes the implementaiton of MicroBitSystemTimer to
dynamically allocate the Ticker object on the heap when it is first used to
address both of these issues.
The patch also cleans up an unecessary call to system_timer_init() in
MicroBit::init().
disabled
Calls to synchronous/blocking display animations, e.g. scroll("HELLO!"), did
not terminate correctly due to over optimisation in the
MicroBitDisplay::FiberWait() method.
Also corrected potential deadlock caused by an animation being explicitly
terminated.
- Updated all BLE services from the standard profile to us the defualt registered event model
- Updates to trigger calibration (when necessary) when BLE MagnetometerService is activated
- Updates to compass calibration algorithm to be non blocking (reduce unecessary fiber stack overhead)
- Cleanup of unused/out of date MicroBitConfig BLE options
- Cleanup of MicroBitHeapAllocator related CONFIG options to add clarity
- Refactor of MicroBitHeapAllocator to provide more control over heap
initialisation.
- Creation of SERIAL_DEBUG macro in MicroBitConfig to permite external
definition of a debug console.
- Added validation cases to MicroBitFiber to protect against calls to fiber
operations when the scheduler has not been initialised.
Removed references to MicroBit.h in some header and cpp files.
As a result a number of changes had to be made in order to satisfy
include dependencies.
This commit removes the reliance upon #defines to control the
translation of x,y display coordinates to the hardware. This adds a
parameter of type MatrixMap to the constructor of MicroBitDisplay,
containing the necessary information for translation.
MicroBitLightSensor, now also has a constructor parameterised with a
MatrixMap.
The previously relevant #defines for display translation have now been
removed from MicroBitDisplay.h.
MicroBitMatrixMaps.h has been optimised, and a new type “MatrixMap”
contains all of the key information for rendering.
MicroBitDisplay also now performs blocking waits when operating without
a scheduler.
fiber_wait_for_event now drops through returning an error code to the
caller.
The compass and accelerometer are now added to the idle fiber whenever a listener
is created using the IDs for these components.
This is a small optimisation which reduces the load on the idle fiber if these
two components aren't in use.
The microbit-dal runtime uses asynchronous events as a mechanism to decouple
user code from interrupt context and to provide an approach to asynchronous
programming on the micro:bit.
Not all languages may wish to use the default MessageBus service, and instead
prefer to roll their own event model. This patch adds a level of indirection
in the form of an EventModel interface that defines an API that allows any
EventModel to consume events from the microbit-dal runtime with whichever
implementaiton they choose. Such event models should subclass the
EventModel interface, and implement some (or none) of the defined functions:
- send()
- add()
- remove()
- elemenAt()
All uses of MicroBitMessageBus updated to use EventModel, and all event
listeners within the runtime now attmept to attach to a default service -
EventModel::defaultEventBus (which may or may not be present).
In some cases status bit 0x01 was shared with another status flag:
* MICROBIT_COMPASS_STATUS_CALIBRATED and MICROBIT_COMPONENT_RUNNING
* MICROBIT_ACCEL_PITCH_ROLL_VALID and MICROBIT_COMPONENT_RUNNING
This has now been patched.
This refactor removes reliance on the scheduler. It allows the
accelerometer to be used even when the scheduler is not active,
and no idle thread is available for updating the sample used by
the accelerometer.
This commit also provides an optimisation through the lazy
addition of the accelerometer to the idle thread.
Removed a dependency on MicroBitAccelerometer from MicroBitCompass, so
that a user can optionally create an instance of MicroBitCompass that
isn't tilt compensated.