Engine idle, Generating 시퀀스 수정

This commit is contained in:
2026-04-15 09:40:00 +09:00
parent ac74d913e9
commit cb90da835b
8 changed files with 303 additions and 377 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.vscode/settings.json
.gitignore

161
Comm.c
View File

@@ -310,8 +310,8 @@ void CSendECanDataA(void)
// ---------------------------------------------------------
Uint32 ulTxMask = 0x0E3F8423UL;
ECanaRegs.CANTRS.all = ulTxMask;
ECanaRegs.CANTA.all = ulTxMask;
ECanaRegs.CANTRS.all = ulTxMask;
}
static void CInitECanA(void)
@@ -777,13 +777,17 @@ interrupt void CECanInterruptB(void)
void CSendECanDataB(void)
{
struct ECAN_REGS ECanShadow;
static Uint16 uiTxDivid = 0U; // 분산 송신
float32 fTemp = 0.0F;
Uint16 uiTemp = 0U;
Uint16 EmergencySig = ((GeneralOperValue.uiEmergency > 0U) || (KeyOperValue.KeyList.Emergency > 0U)) ? 1U : 0U;
// ---------------------------------------------------------
// 송신 메일박스 마스크 설정 및 전송 트리거
// 10ms interval MBOX 마스크 (1, 2, 3)
// ---------------------------------------------------------
Uint32 ulTxMask = 0x000EUL;
// 10ms
// [101h]
// --- BYTE 0 ---
@@ -797,14 +801,9 @@ void CSendECanDataB(void)
uiTemp |= CPackBit((GPIO_FAIL_SAFE_READ() == false) ? 1U : 0U, 3U);
Tx101.DcuState = uiTemp;
ECanbMboxes.MBOX1.MDL.byte.BYTE0 = Tx101.PlayState;
ECanbMboxes.MBOX1.MDL.byte.BYTE1 = Tx101.DcuState;
ECanbMboxes.MBOX1.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX1.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE7 = 0x0U;
// BYTE 0(PlayState), BYTE 1(DcuState), BYTE 3(DCUversionMinor), BYTE 4~7(Reserved)
ECanbMboxes.MBOX1.MDL.all = CPackMboxData(Tx101.PlayState, Tx101.DcuState, 0U, 0U);
ECanbMboxes.MBOX1.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// [102h]
// --- BYTE 0 ---
@@ -814,18 +813,12 @@ void CSendECanDataB(void)
uiTemp |= CPackBit(EmergencySig, 5U);
Tx102.GcuCommand = uiTemp;
ECanbMboxes.MBOX2.MDL.byte.BYTE0 = Tx102.GcuCommand;
ECanbMboxes.MBOX2.MDL.byte.BYTE1 = 0x0U;
ECanbMboxes.MBOX2.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX2.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE7 = 0x0U;
// BYTE 0(PlayState), BYTE 1~7(Reserved)
ECanbMboxes.MBOX2.MDL.all = CPackMboxData(Tx102.GcuCommand, 0U, 0U, 0U);
ECanbMboxes.MBOX2.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// [103h]
// --- BYTE 0~7 ---
uiTemp = 0U;
Tx103.EngineStart = GeneralOperValue.EcuCommand.EngineStart;
Tx103.EngineStop = GeneralOperValue.EcuCommand.EngineStop;
Tx103.FaultReset = GeneralOperValue.uiAlarmReset;
@@ -833,29 +826,8 @@ void CSendECanDataB(void)
Tx103.ActiveOverride = KeyOperValue.KeyList.BattleMode;
Tx103.EmergencyStop = EmergencySig;
ECanbMboxes.MBOX3.MDL.byte.BYTE0 = Tx103.EngineStart;
ECanbMboxes.MBOX3.MDL.byte.BYTE1 = Tx103.EngineStop;
ECanbMboxes.MBOX3.MDL.byte.BYTE2 = Tx103.FaultReset;
ECanbMboxes.MBOX3.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX3.MDH.byte.BYTE4 = ((Tx103.RpmSetpoint >> 0U) & 0xFFU);
ECanbMboxes.MBOX3.MDH.byte.BYTE5 = ((Tx103.RpmSetpoint >> 8U) & 0xFFU);
ECanbMboxes.MBOX3.MDH.byte.BYTE6 = Tx103.ActiveOverride;
ECanbMboxes.MBOX3.MDH.byte.BYTE7 = Tx103.EmergencyStop;
ECanShadow.CANTRS.all = ECanbRegs.CANTRS.all;
ECanShadow.CANTRS.bit.TRS1 = 1U; // 101h
ECanShadow.CANTRS.bit.TRS2 = 1U; // 102h
ECanShadow.CANTRS.bit.TRS3 = 1U; // 103h
ECanbRegs.CANTRS.all = ECanShadow.CANTRS.all;
ECanShadow.CANTA.all = ECanbRegs.CANTA.all;
ECanShadow.CANTA.bit.TA1 = 1U; // 101h
ECanShadow.CANTA.bit.TA2 = 1U; // 102h
ECanShadow.CANTA.bit.TA3 = 1U; // 103h
ECanbRegs.CANTA.all = ECanShadow.CANTA.all;
ECanShadow.CANTRS.all = ECanbRegs.CANTRS.all;
ECanShadow.CANTA.all = ECanbRegs.CANTA.all;
ECanbMboxes.MBOX3.MDL.all = CPackMboxData(Tx103.EngineStart, Tx103.EngineStop, Tx103.FaultReset, 0U);
ECanbMboxes.MBOX3.MDH.all = CPackMboxData(((Tx103.RpmSetpoint >> 0U) & 0xFFU), ((Tx103.RpmSetpoint >> 8U) & 0xFFU), Tx103.ActiveOverride, Tx103.EmergencyStop);
switch (uiTxDivid)
{
@@ -867,17 +839,10 @@ void CSendECanDataB(void)
Tx100.VersionMinor = (Uint16)FIRMWARE_VERSION_MINOR;
Tx100.VersionPatch = (Uint16)FIRMWARE_VERSION_PATCH;
ECanbMboxes.MBOX0.MDL.byte.BYTE0 = ((Tx100.Heartbit >> 0U) & 0xFFU);
ECanbMboxes.MBOX0.MDL.byte.BYTE1 = ((Tx100.Heartbit >> 8U) & 0xFFU);
ECanbMboxes.MBOX0.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX0.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX0.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX0.MDH.byte.BYTE5 = Tx100.VersionMajor;
ECanbMboxes.MBOX0.MDH.byte.BYTE6 = Tx100.VersionMinor;
ECanbMboxes.MBOX0.MDH.byte.BYTE7 = Tx100.VersionPatch;
ECanbMboxes.MBOX0.MDL.all = CPackMboxData(((Tx100.Heartbit >> 0U) & 0xFFU), ((Tx100.Heartbit >> 8U) & 0xFFU), 0U, 0U);
ECanbMboxes.MBOX0.MDH.all = CPackMboxData(0U, Tx100.VersionMajor, Tx100.VersionMinor, Tx100.VersionPatch);
ECanShadow.CANTRS.bit.TRS0 = 1U;
ECanShadow.CANTA.bit.TA0 = 1U;
ulTxMask |= (1UL << 0U); // MBOX 0
break;
}
case 1U:
@@ -888,17 +853,10 @@ void CSendECanDataB(void)
Tx110.DcuFaultB2 = ((Uint16)(ulDcuTotalAlarm >> 16U) & 0xFFU); // Apu Fault Byte 2
Tx110.DcuFaultB3 = ((Uint16)(ulDcuTotalAlarm >> 24U) & 0xFFU); // Apu Fault Byte 3
ECanbMboxes.MBOX4.MDL.byte.BYTE0 = Tx110.DcuFaultB0;
ECanbMboxes.MBOX4.MDL.byte.BYTE1 = Tx110.DcuFaultB1;
ECanbMboxes.MBOX4.MDL.byte.BYTE2 = Tx110.DcuFaultB2;
ECanbMboxes.MBOX4.MDL.byte.BYTE3 = Tx110.DcuFaultB3;
ECanbMboxes.MBOX4.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX4.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX4.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX4.MDH.byte.BYTE7 = 0x0U;
ECanbMboxes.MBOX4.MDL.all = CPackMboxData(Tx110.DcuFaultB0, Tx110.DcuFaultB1, Tx110.DcuFaultB2, Tx110.DcuFaultB3);
ECanbMboxes.MBOX4.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
ECanShadow.CANTRS.bit.TRS4 = 1U;
ECanShadow.CANTA.bit.TA4 = 1U;
ulTxMask |= (1UL << 4U); // MBOX 4
break;
}
case 2U:
@@ -906,17 +864,10 @@ void CSendECanDataB(void)
// [120h]
Tx120.AuxTotal = (Uint16)GET_ALL_AUX_STATUS();
ECanbMboxes.MBOX5.MDL.byte.BYTE0 = Tx120.AuxTotal;
ECanbMboxes.MBOX5.MDL.byte.BYTE1 = 0x0U;
ECanbMboxes.MBOX5.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX5.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE7 = 0x0U;
ECanbMboxes.MBOX5.MDL.all = CPackMboxData(Tx120.AuxTotal, 0U, 0U, 0U);
ECanbMboxes.MBOX5.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
ECanShadow.CANTRS.bit.TRS5 = 1U;
ECanShadow.CANTA.bit.TA5 = 1U;
ulTxMask |= (1UL << 5U); // MBOX 5
break;
}
case 3U:
@@ -934,17 +885,12 @@ void CSendECanDataB(void)
fTemp = Adc_GlowPlug_I.fLpfValue * 10.0F;
Tx121.GlowPlugCurrent = (Uint16)fTemp;
ECanbMboxes.MBOX6.MDL.byte.BYTE0 = ((Tx121.EngHeatVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.byte.BYTE1 = ((Tx121.EngHeatVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.byte.BYTE2 = ((Tx121.EngHeatCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.byte.BYTE3 = ((Tx121.EngHeatCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE4 = ((Tx121.GlowPlugVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE5 = ((Tx121.GlowPlugVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE6 = ((Tx121.GlowPlugCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE7 = ((Tx121.GlowPlugCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.all = CPackMboxData(((Tx121.EngHeatVoltage >> 0U) & 0xFFU), ((Tx121.EngHeatVoltage >> 8U) & 0xFFU),
((Tx121.EngHeatCurrent >> 0U) & 0xFFU), ((Tx121.EngHeatCurrent >> 8U) & 0xFFU));
ECanbMboxes.MBOX6.MDH.all = CPackMboxData(((Tx121.GlowPlugVoltage >> 0U) & 0xFFU), ((Tx121.GlowPlugVoltage >> 8U) & 0xFFU),
((Tx121.GlowPlugCurrent >> 0U) & 0xFFU), ((Tx121.GlowPlugCurrent >> 8U) & 0xFFU));
ECanShadow.CANTRS.bit.TRS6 = 1U;
ECanShadow.CANTA.bit.TA6 = 1U;
ulTxMask |= (1UL << 6U); // MBOX 6
break;
}
case 4U:
@@ -962,17 +908,12 @@ void CSendECanDataB(void)
fTemp = Adc_FuelPump_I.fLpfValue * 10.0F;
Tx122.FuelPumpCurrent = (Uint16)fTemp;
ECanbMboxes.MBOX7.MDL.byte.BYTE0 = ((Tx122.SolenoidVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.byte.BYTE1 = ((Tx122.SolenoidVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.byte.BYTE2 = ((Tx122.SolenoidCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.byte.BYTE3 = ((Tx122.SolenoidCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE4 = ((Tx122.FuelPumpVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE5 = ((Tx122.FuelPumpVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE6 = ((Tx122.FuelPumpCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE7 = ((Tx122.FuelPumpCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.all = CPackMboxData(((Tx122.SolenoidVoltage >> 0U) & 0xFFU), ((Tx122.SolenoidVoltage >> 8U) & 0xFFU),
((Tx122.SolenoidCurrent >> 0U) & 0xFFU), ((Tx122.SolenoidCurrent >> 8U) & 0xFFU));
ECanbMboxes.MBOX7.MDH.all = CPackMboxData(((Tx122.FuelPumpVoltage >> 0U) & 0xFFU), ((Tx122.FuelPumpVoltage >> 8U) & 0xFFU),
((Tx122.FuelPumpCurrent >> 0U) & 0xFFU), ((Tx122.FuelPumpCurrent >> 8U) & 0xFFU));
ECanShadow.CANTRS.bit.TRS7 = 1U;
ECanShadow.CANTA.bit.TA7 = 1U;
ulTxMask |= (1UL << 7U); // MBOX 7
break;
}
case 5U:
@@ -990,17 +931,12 @@ void CSendECanDataB(void)
fTemp = Adc_Fan1_I.fLpfValue * 10.0F;
Tx123.Fan1Current = (Uint16)fTemp;
ECanbMboxes.MBOX8.MDL.byte.BYTE0 = ((Tx123.CoolantPumpVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.byte.BYTE1 = ((Tx123.CoolantPumpVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.byte.BYTE2 = ((Tx123.CoolantPumpCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.byte.BYTE3 = ((Tx123.CoolantPumpCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE4 = ((Tx123.Fan1Voltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE5 = ((Tx123.Fan1Voltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE6 = ((Tx123.Fan1Current >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE7 = ((Tx123.Fan1Current >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.all = CPackMboxData(((Tx123.CoolantPumpVoltage >> 0U) & 0xFFU), ((Tx123.CoolantPumpVoltage >> 8U) & 0xFFU),
((Tx123.CoolantPumpCurrent >> 0U) & 0xFFU), ((Tx123.CoolantPumpCurrent >> 8U) & 0xFFU));
ECanbMboxes.MBOX8.MDH.all = CPackMboxData(((Tx123.Fan1Voltage >> 0U) & 0xFFU), ((Tx123.Fan1Voltage >> 8U) & 0xFFU),
((Tx123.Fan1Current >> 0U) & 0xFFU), ((Tx123.Fan1Current >> 8U) & 0xFFU));
ECanShadow.CANTRS.bit.TRS8 = 1U;
ECanShadow.CANTA.bit.TA8 = 1U;
ulTxMask |= (1UL << 8U); // MBOX 8
break;
}
default:
@@ -1014,23 +950,18 @@ void CSendECanDataB(void)
fTemp = Adc_Fan2_I.fLpfValue * 10.0F;
Tx124.Fan2Current = (Uint16)fTemp;
ECanbMboxes.MBOX9.MDL.byte.BYTE0 = ((Tx124.Fan2Voltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX9.MDL.byte.BYTE1 = ((Tx124.Fan2Voltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX9.MDL.byte.BYTE2 = ((Tx124.Fan2Current >> 0U) & 0xFFU);
ECanbMboxes.MBOX9.MDL.byte.BYTE3 = ((Tx124.Fan2Current >> 8U) & 0xFFU);
ECanbMboxes.MBOX9.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX9.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX9.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX9.MDH.byte.BYTE7 = 0x0U;
ECanbMboxes.MBOX9.MDL.all = CPackMboxData(((Tx124.Fan2Voltage >> 0U) & 0xFFU), ((Tx124.Fan2Voltage >> 8U) & 0xFFU),
((Tx124.Fan2Current >> 0U) & 0xFFU), ((Tx124.Fan2Current >> 8U) & 0xFFU));
ECanbMboxes.MBOX9.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
ECanShadow.CANTRS.bit.TRS9 = 1U;
ECanShadow.CANTA.bit.TA9 = 1U;
ulTxMask |= (1UL << 9U); // MBOX 9
}
break;
}
}
ECanbRegs.CANTRS.all = ECanShadow.CANTRS.all;
ECanbRegs.CANTA.all = ECanShadow.CANTA.all;
ECanbRegs.CANTA.all = ulTxMask;
ECanbRegs.CANTRS.all = ulTxMask;
uiTxDivid = (uiTxDivid + 1U) % 10U;
}

242
Display.c
View File

@@ -88,6 +88,8 @@ static void CDrawSimpleLine(Uint16 row, const int8* label);
static void CDrawStatusTitle(const int8* title, const int8* pageNumStr);
static void CDrawSensorTitle(const int8* title, const int8* pageNumStr);
static void CDrawFaultTitle(const int8* title, const int8* pageNumStr);
static inline Uint16 CIsWarningBitSet(Uint32 value, Uint16 bitNumber);
static inline Uint16 CIsFaultBitSet(Uint32 value, Uint16 bitNumber);
/* ========================================================================= */
/* 5. Global Variables & Structure Initialization (전역 변수 및 구조체 초기화) */
@@ -101,16 +103,20 @@ static void CDrawPageTitle(const int8* title, const int8* pageNumStr)
{
Uint16 uiTitleLen = 0U;
if (title != NULL)
{
CCopyStr(OledOperValue.cStrBuff[IDX_OLED_ROW_0], title);
CDrawStr(10U, (Uint16)IDX_OLED_LINE_TITLE, OledOperValue.cStrBuff[IDX_OLED_ROW_0]);
if (title != NULL)
for (uiTitleLen = 0U; uiTitleLen < (Uint16)TXT_MAX_LEN; uiTitleLen++)
{
while ((title[uiTitleLen] != ASCII_NULL) && (uiTitleLen < (Uint16)TXT_MAX_LEN))
if (OledOperValue.cStrBuff[IDX_OLED_ROW_0][uiTitleLen] == ASCII_NULL)
{
uiTitleLen++;
break;
}
}
}
CDrawTitleBox(uiTitleLen * 6U);
if (pageNumStr != NULL)
@@ -246,7 +252,7 @@ static void CDrawPageLineTwoFloat(Uint16 row, const int8* label, float32 value1,
finalBuf[j] = ASCII_NULL; /* '\0' */
CDrawPageLine(row, label, finalBuf, (const int8*)"A");
CDrawPageLine(row, label, (const int8*)finalBuf, (const int8*)"A");
}
static void CDrawPageLineInt(Uint16 row, const int8* label, int32 value, const int8* unitStr)
@@ -295,7 +301,7 @@ static void CDrawTwoStatusLine(Uint16 row, const int8* label1, Uint16 status1, c
// Status 2
CStrncat(OledOperValue.cStrBuff[row], statusStr2, CStrLen(statusStr2));
CDrawLineText(0U, drawY, OledOperValue.cStrBuff[row]);
CDrawLineText(0U, drawY, (const int8*)OledOperValue.cStrBuff[row]);
}
static void CPageApu1(void)
@@ -350,7 +356,7 @@ static void CPageApu1(void)
CStrncat(OledOperValue.cStrBuff[IDX_OLED_ROW_4], cTemp, CStrLen(cTemp));
}
CDrawLineText(0U, (Uint16)IDX_OLED_LINE_4, OledOperValue.cStrBuff[IDX_OLED_ROW_4]);
CDrawLineText(0U, (Uint16)IDX_OLED_LINE_4, (const int8*)OledOperValue.cStrBuff[IDX_OLED_ROW_4]);
uiDummyRun = (uiDummyRun == 1U) ? 0U : uiDummyRun;
}
@@ -542,16 +548,16 @@ static void CPageWarning1(void)
CDrawPageTitle("Warning", "1/2");
// LINE 1
CDrawTwoStatusLine(IDX_OLED_ROW_1, "PCBOT:", CIsBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_PCB_OT), "FETOT:", CIsBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_FET_OT));
CDrawTwoStatusLine(IDX_OLED_ROW_1, "PCBOT:", CIsWarningBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_PCB_OT), "FETOT:", CIsWarningBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_FET_OT));
// LINE 2
CDrawTwoStatusLine(IDX_OLED_ROW_2, "GEOT1:", CIsBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_WINDING1_OH), "GEOT2:", CIsBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_WINDING2_OH));
CDrawTwoStatusLine(IDX_OLED_ROW_2, "GEOT1:", CIsWarningBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_WINDING1_OH), "GEOT2:", CIsWarningBitSet((Uint32)Rx210.GcuWarning, (Uint16)IDX_WARNING_GCU_WINDING2_OH));
// LINE 3
CDrawTwoStatusLine(IDX_OLED_ROW_3, "ENGOT:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_ENGINE_OH), "LOILP:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_LO_OIL_PRESS));
CDrawTwoStatusLine(IDX_OLED_ROW_3, "ENGOT:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_ENGINE_OH), "LOILP:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_LO_OIL_PRESS));
// LINE 4
CDrawTwoStatusLine(IDX_OLED_ROW_4, "INTOT:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_INTAKE_OH), "INTLP:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_INTAKE_LO_PRESS));
CDrawTwoStatusLine(IDX_OLED_ROW_4, "INTOT:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_INTAKE_OH), "INTLP:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_INTAKE_LO_PRESS));
}
static void CPageWarning2(void)
@@ -560,10 +566,10 @@ static void CPageWarning2(void)
CDrawPageTitle("Warning", "2/2");
/* LINE 1 */
CDrawTwoStatusLine((Uint16)IDX_OLED_ROW_1, (const int8*)"ENGLT:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_ENGINE_LO_TEMP), (const int8*)"ENGSF:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_ENGINE_SENSOR));
CDrawTwoStatusLine((Uint16)IDX_OLED_ROW_1, (const int8*)"ENGLT:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_ENGINE_LO_TEMP), (const int8*)"ENGSF:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_ENGINE_SENSOR));
/* LINE 2 */
CDrawPageLineStatus((Uint16)IDX_OLED_ROW_2, (const int8*)"DEFAC:", CIsBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_DEFAULT_ACTIVE));
CDrawPageLineStatus((Uint16)IDX_OLED_ROW_2, (const int8*)"DEFAC:", CIsWarningBitSet((Uint32)Rx310.EcuWarning, (Uint16)IDX_WARNING_ECU_DEFAULT_ACTIVE));
}
static void CPageFault1(void)
@@ -572,16 +578,16 @@ static void CPageFault1(void)
CDrawFaultTitle("APU Fault", "1/7");
// LINE 1
CDrawTwoStatusLine(IDX_OLED_ROW_1, "CARCT:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_CAR_COMM), "GCUCT:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GCU_COMM));
CDrawTwoStatusLine(IDX_OLED_ROW_1, "CARCT:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_CAR_COMM), "GCUCT:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GCU_COMM));
// LINE 2
CDrawTwoStatusLine(IDX_OLED_ROW_2, "ECUCT:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ECU_COMM), "RPMER:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_RPM_ERR));
CDrawTwoStatusLine(IDX_OLED_ROW_2, "ECUCT:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ECU_COMM), "RPMER:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_RPM_ERR));
// LINE 3
CDrawTwoStatusLine(IDX_OLED_ROW_3, "EHLOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ENGINE_HEAT_OC), "GPLOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_OC));
CDrawTwoStatusLine(IDX_OLED_ROW_3, "EHLOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ENGINE_HEAT_OC), "GPLOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_OC));
// LINE 4
CDrawTwoStatusLine(IDX_OLED_ROW_4, "SOLOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_OC), "FPLOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_OC));
CDrawTwoStatusLine(IDX_OLED_ROW_4, "SOLOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_OC), "FPLOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_OC));
}
static void CPageFault2(void)
@@ -590,16 +596,16 @@ static void CPageFault2(void)
CDrawFaultTitle("APU Fault", "2/7");
// LINE 1
CDrawTwoStatusLine(IDX_OLED_ROW_1, "CPLOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_OC), "F1LOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_OC));
CDrawTwoStatusLine(IDX_OLED_ROW_1, "CPLOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_OC), "F1LOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_OC));
// LINE 2
CDrawTwoStatusLine(IDX_OLED_ROW_2, "F2LOC:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_OC), "EHVUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ENGINE_HEAT_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_2, "F2LOC:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_OC), "EHVUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ENGINE_HEAT_UV));
// LINE 3
CDrawTwoStatusLine(IDX_OLED_ROW_3, "EHVOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ENGINE_HEAT_OV), "GPVUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_3, "EHVOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_ENGINE_HEAT_OV), "GPVUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_UV));
// LINE 4
CDrawTwoStatusLine(IDX_OLED_ROW_4, "GPVOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_OV), "SLVUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_4, "GPVOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_OV), "SLVUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_UV));
}
static void CPageFault3(void)
@@ -608,16 +614,16 @@ static void CPageFault3(void)
CDrawFaultTitle("APU Fault", "3/7");
// LINE 1
CDrawTwoStatusLine(IDX_OLED_ROW_1, "SLVOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_OV), "FPVUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_1, "SLVOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_OV), "FPVUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_UV));
// LINE 2
CDrawTwoStatusLine(IDX_OLED_ROW_2, "FPVOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_OV), "CPVUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_2, "FPVOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_OV), "CPVUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_UV));
// LINE 3
CDrawTwoStatusLine(IDX_OLED_ROW_3, "CPVOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_OV), "F1VUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_3, "CPVOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_OV), "F1VUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_UV));
// LINE 4
CDrawTwoStatusLine(IDX_OLED_ROW_4, "F1VOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_OV), "F2VUV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_UV));
CDrawTwoStatusLine(IDX_OLED_ROW_4, "F1VOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_OV), "F2VUV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_UV));
}
static void CPageFault4(void)
@@ -626,7 +632,7 @@ static void CPageFault4(void)
CDrawFaultTitle((const int8*)"APU Fault", (const int8*)"4/7");
/* LINE 1: */
CDrawFaultStatusLine((Uint16)IDX_OLED_ROW_1, (const int8*)"F2VOV:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_OV), (const int8*)"CRKFL:", CIsBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_CRANKING_FAIL));
CDrawFaultStatusLine((Uint16)IDX_OLED_ROW_1, (const int8*)"F2VOV:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_OV), (const int8*)"CRKFL:", CIsFaultBitSet(ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_CRANKING_FAIL));
}
static void CPageFault5(void)
@@ -635,16 +641,16 @@ static void CPageFault5(void)
CDrawFaultTitle("GCU Fault", "5/7");
// LINE 1
CDrawFaultStatusLine(IDX_OLED_ROW_1, "HTRIP:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_HWTRIP), "HIGBT:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_HWIGBT));
CDrawFaultStatusLine(IDX_OLED_ROW_1, "HTRIP:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_HWTRIP), "HIGBT:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_HWIGBT));
// LINE 2
CDrawFaultStatusLine(IDX_OLED_ROW_2, "HDCOV:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_HW_DC), "GNOCU:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OCU));
CDrawFaultStatusLine(IDX_OLED_ROW_2, "HDCOV:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_HW_DC), "GNOCU:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OCU));
// LINE 3
CDrawFaultStatusLine(IDX_OLED_ROW_3, "GNOCV:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OCW), "GNOCW:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OCW));
CDrawFaultStatusLine(IDX_OLED_ROW_3, "GNOCV:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OCW), "GNOCW:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OCW));
// LINE 4
CDrawFaultStatusLine(IDX_OLED_ROW_4, "SDCOV:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_DC_OV), "SDCOC:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_DC_OC));
CDrawFaultStatusLine(IDX_OLED_ROW_4, "SDCOV:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_DC_OV), "SDCOC:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_DC_OC));
}
static void CPageFault6(void)
@@ -653,16 +659,16 @@ static void CPageFault6(void)
CDrawFaultTitle("GCU Fault", "6/7");
// LINE 1
CDrawFaultStatusLine(IDX_OLED_ROW_1, "SMOOC:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_CRANK_OC), "PCBOT:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_PCB_OT));
CDrawFaultStatusLine(IDX_OLED_ROW_1, "SMOOC:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_CRANK_OC), "PCBOT:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_PCB_OT));
// LINE 2
CDrawFaultStatusLine(IDX_OLED_ROW_2, "FETOT:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_FET_OT), "GW1OT:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_WINDING1_OH));
CDrawFaultStatusLine(IDX_OLED_ROW_2, "FETOT:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_FET_OT), "GW1OT:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_WINDING1_OH));
// LINE 3
CDrawFaultStatusLine(IDX_OLED_ROW_3, "GW2OT:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_WINDING2_OH), "GENOS:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OS));
CDrawFaultStatusLine(IDX_OLED_ROW_3, "GW2OT:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_WINDING2_OH), "GENOS:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_GEN_OS));
// LINE 4
CDrawFaultStatusLine(IDX_OLED_ROW_4, "RSICF:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_RES_IC), "RSPRT:", CIsBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_RES_PRTY));
CDrawFaultStatusLine(IDX_OLED_ROW_4, "RSICF:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_RES_IC), "RSPRT:", CIsFaultBitSet(ulGcuTotalAlarm, (Uint16)IDX_FAULT_GCU_RES_PRTY));
}
static void CPageFault7(void)
@@ -671,13 +677,13 @@ static void CPageFault7(void)
CDrawFaultTitle("ECU Fault", "7/7");
// LINE 1
CDrawFaultStatusLine(IDX_OLED_ROW_1, "OILMS:", CIsBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_OIL_MS), "INTOT:", CIsBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_INT_OH));
CDrawFaultStatusLine(IDX_OLED_ROW_1, "OILMS:", CIsFaultBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_OIL_MS), "INTOT:", CIsFaultBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_INT_OH));
// LINE 2
CDrawFaultStatusLine(IDX_OLED_ROW_2, "ENGOH:", CIsBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_ENG_OH), "ACTUA:", CIsBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_ACTUATOR));
CDrawFaultStatusLine(IDX_OLED_ROW_2, "ENGOH:", CIsFaultBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_ENG_OH), "ACTUA:", CIsFaultBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_ACTUATOR));
// LINE 3
CDrawFaultStatusLine(IDX_OLED_ROW_3, "RPMSG:", CIsBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_RPM_SIG), "ENGSF:", CIsBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_ENG_SF));
CDrawFaultStatusLine(IDX_OLED_ROW_3, "RPMSG:", CIsFaultBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_RPM_SIG), "ENGSF:", CIsFaultBitSet(ulEcuTotalAlarm, (Uint16)IDX_FAULT_ECU_ENG_SF));
}
static void CDrawAlarmBox(void)
@@ -730,7 +736,7 @@ static void CDrawPostStatusLine(Uint16 row, const int8* l1, Uint16 s1, const int
}
else
{
CTextAlign(OledOperValue.cAlignBuffer, OledOperValue.cStrBuff[row]);
CTextAlign(OledOperValue.cAlignBuffer, (const int8*)OledOperValue.cStrBuff[row]);
pPrintStr = OledOperValue.cAlignBuffer;
}
@@ -835,17 +841,12 @@ static void CPageMaintenance(void)
// LINE 1
CLineFocus((OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_1) ? 1U : 0U);
cTemp = (GeneralOperValue.Maintenance.ManualCranking > 0U) ? (int8*)"ON " : (int8*)"OFF";
CDrawPageLine(IDX_OLED_ROW_1, "Manual Cranking ", cTemp, NULL);
cTemp = (GeneralOperValue.Maintenance.LampTest > 0U) ? (int8*)"ON " : (int8*)"OFF";
CDrawPageLine(IDX_OLED_ROW_1, "Lamp Test ", cTemp, NULL);
// LINE 2
CLineFocus((OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_2) ? 1U : 0U);
cTemp = (GeneralOperValue.Maintenance.LampTest > 0U) ? (int8*)"ON " : (int8*)"OFF";
CDrawPageLine(IDX_OLED_ROW_2, "Lamp Test ", cTemp, NULL);
// LINE 3
CLineFocus((OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_3) ? 1U : 0U);
CDrawPageLine(IDX_OLED_ROW_3, "Switch Test ", NULL, NULL);
CDrawPageLine(IDX_OLED_ROW_2, "Switch Test ", NULL, NULL);
}
static void CPageVersion(void)
@@ -859,21 +860,21 @@ static void CPageVersion(void)
// LINE 2
CMakeVersionString(cTemp, (int16)FIRMWARE_VERSION_MAJOR, (int16)FIRMWARE_VERSION_MINOR, (int16)FIRMWARE_VERSION_PATCH);
CDrawPageLine(IDX_OLED_ROW_2, " DCU : ", cTemp, NULL);
CDrawPageLine(IDX_OLED_ROW_2, " DCU : ", (const int8*)cTemp, NULL);
// LINE 3
CMakeVersionString(cTemp, (int16)Rx200.VersionMajor, (int16)Rx200.VersionMinor, (int16)Rx200.VersionPatch);
CDrawPageLine(IDX_OLED_ROW_3, " GCU : ", cTemp, NULL);
CDrawPageLine(IDX_OLED_ROW_3, " GCU : ", (const int8*)cTemp, NULL);
// LINE 4
CMakeVersionString(cTemp, (int16)Rx300.VersionMajor, (int16)Rx300.VersionMinor, (int16)Rx300.VersionPatch);
CDrawPageLine(IDX_OLED_ROW_4, " ECU : ", cTemp, NULL);
CDrawPageLine(IDX_OLED_ROW_4, " ECU : ", (const int8*)cTemp, NULL);
}
static void CDrawCenteredLine(Uint16 y, const int8* text)
{
CStrncpy(OledOperValue.cStrBuff[IDX_OLED_ROW_0], text, CStrLen(text));
CTextAlign(OledOperValue.cAlignBuffer, OledOperValue.cStrBuff[IDX_OLED_ROW_0]);
CTextAlign(OledOperValue.cAlignBuffer, (const int8*)OledOperValue.cStrBuff[IDX_OLED_ROW_0]);
CDrawStr(0U, y, OledOperValue.cAlignBuffer);
}
@@ -929,7 +930,7 @@ static void CDrawKeyStatusLine(Uint16 row, const int8* l1, Uint16 s1, const int8
}
}
CDrawLineText(0U, y, OledOperValue.cStrBuff[row]);
CDrawLineText(0U, y, (const int8*)OledOperValue.cStrBuff[row]);
}
static void CPageKeyTest(void)
@@ -1074,21 +1075,21 @@ static void CInitProgress(void)
{
OledOperValue.Color.TxtColor = 1U;
CTextAlign(OledOperValue.cAlignBuffer, "K2 APU");
CTextAlign(OledOperValue.cAlignBuffer, (const int8*)"K2 APU");
CDrawStr(0, (Uint16)IDX_OLED_LINE_TITLE, OledOperValue.cAlignBuffer);
CDrawBox(OLED_LOAD_PROGRESS_X, OLED_LOAD_PROGRESS_Y, OLED_LOAD_PROGRESS_W, OLED_LOAD_PROGRESS_H);
(void)memset(OledOperValue.cAlignBuffer, 0, sizeof(char) * TXT_MAX_LEN);
CTextAlign(OledOperValue.cAlignBuffer, "Initializing System");
CTextAlign(OledOperValue.cAlignBuffer, (const int8*)"Initializing System");
CDrawStr(0, (Uint16)IDX_OLED_LINE_2, OledOperValue.cAlignBuffer);
}
static void CAddLineIndent(int8 *buffer, const int8 *str)
{
Uint16 i;
Uint16 uiSpaceNeeded = ((Uint16)TXT_MAX_LEN - 1U) - CStrLen(buffer) - CStrLen(str);
Uint16 uiSpaceNeeded = ((Uint16)TXT_MAX_LEN - 1U) - CStrLen((const int8*)buffer) - CStrLen((const int8*)str);
if (uiSpaceNeeded > 0U)
{
@@ -1171,7 +1172,7 @@ static void CDrawLine(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2)
int16 err = 0;
int16 ystep = 0;
dx = uiX2 - uiX1;
dx = (uiX1 > uiX2) ? (uiX1 - uiX2) : (uiX2 - uiX1);
dy = (uiY1 > uiY2) ? (uiY1 - uiY2) : (uiY2 - uiY1);
if (dy > dx)
@@ -1322,23 +1323,35 @@ void CInitXintf(void)
static void CDrawStr(Uint16 x, Uint16 y, const int8* str)
{
Uint16 i = 0U;
Uint16 uiHighByte = 0U; /* 2바이트 문자 조합용 임시 변수 */
Uint16 uiLowByte = 0U;
if (str != NULL)
{
/* 널 문자를 만나거나 최대 한계에 도달할 때까지 그리기 수행 */
while ((str[i] != ASCII_NULL) && (i < (Uint16)TXT_MAX_LEN))
while ((i < (Uint16)TXT_MAX_LEN) && (str[i] != ASCII_NULL))
{
if (((Uint8)str[i] & 0x80U) != 0U)
{
CDrawChar(x, y, (Uint16)(((Uint16)str[i] << 8U) | (Uint16)str[i + 1U]), TXT_TYPE_ETC);
uiHighByte = (Uint16)str[i];
i++;
if (i < (Uint16)TXT_MAX_LEN)
{
uiLowByte = (Uint16)str[i];
CDrawChar(x, y, (Uint16)((uiHighByte << 8U) | uiLowByte), TXT_TYPE_ETC);
x += (TXT_ENG_WIDTH * 2U);
}
else
{
break;
}
}
else
{
CDrawChar(x, y, (Uint16)str[i], TXT_TYPE_ENG);
x += TXT_ENG_WIDTH;
}
i++;
}
}
@@ -1505,50 +1518,62 @@ static Uint16 CStrLen(const int8 *s)
}
static void CStrncpy(int8 *pTarget, const int8 *pSource, Uint16 Size)
{
Uint16 i;
Uint16 i = 0U;
Uint16 uiSafeLimit;
int8 *pCurTarget = pTarget;
uiSafeLimit = (Size >= TXT_MAX_LEN) ? (TXT_MAX_LEN - 1U) : Size;
const int8 *pCurSource = pSource;
//for (i = 0U; i < uiSafeLimit; i++)
for (i = 0U; (i < uiSafeLimit) && (i < (TXT_MAX_LEN - 1U)); i++)
if ((pTarget != NULL) && (pSource != NULL))
{
pTarget[i] = pSource[i];
uiSafeLimit = (Size >= (Uint16)TXT_MAX_LEN) ? ((Uint16)TXT_MAX_LEN - 1U) : Size;
while ((i < (Uint16)(TXT_MAX_LEN - 1U)) && (i < uiSafeLimit) && (*pCurSource != ASCII_NULL))
{
*pCurTarget = *pCurSource;
pCurTarget++;
pCurSource++;
i++;
}
pTarget[i] = ASCII_NULL;
*pCurTarget = ASCII_NULL;
}
}
static void CStrncat(int8 *pTarget, const int8 *pSource, Uint16 Size)
{
Uint16 i;
Uint16 uiTargetSize;
Uint16 i = 0U; /* pSource를 읽을 인덱스 */
Uint16 uiTargetSize = 0U;
Uint16 uiRemainSpace;
Uint16 uiSafeLimit;
uiTargetSize = 0U;
int8 *pCurTarget = pTarget;
if (pTarget != NULL)
if ((pTarget != NULL) && (pSource != NULL))
{
/* 함수를 부르지 않고, 해당 위치에서 직접 널 문자를 찾을 때까지 카운트 (FUNCR 증가 없음) */
while (pTarget[uiTargetSize] != ASCII_NULL)
while ((uiTargetSize < (Uint16)TXT_MAX_LEN) && (*pCurTarget != ASCII_NULL))
{
uiTargetSize++;
}
pCurTarget++; /* 포인터 주소를 1바이트씩 직접 전진 */
}
if (uiTargetSize < (Uint16)(TXT_MAX_LEN - 1U))
{
uiRemainSpace = (Uint16)((Uint16)(TXT_MAX_LEN - 1U) - uiTargetSize);
uiSafeLimit = (Size >= uiRemainSpace) ? uiRemainSpace : Size;
for (i = 0U; (i < uiSafeLimit) && ((uiTargetSize + i) < (Uint16)(TXT_MAX_LEN - 1U)); i++)
while ((i < uiSafeLimit) && (uiTargetSize < (Uint16)(TXT_MAX_LEN - 1U)) && (pSource[i] != ASCII_NULL))
{
pTarget[uiTargetSize + i] = pSource[i];
*pCurTarget = pSource[i];
pCurTarget++;
uiTargetSize++;
i++;
}
pTarget[uiTargetSize + i] = ASCII_NULL;
*pCurTarget = ASCII_NULL;
}
}
}
@@ -1560,13 +1585,12 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
Uint16 x = 0U; // cTmp에 추출된 숫자의 개수 (자릿수 카운트)
Uint16 y = 0U; // 최종 문자열 Array에 값을 써넣을 인덱스
int32 lData = (int32)Data * 10;
Uint16 uiSafeLen = (ArrayLen > (Uint16)TXT_MAX_LEN) ? (Uint16)TXT_MAX_LEN : ArrayLen;
// 추출된 각 자리의 숫자를 임시로 저장할 버퍼 (역순으로 저장됨)
int32 lData = (int32)Data * 10;
int8 cTmp[6] = { ASCII_NULL, ASCII_NULL, ASCII_NULL, ASCII_NULL, ASCII_NULL, ASCII_NULL };
// 출력할 배열 전체를 공백(ASCII 32 = ' ')으로 초기화
for (i = 0U; (i < ArrayLen) && (i < TXT_MAX_LEN); i++)
for (i = 0U; (i < uiSafeLen) && (i < (Uint16)TXT_MAX_LEN); i++)
{
Array[i] = ASCII_BLANK;
}
@@ -1589,9 +1613,8 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
// 추출한 숫자를 최종 배열에 배치 (우측 정렬 적용)
if (x == 0U)
{
// 수치가 0인 경우, 지정된 고정 위치(y=3)에 '0' 표시
y = 4U;
if (y < ArrayLen)
if (y < uiSafeLen)
{
Array[y] = ASCII_0;
y++;
@@ -1601,14 +1624,11 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
{
if (x > 0U)
{
// 앞서 '* 10'으로 부풀리며 추가되었던 최하위 숫자(0)를 버리기 위해 인덱스를 1 감소시킴
x = (Uint16)(x - 1U);
}
// 전체 폭(5칸 기준)에서 자릿수를 빼서, 문자가 쓰이기 시작할 시작 위치(y) 계산
y = (x <= 5U) ? (Uint16)(5U - x) : 0U;
// 부호('-')가 들어갈 자리 지정 (숫자가 시작되는 곳의 바로 앞 칸)
if (y < 1U)
{
uiSignLocate = 0U;
@@ -1622,23 +1642,22 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
uiSignLocate = 0U;
}
// 계산된 부호 위치에 '-' 또는 공백 삽입
if (uiSign == 1U)
{
if ((uiSignLocate > 0U) && (uiSignLocate < 6U) && (uiSignLocate < ArrayLen))
if ((uiSignLocate > 0U) && (uiSignLocate < 6U) && (uiSignLocate < uiSafeLen))
{
Array[uiSignLocate] = ASCII_MINUS; // '-'
}
}
else
{
if (uiSignLocate < ArrayLen)
if (uiSignLocate < uiSafeLen)
{
Array[uiSignLocate] = ASCII_BLANK; // ' '
}
}
while ((x > 0U) && (x < 6U) && (y < ArrayLen) && (y < TXT_MAX_LEN))
while ((x > 0U) && (x < 6U) && (y < uiSafeLen))
{
Array[y] = cTmp[x];
y++;
@@ -1646,23 +1665,29 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
}
}
// 문자열의 끝을 알리는 널(NULL, ASCII 0) 문자 삽입하여 문자열 완성
if ((y < ArrayLen) && (y < TXT_MAX_LEN))
if (y < uiSafeLen)
{
Array[y] = ASCII_NULL;
}
else
{
if (ArrayLen > 0U)
if (uiSafeLen > 0U)
{
Array[(Uint16)(ArrayLen - 1U)] = ASCII_NULL;
y = (Uint16)(uiSafeLen - 1U);
if (y < ArrayLen)
{
Array[y] = ASCII_NULL;
}
}
}
}
static void CFloatToString(float32 Data, int8 *Array, Uint16 ArrayLen)
{
int32 iTemp; // 음수 처리를 위해 signed int32 사용 (범위 확보)
float32 fData = Data;
int32 iTemp; // 음수 처리
Uint16 isNegative = 0U; // 음수 여부 플래그
int8 cTmp[10]; // 임시 변환 버퍼
Uint16 len = 0U; // 현재 변환된 문자 길이
@@ -1675,14 +1700,14 @@ static void CFloatToString(float32 Data, int8 *Array, Uint16 ArrayLen)
}
// 음수 확인 및 양수 변환
if (Data < 0.0F)
if (fData < 0.0F)
{
isNegative = 1U;
Data = -Data; // 절대값으로 변환
fData = -fData; // 절대값으로 변환
}
// 소수점 1자리 정수로 변환 (예: 12.34 -> 123.4 -> 123)
iTemp = (int32)((float32)((Data * 10.0F) + 0.5F));
iTemp = (int32)((float32)((fData * 10.0F) + 0.5F));
// 소수점 첫째 자리 추출
cTmp[len++] = (int8)((int8)(iTemp % 10) + ASCII_0); // '0'
@@ -1713,19 +1738,18 @@ static void CFloatToString(float32 Data, int8 *Array, Uint16 ArrayLen)
// 최종 배열에 복사 (우측 정렬, 총 6자리 제한)
// 만약 변환된 길이가 6자리를 넘으면 6자리로 자름
if (len > 6U)
{
len = 6U;
}
if (ArrayLen >= 7U) // ArrayLen 보호
{
if (len > 0U)
{
Uint16 uiReadIdx = len; /* cTmp 배열을 역순으로 읽기 위한 전용 인덱스 */
startIdx = 6U - len;
for (i = 0U; i < len; i++)
{
Array[startIdx + i] = cTmp[len - 1U - i]; // cTmp는 역순이므로 len-1-i 로 접근
uiReadIdx--;
Array[startIdx + i] = cTmp[uiReadIdx];
}
}
Array[6] = ASCII_NULL;
@@ -1977,3 +2001,17 @@ static void CDrawFaultTitle(const int8* title, const int8* pageNumStr)
{
CDrawPageTitle(title, pageNumStr);
}
static inline Uint16 CIsWarningBitSet(Uint32 value, Uint16 bitNumber)
{
Uint32 ulMask = 1UL << (Uint32)bitNumber;
return (((value & ulMask) != 0UL) ? 1U : 0U);
}
static inline Uint16 CIsFaultBitSet(Uint32 value, Uint16 bitNumber)
{
Uint32 ulMask = 1UL << (Uint32)bitNumber;
return (((value & ulMask) != 0UL) ? 1U : 0U);
}

76
Oper.c
View File

@@ -10,10 +10,7 @@
#define ENGINE_OPERATION_SPEED (2400U)
#define ENGINE_DIFF_SPEED (400U) // 2800 - 2400
// IDLE_SEQ_MOD
#define RPM_RAMP_START (1500U)
#define RPM_RAMP_END (2400U)
#define RPM_RAMP_RANGE (RPM_RAMP_END - RPM_RAMP_START) // 900
#define TIME_RAMP_UP (TIME_1SEC * 3UL) // 3초
#define LED_OFF (0U)
@@ -39,6 +36,7 @@ static void CProcessApuStateGenerating(void);
static void CProcessApuStateCooldown(void);
static void CProcessApuStateStopping(void);
static void CProcessApuStateTransition(void); // 비상/시동/정지 전이 판별용
static void CExecuteApuState(Uint16 uiState);
static void CSetEngineActualRpm(Uint16 Rpm);
static float32 CGetGcuLoadPower(void);
static Uint16 CDynamicRpmControl(void);
@@ -123,40 +121,18 @@ static void CProcessApuStateRetryCranking(void)
static void CProcessApuStateEngineIdle(void)
{
#if 0 // '0' - 기존 코드, '1' - IDLE_SEQ_MOD
if (((Rx301.State >> 1U) & 0x07U) == (Uint16)IDX_ECU_STAT_OPERATION)
{
// 보조엔진제어기의 상태가 OPERATION이고 보조엔진의 속도가 2300 RPM 이상 5초 유지 시 발전상태로 전환
if (CGetEngineActualRpm() >= (ENGINE_OPERATION_SPEED - 100U)) // 2300 RPM
{
if (CSoftWaitCountProcedure(SOFTTIMER_WAIT_OPERATION, TIME_5SEC) == (Uint16)TIME_OVER)
{
GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING;
}
}
else
{
CSoftWaitCountClear(SOFTTIMER_WAIT_OPERATION);
}
}
#else
if (((Rx301.State >> 1U) & 0x07U) == (Uint16)IDX_ECU_STAT_OPERATION)
{
// ECU OPERATION 확인 즉시 발전 상태로 전환 (RPM Ramp는 CProcessApuStateGenerating에서 수행)
GeneralOperValue.ulRampStartClock = 0UL;
GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING;
}
#endif
}
static void CProcessApuStateGenerating(void)
{
#if 0 // '0' - 기존 코드, '1' - IDLE_SEQ_MOD
CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING); // 발전 명령 송신
GeneralOperValue.uiDynamicRPM = CDynamicRpmControl();
CSetEngineActualRpm(GeneralOperValue.uiDynamicRPM); // RPM 가변 제어 시작
#else
Uint32 ulElapsed;
Uint16 uiRampRange;
Uint16 uiRampRpm;
CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING);
@@ -170,16 +146,19 @@ static void CProcessApuStateGenerating(void)
{
if (GeneralOperValue.ulRampStartClock == 0UL)
{
Uint16 uiActual = CGetEngineActualRpm();
GeneralOperValue.uiRampStartRpm = (uiActual < RPM_RAMP_END) ? uiActual : RPM_RAMP_END;
GeneralOperValue.ulRampStartClock = CGetSoftClock();
CSetEngineActualRpm(RPM_RAMP_START);
CSetEngineActualRpm(GeneralOperValue.uiRampStartRpm);
}
else
{
ulElapsed = (CGetSoftClock() + SYSTEM_10MIN_TIME - GeneralOperValue.ulRampStartClock) % SYSTEM_10MIN_TIME;
uiRampRange = RPM_RAMP_END - GeneralOperValue.uiRampStartRpm; // 동적 범위
if (ulElapsed < TIME_RAMP_UP)
{
uiRampRpm = (Uint16)(RPM_RAMP_START + (Uint16)(((Uint32)RPM_RAMP_RANGE * ulElapsed) / TIME_RAMP_UP));
uiRampRpm = (Uint16)(GeneralOperValue.uiRampStartRpm + (Uint16)(((Uint32)uiRampRange * ulElapsed) / TIME_RAMP_UP));
CSetEngineActualRpm(uiRampRpm);
}
else
@@ -190,7 +169,6 @@ static void CProcessApuStateGenerating(void)
}
}
}
#endif
}
static void CProcessApuStateCooldown(void)
@@ -292,8 +270,13 @@ void CApuOperProcedure(void)
CSetAuxCtrlPin(IDX_CS_FUEL_PUMP, FuelPumpSig);
}
// 각 상태별 동작 수행
switch (GeneralOperValue.uiApuState)
CExecuteApuState(GeneralOperValue.uiApuState);
}
}
static void CExecuteApuState(Uint16 uiState)
{
switch (uiState)
{
case (Uint16)IDX_APU_OPER_READY:
{
@@ -336,7 +319,6 @@ void CApuOperProcedure(void)
break;
}
}
}
}
static Uint16 CDynamicRpmControl(void)
@@ -384,10 +366,6 @@ static void CInitialStandby(void)
GeneralOperValue.uiEmergency = 0U;
GeneralOperValue.ulRampStartClock = 0UL; // IDLE_SEQ_MOD
GeneralOperValue.uiRampComplete = 0U; // IDLE_SEQ_MOD
GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1U; // GPIO_FAULT_CMD
}
@@ -409,10 +387,6 @@ static void CEmergencyStop(void)
GeneralOperValue.uiEmergency = 1U;
GeneralOperValue.ulRampStartClock = 0UL; // IDLE_SEQ_MOD
GeneralOperValue.uiRampComplete = 0U; // IDLE_SEQ_MOD
GpioDataRegs.GPBSET.bit.GPIO55 = 1U; //GPIO_FAULT_CMD
}
@@ -468,12 +442,7 @@ void CSetEcuCommand(Uint16 Command)
// [ECU_OPER_CMD_START]
GeneralOperValue.EcuCommand.EngineStart = 1U;
GeneralOperValue.EcuCommand.EngineStop = 0U;
#if 0 // RPM 테스트
CSetEngineActualRpm(Rx400.SetRPM.PCAN_RPM);
#else
//CSetEngineActualRpm(2400U);
CSetEngineActualRpm(1500U); // Target Idle
#endif
CSetEngineActualRpm(1200U);
}
}
@@ -482,21 +451,8 @@ int16 CGetEngCoolantTemperature(void)
return (int16) Rx321.CoolantTemperature - 40; // 온도 오프셋 -40도
}
void CDebugModeProcedure(void)
void CMaintenanceProcedure(void)
{
if (GeneralOperValue.Maintenance.ManualCranking == 1U)
{
if (GeneralOperValue.uiFaultOccured == 0U)
{
// 알람이 없을 경우만 동작 하도록 함.
CSetGcuCommand((Uint16)IDX_GCU_CMD_CRANKING);
}
}
else
{
CSetGcuCommand((Uint16)IDX_GCU_CMD_STOP);
}
if (GeneralOperValue.Maintenance.LampTest == 1U)
{
CLedControl(0U, 1U);

2
Oper.h
View File

@@ -52,7 +52,7 @@ typedef enum
} E_IDX_ECU_CMD;
void CApuOperProcedure(void);
void CDebugModeProcedure(void);
void CMaintenanceProcedure(void);
void CLedControlProcedure(void);
int16 CGetEngCoolantTemperature(void);
Uint16 CGetGeneratorRpm(void);

41
State.c
View File

@@ -48,6 +48,7 @@ static void CKeyCheck(Uint32 ulChangeKey, Uint32 ulKeyRead);
static void CMoveFocusLine(Uint16 maxLines, Uint16 direction);
static void CChangePasswordDigit(Uint16 direction);
static inline void CCalcAdcSum(CAdcCalcValue *AdcBuff);
static inline Uint16 CIsBitSet(Uint32 value, Uint16 bitNumber);
/* ========================================================================= */
/* 5. Global Variables & Structure Initialization (전역 변수 및 구조체 초기화) */
@@ -168,6 +169,11 @@ void CDisplayAlarmPopup(void)
// WarningValue는 경고가 사라질수 있기 때문에 랫치 하지 않음
Uint32 WarningValue = (((Uint32)Rx210.GcuWarning & (Uint32)MASK_LOW_NIBBLE) | (((Uint32)Rx310.EcuWarning & 0xFDU) << 4U));
Uint16 i;
Uint16 UpdatePage = 0U; // 0: 유지, 1: Fault 이동, 2: Warning 이동
Uint64 TargetFault = 0U; // 검색할 대상 변수 (Fault)
Uint32 TargetWarning = 0U; // 검색할 대상 변수 (Warning)
// 0 → 1로 바뀐 비트만 추출
Uint64 NewFault = FaultValue & (~PrevFaultValue);
Uint32 NewWarning = WarningValue & (~PrevWarningValue);
@@ -176,11 +182,6 @@ void CDisplayAlarmPopup(void)
PrevFaultValue = FaultValue;
PrevWarningValue = WarningValue;
Uint16 i;
Uint16 UpdatePage = 0U; // 0: 유지, 1: Fault 이동, 2: Warning 이동
Uint64 TargetFault = 0U; // 검색할 대상 변수 (Fault)
Uint32 TargetWarning = 0U; // 검색할 대상 변수 (Warning)
if (NewFault > 0ULL)
{
TargetFault = NewFault; // 새로 뜬 Fault만 검색 대상
@@ -274,11 +275,10 @@ void CAlarmProcedure(void)
CUpdateFault(&ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_GLOW_PLUG_OC, CAlarmCheck(IDX_FAULT_DCU_GLOW_PLUG_OC, Adc_GlowPlug_I.fLpfValue, AlarmOperValue[(Uint16)IDX_FAULT_DCU_GLOW_PLUG_OC].uiCheckTime, ALARM_OVER_CHECK));
CUpdateFault(&ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_SOLENOID_OC, CAlarmCheck(IDX_FAULT_DCU_SOLENOID_OC, Adc_Solenoid_I.fLpfValue, AlarmOperValue[(Uint16)IDX_FAULT_DCU_SOLENOID_OC].uiCheckTime, ALARM_OVER_CHECK));
CUpdateFault(&ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FUEL_PUMP_OC, CAlarmCheck(IDX_FAULT_DCU_FUEL_PUMP_OC, Adc_FuelPump_I.fLpfValue, AlarmOperValue[(Uint16)IDX_FAULT_DCU_FUEL_PUMP_OC].uiCheckTime, ALARM_OVER_CHECK));
#if 0 // IDLE_SEQ_MOD
CUpdateFault(&ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_COOLANT_PUMP_OC, CAlarmCheck(IDX_FAULT_DCU_COOLANT_PUMP_OC, Adc_CoolantPump_I.fLpfValue, AlarmOperValue[(Uint16)IDX_FAULT_DCU_COOLANT_PUMP_OC].uiCheckTime, ALARM_OVER_CHECK));
CUpdateFault(&ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN1_OC, CAlarmCheck(IDX_FAULT_DCU_FAN1_OC, Adc_Fan1_I.fLpfValue, AlarmOperValue[(Uint16)IDX_FAULT_DCU_FAN1_OC].uiCheckTime, ALARM_OVER_CHECK));
CUpdateFault(&ulDcuTotalAlarm, (Uint16)IDX_FAULT_DCU_FAN2_OC, CAlarmCheck(IDX_FAULT_DCU_FAN2_OC, Adc_Fan2_I.fLpfValue, AlarmOperValue[(Uint16)IDX_FAULT_DCU_FAN2_OC].uiCheckTime, ALARM_OVER_CHECK));
#endif
/* 개별 전압 알람 체크 */
/* Engine Heater */
if (ENGINE_HEATER_OUT() == 1U)
@@ -381,7 +381,11 @@ void CAlarmProcedure(void)
if (GeneralOperValue.uiAlarmReset == 1U)
{
CInitAlarmOperValue();
ulDcuTotalAlarm = 0UL; /* 전체 비트 클리어 */
/* 전체 비트 클리어 */
ulDcuTotalAlarm = 0UL;
ulGcuTotalAlarm = 0UL;
ulEcuTotalAlarm = 0UL;
if (CSoftWaitCountProcedure(SOFTTIMER_WAIT_ALARM_RESET, TIME_1SEC) == (Uint16)TIME_OVER)
{
@@ -927,7 +931,7 @@ static void CProcessArrowUpFocusChange(void)
}
else
{
CMoveFocusLine(3U, DIR_UP);
CMoveFocusLine(2U, DIR_UP);
}
}
}
@@ -999,13 +1003,13 @@ static void CProcessArrowDownFocusChange(void)
{
if (OledOperValue.uiPageNum == (Uint16)IDX_OLED_PAGE_MAINTENANCE)
{
if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_3)
if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_2)
{
OledOperValue.uiFocusLine = (Uint16)IDX_OLED_LINE_FOCUS_3;
OledOperValue.uiFocusLine = (Uint16)IDX_OLED_LINE_FOCUS_2;
}
else
{
CMoveFocusLine(3U, DIR_DOWN);
CMoveFocusLine(2U, DIR_DOWN);
}
}
}
@@ -1158,16 +1162,12 @@ static void CProcessEnterPassword(void)
static void CProcessEnterMaintenance(void)
{
if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_1)
{
GeneralOperValue.Maintenance.ManualCranking = (GeneralOperValue.Maintenance.ManualCranking == 1U) ? 0U : 1U;
}
else if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_2)
{
GeneralOperValue.Maintenance.LampTest = (GeneralOperValue.Maintenance.LampTest == 1U) ? 0U : 1U;
}
else
{
if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_3)
if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_2)
{
GeneralOperValue.Maintenance.KeyTest = (GeneralOperValue.Maintenance.KeyTest == 1U) ? 0U : 1U;
OledOperValue.uiPageNum = (Uint16)IDX_OLED_PAGE_KEY_TEST;
@@ -1294,3 +1294,10 @@ static void CKeyBattleModeProcess(void)
{
KeyOperValue.KeyList.BattleMode = KeyOperValue.KeyList.BattleMode ^ 1U;
}
static inline Uint16 CIsBitSet(Uint32 value, Uint16 bitNumber)
{
Uint32 ulMask = 1UL << (Uint32)bitNumber;
return (((value & ulMask) != 0UL) ? 1U : 0U);
}

11
main.c
View File

@@ -125,7 +125,7 @@ int main(void)
}
else
{
CDebugModeProcedure();
CMaintenanceProcedure();
}
}
}
@@ -659,15 +659,6 @@ void CUpdateFault(Uint32 *pData, Uint16 uiIdx, Uint16 uiCond)
}
}
Uint16 CIsBitSet(Uint32 ulData, Uint16 uiIdx)
{
Uint32 ulMask;
ulMask = 1UL << (Uint32)uiIdx;
return (((ulData & ulMask) != 0UL) ? 1U : 0U);
}
void DELAY_USEC(Uint32 ulMicroSeconds)
{
Uint32 ulDelayCount;

11
main.h
View File

@@ -73,7 +73,7 @@
/* Firmware 버전 (Semantic Versioning) */
#define FIRMWARE_VERSION_MAJOR (0) // 하위버전과 호환 되지 않는 변화가 생길 때 증가, 대대적인 변화가 있을 때
#define FIRMWARE_VERSION_MINOR (1) // 하위버전과 호환 되면서 새로운 기능이 생길 때 증가, 기존 기능이 변경되거나 사용 방법이 변경 될 때
#define FIRMWARE_VERSION_PATCH (9) // 하위버전과 호환 되면서 버그 수정, 기능적으로 변경된것을 알아차리지 못할 정도의 소소한 변경이 있을 때
#define FIRMWARE_VERSION_PATCH (11) // 하위버전과 호환 되면서 버그 수정, 기능적으로 변경된것을 알아차리지 못할 정도의 소소한 변경이 있을 때
/* Version History
* [0.0.1] : DCU 프로젝트 생성
@@ -86,6 +86,8 @@
* [0.1.7] : 발전상태 전환 조건 추가 26-02-23
* [0.1.8] : 장치 운용시간 로직 추가(Eeprom 사용), define USE_EEPROM 26-03-16 <삭제>
* [0.1.9] : IPS 회로 변경으로 전압센싱 추가 및 고장 알람 비트 추가, CAN-A 채널 송신 데이터 추가 26-03-26
* [0.1.10] : 외부 CAN 적용 26-04-08
* [0.1.11] : ECU의 idle 상태와 operating 상태에 따른 시퀀스 수정 26-04-15
*/
#define MAINTENECE_PASSKEY {0,0,0,0}
@@ -211,8 +213,9 @@ typedef struct ClassGeneralOperValue
Uint16 uiRetryCrankingCount;
Uint16 uiWriteEepromDataStart;
Uint32 ulTotalOperationHour;
Uint32 ulRampStartClock; // IDLE_SEQ_MOD
Uint16 uiRampComplete; // IDLE_SEQ_MOD
Uint32 ulRampStartClock;
Uint16 uiRampComplete;
Uint16 uiRampStartRpm;
struct
{
Uint16 PlayCmd;
@@ -233,7 +236,6 @@ typedef struct ClassGeneralOperValue
} Conection;
struct
{
Uint16 ManualCranking;
Uint16 LampTest;
Uint16 KeyTest;
} Maintenance;
@@ -248,7 +250,6 @@ void CSoftWaitCountClear(Uint16 Index);
Uint32 CGetSoftClock(void);
void CUpdateFault(Uint32 *pData, Uint16 uiIdx, Uint16 uiCond);
void DELAY_USEC(Uint32 ulMicroSeconds);
Uint16 CIsBitSet(Uint32 ulData, Uint16 uiIdx);
void CSetAuxCtrlPin(E_AUX_CS_IDX eIdx, Uint16 uiState);
#endif /* SOURCE_MAIN_H_ */