From e86a47296362158b18fe9dda56e75dfa93f16dec Mon Sep 17 00:00:00 2001
From: Paolo Patruno
Date: Wed, 16 Feb 2022 10:50:58 +0100
Subject: [PATCH] some bugs on timing and missing data in some situations
---
.../stima_v3/i2c-th/src/i2c-th-config.h | 13 +-
platformio/stima_v3/i2c-th/src/i2c-th.ino | 343 ++++++++----------
2 files changed, 168 insertions(+), 188 deletions(-)
diff --git a/platformio/stima_v3/i2c-th/src/i2c-th-config.h b/platformio/stima_v3/i2c-th/src/i2c-th-config.h
index 9a68dc9c5..41eb36b9b 100644
--- a/platformio/stima_v3/i2c-th/src/i2c-th-config.h
+++ b/platformio/stima_v3/i2c-th/src/i2c-th-config.h
@@ -157,12 +157,6 @@ WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S
#define SAMPLES_COUNT_MAX (((60000 * OBSERVATIONS_MINUTES) / SENSORS_SAMPLE_TIME_MS) + 10)
-/*!
-\def OBSERVATION_SAMPLE_ERROR_MAX
-\brief Maximum invalid sample count for generate a valid observations.
-*/
-#define OBSERVATION_SAMPLE_ERROR_MAX ((uint16_t)(round(SAMPLES_COUNT_MAX/10)))
-
/*!
\def OBSERVATION_SAMPLES_COUNT
\brief Sample count in OBSERVATIONS_MINUTES minutes.
@@ -170,6 +164,13 @@ WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S
#define OBSERVATION_SAMPLES_COUNT ((uint8_t)(OBSERVATIONS_MINUTES * 60 / ((uint8_t)(SENSORS_SAMPLE_TIME_MS / 1000))))
+/*!
+\def OBSERVATION_SAMPLE_ERROR_MAX
+\brief Maximum invalid sample count for generate a valid observations.
+*/
+#define OBSERVATION_SAMPLE_ERROR_MAX ((uint16_t)(round(OBSERVATION_SAMPLES_COUNT/10.)))
+
+
#define RMAP_REPORT_ERROR_MAX ((uint16_t)(1))
#define RMAP_REPORT_VALID_MIN ((uint16_t)(2))
diff --git a/platformio/stima_v3/i2c-th/src/i2c-th.ino b/platformio/stima_v3/i2c-th/src/i2c-th.ino
index cd83ad133..3decf3d3d 100644
--- a/platformio/stima_v3/i2c-th/src/i2c-th.ino
+++ b/platformio/stima_v3/i2c-th/src/i2c-th.ino
@@ -393,6 +393,8 @@ ISR(TIMER1_OVF_vect) {
}
void i2c_request_interrupt_handler() {
+
+ /*
if (is_test_read) {
switch(readable_data_address) {
case I2C_TH_TEMPERATURE_MED60_ADDRESS:
@@ -404,6 +406,8 @@ void i2c_request_interrupt_handler() {
break;
}
}
+ */
+
if (readable_data_length) {
//! write readable_data_length bytes of data stored in readable_data_read_ptr (base) + readable_data_address (offset) on i2c bus
Wire.write((uint8_t *)readable_data_read_ptr+readable_data_address, readable_data_length);
@@ -748,44 +752,28 @@ template void addValue(b
}
void make_report (bool init=false) {
-
-
- static uint16_t valid_count_humidity;
- static uint16_t error_count_humidity;
-
- static uint16_t valid_count_temperature;
- static uint16_t error_count_temperature;
static uint16_t valid_count_humidity_o;
static uint16_t error_count_humidity_o;
static uint16_t valid_count_temperature_o;
static uint16_t error_count_temperature_o;
-
- static int32_t avg_temperature;
- static float sum1_temperature;
- static float sum2_temperature;
-
- static int32_t avg_humidity;
- static float sum1_humidity;
- static float sum2_humidity;
- static int32_t ist_temperature_o;
static int32_t avg_temperature_o;
static int32_t min_temperature_o;
static int32_t max_temperature_o;
- static int32_t ist_humidity_o;
static int32_t avg_humidity_o;
static int32_t min_humidity_o;
static int32_t max_humidity_o;
+ static float sum1_temperature;
+ static float sum2_temperature;
+
+ static float sum1_humidity;
+ static float sum2_humidity;
+
if (init) {
- valid_count_humidity = 0;
- error_count_humidity = 0;
-
- valid_count_temperature = 0;
- error_count_temperature = 0;
valid_count_humidity_o = 0;
error_count_humidity_o = 0;
@@ -793,188 +781,179 @@ void make_report (bool init=false) {
valid_count_temperature_o = 0;
error_count_temperature_o = 0;
- avg_temperature = 0;
- sum1_temperature = 0;
- sum2_temperature = 0;
-
- avg_humidity = 0;
- sum1_humidity = 0;
- sum2_humidity = 0;
-
- ist_temperature_o = INT32_MAX;
avg_temperature_o = 0;
min_temperature_o = INT32_MAX;
max_temperature_o = INT32_MIN;
- ist_humidity_o = INT32_MAX;
avg_humidity_o = 0;
min_humidity_o = INT32_MAX;
max_humidity_o = INT32_MIN;
+ sum1_temperature=0;
+ sum2_temperature=0;
+
+ sum1_humidity=0;
+ sum2_humidity=0;
+
return;
}
-
+
+ // TEMPERATURE
+
+ uint16_t valid_count_temperature=0;
+ uint16_t error_count_temperature=0;
+ int32_t avg_temperature=0;
+
bufferPtrResetBack(&temperature_samples, SAMPLES_COUNT_MAX);
- uint16_t sample_count = OBSERVATION_SAMPLES_COUNT;
- if (temperature_samples.count < OBSERVATION_SAMPLES_COUNT) {
- sample_count = temperature_samples.count;
+ int32_t temperature = bufferReadBack(&temperature_samples, SAMPLES_COUNT_MAX);
+ LOGN(F("sample temperature value: %l"), temperature);
+ if (ISVALID_INT32(temperature)) {
+ readable_data_write_ptr->temperature.sample = temperature;
+ }else{
+ readable_data_write_ptr->temperature.sample = UINT16_MAX;
}
-
- LOGN(F("Sample count %d:%d"),sample_count,OBSERVATION_SAMPLES_COUNT);
-
- for (uint16_t i = 0; i < sample_count; i++) {
-
- int32_t temperature = bufferReadBack(&temperature_samples, SAMPLES_COUNT_MAX);
-
- if (i == 0) {
-
- if (ISVALID_INT32(temperature)) {
- readable_data_write_ptr->temperature.sample = temperature;
- }
+ bufferPtrResetBack(&temperature_samples, SAMPLES_COUNT_MAX);
- LOGN(F("Temperature count : %d"), temperature_samples.count);
- }
- LOGT(F("Temperature value: %d"), temperature);
-
- if (ISVALID_INT32(temperature)) {
- valid_count_temperature++;
- avg_temperature += round((float)(temperature - avg_temperature) / valid_count_temperature);
- }
- else {
- error_count_temperature++;
- }
-
- bool is_new_observation = (((i+1) % OBSERVATION_SAMPLES_COUNT) == 0);
- if (is_new_observation) {
- LOGN(F("temperature is new observation"));
-
- if (valid_count_temperature && (error_count_temperature <= OBSERVATION_SAMPLE_ERROR_MAX)) {
- valid_count_temperature_o++;
-
- LOGN(F("valid_count_temperature_o %d"),valid_count_temperature_o);
-
- avg_temperature_o += round((float) (avg_temperature - avg_temperature_o) / valid_count_temperature_o);
-
- if (i <= OBSERVATION_SAMPLES_COUNT) {
- ist_temperature_o = avg_temperature;
- }
-
- if (avg_temperature <= min_temperature_o) {
- min_temperature_o = avg_temperature;
- }
-
- if (avg_temperature >= max_temperature_o) {
- max_temperature_o = avg_temperature;
- }
-
- sum1_temperature += avg_temperature;
- sum2_temperature += avg_temperature * avg_temperature;
- } else {
- error_count_temperature_o++;
- }
-
- bufferReset(&temperature_samples, SAMPLES_COUNT_MAX);
-
- avg_temperature = 0;
- valid_count_temperature = 0;
- error_count_temperature = 0;
- }
- }
-
- LOGT(F("valid_count_temperature_o %d RMAP_REPORT_VALID_MIN %d error_count_temperature_o %d RMAP_REPORT_ERROR_MAX %d"),valid_count_temperature_o, RMAP_REPORT_VALID_MIN, error_count_temperature_o, RMAP_REPORT_ERROR_MAX);
-
- if ((valid_count_temperature_o >= RMAP_REPORT_VALID_MIN) && (error_count_temperature_o <= RMAP_REPORT_ERROR_MAX)) {
- readable_data_write_ptr->temperature.med60 = ist_temperature_o;
- readable_data_write_ptr->temperature.min = min_temperature_o;
- readable_data_write_ptr->temperature.med = avg_temperature_o;
- readable_data_write_ptr->temperature.max = max_temperature_o;
- readable_data_write_ptr->temperature.sigma = sqrt((sum2_temperature - (sum1_temperature * sum1_temperature) / (float) (valid_count_temperature_o)) / (float) (valid_count_temperature_o));
- }
+ LOGN(F("temperature sample count %d:%d"),temperature_samples.count,OBSERVATION_SAMPLES_COUNT);
- LOGN(F("temperature sample:%d\tmed60:%d\tmin:%d\tmed:%d\tmax:%d\tsigma:%d"), readable_data_write_ptr->temperature.sample,readable_data_write_ptr->temperature.med60, readable_data_write_ptr->temperature.min, readable_data_write_ptr->temperature.med, readable_data_write_ptr->temperature.max, readable_data_write_ptr->temperature.sigma);
-
-
- // HUMIDITY
+ if (temperature_samples.count == OBSERVATION_SAMPLES_COUNT) {
+ for (uint16_t i = 0; i < OBSERVATION_SAMPLES_COUNT; i++) {
+
+ temperature = bufferReadBack(&temperature_samples, SAMPLES_COUNT_MAX);
+ LOGT(F("Temperature %d value: %l"), i, temperature);
+
+ if (ISVALID_INT32(temperature)) {
+ valid_count_temperature++;
+ avg_temperature += round((float)(temperature - avg_temperature) / valid_count_temperature);
+ } else {
+ error_count_temperature++;
+ }
+ }
- bufferPtrResetBack(&humidity_samples, SAMPLES_COUNT_MAX);
- sample_count = OBSERVATION_SAMPLES_COUNT;
- if (humidity_samples.count < OBSERVATION_SAMPLES_COUNT) {
- sample_count = humidity_samples.count;
- }
-
- for (uint16_t i = 0; i < sample_count; i++) {
-
- int32_t humidity = bufferReadBack(&humidity_samples, SAMPLES_COUNT_MAX);
-
- if (i == 0) {
- if (ISVALID_INT32(humidity)) {
- readable_data_write_ptr->humidity.sample = humidity;
- }
- LOGN(F("Humidity count : %d"), humidity_samples.count);
- }
- LOGT(F("Humidity value: %d"), humidity);
-
- if (ISVALID_INT32(humidity)) {
- valid_count_humidity++;
- avg_humidity += round((float) (humidity - avg_humidity) / valid_count_humidity);
- }
- else {
- error_count_humidity++;
- }
-
- bool is_new_observation = (((i+1) % OBSERVATION_SAMPLES_COUNT) == 0);
- if (is_new_observation) {
- LOGN(F("humidity is new observation"));
- if (valid_count_humidity && (error_count_humidity <= OBSERVATION_SAMPLE_ERROR_MAX)) {
- valid_count_humidity_o++;
- LOGN(F("valid_count_humidity_o %d"),valid_count_humidity_o);
- avg_humidity_o += round((float) (avg_humidity - avg_humidity_o) / valid_count_humidity_o);
-
- if (i <= OBSERVATION_SAMPLES_COUNT) {
- ist_humidity_o = avg_humidity;
- }
-
- if (avg_humidity <= min_humidity_o) {
- min_humidity_o = avg_humidity;
- }
-
- if (avg_humidity >= max_humidity_o) {
- max_humidity_o = avg_humidity;
- }
-
- sum1_humidity += avg_humidity;
- sum2_humidity += avg_humidity * avg_humidity;
- }
- else {
- error_count_humidity_o++;
- }
-
- bufferReset(&humidity_samples, SAMPLES_COUNT_MAX);
-
- avg_humidity = 0;
- valid_count_humidity = 0;
- error_count_humidity = 0;
- }
- }
-
- LOGN(F("valid_count_humidity_o %d RMAP_REPORT_VALID_MIN %d error_count_humidity_o %d RMAP_REPORT_ERROR_MAX %d"),valid_count_humidity_o, RMAP_REPORT_VALID_MIN, error_count_humidity_o, RMAP_REPORT_ERROR_MAX);
-
- if ((valid_count_humidity_o >= RMAP_REPORT_VALID_MIN) && (error_count_humidity_o <= RMAP_REPORT_ERROR_MAX)) {
+ bufferReset(&temperature_samples, SAMPLES_COUNT_MAX);
+
+ LOGN(F("temperature new observation with %d:%d errors"),error_count_temperature,OBSERVATION_SAMPLE_ERROR_MAX);
+
+ if (valid_count_temperature && (error_count_temperature <= OBSERVATION_SAMPLE_ERROR_MAX)) {
+ valid_count_temperature_o++;
+
+ avg_temperature_o += round((float) (avg_temperature - avg_temperature_o) / valid_count_temperature_o);
+
+ readable_data_write_ptr->temperature.med60 = avg_temperature;
+
+ if (avg_temperature <= min_temperature_o) {
+ min_temperature_o = avg_temperature;
+ }
+
+ if (avg_temperature >= max_temperature_o) {
+ max_temperature_o = avg_temperature;
+ }
+
+ sum1_temperature += avg_temperature;
+ sum2_temperature += avg_temperature * avg_temperature;
+ } else {
+ readable_data_write_ptr->temperature.med60 = UINT16_MAX;
+ error_count_temperature_o++;
+ }
+ }
+
+ LOGN(F("REPORT temperature valid_count:%d VALID_MIN:%d error_count:%d ERROR_MAX:%d"),valid_count_temperature_o, RMAP_REPORT_VALID_MIN, error_count_temperature_o, RMAP_REPORT_ERROR_MAX);
+
+ if ((valid_count_temperature_o >= RMAP_REPORT_VALID_MIN) && (error_count_temperature_o <= RMAP_REPORT_ERROR_MAX)) {
+ readable_data_write_ptr->temperature.min = min_temperature_o;
+ readable_data_write_ptr->temperature.med = avg_temperature_o;
+ readable_data_write_ptr->temperature.max = max_temperature_o;
+ readable_data_write_ptr->temperature.sigma = sqrt((sum2_temperature - (sum1_temperature * sum1_temperature) / (float) (valid_count_temperature_o)) / (float) (valid_count_temperature_o));
+ }else{
+ readable_data_write_ptr->temperature.min = UINT16_MAX;
+ readable_data_write_ptr->temperature.med = UINT16_MAX;
+ readable_data_write_ptr->temperature.max = UINT16_MAX;
+ readable_data_write_ptr->temperature.sigma = UINT16_MAX;
+ }
- readable_data_write_ptr->humidity.med60 = ist_humidity_o;
- readable_data_write_ptr->humidity.min = min_humidity_o;
- readable_data_write_ptr->humidity.med = avg_humidity_o;
- readable_data_write_ptr->humidity.max = max_humidity_o;
- readable_data_write_ptr->humidity.sigma = sqrt((sum2_humidity - (sum1_humidity * sum1_humidity) / (float) (valid_count_humidity_o)) / (float) (valid_count_humidity_o));
- }
+ LOGN(F("temperature sample:%d\tmed60:%d\tmin:%d\tmed:%d\tmax:%d\tsigma:%d"), readable_data_write_ptr->temperature.sample,readable_data_write_ptr->temperature.med60, readable_data_write_ptr->temperature.min, readable_data_write_ptr->temperature.med, readable_data_write_ptr->temperature.max, readable_data_write_ptr->temperature.sigma);
+
+
+ // HUMIDITY
+
+ uint16_t valid_count_humidity=0;
+ uint16_t error_count_humidity=0;
+ int32_t avg_humidity=0;
+
+ bufferPtrResetBack(&humidity_samples, SAMPLES_COUNT_MAX);
+ int32_t humidity = bufferReadBack(&humidity_samples, SAMPLES_COUNT_MAX);
+ LOGN(F("sample humidity value: %l"), humidity);
+ if (ISVALID_INT32(humidity)) {
+ readable_data_write_ptr->humidity.sample = humidity;
+ }else{
+ readable_data_write_ptr->humidity.sample = UINT16_MAX;
+ }
+
+ bufferPtrResetBack(&humidity_samples, SAMPLES_COUNT_MAX);
- LOGN(F("humidity sample:%d\tmed60:%d\tmin:%d\tmed:%d\tmax:%d\tsigma:%d"), readable_data_write_ptr->humidity.sample,readable_data_write_ptr->humidity.med60, readable_data_write_ptr->humidity.min, readable_data_write_ptr->humidity.med, readable_data_write_ptr->humidity.max, readable_data_write_ptr->humidity.sigma);
+ LOGN(F("humidity sample count %d:%d"),humidity_samples.count,OBSERVATION_SAMPLES_COUNT);
+ if (humidity_samples.count == OBSERVATION_SAMPLES_COUNT) {
+ for (uint16_t i = 0; i < OBSERVATION_SAMPLES_COUNT; i++) {
+
+ humidity = bufferReadBack(&humidity_samples, SAMPLES_COUNT_MAX);
+ LOGT(F("Humidity %d value: %l"), i, humidity);
+
+ if (ISVALID_INT32(humidity)) {
+ valid_count_humidity++;
+ avg_humidity += round((float) (humidity - avg_humidity) / valid_count_humidity);
+ } else {
+ error_count_humidity++;
+ }
+ }
+ bufferReset(&humidity_samples, SAMPLES_COUNT_MAX);
+
+ LOGN(F("humidity new observation with %d:%d errors"),error_count_humidity,OBSERVATION_SAMPLE_ERROR_MAX);
+ if (valid_count_humidity && (error_count_humidity <= OBSERVATION_SAMPLE_ERROR_MAX)) {
+ valid_count_humidity_o++;
+
+ avg_humidity_o += round((float) (avg_humidity - avg_humidity_o) / valid_count_humidity_o);
+
+ readable_data_write_ptr->humidity.med60 = avg_humidity;
+
+ if (avg_humidity <= min_humidity_o) {
+ min_humidity_o = avg_humidity;
+ }
+
+ if (avg_humidity >= max_humidity_o) {
+ max_humidity_o = avg_humidity;
+ }
+
+ sum1_humidity += avg_humidity;
+ sum2_humidity += avg_humidity * avg_humidity;
+ }
+ else {
+ readable_data_write_ptr->humidity.med60 = UINT16_MAX;
+ error_count_humidity_o++;
+ }
+ }
+
+ LOGN(F("REPORT humidity valid_count:%d VALID_MIN:%d error_count:%d ERROR_MAX:%d"),valid_count_humidity_o, RMAP_REPORT_VALID_MIN, error_count_humidity_o, RMAP_REPORT_ERROR_MAX);
+
+ if ((valid_count_humidity_o >= RMAP_REPORT_VALID_MIN) && (error_count_humidity_o <= RMAP_REPORT_ERROR_MAX)) {
+ readable_data_write_ptr->humidity.min = min_humidity_o;
+ readable_data_write_ptr->humidity.med = avg_humidity_o;
+ readable_data_write_ptr->humidity.max = max_humidity_o;
+ readable_data_write_ptr->humidity.sigma = sqrt((sum2_humidity - (sum1_humidity * sum1_humidity) / (float) (valid_count_humidity_o)) / (float) (valid_count_humidity_o));
+ }else{
+ readable_data_write_ptr->humidity.min = UINT16_MAX;
+ readable_data_write_ptr->humidity.med = UINT16_MAX;
+ readable_data_write_ptr->humidity.max = UINT16_MAX;
+ readable_data_write_ptr->humidity.sigma = UINT16_MAX;
+ }
+
+ LOGN(F("humidity sample:%d\tmed60:%d\tmin:%d\tmed:%d\tmax:%d\tsigma:%d"), readable_data_write_ptr->humidity.sample,readable_data_write_ptr->humidity.med60, readable_data_write_ptr->humidity.min, readable_data_write_ptr->humidity.med, readable_data_write_ptr->humidity.max, readable_data_write_ptr->humidity.sigma);
+
}
void samples_processing() {
LOGN(F("SAMPLE PROCESSING"));
- reset_report_buffer();
+ //reset_report_buffer();
make_report();
}