Motion and Environmental sensor reader application connected via BLE to ST BlueMS iOS/Android application.

Dependencies:   HTS221 LIS3MDL LPS22HB LSM303AGR LSM6DSL

Fork of MOTENV_Mbed by ST Expansion SW Team

This application supports three different sets of ST hardware boards:

  • STEVAL-STLKT01V1 (aka SensorTile)
  • X-NUCLEO-IDB05A1 and X-NUCLEO-IKS01A2 expansion boards
  • B-L475E-IOT01A IoT Discovery board

    and runs over four different target configurations:

  • Nucleo F401RE + X-NUCLEO-IDB05A1 + X-NUCLEO-IKS01A2 (set target NUCLEO_F401RE)
  • DISCO_L475VG_IOT01A (set target DISCO_L475VG_IOT01A)
  • Nucleo L476RG + CRADLE + SENSORTILE (set compile target NUCLEO_L476RG)
  • Nucleo L476RG + CRADLE_EXPANSION_BOARD + SENSORTILE (set compile target NUCLEO_L476RG, remove macro MINI_CRADLE from mbed_app.json)

The first 2 configurations do not require any HW modifications (just use the above indicated targets).

Third configuration (CRADLE ) only requires to remove the two ST-LINK jumpers and JP6 from the Nucleo L476RG board in order to allow flashing the SensorTile through the Nucleo Jtag controller. Once flashed, if the battery is properly plugged and charged, the SensorTile could be mounted in the plastic enclosure being able to run as a small stand alone wearable device. Please note that this configuration do not provide a serial console for printf.

To enable last configuration (CRADLE_EXPANSION_BOARD), follow the steps below:

  • On Nucleo L476RG
    • open the two "ST-LINK" jumpers
    • open the MCU power supply jumper JP6
    • close the solder bridges SB63 and SB62 (to enable the serial console)
  • On SensorTile Arduino Cradle close the solder bridges SB21 and SB10 (to enable the serial console) and move the jumper J2 to the 5V position
  • Plug the Sensor Tile on the Arduino Cradle
  • Plug the Cradle on the Nucleo Arduino connector and connect the debug flat cable between Cradle and Nucleo Jtag connector (the cradle pin1 -identified by a dot- must be connected to the Nucleo pin1 (dot) of SWD CN4 jtag connector)
  • Plug the Nucleo USB cable on PC (a new COM port should appear); no need to plug the micro USB cable on the cradle.
  • Open a PC terminal to see the messages
  • Compile from mbed CLI or on-line compiler removing macro MINI_CRADLE from mbed_app.json file and selecting NUCLEO_ L476RG target
  • Flash the board with the binary

For all configurations on an Android or iOS device download and open the ST BlueMS application and connect to "MotEnvMbedOS" BLE device to see the sensor data.

For all configurations is also possible to add a 9 axis MotionFX sensor fusion library, which is part of the X-CUBE-MEMS package at this link.
The library comes in three flavours, choose your preferred according to the toolchain used (IAR, Keil or GC, Keil version should be used for the online compiler) and copy it in the Middlewares\ST\STM32_MotionFX_Library\Lib directory changing the file extension according to the toolchain used (.a for GCC, .ar for Keil).
In the file mbed_app.json add the macro definition "USE_SENSOR_FUSION_LIB" to the chosen target.
If compiling from CLI and using GCC_ARM toolchain option, in the file \mbed-os\tools\toolchains\gcc.py change the compiling option from

        if target.core == "Cortex-M4F":
            self.cpu.append("-mfpu=fpv4-sp-d16")
            self.cpu.append("-mfloat-abi=softfp")

to

        if target.core == "Cortex-M4F":
            self.cpu.append("-mfpu=fpv4-sp-d16")
            self.cpu.append("-mfloat-abi=hard")

and compile.

