issue #73 highlighted an issue whereby the destruction of an instance
registered as an idle or system component, would result in a hardfault.
This was due to not deregistering idle or system callbacks.
This patch has been applied to all components currently in use by the
idle or system callbacks.
An e-compass solution requires knowwlede two pieces of data to provide an
- Accurate calibration of the magnetometer hardware so that reliable
measurements can be taken.
- Knowledge of the pitch and roll of of device, so that the correct
components of the X/Y and Z axis sensors of the magnetomer can be used
to sense the magnetic field in a horizontal plane regardless of the tilt
of the device.
This commit represent changes to the MicroBitAccelerometer and MicroBitCompass
classes to implemen tthese goals. More specifically, this commit provides:
- The introduciton of an interactive calibration 'game', that can rapidly
gather all the data required to calibrate the compass.
- An improved calibration algorithm based on a Least Mean Squares approach of
compass samples, as documened in Freescale Application Note AN4248.
- The inclusion of a simple Matrix4 class to enable efficient Least Mean
- A change from asynchronous to synchronous calibration of the compass when
first used. This is in repsonse to a feature request for this from users
and high level languages using microbit-dal.
- Support for detemrining tilt and roll angle in MicroBitAccelerometer
- Support for multiple co-ordinate spaces in MicroBitAccelerometer and
MicroBitCompass. Data can now be read in either RAW (unaltered) data.
MICORBIT_SIMPLE_CARTESIAN (as used previously) or NORTH_EAST_DOWN
(the industry convention in mobile phones, tablets and aviation)
- Implementation of a tilt compensated algorithm, used when determining
Freefall now detected when the net force on the device drops below 0.4g,
rather than 0.2g as previously defined. This improves sensitivity, without
generating false positives under common use.
Also correction of minor typos / layout errors.
- updated acceleration threshold event names to reflect numeric values e.g.
GESTURE_3G, GESTURE_6G, GESTURE_8G.
- Add scoping to elements of SimpleGesture enum.
- Code scrub of code layout caused by editor with incorrect configuration.
- rename of internal state variables and functions to better reflect use.
- added clarification to some comments.
The following postures of the device are now detected:
In addition, the following gestures are inferred:
- WHEEE (>=3g)
- SICK (>=5g)
- UNCONSCIOUS (>=8g)
Events are now triggered on the MessageBus upon the transition from one posture/gesture to another,
and a synchronous getGesture() method is now also provided to interogate the last gesture recognised.
I should be noted that the default accelerator range of +/-2g will be insufficient to detect some of
the events noted above, and MicroBitAccelerometer::setRange() should be used to increase the range
NOP/clamping behaviour out of teh micro:bit runtime and into the glue layers of higher level
- Updates to many functions to provide explicut return codes.
- Updates to many functions to remove heuristic calidation (NOP/clamping/defaults)
- Updates to ErrorNo.h to provide clearer return values, and place return values in a better scope
- Updates to MicroBitDisplay to use enums where appropriate.
First functionally complete BLE profile, matching BLE speicfication v1.6.
More specifically, the following services are now functional:
Also, updates to underlying device drivers to enable greater configurability:
- MicroBitCompass now supports variable sample rates and temperature sensing
- MicroBitAccelerometer now supports variable sample rates and ranges
- MicroBitThermometer introduced
- MicroBitMessageBus adapted to permit enumeration and block removal of listeners
Finally, MicroBit DFU Service has been changed to the new UUIDs specificed in v1.6 of BLE spec.
All options defined in MicroBitConfig are now set IFF they already do not have a value.
This allows external configuration of these options much more cleanly. Additional macros
also defined to provide clean implementation for boolean configuration switches.
Also some minor bugfixes:
- Correction of typo of "Microbit.h" => "MicroBit.h"
- Fixed heap corruption bug on gcc as a result of a debug printf in an unsafe context.