diff --git a/platformio/libraries/SensorDriver/SensorDriver.cpp b/platformio/libraries/SensorDriver/SensorDriver.cpp index cefc19e26..f3395ef80 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,14 @@ 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) { + _is_previous_prepared = _is_current_prepared; + _is_current_prepared = false; + } *_is_prepared = false; } @@ -1188,12 +1195,13 @@ void SensorDriverRain::prepare(bool is_test) { _delay_ms = 0; } + if(!is_test)_is_current_prepared = *_is_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 +1216,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,10 +1301,15 @@ void SensorDriverRain::get(int32_t *values, uint8_t length) { break; case END: - 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]); + + 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(); @@ -1325,8 +1338,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 +1369,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 +1469,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 +1492,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,18 +1735,23 @@ 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])); + } } + } 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); @@ -1764,8 +1787,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 +1820,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 +1850,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 +2176,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 +2238,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 +2324,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 +2581,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 +2682,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 +2768,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 +2945,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 +2979,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 +3065,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 +3517,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 +3604,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 +3665,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 +3839,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/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..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: @@ -242,6 +240,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 +298,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 +397,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) { @@ -555,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"); } @@ -565,6 +579,8 @@ 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"); } @@ -575,6 +591,8 @@ 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"); } @@ -585,6 +603,7 @@ void command_task() { is_start = false; is_stop = true; is_test = true; + commands(); break; case I2C_RAIN_COMMAND_SAVE: @@ -596,8 +615,6 @@ void command_task() { default: LOGE(F("Command UNKNOWN")); } - - commands(); noInterrupts(); is_event_command_task = false; @@ -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(); 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); }