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:
Fri Nov 20 09:55:58 2015 +0000
Revision:
4:007539036889
Parent:
0:e93a11b4e044
Child:
6:c1b8fb74072e
Updated BLE API, IDB and MBED libs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mapellil 0:e93a11b4e044 1 /* mbed Microcontroller Library
mapellil 0:e93a11b4e044 2 * Copyright (c) 2006-2013 ARM Limited
mapellil 0:e93a11b4e044 3 *
mapellil 0:e93a11b4e044 4 * Licensed under the Apache License, Version 2.0 (the "License");
mapellil 0:e93a11b4e044 5 * you may not use this file except in compliance with the License.
mapellil 0:e93a11b4e044 6 * You may obtain a copy of the License at
mapellil 0:e93a11b4e044 7 *
mapellil 0:e93a11b4e044 8 * http://www.apache.org/licenses/LICENSE-2.0
mapellil 0:e93a11b4e044 9 *
mapellil 0:e93a11b4e044 10 * Unless required by applicable law or agreed to in writing, software
mapellil 0:e93a11b4e044 11 * distributed under the License is distributed on an "AS IS" BASIS,
mapellil 0:e93a11b4e044 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mapellil 0:e93a11b4e044 13 * See the License for the specific language governing permissions and
mapellil 0:e93a11b4e044 14 * limitations under the License.
mapellil 0:e93a11b4e044 15 */
mapellil 0:e93a11b4e044 16
mapellil 0:e93a11b4e044 17 #ifndef __CUSTOM_BLE_SENSORS_SERVICE_H__
mapellil 0:e93a11b4e044 18 #define __CUSTOM_BLE_SENSORS_SERVICE_H__
mapellil 0:e93a11b4e044 19
mapellil 0:e93a11b4e044 20 #include "BLE.h"
mapellil 0:e93a11b4e044 21
mapellil 0:e93a11b4e044 22 const LongUUIDBytes_t SENS_SERVICE_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0xb4,0x9a,0xe1,0x11,0x01,0x00,0x00,0x00,0x00,0x00}; // temp, pressure, humidity,
mapellil 0:e93a11b4e044 23
mapellil 0:e93a11b4e044 24 const LongUUIDBytes_t SENS_TEMP_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x04,0x00 };
mapellil 0:e93a11b4e044 25 const LongUUIDBytes_t SENS_HUMI_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x08,0x00};
mapellil 0:e93a11b4e044 26 const LongUUIDBytes_t SENS_PRES_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x10,0x00};
mapellil 0:e93a11b4e044 27 const LongUUIDBytes_t SENS_MAGN_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x20,0x00};
mapellil 0:e93a11b4e044 28 const LongUUIDBytes_t SENS_GYRO_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x40,0x00};
mapellil 0:e93a11b4e044 29 const LongUUIDBytes_t SENS_ACCE_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x80,0x00};
mapellil 0:e93a11b4e044 30 const LongUUIDBytes_t SENS_ACC_GYRO_MAG_CHAR_UUID_128 = { 0x1b,0xc5,0xa5,0xd5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0xE0,0x00};
mapellil 0:e93a11b4e044 31
mapellil 0:e93a11b4e044 32
mapellil 0:e93a11b4e044 33 #define TEMP_DATA_LEN 2+2
mapellil 0:e93a11b4e044 34 #define HUM_DATA_LEN 2+2
mapellil 0:e93a11b4e044 35 #define PRES_DATA_LEN 2+4
mapellil 0:e93a11b4e044 36 #define ACC_DATA_LEN 6+2
mapellil 0:e93a11b4e044 37 #define MAG_DATA_LEN 6+2
mapellil 0:e93a11b4e044 38 #define GYRO_DATA_LEN 6+2
mapellil 0:e93a11b4e044 39 #define ACCGYROMAG_DATA_LEN 2+3*3*2
mapellil 0:e93a11b4e044 40
mapellil 0:e93a11b4e044 41
mapellil 0:e93a11b4e044 42 /* Custom Sensors Service */
mapellil 0:e93a11b4e044 43 class CustomSensorService {
mapellil 0:e93a11b4e044 44 public:
mapellil 0:e93a11b4e044 45 CustomSensorService(BLEDevice &_ble) :
mapellil 0:e93a11b4e044 46 ble(_ble),
mapellil 0:e93a11b4e044 47 envTemperatureCharacteristic(SENS_TEMP_CHAR_UUID_128,envTemperature, TEMP_DATA_LEN, TEMP_DATA_LEN,
mapellil 0:e93a11b4e044 48 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 49 envHumidityCharacteristic(SENS_HUMI_CHAR_UUID_128, envHumidity, HUM_DATA_LEN, HUM_DATA_LEN,
mapellil 0:e93a11b4e044 50 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 51 envPressureCharacteristic(SENS_PRES_CHAR_UUID_128, envPressure, PRES_DATA_LEN, PRES_DATA_LEN,
mapellil 0:e93a11b4e044 52 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 53 envMagnetometerCharacteristic(SENS_MAGN_CHAR_UUID_128,envMagn, MAG_DATA_LEN, MAG_DATA_LEN,
mapellil 0:e93a11b4e044 54 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 55 envAccelerometerCharacteristic(SENS_ACCE_CHAR_UUID_128,envAcce, ACC_DATA_LEN, ACC_DATA_LEN,
mapellil 0:e93a11b4e044 56 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 57 envGyroCharacteristic(SENS_GYRO_CHAR_UUID_128,envGyro, GYRO_DATA_LEN, GYRO_DATA_LEN,
mapellil 0:e93a11b4e044 58 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
mapellil 0:e93a11b4e044 59 envAccGyroMagCharacteristic(SENS_ACC_GYRO_MAG_CHAR_UUID_128,envAccGyroMag, ACCGYROMAG_DATA_LEN, ACCGYROMAG_DATA_LEN,
mapellil 0:e93a11b4e044 60 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY)
mapellil 0:e93a11b4e044 61 {
mapellil 0:e93a11b4e044 62
mapellil 0:e93a11b4e044 63 static bool serviceAdded = false; /* We should only ever need to add the env service once. */
mapellil 0:e93a11b4e044 64 if (serviceAdded) {
mapellil 0:e93a11b4e044 65 return;
mapellil 0:e93a11b4e044 66 }
mapellil 0:e93a11b4e044 67
mapellil 0:e93a11b4e044 68 GattCharacteristic *charTable[] = {&envTemperatureCharacteristic, &envHumidityCharacteristic, &envPressureCharacteristic, &envMagnetometerCharacteristic,
mapellil 0:e93a11b4e044 69 &envAccelerometerCharacteristic, &envGyroCharacteristic, &envAccGyroMagCharacteristic};
mapellil 0:e93a11b4e044 70
mapellil 0:e93a11b4e044 71 GattService envService(SENS_SERVICE_UUID_128, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
mapellil 0:e93a11b4e044 72
mapellil 0:e93a11b4e044 73 ble.gattServer().addService(envService);
mapellil 0:e93a11b4e044 74
mapellil 0:e93a11b4e044 75 isEnabledTempNotify = false;
mapellil 0:e93a11b4e044 76 isEnabledHumNotify = false;
mapellil 0:e93a11b4e044 77 isEnabledPresNotify = false;
mapellil 0:e93a11b4e044 78 isEnabledGyroNotify = false;
mapellil 0:e93a11b4e044 79 isEnabledAccNotify = false;
mapellil 0:e93a11b4e044 80 isEnabledMagNotify = false;
mapellil 0:e93a11b4e044 81 isEnabledAccGyroMagNotify = false;
mapellil 0:e93a11b4e044 82
mapellil 0:e93a11b4e044 83 isTempCalibrated = false;
mapellil 0:e93a11b4e044 84 isHumCalibrated = false;
mapellil 0:e93a11b4e044 85 isPresCalibrated = false;
mapellil 0:e93a11b4e044 86 isMagCalibrated = false;
mapellil 0:e93a11b4e044 87 isAccCalibrated = false;
mapellil 0:e93a11b4e044 88 isAGyroCalibrated = false;
mapellil 0:e93a11b4e044 89
mapellil 0:e93a11b4e044 90 memset (pastenvTemperature, 0, TEMP_DATA_LEN);
mapellil 0:e93a11b4e044 91 memset (pastenvHumidity, 0, HUM_DATA_LEN);
mapellil 0:e93a11b4e044 92 memset (pastenvPressure, 0, PRES_DATA_LEN);
mapellil 0:e93a11b4e044 93
mapellil 0:e93a11b4e044 94 isBTLEConnected = DISCONNECTED;
mapellil 0:e93a11b4e044 95 serviceAdded = true;
mapellil 0:e93a11b4e044 96 }
mapellil 0:e93a11b4e044 97
mapellil 0:e93a11b4e044 98 void sendEnvTemperature (int16_t Temp, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 99 STORE_LE_16(envTemperature,TimeStamp);
mapellil 0:e93a11b4e044 100 STORE_LE_16(envTemperature+2,Temp);
mapellil 4:007539036889 101 PRINTF("sendEnvTemperature!! handle: %d\n\r", envTemperatureCharacteristic.getValueAttribute().getHandle());
mapellil 0:e93a11b4e044 102 memcpy (pastenvTemperature, envTemperature, TEMP_DATA_LEN);
mapellil 0:e93a11b4e044 103 ble.gattServer().write(envTemperatureCharacteristic.getValueAttribute().getHandle(), envTemperature, TEMP_DATA_LEN, 0);
mapellil 0:e93a11b4e044 104 }
mapellil 0:e93a11b4e044 105
mapellil 0:e93a11b4e044 106 /**
mapellil 0:e93a11b4e044 107 * Update the temperature with a new value. Valid values range from
mapellil 0:e93a11b4e044 108 * 0..100. Anything outside this range will be ignored.
mapellil 0:e93a11b4e044 109 * @param newLevel New level. */
mapellil 0:e93a11b4e044 110 void updateEnvTemperature (int16_t Temp, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 111 if (memcmp (&pastenvTemperature[2], &Temp, 2) != 0) {
mapellil 0:e93a11b4e044 112 sendEnvTemperature (Temp, TimeStamp);
mapellil 0:e93a11b4e044 113 }
mapellil 0:e93a11b4e044 114 }
mapellil 0:e93a11b4e044 115
mapellil 0:e93a11b4e044 116 void sendEnvHumidity(uint16_t Hum, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 117 STORE_LE_16(envHumidity,TimeStamp);
mapellil 0:e93a11b4e044 118 STORE_LE_16(envHumidity+2,Hum);
mapellil 0:e93a11b4e044 119 memcpy (pastenvHumidity, envHumidity, HUM_DATA_LEN);
mapellil 0:e93a11b4e044 120 ble.gattServer().write(envHumidityCharacteristic.getValueAttribute().getHandle(), envHumidity, HUM_DATA_LEN, 0);
mapellil 0:e93a11b4e044 121
mapellil 0:e93a11b4e044 122 }
mapellil 0:e93a11b4e044 123
mapellil 0:e93a11b4e044 124 void updateEnvHumidity(uint16_t Hum, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 125 if (memcmp (&pastenvHumidity[2], &Hum, 2) != 0) {
mapellil 0:e93a11b4e044 126 sendEnvHumidity(Hum, TimeStamp);
mapellil 0:e93a11b4e044 127 }
mapellil 0:e93a11b4e044 128 }
mapellil 0:e93a11b4e044 129
mapellil 0:e93a11b4e044 130 void sendEnvPressure(uint32_t Press, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 131 STORE_LE_16(envPressure,TimeStamp);
mapellil 0:e93a11b4e044 132 STORE_LE_32(envPressure+2,Press);
mapellil 0:e93a11b4e044 133 memcpy (pastenvPressure, envPressure, PRES_DATA_LEN);
mapellil 0:e93a11b4e044 134 ble.gattServer().write(envPressureCharacteristic.getValueAttribute().getHandle(), envPressure, PRES_DATA_LEN, 0);
mapellil 0:e93a11b4e044 135 }
mapellil 0:e93a11b4e044 136
mapellil 0:e93a11b4e044 137 void updateEnvPressure(uint32_t Press, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 138 if (memcmp (&pastenvPressure[2], &Press, 2) != 0) {
mapellil 0:e93a11b4e044 139 sendEnvPressure(Press, TimeStamp);
mapellil 0:e93a11b4e044 140 }
mapellil 0:e93a11b4e044 141 }
mapellil 0:e93a11b4e044 142
mapellil 0:e93a11b4e044 143 void sendEnvMagnetometer(AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 0:e93a11b4e044 144 STORE_LE_16(envMagn,TimeStamp);
mapellil 0:e93a11b4e044 145 STORE_LE_16(envMagn+2,(Magn->AXIS_X - magOffset.magOffX));
mapellil 0:e93a11b4e044 146 STORE_LE_16(envMagn+4,(Magn->AXIS_Y - magOffset.magOffY));
mapellil 0:e93a11b4e044 147 STORE_LE_16(envMagn+6,(Magn->AXIS_Z - magOffset.magOffZ));
mapellil 0:e93a11b4e044 148 ble.gattServer().write(envMagnetometerCharacteristic.getValueAttribute().getHandle(), envMagn, MAG_DATA_LEN, 0);
mapellil 0:e93a11b4e044 149 }
mapellil 0:e93a11b4e044 150
mapellil 0:e93a11b4e044 151 void updateEnvMagnetometer(AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 0:e93a11b4e044 152 if (isMagNotificationEn()) sendEnvMagnetometer(Magn, TimeStamp, magOffset);
mapellil 0:e93a11b4e044 153 }
mapellil 0:e93a11b4e044 154
mapellil 0:e93a11b4e044 155 void sendEnvAccelerometer (AxesRaw_TypeDef *Acc, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 156 STORE_LE_16(envAcce,TimeStamp);
mapellil 0:e93a11b4e044 157 STORE_LE_16(envAcce+2,Acc->AXIS_X);
mapellil 0:e93a11b4e044 158 STORE_LE_16(envAcce+4,Acc->AXIS_Y);
mapellil 0:e93a11b4e044 159 STORE_LE_16(envAcce+6,Acc->AXIS_Z);
mapellil 0:e93a11b4e044 160 ble.gattServer().write(envAccelerometerCharacteristic.getValueAttribute().getHandle(), envAcce, ACC_DATA_LEN, 0);
mapellil 0:e93a11b4e044 161 }
mapellil 0:e93a11b4e044 162
mapellil 0:e93a11b4e044 163 void updateEnvAccelerometer (AxesRaw_TypeDef *Acc, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 164 if (isAccNotificationEn()) sendEnvAccelerometer (Acc, TimeStamp);
mapellil 0:e93a11b4e044 165 }
mapellil 0:e93a11b4e044 166
mapellil 0:e93a11b4e044 167 void sendEnvGyroscope (AxesRaw_TypeDef *Gyro, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 168 STORE_LE_16(envGyro,TimeStamp);
mapellil 0:e93a11b4e044 169 STORE_LE_16(envGyro+2,Gyro->AXIS_X);
mapellil 0:e93a11b4e044 170 STORE_LE_16(envGyro+4,Gyro->AXIS_Y);
mapellil 0:e93a11b4e044 171 STORE_LE_16(envGyro+6,Gyro->AXIS_Z);
mapellil 0:e93a11b4e044 172 ble.gattServer().write(envGyroCharacteristic.getValueAttribute().getHandle(), envGyro, GYRO_DATA_LEN, 0);
mapellil 0:e93a11b4e044 173 }
mapellil 0:e93a11b4e044 174
mapellil 0:e93a11b4e044 175 void updateEnvGyroscope (AxesRaw_TypeDef *Gyro, uint16_t TimeStamp) {
mapellil 0:e93a11b4e044 176 if (isGyroNotificationEn()) sendEnvGyroscope (Gyro, TimeStamp);
mapellil 0:e93a11b4e044 177 }
mapellil 0:e93a11b4e044 178
mapellil 0:e93a11b4e044 179 void sendEnvAccGyroMag (AxesRaw_TypeDef *Acc, AxesRaw_TypeDef *Gyro, AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 0:e93a11b4e044 180 STORE_LE_16(envAccGyroMag,TimeStamp);
mapellil 0:e93a11b4e044 181 STORE_LE_16(envAccGyroMag+2,Acc->AXIS_X);
mapellil 0:e93a11b4e044 182 STORE_LE_16(envAccGyroMag+4,Acc->AXIS_Y);
mapellil 0:e93a11b4e044 183 STORE_LE_16(envAccGyroMag+6,Acc->AXIS_Z);
mapellil 0:e93a11b4e044 184
mapellil 0:e93a11b4e044 185 STORE_LE_16(envAccGyroMag+8,Gyro->AXIS_X);
mapellil 0:e93a11b4e044 186 STORE_LE_16(envAccGyroMag+10,Gyro->AXIS_Y);
mapellil 0:e93a11b4e044 187 STORE_LE_16(envAccGyroMag+12,Gyro->AXIS_Z);
mapellil 0:e93a11b4e044 188
mapellil 0:e93a11b4e044 189 STORE_LE_16(envAccGyroMag+14,(Magn->AXIS_X - magOffset.magOffX));
mapellil 0:e93a11b4e044 190 STORE_LE_16(envAccGyroMag+16,(Magn->AXIS_Y - magOffset.magOffY));
mapellil 0:e93a11b4e044 191 STORE_LE_16(envAccGyroMag+18,(Magn->AXIS_Z - magOffset.magOffZ));
mapellil 0:e93a11b4e044 192 ble.gattServer().write(envAccGyroMagCharacteristic.getValueAttribute().getHandle(), envAccGyroMag, ACCGYROMAG_DATA_LEN, 0);
mapellil 0:e93a11b4e044 193 }
mapellil 0:e93a11b4e044 194
mapellil 0:e93a11b4e044 195 void updateEnvAccGyroMag (AxesRaw_TypeDef *Acc, AxesRaw_TypeDef *Gyro, AxesRaw_TypeDef *Magn, uint16_t TimeStamp, osxMFX_calibFactor magOffset) {
mapellil 0:e93a11b4e044 196 if (isAccGyroMagNotificationEn())sendEnvAccGyroMag (Acc, Gyro, Magn, TimeStamp, magOffset);
mapellil 0:e93a11b4e044 197 }
mapellil 0:e93a11b4e044 198
mapellil 0:e93a11b4e044 199 void enNotify (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 200 if (isTempHandle(handle)) { isEnabledTempNotify = true; memset(pastenvTemperature,0,TEMP_DATA_LEN); return; }
mapellil 0:e93a11b4e044 201 if (isHumHandle(handle)) { isEnabledHumNotify = true; memset(pastenvHumidity,0,HUM_DATA_LEN); return; }
mapellil 0:e93a11b4e044 202 if (isPresHandle(handle)) { isEnabledPresNotify = true; memset(pastenvPressure,0,PRES_DATA_LEN); return; }
mapellil 0:e93a11b4e044 203 if (isGyroHandle(handle)) { isEnabledGyroNotify = true; return; }
mapellil 0:e93a11b4e044 204 if (isAccHandle(handle)) { isEnabledAccNotify = true; return; }
mapellil 0:e93a11b4e044 205 if (isMagHandle(handle)) { isEnabledMagNotify = true; return; }
mapellil 0:e93a11b4e044 206 if (isAccGyroMagHandle(handle)) { isEnabledAccGyroMagNotify = true; return; }
mapellil 0:e93a11b4e044 207 }
mapellil 0:e93a11b4e044 208
mapellil 0:e93a11b4e044 209 void disNotify (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 210 if (isTempHandle(handle)) { isEnabledTempNotify = false; memset(pastenvTemperature,0,TEMP_DATA_LEN); return; }
mapellil 0:e93a11b4e044 211 if (isHumHandle(handle)) { isEnabledHumNotify = false; memset(pastenvHumidity,0,HUM_DATA_LEN); return; }
mapellil 0:e93a11b4e044 212 if (isPresHandle(handle)) { isEnabledPresNotify = false; memset(pastenvPressure,0,PRES_DATA_LEN); return; }
mapellil 0:e93a11b4e044 213 if (isGyroHandle(handle)) { isEnabledGyroNotify = false; return; }
mapellil 0:e93a11b4e044 214 if (isAccHandle(handle)) { isEnabledAccNotify = false; return; }
mapellil 0:e93a11b4e044 215 if (isMagHandle(handle)) { isEnabledMagNotify = false; return; }
mapellil 0:e93a11b4e044 216 if (isAccGyroMagHandle(handle)) { isEnabledAccGyroMagNotify = false; return; }
mapellil 0:e93a11b4e044 217 }
mapellil 0:e93a11b4e044 218
mapellil 0:e93a11b4e044 219 bool isTempNotificationEn (void) {
mapellil 0:e93a11b4e044 220 return isEnabledTempNotify;
mapellil 0:e93a11b4e044 221 }
mapellil 0:e93a11b4e044 222
mapellil 0:e93a11b4e044 223 bool isHumNotificationEn (void) {
mapellil 0:e93a11b4e044 224 return isEnabledHumNotify;
mapellil 0:e93a11b4e044 225 }
mapellil 0:e93a11b4e044 226
mapellil 0:e93a11b4e044 227 bool isPresNotificationEn (void) {
mapellil 0:e93a11b4e044 228 return isEnabledPresNotify;
mapellil 0:e93a11b4e044 229 }
mapellil 0:e93a11b4e044 230
mapellil 0:e93a11b4e044 231 bool isGyroNotificationEn (void) {
mapellil 0:e93a11b4e044 232 return isEnabledGyroNotify;
mapellil 0:e93a11b4e044 233 }
mapellil 0:e93a11b4e044 234
mapellil 0:e93a11b4e044 235 bool isAccNotificationEn (void) {
mapellil 0:e93a11b4e044 236 return isEnabledAccNotify;
mapellil 0:e93a11b4e044 237 }
mapellil 0:e93a11b4e044 238
mapellil 0:e93a11b4e044 239 bool isMagNotificationEn (void) {
mapellil 0:e93a11b4e044 240 return isEnabledMagNotify;
mapellil 0:e93a11b4e044 241 }
mapellil 0:e93a11b4e044 242
mapellil 0:e93a11b4e044 243 bool isAccGyroMagNotificationEn (void) {
mapellil 0:e93a11b4e044 244 return isEnabledAccGyroMagNotify;
mapellil 0:e93a11b4e044 245 }
mapellil 0:e93a11b4e044 246
mapellil 0:e93a11b4e044 247 bool isTempHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 248 if (handle == envTemperatureCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 249 return false;
mapellil 0:e93a11b4e044 250 }
mapellil 0:e93a11b4e044 251
mapellil 0:e93a11b4e044 252 bool isHumHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 253 if (handle == envHumidityCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 254 return false;
mapellil 0:e93a11b4e044 255 }
mapellil 0:e93a11b4e044 256
mapellil 0:e93a11b4e044 257 bool isPresHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 258 if (handle == envPressureCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 259 return false;
mapellil 0:e93a11b4e044 260 }
mapellil 0:e93a11b4e044 261
mapellil 0:e93a11b4e044 262 bool isMagHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 263 if (handle == envMagnetometerCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 264 return false;
mapellil 0:e93a11b4e044 265 }
mapellil 0:e93a11b4e044 266 bool isAccHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 267 if (handle == envAccelerometerCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 268 return false;
mapellil 0:e93a11b4e044 269 }
mapellil 0:e93a11b4e044 270 bool isGyroHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 271 if (handle == envGyroCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 272 return false;
mapellil 0:e93a11b4e044 273 }
mapellil 0:e93a11b4e044 274 bool isAccGyroMagHandle (Gap::Handle_t handle) {
mapellil 0:e93a11b4e044 275 if (handle == envAccGyroMagCharacteristic.getValueAttribute().getHandle()) return true;
mapellil 0:e93a11b4e044 276 return false;
mapellil 0:e93a11b4e044 277 }
mapellil 0:e93a11b4e044 278
mapellil 0:e93a11b4e044 279 void updateConnectionStatus(ConnectionStatus_t status) {
mapellil 0:e93a11b4e044 280 isEnabledTempNotify = false;
mapellil 0:e93a11b4e044 281 isEnabledHumNotify = false;
mapellil 0:e93a11b4e044 282 isEnabledPresNotify = false;
mapellil 0:e93a11b4e044 283 isEnabledGyroNotify = false;
mapellil 0:e93a11b4e044 284 isEnabledAccNotify = false;
mapellil 0:e93a11b4e044 285 isEnabledMagNotify = false;
mapellil 0:e93a11b4e044 286 isEnabledAccGyroMagNotify = false;
mapellil 0:e93a11b4e044 287
mapellil 0:e93a11b4e044 288 isTempCalibrated = false;
mapellil 0:e93a11b4e044 289 isHumCalibrated = false;
mapellil 0:e93a11b4e044 290 isPresCalibrated = false;
mapellil 0:e93a11b4e044 291 isMagCalibrated = false;
mapellil 0:e93a11b4e044 292 isAccCalibrated = false;
mapellil 0:e93a11b4e044 293 isAGyroCalibrated = false;
mapellil 0:e93a11b4e044 294
mapellil 0:e93a11b4e044 295 memset (pastenvTemperature, 0, TEMP_DATA_LEN);
mapellil 0:e93a11b4e044 296 memset (pastenvHumidity, 0, HUM_DATA_LEN);
mapellil 0:e93a11b4e044 297 memset (pastenvPressure, 0, PRES_DATA_LEN);
mapellil 0:e93a11b4e044 298 isBTLEConnected = status;
mapellil 0:e93a11b4e044 299 }
mapellil 0:e93a11b4e044 300
mapellil 0:e93a11b4e044 301
mapellil 0:e93a11b4e044 302 private:
mapellil 0:e93a11b4e044 303 BLEDevice &ble;
mapellil 0:e93a11b4e044 304 uint8_t envTemperature [TEMP_DATA_LEN]; /* in C */
mapellil 0:e93a11b4e044 305 uint8_t pastenvTemperature [TEMP_DATA_LEN];
mapellil 0:e93a11b4e044 306 uint8_t envHumidity [HUM_DATA_LEN]; /* in % */
mapellil 0:e93a11b4e044 307 uint8_t pastenvHumidity [HUM_DATA_LEN];
mapellil 0:e93a11b4e044 308 uint8_t envPressure [PRES_DATA_LEN]; /* in mBar */
mapellil 0:e93a11b4e044 309 uint8_t pastenvPressure [PRES_DATA_LEN];
mapellil 0:e93a11b4e044 310 uint8_t envMagn [MAG_DATA_LEN];
mapellil 0:e93a11b4e044 311 uint8_t envGyro [GYRO_DATA_LEN];
mapellil 0:e93a11b4e044 312 uint8_t envAcce [ACC_DATA_LEN];
mapellil 0:e93a11b4e044 313 uint8_t envAccGyroMag [ACCGYROMAG_DATA_LEN];
mapellil 0:e93a11b4e044 314
mapellil 0:e93a11b4e044 315 GattCharacteristic envTemperatureCharacteristic;
mapellil 0:e93a11b4e044 316 GattCharacteristic envHumidityCharacteristic;
mapellil 0:e93a11b4e044 317 GattCharacteristic envPressureCharacteristic;
mapellil 0:e93a11b4e044 318
mapellil 0:e93a11b4e044 319 GattCharacteristic envMagnetometerCharacteristic;
mapellil 0:e93a11b4e044 320 GattCharacteristic envAccelerometerCharacteristic;
mapellil 0:e93a11b4e044 321 GattCharacteristic envGyroCharacteristic;
mapellil 0:e93a11b4e044 322 GattCharacteristic envAccGyroMagCharacteristic;
mapellil 0:e93a11b4e044 323
mapellil 0:e93a11b4e044 324 ConnectionStatus_t isBTLEConnected;
mapellil 0:e93a11b4e044 325
mapellil 0:e93a11b4e044 326 bool isEnabledTempNotify;
mapellil 0:e93a11b4e044 327 bool isEnabledHumNotify;
mapellil 0:e93a11b4e044 328 bool isEnabledPresNotify;
mapellil 0:e93a11b4e044 329 bool isEnabledGyroNotify;
mapellil 0:e93a11b4e044 330 bool isEnabledAccNotify;
mapellil 0:e93a11b4e044 331 bool isEnabledMagNotify;
mapellil 0:e93a11b4e044 332 bool isEnabledAccGyroMagNotify;
mapellil 0:e93a11b4e044 333
mapellil 0:e93a11b4e044 334 bool isTempCalibrated;
mapellil 0:e93a11b4e044 335 bool isHumCalibrated;
mapellil 0:e93a11b4e044 336 bool isPresCalibrated;
mapellil 0:e93a11b4e044 337 bool isMagCalibrated;
mapellil 0:e93a11b4e044 338 bool isAccCalibrated;
mapellil 0:e93a11b4e044 339 bool isAGyroCalibrated;
mapellil 0:e93a11b4e044 340
mapellil 0:e93a11b4e044 341 };
mapellil 0:e93a11b4e044 342
mapellil 0:e93a11b4e044 343 #endif /* #ifndef __CUSTOM_BLE_SENSORS_SERVICE_H__*/