Reading and sending sensor data over BLE

Dependencies:   BSP_B-L475E-IOT01

Files at this revision

API Documentation at this revision

Comitter:
samilive2011
Date:
Wed Jul 10 20:09:49 2019 +0000
Parent:
38:4bdc241ba9a6
Commit message:
Sending data over BLE

Changed in this revision

BSP_B-L475E-IOT01.lib Show annotated file Show diff for this revision Revisions of this file
source/LEDService.h Show diff for this revision Revisions of this file
source/Sensorservice.h Show annotated file Show diff for this revision Revisions of this file
source/main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BSP_B-L475E-IOT01.lib	Wed Jul 10 20:09:49 2019 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/ST/code/BSP_B-L475E-IOT01/#0c70bc6d2dc0
--- a/source/LEDService.h	Wed Jul 26 14:47:11 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __BLE_LED_SERVICE_H__
-#define __BLE_LED_SERVICE_H__
-
-class LEDService {
-public:
-    const static uint16_t LED_SERVICE_UUID              = 0xA000;
-    const static uint16_t LED_STATE_CHARACTERISTIC_UUID = 0xA001;
-
-    LEDService(BLEDevice &_ble, bool initialValueForLEDCharacteristic) :
-        ble(_ble), ledState(LED_STATE_CHARACTERISTIC_UUID, &initialValueForLEDCharacteristic)
-    {
-        GattCharacteristic *charTable[] = {&ledState};
-        GattService         ledService(LED_SERVICE_UUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
-        ble.addService(ledService);
-    }
-
-    GattAttribute::Handle_t getValueHandle() const
-    {
-        return ledState.getValueHandle();
-    }
-
-private:
-    BLEDevice                         &ble;
-    ReadWriteGattCharacteristic<bool> ledState;
-};
-
-#endif /* #ifndef __BLE_LED_SERVICE_H__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/Sensorservice.h	Wed Jul 10 20:09:49 2019 +0000
@@ -0,0 +1,174 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLE_ENVIRONMENTAL_SERVICE_H__
+#define __BLE_ENVIRONMENTAL_SERVICE_H__
+
+#include "ble/BLE.h"
+
+/**
+* @class EnvironmentalService
+* @brief BLE Environmental Service. This service provides temperature, humidity and pressure measurement.
+* Service:  https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml
+* Temperature: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature.xml
+* Humidity: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.humidity.xml
+* Pressure: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.pressure.xml
+*/
+class EnvironmentalService {
+public:
+    typedef int16_t  TemperatureType_t;
+    typedef uint16_t HumidityType_t;
+    typedef uint32_t PressureType_t;
+    typedef uint8_t  TimeType_t;
+    typedef uint8_t writeValue_t[10];
+    typedef uint8_t readValue_t[10];
+    typedef int16_t Magneto_t[3];
+    typedef int16_t ACCELERO_t[3];
+    typedef float   Gyro_t[3];
+    
+    const static uint16_t READ_SERVICE_CHARACTERISTIC_UUID = 0xA001;
+    const static uint16_t WRITE_SERVICE_CHARACTERISTIC_UUID = 0xA002;
+    const static uint16_t MAGNETO_SERVICE_CHARACTERISTIC_UUID = 0xA003;
+    const static uint16_t GYRO_SERVICE_CHARACTERISTIC_UUID = 0xA004;
+    const static uint16_t ACCELERO_SERVICE_CHARACTERISTIC_UUID = 0xA005;
+
+    /**
+     * @brief   EnvironmentalService constructor.
+     * @param   ble Reference to BLE device.
+     * @param   temperature_en Enable this characteristic.
+     * @param   humidity_en Enable this characteristic.
+     * @param   pressure_en Enable this characteristic.
+     */
+    EnvironmentalService(BLE& _ble) :
+        ble(_ble),
+        temperatureCharacteristic(GattCharacteristic::UUID_TEMPERATURE_CHAR, &temperature),
+        humidityCharacteristic(GattCharacteristic::UUID_HUMIDITY_CHAR, &humidity),
+        pressureCharacteristic(GattCharacteristic::UUID_PRESSURE_CHAR, &pressure),
+        timeCharacteristic(GattCharacteristic::UUID_CURRENT_TIME_CHAR , &timeNow),
+        magnetoCharacteristic(MAGNETO_SERVICE_CHARACTERISTIC_UUID, &magneto),
+        acceleroCharacteristic(ACCELERO_SERVICE_CHARACTERISTIC_UUID, &accelero),
+        gyroCharacteristic(GYRO_SERVICE_CHARACTERISTIC_UUID, &gyro),
+        readState(READ_SERVICE_CHARACTERISTIC_UUID, &readValue)
+        
+    {
+        static bool serviceAdded = false; /* We should only ever need to add the information service once. */
+        if (serviceAdded) {
+            return;
+        }
+
+        GattCharacteristic *charTable[] = { &humidityCharacteristic,
+                                            &pressureCharacteristic,
+                                            &temperatureCharacteristic,
+                                            &timeCharacteristic,
+                                            &readState,
+                                            &magnetoCharacteristic,
+                                            &acceleroCharacteristic,
+                                            &gyroCharacteristic };
+        GattService environmentalService(GattService::UUID_ENVIRONMENTAL_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+
+        ble.gattServer().addService(environmentalService);
+        serviceAdded = true;
+    }
+
+    /**
+     * @brief   Update humidity characteristic.
+     * @param   newHumidityVal New humidity measurement.
+     */
+    void updateHumidity(HumidityType_t newHumidityVal)
+    {
+        humidity = (HumidityType_t) (newHumidityVal*100);
+        ble.gattServer().write(humidityCharacteristic.getValueHandle(), (uint8_t *) &humidity, sizeof(HumidityType_t));
+    }
+    
+    void updateTime(TimeType_t newTimeVal)
+    {
+        timeNow = (TimeType_t) newTimeVal;
+        ble.gattServer().write(timeCharacteristic.getValueHandle(), (uint8_t *) &timeNow, sizeof(newTimeVal));
+    }
+
+    /**
+     * @brief   Update pressure characteristic.
+     * @param   newPressureVal New pressure measurement.
+     */
+    void updatePressure(PressureType_t newPressureVal)
+    {
+        pressure = (PressureType_t) (newPressureVal * 10);
+        ble.gattServer().write(pressureCharacteristic.getValueHandle(), (uint8_t *) &pressure, sizeof(PressureType_t));
+    }
+
+    /**
+     * @brief   Update temperature characteristic.
+     * @param   newTemperatureVal New temperature measurement.
+     */
+    void updateTemperature(float newTemperatureVal)
+    {
+        temperature = (TemperatureType_t) (newTemperatureVal * 100);
+        ble.gattServer().write(temperatureCharacteristic.getValueHandle(), (uint8_t *) &temperature, sizeof(TemperatureType_t));
+    }
+    
+    void updateMagneto(Magneto_t newMagnetoVal)
+    {
+        ble.gattServer().write(magnetoCharacteristic.getValueHandle(), (uint8_t *) &magneto[0], sizeof(int16_t));
+        ble.gattServer().write(magnetoCharacteristic.getValueHandle(), (uint8_t *) &magneto[1], sizeof(int16_t));
+        ble.gattServer().write(magnetoCharacteristic.getValueHandle(), (uint8_t *) &magneto[2], sizeof(int16_t));
+    }
+    
+    void updateAccelero(ACCELERO_t newAcceleroVal)
+    {
+        ble.gattServer().write(acceleroCharacteristic.getValueHandle(), (uint8_t *) &accelero[0], sizeof(int16_t));
+        ble.gattServer().write(acceleroCharacteristic.getValueHandle(), (uint8_t *) &accelero[1], sizeof(int16_t));
+        ble.gattServer().write(acceleroCharacteristic.getValueHandle(), (uint8_t *) &accelero[2], sizeof(int16_t));
+    }
+    
+    void updateGyro(Gyro_t newGyroVal)
+    {
+        ble.gattServer().write(gyroCharacteristic.getValueHandle(), (uint8_t *) &gyro[0], sizeof(float));
+        ble.gattServer().write(gyroCharacteristic.getValueHandle(), (uint8_t *) &gyro[1], sizeof(float));
+        ble.gattServer().write(gyroCharacteristic.getValueHandle(),  (uint8_t *)  &gyro[2],  sizeof(float));
+    }
+    
+    GattAttribute::Handle_t getValueHandle() const
+    {
+        return readState.getValueHandle();
+    }
+    
+    
+    
+    
+private:
+    BLE& ble;
+
+    TemperatureType_t temperature;
+    HumidityType_t    humidity;
+    PressureType_t    pressure;
+    TimeType_t        timeNow;
+    writeValue_t writeValue;
+    readValue_t readValue;
+    Magneto_t   magneto;
+    ACCELERO_t   accelero;
+    Gyro_t      gyro;
+
+    ReadOnlyGattCharacteristic<TemperatureType_t> temperatureCharacteristic;
+    ReadOnlyGattCharacteristic<HumidityType_t>    humidityCharacteristic;
+    ReadOnlyGattCharacteristic<PressureType_t>    pressureCharacteristic;
+    ReadOnlyGattCharacteristic<TimeType_t>        timeCharacteristic;
+    ReadOnlyGattCharacteristic<readValue_t> readState;
+    ReadOnlyGattCharacteristic<Magneto_t> magnetoCharacteristic;
+    ReadOnlyGattCharacteristic<ACCELERO_t> acceleroCharacteristic;
+    ReadOnlyGattCharacteristic<Gyro_t> gyroCharacteristic;
+};
+
+#endif /* #ifndef __BLE_ENVIRONMENTAL_SERVICE_H__*/
\ No newline at end of file
--- a/source/main.cpp	Wed Jul 26 14:47:11 2017 +0200
+++ b/source/main.cpp	Wed Jul 10 20:09:49 2019 +0000
@@ -1,33 +1,45 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
 #include <events/mbed_events.h>
 #include <mbed.h>
 #include "ble/BLE.h"
-#include "LEDService.h"
+#include "Sensorservice.h"
+#include "stm32l475e_iot01_tsensor.h"
+#include "stm32l475e_iot01_hsensor.h"
+#include "stm32l475e_iot01_magneto.h"
+#include "stm32l475e_iot01_gyro.h"
+#include "stm32l475e_iot01_accelero.h"
+#include "stm32l475e_iot01_psensor.h"
+
+
+EnvironmentalService *SensorPtr;
+static float currentTemperature   = 0.0;
+static float currentHumidity   = 0.0;
+static float currentPressure   = 0.0;
+static int16_t      MagnetoXYZ[3]     ={0};
+static int16_t     AcceleroXYZ[3]     ={0};
+static float           GyroXYZ[3]     ={0};
+
+Serial pc(USBTX,USBRX);
 
 DigitalOut alivenessLED(LED1, 0);
 DigitalOut actuatedLED(LED2, 0);
+DigitalOut led(LED1, 1);
+uint16_t customServiceUUID  = 0xA000; /*Service*/
+uint16_t readCharUUID       = 0xA001; /*Read*/
+uint16_t writeCharUUID      = 0xA002; /*Write*/
 
-const static char     DEVICE_NAME[] = "LED";
-static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID};
+const static char     DEVICE_NAME[]        = "Projet";
+static const uint16_t uuid16_list[]        = {GattService::UUID_ENVIRONMENTAL_SERVICE}; 
+
 
-static EventQueue eventQueue(/* event count */ 10 * EVENTS_EVENT_SIZE);
+static uint8_t writeValue[10] = {0};
+WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(writeValue)> writeChar(writeCharUUID, writeValue);
+
 
-LEDService *ledServicePtr;
+GattCharacteristic *characteristics[] = {&writeChar};
+GattService        customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
+
+static EventQueue eventQueue(10 * EVENTS_EVENT_SIZE);
+
 
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
 {
@@ -35,62 +47,92 @@
     BLE::Instance().gap().startAdvertising();
 }
 
-void blinkCallback(void)
-{
-    alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */
+  
+void updateTSensorValue(void) {
+    currentTemperature = BSP_TSENSOR_ReadTemp();
+    currentHumidity =    BSP_HSENSOR_ReadHumidity();
+    currentPressure   =  BSP_PSENSOR_ReadPressure();
+    BSP_MAGNETO_GetXYZ(MagnetoXYZ);
+    BSP_GYRO_GetXYZ(GyroXYZ);
+    BSP_ACCELERO_AccGetXYZ(AcceleroXYZ);
+    SensorPtr->updateTemperature(currentTemperature);
+    SensorPtr->updateHumidity(currentHumidity);
+    SensorPtr->updatePressure(currentPressure);
+    SensorPtr->updateAccelero(AcceleroXYZ);
+    SensorPtr->updateMagneto(MagnetoXYZ);
+    SensorPtr->updateGyro(GyroXYZ);
 }
 
-/**
- * This callback allows the LEDService to receive updates to the ledState Characteristic.
- *
- * @param[in] params
- *     Information about the characterisitc being updated.
- */
-void onDataWrittenCallback(const GattWriteCallbackParams *params) {
-    if ((params->handle == ledServicePtr->getValueHandle()) && (params->len == 1)) {
-        actuatedLED = *(params->data);
+
+void blinkCallback(void)
+{
+    alivenessLED = !alivenessLED; 
+        if (BLE::Instance().gap().getState().connected) {
+        eventQueue.call(updateTSensorValue);
     }
 }
 
-/**
- * This function is called when the ble initialization process has failled
- */
+/********Lecture des donées et traitement selon leurs taille*******/
+void onDataWrittenCallback(const GattWriteCallbackParams *params) {
+    if ((params->handle == writeChar.getValueHandle())) {
+        if(params->len == 1) {
+            actuatedLED = *(params->data);
+            pc.printf("Data received: length = %d\n\r",params->len);
+            if(actuatedLED == 1){
+              pc.printf("LED is on\n\r");
+            }
+            else{
+                pc.printf("LED is off\n\r");
+            }
+            for(int x=0; x < params->len; x++) {
+                pc.printf("%x", params->data[x]);
+                pc.printf("\n\r");
+            }
+        }
+        else {
+            pc.printf("Data received: length = %d, data = 0x",params->len);
+            for(int x=0; x < params->len; x++) {
+                pc.printf("%x", params->data[x]);
+            }
+            pc.printf("\n\r");
+        }
+        
+    }
+}
+
+
 void onBleInitError(BLE &ble, ble_error_t error)
 {
-    /* Initialization error handling should go here */
+    pc.printf("Erreur\n\r");
 }
 
-/**
- * Callback triggered when the ble initialization process has finished
- */
+
 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
 {
     BLE&        ble   = params->ble;
     ble_error_t error = params->error;
 
     if (error != BLE_ERROR_NONE) {
-        /* In case of error, forward the error handling to onBleInitError */
         onBleInitError(ble, error);
         return;
     }
 
-    /* Ensure that it is the default instance of BLE */
     if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
         return;
     }
 
     ble.gap().onDisconnection(disconnectionCallback);
+    SensorPtr = new EnvironmentalService(ble);
     ble.gattServer().onDataWritten(onDataWrittenCallback);
 
-    bool initialValueForLEDCharacteristic = false;
-    ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic);
 
-    /* setup advertising */
+/************************** advertising***********************/
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
     ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
     ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
+    ble.addService(customService);
     ble.gap().startAdvertising();
 }
 
@@ -99,9 +141,19 @@
     eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
 }
 
+/******************************MAIN*******************************/
+
 int main()
 {
+    BSP_TSENSOR_Init();
+    BSP_HSENSOR_Init();
+    BSP_PSENSOR_Init();
+    BSP_MAGNETO_Init();
+    BSP_GYRO_Init();
+    BSP_ACCELERO_Init();
+    pc.printf("BLE is Working\n\r");
     eventQueue.call_every(500, blinkCallback);
+    
 
     BLE &ble = BLE::Instance();
     ble.onEventsToProcess(scheduleBleEventsProcessing);