Committer:
mapellil
Date:
Wed Dec 23 11:13:08 2015 +0000
Revision:
9:2693f9ef8ff7
Parent:
8:b042fe719f51
Child:
11:ff82699c696e
Update BLE API and X-NUCLEO-IDB0XA1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mapellil 9:2693f9ef8ff7 1 /**
mapellil 9:2693f9ef8ff7 2 ******************************************************************************
mapellil 9:2693f9ef8ff7 3 * @file CustomSensorService.h
mapellil 9:2693f9ef8ff7 4 * @author Central Labs / AST
mapellil 9:2693f9ef8ff7 5 * @version V0.9.0
mapellil 9:2693f9ef8ff7 6 * @date 23-Dec-2015
mapellil 9:2693f9ef8ff7 7 * @brief BLE MEMS and environmental sensors service
mapellil 9:2693f9ef8ff7 8 ******************************************************************************
mapellil 9:2693f9ef8ff7 9 * @attention
mapellil 9:2693f9ef8ff7 10 *
mapellil 9:2693f9ef8ff7 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mapellil 9:2693f9ef8ff7 12 *
mapellil 9:2693f9ef8ff7 13 * Redistribution and use in source and binary forms, with or without modification,
mapellil 9:2693f9ef8ff7 14 * are permitted provided that the following conditions are met:
mapellil 9:2693f9ef8ff7 15 * 1. Redistributions of source code must retain the above copyright notice,
mapellil 9:2693f9ef8ff7 16 * this list of conditions and the following disclaimer.
mapellil 9:2693f9ef8ff7 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
mapellil 9:2693f9ef8ff7 18 * this list of conditions and the following disclaimer in the documentation
mapellil 9:2693f9ef8ff7 19 * and/or other materials provided with the distribution.
mapellil 9:2693f9ef8ff7 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mapellil 9:2693f9ef8ff7 21 * may be used to endorse or promote products derived from this software
mapellil 9:2693f9ef8ff7 22 * without specific prior written permission.
mapellil 9:2693f9ef8ff7 23 *
mapellil 9:2693f9ef8ff7 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mapellil 9:2693f9ef8ff7 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mapellil 9:2693f9ef8ff7 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mapellil 9:2693f9ef8ff7 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mapellil 9:2693f9ef8ff7 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mapellil 9:2693f9ef8ff7 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mapellil 9:2693f9ef8ff7 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mapellil 9:2693f9ef8ff7 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mapellil 9:2693f9ef8ff7 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mapellil 9:2693f9ef8ff7 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mapellil 9:2693f9ef8ff7 34 *
mapellil 9:2693f9ef8ff7 35 ******************************************************************************
mapellil 9:2693f9ef8ff7 36 */
mapellil 0:e93a11b4e044 37
mapellil 0:e93a11b4e044 38 #ifndef __CUSTOM_BLE_SENSORS_SERVICE_H__
mapellil 0:e93a11b4e044 39 #define __CUSTOM_BLE_SENSORS_SERVICE_H__
mapellil 0:e93a11b4e044 40
mapellil 0:e93a11b4e044 41 #include "BLE.h"
mapellil 0:e93a11b4e044 42
mapellil 9:2693f9ef8ff7 43 const LongUUIDBytes_t SENS_SERVICE_UUID_128 = { 0x00,0x00,0x00,0x00,0x00,0x01,0x11,0xe1,0x9a,0xb4,0x00,0x02,0xa5,0xd5,0xc5,0x1b }; // temp, pressure, humidity,
mapellil 9:2693f9ef8ff7 44 const LongUUIDBytes_t SENS_TEMP_CHAR_UUID_128 = { 0x00,0x04,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 9:2693f9ef8ff7 45 const LongUUIDBytes_t SENS_HUMI_CHAR_UUID_128 = { 0x00,0x08,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 9:2693f9ef8ff7 46 const LongUUIDBytes_t SENS_PRES_CHAR_UUID_128 = { 0x00,0x10,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 9:2693f9ef8ff7 47 const LongUUIDBytes_t SENS_MAGN_CHAR_UUID_128 = { 0x00,0x20,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 9:2693f9ef8ff7 48 const LongUUIDBytes_t SENS_GYRO_CHAR_UUID_128 = { 0x00,0x40,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 9:2693f9ef8ff7 49 const LongUUIDBytes_t SENS_ACCE_CHAR_UUID_128 = { 0x00,0x80,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 9:2693f9ef8ff7 50 const LongUUIDBytes_t SENS_ACC_GYRO_MAG_CHAR_UUID_128 = { 0x00,0xE0,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b };
mapellil 8:b042fe719f51 51
mapellil 0:e93a11b4e044 52
mapellil 0:e93a11b4e044 53 #define TEMP_DATA_LEN 2+2
mapellil 0:e93a11b4e044 54 #define HUM_DATA_LEN 2+2
mapellil 0:e93a11b4e044 55 #define PRES_DATA_LEN 2+4
mapellil 0:e93a11b4e044 56 #define ACC_DATA_LEN 6+2
mapellil 0:e93a11b4e044 57 #define MAG_DATA_LEN 6+2
mapellil 0:e93a11b4e044 58 #define GYRO_DATA_LEN 6+2
mapellil 0:e93a11b4e044 59 #define ACCGYROMAG_DATA_LEN 2+3*3*2
mapellil 0:e93a11b4e044 60
mapellil 0:e93a11b4e044 61
mapellil 0:e93a11b4e044 62 /* Custom Sensors Service */
mapellil 0:e93a11b4e044 63 class CustomSensorService {
mapellil 0:e93a11b4e044 64 public:
mapellil 9:2693f9ef8ff7 65 CustomSensorService(BLE &_ble) :
mapellil 0:e93a11b4e044 66 ble(_ble),
mapellil 0:e93a11b4e044 67 envTemperatureCharacteristic(SENS_TEMP_CHAR_UUID_128,envTemperature, TEMP_DATA_LEN, TEMP_DATA_LEN,
mapellil 0:e93a11b4e044 68 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 69 envHumidityCharacteristic(SENS_HUMI_CHAR_UUID_128, envHumidity, HUM_DATA_LEN, HUM_DATA_LEN,
mapellil 0:e93a11b4e044 70 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 71 envPressureCharacteristic(SENS_PRES_CHAR_UUID_128, envPressure, PRES_DATA_LEN, PRES_DATA_LEN,
mapellil 0:e93a11b4e044 72 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 73 envMagnetometerCharacteristic(SENS_MAGN_CHAR_UUID_128,envMagn, MAG_DATA_LEN, MAG_DATA_LEN,
mapellil 0:e93a11b4e044 74 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 75 envAccelerometerCharacteristic(SENS_ACCE_CHAR_UUID_128,envAcce, ACC_DATA_LEN, ACC_DATA_LEN,
mapellil 0:e93a11b4e044 76 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 77 envGyroCharacteristic(SENS_GYRO_CHAR_UUID_128,envGyro, GYRO_DATA_LEN, GYRO_DATA_LEN,
mapellil 0:e93a11b4e044 78 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 79 envAccGyroMagCharacteristic(SENS_ACC_GYRO_MAG_CHAR_UUID_128,envAccGyroMag, ACCGYROMAG_DATA_LEN, ACCGYROMAG_DATA_LEN,
mapellil 0:e93a11b4e044 80 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY)
mapellil 0:e93a11b4e044 81 {
mapellil 0:e93a11b4e044 82
mapellil 0:e93a11b4e044 83 static bool serviceAdded = false; /* We should only ever need to add the env service once. */
mapellil 0:e93a11b4e044 84 if (serviceAdded) {
mapellil 0:e93a11b4e044 85 return;
mapellil 0:e93a11b4e044 86 }
mapellil 8:b042fe719f51 87
mapellil 0:e93a11b4e044 88 GattCharacteristic *charTable[] = {&envTemperatureCharacteristic, &envHumidityCharacteristic, &envPressureCharacteristic, &envMagnetometerCharacteristic,
mapellil 0:e93a11b4e044 89 &envAccelerometerCharacteristic, &envGyroCharacteristic, &envAccGyroMagCharacteristic};
mapellil 0:e93a11b4e044 90
mapellil 0:e93a11b4e044 91 GattService envService(SENS_SERVICE_UUID_128, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
mapellil 0:e93a11b4e044 92
mapellil 0:e93a11b4e044 93 ble.gattServer().addService(envService);
mapellil 0:e93a11b4e044 94
mapellil 0:e93a11b4e044 95 isEnabledTempNotify = false;
mapellil 0:e93a11b4e044 96 isEnabledHumNotify = false;
mapellil 0:e93a11b4e044 97 isEnabledPresNotify = false;
mapellil 0:e93a11b4e044 98 isEnabledGyroNotify = false;
mapellil 0:e93a11b4e044 99 isEnabledAccNotify = false;
mapellil 0:e93a11b4e044 100 isEnabledMagNotify = false;
mapellil 0:e93a11b4e044 101 isEnabledAccGyroMagNotify = false;
mapellil 0:e93a11b4e044 102
mapellil 0:e93a11b4e044 103 isTempCalibrated = false;
mapellil 0:e93a11b4e044 104 isHumCalibrated = false;
mapellil 0:e93a11b4e044 105 isPresCalibrated = false;
mapellil 0:e93a11b4e044 106 isMagCalibrated = false;
mapellil 0:e93a11b4e044 107 isAccCalibrated = false;
mapellil 0:e93a11b4e044 108 isAGyroCalibrated = false;
mapellil 0:e93a11b4e044 109
mapellil 0:e93a11b4e044 110 memset (pastenvTemperature, 0, TEMP_DATA_LEN);
mapellil 0:e93a11b4e044 111 memset (pastenvHumidity, 0, HUM_DATA_LEN);
mapellil 0:e93a11b4e044 112 memset (pastenvPressure, 0, PRES_DATA_LEN);
mapellil 0:e93a11b4e044 113
mapellil 0:e93a11b4e044 114 isBTLEConnected = DISCONNECTED;
mapellil 0:e93a11b4e044 115 serviceAdded = true;
mapellil 0:e93a11b4e044 116 }
mapellil 0:e93a11b4e044 117
mapellil 8:b042fe719f51 118 uint32_t sendEnvTemperature (int16_t Temp, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 119 STORE_LE_16(envTemperature,TimeStamp);
mapellil 8:b042fe719f51 120 STORE_LE_16(envTemperature+2,Temp);
mapellil 8:b042fe719f51 121 PRINTF("sendEnvTemperature!! handle: %d\n\r", envTemperatureCharacteristic.getValueAttribute().getHandle());
mapellil 8:b042fe719f51 122 memcpy (pastenvTemperature, envTemperature, TEMP_DATA_LEN);
mapellil 8:b042fe719f51 123 return ble.gattServer().write(envTemperatureCharacteristic.getValueAttribute().getHandle(), envTemperature, TEMP_DATA_LEN, 0);
mapellil 0:e93a11b4e044 124 }
mapellil 0:e93a11b4e044 125
mapellil 0:e93a11b4e044 126 /**
mapellil 0:e93a11b4e044 127 * Update the temperature with a new value. Valid values range from
mapellil 0:e93a11b4e044 128 * 0..100. Anything outside this range will be ignored.
mapellil 0:e93a11b4e044 129 * @param newLevel New level. */
mapellil 8:b042fe719f51 130 uint32_t updateEnvTemperature (int16_t Temp, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 131 if (memcmp (&pastenvTemperature[2], &Temp, 2) != 0) {
mapellil 8:b042fe719f51 132 return sendEnvTemperature (Temp, TimeStamp);
mapellil 0:e93a11b4e044 133 }
mapellil 8:b042fe719f51 134 return 0;
mapellil 0:e93a11b4e044 135 }
mapellil 0:e93a11b4e044 136
mapellil 8:b042fe719f51 137 uint32_t sendEnvHumidity(uint16_t Hum, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 138 STORE_LE_16(envHumidity,TimeStamp);
mapellil 8:b042fe719f51 139 STORE_LE_16(envHumidity+2,Hum);
mapellil 8:b042fe719f51 140 memcpy (pastenvHumidity, envHumidity, HUM_DATA_LEN);
mapellil 8:b042fe719f51 141 return ble.gattServer().write(envHumidityCharacteristic.getValueAttribute().getHandle(), envHumidity, HUM_DATA_LEN, 0);
mapellil 8:b042fe719f51 142 }
mapellil 0:e93a11b4e044 143
mapellil 8:b042fe719f51 144 uint32_t updateEnvHumidity(uint16_t Hum, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 145 if (memcmp (&pastenvHumidity[2], &Hum, 2) != 0) {
mapellil 8:b042fe719f51 146 return sendEnvHumidity(Hum, TimeStamp);
mapellil 0:e93a11b4e044 147 }
mapellil 8:b042fe719f51 148 return 0;
mapellil 0:e93a11b4e044 149 }
mapellil 0:e93a11b4e044 150
mapellil 8:b042fe719f51 151 uint32_t sendEnvPressure(uint32_t Press, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 152 STORE_LE_16(envPressure,TimeStamp);
mapellil 8:b042fe719f51 153 STORE_LE_32(envPressure+2,Press);
mapellil 8:b042fe719f51 154 memcpy (pastenvPressure, envPressure, PRES_DATA_LEN);
mapellil 8:b042fe719f51 155 return ble.gattServer().write(envPressureCharacteristic.getValueAttribute().getHandle(), envPressure, PRES_DATA_LEN, 0);
mapellil 8:b042fe719f51 156 }
mapellil 0:e93a11b4e044 157
mapellil 8:b042fe719f51 158 uint32_t updateEnvPressure(uint32_t Press, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 159 if (memcmp (&pastenvPressure[2], &Press, 2) != 0) {
mapellil 8:b042fe719f51 160 return sendEnvPressure(Press, TimeStamp);
mapellil 8:b042fe719f51 161 }
mapellil 8:b042fe719f51 162 return 0;
mapellil 0:e93a11b4e044 163 }
mapellil 0:e93a11b4e044 164
mapellil 8:b042fe719f51 165 uint32_t sendEnvMagnetometer(AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 8:b042fe719f51 166 STORE_LE_16(envMagn,TimeStamp);
mapellil 8:b042fe719f51 167 STORE_LE_16(envMagn+2,(Magn->AXIS_X - magOffset.magOffX));
mapellil 8:b042fe719f51 168 STORE_LE_16(envMagn+4,(Magn->AXIS_Y - magOffset.magOffY));
mapellil 8:b042fe719f51 169 STORE_LE_16(envMagn+6,(Magn->AXIS_Z - magOffset.magOffZ));
mapellil 8:b042fe719f51 170 return ble.gattServer().write(envMagnetometerCharacteristic.getValueAttribute().getHandle(), envMagn, MAG_DATA_LEN, 0);
mapellil 0:e93a11b4e044 171 }
mapellil 0:e93a11b4e044 172
mapellil 8:b042fe719f51 173 uint32_t updateEnvMagnetometer(AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 8:b042fe719f51 174 if (isMagNotificationEn()) return sendEnvMagnetometer(Magn, TimeStamp, magOffset);
mapellil 8:b042fe719f51 175 return 0;
mapellil 0:e93a11b4e044 176 }
mapellil 0:e93a11b4e044 177
mapellil 8:b042fe719f51 178 uint32_t sendEnvAccelerometer (AxesRaw_TypeDef *Acc, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 179 STORE_LE_16(envAcce,TimeStamp);
mapellil 8:b042fe719f51 180 STORE_LE_16(envAcce+2,Acc->AXIS_X);
mapellil 8:b042fe719f51 181 STORE_LE_16(envAcce+4,Acc->AXIS_Y);
mapellil 8:b042fe719f51 182 STORE_LE_16(envAcce+6,Acc->AXIS_Z);
mapellil 8:b042fe719f51 183 return ble.gattServer().write(envAccelerometerCharacteristic.getValueAttribute().getHandle(), envAcce, ACC_DATA_LEN, 0);
mapellil 0:e93a11b4e044 184 }
mapellil 0:e93a11b4e044 185
mapellil 8:b042fe719f51 186 uint32_t updateEnvAccelerometer (AxesRaw_TypeDef *Acc, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 187 if (isAccNotificationEn()) return sendEnvAccelerometer (Acc, TimeStamp);
mapellil 8:b042fe719f51 188 return 0;
mapellil 0:e93a11b4e044 189 }
mapellil 0:e93a11b4e044 190
mapellil 8:b042fe719f51 191 uint32_t sendEnvGyroscope (AxesRaw_TypeDef *Gyro, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 192 STORE_LE_16(envGyro,TimeStamp);
mapellil 8:b042fe719f51 193 STORE_LE_16(envGyro+2,Gyro->AXIS_X);
mapellil 8:b042fe719f51 194 STORE_LE_16(envGyro+4,Gyro->AXIS_Y);
mapellil 8:b042fe719f51 195 STORE_LE_16(envGyro+6,Gyro->AXIS_Z);
mapellil 8:b042fe719f51 196 return ble.gattServer().write(envGyroCharacteristic.getValueAttribute().getHandle(), envGyro, GYRO_DATA_LEN, 0);
mapellil 0:e93a11b4e044 197 }
mapellil 0:e93a11b4e044 198
mapellil 8:b042fe719f51 199 uint32_t updateEnvGyroscope (AxesRaw_TypeDef *Gyro, uint16_t TimeStamp) {
mapellil 8:b042fe719f51 200 if (isGyroNotificationEn()) return sendEnvGyroscope (Gyro, TimeStamp);
mapellil 8:b042fe719f51 201 return 0;
mapellil 0:e93a11b4e044 202 }
mapellil 0:e93a11b4e044 203
mapellil 8:b042fe719f51 204 uint32_t sendEnvAccGyroMag (AxesRaw_TypeDef *Acc, AxesRaw_TypeDef *Gyro, AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 8:b042fe719f51 205 STORE_LE_16(envAccGyroMag,TimeStamp);
mapellil 8:b042fe719f51 206 STORE_LE_16(envAccGyroMag+2,Acc->AXIS_X);
mapellil 8:b042fe719f51 207 STORE_LE_16(envAccGyroMag+4,Acc->AXIS_Y);
mapellil 8:b042fe719f51 208 STORE_LE_16(envAccGyroMag+6,Acc->AXIS_Z);
mapellil 0:e93a11b4e044 209
mapellil 8:b042fe719f51 210 STORE_LE_16(envAccGyroMag+8,Gyro->AXIS_X);
mapellil 8:b042fe719f51 211 STORE_LE_16(envAccGyroMag+10,Gyro->AXIS_Y);
mapellil 8:b042fe719f51 212 STORE_LE_16(envAccGyroMag+12,Gyro->AXIS_Z);
mapellil 0:e93a11b4e044 213
mapellil 8:b042fe719f51 214 STORE_LE_16(envAccGyroMag+14,(Magn->AXIS_X - magOffset.magOffX));
mapellil 8:b042fe719f51 215 STORE_LE_16(envAccGyroMag+16,(Magn->AXIS_Y - magOffset.magOffY));
mapellil 8:b042fe719f51 216 STORE_LE_16(envAccGyroMag+18,(Magn->AXIS_Z - magOffset.magOffZ));
mapellil 8:b042fe719f51 217 return ble.gattServer().write(envAccGyroMagCharacteristic.getValueAttribute().getHandle(), envAccGyroMag, ACCGYROMAG_DATA_LEN, 0);
mapellil 0:e93a11b4e044 218 }
mapellil 0:e93a11b4e044 219
mapellil 8:b042fe719f51 220 uint32_t updateEnvAccGyroMag (AxesRaw_TypeDef *Acc, AxesRaw_TypeDef *Gyro, AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 8:b042fe719f51 221 if (isAccGyroMagNotificationEn()) return sendEnvAccGyroMag (Acc, Gyro, Magn, TimeStamp, magOffset);
mapellil 8:b042fe719f51 222 return 0;
mapellil 0:e93a11b4e044 223 }
mapellil 0:e93a11b4e044 224
mapellil 0:e93a11b4e044 225 void enNotify (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 226 if (isTempHandle(handle)) { isEnabledTempNotify = true; memset(pastenvTemperature,0,TEMP_DATA_LEN); return; }
mapellil 0:e93a11b4e044 227 if (isHumHandle(handle)) { isEnabledHumNotify = true; memset(pastenvHumidity,0,HUM_DATA_LEN); return; }
mapellil 0:e93a11b4e044 228 if (isPresHandle(handle)) { isEnabledPresNotify = true; memset(pastenvPressure,0,PRES_DATA_LEN); return; }
mapellil 0:e93a11b4e044 229 if (isGyroHandle(handle)) { isEnabledGyroNotify = true; return; }
mapellil 0:e93a11b4e044 230 if (isAccHandle(handle)) { isEnabledAccNotify = true; return; }
mapellil 0:e93a11b4e044 231 if (isMagHandle(handle)) { isEnabledMagNotify = true; return; }
mapellil 0:e93a11b4e044 232 if (isAccGyroMagHandle(handle)) { isEnabledAccGyroMagNotify = true; return; }
mapellil 0:e93a11b4e044 233 }
mapellil 0:e93a11b4e044 234
mapellil 0:e93a11b4e044 235 void disNotify (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 236 if (isTempHandle(handle)) { isEnabledTempNotify = false; memset(pastenvTemperature,0,TEMP_DATA_LEN); return; }
mapellil 0:e93a11b4e044 237 if (isHumHandle(handle)) { isEnabledHumNotify = false; memset(pastenvHumidity,0,HUM_DATA_LEN); return; }
mapellil 0:e93a11b4e044 238 if (isPresHandle(handle)) { isEnabledPresNotify = false; memset(pastenvPressure,0,PRES_DATA_LEN); return; }
mapellil 0:e93a11b4e044 239 if (isGyroHandle(handle)) { isEnabledGyroNotify = false; return; }
mapellil 0:e93a11b4e044 240 if (isAccHandle(handle)) { isEnabledAccNotify = false; return; }
mapellil 0:e93a11b4e044 241 if (isMagHandle(handle)) { isEnabledMagNotify = false; return; }
mapellil 0:e93a11b4e044 242 if (isAccGyroMagHandle(handle)) { isEnabledAccGyroMagNotify = false; return; }
mapellil 0:e93a11b4e044 243 }
mapellil 0:e93a11b4e044 244
mapellil 0:e93a11b4e044 245 bool isTempNotificationEn (void) {
mapellil 0:e93a11b4e044 246 return isEnabledTempNotify;
mapellil 0:e93a11b4e044 247 }
mapellil 0:e93a11b4e044 248
mapellil 0:e93a11b4e044 249 bool isHumNotificationEn (void) {
mapellil 0:e93a11b4e044 250 return isEnabledHumNotify;
mapellil 0:e93a11b4e044 251 }
mapellil 0:e93a11b4e044 252
mapellil 0:e93a11b4e044 253 bool isPresNotificationEn (void) {
mapellil 0:e93a11b4e044 254 return isEnabledPresNotify;
mapellil 0:e93a11b4e044 255 }
mapellil 0:e93a11b4e044 256
mapellil 0:e93a11b4e044 257 bool isGyroNotificationEn (void) {
mapellil 0:e93a11b4e044 258 return isEnabledGyroNotify;
mapellil 0:e93a11b4e044 259 }
mapellil 0:e93a11b4e044 260
mapellil 0:e93a11b4e044 261 bool isAccNotificationEn (void) {
mapellil 0:e93a11b4e044 262 return isEnabledAccNotify;
mapellil 0:e93a11b4e044 263 }
mapellil 0:e93a11b4e044 264
mapellil 0:e93a11b4e044 265 bool isMagNotificationEn (void) {
mapellil 0:e93a11b4e044 266 return isEnabledMagNotify;
mapellil 0:e93a11b4e044 267 }
mapellil 0:e93a11b4e044 268
mapellil 0:e93a11b4e044 269 bool isAccGyroMagNotificationEn (void) {
mapellil 0:e93a11b4e044 270 return isEnabledAccGyroMagNotify;
mapellil 0:e93a11b4e044 271 }
mapellil 0:e93a11b4e044 272
mapellil 0:e93a11b4e044 273 bool isTempHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 274 if (handle == envTemperatureCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 275 return false;
mapellil 0:e93a11b4e044 276 }
mapellil 0:e93a11b4e044 277
mapellil 0:e93a11b4e044 278 bool isHumHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 279 if (handle == envHumidityCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 280 return false;
mapellil 0:e93a11b4e044 281 }
mapellil 0:e93a11b4e044 282
mapellil 0:e93a11b4e044 283 bool isPresHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 284 if (handle == envPressureCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 285 return false;
mapellil 0:e93a11b4e044 286 }
mapellil 0:e93a11b4e044 287
mapellil 0:e93a11b4e044 288 bool isMagHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 289 if (handle == envMagnetometerCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 290 return false;
mapellil 0:e93a11b4e044 291 }
mapellil 0:e93a11b4e044 292 bool isAccHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 293 if (handle == envAccelerometerCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 294 return false;
mapellil 0:e93a11b4e044 295 }
mapellil 0:e93a11b4e044 296 bool isGyroHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 297 if (handle == envGyroCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 298 return false;
mapellil 0:e93a11b4e044 299 }
mapellil 0:e93a11b4e044 300 bool isAccGyroMagHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 301 if (handle == envAccGyroMagCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 302 return false;
mapellil 0:e93a11b4e044 303 }
mapellil 0:e93a11b4e044 304
mapellil 0:e93a11b4e044 305 void updateConnectionStatus(ConnectionStatus_t status) {
mapellil 0:e93a11b4e044 306 isEnabledTempNotify = false;
mapellil 0:e93a11b4e044 307 isEnabledHumNotify = false;
mapellil 0:e93a11b4e044 308 isEnabledPresNotify = false;
mapellil 0:e93a11b4e044 309 isEnabledGyroNotify = false;
mapellil 0:e93a11b4e044 310 isEnabledAccNotify = false;
mapellil 0:e93a11b4e044 311 isEnabledMagNotify = false;
mapellil 0:e93a11b4e044 312 isEnabledAccGyroMagNotify = false;
mapellil 0:e93a11b4e044 313
mapellil 0:e93a11b4e044 314 isTempCalibrated = false;
mapellil 0:e93a11b4e044 315 isHumCalibrated = false;
mapellil 0:e93a11b4e044 316 isPresCalibrated = false;
mapellil 0:e93a11b4e044 317 isMagCalibrated = false;
mapellil 0:e93a11b4e044 318 isAccCalibrated = false;
mapellil 0:e93a11b4e044 319 isAGyroCalibrated = false;
mapellil 0:e93a11b4e044 320
mapellil 0:e93a11b4e044 321 memset (pastenvTemperature, 0, TEMP_DATA_LEN);
mapellil 0:e93a11b4e044 322 memset (pastenvHumidity, 0, HUM_DATA_LEN);
mapellil 0:e93a11b4e044 323 memset (pastenvPressure, 0, PRES_DATA_LEN);
mapellil 0:e93a11b4e044 324 isBTLEConnected = status;
mapellil 0:e93a11b4e044 325 }
mapellil 0:e93a11b4e044 326
mapellil 0:e93a11b4e044 327
mapellil 0:e93a11b4e044 328 private:
mapellil 9:2693f9ef8ff7 329 BLE &ble;
mapellil 0:e93a11b4e044 330 uint8_t envTemperature [TEMP_DATA_LEN]; /* in C */
mapellil 0:e93a11b4e044 331 uint8_t pastenvTemperature [TEMP_DATA_LEN];
mapellil 0:e93a11b4e044 332 uint8_t envHumidity [HUM_DATA_LEN]; /* in % */
mapellil 0:e93a11b4e044 333 uint8_t pastenvHumidity [HUM_DATA_LEN];
mapellil 0:e93a11b4e044 334 uint8_t envPressure [PRES_DATA_LEN]; /* in mBar */
mapellil 0:e93a11b4e044 335 uint8_t pastenvPressure [PRES_DATA_LEN];
mapellil 0:e93a11b4e044 336 uint8_t envMagn [MAG_DATA_LEN];
mapellil 0:e93a11b4e044 337 uint8_t envGyro [GYRO_DATA_LEN];
mapellil 0:e93a11b4e044 338 uint8_t envAcce [ACC_DATA_LEN];
mapellil 0:e93a11b4e044 339 uint8_t envAccGyroMag [ACCGYROMAG_DATA_LEN];
mapellil 0:e93a11b4e044 340
mapellil 0:e93a11b4e044 341 GattCharacteristic envTemperatureCharacteristic;
mapellil 0:e93a11b4e044 342 GattCharacteristic envHumidityCharacteristic;
mapellil 0:e93a11b4e044 343 GattCharacteristic envPressureCharacteristic;
mapellil 0:e93a11b4e044 344
mapellil 0:e93a11b4e044 345 GattCharacteristic envMagnetometerCharacteristic;
mapellil 0:e93a11b4e044 346 GattCharacteristic envAccelerometerCharacteristic;
mapellil 0:e93a11b4e044 347 GattCharacteristic envGyroCharacteristic;
mapellil 0:e93a11b4e044 348 GattCharacteristic envAccGyroMagCharacteristic;
mapellil 0:e93a11b4e044 349
mapellil 0:e93a11b4e044 350 ConnectionStatus_t isBTLEConnected;
mapellil 0:e93a11b4e044 351
mapellil 0:e93a11b4e044 352 bool isEnabledTempNotify;
mapellil 0:e93a11b4e044 353 bool isEnabledHumNotify;
mapellil 0:e93a11b4e044 354 bool isEnabledPresNotify;
mapellil 0:e93a11b4e044 355 bool isEnabledGyroNotify;
mapellil 0:e93a11b4e044 356 bool isEnabledAccNotify;
mapellil 0:e93a11b4e044 357 bool isEnabledMagNotify;
mapellil 0:e93a11b4e044 358 bool isEnabledAccGyroMagNotify;
mapellil 0:e93a11b4e044 359
mapellil 0:e93a11b4e044 360 bool isTempCalibrated;
mapellil 0:e93a11b4e044 361 bool isHumCalibrated;
mapellil 0:e93a11b4e044 362 bool isPresCalibrated;
mapellil 0:e93a11b4e044 363 bool isMagCalibrated;
mapellil 0:e93a11b4e044 364 bool isAccCalibrated;
mapellil 0:e93a11b4e044 365 bool isAGyroCalibrated;
mapellil 0:e93a11b4e044 366
mapellil 0:e93a11b4e044 367 };
mapellil 0:e93a11b4e044 368
mapellil 0:e93a11b4e044 369 #endif /* #ifndef __CUSTOM_BLE_SENSORS_SERVICE_H__*/