/* * * Copyright (c) 2021 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** @file "gpAppFramework_Reset.c" * * Application API * * Implementation of gpAppFramework Reset */ /***************************************************************************** * Includes Definitions *****************************************************************************/ #define GP_COMPONENT_ID_APPFRAMEWORK 56 #define GP_COMPONENT_ID GP_COMPONENT_ID_APPFRAMEWORK #include "powercycle_counting.h" #include "global.h" #include "gpAssert.h" #include "gpLog.h" #include "gpReset.h" #include "gpSched.h" #include "qvCHIP.h" #include "qvCHIP_KVS.h" /***************************************************************************** * Macro Definitions *****************************************************************************/ #define RESET_COUNTING_PERIOD_US 2000000 // 2s #define KVS_RESET_CYCLES_KEY "qrst" /***************************************************************************** * Static Function Prototypes *****************************************************************************/ /***************************************************************************** * Static Function Definitions *****************************************************************************/ static void gpAppFramework_HardwareResetTriggered(void) { UInt8 resetCounts; qvStatus_t status; size_t readBytesSize; status = qvCHIP_KvsGet(KVS_RESET_CYCLES_KEY, &resetCounts, 1, &readBytesSize, 0); if (status == QV_STATUS_INVALID_DATA) { // No reset count stored yet - create new key resetCounts = 0; } else if (status != QV_STATUS_NO_ERROR) { GP_LOG_SYSTEM_PRINTF("got status %d", 0, status); GP_ASSERT_SYSTEM(status == QV_STATUS_NO_ERROR); // fixme } GP_LOG_SYSTEM_PRINTF("ResetCount[%d]", 0, resetCounts); resetCounts++; status = qvCHIP_KvsPut(KVS_RESET_CYCLES_KEY, &resetCounts, 1); if (status != QV_STATUS_NO_ERROR) { GP_LOG_SYSTEM_PRINTF("got status %d", 0, status); GP_ASSERT_SYSTEM(status == QV_STATUS_NO_ERROR); // fixme } } /***************************************************************************** * Public Function Definitions *****************************************************************************/ UInt8 gpAppFramework_Reset_GetResetCount(void) { UInt8 resetCounts; const UInt8 resetCountsCleared = 0; qvStatus_t status; size_t readBytesSize; status = qvCHIP_KvsGet(KVS_RESET_CYCLES_KEY, &resetCounts, 1, &readBytesSize, 0); if (status == QV_STATUS_INVALID_DATA || readBytesSize != 1) { // Reset count was not stored yet resetCounts = 0; } else if (status != QV_STATUS_NO_ERROR) { GP_LOG_SYSTEM_PRINTF("got status %d", 0, status); GP_ASSERT_SYSTEM(status == QV_STATUS_NO_ERROR); } GP_LOG_PRINTF("Processing reset counts: %u", 0, resetCounts); status = qvCHIP_KvsPut(KVS_RESET_CYCLES_KEY, &resetCountsCleared, 1); if (status != QV_STATUS_NO_ERROR) { GP_LOG_SYSTEM_PRINTF("got status %d", 0, status); GP_ASSERT_SYSTEM(status == QV_STATUS_NO_ERROR); // fixme } return resetCounts; } void gpAppFramework_Reset_Init(void) { if ((gpReset_GetResetReason() == gpReset_ResetReason_HW_Por) || (gpReset_GetResetReason() == gpReset_ResetReason_UnSpecified)) // Use this reset reason for JLink resets { gpAppFramework_HardwareResetTriggered(); } gpSched_ScheduleEvent(RESET_COUNTING_PERIOD_US, gpAppFramework_Reset_cbTriggerResetCountCompleted); }