X-NUCLEO-IKS01A1 Environmental/Motion sensors data transmitted via X-NUCLEO-IDB04A1 BLE board. Compatible with iOS/Android ST BlueMS V2.1 application.

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 X_NUCLEO_IKS01A1 mbed

Fork of Bluemicrosystem1 by ST Expansion SW Team

BlueMicrosystem application

This application is the mbed equivalent of ST BlueMicrosystem1 and provides an example of motion and environmental data exported via Bluetooth Low Energy to an Android or IOS device.
It runs on a ST NUCLEO-F401RE board connected with a X-NUCLEO-IKS01A1 and a X-NUCLEO-IDB04A1 expansion boards and is compatible with Android and iOS ST BlueMS smartphone applications (based on Android and iOS BlueST SDKs).
By default the application is not providing sensor fusion and activity recognition features. However sensor fusion can be enabled following the steps below:

  • Download and install osxMotionFX library on your PC.
  • Obtain the free license for your board following the instructions
  • Copy the correct license into Middlewares/ST/STM32_OSX_MotionFX_Library/osx_license.h of your mbed program folder
  • Copy Middlewares/ST/STM32_OSX_MotionFX_Library/Inc/osx_motion_fx.h file
  • Rename the provided .lib Keil binary library giving it a .ar extension, then copy it into Middlewares/ST/STM32_OSX_MotionFX_Library/Lib of your mbed program folder
  • Enable USE_SENSOR_FUSION_LIB macro into MotionFX_Manager.h file and recompile.
