From b537d56ccb58906d9927a21bccf780ae2fe0ee93 Mon Sep 17 00:00:00 2001 From: Sam Kent Date: Thu, 16 Aug 2018 14:00:59 +0100 Subject: [PATCH 1/2] MicroBitAccelerometer can return which acc exists on the m:b --- inc/drivers/FXOS8700.h | 7 +++++++ inc/drivers/LSM303Accelerometer.h | 7 +++++++ inc/drivers/MMA8653.h | 6 ++++++ inc/drivers/MicroBitAccelerometer.h | 15 ++++++++++++++- source/drivers/FXOS8700.cpp | 10 ++++++++++ source/drivers/LSM303Accelerometer.cpp | 10 ++++++++++ source/drivers/MMA8653.cpp | 10 ++++++++++ source/drivers/MicroBitAccelerometer.cpp | 10 ++++++++++ 8 files changed, 74 insertions(+), 1 deletion(-) diff --git a/inc/drivers/FXOS8700.h b/inc/drivers/FXOS8700.h index f5581972..a13924e5 100644 --- a/inc/drivers/FXOS8700.h +++ b/inc/drivers/FXOS8700.h @@ -231,6 +231,13 @@ class FXOS8700 : public MicroBitAccelerometer, public MicroBitCompass */ virtual void idleTick(); + /** + * Returns which accelerometer is detected + * + * @return MICROBIT_ACCELEROMETER_XXX + */ + virtual uint8_t whatAmI(); + /** * Destructor. */ diff --git a/inc/drivers/LSM303Accelerometer.h b/inc/drivers/LSM303Accelerometer.h index 0ca80480..e966137a 100644 --- a/inc/drivers/LSM303Accelerometer.h +++ b/inc/drivers/LSM303Accelerometer.h @@ -147,6 +147,13 @@ class LSM303Accelerometer : public MicroBitAccelerometer */ static int isDetected(MicroBitI2C &i2c, uint16_t address = LSM303_A_DEFAULT_ADDR); + /** + * Returns which accelerometer is detected + * + * @return MICROBIT_ACCELEROMETER_XXX + */ + virtual uint8_t whatAmI(); + /** * Destructor. */ diff --git a/inc/drivers/MMA8653.h b/inc/drivers/MMA8653.h index bfe5530a..64d5cbf0 100644 --- a/inc/drivers/MMA8653.h +++ b/inc/drivers/MMA8653.h @@ -123,6 +123,12 @@ class MMA8653 : public MicroBitAccelerometer */ static int isDetected(MicroBitI2C &i2c, uint16_t address = MMA8653_DEFAULT_ADDR); + /** + * Returns which accelerometer is detected + * + * @return MICROBIT_ACCELEROMETER_XXX + */ + virtual uint8_t whatAmI(); /** * Destructor. diff --git a/inc/drivers/MicroBitAccelerometer.h b/inc/drivers/MicroBitAccelerometer.h index c7b9f3f6..66b8aed5 100644 --- a/inc/drivers/MicroBitAccelerometer.h +++ b/inc/drivers/MicroBitAccelerometer.h @@ -79,6 +79,11 @@ DEALINGS IN THE SOFTWARE. #define MICROBIT_ACCELEROMETER_8G_THRESHOLD ((uint32_t)MICROBIT_ACCELEROMETER_8G_TOLERANCE * (uint32_t)MICROBIT_ACCELEROMETER_8G_TOLERANCE) #define MICROBIT_ACCELEROMETER_SHAKE_COUNT_THRESHOLD 4 +#define MICROBIT_ACCELEROMETER_UNKNOWN 0 +#define MICROBIT_ACCELEROMETER_MMA8653 1 +#define MICROBIT_ACCELEROMETER_LSM303 2 +#define MICROBIT_ACCELEROMETER_FXOS8700 3 + struct ShakeHistory { uint16_t shaken:1, @@ -118,7 +123,7 @@ class MicroBitAccelerometer : public MicroBitComponent public: - static MicroBitAccelerometer *detectedAccelerometer; // The autodetected instance of a MicroBitAcelerometer driver. + static MicroBitAccelerometer *detectedAccelerometer; // The autodetected instance of a MicroBitAccelerometer driver. /** * Constructor. @@ -323,6 +328,13 @@ class MicroBitAccelerometer : public MicroBitComponent { getSample(); } + + /** + * Returns which accelerometer is detected + * + * @return MICROBIT_ACCELEROMETER_XXX + */ + virtual uint8_t whatAmI(); /** * Destructor. @@ -365,6 +377,7 @@ class MicroBitAccelerometer : public MicroBitComponent * @return A 'best guess' of the current posture of the device, based on instanataneous data. */ uint16_t instantaneousPosture(); + }; #endif diff --git a/source/drivers/FXOS8700.cpp b/source/drivers/FXOS8700.cpp index 095d028d..f2e529d0 100644 --- a/source/drivers/FXOS8700.cpp +++ b/source/drivers/FXOS8700.cpp @@ -265,6 +265,16 @@ void FXOS8700::idleTick() requestUpdate(); } +/** +* Returns which accelerometer is detected +* +* @return MICROBIT_ACCELEROMETER_XXX +*/ +uint8_t FXOS8700::whatAmI() +{ + return MICROBIT_ACCELEROMETER_FXOS8700; +} + /** * Destructor for FXS8700, where we deregister from the array of fiber components. */ diff --git a/source/drivers/LSM303Accelerometer.cpp b/source/drivers/LSM303Accelerometer.cpp index 2f81f120..69b41a63 100644 --- a/source/drivers/LSM303Accelerometer.cpp +++ b/source/drivers/LSM303Accelerometer.cpp @@ -200,6 +200,16 @@ int LSM303Accelerometer::isDetected(MicroBitI2C &i2c, uint16_t address) return i2c.readRegister(address, LSM303_WHO_AM_I_A) == LSM303_A_WHOAMI_VAL; } +/** +* Returns which accelerometer is detected +* +* @return MICROBIT_ACCELEROMETER_XXX +*/ +uint8_t LSM303Accelerometer::whatAmI() +{ + return MICROBIT_ACCELEROMETER_LSM303; +} + /** * Destructor. */ diff --git a/source/drivers/MMA8653.cpp b/source/drivers/MMA8653.cpp index b1e5bcc9..3d51f6b9 100644 --- a/source/drivers/MMA8653.cpp +++ b/source/drivers/MMA8653.cpp @@ -215,6 +215,16 @@ int MMA8653::isDetected(MicroBitI2C &i2c, uint16_t address) return i2c.readRegister(address, MMA8653_WHOAMI) == MMA8653_WHOAMI_VAL; } +/** +* Returns which accelerometer is detected +* +* @return MICROBIT_ACCELEROMETER_XXX +*/ +uint8_t MMA8653::whatAmI() +{ + return MICROBIT_ACCELEROMETER_MMA8653; +} + /** * Destructor. */ diff --git a/source/drivers/MicroBitAccelerometer.cpp b/source/drivers/MicroBitAccelerometer.cpp index da71ccb3..8b9a9a9c 100644 --- a/source/drivers/MicroBitAccelerometer.cpp +++ b/source/drivers/MicroBitAccelerometer.cpp @@ -597,6 +597,16 @@ uint16_t MicroBitAccelerometer::getGesture() return lastGesture; } +/** + * Returns which accelerometer is detected + * + * @return MICROBIT_ACCELEROMETER_XXX + */ +uint8_t MicroBitAccelerometer::whatAmI() +{ + return MICROBIT_ACCELEROMETER_UNKNOWN; +} + /** * Destructor for FXS8700, where we deregister from the array of fiber components. */ From 3114cbf6e77f2f3b1e90898c9792032ccab6a5e5 Mon Sep 17 00:00:00 2001 From: Sam Kent Date: Thu, 16 Aug 2018 16:52:28 +0100 Subject: [PATCH 2/2] Use ManagedStrings --- inc/bluetooth/MicroBitBLEManager.h | 4 +++- inc/core/MicroBitDevice.h | 4 ++++ source/bluetooth/MicroBitBLEManager.cpp | 8 +++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/inc/bluetooth/MicroBitBLEManager.h b/inc/bluetooth/MicroBitBLEManager.h index 5645d548..8b823cd6 100644 --- a/inc/bluetooth/MicroBitBLEManager.h +++ b/inc/bluetooth/MicroBitBLEManager.h @@ -150,7 +150,7 @@ class MicroBitBLEManager : MicroBitComponent * bleManager.init(uBit.getName(), uBit.getSerial(), uBit.messageBus, true); * @endcode */ - void init(ManagedString deviceName, ManagedString serialNumber, EventModel &messageBus, bool enableBonding); + void init(ManagedString deviceName, ManagedString serialNumber, EventModel &messageBus, bool enableBonding, ManagedString microbitModel = ManagedString("BBC micro:bit")); /** * Change the output power level of the transmitter to the given value. @@ -324,6 +324,8 @@ class MicroBitBLEManager : MicroBitComponent */ uint8_t currentMode = MICROBIT_MODE_APPLICATION; + char* getMicrobitModel(); + }; #endif diff --git a/inc/core/MicroBitDevice.h b/inc/core/MicroBitDevice.h index eadebaac..b45d4344 100644 --- a/inc/core/MicroBitDevice.h +++ b/inc/core/MicroBitDevice.h @@ -38,6 +38,10 @@ DEALINGS IN THE SOFTWARE. #define MICROBIT_NAME_CODE_LETTERS 5 #define MICROBIT_PANIC_ERROR_CHARS 4 +#define MICROBIT_MODEL_UNKNOWN "BBC micro:bit" +#define MICROBIT_MODEL_1_3_X "BBC micro:bit v1.3x" +#define MICROBIT_MODEL_1_5_X "BBC micro:bit v1.5" + #include "MicroBitConfig.h" #include "MicroBitMatrixMaps.h" diff --git a/source/bluetooth/MicroBitBLEManager.cpp b/source/bluetooth/MicroBitBLEManager.cpp index 2d5f0bbf..b2154e85 100644 --- a/source/bluetooth/MicroBitBLEManager.cpp +++ b/source/bluetooth/MicroBitBLEManager.cpp @@ -289,12 +289,13 @@ void MicroBitBLEManager::deferredSysAttrWrite(Gap::Handle_t handle) * @param serialNumber The serial number exposed by the device information service * @param messageBus An instance of an EventModel, used during pairing. * @param enableBonding If true, the security manager enabled bonding. + * @param microbitModel The model of the micro:bit if detected * * @code - * bleManager.init(uBit.getName(), uBit.getSerial(), uBit.messageBus, true); + * bleManager.init(uBit.getName(), uBit.getSerial(), uBit.messageBus, true, uBit.getModel()); * @endcode */ -void MicroBitBLEManager::init(ManagedString deviceName, ManagedString serialNumber, EventModel &messageBus, bool enableBonding) +void MicroBitBLEManager::init(ManagedString deviceName, ManagedString serialNumber, EventModel &messageBus, bool enableBonding, ManagedString microbitModel) { ManagedString BLEName("BBC micro:bit"); this->deviceName = deviceName; @@ -387,7 +388,7 @@ void MicroBitBLEManager::init(ManagedString deviceName, ManagedString serialNumb #endif #if CONFIG_ENABLED(MICROBIT_BLE_DEVICE_INFORMATION_SERVICE) - DeviceInformationService ble_device_information_service(*ble, MICROBIT_BLE_MANUFACTURER, MICROBIT_BLE_MODEL, serialNumber.toCharArray(), MICROBIT_BLE_HARDWARE_VERSION, MICROBIT_BLE_FIRMWARE_VERSION, MICROBIT_BLE_SOFTWARE_VERSION); + DeviceInformationService ble_device_information_service(*ble, MICROBIT_BLE_MANUFACTURER, microbitModel.toCharArray(), serialNumber.toCharArray(), MICROBIT_BLE_HARDWARE_VERSION, MICROBIT_BLE_FIRMWARE_VERSION, MICROBIT_BLE_SOFTWARE_VERSION); #else (void)serialNumber; #endif @@ -857,3 +858,4 @@ void MicroBitBLEManager::showNameHistogram(MicroBitDisplay &display) uint8_t MicroBitBLEManager::getCurrentMode(){ return currentMode; } +