/* ** 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. ** ** Copyright 2023 NXP ** */ #include "phNxpTempMgr.h" #include #include #include #include #include #define PH_NFC_TIMER_ID_INVALID (0xFFFF) #define PH_NXP_TEMPMGR_TOTAL_DELAY (11) static void tempNTf_timeout_cb(uint32_t TimerId, void* pContext) { (void)TimerId; NXPLOG_NCIHAL_D("phNxpTempMgr::tempNTf_timeout_cb timedout"); phNxpTempMgr* tMgr = (phNxpTempMgr*)pContext; tMgr->Reset(false /*reset timer*/); } phNxpTempMgr::phNxpTempMgr() { timeout_timer_id_ = PH_NFC_TIMER_ID_INVALID; is_ic_temp_ok_ = true; total_delay_ms_ = PH_NXP_TEMPMGR_TOTAL_DELAY * 1000; // 11 sec } phNxpTempMgr& phNxpTempMgr::GetInstance() { static phNxpTempMgr nxpTempmgr; return nxpTempmgr; } void phNxpTempMgr::UpdateTempStatusLocked(bool temp_status) { std::lock_guard lock(ic_temp_mutex_); is_ic_temp_ok_ = temp_status; } void phNxpTempMgr::UpdateICTempStatus(uint8_t* p_ntf, uint16_t p_len) { (void)p_len; NFCSTATUS status = NFCSTATUS_FAILED; bool temp_status = p_ntf[03] == 0x00 ? true : false; UpdateTempStatusLocked(temp_status); NXPLOG_NCIHAL_D("phNxpTempMgr: IC temp state is %d", IsICTempOk()); // Temperature status will be notified for only one module at a time. // If temp NOK status was notified for eSE first, next temp status // NTF (OK/NOK) will also be notified for the same module i.e. eSE in this // case if (!IsICTempOk()) { if (timeout_timer_id_ == PH_NFC_TIMER_ID_INVALID) timeout_timer_id_ = phOsalNfc_Timer_Create(); if (timeout_timer_id_ != PH_NFC_TIMER_ID_INVALID) { /* Start timer */ status = phOsalNfc_Timer_Start(timeout_timer_id_, total_delay_ms_, &tempNTf_timeout_cb, this); if (NFCSTATUS_SUCCESS != status) { NXPLOG_NCIHAL_D("tempNtf timer not started!!!"); } } else { NXPLOG_NCIHAL_E("tempNtf timer creation failed"); } } else { if (timeout_timer_id_ != PH_NFC_TIMER_ID_INVALID) { /* Stop Timer */ status = phOsalNfc_Timer_Stop(timeout_timer_id_); if (NFCSTATUS_SUCCESS != status) { NXPLOG_NCIHAL_D("tempNtf timer stop ERROR!!!"); } } } } void phNxpTempMgr::Wait() { if (!IsICTempOk()) { NXPLOG_NCIHAL_D("Wait for %d seconds", total_delay_ms_ / 1000); uint16_t delay_per_try = 500; // millisec while (!IsICTempOk()) { usleep(delay_per_try * 1000); // 500 millisec } } } void phNxpTempMgr::Reset(bool reset_timer) { NXPLOG_NCIHAL_D("phNxpTempMgr::Reset "); UpdateTempStatusLocked(true /*Temp OK*/); if (reset_timer) { timeout_timer_id_ = PH_NFC_TIMER_ID_INVALID; } }