Files
K2_DCU/.staticdata/.previous/20260113_090505/K2DCU/fs/8890e9ee97c4444e796a9d2307745aaf
2026-04-14 00:56:31 +09:00

215 lines
5.0 KiB
Plaintext

#include "main.h"
void CApuStartReady(void);
void CApuStopProcedure(Uint16 Level);
void CSetEngineActualRpm(Uint16 Rpm);
static void CSetGcuCommand(Uint16 Command);
void CSetEcuCommand(Uint16 Command);
Uint16 CStartSwitchCheck(void);
void CApuOperProcedure(void)
{
if (CApuSystemAlarmCheck() > 0U || KeyOperValue.KeyList.bit.Emergency == 1U)
{
// 알람으로 인한 정지 상태(비상정지에 준함, 즉시정지)
CSetApuOperIndex(APU_OPER_IDX_EMERGENCY);
CActiveChipSelect(0U);
}
else
{
CSetApuOperIndex(APU_OPER_IDX_STANDBY);
switch (CGetApuOperIndex())
{
case APU_OPER_IDX_STANDBY:
{
if (KeyOperValue.KeyList.bit.EngineStartStop == 1U)
{
CSetApuOperIndex(APU_OPER_IDX_START_CHECK);
CActiveChipSelect(1U); // 시동키가 입력되면 CS ON
if (CGetEngCoolantTemperature() < -10) // 냉각수 온도 체크
{
CSetApuOperIndex(APU_OPER_IDX_ENGINE_PREHEAT);
}
else
{
CSetApuOperIndex(APU_OPER_IDX_CRANKING);
}
}
break;
}
case APU_OPER_IDX_ENGINE_PREHEAT:
{
break;
}
case APU_OPER_IDX_CRANKING:
{
CSetGcuCommand(GCU_OPER_CMD_CRANKING);
if (CGetGeneratorRpm() > 800)
{
CSetGcuCommand(GCU_OPER_CMD_STOP_CRANKING);
CSetApuOperIndex(APU_OPER_IDX_CHECK_OPERATION);
}
break;
}
case APU_OPER_IDX_CHECK_OPERATION:
{
}
}
}
}
void CSetApuOperIndex(eApuOperIdx idx)
{
GeneralOperValue.uiApuState = (Uint16) idx;
}
eApuOperIdx CGetApuOperIndex(void)
{
return (eApuOperIdx)GeneralOperValue.uiApuState;
}
Uint16 CStartSwitchCheck(void)
{
return KeyOperValue.KeyList.bit.EngineStartStop;
}
Uint16 CApuSystemAlarmCheck(void)
{
return ((FaultBitValue.ulTotal | Rx210.GcuFault.uiTotal | Rx310.EcuFault.uiTotal) > 0) ? 1U : 0U;
}
void CSetEngineActualRpm(Uint16 Rpm)
{
float32 fTemp = (float32) Rpm / 0.125f; // 0.125 mean : J1939 Scaling Factor.
Tx103.EcuCommand.RpmSetpoint = (Uint16) fTemp;
}
Uint16 CGetEngineActualRpm(void)
{
float32 fTemp = (float32) Rx320.EcuData.ActualRpm * 0.125f;
return (Uint16) fTemp;
}
Uint16 CGetGeneratorRpm(void)
{
return Rx220.GcuData.Rpm;
}
static void CSetGcuCommand(Uint16 Command)
{
GeneralOperValue.GcuCommand.PlayCmd = Command;
}
void CSetEcuCommand(Uint16 Command)
{
if (Command == ECU_OPER_CMD_STOP)
{
GeneralOperValue.EcuCommand.EngineStart = 0U;
GeneralOperValue.EcuCommand.EngineStop = 1U;
CSetEngineActualRpm(2400U);
}
else if (Command == ECU_OPER_CMD_START)
{
GeneralOperValue.EcuCommand.EngineStart = 1U;
GeneralOperValue.EcuCommand.EngineStop = 0U;
CSetEngineActualRpm(2400U);
}
else
{
// Emergency
GeneralOperValue.EcuCommand.EngineStart = 0U;
GeneralOperValue.EcuCommand.EngineStop = 1U;
CSetEngineActualRpm(0U);
}
}
int16 CGetEngCoolantTemperature(void)
{
return (int16) Rx321.EcuData.CoolantTemperature - 40; // 온도 오프셋 -40도
}
void CDebugModeProcedure(void)
{
if (GeneralOperValue.Maintenence.ManualCranking == 1U)
{
if (CApuSystemAlarmCheck() == 0U)
{
; // 알람이 없을 경우만 동작 하도록 함.
}
}
else
{
;
}
if (GeneralOperValue.Maintenence.LampTest == 1U)
{
GPIO_CPU_LED_OPERATION(1U);
GPIO_CPU_LED_FAULT(1U);
GPIO_CPU_LED_STOP(1U);
}
else
{
GPIO_CPU_LED_OPERATION(0U);
GPIO_CPU_LED_FAULT(0U);
GPIO_CPU_LED_STOP(0U);
}
if (GeneralOperValue.Maintenence.KeyTest == 1U)
{
if ((GPIO_KEY_UP() == 1U) && (GPIO_KEY_DOWN() == 1U))
{
GeneralOperValue.Maintenence.KeyTest = 0U;
OledOperValue.uiPageNum = OLED_PAGE_MAINTENENCE;
}
}
}
void CLedControlProcedure(void)
{
switch (CGetApuOperIndex())
{
case APU_OPER_IDX_EMERGENCY:
{
GPIO_CPU_LED_FAULT(1U);
GPIO_CPU_LED_STOP(1U);
GPIO_CPU_LED_OPERATION(0U);
break;
}
case APU_OPER_IDX_STANDBY:
{
GPIO_CPU_LED_STOP(1U);
GPIO_CPU_LED_FAULT(0U);
GPIO_CPU_LED_OPERATION(0U);
break;
}
case APU_OPER_IDX_ENGINE_STABLED:
{
GPIO_CPU_LED_OPERATION(1U);
GPIO_CPU_LED_FAULT(0U);
GPIO_CPU_LED_STOP(0U);
break;
}
default:
{
break;
}
}
}