Commit 0564a79d authored by 时昊's avatar 时昊

增加雷达报警

parent 0168f7cd
......@@ -23,9 +23,9 @@ const PopupAttributeStruct PopupAttributeTable_1[POPUP_NUMBER_TOTAL] =
/* 雷达2hz */{ 12u, POPUP_Radar_2HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_RADAR_2HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 雷达4hz */{ 12u, POPUP_Radar_4HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_RADAR_4HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 倒车雷达系统故障 */{ 12u, POPUP_RADAR_SYSTEM_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_2S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 倒车雷达传感器故障 */{ 12u, POPUP_RADAR_SENSOR_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_2S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 倒车雷达传感器故障 */{ 12u, POPUP_RADAR_SENSOR_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_2S, POPUP_MODE_SINGLE, 20u, 10u, },
/* 雷达开关故障 */{ 0u, POPUP_RADAR_SWITCH_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_0S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 雷达开关故障 */{ 0u, POPUP_RADAR_CHECK_OK, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_OK0S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 雷达自检ok长鸣0.5s */{ 12u, POPUP_RADAR_CHECK_OK, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_OK0S, POPUP_MODE_SINGLE, 5u, 5u, },
/* 制动液位低 */{ 2u, POPUP_EPB_Status, NULL, 1u, POPUP_MODE_LONG_HINT, SND_EPB_Status, POPUP_MODE_SINGLE, 11u, 10u, },
/* 安全带未系 1HZ */{ 3u, POPUP_SEATBELT_DR_1HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_SEATBELT_DR_1HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 安全带未系 2HZ */{ 3u, POPUP_SEATBELT_DR_2HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_SEATBELT_DR_2HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
......
......@@ -96,6 +96,9 @@ void Popups_Polling(void)
if ( SelfCheck_time < (POWERON_SCAN_TIMER / 100) + 5u )
{
SelfCheck_time++;
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_2HZ);
......@@ -457,89 +460,182 @@ void Popups_Polling(void)
}
/*雷达距离声音提示*/
if(IGstPopup1 == IGN_ON)
if(/*EOL_GetF101() == */2)//can雷达
{
if(Get_ID_0CFF1ADA_Sig_PDC_VirtualDisplaySts() == 1u)
if(IGstPopup1 == IGN_ON)
{
switch ( Get_ID_0CFF1ADA_Sig_PDC_Warning_Frq() )
if(Get_ID_0CFF1ADA_Sig_PDC_VirtualDisplaySts() == 1u)
{
case 0:
RADAR_SOUND = 100;
break;
case 1:
RADAR_SOUND = POPUP_Radar_1HZ;
break;
case 2:
RADAR_SOUND = POPUP_Radar_2HZ;
break;
case 3:
RADAR_SOUND = POPUP_Radar_4HZ;
break;
case 4:
RADAR_SOUND = 100;
break;
case 5:
RADAR_SOUND = POPUP_Radar_Changming;
break;
default:
RADAR_SOUND = 100;
break;
switch ( Get_ID_0CFF1ADA_Sig_PDC_Warning_Frq() )
{
case 0:
RADAR_SOUND = 100;
break;
case 1:
RADAR_SOUND = POPUP_Radar_1HZ;
break;
case 2:
RADAR_SOUND = POPUP_Radar_2HZ;
break;
case 3:
RADAR_SOUND = POPUP_Radar_4HZ;
break;
case 4:
RADAR_SOUND = 100;
break;
case 5:
RADAR_SOUND = POPUP_Radar_Changming;
break;
default:
RADAR_SOUND = 100;
break;
}
if (RADAR_SOUND == POPUP_Radar_1HZ)
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_1HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_2HZ )
{
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_2HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_4HZ )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_4HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_Changming )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
Popup_Request(POPUP_Radar_Changming);
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
}
}
if (RADAR_SOUND == POPUP_Radar_1HZ)
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
}
else if ( RADAR_SOUND == POPUP_Radar_2HZ )
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
}
}
else if(/*EOL_GetF101() ==*/ 3)
{
if(IGstPopup1 == IGN_ON)
{
switch (Radra_Get_Warning( ))
{
case 1:
RADAR_SOUND = RADAR_SND_2Hz;
break;
case 2:
RADAR_SOUND = RADAR_SND_4Hz;
break;
case 3:
RADAR_SOUND = RADAR_SND_CONTINUOUS;
break;
case 4://长鸣0.5s
RADAR_SOUND = RADAR_SND_OK500MS;
break;
case 5://雷达故障 长鸣2s
RADAR_SOUND = RADAR_SND_2S;
break;
case 6://雷达数据超时 长鸣2s
RADAR_SOUND = RADAR_SND_2S;
break;
default:
RADAR_SOUND = RADAR_SND_MUTE;
break;
}
if (RADAR_SOUND == RADAR_SND_2Hz)
{
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_2HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_4HZ )
else if ( RADAR_SOUND == RADAR_SND_4Hz )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
Popup_Request(POPUP_Radar_4HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_Changming )
else if ( RADAR_SOUND == RADAR_SND_CONTINUOUS )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
Popup_Request(POPUP_Radar_Changming);
}
else if ( RADAR_SOUND == RADAR_SND_OK500MS )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
Popup_Request(POPUP_RADAR_CHECK_OK);
}
else if ( RADAR_SOUND == RADAR_SND_2S )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_RADAR_SENSOR_FAILURE);
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
}
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_RADAR_CHECK_OK);
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_RADAR_SENSOR_FAILURE);
}
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
;
}
// OTA处理
......@@ -654,31 +750,31 @@ void Popups_Sound_Playing(uint8_t PopupSnd)
case SND_RADAR:
if ( RADAR_SOUND == RADAR_SND_CONTINUOUS )
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_2HZ);
Sound_Delete(SND_RADAR_4HZ);
Sound_Request(SND_RADAR_Changming, ReqCode);
// Sound_Delete(SND_RADAR_1HZ);
// Sound_Delete(SND_RADAR_2HZ);
// Sound_Delete(SND_RADAR_4HZ);
// Sound_Request(SND_RADAR_Changming, ReqCode);
}
else if ( RADAR_SOUND == RADAR_SND_2Hz )
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_4HZ);
Sound_Delete(SND_RADAR_Changming);
Sound_Request(SND_RADAR_2HZ, ReqCode);
// Sound_Delete(SND_RADAR_1HZ);
// Sound_Delete(SND_RADAR_4HZ);
// Sound_Delete(SND_RADAR_Changming);
// Sound_Request(SND_RADAR_2HZ, ReqCode);
}
else if ( RADAR_SOUND == RADAR_SND_4Hz )
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_2HZ);
Sound_Delete(SND_RADAR_Changming);
Sound_Request(SND_RADAR_4HZ, ReqCode);
// Sound_Delete(SND_RADAR_1HZ);
// Sound_Delete(SND_RADAR_2HZ);
// Sound_Delete(SND_RADAR_Changming);
// Sound_Request(SND_RADAR_4HZ, ReqCode);
}
else
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_2HZ);
Sound_Delete(SND_RADAR_4HZ);
Sound_Delete(SND_RADAR_Changming);
// Sound_Delete(SND_RADAR_1HZ);
// Sound_Delete(SND_RADAR_2HZ);
// Sound_Delete(SND_RADAR_4HZ);
// Sound_Delete(SND_RADAR_Changming);
}
break;
default:
......
......@@ -21,7 +21,7 @@ enum SoundName
SND_RADAR_2S, /* 雷达 2S */
SND_RADAR_4S, /* 雷达 4S */
SND_RADAR_0S, /* 雷达 0.5S */
SND_RADAR_OK0S, /* 雷达 0.5S */
SND_RADAR_OK0S, /* 雷达 自检ok长鸣0.5S */
SND_EPB_Status, /* 制动液位低 */
SND_SEATBELT_DR_1HZ, /* 安全带未系 1HZ */
SND_SEATBELT_DR_2HZ, /* 安全带未系 2HZ */
......
......@@ -24,7 +24,7 @@ const SoundAttributeStruct SoundList [ SND_TOTAL_NUM ] = {
{/*雷达 2S */ SND_SRC_Radar_2S, SND_TYPE_RADAR, },
{/*雷达 4S */ SND_SRC_Radar_4S, SND_TYPE_RADAR, },
{/*雷达 0.5S */ SND_SRC_Radar_0S, SND_TYPE_RADAR, },
{/*雷达 0.5S */ SND_SRC_Radar_OK0S, SND_TYPE_RADAR, },
{/*雷达自检ok长鸣0.5S */ SND_SRC_Radar_OK0S, SND_TYPE_RADAR, },
{/*制动液位低 */ SND_SRC_EPB_Status, SND_TYPE_NORMAL, },
{/*安全带未系 */ SND_SRC_SEATBELT_DR_1HZ, SND_TYPE_NORMAL, },
{/*安全带未系 */ SND_SRC_SEATBELT_DR_2HZ, SND_TYPE_NORMAL, },
......@@ -78,10 +78,10 @@ const SndAttributeStruct SndAttributeTable [ SND_SRC_TOTAL_NUM ] = {
{ /* 雷达 1HZ */ 0x03, 12u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* 雷达 2HZ */ 0x03, 12u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 500u, },
{ /* 雷达 4HZ */ 0x04, 12u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 250u, },
{ /* 雷达 2S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 2000u, },
{ /* 雷达 2S */ 0x02, 12u, 1u, SND_MODE_SINGLE, 2000u, },
{ /* 雷达 4S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 4000u, },
{ /* 雷达 0.5S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 500u, },
{ /* 雷达 0.5S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 500u, },
{ /* 雷达自检ok长鸣0.5S */ 0x02, 12u, 1u, SND_MODE_SINGLE, 500u, },
{ /* 制动液位低 */ 0x07, 2u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 安全带未系 1HZ */ 0x03, 3u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* 安全带未系 2HZ */ 0x03, 3u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 500u, },
......
......@@ -21,7 +21,7 @@ enum
SND_SRC_Radar_2S, /* 雷达 2S */
SND_SRC_Radar_4S, /* 雷达 4S */
SND_SRC_Radar_0S, /* 雷达 0S */
SND_SRC_Radar_OK0S, /* 雷达 0S */
SND_SRC_Radar_OK0S, /* 雷达自检ok长鸣0.5S */
SND_SRC_EPB_Status, /* 制动液位低 */
SND_SRC_SEATBELT_DR_1HZ, /* 安全带未系 1HZ */
SND_SRC_SEATBELT_DR_2HZ, /* 安全带未系 2HZ */
......
......@@ -109,7 +109,7 @@ static void Recv_Byte(void)
/*DataDecoding*/
void Recv_New(void)
{
uint8_t Condition_EOL = 0x07u; // Val_EOL_F101_Radar();
uint8_t Condition_EOL = 0x06u; // Val_EOL_F101_Radar();
uint8_t Condition_Frame = (PDC_R3.Frame_T > 2U) ? 1U : 0U;
/*PDC_Standby */
if ( Condition_Frame == 1U )
......
#include "Communication_Over_CAN.h"
#include "System_Status_Monitor.h"
#include "SEG_DISPLAY.h"
#include "CAN_APP.h"
#include "Gauge_Display.h"
#include "Flash_synchronizer.h"
#include "RTE_TIME.h"
#include "RTC.h"
#include "Key.h"
#include "Services_TripA.h"
#include "Services_ODO.h"
#include "Common_Interface.h"
#include "Telltales_user.h"
RTC_Time_st_t RTCTimeCurrent;
extern uint32_t Factory_ClearOdo_Display_Flag;
BattCurr_st_t BattCurr;
const PowerSegMap_st_t PositivePowerSegMap [] = {
{0u, 0u},
{12u, 1u},
{25u, 2u},
{37u, 3u},
{50u, 4u},
{62u, 5u},
{75u, 6u},
{87u, 7u},
{100u, 8u},
{200u, 8u},
{0xffffu, 0xffu},
};
const PowerSegMap_st_t NegativePowerSegMap [] = {
{0u, 0x80u},
{50u, 0x81u},
{100u, 0x82u},
{200u, 0x82u},
{0xffffu, 0xffu},
};
const BatterySegMap_st_t batterySegMap [] = {
{5u, 0u},
{15u, 1u},
{25u, 2u},
{35u, 3u},
{45u, 4u},
{55u, 5u},
{65u, 6u},
{75u, 7u},
{85u, 8u},
{95u, 9u},
{0xFEu, 10u},
{0xffffu, 0xffu},
};
uint16_t PowerDisplayValue = 0;
uint8_t PowerDisplaySeg = 0;
uint16_t BatteryDisplayValue = 0;
uint8_t BatteryDisplaySeg = 0;
//�ⲿ�¶�
uint16_t TEMPInvalidTime = 0xffffu;
uint8_t TEMPDisplayStatus = 0u;
uint8_t TEMPDisplaySymbol = 0u;
uint8_t TEMPDisplayValue = 0u;
//��λ��˸����
uint8_t Gear_Flash_Count = 0;
static uint8_t Gear_keep_current = 0;
//�ϵ�ɨ�̿���
uint16_t PowerOn_Scan_Timing = 0;
uint16_t PowerOn_Scan_Flag = 1;
//uint16_t Gauge_VSpeed_Display_Flag = 0;
//uint16_t Gauge_VSpeed_Display_Flag = 0;
/**************************************************************************
* \brief ���ٱ���ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_VSpeed_Display(void)
{
uint16_t VSpeedDisplayValue = 0;
// static uint16_t refresh_timer=0;
if ( SYS_OPR_STAT_IGN_ON )
{
if ( Common_Get_Disp_V_Speed_Valid( ) == 1u )
{
//��ʾ����
VSpeedDisplayValue = Common_Get_Disp_V_Speed( );
if(Factory_ClearOdo_Display_Flag == 0)
{
SEG_SET_VSpeed_NUM(1u, VSpeedDisplayValue/10);
// if(Common_Get_Disp_V_Speed( ) >= 810)
// {
// SEG_SET_VSpeed_NUM(FLASH_SYNC_1Hz, VSpeedDisplayValue/10);
// Gauge_VSpeed_Display_Flag = 1;
// }
// else
// {
// if(Gauge_VSpeed_Display_Flag == 1)
// {
// if(Common_Get_Disp_V_Speed( ) < 780)
// {
// SEG_SET_VSpeed_NUM(1u, VSpeedDisplayValue/10);
// Gauge_VSpeed_Display_Flag = 0;
// }
// else
// {
// SEG_SET_VSpeed_NUM(FLASH_SYNC_1Hz, VSpeedDisplayValue/10);
// }
// }
// else
// {
// SEG_SET_VSpeed_NUM(1u, VSpeedDisplayValue/10);
// Gauge_VSpeed_Display_Flag = 0;
// }
// }
}
}
else
{
//�����������
VSpeedDisplayValue = 0u;
SEG_SET_VSpeed_NUM(2u, 0u);
//Gauge_VSpeed_Display_Flag = 0;
}
}
else
{
// IGOFFʱ����
VSpeedDisplayValue = 0u;
SEG_SET_VSpeed_NUM(0u, 0u);
//Gauge_VSpeed_Display_Flag = 0;
}
}
/**************************************************************************
* \brief ���ʱ���ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_Power_Display(void)
{
uint8_t powerSegNum;
uint16_t powerDisplayValue;
uint8_t powerDisplaySign;
uint32_t powerCurrentValue;
uint32_t powerRemainingAvailableValue;
uint8_t i;
uint32_t Batt_Curr = 0;
if ( SYS_OPR_STAT_IGN_ON )
{
if(Factory_ClearOdo_Display_Flag == 0)
{
Batt_Curr = Get_ID_18FA40F4_Sig_BMSBattCurr();
if((CAN_MSG_Status(ID_can0x18FA40F4_Msg_Count) != 0u)||(Batt_Curr == 0XFFFF ))
{
// 0格和--%
BattCurr.Valid = 0;
BattCurr.Value = 0;
SEG_SET_PowerDial(1u, 0u, 0u, 255u);
}
else
{
if(CAN_MSG_Status(ID_can0x18FAB027_Msg_Count) == 0u)
{
if(Get_ID_18FAB027_Sig_VCUPTModeInd() != 1)//+
{
if(CAN_MSG_Status(ID_can0x18FAB327_Msg_Count) == 0u)
{
if((Get_ID_18FAB027_Sig_VCUPTSysElecPwrInd() / 2u) == 0)
{
SEG_SET_PowerDial(1u, 0u, 0u, 0u);
}
else
{
powerCurrentValue = Get_ID_18FAB027_Sig_VCUPTSysElecPwrInd( ) / 2u;
powerDisplaySign = Get_ID_18FAB027_Sig_VCUPTModeInd();
powerRemainingAvailableValue = Get_ID_18FAB327_Sig_VCU_PTResiduePwrInd( ) / 10u;
if ( (powerCurrentValue == 0u) && (powerRemainingAvailableValue == 0u) )
{
powerDisplayValue = 0;
powerSegNum = 0;
}
else
{
if ( powerDisplaySign != 1u )
{
powerDisplayValue = powerCurrentValue * 100u / (powerCurrentValue + powerRemainingAvailableValue);
for ( i = 0; i < POSITIVE_POWER_SEG_MAP_MAX; i++ )
{
if ( powerDisplayValue <= PositivePowerSegMap [ i ].value )
{
powerSegNum = PositivePowerSegMap [ i ].segNum;
break;
}
}
}
}
if ( (powerSegNum != 0xffu) && (powerDisplayValue <= 100u) )
{
if (Common_Get_Act_V_Speed() < 20u)
{
SEG_SET_PowerDial(1u, 0u, 0u, 0u);
}
else
{
SEG_SET_PowerDial(1u, powerSegNum, 0, powerDisplayValue);
}
}
else
{
SEG_SET_PowerDial(1u, 0u, 0u, 0u);
}
}
}
else
{
SEG_SET_PowerDial(1u, 0u, 0u, 255u);
}
}
else//-
{
if (Batt_Curr < 0xFB00)
{
BattCurr.Valid = 1;
Batt_Curr = (Batt_Curr * 5);
if (Batt_Curr >= 160000)
{
Batt_Curr -= 160000;
BattCurr.Symbol = 0;
}
else
{
Batt_Curr = 160000 - Batt_Curr;
BattCurr.Symbol = 1;
}
BattCurr.Value = Batt_Curr/100;
}
else
{
BattCurr.Symbol = 0;
BattCurr.Valid = 0;
BattCurr.Value = 0;
}
if ((Common_Get_Act_V_Speed() >= 20u)&&(Common_Get_Act_V_Speed() < 70u)||(Common_Get_Act_V_Speed() < 20u))
{
//0格和0%
SEG_SET_PowerDial(1u, 0u, 0u, 0u);
}
else
{
if(BattCurr.Symbol == 1)
{
if((BattCurr.Value <= 100)&&(BattCurr.Value > 0))
{
//-1格和-50%
SEG_SET_PowerDial(1u, 0x81u, 1u, 50u);
}
else if(BattCurr.Value > 100)
{
//-1 -2格和-100%
SEG_SET_PowerDial(1u, 0x82u, 1u, 100u);
}
}
else
{
if(BattCurr.Value >= 0)
{
//0格和0%
SEG_SET_PowerDial(1u, 0u, 0u, 0u);
}
}
}
}
}
else
{
BattCurr.Valid = 0;
BattCurr.Value = 0;
SEG_SET_PowerDial(1u, 0u, 0u, 255u);
}
}
}
}
else
{
// IGOFF����
SEG_SET_PowerDial(0u, 0u, 0u, 0u);
BattCurr.Symbol = 0;
BattCurr.Valid = 0;
BattCurr.Value = 0;
}
}
/**************************************************************************
* \brief ��������ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_Battery_Display(void)
{
//uint16_t m_val;
if ( SYS_OPR_STAT_IGN_ON )
{
if(Factory_ClearOdo_Display_Flag == 0)
{
if ( (CAN_MSG_Status(ID_can0x18FA40F4_Msg_Count) == 0u) && (Get_ID_18FA40F4_Sig_BMSBattSOC( ) != 0xff) )
{
//��ȡ����ʵ��ֵ
BatteryDisplayValue = Get_ID_18FA40F4_Sig_BMSBattSOC( ) * 4u / 10u;
//�������������??
//����
if ( BatteryDisplayValue >= (batterySegMap [ BatteryDisplaySeg ].value + 2u) )
{
BatteryDisplaySeg++;
}
//�½�
if ( BatteryDisplaySeg > 0u )
{
if ( BatteryDisplayValue <= (batterySegMap [ BatteryDisplaySeg - 1 ].value /* -2u*/) )
{
BatteryDisplaySeg--;
}
}
if(BatteryDisplayValue>=100)
{
BatteryDisplayValue=100;
}
//������ʾ
if ( BatteryDisplaySeg != 0xffu )
{
if(BatteryDisplaySeg == 1)
{
SEG_SET_EleDial(1u, FLASH_SYNC_1Hz ? BatteryDisplaySeg : 0, BatteryDisplayValue);
}
else
{
SEG_SET_EleDial(1u, BatteryDisplaySeg, BatteryDisplayValue);
}
}
else
{
//�źŴ�����
SEG_SET_EleDial(1u, 0u, 0u);
}
}
else
{
//���ĵ��ߴ���
SEG_SET_EleDial(1u, FLASH_SYNC_05Hz ? BatteryDisplaySeg : 0, BatteryDisplayValue);
}
}
}
else
{
// IGOFF����
SEG_SET_EleDial(0u, 0u, 0u);
}
}
/**************************************************************************
* \brief ʱ����ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_Clock_Display(void)
{
if ( SYS_OPR_STAT_IGN_ON )
{
//��ȡʱ��
RTCTimeCurrent.Hour = Get_RTC_HOUR( );
RTCTimeCurrent.Minute = Get_RTC_MINUTE( );
//ʱ����ʾ
if(Factory_ClearOdo_Display_Flag == 0)
{
SEG_SET_Clock(RTCTimeCurrent.Hour, RTCTimeCurrent.Minute, FLASH_SYNC_1Hz, 1, 1);
}
}
else
{
SEG_SET_Clock(0, 0, 0, 0, 0);
}
// //����ʱ��
// RTE_RTC_Set_Hour ( RTCTimeCurrent.Hour );
// RTE_RTC_Set_Minute( RTCTimeCurrent.Minute );
// RTE_RTC_Confirm_Overwrite();
}
/**************************************************************************
* \brief ��ʻ�����ʾ����??
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_DrivingRange_Display(void)
{
uint16_t m_DTE;
if ( SYS_OPR_STAT_IGN_ON )
{
if(Factory_ClearOdo_Display_Flag == 0)
{
if ( (CAN_MSG_Status(ID_can0x18FAB327_Msg_Count) == 0u) && (Get_ID_18FAB327_Sig_VCU_Cruisingdistance( ) <= 0xFAFFFFFF) )
{
m_DTE=Get_ID_18FAB327_Sig_VCU_Cruisingdistance( )>>3;
if (m_DTE>=999)
{
m_DTE=999;
}
if(m_DTE < 10)
{
SEG_SET_DTE_NUM(2u, 0u);
}
else
{
SEG_SET_DTE_NUM(1u, m_DTE);
}
}
else
{
//�쳣�źŴ���
SEG_SET_DTE_NUM(2u, 0u);
}
}
}
else
{
SEG_SET_DTE_NUM(0u, 0u);
}
}
/**************************************************************************
* \brief С�������ʾ����??
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_Trip_Display(void)
{
if ( SYS_OPR_STAT_IGN_ON )
{
if(CAN_MSG_Status(ID_can0x18FEBF0B_Msg_Count) == 0u)
{
if(Factory_ClearOdo_Display_Flag == 0)
{
SEG_SET_TRIP_NUM(1u, Data_Read_TripA( ));
}
}
else
{
SEG_SET_TRIP_NUM(2u, 0u);
}
}
else
{
SEG_SET_TRIP_NUM(0u, 0u);
}
}
/**************************************************************************
* \brief ��������ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_ODO_Display(void)
{
if ( SYS_OPR_STAT_IGN_ON )
{
if(Factory_ClearOdo_Display_Flag == 0)
{
SEG_SET_ODO_NUM(1u, Data_ODO_Read( ) / 10u);
}
}
else
SEG_SET_ODO_NUM(0u, 0u);
}
/**************************************************************************
* \brief ��λ��ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_Gear_Display(void)
{
uint8_t DisplayGear = 0u;
if ( SYS_OPR_STAT_IGN_ON )
{
//�źŵ����ж�
if ( CAN_MSG_Status(ID_can0x18FAB027_Msg_Count) == 0u )
{
//��ʾ��λ����
switch ( Get_ID_18FAB027_Sig_VCUGearPositionInd( ) )
{
case 0xFCu:
DisplayGear = 3u;
Gear_keep_current = 3;
break;
case 0xDFu:
DisplayGear = 1u;
Gear_keep_current = 1;
break;
case 0xFDu:
DisplayGear = 0xFDu;
Gear_keep_current = 0xFDu;
break;
case 0x7Du:
DisplayGear = 2u;
Gear_keep_current = 2;
break;
case 0xFAu:
DisplayGear = 4u;
Gear_keep_current = 4;
break;
default:
DisplayGear = 0u;
Gear_keep_current = 0;
break;
}
//�źţ��������� �ж�
//if ( Get_ID_18FAB027_Sig_PMS_GearOperateErr( ) == 1u )
//{
// if ( Gear_Flash_Count < 6 )
// {
// if ( (Gear_Flash_Count & 1u) == FLASH_SYNC_1Hz )
// Gear_Flash_Count++;
// }
//}
//else
//{
// Gear_Flash_Count = 0;
//}
//��ʾ��λ
//if ( (Gear_Flash_Count == 0u) || (Gear_Flash_Count >= 6u) )
if(Factory_ClearOdo_Display_Flag == 0)
{
if((DisplayGear != 0xFDu)&&(DisplayGear != 0))
{
SEG_SET_GEAR(1u, DisplayGear);
}
else if(DisplayGear == 0xFDu)
{
SEG_SET_GEAR(1u, Gear_keep_current);
}
else
{
SEG_SET_GEAR(0u, 0u);
}
}
}
else
{
//�źŵ��ߴ���
SEG_SET_GEAR(0u, 0u);
}
}
else
{
SEG_SET_GEAR(0u, 0u);
}
}
/**************************************************************************
* \brief ���������ʾ����??
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_MaintenanceMileage_Display(void)
{
}
/**************************************************************************
* \brief �������յȼ���ʾ����
* \attention �÷��������뱻ʵʱ����
* \retval ��
******************************************************************************/
void Gauge_EnergyRecoveryLevel_Display(void)
{
if ( SYS_OPR_STAT_IGN_ON )
{
if(Factory_ClearOdo_Display_Flag == 0)
{
EnergyRecovery_Key_val();
EnergyRecovery0_Key_val();
SEG_SET_L8_NUM(1u,EnergyRecovery_Level);
}
}
else
{
SEG_SET_L8_NUM(0u, 0u);
}
}
// 30���ʼ��??
void Gauge_KL30_Init(void)
{
TEMPInvalidTime = 0xffffu;
TEMPDisplayStatus = 0u;
TEMPDisplaySymbol = 0u;
TEMPDisplayValue = 0u;
}
// 15���ʼ��??
void Gauge_KL15_Init(void)
{
TEMPInvalidTime = 0xffffu;
TEMPDisplayStatus = 0u;
TEMPDisplaySymbol = 0u;
TEMPDisplayValue = 0u;
PowerOn_Scan_Timing = 0;
PowerOn_Scan_Flag = 1;
}
//����������
// 20ms����
void Gauge_Service(void)
{
static uint16_t VSpeed_Count = 0u;
if ( SYS_OPR_STAT_IGN_ON )
{
if(Factory_ClearOdo_Display_Flag == 0)
{
//�Լ�ɨ��
if ( PowerOn_Scan_Flag == 1u )
{
//�Լ�ʱ���ۼ�
PowerOn_Scan_Timing += 20;
SEG_SET_Frame(1u);
SEG_SET_GEAR(0u, 0u);
SEG_SET_DTE_NUM(0u, 0u);
SEG_SET_VSpeed_NUM(0u, 0u);
SEG_SET_L8_NUM(0u, 0u);
SEG_SET_ODO_NUM(0u, 0u);
SEG_SET_TRIP_NUM(0u, 0u);
SEG_SET_Clock(0u, 0u, 0u, 0u, 0u);
if ( PowerOn_Scan_Timing <= (POWERON_SCAN_TIMER - 1000ul) / 2 )
{
SEG_Scan_SET_EleDial(PowerOn_Scan_Timing * 10 / ((POWERON_SCAN_TIMER - 1000ul) / 2));
SEG_Scan_SET_PowerDial(PowerOn_Scan_Timing * 10 / ((POWERON_SCAN_TIMER - 1000ul) / 2));
}
else if ( PowerOn_Scan_Timing <= (POWERON_SCAN_TIMER - 1000ul) )
{
SEG_Scan_SET_EleDial(10 - (PowerOn_Scan_Timing - ((POWERON_SCAN_TIMER - 1000ul) / 2)) * 10 / ((POWERON_SCAN_TIMER - 1000ul) / 2));
SEG_Scan_SET_PowerDial(10 - (PowerOn_Scan_Timing - ((POWERON_SCAN_TIMER - 1000ul) / 2)) * 10 / ((POWERON_SCAN_TIMER - 1000ul) / 2));
}
else if ( PowerOn_Scan_Timing <= POWERON_SCAN_TIMER )
{
SEG_Scan_SET_EleDial(0u);
SEG_Scan_SET_PowerDial(0u);
}
else
{
PowerOn_Scan_Flag = 0;
}
}
else
{
//�߿�
SEG_SET_Frame(1u);
VSpeed_Count++;
if ( VSpeed_Count >= 10u )
{
Gauge_VSpeed_Display( );
VSpeed_Count = 0u;
}
Gauge_Power_Display( );
Gauge_Battery_Display( );
Gauge_Clock_Display( );
Gauge_DrivingRange_Display( );
Gauge_Trip_Display( );
Gauge_ODO_Display( );
Gauge_Gear_Display( );
Gauge_MaintenanceMileage_Display( );
Gauge_EnergyRecoveryLevel_Display( );
}
}
}
else
{
SEG_SET_Frame(0u);
Gauge_VSpeed_Display( );
Gauge_Power_Display( );
Gauge_Battery_Display( );
Gauge_Clock_Display( );
Gauge_DrivingRange_Display( );
Gauge_Trip_Display( );
Gauge_ODO_Display( );
Gauge_Gear_Display( );
Gauge_MaintenanceMileage_Display( );
Gauge_EnergyRecoveryLevel_Display( );
}
}
typedef struct
{
uint16_t Tempval;
uint16_t ResVal;
}st_TempTab;
const st_TempTab TempTab[]=
{
{ 200, 1427 ,},//0
{ 250, 1081 ,},//1
{ 300, 822 ,},//2
{ 350, 632 ,},//3
{ 400, 489 ,},//4
{ 420, 437 ,},//5
{ 425, 427 ,},//6
{ 430, 416 ,},//7
{ 440, 396 ,},//8
{ 445, 391 ,},//9
{ 450, 380 ,},//10
{ 500, 298 ,},//11
{ 550, 234 ,},//12
{ 600, 186 ,},//13
{ 650, 150 ,},//14
{ 700, 120 ,},//15
{ 750, 98 ,},//16
{ 800, 80 ,},//17
{ 850, 66 ,},//18
{ 900, 54 ,},//19
{ 950, 45 ,},//20
{1000, 38 ,},//21
{1050, 32 ,},//22
{1100, 27 ,},//23
{1150, 26 ,},//24
{1200, 23 ,},//25
};
uint32_t TempResBuffer [ 20 ];
uint32_t TempResPtr;
uint32_t TempResult;
uint32_t TempOut;
void Temp_Calc_Init(void)
{
memset(TempResBuffer, 0u, sizeof(TempResBuffer));
TempResPtr = 0u;
TempResult = 255u;
TempOut = 255u;
}
void Temp_Calc_Send(void)
{
uint8_t i,j;
uint8_t ret;
//uint32_t tempTmpVal;
//uint32_t tempResVal;
if ( ADC_Read_Signal_Valid(ADC_CH_28_R) == 1u )
{
TempResBuffer [ TempResPtr ] = ADC_Conv_Single_Channel(ADC_CH_28_R);
TempResPtr++;
if ( TempResPtr >= 20u )
{
TempResult = 0u;
for ( i = 0; i <= 20; i++ )
{
TempResult += TempResBuffer [ i ];
}
TempResult = TempResult / 20;
TempResPtr = 0u;
}
if ( TempResult > TempTab [ 0 ].ResVal )
{
TempOut = 200u;
}
else if ( TempResult <= TempTab [ 25 ].ResVal )
{
TempOut = 1200u;
}
else
{
j=0;
ret=0U;
for ( ;; )
{
if ( TempResult > TempTab [ j ].ResVal )
{
ret=1U;
break;
}
else
{
j++;
}
if(j>25)
{
ret=0U;
break;
}
}
if(ret==1u)
{
//tempResVal=TempTab [ j-1 ].ResVal -TempTab [ j ].ResVal;
//tempTmpVal=TempTab [ j ].Tempval -TempTab [ j-1 ].Tempval;
//TempOut =TempTab [ j-1 ].Tempval+((tempTmpVal*(TempResult-TempTab [ j ].ResVal))/tempResVal);
TempOut = TempTab [ j ].Tempval;
}
}
}
}
uint32_t Get_Temp_Calc(void)
{
return TempOut / 10u;
}
#ifndef _POPUP_LIST_H_
#define _POPUP_LIST_H_
#include "stdint.h"
/*限制最大254个*/
enum PopupName
{
POPUP_Radar_Changming=0,
POPUP_Radar_1HZ,
POPUP_Radar_2HZ,
POPUP_Radar_4HZ,
POPUP_RADAR_SYSTEM_FAILURE,
POPUP_RADAR_SENSOR_FAILURE,
POPUP_RADAR_SWITCH_FAILURE,
POPUP_RADAR_CHECK_OK,
POPUP_EPB_Status,
POPUP_SEATBELT_DR_1HZ,
POPUP_SEATBELT_DR_2HZ,
POPUP_DoorOpen,
POPUP_DoorOpen_1HZ,
POPUP_EBD_fault,
POPUP_ABS,
POPUP_EPS,
POPUP_Park_Brak,
POPUP_MotorFault,
POPUP_SOC_Fault,
POPUP_InsulationFault,
POPUP_SOC_HT,
POPUP_Energy_Recovery,
POPUP_Energy_Recovery_1,
POPUP_ECO,
POPUP_READY,
POPUP_PowerLimit,
POPUP_SOC_LP,
POPUP_SOC_CF,
POPUP_SystemFault,
POPUP_SystemFault1,
POPUP_GearFault,
POPUP_WeightOverload,
POPUP_WeightOverload2,
POPUP_RemoteLocking,
POPUP_PositionNotClosed,
POPUP_DepartureReminder,
POPUP_OTA_0,
POPUP_OTA_1,
POPUP_OTA_2,
POPUP_OTA_3,
POPUP_OTA_4,
POPUP_OTA_5,
POPUP_ESC,
//POPUP_Over_Speed,
POPUP_NUMBER_TOTAL, /*报警总数*/
};
#endif
#include "Popup_Scheduler.h"
#include "Sound_Scheduler.h"
#include "EOL_Para.h"
void UpdateClassMbFirst(void);
void UpdateClassMbLoop(void);
void UpdateCurrentPopup(void);
/*指向报警属性表,根据声音或报警的配置选择不同的属性 (和弦音/真人语音)*/
const PopupAttributeStruct *PopupAttributeTable;
/******************************************************************************
报警属性表
******************************************************************************/
const PopupAttributeStruct PopupAttributeTable_1[POPUP_NUMBER_TOTAL] =
{ /* 910101-8*/
/*============================================================================================================================================================================================================================
| 报警序号 |优先级 | 报警类 | 成员 | 数量| 播放模式 | 报警音 | 声音模式:持续/单周期| 保持时间*100ms |最小保持时间*100ms |
============================================================================================================================================================================================================================*/
/* 雷达长鸣 */{ 12u, POPUP_Radar_Changming, NULL, 1u, POPUP_MODE_LONG_HINT, SND_RADAR_Changming, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 雷达1hz */{ 12u, POPUP_Radar_1HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_RADAR_1HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 雷达2hz */{ 12u, POPUP_Radar_2HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_RADAR_2HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 雷达4hz */{ 12u, POPUP_Radar_4HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_RADAR_4HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 倒车雷达系统故障 */{ 12u, POPUP_RADAR_SYSTEM_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_2S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 倒车雷达传感器故障 */{ 12u, POPUP_RADAR_SENSOR_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_2S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 雷达开关故障 */{ 0u, POPUP_RADAR_SWITCH_FAILURE, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_0S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 雷达开关故障 */{ 0u, POPUP_RADAR_CHECK_OK, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RADAR_OK0S, POPUP_MODE_SINGLE, 30u, 10u, },
/* 制动液位低 */{ 2u, POPUP_EPB_Status, NULL, 1u, POPUP_MODE_LONG_HINT, SND_EPB_Status, POPUP_MODE_SINGLE, 11u, 10u, },
/* 安全带未系 1HZ */{ 3u, POPUP_SEATBELT_DR_1HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_SEATBELT_DR_1HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 安全带未系 2HZ */{ 3u, POPUP_SEATBELT_DR_2HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_SEATBELT_DR_2HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 车门开报警 */{ 4u, POPUP_DoorOpen, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_DoorOpen, POPUP_MODE_SINGLE, 11u, 10u, },
/* 车门开报警 1HZ */{ 4u, POPUP_DoorOpen_1HZ, NULL, 1u, POPUP_MODE_LONG_HINT, SND_DoorOpen_1HZ, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* EBD故障 */{ 6u, POPUP_EBD_fault, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_EBD_fault, POPUP_MODE_SINGLE, 11u, 10u, },
/* ABS故障 */{ 7u, POPUP_ABS, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_ABS, POPUP_MODE_SINGLE, 11u, 10u, },
/* EPS故障 */{ 8u, POPUP_EPS, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_EPS, POPUP_MODE_SINGLE, 11u, 10u, },
/* 驻车制动 */{ 5u, POPUP_Park_Brak, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_Park_Brak, POPUP_MODE_SINGLE, 11u, 10u, },
/* 电机故障 */{ 9u, POPUP_MotorFault, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_MotorFault, POPUP_MODE_SINGLE, 11u, 10u, },
/* 动力电池报警 */{ 10u, POPUP_SOC_Fault, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_SOC_Fault, POPUP_MODE_SINGLE, 11u, 10u, },
/* 高压绝缘故障 */{ 11u, POPUP_InsulationFault, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_InsulationFault, POPUP_MODE_SINGLE, 11u, 10u, },
/* 电池热失控 */{ 1u, POPUP_SOC_HT, NULL, 1u, POPUP_MODE_LONG_HINT, SND_SOC_HT, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* 单踏板功能激活 */{ 13u, POPUP_Energy_Recovery, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_Energy_Recovery, POPUP_MODE_SINGLE, 11u, 10u, },
/* 单踏板功能激活 1HZ 3次 1.4变更新增 */{ 13u, POPUP_Energy_Recovery_1, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_Energy_Recovery_1, POPUP_MODE_MULTI, 0xFFFFu, 10u, },
/* ECO状态激活 */{ 14u, POPUP_ECO, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_ECO, POPUP_MODE_SINGLE, 11u, 10u, },
/* READY状态激活 */{ 15u, POPUP_READY, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_READY, POPUP_MODE_SINGLE, 11u, 10u, },
/* 限功率报警 */{ 16u, POPUP_PowerLimit, NULL, 1u, POPUP_MODE_LONG_HINT, SND_PowerLimit, POPUP_MODE_SINGLE, 11u, 10u, },
/* 蓄电池电量低 */{ 17u, POPUP_SOC_LP, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_SOC_LP, POPUP_MODE_SINGLE, 11u, 10u, },
/* 蓄电池充电故障 */{ 17u, POPUP_SOC_CF, NULL, 1u, POPUP_MODE_LONG_HINT, SND_SOC_CF, POPUP_MODE_MULTI, 11u, 10u, },
/* 动力系统故障 */{ 18u, POPUP_SystemFault, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_SystemFault, POPUP_MODE_SINGLE, 11u, 10u, },
/* 动力系统故障 */{ 18u, POPUP_SystemFault1, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_SystemFault1, POPUP_MODE_SINGLE, 11u, 10u, },
/* 换挡错误 */{ 17u, POPUP_GearFault, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_GearFault, POPUP_MODE_SINGLE, 11u, 10u, },
/* 高压报警 */{ 20u, POPUP_WeightOverload, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_WeightOverload, POPUP_MODE_SINGLE, 11u, 10u, },
/* 高压报警 */{ 20u, POPUP_WeightOverload2, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_WeightOverload2, POPUP_MODE_SINGLE, 11u, 10u, },
/* 远程锁车 */{ 21u, POPUP_RemoteLocking, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_RemoteLocking, POPUP_MODE_SINGLE, 11u, 10u, },
/* 小灯未关 */{ 22u, POPUP_PositionNotClosed, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_PositionNotClosed, POPUP_MODE_SINGLE, 600u, 10u, },
/* 驾驶员离车提醒 */{ 23u, POPUP_DepartureReminder, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_DepartureReminder, POPUP_MODE_SINGLE, 30u, 10u, },
/* OTA 报警0 */{ 22u, POPUP_OTA_0, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_OTA_0, POPUP_MODE_SINGLE, 11u, 10u, },
/* OTA 报警1 */{ 22u, POPUP_OTA_1, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_OTA_1, POPUP_MODE_SINGLE, 11u, 10u, },
/* OTA 报警2 */{ 22u, POPUP_OTA_2, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_OTA_2, POPUP_MODE_SINGLE, 11u, 10u, },
/* OTA 报警3 */{ 22u, POPUP_OTA_3, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_OTA_3, POPUP_MODE_SINGLE, 11u, 10u, },
/* OTA 报警4 */{ 22u, POPUP_OTA_4, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_OTA_4, POPUP_MODE_SINGLE, 11u, 10u, },
/* OTA 报警5 */{ 22u, POPUP_OTA_5, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_OTA_5, POPUP_MODE_SINGLE, 11u, 10u, },
/* OTA 报警5 */{ 22u, POPUP_ESC, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_ESC, POPUP_MODE_SINGLE, 11u, 10u, },
///* 超速报警 */{ 13u, POPUP_Over_Speed, NULL, 1u, POPUP_MODE_SHORT_HINT, SND_Over_Speed, POPUP_MODE_MULTI, 11u, 10u, },
/*==========================================================================================================================================================================================================================================*/
};
/*** 弹出信息状态(链)表 ***/
#pragma location ="BACKUP_RAM_CONTENT"
PopupStatusStruct PopupStatus[POPUP_NUMBER_TOTAL];
/*=====================================================
弹出信息调度链表
-------------------------------------------------------
序号 | 链表名称
(链表控制数组下标) |
-------------------------------------------------------
0 | POPUP_LINK_LIST_NEW_WARNING
1 | POPUP_LINK_LIST_WARNING
2 | POPUP_LINK_LIST_MASKED_WARNING
=====================================================*/
#pragma location ="BACKUP_RAM_CONTENT"
PopupLinkListCtrlStruct PopupLinkList[3u];
/*** 弹出信息调度管理 ***/
#pragma location ="BACKUP_RAM_CONTENT"
PopupSchedulingStruct PopupScheduling;
/******************************************************************************
函数名:Popup_Scheduler_Init
功 能:初始化弹出信息调度器
参 数:无
返回值:无
******************************************************************************/
void Popup_Scheduler_Init(void)
{
uint8_t i;
PopupAttributeTable= PopupAttributeTable_1;
for (i = 0u; i < (uint8_t)POPUP_NUMBER_TOTAL; i++)
{
PopupStatus[i].Status = POPUP_STATUS_OFF;
PopupStatus[i].LinkList = POPUP_LINK_LIST_NONE;
PopupStatus[i].Prev = i;
PopupStatus[i].Next = i;
PopupStatus[i].SndReqCode = 1u;
}
Popup_Link_List_Init( POPUP_LINK_LIST_NEW_WARNING, POPUP_PRIORITY_NUMBER_WARNING);
Popup_Link_List_Init( POPUP_LINK_LIST_WARNING, POPUP_PRIORITY_NUMBER_WARNING);
Popup_Link_List_Init(POPUP_LINK_LIST_MASKED_WARNING, POPUP_PRIORITY_NUMBER_WARNING);
PopupScheduling.Timer = 0u;
PopupScheduling.Current = POPUP_NONE;
PopupScheduling.NewSnd = 0u;
PopupScheduling.WarningExist = 0u;
PopupScheduling.MaskReq = 0u;
PopupScheduling.LastMasked = POPUP_NONE;
PopupScheduling.MaskedPolling = 0u;
};
/******************************************************************************
函数名:Popup_Scheduling_Service
功 能:调度弹出信息,更新当前应播放的弹出信息与应播放的报警音
可能导致播放的弹出信息发生切换的条件: 1.当前播放的弹出信息被删除
或 2.当前播放的弹出信息被屏蔽
或 3.有新弹出信息到来
或 4.当前弹出信息播放时间到
参 数:无
返回值:无
*******************************************************************************
注 意:该服务函数必须每100ms被调用一次
******************************************************************************/
void Popup_Scheduling_Service(void)
{
if (PopupScheduling.Timer < 0xFFFFu) /*910101-1*/
{
PopupScheduling.Timer++;
}
/*===========================================================================
1.当前播放的弹出信息被删除
============================================================================*/
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupStatus[PopupScheduling.Current].Status == POPUP_STATUS_DELETE)
{
if (PopupStatus[PopupScheduling.Current].LinkList == POPUP_LINK_LIST_NEW_WARNING)/*首次播放*/
{
if (((PopupScheduling.Timer >= POPUP_DISP_TIME_MIN ) &&
(PopupScheduling.Timer < POPUP_DISP_TIME_NORMAL) ) ||
(PopupScheduling.Timer==0xFFFFu )
)/*超过最小播放时间,可以删除状态置为OFF*/
{
Popup_Link_List_Remove(PopupScheduling.Current);
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_OFF;
if(PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cur != POPUP_NONE) /* 还有等待的报警需要播放*/
{
UpdateCurrentPopup();
}
else /* 没有报警要播放了*/
{
PopupScheduling.Current = POPUP_NONE;
PopupScheduling.Timer = POPUP_DISP_TIME_NORMAL;
}
}
}
else/*循环播放可以直接删除*/
{
Popup_Link_List_Remove(PopupScheduling.Current);
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_OFF;
if(PopupLinkList[POPUP_LINK_LIST_WARNING].Cur != POPUP_NONE)
{
PopupScheduling.Current = PopupLinkList[POPUP_LINK_LIST_WARNING].Cur;
}
else
{
PopupScheduling.Current = POPUP_NONE;
PopupScheduling.Timer = POPUP_DISP_TIME_NORMAL ;
}
}
}
else if (PopupStatus[PopupScheduling.Current].Status == POPUP_STATUS_CLEAR)
{
Popup_Link_List_Remove(PopupScheduling.Current);
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_OFF;
PopupScheduling.Current = POPUP_NONE;
PopupScheduling.Timer = POPUP_DISP_TIME_NORMAL ;
}
else
{}
}
/*===========================================================================
4.有新弹出信息到来
============================================================================*/
/*** #4.3:处理新到来的报警信息 ***/
if ((PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cur != POPUP_NONE) && \
(PopupStatus[PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cur].Status == POPUP_STATUS_NEW))
{
if (PopupScheduling.Current != POPUP_NONE ) /*当前有报警在播放*/
{
if( PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)/*有效性检查*/
{
switch (PopupStatus[PopupScheduling.Current].LinkList)
{
case POPUP_LINK_LIST_NEW_WARNING : /*当前是报警信息在首次播放*/
/*报警信息可以打断报警信息,但被打断的报警信息必须至少播放达到或超过最小播放时间*/
if (((PopupScheduling.Timer >= POPUP_DISP_TIME_MIN ) &&
(PopupScheduling.Timer < POPUP_DISP_TIME_NORMAL) ) ||
(PopupScheduling.Timer==0xFFFFu) /*持续类报警解除*/
)
{
if (PopupScheduling.Current != PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cur)
{
if((PopupAttributeTable[PopupScheduling.Current].DispMode == POPUP_MODE_SHORT_HINT)) /*非持续播放的这类报警*/
{
/*Popup_Link_List_Remove(PopupScheduling.Current);从列表移除*/
/*PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_MASKED;.*/
/*************只报一次就屏蔽(不需要查询)的处理方式:改状态就行了*/
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_NEW;/*改为新触发的报警,高优先级结束后重新报警*/
UpdateClassMbFirst(); /*报警类的成员状态更新为首次*/
}
else if(PopupAttributeTable[PopupScheduling.Current].DispMode ==POPUP_MODE_LONG_WARNING)/*被打断的是要循环播放的*/
{
Popup_Link_List_Remove(PopupScheduling.Current);/*从列表移除*/
Popup_Link_List_Insert(POPUP_LINK_LIST_WARNING, PopupScheduling.Current);
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_LOOP; /*标记原信息进入循环播放*/
UpdateClassMbLoop();/*报警类的成员状态更新为循环*/
}
else
{}
}
UpdateCurrentPopup(); /*更新当前报警 重置播放时间*/
}
break; /*910101-7 910101-5 */
case POPUP_LINK_LIST_WARNING : /*当前是报警信息在循环播放*/
default : /*意外情况*/
UpdateCurrentPopup(); /*更新当前报警*/
break;
}
}
}
else /*此信息到来时并无其他信息播放*/
{
UpdateCurrentPopup();/*更新当前报警*/
}
}
/*===========================================================================
6.当前弹出信息播放时间到
============================================================================*/
/*只在播放时间到的那个时间点做处理,超出时间认为当前无弹出信息播放,持续得报警不处理 */
if( (PopupScheduling.Timer == POPUP_DISP_TIME_NORMAL ) && (POPUP_DISP_TIME_NORMAL != 0xFFFFu) )/*910101-1*/
{
/*** #6.1:处理播放完的报警 ***/
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
switch (PopupStatus[PopupScheduling.Current].LinkList)
{
case POPUP_LINK_LIST_NEW_WARNING :/*首次报警链表*/
Popup_Link_List_Remove(PopupScheduling.Current); /*将当前报警移除报警列表*/
if (PopupAttributeTable[PopupScheduling.Current].DispMode == POPUP_MODE_SHORT_HINT)
{ /*播放一次就隐藏且不要查询*/
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_MASKED;
}
else if(PopupAttributeTable[PopupScheduling.Current].DispMode == POPUP_MODE_LONG_WARNING)
{
/*循环显示的处理根据需要添加*/
Popup_Link_List_Insert(POPUP_LINK_LIST_WARNING, PopupScheduling.Current); /*将原信息转移至循环报警列表中*/
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_LOOP; /*标记原信息进入循环播放*/
UpdateClassMbLoop();/*报警类的成员状态更新为循环*/
PopupLinkList[POPUP_LINK_LIST_WARNING].Cur = PopupStatus[PopupScheduling.Current].Next;
}
else
{
/*其他类型需求需*/
}
break;
case POPUP_LINK_LIST_WARNING :/*循环报警链表*/
PopupLinkList[POPUP_LINK_LIST_WARNING].Cur = PopupStatus[PopupScheduling.Current].Next;
break;
default :
break;
}
}
/*** #6.2:查找下一个播放的报警 ***/
if (PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cnt)
{ /*有未播放过的报警*/
PopupScheduling.Current = PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cur;
}
else if (PopupLinkList[POPUP_LINK_LIST_WARNING].Cnt)
{ /*有循环播放的报警*/
PopupScheduling.Current = PopupLinkList[POPUP_LINK_LIST_WARNING].Cur;
}
else
{ /*无报警需要播放*/
PopupScheduling.Current = POPUP_NONE;
}
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
PopupScheduling.Timer = 0u;
if (PopupStatus[PopupScheduling.Current].Status == POPUP_STATUS_NEW)
{
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_FIRST;
UpdateClassMbFirst();/*报警类的成员状态更新为首次*/
}
else
{
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_LOOP;
}
}
}
/*===========================================================================
7.更新报警存在状态
============================================================================*/
if ((PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cnt != 0u) || \
(PopupLinkList[POPUP_LINK_LIST_WARNING].Cnt != 0u) || \
(PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cnt != 0u))
{
PopupScheduling.WarningExist = 1u;
}
else
{
PopupScheduling.WarningExist = 0u;
}
}
void UpdateClassMbFirst(void)
{
uint8_t i;
uint8_t PopupMbr;
if(PopupScheduling.Current<(uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupAttributeTable[PopupScheduling.Current].pMbrList != NULL) /*如果是一个报警类*/
{
for (i = 0u; i < PopupAttributeTable[PopupScheduling.Current].MbrCnt; i++) /*更新该类下所有成员的状态*/
{
PopupMbr = PopupAttributeTable[PopupScheduling.Current].pMbrList[i];
if (PopupStatus[PopupMbr].Status == POPUP_STATUS_NEW)
{
PopupStatus[PopupMbr].Status = POPUP_STATUS_FIRST; /*标记成员进入首次播放*/
}
}
if (PopupStatus[PopupScheduling.Current].SndReqCode == 0xFFu) /*更新声音请求码*/
{
PopupStatus[PopupScheduling.Current].SndReqCode = 0x01u;
}
else
{
PopupStatus[PopupScheduling.Current].SndReqCode++;
}
}
}
}
void UpdateClassMbLoop(void)
{
uint8_t i;
uint8_t PopupMbr;
if(PopupScheduling.Current<(uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupAttributeTable[PopupScheduling.Current].pMbrList != NULL) /*如果原信息是一个报警类*/
{
for (i = 0u; i < PopupAttributeTable[PopupScheduling.Current].MbrCnt; i++) /*更新该类下所有成员的状态*/
{
PopupMbr = PopupAttributeTable[PopupScheduling.Current].pMbrList[i];
if (PopupStatus[PopupMbr].Status == POPUP_STATUS_FIRST)
{
PopupStatus[PopupMbr].Status = POPUP_STATUS_LOOP; /*标记成员进入循环播放*/
}
}
}
}
}
void UpdateCurrentPopup(void)
{
PopupScheduling.Current = PopupLinkList[POPUP_LINK_LIST_NEW_WARNING].Cur; /*新到来的报警进入当前播放*/
if(PopupScheduling.Current<(uint8_t)POPUP_NUMBER_TOTAL) /*合法性检擦*/
{
PopupStatus[PopupScheduling.Current].Status = POPUP_STATUS_FIRST; /*标记此信息进入首次播放*/
PopupScheduling.Timer = 0u; /*重置播放时间*/ /*910101-4*/
UpdateClassMbFirst(); /*报警类的成员状态更新为首次*/ /*910101-6*/
}
}
/******************************************************************************
函数名:Popup_Request
功 能:请求播放一个弹出信息
参 数:PopupID:请求播放的弹出信息
返回值:无
******************************************************************************/
void Popup_Request(uint8_t PopupID)
{
if(PopupID<(uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupStatus[PopupID].Status == POPUP_STATUS_OFF)
{
if (PopupAttributeTable[PopupID].MbrCnt == 0u) /*申请的报警是某报警类的成员*/
{
PopupStatus[PopupID].Status = POPUP_STATUS_NEW; /*置该弹出信息状态为新信息状态*/
PopupID = PopupAttributeTable[PopupID].Class; /*类成员不进入链表,获取该报警对应的报警类进行调度*/
Popup_Link_List_Remove(PopupID); /*将该报警类移出原报警列表*/
}
PopupStatus[PopupID].Status = POPUP_STATUS_NEW;
Popup_Link_List_Insert(POPUP_LINK_LIST_NEW_WARNING, PopupID);
}
else if (PopupStatus[PopupID].Status == POPUP_STATUS_DELETE)
{
/*有POPUP_STATUS_DELETE标志的一定是正在播放的信息
直接根据所在链表恢复状态即可*/
if(PopupStatus[PopupID].LinkList == POPUP_LINK_LIST_NEW_WARNING)
{
PopupStatus[PopupID].Status = POPUP_STATUS_FIRST;
}
else if (PopupStatus[PopupID].LinkList == POPUP_LINK_LIST_WARNING)
{
PopupStatus[PopupID].Status = POPUP_STATUS_LOOP;
}
else if (PopupStatus[PopupID].LinkList == POPUP_LINK_LIST_MASKED_WARNING)
{
PopupStatus[PopupID].Status = POPUP_STATUS_MASKED;
}
else
{ }
}
else
{ }
}
}
/******************************************************************************
函数名:Popup_Delete
功 能:请求解除播放一个弹出信息
参 数:PopupID:请求解除播放的弹出信息
返回值:无
******************************************************************************/
void Popup_Delete(uint8_t PopupID)
{
uint8_t i;
uint8_t PopupCls;
uint8_t PopupMbr;
uint8_t dis=0u;
if(PopupID<(uint8_t)POPUP_NUMBER_TOTAL)
{
if (!((PopupStatus[PopupID].Status == POPUP_STATUS_OFF) || \
(PopupStatus[PopupID].Status == POPUP_STATUS_DELETE) || \
(PopupStatus[PopupID].Status == POPUP_STATUS_CLEAR)))
{
if (PopupAttributeTable[PopupID].MbrCnt == 0u) /*要删除的报警是某报警类的成员*/
{
Popup_Link_List_Remove(PopupID);
PopupStatus[PopupID].Status = POPUP_STATUS_OFF;
PopupCls = PopupAttributeTable[PopupID].Class; /*获取该报警对应的报警类*/
for (i = 0u; i < PopupAttributeTable[PopupCls].MbrCnt; i++) /*检查该类报警下的成员*/
{
PopupMbr = PopupAttributeTable[PopupCls].pMbrList[i];
if ((PopupStatus[PopupMbr].Status == POPUP_STATUS_NEW) || \
(PopupStatus[PopupMbr].Status == POPUP_STATUS_FIRST) || \
(PopupStatus[PopupMbr].Status == POPUP_STATUS_LOOP) || \
(PopupStatus[PopupMbr].Status == POPUP_STATUS_MASKED))
{
dis =1u;
}
}
if(dis==0u)
{
PopupID = PopupCls;
}
}
if(dis==0u)
{
if (PopupScheduling.Current == PopupID) /*正在播放中的报警不能立即删除,置标志,由调度程序删除*/
{
PopupStatus[PopupID].Status = POPUP_STATUS_DELETE;
}
else
{
Popup_Link_List_Remove(PopupID);
PopupStatus[PopupID].Status = POPUP_STATUS_OFF;
}
}
}
}
}
/******************************************************************************
函数名:Popup_Clear
功 能:请求立即清除播放一个弹出信息,无论该信息是否达到最小播放时间
用于IGN OFF时,立即清除弹出信息播放
参 数:PopupID:请求解除播放的弹出信息
返回值:无
******************************************************************************/
void Popup_Clear(uint8_t PopupID)
{
uint8_t i;
uint8_t PopupCls;
uint8_t PopupMbr;
uint8_t dis=0u;
if(PopupID<(uint8_t)POPUP_NUMBER_TOTAL)
{
if(!((PopupStatus[PopupID].Status == POPUP_STATUS_OFF) || \
(PopupStatus[PopupID].Status == POPUP_STATUS_CLEAR)))
{
if (PopupAttributeTable[PopupID].MbrCnt == 0u) /*要删除的报警是某报警类的成员*/
{
Popup_Link_List_Remove(PopupID);
PopupStatus[PopupID].Status = POPUP_STATUS_OFF;
PopupCls = PopupAttributeTable[PopupID].Class; /*获取该报警对应的报警类*/
for (i = 0u; i < PopupAttributeTable[PopupCls].MbrCnt; i++) /*检查该类报警下的成员*/
{
PopupMbr = PopupAttributeTable[PopupCls].pMbrList[i];
if ((PopupStatus[PopupMbr].Status == POPUP_STATUS_NEW) || \
(PopupStatus[PopupMbr].Status == POPUP_STATUS_FIRST) || \
(PopupStatus[PopupMbr].Status == POPUP_STATUS_LOOP) || \
(PopupStatus[PopupMbr].Status == POPUP_STATUS_MASKED))
{
dis=1u;
}
}
if(dis==0u)
{
PopupID = PopupCls;
}
}
if(dis==0u)
{
if (PopupScheduling.Current == PopupID) /*正在播放中的报警不能立即删除,置标志,由调度程序删除*/
{
PopupStatus[PopupID].Status = POPUP_STATUS_CLEAR;
}
else
{
Popup_Link_List_Remove(PopupID);
PopupStatus[PopupID].Status = POPUP_STATUS_OFF;
}
}
}
}
}
/******************************************************************************
函数名:Popup_Mask_Request
功 能:请求屏蔽报警信息
可以在任意时刻发出屏蔽请求,只有满足屏蔽条件时,报警信息才会被屏蔽
参 数:无
返回值:无
******************************************************************************/
void Popup_Mask_Request(void)
{
PopupScheduling.MaskReq = 1u;
}
/******************************************************************************
函数名:Popup_Mask_Request
功 能:请求屏蔽报警信息
可以在任意时刻发出屏蔽请求,只有满足屏蔽条件时,报警信息才会被屏蔽
参 数:无
返回值:无
******************************************************************************/
void Popup_Hint_Mask_Request(uint8_t PopupID)
{
if (PopupID < (uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupScheduling.Current == PopupID) /*正在播放中的提示信息不能立即屏蔽,置标志,由调度程序屏蔽*/
{
PopupStatus[PopupID].Status = POPUP_STATUS_MASKED;
}
else
{
PopupStatus[PopupID].Status = POPUP_STATUS_LOOP;
Popup_Link_List_Remove(PopupScheduling.Current);
}
}
}
/******************************************************************************
函数名:Popup_Get_Status
功 能:获取弹出信息的当前状态
参 数:PopupID:弹出信息名称
返回值:弹出信息的当前状态
******************************************************************************/
uint8_t Popup_Get_Status(uint8_t PopupID)
{
uint8_t Status;
if (PopupID < (uint8_t)POPUP_NUMBER_TOTAL)
{
Status = PopupStatus[PopupID].Status;
}
else
{
Status = POPUP_STATUS_OFF;
}
return Status;
}
/******************************************************************************
函数名:Popup_Get_Current_Type
功 能:获取当前播放的弹出信息的类型
参 数:无
返回值:当前播放的弹出信息的类型
******************************************************************************/
uint8_t Popup_Get_Current_Type(void)
{
uint8_t m8;
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
m8= PopupAttributeTable[PopupScheduling.Current].DispMode;
}
else
{
m8= POPUP_NONE;
}
return m8;
}
/******************************************************************************
函数名:Popup_Get_Current_Message
功 能:获取当前应播放的弹出信息
参 数:无
返回值:当前应播放的弹出信息
******************************************************************************/
uint8_t Popup_Get_Current_Message(void)
{
uint8_t m8;
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
m8= PopupAttributeTable[PopupScheduling.Current].Class;
}
else
{
m8= POPUP_NONE;
}
return m8;
}
/******************************************************************************
函数名:Popup_Get_Current_Sound
功 能:获取当前应播放的声音
参 数:无
返回值:当前应播放的声音
******************************************************************************/
uint8_t Popup_Get_Current_Sound(void)
{
uint8_t m8;
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
m8= PopupAttributeTable[PopupScheduling.Current].Snd;
}
else
{
m8= SND_NONE;
}
return m8;
}
/******************************************************************************
函数名:Popup_Get_Current_Sound_Req_Code
功 能:获取当前应播放的声音的请求码
参 数:无
返回值:请求码
******************************************************************************/
uint8_t Popup_Get_Current_Sound_Req_Code(void)
{
uint8_t m8;
if (PopupScheduling.Current < (uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupAttributeTable[PopupScheduling.Current].SndMode == POPUP_MODE_MULTI)
{
m8 = PopupStatus[PopupScheduling.Current].SndReqCode;
}
else
{
if (PopupStatus[PopupScheduling.Current].Status == POPUP_STATUS_FIRST)
{
m8 = PopupStatus[PopupScheduling.Current].SndReqCode;
}
else
{
m8=0u;
}
}
}
else
{
m8 =0u;
}
return m8;
}
/******************************************************************************
函数名:Popup_Get_Warning_Status
功 能:获取报警信息的状态,用于惊叹号标志的播放
参 数:无
返回值:0 - 当前没有报警信息
1 - 当前有报警信息(新报警信息 或 循环播放报警信息 或 已屏蔽的报警信息)
******************************************************************************/
uint8_t Popup_Get_Warning_Status(void)
{
return PopupScheduling.WarningExist;
}
/******************************************************************************
函数名:Popup_Get_First_Masked_Warning
功 能:获取屏蔽的报警信息中的第一个报警信息
当前没有已屏蔽的报警信息时,返回 POPUP_NONE
参 数:无
返回值:已屏蔽的第一个报警信息
******************************************************************************/
uint8_t Popup_Get_First_Masked_Warning(void)
{
uint8_t i,m8;
uint8_t PopupID;
m8 = POPUP_NONE;
if (PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cnt)
{
i = 0u;
while (i < PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].PrioNum)
{
PopupID = PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Prio[i].First;
if (PopupID != POPUP_NONE)
{
m8= PopupID;
}
i++;
}
}
else
{
m8 = POPUP_NONE;
}
return m8;
}
/******************************************************************************
函数名:Popup_Get_Last_Masked_Warning
功 能:获取屏蔽的报警信息中的最后一个报警信息
当前没有已屏蔽的报警信息时,返回 POPUP_NONE
参 数:无
返回值:已屏蔽的最后一个报警信息
******************************************************************************/
uint8_t Popup_Get_Last_Masked_Warning(void)
{
uint8_t i,m8;
uint8_t j;
uint8_t PopupID;
m8 = POPUP_NONE;
if (PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cnt)
{
i = 0u;
while (i < PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].PrioNum)
{
i++;
j = PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].PrioNum - i;
PopupID = PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Prio[j].Last;
if (PopupID != POPUP_NONE)
{
m8 =PopupID;
}
}
}
else
{
m8 = POPUP_NONE;
}
return m8;
}
/******************************************************************************
函数名:Popup_Get_Masked_Warning_Msg
功 能:获取屏蔽的报警信息
当前没有已屏蔽的报警信息时,返回 POPUP_NONE
参 数:无
返回值:已屏蔽的报警信息
******************************************************************************/
uint8_t Popup_Get_Masked_Warning_Msg(void)
{
uint8_t PopupID ,m8;
PopupID = PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur;
if (PopupID < (uint8_t)POPUP_NUMBER_TOTAL)
{
m8 = PopupAttributeTable[PopupID].Class;
}
else
{
m8 = POPUP_NONE;
}
return m8;
}
/******************************************************************************
函数名:Popup_Masked_Warning_Polling_Reset
功 能:重置已屏蔽的报警查询起点
参 数:Mode:查询模式 POPUP_POLLING_FORWARD - 正向查找模式
POPUP_POLLING_REVERSE - 逆向查找模式
返回值:无
******************************************************************************/
void Popup_Masked_Warning_Polling_Reset(uint8_t Mode)
{
uint8_t PopupID;
if (Mode == POPUP_POLLING_FORWARD)
{
PopupID = Popup_Get_First_Masked_Warning();
}
else
{
PopupID = Popup_Get_Last_Masked_Warning();
}
PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur = PopupID;
}
/******************************************************************************
函数名:Popup_Masked_Warning_Polling
功 能:查询已屏蔽的报警
每调用一次此函数,已屏蔽报警指针会按指定方向移动一位,当指针已移指定方向
上的最后一个报警信息时,再次向同一方向查询,当前的已屏蔽报警信息会变为
POPUP_NONE 表示报警查询已结束
例如:当前有已屏蔽报警 A、B、C、D,调用Popup_Masked_Warning_Polling_Reset
函数,设定方向为 POPUP_POLLING_FORWARD 时,已屏蔽报警指针会指向报警A,而后,
调用该函数设定方向为 POPUP_POLLING_FORWARD 时已屏蔽报警指针即指向报警B.
重复调用此函数且方向不变至已屏蔽报警指针指向报警D后,再以相同方向调用此函
数则返回 POPUP_NONE,表示查询已结束
通过调用Popup_Get_Masked_Warning可读出当前已屏蔽报警指针指向的报警
参 数:Mode:查询模式 POPUP_POLLING_FORWARD - 正向查找模式
POPUP_POLLING_REVERSE - 逆向查找模式
返回值:无
******************************************************************************/
void Popup_Masked_Warning_Polling(uint8_t Mode)
{
uint8_t PopupEnd;
uint8_t PopupID;
PopupID = PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur;
if (PopupID != POPUP_NONE)
{
if (Mode == POPUP_POLLING_FORWARD)
{
PopupEnd = Popup_Get_Last_Masked_Warning();
if (PopupEnd != POPUP_NONE)
{
if (PopupID == PopupEnd)
{
PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur = POPUP_NONE;
}
else
{
PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur = PopupStatus[PopupID].Next;
}
}
}
else
{
PopupEnd = Popup_Get_First_Masked_Warning();
if (PopupEnd != POPUP_NONE)
{
if (PopupID == PopupEnd)
{
PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur = POPUP_NONE;
}
else
{
PopupLinkList[POPUP_LINK_LIST_MASKED_WARNING].Cur = PopupStatus[PopupID].Prev;
}
}
}
}
}
/******************************************************************************
函数名:Popup_Link_List_Init
功 能:初始化链表
参 数:LinkListID:链表名称
PrioNum :该链表下优先级数
返回值:无
******************************************************************************/
void Popup_Link_List_Init(uint8_t LinkListID, uint8_t PrioNum)
{
uint8_t i;
PopupLinkList[LinkListID].Cnt = 0u;
PopupLinkList[LinkListID].Cur = POPUP_NONE;
PopupLinkList[LinkListID].PrioNum = PrioNum;
for (i = 0u; i < PrioNum; i++)
{
PopupLinkList[LinkListID].Prio[i].First = POPUP_NONE;
PopupLinkList[LinkListID].Prio[i].Last = POPUP_NONE;
}
}
/******************************************************************************
函数名:Popup_Link_List_Insert
功 能:向链表中插入弹出信息
参 数:LinkListID:链表名称
PopupID :弹出信息名称
返回值:无
******************************************************************************/
void Popup_Link_List_Insert(uint8_t LinkListID, uint8_t PopupID) /*823008-8*/
{
uint8_t i;
uint8_t FoundID;
uint8_t Prio;
uint8_t InsResult;
uint8_t SemeType_Pirod;/*报警类型相同(PEPS,SHORT_HINT,LONG_HINT)*/
SemeType_Pirod = 0u;
if (PopupID < (uint8_t)POPUP_NUMBER_TOTAL)
{
if (PopupStatus[PopupID].LinkList != LinkListID) /*弹出信息已经不在前链表中*/
{
Prio = PopupAttributeTable[PopupID].Priority; /*获取弹出信息优先级*/
if (PopupLinkList[LinkListID].Cnt == 0u) /*当前链表下没有任何弹出信息*/
{
PopupStatus[PopupID].Prev = PopupID; /*因只有一个弹出信息,前后弹出信息均指向自己*/
PopupStatus[PopupID].Next = PopupID;
PopupLinkList[LinkListID].Cur = PopupID; /*当前此链表指针指向该弹出信息*/
PopupLinkList[LinkListID].Prio[Prio].First = PopupID; /*优先级维护*/
PopupLinkList[LinkListID].Prio[Prio].Last = PopupID;
}
else /*当前链表已有弹出信息*/
{
InsResult = 0u; /*清插入成功标示*/
for (i = 0u; i <= Prio; i++) /*从当前优先级起前向查找新弹出信息的接入点*/
{
FoundID = PopupLinkList[LinkListID].Prio[Prio - i].Last;
if (FoundID != POPUP_NONE) /*找到插入点*/
{
/*需要插入的报警ID的优先级==找到的插入点优先级 && 类型相同(SHORT_HINT,LONG_HINT)*/
if( (PopupAttributeTable[PopupID].Priority == PopupAttributeTable[FoundID].Priority)
&&
(
((PopupAttributeTable[PopupID].DispMode == POPUP_MODE_SHORT_HINT) &&
(PopupAttributeTable[FoundID].DispMode == POPUP_MODE_SHORT_HINT)) ||
((PopupAttributeTable[PopupID].DispMode == POPUP_MODE_LONG_HINT) &&
(PopupAttributeTable[FoundID].DispMode == POPUP_MODE_LONG_HINT))
)
)
{
SemeType_Pirod = 1u; /*符合相同优先级打断规则*/
}
if(SemeType_Pirod == 1u)
{
FoundID = PopupLinkList[LinkListID].Prio[Prio].First;
PopupStatus[PopupStatus[FoundID].Prev].Next = PopupID; /*链接前一个*/
PopupStatus[PopupID].Prev = PopupStatus[FoundID].Prev; /*插到此类型的最前面*/
PopupStatus[PopupID].Next = FoundID;
PopupStatus[FoundID].Prev = PopupID;
/* PopupStatus[FoundID].Next 保持不变*/
InsResult = 1u; /*插入成功*/
}
else/*其他情况按照优先级排队规则插入*/
{
PopupStatus[PopupID].Prev = FoundID; /*插入弹出信息,维护链表*/
PopupStatus[PopupID].Next = PopupStatus[FoundID].Next;
PopupStatus[PopupStatus[FoundID].Next].Prev = PopupID;
PopupStatus[FoundID].Next = PopupID;
InsResult = 1u; /*插入成功*/
}
break;
}
}
if (InsResult == 0u) /*前向查找时未能成功插入新弹出信息则转入后向查找*/
{
for (i = Prio + 1u; i < PopupLinkList[LinkListID].PrioNum; i++)
{
FoundID = PopupLinkList[LinkListID].Prio[i].First;
if (FoundID != POPUP_NONE) /*找到插入点*/
{
PopupStatus[PopupID].Next = FoundID; /*插入弹出信息,维护链表*/
PopupStatus[PopupID].Prev = PopupStatus[FoundID].Prev;
PopupStatus[PopupStatus[FoundID].Prev].Next = PopupID;
PopupStatus[FoundID].Prev = PopupID;
break;
}
}
}
if(Prio < PopupAttributeTable[PopupLinkList[LinkListID].Cur].Priority) /*910101-2 910101-3 */
{
PopupLinkList[LinkListID].Cur = PopupID; /*将当前此链表指针指向更高优先级弹出信息*/
}
if ( (Prio < PopupAttributeTable[PopupLinkList[LinkListID].Cur].Priority) ||
((PopupAttributeTable[PopupLinkList[LinkListID].Cur].DispMode == POPUP_MODE_SHORT_HINT) && /*短时提示类相同优先级可以打断*/
(Prio <= PopupAttributeTable[PopupLinkList[LinkListID].Cur].Priority)) ||
((PopupAttributeTable[PopupLinkList[LinkListID].Cur].DispMode == POPUP_MODE_LONG_HINT) && /*长时提示类相同优先级可以打断*/
(Prio <= PopupAttributeTable[PopupLinkList[LinkListID].Cur].Priority)) /*此时没有报警触发的情况*/
)
{
PopupLinkList[LinkListID].Cur = PopupID; /*将当前此链表指针指向更高优先级弹出信息*/
}
if(PopupLinkList[LinkListID].Prio[Prio].First == POPUP_NONE) /*当前优先级下尚无弹出信息*/
{
PopupLinkList[LinkListID].Prio[Prio].First = PopupID; /*则当前优先级下的首末弹出信息均为此新弹出信息*/
PopupLinkList[LinkListID].Prio[Prio].Last = PopupID;
}
else /*当前优先级下有弹出信息*/
{
if(SemeType_Pirod == 1u)
{
PopupLinkList[LinkListID].Prio[Prio].First = PopupID;
}
else
{
PopupLinkList[LinkListID].Prio[Prio].Last = PopupID; /*依照插入规则,新弹出信息排列于此优先级下的末位*/
}
}
}
PopupLinkList[LinkListID].Cnt++;
PopupStatus[PopupID].LinkList = LinkListID; /*标记弹出信息所在链表*/
}
}
}
/******************************************************************************
函数名:Popup_Link_List_Remove
功 能:从弹出信息所在链表中移除弹出信息
参 数:PopupID :弹出信息名称
返回值:无
******************************************************************************/
void Popup_Link_List_Remove(uint8_t PopupID)
{
uint8_t Prio;
uint8_t LinkListID;
if (PopupID < (uint8_t)POPUP_NUMBER_TOTAL)
{
LinkListID = PopupStatus[PopupID].LinkList;
if (LinkListID!= POPUP_LINK_LIST_NONE)
{
if (PopupLinkList[LinkListID].Cnt)
{
PopupLinkList[LinkListID].Cnt--;
}
Prio = PopupAttributeTable[PopupID].Priority; /*获取弹出信息优先级*/
if (PopupLinkList[LinkListID].Cnt == 0u) /*删除后当前链表已下没有任何弹出信息*/
{
PopupLinkList[LinkListID].Prio[Prio].First = POPUP_NONE; /*优先级维护*/
PopupLinkList[LinkListID].Prio[Prio].Last = POPUP_NONE;
PopupLinkList[LinkListID].Cur = POPUP_NONE; /*重置当前此链表指针*/
}
else
{
if (PopupID == PopupLinkList[LinkListID].Prio[Prio].First)/*lmj报警在当前队列中优先级第一*/
{
if (PopupLinkList[LinkListID].Prio[Prio].First == PopupLinkList[LinkListID].Prio[Prio].Last)/*lmj如果当前就自己*/
{
PopupLinkList[LinkListID].Prio[Prio].First = POPUP_NONE; /*lmj当前优先级中没有报警了*/
PopupLinkList[LinkListID].Prio[Prio].Last = POPUP_NONE; /*lmj当前优先级中没有报警了*/
}
else
{
PopupLinkList[LinkListID].Prio[Prio].First = PopupStatus[PopupID].Next;/*lmj下一个提升为最高优先级*/
}
}
else if (PopupID == PopupLinkList[LinkListID].Prio[Prio].Last)
{
PopupLinkList[LinkListID].Prio[Prio].Last = PopupStatus[PopupID].Prev;/*lmj倒数第二优先级改为最低优先级*/
}
else
{}
if (PopupLinkList[LinkListID].Cur == PopupID)
{
PopupLinkList[LinkListID].Cur = PopupStatus[PopupID].Next;/*下一个立刻变为当前*/
}
PopupStatus[PopupStatus[PopupID].Prev].Next = PopupStatus[PopupID].Next; /*lmj 上下衔接*/
PopupStatus[PopupStatus[PopupID].Next].Prev = PopupStatus[PopupID].Prev;
}
PopupStatus[PopupID].Prev = PopupID; /*弹出信息被删除,前后弹出信息均指向自己*/
PopupStatus[PopupID].Next = PopupID;
PopupStatus[PopupID].LinkList = POPUP_LINK_LIST_NONE; /*弹出信息已不在任何链表中*/
}
}
}
void PopupAndSound_Delete(uint8_t PopupID)
{
if(PopupID < (uint8_t)POPUP_NUMBER_TOTAL)
{
Popup_Delete(PopupID);
Sound_Delete(PopupAttributeTable[PopupID].Snd);
}
}
\ No newline at end of file
#include "Popups.h"
#include "Popup_Interface.h"
#include "Common_Interface.h"
#include "Communication_Over_CAN.h"
#include "Services_ODO.h"
#include "Line_In.h"
#include "Services_Interval.h"
#include "Telltales_Lib.h"
#include "Telltales_user.h"
#include "Gauge_Display.h"
#include "Radar_R3.h"
uint8_t OverSpeed;
uint8_t OIL_Low_popup_flag;
uint8_t RADAR_SOUND; /*雷达声音*/
uint8_t LowBrakeFluid_Clock = 0u;
uint8_t AirBagError_Clock = 0u;
uint16_t ODO_last = 0u;
uint8_t TCU_FAILURE_Sts = 0u;
uint8_t TCU_FAILURE_Sts_last = 0u;
uint8_t ParkBrake_NoRreleased_Clock = 0u;
uint16_t TCU_OVT_5MIN_Clock = 0u;
uint16_t TCU_OVT_STOP_Clock = 0u;
uint8_t FUEL_Low_Check = 0u;
uint8_t CPDWarningSts = 0u;
uint8_t CPDWarning_Clock = 0u;
uint8_t CPDWarning_Valid = 0u;
uint8_t Engine_Status_Delay_Flag = 0u;
uint8_t POP_LowOilPressure_Clock = 0u;
uint8_t POP_3S_Clock = 0u;
uint8_t IGstPopup = 0u;
uint8_t TurnTo_Flag = 0;
uint16_t SelfCheck_time = 50;
uint16_t Door_Warningtimer;
void SetRADAR_SOUND(uint8_t Level)
{
if ( Level == RADAR_SND_2Hz )
{
RADAR_SOUND = RADAR_SND_2Hz;
}
else if ( Level == RADAR_SND_4Hz )
{
RADAR_SOUND = RADAR_SND_4Hz;
}
else if ( Level == RADAR_SND_CONTINUOUS )
{
RADAR_SOUND = RADAR_SND_CONTINUOUS;
}
else
{
RADAR_SOUND = 255u; /*未知取消*/
}
}
void Popups_KL15_Init(void)
{
SelfCheck_time = 0;
}
void Popups_IG_OFF_Init(void)
{
SelfCheck_time = 50u;
}
void Popups_Management_Service(void)
{
uint8_t PopupSnd;
/*报警触发*/
Popups_Polling( );
/*获取调度的声音报警*/
PopupSnd = Popup_Get_Current_Sound( ); /*根据报警PopupScheduling.Current取出声音音源*/
/*执行调度声音*/
Popups_Sound_Playing(PopupSnd);
}
void Popups_Polling(void)
{
// uint8_t ReqCode;
uint8_t IGstPopup1;
uint16_t m_Vspeed;
m_Vspeed = Common_Get_Disp_V_Speed( );
IGstPopup1 = Common_Get_IG_Sts( );
if ( SelfCheck_time < (POWERON_SCAN_TIMER / 100) + 5u )
{
SelfCheck_time++;
PopupAndSound_Delete(POPUP_Radar_Changming);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_EPB_Status);
PopupAndSound_Delete(POPUP_SEATBELT_DR_1HZ);
PopupAndSound_Delete(POPUP_SEATBELT_DR_2HZ);
//PopupAndSound_Delete(POPUP_DoorOpen);
PopupAndSound_Delete(POPUP_DoorOpen_1HZ);
PopupAndSound_Delete(POPUP_EBD_fault);
PopupAndSound_Delete(POPUP_ABS);
PopupAndSound_Delete(POPUP_EPS);
PopupAndSound_Delete(POPUP_Park_Brak);
PopupAndSound_Delete(POPUP_MotorFault);
PopupAndSound_Delete(POPUP_SOC_Fault);
PopupAndSound_Delete(POPUP_InsulationFault);
PopupAndSound_Delete(POPUP_SOC_HT);
PopupAndSound_Delete(POPUP_Energy_Recovery);
PopupAndSound_Delete(POPUP_Energy_Recovery_1);
PopupAndSound_Delete(POPUP_ECO);
PopupAndSound_Delete(POPUP_READY);
PopupAndSound_Delete(POPUP_PowerLimit);
PopupAndSound_Delete(POPUP_SOC_LP);
PopupAndSound_Delete(POPUP_SOC_CF);
PopupAndSound_Delete(POPUP_SystemFault);
PopupAndSound_Delete(POPUP_SystemFault1);
PopupAndSound_Delete(POPUP_GearFault);
PopupAndSound_Delete(POPUP_WeightOverload);
PopupAndSound_Delete(POPUP_RemoteLocking);
PopupAndSound_Delete(POPUP_PositionNotClosed);
PopupAndSound_Delete(POPUP_DepartureReminder);
PopupAndSound_Delete(POPUP_OTA_0);
PopupAndSound_Delete(POPUP_OTA_1);
PopupAndSound_Delete(POPUP_OTA_2);
PopupAndSound_Delete(POPUP_OTA_3);
PopupAndSound_Delete(POPUP_OTA_4);
PopupAndSound_Delete(POPUP_OTA_5);
PopupAndSound_Delete(POPUP_ESC);
//PopupAndSound_Delete(POPUP_Over_Speed);
if ( Get_LINE_IN_Sts(LINE_IN_DOOROPEN) == 1u )
{
Popup_Request(POPUP_DoorOpen);
}
}
else
{
//制动液位低
if ( Get_TelltalesLedSts(m_LED_BrakeSystemFault) == 1u )
{
Popup_Request(POPUP_EPB_Status);
}
else
{
PopupAndSound_Delete(POPUP_EPB_Status);
}
//驻车制动
if((Get_ID_18FAB027_Sig_VCUHandbrakeSts() == 1) && (Get_DispVechileSpeed()>50u))
{
Popup_Request(POPUP_Park_Brak);
}
else
{
PopupAndSound_Delete(POPUP_Park_Brak);
}
// EBD故障
if ( CAN_MSG_Status(ID_can0x18F0010B_Msg_Count) == CAN_SIG_NORMAL )
{
if ( Get_TelltalesLedSts(m_LED_EBD_fault) == 1u )
{
Popup_Request(POPUP_EBD_fault);
}
else
{
PopupAndSound_Delete(POPUP_EBD_fault);
}
}
else
{
PopupAndSound_Delete(POPUP_EBD_fault);
}
if ( CAN_MSG_Status(ID_can0x18F0010B_Msg_Count) == CAN_SIG_NORMAL )
{
// ABS故障
if ( Get_TelltalesLedSts(m_LED_ABS) == 1u )
{
Popup_Request(POPUP_ABS);
}
else
{
PopupAndSound_Delete(POPUP_ABS);
}
}
else
{
PopupAndSound_Delete(POPUP_ABS);
}
if ( Common_Get_IG_Sts() == 1u )
{
if ( CAN_MSG_Status(ID_can0x18FECA10_Msg_Count) == CAN_SIG_NORMAL )
{
// EPS故障
if ( Get_ID_18FECA10_Sig_EPSMalfunctionIndicatorLamp( ) == 1u )
{
Popup_Request(POPUP_EPS);
}
else
{
PopupAndSound_Delete(POPUP_EPS);
}
}
else
{
PopupAndSound_Delete(POPUP_EPS);
}
}
else
{
PopupAndSound_Delete(POPUP_EPS);
}
//电机故障
if ( Get_TelltalesLedSts(m_LED_MotorFault) == 1u )
{
Popup_Request(POPUP_MotorFault);
}
else
{
PopupAndSound_Delete(POPUP_MotorFault);
}
//动力电池故障
if ( (Get_TelltalesLedSts(m_LED_SOC_Fault) == 1u) )
{
Popup_Request(POPUP_SOC_Fault);
}
else
{
PopupAndSound_Delete(POPUP_SOC_Fault);
}
//高压绝缘故障
if ( Get_TelltalesLedSts(m_LED_InsulationFault) == 1u )
{
Popup_Request(POPUP_InsulationFault);
}
else
{
PopupAndSound_Delete(POPUP_InsulationFault);
}
//电池热失控
if ( Get_TelltalesLedSts(m_LED_SOC_HT) == 1u )
{
Popup_Request(POPUP_SOC_HT);
}
else
{
PopupAndSound_Delete(POPUP_SOC_HT);
}
//门开报警
if ( Get_LINE_IN_Sts(LINE_IN_DOOROPEN) == 1u )
{
Popup_Request(POPUP_DoorOpen);
if ( m_Vspeed >= 100u )
{
if ( Door_Warningtimer <= 600u )
{
Door_Warningtimer++;
Popup_Request(POPUP_DoorOpen_1HZ);
}
else
{
PopupAndSound_Delete(POPUP_DoorOpen_1HZ);
}
}
else
{
PopupAndSound_Delete(POPUP_DoorOpen_1HZ);
}
}
else
{
Door_Warningtimer = 0u;
PopupAndSound_Delete(POPUP_DoorOpen_1HZ);
PopupAndSound_Delete(POPUP_DoorOpen);
}
//Energy_Recovery
//if ( Get_TelltalesLedSts(m_LED_Energy_Recovery) == 1u )
//{
// Popup_Request(POPUP_Energy_Recovery);
//}
//else
//{
// PopupAndSound_Delete(POPUP_Energy_Recovery);
//}
// ECO状态激活
if ( Get_TelltalesLedSts(m_LED_ECO) == 1u )
{
Popup_Request(POPUP_ECO);
}
else
{
PopupAndSound_Delete(POPUP_ECO);
}
// READY状态激活
if ( Get_TelltalesLedSts(m_LED_READY) == 1u )
{
Popup_Request(POPUP_READY);
}
else
{
PopupAndSound_Delete(POPUP_READY);
}
//限功率报警
if ( Get_TelltalesLedSts(m_LED_PowerLimit) == 1u )
{
Popup_Request(POPUP_PowerLimit);
}
else
{
PopupAndSound_Delete(POPUP_PowerLimit);
}
//蓄电池电量低
if ( Get_TelltalesLedSts(m_LED_SOC_LP) == 1u )
{
Popup_Request(POPUP_SOC_LP);
}
else
{
PopupAndSound_Delete(POPUP_SOC_LP);
}
//蓄电池充电故障
if( Get_TelltalesLedSts(m_LED_SOC_CF) == 1u )
// if(Get_ID_18FAB027_Sig_VCUDCDCWorkSts( ) == 0)
{
Popup_Request(POPUP_SOC_CF);
}
else
{
PopupAndSound_Delete(POPUP_SOC_CF);
}
//高压互锁指示灯
if(Get_TelltalesLedSts(m_LED_HighPressureInterlock) == 1u)
{
Popup_Request(POPUP_WeightOverload);
}
else
{
PopupAndSound_Delete(POPUP_WeightOverload);
}
//整车动力系统故障
if ((Get_TelltalesLedSts(m_LED_SystemFault) == 1u) &&((Get_ID_18FAB027_Sig_VCUVehicleSysErrorLevel()==2u)))
{
Popup_Request(POPUP_SystemFault);
}
else
{
PopupAndSound_Delete(POPUP_SystemFault);
}
if ((Get_TelltalesLedSts(m_LED_SystemFault) == 1u) &&((Get_ID_18FAB027_Sig_VCUVehicleSysErrorLevel()==3u)))
{
Popup_Request(POPUP_SystemFault1);
}
else
{
PopupAndSound_Delete(POPUP_SystemFault1);
}
//换挡错误
// if ( (CAN_MSG_Status(ID_PMS_PTInfoIndicate_Msg_Count) == 0u)
// && (Get_ID_18FAB027_Sig_PMS_GearOperateErr( ) == 1u) )
//{
// Popup_Request(POPUP_GearFault);
//}
//else
//{
// PopupAndSound_Delete(POPUP_GearFault);
//}
//远程锁车
if ( Common_Get_IG_Sts() == 1u )
{
if((Get_ID_18FA1727_Sig_VCU_LockVehPerFlag() == 1)&&(Get_ID_18FA1727_Sig_VCU_VersionConversionFlag() == 1)&&( Get_ID_18FA1727_Sig_VCU_SpdLmtLevel() == 0))
{
Popup_Request(POPUP_RemoteLocking);
}
else if ( Get_ID_18FF5D27_Sig_VCU_LockVehSts() == 1u )
{
Popup_Request(POPUP_RemoteLocking);
}
else
{
PopupAndSound_Delete(POPUP_RemoteLocking);
}
}
else
{
PopupAndSound_Delete(POPUP_RemoteLocking);
}
//小灯未关
if ( (IGstPopup1 == IGN_OFF) && (Get_LINE_IN_Sts(LINE_IN_DOOROPEN) == 1u)
&& (Get_LINE_IN_Sts(LINE_IN_POSITION) == 1u) )
{
Popup_Request(POPUP_PositionNotClosed);
}
else
{
PopupAndSound_Delete(POPUP_PositionNotClosed);
}
//驾驶员离车提醒
if ( (Get_TelltalesLedSts(m_LED_READY) == 1u) && (Get_LINE_IN_Sts(LINE_IN_DOOROPEN) == 1u) )
{
Popup_Request(POPUP_DepartureReminder);
}
else
{
PopupAndSound_Delete(POPUP_DepartureReminder);
}
//超速报警
/*if(IGstPopup1 == IGN_ON)
{
if ( m_Vspeed >= 810 )
{
Popup_Request(POPUP_Over_Speed);
}
if(m_Vspeed < 780)
{
PopupAndSound_Delete(POPUP_Over_Speed);
}
}
else
{
PopupAndSound_Delete(POPUP_Over_Speed);
}*/
/*雷达距离声音提示*/
if(IGstPopup1 == IGN_ON)
{
if(Get_ID_0CFF1ADA_Sig_PDC_VirtualDisplaySts() == 1u)
{
switch ( Get_ID_0CFF1ADA_Sig_PDC_Warning_Frq() )
{
case 0:
RADAR_SOUND = 100;
break;
case 1:
RADAR_SOUND = POPUP_Radar_1HZ;
break;
case 2:
RADAR_SOUND = POPUP_Radar_2HZ;
break;
case 3:
RADAR_SOUND = POPUP_Radar_4HZ;
break;
case 4:
RADAR_SOUND = 100;
break;
case 5:
RADAR_SOUND = POPUP_Radar_Changming;
break;
default:
RADAR_SOUND = 100;
break;
}
if (RADAR_SOUND == POPUP_Radar_1HZ)
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_1HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_2HZ )
{
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_2HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_4HZ )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
Popup_Request(POPUP_Radar_4HZ);
}
else if ( RADAR_SOUND == POPUP_Radar_Changming )
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
Popup_Request(POPUP_Radar_Changming);
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
}
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
}
}
else
{
PopupAndSound_Delete(POPUP_Radar_2HZ);
PopupAndSound_Delete(POPUP_Radar_4HZ);
PopupAndSound_Delete(POPUP_Radar_1HZ);
PopupAndSound_Delete(POPUP_Radar_Changming);
}
// OTA处理
if ( (CAN_MSG_Status(ID_TBOX_OTAStatus_Msg_Count) == 0u) && (IGstPopup1 == IGN_ON) )
{
if ( Get_ID_18FF639F_Sig_TBOX_OTA_DownloadRequest( ) == 0x1u )
{
}
if ( (Get_ID_18FF639F_Sig_TBOX_OTA_DownloadState( ) == 0x01u)
&& (Get_ID_18FF639F_Sig_TBOX_OTA_DownloadProgress( ) <= 0x64u) )
{
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_DownloadState( ) == 0x03u )
{
Popup_Request(POPUP_OTA_0);
}
else
{
PopupAndSound_Delete(POPUP_OTA_0);
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_UpdateRequest( ) == 0x01u )
{
Popup_Request(POPUP_OTA_1);
}
else
{
PopupAndSound_Delete(POPUP_OTA_1);
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_DisclaimerWarning( ) == 0x01u )
{
Popup_Request(POPUP_OTA_2);
}
else
{
PopupAndSound_Delete(POPUP_OTA_2);
}
if ( (Get_ID_18FF639F_Sig_TBOX_OTA_PreConditionDetect( ) == 0x01u)
&& ((Get_ID_18FF639F_Sig_TBOX_OTA_FailedReason_PowerMode( ) == 0x01u)
|| (Get_ID_18FF639F_Sig_TBOX_OTA_FailedReason_GearPos( ) == 0x01u)
|| (Get_ID_18FF639F_Sig_TBOX_OTA_FailedReason_VehicleSpd( ) == 0x01u)
|| (Get_ID_18FF639F_Sig_TBOX_OTA_FailedReason_BattVol( ) == 0x01u)
|| (Get_ID_18FF639F_Sig_TBOX_OTA_FailedReason_HandBrake( ) == 0x01u)
|| (Get_ID_18FF639F_Sig_TBOX_OTA_FailedReason_ChgStatus( ) == 0x01u)) )
{
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_UpdateState( ) == 0x01u )
{
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_UpdateState( ) == 0x02u )
{
Popup_Request(POPUP_OTA_3);
}
else
{
PopupAndSound_Delete(POPUP_OTA_3);
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_UpdateState( ) == 0x06u )
{
Popup_Request(POPUP_OTA_4);
}
else
{
PopupAndSound_Delete(POPUP_OTA_4);
}
if ( Get_ID_18FF639F_Sig_TBOX_OTA_UpdateState( ) == 0x05u )
{
Popup_Request(POPUP_OTA_5);
}
else
{
PopupAndSound_Delete(POPUP_OTA_5);
}
}
else
{
PopupAndSound_Delete(POPUP_OTA_0);
PopupAndSound_Delete(POPUP_OTA_1);
PopupAndSound_Delete(POPUP_OTA_2);
PopupAndSound_Delete(POPUP_OTA_3);
PopupAndSound_Delete(POPUP_OTA_4);
PopupAndSound_Delete(POPUP_OTA_5);
}
}
}
uint8_t Get_POP_3S_Clock(void)
{
return POP_3S_Clock;
}
uint8_t Get_CPDWarning_Valid(void)
{
return CPDWarning_Valid;
}
uint8_t Get_CPDWarningSts(void)
{
return CPDWarningSts;
}
void Popups_Sound_Playing(uint8_t PopupSnd)
{
uint8_t ReqCode;
ReqCode = Popup_Get_Current_Sound_Req_Code( );
// PopupSnd =SND_RADAR;
// RADAR_SOUND=RADAR_SND_CONTINUOUS;
switch ( PopupSnd )
{
case SND_RADAR:
if ( RADAR_SOUND == RADAR_SND_CONTINUOUS )
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_2HZ);
Sound_Delete(SND_RADAR_4HZ);
Sound_Request(SND_RADAR_Changming, ReqCode);
}
else if ( RADAR_SOUND == RADAR_SND_2Hz )
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_4HZ);
Sound_Delete(SND_RADAR_Changming);
Sound_Request(SND_RADAR_2HZ, ReqCode);
}
else if ( RADAR_SOUND == RADAR_SND_4Hz )
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_2HZ);
Sound_Delete(SND_RADAR_Changming);
Sound_Request(SND_RADAR_4HZ, ReqCode);
}
else
{
Sound_Delete(SND_RADAR_1HZ);
Sound_Delete(SND_RADAR_2HZ);
Sound_Delete(SND_RADAR_4HZ);
Sound_Delete(SND_RADAR_Changming);
}
break;
default:
if ( ReqCode )
{
Sound_Request(PopupSnd, ReqCode);
}
else
{
Sound_Delete(PopupSnd);
}
break;
}
}
uint8_t Get_OIL_LOW_Sts(void)
{
return OIL_Low_popup_flag;
}
uint8_t Get_OverSpeed_Sts(void)
{
return OverSpeed;
}
uint8_t PopupGetIGst(void)
{
return IGstPopup;
}
\ No newline at end of file
#ifndef _SOUND_LIST_H_
#define _SOUND_LIST_H_
#include "Sound_Source.h"
/*#define SND_TOTAL_NUMBER 89*/
/******************************************************************************
声音列表
******************************************************************************/
enum SoundName
{
SND_TICK, /* tick */
SND_TOCK, /* tock */
SND_RADAR_Changming, /* 雷达 长鸣 */
SND_RADAR_1HZ, /* 雷达 1HZ */
SND_RADAR_2HZ, /* 雷达 2HZ */
SND_RADAR_4HZ, /* 雷达 4HZ */
SND_RADAR_2S, /* 雷达 2S */
SND_RADAR_4S, /* 雷达 4S */
SND_RADAR_0S, /* 雷达 0.5S */
SND_RADAR_OK0S, /* 雷达 0.5S */
SND_EPB_Status, /* 制动液位低 */
SND_SEATBELT_DR_1HZ, /* 安全带未系 1HZ */
SND_SEATBELT_DR_2HZ, /* 安全带未系 2HZ */
SND_DoorOpen, /* 车门开报警 */
SND_DoorOpen_1HZ, /* 车门开报警 1HZ */
SND_EBD_fault, /* EBD故障 */
SND_ABS, /* ABS故障 */
SND_EPS, /* EPS故障 */
SND_Park_Brak, /* 驻车制动故障 */
SND_MotorFault, /* 电机故障 */
SND_SOC_Fault, /* 动力电池报警 */
SND_InsulationFault, /* 高压绝缘故障 */
SND_SOC_HT, /* 电池热失控 */
SND_Energy_Recovery, /* 单踏板功能激活 */
SND_Energy_Recovery_1, /* 单踏板功能激活 1 */
SND_ECO, /* ECO状态激活 */
SND_READY, /* READY状态激活 */
SND_PowerLimit, /* 限功率报警 */
SND_SOC_LP, /* 蓄电池电量低 */
SND_SOC_CF, /* 蓄电池充电故障 */
SND_SystemFault, /* 动力系统故障 */
SND_SystemFault1, /* 动力系统故障 */
SND_GearFault, /* 换挡错误 */
SND_WeightOverload, /* 超载报警 */
SND_WeightOverload2, /* 超载报警 */
SND_RemoteLocking, /* 远程锁车 */
SND_PositionNotClosed, /* 小灯未关 */
SND_DepartureReminder, /* 驾驶员离车提醒 */
SND_OTA_0, /* OTA 报警0 */
SND_OTA_1, /* OTA 报警1 */
SND_OTA_2, /* OTA 报警2 */
SND_OTA_3, /* OTA 报警3 */
SND_OTA_4, /* OTA 报警4 */
SND_OTA_5, /* OTA 报警5 */
SND_ESC,
//SND_Over_Speed, /*超速报警*/
SND_TOTAL_NUM,
};
enum
{
RADAR_SND_MUTE = 0u,
RADAR_SND_2Hz,
RADAR_SND_4Hz,
RADAR_SND_CONTINUOUS,
RADAR_SND_500MS,
RADAR_SND_OK500MS,
RADAR_SND_2S,
RADAR_SND_Fault,
};
/******************************************************************************
伪声音列表
******************************************************************************/
#define SND_NONE 0xFFu /*无报警 */
#define SND_RADAR SND_RADAR_2HZ /*雷达音*/
#define SND_TYPE_NORMAL 0x00u /*普通声音类型 */
#define SND_TYPE_MULTI 0x01u /*可多次触发的声音 */
#define SND_TYPE_RADAR 0x02u /*雷达声音 */
#endif
\ No newline at end of file
#include "Sound_List.h"
#include "Sound_Player.h"
#include "Sound_Scheduler.h"
#define SND_PLAYER_IDLE 0x00u
#define SND_PLAYER_PLAY_REQ 0x01u
#define SND_PLAYER_PLAYING 0x02u
#define SND_PLAYER_STOP_REQ 0x03u
/******************************************************************************
声音属性列表
******************************************************************************/
const SoundAttributeStruct SoundList [ SND_TOTAL_NUM ] = {
/*=====================================================================================
声音名称 | 音源 | 模式
-------------------------------------------------------------------------------------*/
{/*tick */ SND_SRC_TICK, SND_TYPE_NORMAL, },
{/*tock */ SND_SRC_TOCK, SND_TYPE_NORMAL, },
{/*雷达长鸣 */SND_SRC_Radar_Changming, SND_TYPE_RADAR, },
{/*雷达 1HZ */ SND_SRC_Radar_1HZ, SND_TYPE_RADAR, },
{/*雷达 2HZ */ SND_SRC_Radar_2HZ, SND_TYPE_RADAR, },
{/*雷达 4HZ */ SND_SRC_Radar_4HZ, SND_TYPE_RADAR, },
{/*雷达 2S */ SND_SRC_Radar_2S, SND_TYPE_RADAR, },
{/*雷达 4S */ SND_SRC_Radar_4S, SND_TYPE_RADAR, },
{/*雷达 0.5S */ SND_SRC_Radar_0S, SND_TYPE_RADAR, },
{/*雷达 0.5S */ SND_SRC_Radar_OK0S, SND_TYPE_RADAR, },
{/*制动液位低 */ SND_SRC_EPB_Status, SND_TYPE_NORMAL, },
{/*安全带未系 */ SND_SRC_SEATBELT_DR_1HZ, SND_TYPE_NORMAL, },
{/*安全带未系 */ SND_SRC_SEATBELT_DR_2HZ, SND_TYPE_NORMAL, },
{/*车门开报警 */ SND_SRC_DoorOpen, SND_TYPE_NORMAL, },
{/*车门开报警 1HZ */ SND_SRC_DoorOpen_1HZ, SND_TYPE_NORMAL, },
{/*EBD故障 */ SND_SRC_EBD_fault, SND_TYPE_NORMAL, },
{/*ABS故障 */ SND_SRC_ABS, SND_TYPE_NORMAL, },
{/*EPS故障 */ SND_SRC_EPS, SND_TYPE_NORMAL, },
{/*驻车制动 */ SND_SRC_Park_Brak, SND_TYPE_NORMAL, },
{/*电机故障 */ SND_SRC_MotorFault, SND_TYPE_NORMAL, },
{/*动力电池报警 */ SND_SRC_SOC_Fault, SND_TYPE_NORMAL, },
{/*高压绝缘故障 */ SND_SRC_InsulationFault, SND_TYPE_NORMAL, },
{/*电池热失控 */ SND_SRC_SOC_HT, SND_TYPE_NORMAL, },
{/*单踏板功能激活 */ SND_SRC_Energy_Recovery, SND_TYPE_NORMAL, },
{/*单踏板功能激活1 */ SND_SRC_Energy_Recovery_1, SND_TYPE_NORMAL, },
{/*ECO状态激活 */ SND_SRC_ECO, SND_TYPE_NORMAL, },
{/*READY状态激活 */ SND_SRC_READY, SND_TYPE_NORMAL, },
{/*限功率报警 */ SND_SRC_PowerLimit, SND_TYPE_NORMAL, },
{/*蓄电池电量低 */ SND_SRC_SOC_LP, SND_TYPE_NORMAL, },
{/*蓄电池充电故障 */ SND_SRC_SOC_CF, SND_TYPE_NORMAL, },
{/*动力系统故障 */ SND_SRC_SystemFault, SND_TYPE_NORMAL, },
{/*动力系统故障 */ SND_SRC_SystemFault1, SND_TYPE_NORMAL, },
{/*换挡错误 */ SND_SRC_GearFault, SND_TYPE_NORMAL, },
{/*超载报警 */ SND_SRC_WeightOverload, SND_TYPE_NORMAL, },
{/*超载报警 */ SND_SRC_WeightOverload2, SND_TYPE_NORMAL, },
{/*远程锁车 */ SND_SRC_RemoteLocking, SND_TYPE_NORMAL, },
{/*小灯未关 */ SND_SRC_PositionNotClosed, SND_TYPE_NORMAL, },
{/*驾驶员离车提醒 */ SND_SRC_DepartureReminder, SND_TYPE_NORMAL, },
{/*OTA 报警0 */ SND_SRC_OTA_0, SND_TYPE_NORMAL, },
{/*OTA 报警1 */ SND_SRC_OTA_1, SND_TYPE_NORMAL, },
{/*OTA 报警2 */ SND_SRC_OTA_2, SND_TYPE_NORMAL, },
{/*OTA 报警3 */ SND_SRC_OTA_3, SND_TYPE_NORMAL, },
{/*OTA 报警4 */ SND_SRC_OTA_4, SND_TYPE_NORMAL, },
{/*OTA 报警5 */ SND_SRC_OTA_5, SND_TYPE_NORMAL, },
{/*EPS 报警5 */ SND_SRC_ESC, SND_TYPE_NORMAL, },
//{/*超速报警 */ SND_SRC_Over_Speed, SND_TYPE_NORMAL, },
/*====================================================================================*/
};
/******************************************************************************
音源属性表 组合音
******************************************************************************/
const SndAttributeStruct SndAttributeTable [ SND_SRC_TOTAL_NUM ] = {
/*============================================================================================================================================
音源名称 | 音源 | 优先级 | 循环次数 | 播放模式 | 周期(ms)
---------------------------------------------------------------------------------------------------------------------------------------------*/
{ /* tock */ 0x05, 1u, 1u, SND_MODE_SINGLE, 100, },
{ /* tick */ 0x06, 2u, 1u, SND_MODE_SINGLE, 100, },
{ /* 雷达长鸣 */ 0x02, 12u, SND_CYCLE_NONSTOP, SND_MODE_LOOP, 0u, },
{ /* 雷达 1HZ */ 0x03, 12u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* 雷达 2HZ */ 0x03, 12u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 500u, },
{ /* 雷达 4HZ */ 0x04, 12u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 250u, },
{ /* 雷达 2S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 2000u, },
{ /* 雷达 4S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 4000u, },
{ /* 雷达 0.5S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 500u, },
{ /* 雷达 0.5S */ 0x02, 3u, 1u, SND_MODE_SINGLE, 500u, },
{ /* 制动液位低 */ 0x07, 2u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 安全带未系 1HZ */ 0x03, 3u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* 安全带未系 2HZ */ 0x03, 3u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 500u, },
{ /* 车门开报警 */ 0x07, 4u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 车门开报警 1HZ */ 0x07, 4u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* EBD故障 */ 0x07, 6u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* ABS故障 */ 0x07, 7u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* EPS故障 */ 0x07, 8u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 驻车制动 */ 0x07, 5u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 电机故障 */ 0x07, 9u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 动力电池报警 */ 0x07, 10u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 高压绝缘故障 */ 0x07, 11u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 电池热失控 */ 13, 1u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 500u, },
{ /* 单踏板功能激活 */ 0x07, 13u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 单踏板功能激活 1 */ 0x07, 13u, 3u, SND_MODE_SINGLE, 1000u, },
{ /* ECO状态激活 */ 0x07, 14u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* READY状态激活 */ 0x07, 15u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 限功率报警 */ 0x07, 16u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 蓄电池电量低 */ 0x07, 17u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 蓄电池充电故障 */ 0x07, 17u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 动力系统故障 */ 0x07, 18u, 10u, SND_MODE_SINGLE, 1000u, },
{ /* 动力系统故障 */ 0x07, 18u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* 换挡错误 */ 0x07, 20u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 超载报警 */ 0x07, 20u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 超载报警2 */ 0x07, 20u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 远程锁车 */ 0x07, 21u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* 小灯未关 */ 0x07, 22u, 10u, SND_MODE_SINGLE, 1000u, },
{ /* 驾驶员离车提醒 */ 13, 23u, 3u, SND_MODE_SINGLE, 500u, },
{ /* OTA 报警0 */ 0x07, 4u, SND_CYCLE_NONSTOP, SND_MODE_SINGLE, 1000u, },
{ /* OTA 报警1 */ 0x07, 4u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* OTA 报警2 */ 0x07, 4u, 3u, SND_MODE_SINGLE, 1000u, },
{ /* OTA 报警3 */ 0x07, 4u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* OTA 报警4 */ 0x07, 4u, 1u, SND_MODE_SINGLE, 1000u, },
{ /* OTA 报警5 */ 0x07, 4u, 240u, SND_MODE_SINGLE, 250u, },
{ /* ESC 报警4 */ 0x07, 4u, 1u, SND_MODE_SINGLE, 1000u, },
//{ /* 超速报警 1HZ */ 0x07, 13u, 4, SND_MODE_SINGLE, 1000u, },
/*===========================================================================================================================================*/
};
/******************************************************************************
伪音源名称列表
******************************************************************************/
#define SND_SRC_NONE 0xFFu /*没有声音*/
#define SND_SRC_CURRENT 0xFEu /*当前播放的声音*/
/******************************************************************************
音源循环次数
******************************************************************************/
#define SND_CYCLE_NONSTOP 0xFFu /*不停播放*/
/******************************************************************************
音源播放模式
******************************************************************************/
#define SND_MODE_SINGLE 0x00u /*使用ISD_Play_Vp方法播放*/
#define SND_MODE_LOOP 0x01u /*使用ISD_Play_Vp_Loop方法播放*/
uint8_t SoundEnableCode[SND_TOTAL_NUM];
SoundSchedulingStruct SoundScheduling;
void Sound_Scheduler_Init(void)
{
uint8_t i;
for (i = 0u; i < SND_TOTAL_NUM; i++)
{
SoundEnableCode[i] = 0u;
}
Sound_Clear();
SoundScheduling.Current = SND_NONE;
SoundScheduling.Next = SND_NONE;
SoundScheduling.ReqCode = 0u;
SoundScheduling.StopReq = 0u;
}
/*****************************************************************************
ReqCode:请求码,0 - 表示无效请求,不请求播放声音
非0值 - 请求播放声音,该请求码将被记录,对于只播放一次的声音,
如果与上一次请求播放该声音的请求码相同声音就不会再被重复播放
*****************************************************************************/
void Sound_Request(uint8_t Sound, uint8_t ReqCode)
{
uint8_t PriorityRef;
uint8_t PriorityNew;
if ((Sound < SND_TOTAL_NUM) && (ReqCode))
{
if ((SoundEnableCode[Sound] != ReqCode) || (SoundList[Sound].Type != SND_TYPE_NORMAL))
{
if (SoundScheduling.Next < SND_TOTAL_NUM) /*如果已有即将要播放的声音*/
{
if (Sound != SoundScheduling.Next)
{
PriorityRef = Sound_Priority_Query(SoundList[SoundScheduling.Next].Src);
PriorityNew = Sound_Priority_Query(SoundList[Sound].Src);
if (PriorityNew < PriorityRef)
{
SoundScheduling.Next = Sound; /*请求的声音具有更高的优先级*/
SoundScheduling.ReqCode = ReqCode;
}
else if (PriorityNew == PriorityRef)
{
if (SoundList[Sound].Type == SND_TYPE_RADAR)
{
SoundScheduling.Next = Sound; /*同优先级雷达声可相互打断*/
SoundScheduling.ReqCode = ReqCode;
}
}
else
{}
}
}
else /*如果没有即将要播放的声音*/
{
if (Sound != SoundScheduling.Current)
{
PriorityRef = Sound_Priority_Query(SND_SRC_CURRENT);
PriorityNew = Sound_Priority_Query(SoundList[Sound].Src);
if (PriorityNew < PriorityRef)
{
SoundScheduling.Next = Sound; /*请求的声音具有更高的优先级*/
SoundScheduling.ReqCode = ReqCode;
if(SoundScheduling.Current<SND_TOTAL_NUM)
{
if(SoundEnableCode[SoundScheduling.Current]>0u)
{
SoundEnableCode[SoundScheduling.Current]=0U;/*lmj:20200821不加报警被打断后无法重播,只需要不同不需要准数*/
}
}
}
else if (PriorityNew == PriorityRef)
{
if (SoundList[Sound].Type == SND_TYPE_RADAR)
{
SoundScheduling.Next = Sound; /*同优先级雷达声可相互打断*/
SoundScheduling.ReqCode = ReqCode;
}
}
else
{}
}
}
}
}
}
void Sound_Delete(uint8_t Sound)
{
if (Sound < SND_TOTAL_NUM)
{
if (SoundEnableCode[Sound]) /*是已播放过的声音*/
{
if (Sound == SoundScheduling.Current)
{
SoundScheduling.StopReq = 1u;
}
else
{
if (Sound == SoundScheduling.Next)
{
SoundScheduling.Next = SND_NONE;
}
SoundEnableCode[Sound] = 0u;
}
}
}
}
/*50ms*/
void Sound_Scheduling_Service(void)
{
/*处理声音停止请求*/
if (SoundScheduling.StopReq)
{
if (SoundScheduling.Current < SND_TOTAL_NUM)
{
if (Sound_Stop(SoundList[SoundScheduling.Current].Src) == 0u)
{
SoundScheduling.StopReq = 0u;
SoundEnableCode[SoundScheduling.Current] = 0u;
SoundScheduling.Current = SND_NONE;
}
}
}
/*使用查询优先级方法查看当前声音是否还在播放*/
if (SoundScheduling.Current < SND_TOTAL_NUM)
{
if (Sound_Priority_Query(SND_SRC_CURRENT) == 0xFFu)
{
SoundScheduling.Current = SND_NONE;
}
}
/*播放请求的声音*/
if (SoundScheduling.Next < SND_TOTAL_NUM)
{
if (SoundScheduling.Current < SND_TOTAL_NUM) /*如果当前有声音正在播放,则停止播放该声音*/
{
Sound_Stop(SoundList[SoundScheduling.Current].Src);
}
if (Sound_Play(SoundList[SoundScheduling.Next].Src) == 0u) /*如果请求的声音播放成功*/
{
SoundEnableCode[SoundScheduling.Next] = SoundScheduling.ReqCode; /*声音已播放*/
SoundScheduling.Current = SoundScheduling.Next;
SoundScheduling.Next = SND_NONE;
}
}
}
uint8_t Get_SoundScheduling_Current(void)
{
return SoundScheduling.Current;
}
#ifndef _SOUND_SOURCE_H_
#define _SOUND_SOURCE_H_
#include "stdint.h"
/******************************************************************************
音源名称列表
注意:音源名称所指代的序号应与该声音位于声音属性表中的序号一一对应
******************************************************************************/
enum
{
SND_SRC_TICK = 0x00u, /* tick */
SND_SRC_TOCK, /* tock */
SND_SRC_Radar_Changming, /* 雷达长鸣 */
SND_SRC_Radar_1HZ, /* 雷达 1HZ */
SND_SRC_Radar_2HZ, /* 雷达 2HZ */
SND_SRC_Radar_4HZ, /* 雷达 4HZ */
SND_SRC_Radar_2S, /* 雷达 2S */
SND_SRC_Radar_4S, /* 雷达 4S */
SND_SRC_Radar_0S, /* 雷达 0S */
SND_SRC_Radar_OK0S, /* 雷达 0S */
SND_SRC_EPB_Status, /* 制动液位低 */
SND_SRC_SEATBELT_DR_1HZ, /* 安全带未系 1HZ */
SND_SRC_SEATBELT_DR_2HZ, /* 安全带未系 2HZ */
SND_SRC_DoorOpen, /* 车门开报警 */
SND_SRC_DoorOpen_1HZ, /* 车门开报警 1HZ */
SND_SRC_EBD_fault, /* EBD故障 */
SND_SRC_ABS, /* ABS故障 */
SND_SRC_EPS, /* EPS故障 */
SND_SRC_Park_Brak, /* 驻车制动 */
SND_SRC_MotorFault, /* 电机故障 */
SND_SRC_SOC_Fault, /* 动力电池报警 */
SND_SRC_InsulationFault, /* 高压绝缘故障 */
SND_SRC_SOC_HT, /* 电池热失控 */
SND_SRC_Energy_Recovery, /* 单踏板功能激活 */
SND_SRC_Energy_Recovery_1, /* 单踏板功能激活 1HZ 3次 1.4变更新增*/
SND_SRC_ECO, /* ECO状态激活 */
SND_SRC_READY, /* READY状态激活 */
SND_SRC_PowerLimit, /* 限功率报警 */
SND_SRC_SOC_LP, /* 蓄电池电量低 */
SND_SRC_SOC_CF, /* 蓄电池充电故障 */
SND_SRC_SystemFault, /* 动力系统故障 */
SND_SRC_SystemFault1, /* 动力系统故障 */
SND_SRC_GearFault, /* 换挡错误 */
SND_SRC_WeightOverload, /* 超载报警 */
SND_SRC_WeightOverload2, /* 超载报警 */
SND_SRC_RemoteLocking, /* 远程锁车 */
SND_SRC_PositionNotClosed, /* 小灯未关 */
SND_SRC_DepartureReminder, /* 驾驶员离车提醒 */
SND_SRC_OTA_0, /* OTA 报警0 */
SND_SRC_OTA_1, /* OTA 报警1 */
SND_SRC_OTA_2, /* OTA 报警2 */
SND_SRC_OTA_3, /* OTA 报警3 */
SND_SRC_OTA_4, /* OTA 报警4 */
SND_SRC_OTA_5, /* OTA 报警5 */
SND_SRC_ESC, /* OTA 报警5 */
//SND_SRC_Over_Speed, /* 超速报警 */
SND_SRC_TOTAL_NUM,
};
/******************************************************************************
伪音源名称列表
******************************************************************************/
#define SND_SRC_NONE 0xFFu /*没有声音*/
#define SND_SRC_CURRENT 0xFEu /*当前播放的声音*/
/******************************************************************************
音源循环次数
******************************************************************************/
#define SND_CYCLE_NONSTOP 0xFFu /*不停播放*/
/******************************************************************************
音源播放模式
******************************************************************************/
#define SND_MODE_SINGLE 0x00u /*使用ISD_Play_Vp方法播放*/
#define SND_MODE_LOOP 0x01u /*使用ISD_Play_Vp_Loop方法播放*/
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment