Commit graph

423 commits

Author SHA1 Message Date
James Devine 728604423f microbit: refactored event codes used by a shared listener "MICROBIT_ID_NOTIFY"
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.
2016-03-26 19:39:05 +00:00
James Devine 776131e4cb microbit: BUGFIX for MicroBitStorage
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
2016-03-26 14:06:14 +00:00
Joe Finney 3efd76e9d4 microbit: Update to MicroBitMultiButton contructor signature
Changed ordering of parameters to promote consistency with other components.
2016-03-26 11:58:36 +00:00
Joe Finney 4f31ffa9d4 microbit; Added default case in MessageBus.cpp when scheduler is inactive
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.
2016-03-24 23:46:17 +00:00
Joe Finney 0a1a9c7865 microbit: Consistency change in scheduler_init()
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
2016-03-24 23:30:17 +00:00
James Devine 03a542e684 microbit: updated module.json to point to changes in our mbed-classic repo
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.
2016-03-24 16:14:02 +00:00
James Devine f35c4b359e microbit: MicroBitLightSensor startSensing is now public! 2016-03-24 16:05:11 +00:00
Joe Finney 06c3c95609 microbit: Restructure of repo
- 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!)
2016-03-24 14:00:11 +00:00
Joe Finney 2b684c6204 microbit: Added default parameter values to common case operations
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.
2016-03-24 11:40:20 +00:00
Joe Finney f5f983dbdd microbit: Added explicit support for printing characters in MicroBitDisplay
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.
2016-03-24 11:40:18 +00:00
James Devine 03a5353cc0 microbit: Added MicroBitSerial default mode config option, and modified overload for send(char)
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.
2016-03-24 11:17:23 +00:00
Joe Finney cc2beb02c6 microbit: Added overload to allow direct send/receive of strings via

 - Added constructor into managedString to allow conversion from PcketBuffer
 - Added overload of MicroBitRadioDatagram::send() to accpet a string
2016-03-24 10:33:05 +00:00
James Devine a73a6b6560 microbit: Added additional validation check for fiber_wait_for_event 2016-03-24 01:45:56 +00:00
James Devine 79a13c7edf Merge branch 'component-refactor' of into component-refactor 2016-03-24 00:45:33 +00:00
James Devine a512afb1b3 microbit: MicroBitSerial memory optimisation
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.
2016-03-24 00:43:10 +00:00
James Devine 613a0aef2c microbit: MicroBitStorage additional comments, and page location changes
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
2016-03-24 00:34:46 +00:00
James Devine 12c84395d3 microbit: Added fiber_wake_on_event to MicroBitFiber[.h,.cpp]
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).
2016-03-24 00:32:41 +00:00
Joe Finney 91cd6d2a08 microbit: Updated enable/disable functions in MicroBitDisplay to free pin
resources cleanly.
2016-03-24 00:18:32 +00:00
Joe Finney fea0f720df microbit: Removed uncessary #includes in MicroBitDisplay 2016-03-23 21:33:02 +00:00
Joe Finney 10298934da microbit: Generalised MicrobitDisplay to be mbed compliant
Removed references to direct nrf51 sdk calls, in favour of the mbed
PortOut class, which provides equivalent functionality whilst remaining
platform agnostic.
2016-03-23 21:25:51 +00:00
Joe Finney 31b7eb487f microbit: Factored repurposeable functionality out of MicroBit.cpp
- 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.
2016-03-23 19:30:15 +00:00
Joe Finney 6b6c83092a microbit: Added validation check on MicroBit::init()
Added simple validation check to protect against accidental re-initialisation.
2016-03-22 19:49:14 +00:00
Joe Finney 34856a6942 microbit: refactor of component constructors
- Updates to ordering and default values for component constructors to improve
consistency, and to common default default values for parameters where

