Reading and sending sensor data over BLE
Dependencies: BSP_B-L475E-IOT01
Diff: source/main.cpp
- Revision:
- 39:ddabcba6eff1
- Parent:
- 27:ff1fb7b5f9ee
--- 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);