There was an off by one error when storing the key of the key value
pair, where the null terminator was dropped. This would mean that if
the returned key of the KeyValuePair were used, it would cause a number
of issues.
Another issue raised was the copying a random 48 bytes from memory
regardless of the position of memory in the stack. If the memory was
smaller than 48 bytes, and existed at the top of the stack, this could
have dire consequences. As a result, MicroBitStorage now accepts a size
parameter which informs the number of bytes to be copied into flash.
#130
There was a perspective mismatch with the UART service, where the
actual buffer size given in the constructor, did not reflect the size
of the user buffer that was available to the application. This was not
documented, and hence cause confusion. The patch applied in this
commit, increments the given buffer sizes by one, so that the
application buffer has the available size given in the constructor.
Additionally, some configuration options were lost during the component
refactor, these have now been restored.
fiber_wake_on_event used to crash after forking a FOB fiber.
It would attempt to obtain a new fiber context, and would place it on the wait queue.
Then when that fiber was paged in, the context of that fiber would not have been
initialised, as the function presumed schedule would be called immediately after
fiber initialisation.
This patch catches that edge case.
The MicroBitDisplay::animate() and MicroBitDisplayAnimateAsync() function both
assumed that the display should be cleared once the requested animation was
complete.
This patch allows the user to control this funcitonality through an
addiitonal, optional boolean parameter to the animate() and animateAsync()
functions.
MicroBitradio::enable() would reset the group ID of the radio to the default
value on each call. Updated to do this only once at object initialisation time.
MicroBitRadio::disable neglected to reset the internal status flag indicating
that the radio has bene initialised, which prevent subsequent enable()
operations completing properly.
The default THREADING_MODE for event handlers is typically set to run through
the scheduler. However, it is possible to create and operate a MessageBus without the scheduler being initialised.
This patch changes the behaviour of the MessageBus to treat all registered
listeners as MESSAGE_BUS_LISTENER_IMMEDIATE (i.e. directly called) if no
scheduler is present. This default allows for a more user friendly experience
in this case.
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.
- 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!)
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 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.
This commit introduces a new call "updateSample" which is used by both idleTick,
and get[X,Y,Z](). This allows the compass to be used in the absence of the scheduler.
- Factored periodic timer funcitonality out of fiber scheduler and into a new SystemTimer module module.
- Enapsulated "ticks" variable within SystemTimer module, with accessor funciton.
- Added accessor/mutator functions to get and set the tick period.
- Added a class wrapper to permit periodic callbacks to both C and C++
functions.
- Updated all references in microbit-dal to use this refactored API.
Previously, we would rely on service changed to complete successfully
to signify a successful cccd state restore.
However, android doesn’t register for service_changed notifications,
and as a result sd_ble_gatts_service_changed always returns an error.
This meant that cccds would be erased when the complete flag was not
one, which would have been all the time.
Updates to MicroBitButton and MicroBitMultiButton to align the API through
which CLICK events are filtered. Also, updates to the mechanism through which
buttonA and buttonB CLICK/LONG_CLICK events are filtered by
MicroBitMultiButotn to reduce RAM footprint.
No changes to external behaviour of these classes.
This commit introduces a wait_ms before entering DFU mode to allow soft
device to communicate to an android handset that the current connection
should be terminated.
This commit addresses a number of outstanding issues:
* whitelisting behaviour, form the nrf51-sdk, where an address and an
irk were added to the whitelist
* bond management bugs, from the nrf51-sdk, where one device would
replace another.
closes#57, closes#56, closes#58, closes#59, closes#44, closes#60
Re-pairing the same BLE device under SoftDevice 8.0 Nordic SDK 10 appears to
add a second entry to the bonding table when private resolvable addresses are
used by the central device. This adversely affects whitelisting, as only the
first added matching entry will be succesfully added to the whitelist. i.e. A
central device will no longer be able to connect to a micro:bit after pairing
a second time as the older bond will take prescedence.
Althoguh reported to Nordic, a long term fix is not immediately forthcoming.
This patch applies a workaround, by simply reversing the order of the
whitelist before use. As the list is maintained in the order of insertion,
reversing the list guarantees that the entry added to the whitelist will be
the most recently bonded one for any given peer.
before resetting
Requests made for an optional timeout function to define the period of time in
which the device will remain in a panic state. This patch introduces a
setErrorTimeout() method with this functionality.
MicroBitMultiButton now provides an indication to MicroBitButton instances when an application is actively utilising that button as part of a button group. This
permits that MicroBitButton to more accurately filter events, and provide a
consistent abstraction.
More specifically, this patch:
- Extends the MessageBus functionality to indicate when listeners are
attached to events. This allows components to perform on demand tailoring
of their behaviour.
- Extends MicroBitMultiButton to indicate to relevant MicroBitButton
instances when they are part of a button group.
- Extends MicroBitButton to perform filtering of button events dynamically
(rather than statically) when part of a MultiButton group.
- Code cleanup of static functions that are more cleanly implemented as
methods.
Updates to MicroBitConfig options and initialisaiton code of the BLE stack to
allow Soft Device's GATT table to be of a given size. If this size is smaller
then the default, the runtime will reclaim that that memory as heap storage.
The nordic implementation of the mbed whitelist API introduces entries into
the table that are not bonds. This patch corrects an assumption in
microbit-dal that the number of entries in the bond table table corellates
with the number of bonds.
The BLE security options mandated for child protection can be highly
detrimental to the development process for new BLE services. This patch
introduces a configuration option to disable BLE security for this purpose.
Default BLE security settings remain unchanged.