- 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.
2016-03-22 19:36:23 +00:00
James Devine 38b6c8ff6c microbit: corrected includes in MicroBitSerial.cpp 2016-03-21 13:37:08 +00:00
James Devine 8bd34edfd1 microbit: updated MicroBitStorage to use our new MICROBIT_NO_DATA error code
MicroBitStorage previously used MICROBIT_NOT_SUPPORTED if the given key was not found
during a remove call, it now returns MICROBIT_NO_DATA.
2016-03-21 13:31:14 +00:00
James Devine 937395f0f4 microbit: MicroBitSerial redesign
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.
2016-03-21 13:27:20 +00:00
James Devine 174fa29c81 microbit: fixed overload ambiguity in MicroBitStorage
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 *.
2016-03-20 18:28:48 +00:00
James Devine 468d7e24c5 microbit: MicroBitThermometer lazy addition to fiber components
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.
2016-03-20 17:05:32 +00:00
James Devine aca1c24a24 microbit: added calibration and persistence to MicroBitThermometer
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.
2016-03-20 17:05:31 +00:00
James Devine 4988fd4ea7 microbit: moved MicroBitStorage to a Key Value Store
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 (
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.
2016-03-20 17:05:31 +00:00
Joe Finney b9e8dc979b microbit: Updated MicroBitSystemTimer to use dynamically allocated Ticker
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
2016-03-19 22:46:09 +00:00
Joe Finney 65affa35a8 microbit: Introduced demand activation of system_timer
system_timer updated to bring up the timer with the default configured period
automatically when a component registers for a callback.
2016-03-19 02:06:10 +00:00
Joe Finney 78ed31961c microbit: BUGFIX blocking display functions not terminating when scheduler

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
2016-03-19 01:48:23 +00:00
Joe Finney 1dce004f10 microbit: Updates to enable BLE services to utilise the EventModel interface
- 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
2016-03-19 00:46:34 +00:00
Joe Finney 398f054956 microbit: Refactor of MicroBitHeap Allocator
- Cleanup of MicroBitHeapAllocator related CONFIG options to add clarity
 - Refactor of MicroBitHeapAllocator to provide more control over heap
 - 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.
2016-03-18 01:30:54 +00:00
Joe Finney 3531cde893 microbit: Updates to all components to include MicroBitConfig.h
Also added configuration option to enable / disable MicroBitHeapAllocator
2016-03-17 17:33:57 +00:00
Joe Finney 0e8034c5bc microbit: Replaced all internal references of the MicroBitMessageBus class
to the abstract EventModel interface.
2016-03-17 16:57:22 +00:00
Joe Finney 83390b9663 microbit: Update to camel case in comment blocks: uBit.MessageBus -> uBit.messageBus 2016-03-17 16:09:41 +00:00
Joe Finney 5b167fb743 microbit: completed removal of internal #include dependencies on Microbit.h 2016-03-17 16:02:50 +00:00
James Devine 7fc98ccaf8 microbit: WIP header refactor
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.
2016-03-17 14:47:43 +00:00
James Devine d58690a8a7 microbit: removed whitespace from all files
Commits were polluted by the amount of trailing whitespace there was
in files. All whitespace errors should now be fixed.
2016-03-17 12:24:45 +00:00
James Devine 0fd04e11a4 microbit: decoupled MicroBitDisplay, MicroBitLightSensor from #defines
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

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
2016-03-16 22:01:03 +00:00
James Devine 3a74941a2f Merge branch 'component-refactor' of into component-refactor 2016-03-16 15:38:53 +00:00
James Devine 8abec9239a microbit: completed lazy instantiation implementation for compass and the accelerometer.
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.
2016-03-16 15:35:29 +00:00
Joe Finney 687ff58646 microbit: WIP: Non-compiling build outlining matrix map refactor 2016-03-16 14:38:30 +00:00
James Devine d559eb6162 Merge remote-tracking branch 'refs/remotes/origin/component-refactor' into component-refactor 2016-03-16 13:40:09 +00:00
Joe Finney 6ac078a54f microbit: Added EventModel interface.
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).
2016-03-16 13:32:50 +00:00
James Devine 6b9cabb209 microbit-dal: BUGFIX: possible status bit muxing
In some cases status bit 0x01 was shared with another status flag:


This has now been patched.
2016-03-11 16:34:30 +00:00
James Devine 45528a437c microbit-dal: initial refactor to MicroBitAccelerometer
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.
2016-03-11 16:12:52 +00:00
James Devine 65eaf8be30 microbit-dal: removed MicroBitCompass' reliance on MicroBitAccelerometer
Removed a dependency on MicroBitAccelerometer from MicroBitCompass, so
that a user can optionally create an instance of MicroBitCompass that
isn't tilt compensated.
2016-03-11 15:20:58 +00:00