Skip to content
Snippets Groups Projects
Commit c691d657 authored by schneider's avatar schneider
Browse files

feat(ess): Periodic measurements

While subscribed to an ESS characteristic, the sensor gets polled
every 3 seconds.
parent f0280f6f
No related branches found
No related tags found
No related merge requests found
Pipeline #4963 failed
...@@ -440,18 +440,23 @@ static void bleProcCccState(bleMsg_t *pMsg) ...@@ -440,18 +440,23 @@ static void bleProcCccState(bleMsg_t *pMsg)
APP_TRACE_INFO3("ccc state ind value:%d handle:%d idx:%d", pMsg->ccc.value, pMsg->ccc.handle, pMsg->ccc.idx); APP_TRACE_INFO3("ccc state ind value:%d handle:%d idx:%d", pMsg->ccc.value, pMsg->ccc.handle, pMsg->ccc.idx);
/* handle battery level CCC */ /* handle battery level CCC */
if (pMsg->ccc.idx == BLE_BATT_LVL_CCC_IDX) switch(pMsg->ccc.idx) {
{ case BLE_BATT_LVL_CCC_IDX:
if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY) if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY)
{ {
BasMeasBattStart((dmConnId_t) pMsg->ccc.hdr.param, BLE_BATT_TIMER_IND, BLE_BATT_LVL_CCC_IDX); BasMeasBattStart((dmConnId_t) pMsg->ccc.hdr.param, BLE_BATT_TIMER_IND, BLE_BATT_LVL_CCC_IDX);
} }
else else
{ {
BasMeasBattStop((dmConnId_t) pMsg->ccc.hdr.param); BasMeasBattStop((dmConnId_t) pMsg->ccc.hdr.param);
} }
return; break;
} case BLE_ESS_TEMP_CCC_IDX:
case BLE_ESS_HUMI_CCC_IDX:
case BLE_ESS_PRES_CCC_IDX:
bleESS_ccc_update();
break;
};
} }
/*************************************************************************************************/ /*************************************************************************************************/
...@@ -467,6 +472,7 @@ static void bleClose(bleMsg_t *pMsg) ...@@ -467,6 +472,7 @@ static void bleClose(bleMsg_t *pMsg)
{ {
/* stop battery measurement */ /* stop battery measurement */
BasMeasBattStop((dmConnId_t) pMsg->hdr.param); BasMeasBattStop((dmConnId_t) pMsg->hdr.param);
bleESS_ccc_update();
GapClearDeviceName(); GapClearDeviceName();
} }
...@@ -764,6 +770,7 @@ static void bleProcMsg(bleMsg_t *pMsg) ...@@ -764,6 +770,7 @@ static void bleProcMsg(bleMsg_t *pMsg)
connOpen->peerAddr[3], connOpen->peerAddr[2], connOpen->peerAddr[3], connOpen->peerAddr[2],
connOpen->peerAddr[1], connOpen->peerAddr[0]); connOpen->peerAddr[1], connOpen->peerAddr[0]);
BasProcMsg(&pMsg->hdr); BasProcMsg(&pMsg->hdr);
bleESS_ccc_update();
break; break;
case DM_CONN_CLOSE_IND: case DM_CONN_CLOSE_IND:
......
...@@ -8,6 +8,11 @@ ...@@ -8,6 +8,11 @@
#include "app_api.h" #include "app_api.h"
#include "epicardium.h" #include "epicardium.h"
#include "modules/log.h"
#include "modules/modules.h"
#include "FreeRTOS.h"
#include "timers.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
...@@ -173,6 +178,43 @@ WSF_CT_ASSERT( ...@@ -173,6 +178,43 @@ WSF_CT_ASSERT(
((sizeof(ESSSvcAttrList) / sizeof(ESSSvcAttrList[0])) == ((sizeof(ESSSvcAttrList) / sizeof(ESSSvcAttrList[0])) ==
ESS_END_HDL - ESS_START_HDL + 1)); ESS_END_HDL - ESS_START_HDL + 1));
static TimerHandle_t poll_timer;
static StaticTimer_t poll_timer_buffer;
static void bleESS_update(struct bme680_sensor_data *data);
static void workpoll(void *data)
{
struct bme680_sensor_data sensor_data;
if (epic_bme680_read_sensors(&sensor_data) == 0) {
bleESS_update(&sensor_data);
}
}
static void poll(TimerHandle_t xTimer)
{
workqueue_schedule(workpoll, NULL);
}
static void periodic(int period)
{
if (poll_timer == NULL) {
poll_timer = xTimerCreateStatic(
"bme680_poll",
1,
pdTRUE,
NULL,
poll,
&poll_timer_buffer
);
}
if (period < 1) {
xTimerStop(poll_timer, 0);
} else {
xTimerChangePeriod(poll_timer, pdMS_TO_TICKS(period), 0);
}
}
static void static void
sendNotification(dmConnId_t connId, uint16_t handle, uint16_t cccidx) sendNotification(dmConnId_t connId, uint16_t handle, uint16_t cccidx)
{ {
...@@ -274,14 +316,9 @@ static attsGroup_t svcESSGroup = { ...@@ -274,14 +316,9 @@ static attsGroup_t svcESSGroup = {
.endHandle = ESS_END_HDL, .endHandle = ESS_END_HDL,
}; };
void bleESS_update(void) static void bleESS_update(struct bme680_sensor_data *data)
{ {
struct bme680_sensor_data data; setAttrFromBME680(data);
int ret = epic_bme680_read_sensors(&data);
if (ret != 0) {
return;
}
setAttrFromBME680(&data);
/* Send notifications (if enabled) for all characteristics. */ /* Send notifications (if enabled) for all characteristics. */
dmConnId_t connId = AppConnIsOpen(); dmConnId_t connId = AppConnIsOpen();
...@@ -297,3 +334,22 @@ void bleESS_init(void) ...@@ -297,3 +334,22 @@ void bleESS_init(void)
{ {
AttsAddGroup(&svcESSGroup); AttsAddGroup(&svcESSGroup);
} }
/*
* Instruct the ESS service to check if any characterstics have
* notifications enabled and enable/disable periodic measurements.
*/
void bleESS_ccc_update(void)
{
dmConnId_t connId = AppConnIsOpen();
if (connId != DM_CONN_ID_NONE &&
(AttsCccEnabled(connId, BLE_ESS_TEMP_CCC_IDX) ||
AttsCccEnabled(connId, BLE_ESS_HUMI_CCC_IDX) ||
AttsCccEnabled(connId, BLE_ESS_PRES_CCC_IDX))) {
LOG_INFO("ess", "enable periodic measurement");
periodic(3000);
} else {
LOG_INFO("ess", "disable periodic measurement");
periodic(0);
}
}
#pragma once #pragma once
#include "epicardium.h"
/*!< \brief Service start handle. */ /*!< \brief Service start handle. */
#define ESS_START_HDL 0x1000 #define ESS_START_HDL 0x1000
/*!< \brief Service end handle. */ /*!< \brief Service end handle. */
...@@ -26,5 +28,4 @@ enum { ...@@ -26,5 +28,4 @@ enum {
ESS_MAX_HDL ESS_MAX_HDL
}; };
void bleESS_ccc_update(void);
void bleESS_update();
...@@ -120,6 +120,9 @@ void disp_forcelock(); ...@@ -120,6 +120,9 @@ void disp_forcelock();
#define BHI160_MUTEX_WAIT_MS 50 #define BHI160_MUTEX_WAIT_MS 50
void vBhi160Task(void *pvParameters); void vBhi160Task(void *pvParameters);
/* ---------- BME680 ------------------------------------------------------- */
void bme680_periodic(int period);
/* ---------- MAX86150 ----------------------------------------------------- */ /* ---------- MAX86150 ----------------------------------------------------- */
#define MAX86150_MUTEX_WAIT_MS 50 #define MAX86150_MUTEX_WAIT_MS 50
void vMAX86150Task(void *pvParameters); void vMAX86150Task(void *pvParameters);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment