From ff6ec8c6a809104b693b147c538e19aef6258e58 Mon Sep 17 00:00:00 2001
From: Paolo Patruno
Date: Tue, 15 Mar 2022 17:39:19 +0100
Subject: [PATCH 1/4] close #417
---
.../stima_v3/i2c-rain/src/i2c-rain-config.h | 10 +++++++++
platformio/stima_v3/i2c-rain/src/i2c-rain.h | 12 +++++++++++
platformio/stima_v3/i2c-rain/src/i2c-rain.ino | 20 ++++++++++++++++++
.../stima_v3/i2c-th/src/i2c-th-config.h | 7 +++++++
platformio/stima_v3/i2c-th/src/i2c-th.h | 13 ++++++++++++
platformio/stima_v3/i2c-th/src/i2c-th.ino | 21 ++++++++++++++++++-
6 files changed, 82 insertions(+), 1 deletion(-)
diff --git a/platformio/stima_v3/i2c-rain/src/i2c-rain-config.h b/platformio/stima_v3/i2c-rain/src/i2c-rain-config.h
index e202e2e10..49e1807ab 100644
--- a/platformio/stima_v3/i2c-rain/src/i2c-rain-config.h
+++ b/platformio/stima_v3/i2c-rain/src/i2c-rain-config.h
@@ -169,3 +169,13 @@ WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S
#define TIMER1_TCNT1_VALUE (0xFFFFUL - (TIMER1_INTERRUPT_TIME_MS*1000UL/(1024 / (F_CPU/1000000)))+1)
#endif
+
+/*********************************************************************
+* TASKS
+*********************************************************************/
+
+/*!
+\def TRANSACTION_TIMEOUT_MS
+\brief Timeout for command transaction.
+*/
+#define TRANSACTION_TIMEOUT_MS (12000)
diff --git a/platformio/stima_v3/i2c-rain/src/i2c-rain.h b/platformio/stima_v3/i2c-rain/src/i2c-rain.h
index e9d483e20..b3516c120 100644
--- a/platformio/stima_v3/i2c-rain/src/i2c-rain.h
+++ b/platformio/stima_v3/i2c-rain/src/i2c-rain.h
@@ -209,6 +209,18 @@ volatile uint8_t ready_tasks_count;
*/
uint32_t awakened_event_occurred_time_ms;
+/*!
+\var inside_transaction
+\brief Status of command transaction.
+*/
+volatile bool inside_transaction;
+
+/*!
+\var transaction_time
+\brief Timer counter variable for compute command transaction timeout.
+*/
+volatile uint16_t transaction_time;
+
/*!
\var is_start
\brief Execute start command.
diff --git a/platformio/stima_v3/i2c-rain/src/i2c-rain.ino b/platformio/stima_v3/i2c-rain/src/i2c-rain.ino
index c9726e073..596cbea5b 100644
--- a/platformio/stima_v3/i2c-rain/src/i2c-rain.ino
+++ b/platformio/stima_v3/i2c-rain/src/i2c-rain.ino
@@ -242,6 +242,9 @@ void init_tasks() {
// reset tipping bucket debounce value
rain_tips_event_occurred_time_ms = -configuration.tipping_bucket_time_ms;
interrupts();
+
+ transaction_time = 0;
+ inside_transaction = false;
}
void init_pins() {
@@ -297,6 +300,16 @@ ISR(TIMER1_OVF_vect) {
//! Pre-load timer counter register
TCNT1 = TIMER1_TCNT1_VALUE;
i2c_time+=TIMER1_INTERRUPT_TIME_MS/1000;
+
+ if (inside_transaction) {
+ //! increment transaction_time by TIMER1_INTERRUPT_TIME_MS
+ transaction_time += TIMER1_INTERRUPT_TIME_MS;
+
+ if (transaction_time >= TRANSACTION_TIMEOUT_MS) {
+ transaction_time = 0;
+ inside_transaction = false;
+ }
+ }
}
#endif
@@ -386,6 +399,8 @@ void i2c_request_interrupt_handler() {
// 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);
Wire.write(crc8((uint8_t *)readable_data_read_ptr+readable_data_address, readable_data_length));
+
+ inside_transaction = false;
}
void i2c_receive_interrupt_handler(int rx_data_length) {
@@ -565,6 +580,7 @@ void command_task() {
LOGN(F("Execute [ %s ]"), "ONESHOT STOP");
is_start = false;
is_stop = true;
+ inside_transaction = true;
} else {
LOGE(F("Skip command [ %s ] in continous mode"), "ONESHOT STOP");
}
@@ -575,6 +591,7 @@ void command_task() {
LOGN(F("Execute [ %s ]"), "ONESHOT START-STOP");
is_start = true;
is_stop = true;
+ inside_transaction = true;
} else {
LOGE(F("Skip command [ %s ] in continous mode"), "ONESHOT START-STOP");
}
@@ -608,6 +625,9 @@ void command_task() {
void commands() {
+
+ if (inside_transaction) return;
+
noInterrupts();
if (configuration.is_oneshot){
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 b7ade5dd2..193c6b8a6 100644
--- a/platformio/stima_v3/i2c-th/src/i2c-th-config.h
+++ b/platformio/stima_v3/i2c-th/src/i2c-th-config.h
@@ -227,4 +227,11 @@ setting it to 3980 ms we gain 20 ms every sample, 300 ms every observation, 4500
*/
#define SENSORS_RETRY_DELAY_MS (100)
+/*!
+\def TRANSACTION_TIMEOUT_MS
+\brief Timeout for command transaction.
+*/
+#define TRANSACTION_TIMEOUT_MS (12000)
+
+
#endif
diff --git a/platformio/stima_v3/i2c-th/src/i2c-th.h b/platformio/stima_v3/i2c-th/src/i2c-th.h
index fa6ad6cec..4cb09857f 100644
--- a/platformio/stima_v3/i2c-th/src/i2c-th.h
+++ b/platformio/stima_v3/i2c-th/src/i2c-th.h
@@ -246,6 +246,19 @@ volatile uint8_t ready_tasks_count;
*/
uint32_t awakened_event_occurred_time_ms;
+/*!
+\var inside_transaction
+\brief Status of command transaction.
+*/
+volatile bool inside_transaction;
+
+/*!
+\var transaction_time
+\brief Timer counter variable for compute command transaction timeout.
+*/
+volatile uint16_t transaction_time;
+
+
/*!
\var is_start
\brief Execute start command.
diff --git a/platformio/stima_v3/i2c-th/src/i2c-th.ino b/platformio/stima_v3/i2c-th/src/i2c-th.ino
index f26439264..dc1b1057a 100644
--- a/platformio/stima_v3/i2c-th/src/i2c-th.ino
+++ b/platformio/stima_v3/i2c-th/src/i2c-th.ino
@@ -228,7 +228,8 @@ void init_tasks() {
is_start = false;
is_stop = false;
is_test_read = false;
-
+ transaction_time = 0;
+ inside_transaction = false;
}
void init_pins() {
@@ -399,6 +400,16 @@ ISR(TIMER1_OVF_vect) {
if (timer_counter >= TIMER1_VALUE_MAX_MS) {
timer_counter = 0;
}
+
+ if (inside_transaction) {
+ //! increment transaction_time by TIMER1_INTERRUPT_TIME_MS
+ transaction_time += TIMER1_INTERRUPT_TIME_MS;
+
+ if (transaction_time >= TRANSACTION_TIMEOUT_MS) {
+ transaction_time = 0;
+ inside_transaction = false;
+ }
+ }
}
void i2c_request_interrupt_handler() {
@@ -427,6 +438,8 @@ void i2c_request_interrupt_handler() {
readable_data_address=0xFF;
readable_data_length=0;
+ inside_transaction = false;
+
}
void i2c_receive_interrupt_handler(int rx_data_length) {
@@ -1026,6 +1039,7 @@ void command_task() {
is_stop = true;
is_test_read = false;
commands();
+ inside_transaction = true;
break;
case I2C_TH_COMMAND_ONESHOT_START_STOP:
@@ -1034,6 +1048,7 @@ void command_task() {
is_stop = true;
is_test_read = false;
commands();
+ inside_transaction = true;
break;
case I2C_TH_COMMAND_CONTINUOUS_START:
@@ -1050,6 +1065,7 @@ void command_task() {
is_stop = true;
is_test_read = false;
commands();
+ inside_transaction = true;
break;
case I2C_TH_COMMAND_CONTINUOUS_START_STOP:
@@ -1058,6 +1074,7 @@ void command_task() {
is_stop = true;
is_test_read = false;
commands();
+ inside_transaction = true;
break;
case I2C_TH_COMMAND_TEST_READ:
@@ -1097,6 +1114,8 @@ void copy_buffers() {
void commands() {
+ if (inside_transaction) return;
+
//! CONTINUOUS TEST
if (!configuration.is_oneshot && is_start && !is_stop && is_test_read) {
copy_buffers();
From c7fc6d2e4e2af77db970916ff4c2b5914e8fdbed Mon Sep 17 00:00:00 2001
From: Paolo Patruno
Date: Tue, 15 Mar 2022 21:54:42 +0100
Subject: [PATCH 2/4] bugs in transaction management
---
platformio/stima_v3/i2c-rain/src/i2c-rain.ino | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/platformio/stima_v3/i2c-rain/src/i2c-rain.ino b/platformio/stima_v3/i2c-rain/src/i2c-rain.ino
index 596cbea5b..eab2ec7de 100644
--- a/platformio/stima_v3/i2c-rain/src/i2c-rain.ino
+++ b/platformio/stima_v3/i2c-rain/src/i2c-rain.ino
@@ -1,5 +1,3 @@
-/**@file i2c-rain.ino */
-
/*********************************************************************
Copyright (C) 2022 Marco Baldinetti
authors:
@@ -570,6 +568,7 @@ void command_task() {
LOGN(F("Execute [ %s ]"), "ONESHOT START");
is_start = true;
is_stop = false;
+ commands();
} else {
LOGE(F("Skip command [ %s ] in continous mode"), "ONESHOT START");
}
@@ -580,6 +579,7 @@ void command_task() {
LOGN(F("Execute [ %s ]"), "ONESHOT STOP");
is_start = false;
is_stop = true;
+ commands();
inside_transaction = true;
} else {
LOGE(F("Skip command [ %s ] in continous mode"), "ONESHOT STOP");
@@ -591,6 +591,7 @@ void command_task() {
LOGN(F("Execute [ %s ]"), "ONESHOT START-STOP");
is_start = true;
is_stop = true;
+ commands();
inside_transaction = true;
} else {
LOGE(F("Skip command [ %s ] in continous mode"), "ONESHOT START-STOP");
@@ -602,6 +603,7 @@ void command_task() {
is_start = false;
is_stop = true;
is_test = true;
+ commands();
break;
case I2C_RAIN_COMMAND_SAVE:
@@ -613,8 +615,6 @@ void command_task() {
default:
LOGE(F("Command UNKNOWN"));
}
-
- commands();
noInterrupts();
is_event_command_task = false;
From a1bd1bc79704b4411d57afc29cb0ff8bec5d8194 Mon Sep 17 00:00:00 2001
From: Paolo Patruno
Date: Thu, 17 Mar 2022 10:26:36 +0100
Subject: [PATCH 3/4] close #419
---
.../libraries/SensorDriver/SensorDriver.cpp | 135 ++++++++++--------
.../libraries/SensorDriver/SensorDriver.h | 80 ++++++-----
platformio/stima_v3/stima/src/stima.ino | 4 +-
3 files changed, 123 insertions(+), 96 deletions(-)
diff --git a/platformio/libraries/SensorDriver/SensorDriver.cpp b/platformio/libraries/SensorDriver/SensorDriver.cpp
index cefc19e26..b25ef9b12 100644
--- a/platformio/libraries/SensorDriver/SensorDriver.cpp
+++ b/platformio/libraries/SensorDriver/SensorDriver.cpp
@@ -110,6 +110,7 @@ void SensorDriver::init(const uint8_t address, const uint8_t node, bool *is_sett
_node = node;
_start_time_ms = 0;
_is_setted = is_setted;
+ _is_previous_prepared = false;
_is_prepared = is_prepared;
_error_count = 0;
}
@@ -121,15 +122,15 @@ void SensorDriver::setup(){
void SensorDriver::prepare(bool is_test){
}
-void SensorDriver::get(int32_t *values, uint8_t length){
+void SensorDriver::get(int32_t *values, uint8_t length, bool is_test){
}
#if (USE_JSON)
-void SensorDriver::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length){
+void SensorDriver::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test){
}
#endif
-void SensorDriver::resetPrepared(){
+void SensorDriver::resetPrepared(bool is_test){
}
void SensorDriver::resetSetted(){
@@ -234,7 +235,7 @@ void SensorDriver::printInfo() {
//------------------------------------------------------------------------------
#if (USE_SENSOR_ADT)
-void SensorDriverAdt7420::resetPrepared() {
+void SensorDriverAdt7420::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -292,7 +293,7 @@ void SensorDriverAdt7420::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverAdt7420::get(int32_t *values, uint8_t length) {
+void SensorDriverAdt7420::get(int32_t *values, uint8_t length, bool is_test) {
uint8_t msb;
uint8_t lsb;
@@ -401,8 +402,8 @@ void SensorDriverAdt7420::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverAdt7420::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverAdt7420::get(values, length);
+void SensorDriverAdt7420::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverAdt7420::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -426,7 +427,7 @@ void SensorDriverAdt7420::getJson(int32_t *values, uint8_t length, char *json_bu
//------------------------------------------------------------------------------
#if (USE_SENSOR_HIH)
-void SensorDriverHih6100::resetPrepared() {
+void SensorDriverHih6100::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -480,7 +481,7 @@ void SensorDriverHih6100::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverHih6100::get(int32_t *values, uint8_t length) {
+void SensorDriverHih6100::get(int32_t *values, uint8_t length, bool is_test) {
uint8_t x;
uint8_t y;
uint8_t s;
@@ -615,8 +616,8 @@ void SensorDriverHih6100::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverHih6100::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverHih6100::get(values, length);
+void SensorDriverHih6100::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverHih6100::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -647,7 +648,7 @@ void SensorDriverHih6100::getJson(int32_t *values, uint8_t length, char *json_bu
//------------------------------------------------------------------------------
#if (USE_SENSOR_HYT)
-void SensorDriverHyt2X1::resetPrepared() {
+void SensorDriverHyt2X1::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -688,7 +689,7 @@ void SensorDriverHyt2X1::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverHyt2X1::get(int32_t *values, uint8_t length) {
+void SensorDriverHyt2X1::get(int32_t *values, uint8_t length, bool is_test) {
uint8_t status = HYT2X1_ERROR;
switch (_get_state) {
@@ -811,8 +812,8 @@ void SensorDriverHyt2X1::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverHyt2X1::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverHyt2X1::get(values, length);
+void SensorDriverHyt2X1::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverHyt2X1::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -852,7 +853,7 @@ void SensorDriverDw1::getSDfromUV(int32_t u, int32_t v, double *speed, double *d
*direction = ((uint16_t) *direction) % 360;
}
-void SensorDriverDw1::resetPrepared() {
+void SensorDriverDw1::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -902,7 +903,7 @@ void SensorDriverDw1::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverDw1::get(int32_t *values, uint8_t length) {
+void SensorDriverDw1::get(int32_t *values, uint8_t length, bool is_test) {
speed = INT32_MAX;
direction = INT32_MAX;
uint16_t msb;
@@ -1088,8 +1089,8 @@ void SensorDriverDw1::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverDw1::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverDw1::get(values, length);
+void SensorDriverDw1::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverDw1::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -1123,8 +1124,16 @@ void SensorDriverDw1::getJson(int32_t *values, uint8_t length, char *json_buffer
#if (USE_SENSOR_TBS || USE_SENSOR_TBR)
-void SensorDriverRain::resetPrepared() {
+void SensorDriverRain::resetPrepared(bool is_test) {
+
+
_get_state = INIT;
+ if (!is_test) {
+ LOGN(F("reset prepared pre -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
+ _is_previous_prepared = _is_current_prepared;
+ _is_current_prepared = false;
+ LOGN(F("reset prepared post-> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
+ }
*_is_prepared = false;
}
@@ -1188,12 +1197,15 @@ void SensorDriverRain::prepare(bool is_test) {
_delay_ms = 0;
}
+ LOGN(F("prepare pre -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
+ if(!is_test)_is_current_prepared = *_is_prepared;
+ LOGN(F("prepare post-> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
LOGT(F(" prepare... [ %s ]"), _is_success ? OK_STRING : ERROR_STRING);
_start_time_ms = millis();
}
-void SensorDriverRain::get(int32_t *values, uint8_t length) {
+void SensorDriverRain::get(int32_t *values, uint8_t length, bool is_test) {
uint8_t data_length;
bool is_i2c_write;
uint8_t i;
@@ -1208,7 +1220,7 @@ void SensorDriverRain::get(int32_t *values, uint8_t length) {
_is_readed = false;
_is_end = false;
- if (*_is_prepared && length >= 1) {
+ if ( *_is_prepared && length >= 1) {
_is_success = true;
_get_state = SET_RAIN_ADDRESS;
}
@@ -1293,7 +1305,9 @@ void SensorDriverRain::get(int32_t *values, uint8_t length) {
break;
case END:
- if (length >= 1) {
+
+ LOGN(F("get -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
+ if (((_is_previous_prepared && !is_test) || (_is_current_prepared && is_test)) && length >= 1) {
if ( ISVALID_UINT8(rain_data[0]) || ISVALID_UINT8(rain_data[1])){
values[0] = (uint16_t)(rain_data[1] << 8) | (rain_data[0]);
}
@@ -1325,8 +1339,8 @@ void SensorDriverRain::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverRain::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverRain::get(values, length);
+void SensorDriverRain::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverRain::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -1356,8 +1370,12 @@ void SensorDriverRain::getJson(int32_t *values, uint8_t length, char *json_buffe
#if (USE_SENSOR_STH || USE_SENSOR_ITH || USE_SENSOR_MTH || USE_SENSOR_NTH || USE_SENSOR_XTH)
-void SensorDriverTh::resetPrepared() {
+void SensorDriverTh::resetPrepared(bool is_test) {
_get_state = INIT;
+ if (!is_test) {
+ _is_previous_prepared = _is_current_prepared;
+ _is_current_prepared = false;
+ }
*_is_prepared = false;
}
@@ -1452,12 +1470,13 @@ void SensorDriverTh::prepare(bool is_test) {
_delay_ms = 0;
}
+ if(!is_test)_is_current_prepared = *_is_prepared;
LOGT(F("th prepare... [ %s ]"), _is_success ? OK_STRING : ERROR_STRING);
_start_time_ms = millis();
}
-void SensorDriverTh::get(int32_t *values, uint8_t length) {
+void SensorDriverTh::get(int32_t *values, uint8_t length, bool is_test) {
uint8_t data_length;
bool is_i2c_write;
uint8_t i;
@@ -1474,7 +1493,7 @@ void SensorDriverTh::get(int32_t *values, uint8_t length) {
_is_readed = false;
_is_end = false;
- if (*_is_prepared && length >= 1) {
+ if ( *_is_prepared && length >= 1) {
LOGT(F("th get INIT"));
_is_success = true;
_get_state = SET_TEMPERATURE_ADDRESS;
@@ -1717,15 +1736,17 @@ void SensorDriverTh::get(int32_t *values, uint8_t length) {
break;
case END:
- if (length >= 1) {
- if (_is_success && ( ISVALID_UINT8(temperature_data[0]) || ISVALID_UINT8(temperature_data[1] ))) {
- values[0] = ((int32_t)(temperature_data[1] << 8) | (temperature_data[0]));
+ if ((_is_previous_prepared && !is_test) || (_is_current_prepared && is_test)) {
+ if (length >= 1) {
+ if (( ISVALID_UINT8(temperature_data[0]) || ISVALID_UINT8(temperature_data[1] ))) {
+ values[0] = ((int32_t)(temperature_data[1] << 8) | (temperature_data[0]));
+ }
}
- }
- if (length >= 2) {
- if (_is_success && ( ISVALID_UINT8(humidity_data[0]) || ISVALID_UINT8(humidity_data[1] ))) {
- values[1] = ((int32_t)(humidity_data[1] << 8) | (humidity_data[0]));
+ if (length >= 2) {
+ if (( ISVALID_UINT8(humidity_data[0]) || ISVALID_UINT8(humidity_data[1] ))) {
+ values[1] = ((int32_t)(humidity_data[1] << 8) | (humidity_data[0]));
+ }
}
}
@@ -1764,8 +1785,8 @@ void SensorDriverTh::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverTh::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverTh::get(values, length);
+void SensorDriverTh::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverTh::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -1797,7 +1818,7 @@ void SensorDriverTh::getJson(int32_t *values, uint8_t length, char *json_buffer,
#if (USE_SENSOR_DEP)
-void SensorDriverDigitecoPower::resetPrepared() {
+void SensorDriverDigitecoPower::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -1827,7 +1848,7 @@ void SensorDriverDigitecoPower::prepare(bool is_test) {
LOGT(F(" prepare... [ %s ]"), OK_STRING);
}
-void SensorDriverDigitecoPower::get(int32_t *values, uint8_t length) {
+void SensorDriverDigitecoPower::get(int32_t *values, uint8_t length, bool is_test) {
switch (_get_state) {
case INIT:
@@ -2153,8 +2174,8 @@ void SensorDriverDigitecoPower::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverDigitecoPower::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverDigitecoPower::get(values, length);
+void SensorDriverDigitecoPower::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverDigitecoPower::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -2215,7 +2236,7 @@ void SensorDriverDigitecoPower::getJson(int32_t *values, uint8_t length, char *j
//------------------------------------------------------------------------------
#if (USE_SENSOR_DWA || USE_SENSOR_DWB || USE_SENSOR_DWC || USE_SENSOR_DWD || USE_SENSOR_DWE || USE_SENSOR_DWF)
-void SensorDriverWind::resetPrepared() {
+void SensorDriverWind::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -2301,7 +2322,7 @@ void SensorDriverWind::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverWind::get(int32_t *values, uint8_t length) {
+void SensorDriverWind::get(int32_t *values, uint8_t length, bool is_test) {
bool is_i2c_write;
uint8_t i;
@@ -2558,8 +2579,8 @@ void SensorDriverWind::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverWind::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverWind::get(values, length);
+void SensorDriverWind::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverWind::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -2659,7 +2680,7 @@ void SensorDriverWind::getJson(int32_t *values, uint8_t length, char *json_buffe
//------------------------------------------------------------------------------
#if (USE_SENSOR_DSA)
-void SensorDriverSolarRadiation::resetPrepared() {
+void SensorDriverSolarRadiation::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -2745,7 +2766,7 @@ void SensorDriverSolarRadiation::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverSolarRadiation::get(int32_t *values, uint8_t length) {
+void SensorDriverSolarRadiation::get(int32_t *values, uint8_t length, bool is_test) {
bool is_i2c_write;
uint8_t i;
@@ -2922,8 +2943,8 @@ void SensorDriverSolarRadiation::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverSolarRadiation::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverSolarRadiation::get(values, length);
+void SensorDriverSolarRadiation::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverSolarRadiation::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
@@ -2956,7 +2977,7 @@ void SensorDriverSolarRadiation::getJson(int32_t *values, uint8_t length, char *
//------------------------------------------------------------------------------
#if (USE_SENSOR_OA2 || USE_SENSOR_OB2 || USE_SENSOR_OC2 || USE_SENSOR_OD2 || USE_SENSOR_OA3 || USE_SENSOR_OB3 || USE_SENSOR_OC3 || USE_SENSOR_OD3 || USE_SENSOR_OE3)
-void SensorDriverOpc::resetPrepared() {
+void SensorDriverOpc::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -3042,7 +3063,7 @@ void SensorDriverOpc::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverOpc::get(int32_t *values, uint8_t length) {
+void SensorDriverOpc::get(int32_t *values, uint8_t length, bool is_test) {
bool is_i2c_write;
uint8_t i;
@@ -3494,8 +3515,8 @@ void SensorDriverOpc::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverOpc::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverOpc::get(values, length);
+void SensorDriverOpc::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverOpc::get(values, length, is_test);
uint8_t variable_length;
if (_is_end && !_is_readed) {
@@ -3581,7 +3602,7 @@ void SensorDriverOpc::getJson(int32_t *values, uint8_t length, char *json_buffer
//------------------------------------------------------------------------------
#if (USE_SENSOR_LWT)
-void SensorDriverLeaf::resetPrepared() {
+void SensorDriverLeaf::resetPrepared(bool is_test) {
_get_state = INIT;
*_is_prepared = false;
}
@@ -3642,7 +3663,7 @@ void SensorDriverLeaf::prepare(bool is_test) {
_start_time_ms = millis();
}
-void SensorDriverLeaf::get(int32_t *values, uint8_t length) {
+void SensorDriverLeaf::get(int32_t *values, uint8_t length, bool is_test) {
bool is_i2c_write;
uint8_t i;
@@ -3816,8 +3837,8 @@ void SensorDriverLeaf::get(int32_t *values, uint8_t length) {
}
#if (USE_JSON)
-void SensorDriverLeaf::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length) {
- SensorDriverLeaf::get(values, length);
+void SensorDriverLeaf::getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length, bool is_test) {
+ SensorDriverLeaf::get(values, length, is_test);
if (_is_end && !_is_readed) {
StaticJsonDocument json;
diff --git a/platformio/libraries/SensorDriver/SensorDriver.h b/platformio/libraries/SensorDriver/SensorDriver.h
index ba3cda06a..5764d3dd4 100644
--- a/platformio/libraries/SensorDriver/SensorDriver.h
+++ b/platformio/libraries/SensorDriver/SensorDriver.h
@@ -121,6 +121,7 @@ class SensorDriver {
/*!
\fn void prepare()
\brief Prepare sensor.
+ \param[in] test set test mode.
\return void.
*/
virtual void prepare(bool is_test = false);
@@ -130,9 +131,10 @@ class SensorDriver {
\brief Get value from sensor.
\param[out] *values pointer to array for getting multiple sensor's value.
\param[in] length number of values readed from sensor.
+ \param[in] test set test mode.
\return void.
*/
- virtual void get(int32_t *values, uint8_t length);
+ virtual void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
/*!
@@ -142,9 +144,10 @@ class SensorDriver {
\param[in] length number of values readed from sensor.
\param[out] *json_buffer pointer to buffer for getting JSON string.
\param[in] json_buffer_length maximum length of JSON string.s
+ \param[in] test set test mode.
\return void.
*/
- virtual void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ virtual void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
/*!
@@ -232,11 +235,12 @@ class SensorDriver {
void resetSetted();
/*!
- \fn void resetPrepared()
+ \fn void resetPrepared(bool is_test = false)
\brief Reset preapred internal state of sensor.
+ \param[in] test set test mode.
\return void.
*/
- virtual void resetPrepared();
+ virtual void resetPrepared(bool is_test = false);
/*!
\fn uint8_t getErrorCount()
@@ -316,6 +320,8 @@ class SensorDriver {
bool _is_test;
bool *_is_setted;
bool *_is_prepared;
+ bool _is_previous_prepared;
+ bool _is_current_prepared;
/*!
\fn void printInfo(const char* driver, const char* type, const uint8_t address = 0, const uint8_t node = 0)
@@ -339,13 +345,13 @@ class SensorDriverAdt7420 : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -375,13 +381,13 @@ class SensorDriverHih6100 : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -413,13 +419,13 @@ class SensorDriverHyt2X1 : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -455,14 +461,14 @@ class SensorDriverDw1 : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
void getSDfromUV(int32_t u, int32_t v, double *speed, double *direction);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -498,13 +504,13 @@ class SensorDriverRain : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -537,13 +543,13 @@ class SensorDriverTh : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -578,13 +584,13 @@ class SensorDriverDigitecoPower : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -631,13 +637,13 @@ class SensorDriverWind : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -667,13 +673,13 @@ class SensorDriverSolarRadiation : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -703,13 +709,13 @@ class SensorDriverOpc : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
@@ -749,13 +755,13 @@ class SensorDriverLeaf : public SensorDriver {
};
void setup();
void prepare(bool is_test = false);
- void get(int32_t *values, uint8_t length);
+ void get(int32_t *values, uint8_t length, bool is_test=false);
#if (USE_JSON)
- void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH);
+ void getJson(int32_t *values, uint8_t length, char *json_buffer, size_t json_buffer_length = JSON_BUFFER_LENGTH, bool is_test=false);
#endif
- void resetPrepared();
+ void resetPrepared(bool is_test = false);
protected:
diff --git a/platformio/stima_v3/stima/src/stima.ino b/platformio/stima_v3/stima/src/stima.ino
index a641a9563..22314e081 100644
--- a/platformio/stima_v3/stima/src/stima.ino
+++ b/platformio/stima_v3/stima/src/stima.ino
@@ -2336,7 +2336,7 @@ void sensors_reading_task (bool do_prepare, bool do_get, char *driver, char *typ
}
else {
for (i=0; iresetPrepared();
+ sensors[i]->resetPrepared(is_test);
}
i = 0;
}
@@ -2445,7 +2445,7 @@ void sensors_reading_task (bool do_prepare, bool do_get, char *driver, char *typ
case SENSORS_READING_GET:
int32_t values_readed_from_sensor[VALUES_TO_READ_FROM_SENSOR_COUNT];
- sensors[i]->getJson(&values_readed_from_sensor[0], VALUES_TO_READ_FROM_SENSOR_COUNT,json_sensors_data_test);
+ sensors[i]->getJson(&values_readed_from_sensor[0], VALUES_TO_READ_FROM_SENSOR_COUNT,json_sensors_data_test,JSON_BUFFER_LENGTH,is_test);
if (!is_test) {
strcpy(json_sensors_data[i],json_sensors_data_test);
}
From c841bc8584abeb651f602eaf28114c2cdf53b1cc Mon Sep 17 00:00:00 2001
From: Paolo Patruno
Date: Thu, 17 Mar 2022 10:43:06 +0100
Subject: [PATCH 4/4] better logging
---
.../libraries/SensorDriver/SensorDriver.cpp | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/platformio/libraries/SensorDriver/SensorDriver.cpp b/platformio/libraries/SensorDriver/SensorDriver.cpp
index b25ef9b12..f3395ef80 100644
--- a/platformio/libraries/SensorDriver/SensorDriver.cpp
+++ b/platformio/libraries/SensorDriver/SensorDriver.cpp
@@ -1129,10 +1129,8 @@ void SensorDriverRain::resetPrepared(bool is_test) {
_get_state = INIT;
if (!is_test) {
- LOGN(F("reset prepared pre -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
_is_previous_prepared = _is_current_prepared;
_is_current_prepared = false;
- LOGN(F("reset prepared post-> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
}
*_is_prepared = false;
}
@@ -1197,9 +1195,7 @@ void SensorDriverRain::prepare(bool is_test) {
_delay_ms = 0;
}
- LOGN(F("prepare pre -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
if(!is_test)_is_current_prepared = *_is_prepared;
- LOGN(F("prepare post-> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
LOGT(F(" prepare... [ %s ]"), _is_success ? OK_STRING : ERROR_STRING);
_start_time_ms = millis();
@@ -1306,11 +1302,14 @@ void SensorDriverRain::get(int32_t *values, uint8_t length, bool is_test) {
case END:
- LOGN(F("get -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
- if (((_is_previous_prepared && !is_test) || (_is_current_prepared && is_test)) && length >= 1) {
- if ( ISVALID_UINT8(rain_data[0]) || ISVALID_UINT8(rain_data[1])){
- values[0] = (uint16_t)(rain_data[1] << 8) | (rain_data[0]);
+ if (((_is_previous_prepared && !is_test) || (_is_current_prepared && is_test))){
+ if (length >= 1) {
+ if ( ISVALID_UINT8(rain_data[0]) || ISVALID_UINT8(rain_data[1])){
+ values[0] = (uint16_t)(rain_data[1] << 8) | (rain_data[0]);
+ }
}
+ } else {
+ LOGE(F("rain driver status error -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
}
SensorDriver::printInfo();
@@ -1748,8 +1747,11 @@ void SensorDriverTh::get(int32_t *values, uint8_t length, bool is_test) {
values[1] = ((int32_t)(humidity_data[1] << 8) | (humidity_data[0]));
}
}
+ } else {
+ LOGE(F("th driver status error -> previous:%T current:%T"),_is_previous_prepared,_is_current_prepared );
}
+
SensorDriver::printInfo();
if (_is_success){
LOGT(F("th get... [ %s ]"), OK_STRING);