Committer:
mapellil
Date:
Thu Dec 17 15:58:35 2015 +0000
Revision:
7:34014895dda8
Parent:
6:c1b8fb74072e
Child:
8:b042fe719f51
Updated BLE stack/API (now BigEndian UUID), set max tx power

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mapellil 6:c1b8fb74072e 1 /**
mapellil 6:c1b8fb74072e 2 ******************************************************************************
mapellil 6:c1b8fb74072e 3 * @file CustomSoftwareService.h
mapellil 6:c1b8fb74072e 4 * @author AST / EST
mapellil 6:c1b8fb74072e 5 * @version V0.0.1
mapellil 6:c1b8fb74072e 6 * @date 16-Dec-2015
mapellil 6:c1b8fb74072e 7 * @brief Ble quaternion service of Bluemicrosystem1 application
mapellil 6:c1b8fb74072e 8 ******************************************************************************
mapellil 6:c1b8fb74072e 9 * @attention
mapellil 0:e93a11b4e044 10 *
mapellil 6:c1b8fb74072e 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mapellil 0:e93a11b4e044 12 *
mapellil 6:c1b8fb74072e 13 * Redistribution and use in source and binary forms, with or without modification,
mapellil 6:c1b8fb74072e 14 * are permitted provided that the following conditions are met:
mapellil 6:c1b8fb74072e 15 * 1. Redistributions of source code must retain the above copyright notice,
mapellil 6:c1b8fb74072e 16 * this list of conditions and the following disclaimer.
mapellil 6:c1b8fb74072e 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
mapellil 6:c1b8fb74072e 18 * this list of conditions and the following disclaimer in the documentation
mapellil 6:c1b8fb74072e 19 * and/or other materials provided with the distribution.
mapellil 6:c1b8fb74072e 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mapellil 6:c1b8fb74072e 21 * may be used to endorse or promote products derived from this software
mapellil 6:c1b8fb74072e 22 * without specific prior written permission.
mapellil 0:e93a11b4e044 23 *
mapellil 6:c1b8fb74072e 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mapellil 6:c1b8fb74072e 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mapellil 6:c1b8fb74072e 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mapellil 6:c1b8fb74072e 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mapellil 6:c1b8fb74072e 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mapellil 6:c1b8fb74072e 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mapellil 6:c1b8fb74072e 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mapellil 6:c1b8fb74072e 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mapellil 6:c1b8fb74072e 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mapellil 6:c1b8fb74072e 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mapellil 6:c1b8fb74072e 34 *
mapellil 6:c1b8fb74072e 35 ******************************************************************************
mapellil 0:e93a11b4e044 36 */
mapellil 0:e93a11b4e044 37
mapellil 0:e93a11b4e044 38 #ifndef __CUSTOM_BLE_SOFTWARE_SERVICE_H__
mapellil 0:e93a11b4e044 39 #define __CUSTOM_BLE_SOFTWARE_SERVICE_H__
mapellil 0:e93a11b4e044 40 #include "BLE.h"
mapellil 0:e93a11b4e044 41
mapellil 0:e93a11b4e044 42 #define SEND_N_QUATERNIONS 3 // The number of quaternions to be sent per BLE update (could be 1,2,3)
mapellil 0:e93a11b4e044 43
mapellil 0:e93a11b4e044 44 #if SEND_N_QUATERNIONS == 1
mapellil 0:e93a11b4e044 45 #elif SEND_N_QUATERNIONS == 2
mapellil 0:e93a11b4e044 46 #elif SEND_N_QUATERNIONS == 3
mapellil 0:e93a11b4e044 47 #else
mapellil 0:e93a11b4e044 48 #error SEND_N_QUATERNIONS could be only 1,2,3
mapellil 0:e93a11b4e044 49 #endif
mapellil 0:e93a11b4e044 50
mapellil 0:e93a11b4e044 51 #define SIZEOF_QUAT 2+2*3*SEND_N_QUATERNIONS // timestamp+sizeof(quat)*xyz*nquat
mapellil 0:e93a11b4e044 52 #define SIZEOF_FLOAT_QUAT 2+4*3
mapellil 0:e93a11b4e044 53
mapellil 7:34014895dda8 54 const LongUUIDBytes_t SOFTWARE_SERVICE_UUID_128 = { 0x00,0x00,0x00,0x00,0x00,0x02,0x11,0xe1,0x9a,0xb4,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 7:34014895dda8 55 const LongUUIDBytes_t QUATERNIONS_CHAR_UUID_128 = { 0x00,0x00,0x01,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b};
mapellil 7:34014895dda8 56 const LongUUIDBytes_t QUATERNIONS_FLOAT_CHAR_UUID_128 = { 0x00,0x00,0x00,0x80,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b};
mapellil 0:e93a11b4e044 57
mapellil 0:e93a11b4e044 58
mapellil 0:e93a11b4e044 59 /* Custom Software Service */
mapellil 0:e93a11b4e044 60 class CustomSoftwareService {
mapellil 0:e93a11b4e044 61 public:
mapellil 6:c1b8fb74072e 62 CustomSoftwareService(BLE &_ble, CustomBleErrManagement * ErrMgr=NULL ) :
mapellil 0:e93a11b4e044 63 ble(_ble),
mapellil 0:e93a11b4e044 64 swQuaternionsCharacteristic(QUATERNIONS_CHAR_UUID_128, swQuaternions, SIZEOF_QUAT, SIZEOF_QUAT,
mapellil 0:e93a11b4e044 65 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 66 swFloatQuaternionsCharacteristic(QUATERNIONS_FLOAT_CHAR_UUID_128, swFloatQuaternions, SIZEOF_FLOAT_QUAT, SIZEOF_FLOAT_QUAT,
mapellil 0:e93a11b4e044 67 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY)
mapellil 0:e93a11b4e044 68 {
mapellil 0:e93a11b4e044 69
mapellil 0:e93a11b4e044 70 static bool serviceAdded = false; /* We should only ever need to add the heart rate service once. */
mapellil 0:e93a11b4e044 71 if (serviceAdded) {
mapellil 0:e93a11b4e044 72 return;
mapellil 0:e93a11b4e044 73 }
mapellil 0:e93a11b4e044 74
mapellil 0:e93a11b4e044 75 GattCharacteristic *charTable[] = {&swQuaternionsCharacteristic, &swFloatQuaternionsCharacteristic};
mapellil 0:e93a11b4e044 76
mapellil 0:e93a11b4e044 77 GattService quaternionsService(SOFTWARE_SERVICE_UUID_128, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
mapellil 0:e93a11b4e044 78
mapellil 0:e93a11b4e044 79 ble.gattServer().addService(quaternionsService);
mapellil 0:e93a11b4e044 80
mapellil 0:e93a11b4e044 81 isEnabledQuatNotify = false;
mapellil 0:e93a11b4e044 82 isEnabledFloatQuatnotify = false;
mapellil 0:e93a11b4e044 83
mapellil 0:e93a11b4e044 84 memset (swQuaternions, 0, SIZEOF_QUAT);
mapellil 0:e93a11b4e044 85 memset (swFloatQuaternions, 0, SIZEOF_FLOAT_QUAT);
mapellil 0:e93a11b4e044 86
mapellil 0:e93a11b4e044 87 serviceAdded = true;
mapellil 0:e93a11b4e044 88 }
mapellil 0:e93a11b4e044 89
mapellil 6:c1b8fb74072e 90 void updateQuaternions(AxesRaw_TypeDef *data, uint16_t TimeStamp) {
mapellil 6:c1b8fb74072e 91 if (isEnabledQuatNotify) {
mapellil 6:c1b8fb74072e 92 if (bleErrMgr != NULL) {
mapellil 6:c1b8fb74072e 93 if (!bleErrMgr->isBleTxChannelOk()){
mapellil 6:c1b8fb74072e 94 bleErrMgr->signalBleTxOk(); // skip tx because of previous error
mapellil 6:c1b8fb74072e 95 return;
mapellil 6:c1b8fb74072e 96 }
mapellil 6:c1b8fb74072e 97 }
mapellil 6:c1b8fb74072e 98 STORE_LE_16(swQuaternions ,TimeStamp);
mapellil 0:e93a11b4e044 99 #if SEND_N_QUATERNIONS == 1
mapellil 6:c1b8fb74072e 100 STORE_LE_16(swQuaternions+2,data[0].AXIS_X);
mapellil 6:c1b8fb74072e 101 STORE_LE_16(swQuaternions+4,data[0].AXIS_Y);
mapellil 6:c1b8fb74072e 102 STORE_LE_16(swQuaternions+6,data[0].AXIS_Z);
mapellil 0:e93a11b4e044 103 #elif SEND_N_QUATERNIONS == 2
mapellil 6:c1b8fb74072e 104 STORE_LE_16(swQuaternions+2,data[0].AXIS_X);
mapellil 6:c1b8fb74072e 105 STORE_LE_16(swQuaternions+4,data[0].AXIS_Y);
mapellil 6:c1b8fb74072e 106 STORE_LE_16(swQuaternions+6,data[0].AXIS_Z);
mapellil 0:e93a11b4e044 107
mapellil 6:c1b8fb74072e 108 STORE_LE_16(swQuaternions+8 ,data[1].AXIS_X);
mapellil 6:c1b8fb74072e 109 STORE_LE_16(swQuaternions+10,data[1].AXIS_Y);
mapellil 6:c1b8fb74072e 110 STORE_LE_16(swQuaternions+12,data[1].AXIS_Z);
mapellil 0:e93a11b4e044 111 #elif SEND_N_QUATERNIONS == 3
mapellil 6:c1b8fb74072e 112 STORE_LE_16(swQuaternions+2,data[0].AXIS_X);
mapellil 6:c1b8fb74072e 113 STORE_LE_16(swQuaternions+4,data[0].AXIS_Y);
mapellil 6:c1b8fb74072e 114 STORE_LE_16(swQuaternions+6,data[0].AXIS_Z);
mapellil 0:e93a11b4e044 115
mapellil 6:c1b8fb74072e 116 STORE_LE_16(swQuaternions+8 ,data[1].AXIS_X);
mapellil 6:c1b8fb74072e 117 STORE_LE_16(swQuaternions+10,data[1].AXIS_Y);
mapellil 6:c1b8fb74072e 118 STORE_LE_16(swQuaternions+12,data[1].AXIS_Z);
mapellil 0:e93a11b4e044 119
mapellil 6:c1b8fb74072e 120 STORE_LE_16(swQuaternions+14,data[2].AXIS_X);
mapellil 6:c1b8fb74072e 121 STORE_LE_16(swQuaternions+16,data[2].AXIS_Y);
mapellil 6:c1b8fb74072e 122 STORE_LE_16(swQuaternions+18,data[2].AXIS_Z);
mapellil 0:e93a11b4e044 123 #else
mapellil 0:e93a11b4e044 124 #error SEND_N_QUATERNIONS could be only 1,2,3
mapellil 0:e93a11b4e044 125 #endif
mapellil 6:c1b8fb74072e 126 uint32_t err = ble.gattServer().write(swQuaternionsCharacteristic.getValueAttribute().getHandle(), swQuaternions, SIZEOF_QUAT,0);
mapellil 6:c1b8fb74072e 127 if (!err) {
mapellil 6:c1b8fb74072e 128 bleErrMgr->signalBleTxOk();
mapellil 6:c1b8fb74072e 129 }else{
mapellil 6:c1b8fb74072e 130 bleErrMgr->signalBleTxErr(err);
mapellil 6:c1b8fb74072e 131 }
mapellil 6:c1b8fb74072e 132 }
mapellil 0:e93a11b4e044 133 }
mapellil 0:e93a11b4e044 134
mapellil 0:e93a11b4e044 135 void updateFloatQuaternions(float *QuatFloat, uint16_t TimeStamp) {
mapellil 6:c1b8fb74072e 136 if (isEnabledFloatQuatnotify) {
mapellil 6:c1b8fb74072e 137 if (bleErrMgr != NULL) {
mapellil 6:c1b8fb74072e 138 if (!bleErrMgr->isBleTxChannelOk()){
mapellil 6:c1b8fb74072e 139 bleErrMgr->signalBleTxOk(); // skip tx because of previous error
mapellil 6:c1b8fb74072e 140 return;
mapellil 6:c1b8fb74072e 141 }
mapellil 6:c1b8fb74072e 142 }
mapellil 6:c1b8fb74072e 143 STORE_LE_16(swFloatQuaternions ,TimeStamp);
mapellil 6:c1b8fb74072e 144 STORE_LE_32(swFloatQuaternions+2 ,((uint32_t*)(QuatFloat))[0]);
mapellil 6:c1b8fb74072e 145 STORE_LE_32(swFloatQuaternions+6 ,((uint32_t*)(QuatFloat))[1]);
mapellil 6:c1b8fb74072e 146 STORE_LE_32(swFloatQuaternions+10,((uint32_t*)(QuatFloat))[2]);
mapellil 0:e93a11b4e044 147
mapellil 6:c1b8fb74072e 148 uint32_t err = ble.gattServer().write(swFloatQuaternionsCharacteristic.getValueAttribute().getHandle(), swFloatQuaternions, SIZEOF_FLOAT_QUAT,0);
mapellil 6:c1b8fb74072e 149 if (!err) {
mapellil 6:c1b8fb74072e 150 bleErrMgr->signalBleTxOk();
mapellil 6:c1b8fb74072e 151 }else{
mapellil 6:c1b8fb74072e 152 bleErrMgr->signalBleTxErr(err);
mapellil 6:c1b8fb74072e 153 }
mapellil 6:c1b8fb74072e 154 }
mapellil 0:e93a11b4e044 155 }
mapellil 0:e93a11b4e044 156
mapellil 0:e93a11b4e044 157 void enNotify (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 158 if (isQuatHandle(handle)) { isEnabledQuatNotify = true; return; }
mapellil 0:e93a11b4e044 159 if (isFloatQuatHandle(handle)) { isEnabledFloatQuatnotify = true; return; }
mapellil 0:e93a11b4e044 160 }
mapellil 0:e93a11b4e044 161
mapellil 0:e93a11b4e044 162 void disNotify (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 163 if (isQuatHandle(handle)) { isEnabledQuatNotify = false; return; }
mapellil 0:e93a11b4e044 164 if (isFloatQuatHandle(handle)) { isEnabledFloatQuatnotify = false; return; }
mapellil 0:e93a11b4e044 165 }
mapellil 0:e93a11b4e044 166
mapellil 0:e93a11b4e044 167 bool isQuatHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 168 if (handle == swQuaternionsCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 169 return false;
mapellil 0:e93a11b4e044 170 }
mapellil 0:e93a11b4e044 171
mapellil 0:e93a11b4e044 172 bool isFloatQuatHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 173 if (handle == swFloatQuaternionsCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 174 return false;
mapellil 0:e93a11b4e044 175 }
mapellil 0:e93a11b4e044 176
mapellil 0:e93a11b4e044 177 void updateConnectionStatus(ConnectionStatus_t status) {
mapellil 0:e93a11b4e044 178 isEnabledQuatNotify = false;
mapellil 0:e93a11b4e044 179 isEnabledFloatQuatnotify = false;
mapellil 0:e93a11b4e044 180 memset (swQuaternions, 0, SIZEOF_QUAT);
mapellil 0:e93a11b4e044 181 memset (swFloatQuaternions, 0, SIZEOF_FLOAT_QUAT);
mapellil 0:e93a11b4e044 182 }
mapellil 0:e93a11b4e044 183
mapellil 0:e93a11b4e044 184 private:
mapellil 6:c1b8fb74072e 185 BLE &ble;
mapellil 6:c1b8fb74072e 186 CustomBleErrManagement *bleErrMgr;
mapellil 0:e93a11b4e044 187 GattCharacteristic swQuaternionsCharacteristic;
mapellil 0:e93a11b4e044 188 GattCharacteristic swFloatQuaternionsCharacteristic;
mapellil 0:e93a11b4e044 189 uint8_t swQuaternions[SIZEOF_QUAT];
mapellil 0:e93a11b4e044 190 uint8_t swFloatQuaternions[SIZEOF_FLOAT_QUAT];
mapellil 0:e93a11b4e044 191 bool isEnabledQuatNotify;
mapellil 0:e93a11b4e044 192 bool isEnabledFloatQuatnotify;
mapellil 0:e93a11b4e044 193 };
mapellil 0:e93a11b4e044 194
mapellil 0:e93a11b4e044 195 #endif /* #ifndef __CUSTOM_BLE_CONFIG_SERVICE_H__*/