upd measure on connect

This commit is contained in:
leo 2022-12-24 13:44:45 +01:00
parent 7616115618
commit d9ed3f2334
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
2 changed files with 24 additions and 34 deletions

View File

@ -5,6 +5,8 @@
#include "host/ble_uuid.h"
#include "nimble/hci_common.h"
#include "os/os_mbuf.h"
#include "scd4x_data.h"
#include "scd4x_i2c.h"
#include "sdkconfig.h"
#include <stdint.h>
#ifdef CONFIG_BT_NIMBLE_ENABLED
@ -18,6 +20,9 @@
#include "services/gatt/ble_svc_gatt.h"
#include "nimble/nimble_port_freertos.h"
#include "scd4x_util.h"
#include "scd4x_i2c.h"
static configuration_data_t* main_app_conf;
static uint8_t ble_addr_type;
@ -506,6 +511,7 @@ static int gatt_svr_chr_access_magfield_update(uint16_t conn_handle, uint16_t at
}
static void ble_advertise(void){
scd4x_power_down();
main_app_conf->sensor->enabled = false;
ESP_ERROR_CHECK(ble_gap_adv_set_fields(&adv_fields));
ESP_ERROR_CHECK(ble_gap_adv_start(ble_addr_type, NULL, BLE_HS_FOREVER, &adv_params, ble_gap_event, NULL));

View File

@ -20,6 +20,7 @@
#include "ledController.h"
#include "power_inout.h"
#include "scd4x_i2c.h"
#include "scd4x_util.h"
#include "sdkconfig.h"
#include "sensirion_i2c_hal.h"
#include "scd4x_data.h"
@ -92,52 +93,35 @@ void fetch_sensor_task(void* pvParameters){
configuration_data_t* mainConf = (configuration_data_t*) pvParameters;
scd4x_config_t* conf = mainConf->sensor;
scd4x_data_t* measures = conf->measure;
uint8_t sensorStarted = false;
int sensorStarted = false;
while(1){
ESP_LOGI("MAIN", "witing for %d sec", conf->delay);
vTaskDelay(conf->delay * 1000 / portTICK_PERIOD_MS);
for(int i=0, oldEnable=conf->enabled; i<conf->delay || !conf->enabled; i++){
vTaskDelay(1000 / portTICK_PERIOD_MS);
if(conf->enabled != oldEnable) break;
ESP_LOGI("MAIN", "waiting");
}
ESP_LOGI("MAIN", "sensor status changed");
if(!conf->enabled){
if(sensorStarted){
sensorStarted = false;
scd4x_power_down();
sensorStarted = false;
}
else{
continue;
}
else continue;
}
if(conf->enabled && !sensorStarted){
scd4x_wake_up();
for(int i=0; i<5; i++){
uint16_t s0, s1, s2;
int16_t res=scd4x_get_serial_number(&s0, &s1, &s2);
if(res == 0) break;
vTaskDelay(500 / portTICK_PERIOD_MS);
ESP_LOGI("MAIN", "get serial, res %d; serial %d %d %d", res, s0, s1, s2);
}
sensorStarted = true;
switch(conf->mode){
case SCD4X_NORMAL_MODE:
ESP_ERROR_CHECK(scd4x_start_periodic_measurement());
ESP_LOGI("scd4x init","started in normal mode");
break;
case SCD4X_LP_MODE:
ESP_ERROR_CHECK(scd4x_start_low_power_periodic_measurement());
ESP_LOGI("scd4x init","started in low power mode");
break;
else{
if(!sensorStarted){
scd4x_wait_wake_up();
scd4x_measure_single_shot();
update_scd4x_measures(measures);
start_scd4x_measure(conf);
}
}
if(conf->mode == SCD4X_SS_MODE) scd4x_measure_single_shot();
ESP_LOGI("MAIN", "reading sensor");
uint16_t dataReady;
scd4x_get_data_ready_status(&dataReady);
if(!(dataReady & 0x07FF)){
ESP_LOGI("MAIN", "no new sensor data");
continue;
}
int16_t error = scd4x_read_measurement(&measures->co2, &measures->temperature, &measures->humidity);
if (error)
ESP_LOGE("sensor fetch", "Error executing scd4x_read_measurement(): %i\n", error);
update_scd4x_measures(measures);
update_led_status(mainConf->leds, mainConf->led_nb, conf->measure->co2);
ble_sensor_notify();
ESP_LOGI("MAIN", "co2 : %u ppm, temp : %ld m°C, hum : %ld mRH", conf->measure->co2, conf->measure->temperature, conf->measure->humidity);