LL01/code_app_out/Source/app/fault_detect.c
2025-04-26 16:03:23 +08:00

547 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**********************************************************************************
Copyright: Science&Technology Co., Ltd. 2012-2016. All rights reserved.
File name: power_manage.c
Author:
ID
Version: V1.0.0
Date: 2019.09.05
Description:
Others:
History:
**********************************************************************************/
//#include "derivative.h"
#include "system_config.h"
#include "fault_detect.h"
#include "common_memory.h"
//#include "power_drive.h"
#include "crc.h"
#include "key_adc_mid_cfg.h"
#include "Demm.h"
#include "key_digital_driver_cfg.h"
#include "system_voltage_manage.h"
static void fault_detect_vin(void);
static void fault_detect_vehicle_cfginfo(void);
static u8 fault_detect_get_event(u8 event);
static void fault_detect_power_task(void);
static void fault_detect_ign_task(void);
static void fault_detect_his_task(void);
typedef struct
{
u8 ign_state;
u8 power_state;
u16 ign_timecount;
u16 power_timecount;
u8 his_power_count;
}fault_detect_s;
static power_supply_history_detect_s g_power_supply_history_detect;
static fault_detect_s g_fault_detect;
static vehicle_cfg_s g_vehicle_cfg;
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
void fault_detect_init(void)
{
#if 0
common_memory_clear((u8*)&g_power_supply_history_detect,(u16)sizeof(power_supply_history_detect_s));
common_memory_clear((u8*)&g_fault_detect,(u16)sizeof(fault_detect_s));
common_memory_clear((u8*)&g_vehicle_cfg,(u16)sizeof(vehicle_cfg_s));
g_power_supply_history_detect.count = 0;
g_vehicle_cfg.cds = VEHICLE_CFG_CDS_VALUE_NONE;
g_fault_detect.power_state=FAULT_DETECT_STATE_IDLE;
g_fault_detect.ign_state=FAULT_DETECT_STATE_IDLE;
#endif
}
//寫入一次記錄
void fault_detect_input_power_history(const power_supply_history_s *input_power)
{
#if 0
u8 i;
g_power_supply_history_detect.count++;
if(g_power_supply_history_detect.count>=POWER_SUPPLY_HIS_MAX)
{
g_power_supply_history_detect.count=0;
}
i=g_power_supply_history_detect.count;
common_memory_copys((u8*)&g_power_supply_history_detect.his[i],(u8*)input_power,sizeof(power_supply_history_s));
#endif
}
//將十次記錄都讀取
void fault_detect_get_power_history(power_supply_history_s *out_power,u8 *p_len)
{
#if 0
u8 i,j;
power_supply_history_s *lp_his;
//u8 l_buf[POWER_SUPPLY_HIS_MAX];
*p_len = POWER_SUPPLY_HIS_MAX;
lp_his = out_power;
for(i=0;i<POWER_SUPPLY_HIS_MAX;i++)
{
if(g_power_supply_history_detect.count >=i)
{
j=g_power_supply_history_detect.count-i;
}
else
{
j=POWER_SUPPLY_HIS_MAX+g_power_supply_history_detect.count-i;
}
//l_buf[i] = j;
common_memory_copys((u8*)lp_his,(const u8 *)&g_power_supply_history_detect.his[j],(u16)sizeof(power_supply_history_s));
lp_his++;
}
#endif
}
static void fault_detect_vin(void)
{
#if 0
u8 l_crc;
u8 l_buf[SYSDID_F190_VIN_CK_LEN];
//读取vin
(void)nvm_read_bytes(NVM_TYPE_EEPROM,SYSDID_F190_VIN_ADDR,(u8*)&l_buf[0],SYSDID_F190_VIN_CK_LEN);
l_crc = crc8_make_by_table(CRC8_ID_FOR_E2E_L2,&l_buf[0],SYSDID_F190_VIN_LEN);
if(l_crc == l_buf[SYSDID_F190_VIN_LEN]) //校验通过
{
dem_set_test_result(DTC_VIN_NOT_WRITE_ID, DTC_TEST_STATE_PASSED);
}
else
{
//不通过,表示未写入
dem_set_test_result(DTC_VIN_NOT_WRITE_ID, DTC_TEST_STATE_FAILED);
}
#endif
}
static void fault_detect_vehicle_cfginfo(void)
{
#if 0
u8 l_crc;
u8 l_buf[SYSDID_VEHICLE_CONFIG_CK_LEN];
//读取车辆配置信息
(void)nvm_read_bytes(NVM_TYPE_EEPROM,SYSDID_VEHICLE_CONFIG_ADDR,(u8*)&l_buf[0],SYSDID_VEHICLE_CONFIG_CK_LEN);
//cal_read_did(0xF100u,(u8*)&l_buf[0],SYSDID_ATTEMP_LEN+SYSDID_ATTEMP_MAX_LEN);
l_crc = crc8_make_by_table(CRC8_ID_FOR_E2E_L2,&l_buf[0],SYSDID_VEHICLE_CONFIG_LEN);
if(l_crc == l_buf[SYSDID_VEHICLE_CONFIG_LEN]) //校验通过
{
if( (l_buf[0]==VEHICLE_CFG_CDS_VALUE_DEFAULT) || (l_buf[0]==VEHICLE_CFG_CDS_VALUE_NONE) )
{
dem_set_test_result(DTC_VCS_INVALID_ID, DTC_TEST_STATE_FAILED);
}
#if 1
else if( (l_buf[0]==VEHICLE_CFG_CDS_VALUE_ADAS) || (l_buf[0]==VEHICLE_CFG_CDS_VALUE_CF) )
{
dem_set_test_result(DTC_VCS_INVALID_ID, DTC_TEST_STATE_PASSED);
}
#endif
else
{
}
}
else
{
//不通过,表示未写入
dem_set_test_result(DTC_VCS_INVALID_ID, DTC_TEST_STATE_FAILED);
}
#endif
}
static void fault_detect_power_task(void)
{
#if 0
switch(g_fault_detect.power_state)
{
case FAULT_DETECT_STATE_IDLE:
g_fault_detect.power_timecount++;
if(g_fault_detect.power_timecount>=FAULT_DETECT_POWER_TIME)
{
g_fault_detect.power_timecount=0;
g_fault_detect.power_state = FAULT_DETECT_STATE_POWER;
}
break;
case FAULT_DETECT_STATE_POWER:
break;
default:
//为了 default而加未验证
break;
}
#endif
}
static void fault_detect_ign_task(void)
{
#if 0
switch(g_fault_detect.ign_state)
{
case FAULT_DETECT_STATE_IDLE:
if(can_app_get_bcm_t15d()!=0u)
{
g_fault_detect.ign_timecount++;
if(g_fault_detect.ign_timecount>=FAULT_DETECT_IGN_ON_TIME)
{
g_fault_detect.ign_timecount=0;
fault_detect_vin();
fault_detect_vehicle_cfginfo();
g_fault_detect.ign_state = FAULT_DETECT_STATE_IGN_ON;
}
}
else
{
g_fault_detect.ign_timecount=0u;
}
break;
case FAULT_DETECT_STATE_IGN_ON:
if(can_app_get_bcm_t15d()!=0u)
{
}
else
{
g_fault_detect.ign_timecount=0;
g_fault_detect.ign_state = FAULT_DETECT_STATE_IGN_OFF;
}
break;
case FAULT_DETECT_STATE_IGN_OFF:
if(can_app_get_bcm_t15d()!=0u)
{
g_fault_detect.ign_timecount++;
if(g_fault_detect.ign_timecount>=FAULT_DETECT_IGN_ON_TIME)
{
g_fault_detect.ign_timecount=0;
g_fault_detect.ign_state = FAULT_DETECT_STATE_IGN_ON;
}
}
else
{
g_fault_detect.ign_timecount=0;
g_fault_detect.ign_state = FAULT_DETECT_STATE_IGN_OFF;
}
break;
default:
//为了 default而加未验证
break;
}
}
static void fault_detect_his_task(void)
{
app_com_rx_tbox_time_s l_tbox_time;
power_supply_history_s l_power_his;
//对历史电源状态的记录---以最小的周期帧为基准
g_fault_detect.his_power_count++;
if(g_fault_detect.his_power_count>=FAULT_DETECT_HISTORY_POWER_TIME)
{
g_fault_detect.his_power_count=0u;
(void)can_app_get_sig_tbox_time(&l_tbox_time);
//power his
l_power_his.poweroff = 0u;
l_power_his.out30s = 0u;
l_power_his.out30r = 0u;
l_power_his.out15d = 0u;
l_power_his.sigt30s = can_app_get_bcm_t30s();
l_power_his.sigt30r = can_app_get_bcm_t30r();
l_power_his.sigt15d = can_app_get_bcm_t15d();
l_power_his.year = l_tbox_time.year;
l_power_his.month = l_tbox_time.month;
l_power_his.day = l_tbox_time.day;
l_power_his.hour = l_tbox_time.hour;
l_power_his.min = l_tbox_time.min;
l_power_his.sec = l_tbox_time.sec;
fault_detect_input_power_history(&l_power_his);
}
else
{
//code
}
#endif
}
/**
* @brief 放在10ms定時器
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
void fault_detect_task(void)
{
#if 0
fault_detect_ign_task();
fault_detect_power_task();
fault_detect_his_task();
#endif
}
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
void vehicle_cfg_set_cds(u8 cds)
{
g_vehicle_cfg.cds = cds;
}
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
u8 vehicle_cfg_get_cds(void)
{
return g_vehicle_cfg.cds;
}
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
u8 fault_detect_get_power_state(void)
{
return g_fault_detect.power_state;
}
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
u8 fault_detect_get_ign_state(void)
{
return g_fault_detect.ign_state;
}
u8 fault_detect_judge_node_bcmstate_loss(void)
{
#if 0
u8 l_result=FAULT_DETECT_JUDGE_NODE_LOSS_OK;
u8 l_busoff_state ;
l_busoff_state = net_app_get_busoff(); /*PRQA S 3426*/
if((system_voltage_manage_mode_get(POWER_GRADE_ID_DIAG)==POWER_GRADE_FUNC_NORMAL)&&(l_busoff_state==0u))
{
l_result=FAULT_DETECT_JUDGE_NODE_LOSS_OK;
}
else
{
l_result=FAULT_DETECT_JUDGE_NODE_LOSS_NOTOK;
}
return l_result;
#else
return 0u;
#endif
}
u8 fault_detect_judge_key_stuck(void)
{
#if 0
u8 l_result=FAULT_DETECT_JUDGE_NODE_LOSS_OK;
if((system_voltage_manage_mode_get(DIG_SYSTEM_VOLTAGE_MANAGE_ID)==POWER_GRADE_FUNC_NORMAL) \
&& (fault_detect_get_ign_state()==FAULT_DETECT_STATE_IGN_ON) \
)
{
l_result=FAULT_DETECT_JUDGE_NODE_LOSS_OK;
}
else
{
l_result=FAULT_DETECT_JUDGE_NODE_LOSS_NOTOK;
}
return l_result;
#else
return 0u;
#endif
}
static u8 fault_detect_get_event(u8 event)
{
#if 0
u8 l_event;
if(event==DTC_TEST_STATE_FAILED)
{
l_event=DTC_TEST_STATE_FAILED;
}
else if(event==DTC_TEST_STATE_PASSED)
{
l_event=DTC_TEST_STATE_PASSED;
}
else
{
l_event=DTC_TEST_STATE_PASSED;
}
return l_event;
#else
return 0u;
#endif
}
void fault_detect_iokey_dtc(u8 key_id,u8 event)
{
#if 0
u8 l_event;
u8 l_result;
l_result = fault_detect_judge_key_stuck();
if(l_result ==FAULT_DETECT_JUDGE_NODE_LOSS_OK)
{
l_event=fault_detect_get_event(event);
switch(key_id)
{
case KEY_ID_GAP1:
dem_set_test_result(DTC_DSPA_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_GAP2:
dem_set_test_result(DTC_DSPD_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_ACC:
dem_set_test_result(DTC_ACC_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_CANCEL:
dem_set_test_result(DTC_CANCEL_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_RES1:
dem_set_test_result(DTC_SPDA_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_SET2:
dem_set_test_result(DTC_SPDD_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_UP:
dem_set_test_result(DTC_UP_BUTTON_STUCK_ID, l_event);
break;
case KEY_ID_DOWN:
dem_set_test_result(DTC_DOWN_BUTTON_STUCK_ID, l_event);
break;
default:
//为了 default而加未验证
break;
}
}
else
{
//
}
#endif
}
void fault_detect_adckey_dtc(u8 key_id,u8 event)
{
#if 0
u8 l_event;
u8 l_result;
l_result = fault_detect_judge_key_stuck();
if(l_result ==FAULT_DETECT_JUDGE_NODE_LOSS_OK)
{
l_event=fault_detect_get_event(event);
switch(key_id)
{
case KEY_ADC_ID_PHONE:
dem_set_test_result(DTC_BT_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_SOUNDCTRL:
dem_set_test_result(DTC_SOUND_CTRL_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_VOL_INC:
dem_set_test_result(DTC_VOLA_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_VOL_DEC:
dem_set_test_result(DTC_VOLD_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_PREVIOUS:
dem_set_test_result(DTC_PREV_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_NEXT:
dem_set_test_result(DTC_NEXT_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_MODE:
dem_set_test_result(DTC_MODE_BUTTON_STUCK_ID, l_event);
break;
case KEY_ADC_ID_CUSTOM:
dem_set_test_result(DTC_CUSTOM_BUTTON_STUCK_ID, l_event);
break;
default:
//为了 default而加未验证
break;
}
}
else
{
//
}
#endif
}
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
void fault_detect_goto_sleep(void)
{
}
/**
* @brief
* @param input:
* @param output:
* @return none:
* @calls
* @calls by
* @others
*/
void fault_detect_goto_wakeup(void)
{
}