K74B/87400/usr/common/safetyMonitorTask.c

127 lines
3.6 KiB
C
Raw Permalink Normal View History

2024-01-25 14:22:18 +08:00
/**
* @copyright 2015 Indie Semiconductor.
*
* This file is proprietary to Indie Semiconductor.
* All rights reserved. Reproduction or distribution, in whole
* or in part, is forbidden except by express written permission
* of Indie Semiconductor.
*
* @file safetyMonitorTask.c
* @Author: Jack.Pan
* @E-mail:jack.pan@indiemicro.com
* @Date: 2020/09/10
*/
#include <safetyMonitorTask.h>
#define OVER_TEMPERATURE_HIGH (130) /*celsius degree */
#define OVER_TEMPERATURE_RELEASE (OVER_TEMPERATURE_HIGH - 10U) /*celsius degree */
#define LED_PN_SHORT_VOLT (500U) /* mV */
#define LED_PN_SHORT_OPEN (4000U) /* mV */
#define INTENSITY_RATIO_TYPICAL (1024U) /* 100% of max intensity */
#define INTENSITY_RATIO_HIGH_TEMPERATURE (INTENSITY_RATIO_TYPICAL*4U/5U) /* 80% of max intensity */
#define INTENSITY_RATIO_BATT_ISSUE (0U) /* 0% of max intensity */
static TaskState_t safeMonitorState = TASK_STATE_INIT;
static BatteryState_t battState = BATT_STATE_NORMAL;
static BatteryState_t battLastState = BATT_STATE_NORMAL;
static ChipTemperatureState_t chipTemperatureState = CHIP_TEMPERATURE_STATE_NORMAL;
static ChipTemperatureState_t chipTemperatureLastState = CHIP_TEMPERATURE_STATE_NORMAL;
static void UnderVoltageProtection_ISR(void);
static void OverVoltageProtection_ISR(void);
static void safetyHandle(void);
static void safetyInit(void);
static void safeMonitorTimerExpired(SoftTimer_t *timer);
static SoftTimer_t safeMonitorTimer = {
.mode = TIMER_PERIODIC_MODE,
.interval = 200U,
.handler = safeMonitorTimerExpired
};
static void safeMonitorTimerExpired(SoftTimer_t *timer)
{
TM_PostTask(TASK_ID_SAFETY_MONITOR);
NVIC_EnableIRQ(UV_OV_IRQn);
NVIC_EnableIRQ(OVTEMP_IRQn);
CRGA_SFRS->RESETCTRL.OVTEMPFLAGCLR = 1U;
}
void SAFM_TaskHandler(void)
{
switch(safeMonitorState){
case TASK_STATE_INIT:
safetyInit();
SoftTimer_Start(&safeMonitorTimer);
safeMonitorState = TASK_STATE_ACTIVE;
break;
case TASK_STATE_ACTIVE:
safetyHandle();
break;
default:
break;
}
}
static void safetyHandle(void)
{
/* Battery Voltage Protection Handling */
battState = (BatteryState_t)HW_PROT_GetBattVoltState();
if ((chipTemperatureLastState != chipTemperatureState) || (battLastState != battState)){
chipTemperatureLastState = chipTemperatureState;
battLastState = battState;
if (battState == BATT_STATE_LOW){
}else{
/* Restart OV UV ISR */
PMUA_SFRS->PMUIRQ.CLEAR.OV_CLR = 1U;
PMUA_SFRS->PMUIRQ.CLEAR.UV_CLR = 1U;
NVIC_ClearPendingIRQ(UV_OV_IRQn);
NVIC_EnableIRQ(UV_OV_IRQn);
}
}
}
static void UnderVoltageProtection_ISR(void)
{
TM_PostTask(TASK_ID_SAFETY_MONITOR);
}
static void OverVoltageProtection_ISR(void)
{
TM_PostTask(TASK_ID_SAFETY_MONITOR);
}
static void safetyInit(void)
{
HW_PROT_SetUnderVoltage(UV_VOLT_5_1V,UNDER_VOLT_HYS_830mV, VOLT_DEBOUNCE_TIME_10ms, VOLT_DEBOUNCE_TIME_10ms);
HW_PROT_RegisterUnderVoltageIRQ(UnderVoltageProtection_ISR);
HW_PROT_SetOverVoltage(OV_VOLT_20_0V, OV_VOLT_HYS_1440mV, VOLT_DEBOUNCE_TIME_10ms, VOLT_DEBOUNCE_TIME_10ms);
HW_PROT_RegisterOverVoltageIRQ(OverVoltageProtection_ISR);
}
BatteryState_t SAFM_GetBatteryState(void)
{
return battState;
}
ChipTemperatureState_t SAFM_GetChipTemperatureState(void)
{
return chipTemperatureState;
}