From 82748b9f0e5a4cdc4d10715f10c6160d49d87e75 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Thu, 12 Sep 2024 15:20:17 +0530 Subject: [PATCH] [v1.3][ESP32] Support total operational hours (#35425) (#35501) * [ESP32] Support total operational hours (#35425) * [ESP32] support for total operational hour * remove stale TODOs * Restyled by clang-format --------- Co-authored-by: Restyled.io * fix ci failure --------- Co-authored-by: Restyled.io --- .../ESP32/ConfigurationManagerImpl.cpp | 40 ++++++++++++++++--- src/platform/ESP32/ConfigurationManagerImpl.h | 6 +++ src/test_driver/esp32/sdkconfig.defaults | 1 + 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/platform/ESP32/ConfigurationManagerImpl.cpp b/src/platform/ESP32/ConfigurationManagerImpl.cpp index 37995f4d185a33..d138644d4aab8b 100644 --- a/src/platform/ESP32/ConfigurationManagerImpl.cpp +++ b/src/platform/ESP32/ConfigurationManagerImpl.cpp @@ -45,14 +45,26 @@ namespace DeviceLayer { using namespace ::chip::DeviceLayer::Internal; -// TODO: Define a Singleton instance of CHIP Group Key Store here (#1266) - ConfigurationManagerImpl & ConfigurationManagerImpl::GetDefaultInstance() { static ConfigurationManagerImpl sInstance; return sInstance; } +uint32_t ConfigurationManagerImpl::mTotalOperationalHours = 0; + +void ConfigurationManagerImpl::TotalOperationalHoursTimerCallback(TimerHandle_t timer) +{ + mTotalOperationalHours++; + + CHIP_ERROR err = ConfigurationMgrImpl().StoreTotalOperationalHours(mTotalOperationalHours); + + if (err != CHIP_NO_ERROR) + { + ChipLogError(DeviceLayer, "Failed to store total operational hours: %" CHIP_ERROR_FORMAT, err.Format()); + } +} + CHIP_ERROR ConfigurationManagerImpl::Init() { CHIP_ERROR err; @@ -161,18 +173,34 @@ CHIP_ERROR ConfigurationManagerImpl::Init() SuccessOrExit(err); } - if (!ESP32Config::ConfigValueExists(ESP32Config::kCounterKey_TotalOperationalHours)) + if (CHIP_NO_ERROR != GetTotalOperationalHours(mTotalOperationalHours)) { - err = StoreTotalOperationalHours(0); + err = StoreTotalOperationalHours(mTotalOperationalHours); SuccessOrExit(err); } + { + // Start a timer which reloads every one hour and bumps the total operational hours + TickType_t reloadPeriod = (1000 * 60 * 60) / portTICK_PERIOD_MS; + TimerHandle_t timerHandle = xTimerCreate("tOpHrs", reloadPeriod, pdPASS, nullptr, TotalOperationalHoursTimerCallback); + if (timerHandle == nullptr) + { + err = CHIP_ERROR_NO_MEMORY; + ExitNow(ChipLogError(DeviceLayer, "total operational hours Timer creation failed")); + } + + BaseType_t timerStartStatus = xTimerStart(timerHandle, 0); + if (timerStartStatus == pdFAIL) + { + err = CHIP_ERROR_INTERNAL; + ExitNow(ChipLogError(DeviceLayer, "total operational hours Timer start failed")); + } + } + // Initialize the generic implementation base class. err = Internal::GenericConfigurationManagerImpl::Init(); SuccessOrExit(err); - // TODO: Initialize the global GroupKeyStore object here (#1266) - err = CHIP_NO_ERROR; exit: diff --git a/src/platform/ESP32/ConfigurationManagerImpl.h b/src/platform/ESP32/ConfigurationManagerImpl.h index 3779ac816dc463..391040fc93e789 100644 --- a/src/platform/ESP32/ConfigurationManagerImpl.h +++ b/src/platform/ESP32/ConfigurationManagerImpl.h @@ -35,6 +35,9 @@ #include +#include +#include + namespace chip { namespace DeviceLayer { @@ -96,6 +99,9 @@ class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImp // ===== Private members reserved for use by this class only. static void DoFactoryReset(intptr_t arg); + + static uint32_t mTotalOperationalHours; + static void TotalOperationalHoursTimerCallback(TimerHandle_t timer); }; /** diff --git a/src/test_driver/esp32/sdkconfig.defaults b/src/test_driver/esp32/sdkconfig.defaults index 2770877a587298..9e31d3b9166e20 100644 --- a/src/test_driver/esp32/sdkconfig.defaults +++ b/src/test_driver/esp32/sdkconfig.defaults @@ -31,6 +31,7 @@ CONFIG_ESP_MAIN_TASK_STACK_SIZE=32768 #enable BT CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y #enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y