diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3c73a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/settings.json +.gitignore \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index b1f27e8..0000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "configurations": [ - { - "name": "Win32", - "includePath": [ - "${workspaceFolder}/**" - ], - "defines": [ - "_DEBUG", - "UNICODE", - "_UNICODE" - ] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/Comm.c b/Comm.c index e4c2839..552c2d6 100644 --- a/Comm.c +++ b/Comm.c @@ -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; } diff --git a/Display.c b/Display.c index 8f9a561..cc50845 100644 --- a/Display.c +++ b/Display.c @@ -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; - CCopyStr(OledOperValue.cStrBuff[IDX_OLED_ROW_0], title); - CDrawStr(10U, (Uint16)IDX_OLED_LINE_TITLE, OledOperValue.cStrBuff[IDX_OLED_ROW_0]); - if (title != NULL) { - while ((title[uiTitleLen] != ASCII_NULL) && (uiTitleLen < (Uint16)TXT_MAX_LEN)) + CCopyStr(OledOperValue.cStrBuff[IDX_OLED_ROW_0], title); + CDrawStr(10U, (Uint16)IDX_OLED_LINE_TITLE, OledOperValue.cStrBuff[IDX_OLED_ROW_0]); + + for (uiTitleLen = 0U; uiTitleLen < (Uint16)TXT_MAX_LEN; uiTitleLen++) { - uiTitleLen++; + if (OledOperValue.cStrBuff[IDX_OLED_ROW_0][uiTitleLen] == ASCII_NULL) + { + 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++; - x += (TXT_ENG_WIDTH * 2U); + + 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; - pTarget[i] = ASCII_NULL; + while ((i < (Uint16)(TXT_MAX_LEN - 1U)) && (i < uiSafeLimit) && (*pCurSource != ASCII_NULL)) + { + *pCurTarget = *pCurSource; + + pCurTarget++; + pCurSource++; + i++; + } + + *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++) + if (uiTargetSize < (Uint16)(TXT_MAX_LEN - 1U)) { - pTarget[uiTargetSize + i] = pSource[i]; - } + uiRemainSpace = (Uint16)((Uint16)(TXT_MAX_LEN - 1U) - uiTargetSize); + uiSafeLimit = (Size >= uiRemainSpace) ? uiRemainSpace : Size; - pTarget[uiTargetSize + i] = ASCII_NULL; + while ((i < uiSafeLimit) && (uiTargetSize < (Uint16)(TXT_MAX_LEN - 1U)) && (pSource[i] != ASCII_NULL)) + { + *pCurTarget = pSource[i]; + + pCurTarget++; + uiTargetSize++; + i++; + } + + *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 보호 { - startIdx = 6U - len; - - for (i = 0U; i < len; i++) + if (len > 0U) { - Array[startIdx + i] = cTmp[len - 1U - i]; // cTmp는 역순이므로 len-1-i 로 접근 + Uint16 uiReadIdx = len; /* cTmp 배열을 역순으로 읽기 위한 전용 인덱스 */ + startIdx = 6U - len; + + for (i = 0U; i < len; 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); +} diff --git a/Oper.c b/Oper.c index dd67862..ac317a4 100644 --- a/Oper.c +++ b/Oper.c @@ -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,27 +146,29 @@ 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; + 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 { - GeneralOperValue.uiRampComplete = 1U; - GeneralOperValue.uiDynamicRPM = CDynamicRpmControl(); + GeneralOperValue.uiRampComplete = 1U; + GeneralOperValue.uiDynamicRPM = CDynamicRpmControl(); CSetEngineActualRpm(GeneralOperValue.uiDynamicRPM); } } } -#endif } static void CProcessApuStateCooldown(void) @@ -292,49 +270,53 @@ 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: { - case (Uint16)IDX_APU_OPER_READY: - { - CProcessApuStateReady(); - break; - } - case (Uint16)IDX_APU_OPER_PREHEAT: - { - CProcessApuStatePreheat(); - break; - } - case (Uint16)IDX_APU_OPER_CRANKING: - { - CProcessApuStateCranking(); - break; - } - case (Uint16)IDX_APU_OPER_RETRY_CRANKING: - { - CProcessApuStateRetryCranking(); - break; - } - case (Uint16)IDX_APU_OPER_ENGINE_IDLE: - { - CProcessApuStateEngineIdle(); - break; - } - case (Uint16)IDX_APU_OPER_GENERATING: - { - CProcessApuStateGenerating(); - break; - } - case (Uint16)IDX_APU_OPER_COOLDOWN: - { - CProcessApuStateCooldown(); - break; - } - default: - { - CProcessApuStateStopping(); - break; - } + CProcessApuStateReady(); + break; + } + case (Uint16)IDX_APU_OPER_PREHEAT: + { + CProcessApuStatePreheat(); + break; + } + case (Uint16)IDX_APU_OPER_CRANKING: + { + CProcessApuStateCranking(); + break; + } + case (Uint16)IDX_APU_OPER_RETRY_CRANKING: + { + CProcessApuStateRetryCranking(); + break; + } + case (Uint16)IDX_APU_OPER_ENGINE_IDLE: + { + CProcessApuStateEngineIdle(); + break; + } + case (Uint16)IDX_APU_OPER_GENERATING: + { + CProcessApuStateGenerating(); + break; + } + case (Uint16)IDX_APU_OPER_COOLDOWN: + { + CProcessApuStateCooldown(); + break; + } + default: + { + CProcessApuStateStopping(); + break; } } } @@ -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); diff --git a/Oper.h b/Oper.h index 249ad5b..ffbb7d6 100644 --- a/Oper.h +++ b/Oper.h @@ -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); diff --git a/State.c b/State.c index b4627d6..932b5f1 100644 --- a/State.c +++ b/State.c @@ -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); +} diff --git a/main.c b/main.c index 80e80f2..d3c2676 100644 --- a/main.c +++ b/main.c @@ -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; diff --git a/main.h b/main.h index 4e4edfd..7bf5ee1 100644 --- a/main.h +++ b/main.h @@ -71,21 +71,22 @@ */ /* Firmware 버전 (Semantic Versioning) */ -#define FIRMWARE_VERSION_MAJOR (0) // 하위버전과 호환 되지 않는 변화가 생길 때 증가, 대대적인 변화가 있을 때 -#define FIRMWARE_VERSION_MINOR (1) // 하위버전과 호환 되면서 새로운 기능이 생길 때 증가, 기존 기능이 변경되거나 사용 방법이 변경 될 때 -#define FIRMWARE_VERSION_PATCH (9) // 하위버전과 호환 되면서 버그 수정, 기능적으로 변경된것을 알아차리지 못할 정도의 소소한 변경이 있을 때 +#define FIRMWARE_VERSION_MAJOR (0) // 하위버전과 호환 되지 않는 변화가 생길 때 증가, 대대적인 변화가 있을 때 +#define FIRMWARE_VERSION_MINOR (1) // 하위버전과 호환 되면서 새로운 기능이 생길 때 증가, 기존 기능이 변경되거나 사용 방법이 변경 될 때 +#define FIRMWARE_VERSION_PATCH (10) // 하위버전과 호환 되면서 버그 수정, 기능적으로 변경된것을 알아차리지 못할 정도의 소소한 변경이 있을 때 /* Version History - * [0.0.1] : DCU 프로젝트 생성 - * [0.0.2] : DCU 펌웨어 탑재 성공 - * [0.0.3] : OLED XINTF(BUS) 방식 드라이브단 구현 - * [0.0.4] : OLED 표시 화면 구현 - * [0.0.5] : CAN-B 확인 및 맵핑 - * [0.0.6] : 시동 시퀀스 구현 및 정비 화면 수정 - * [0.1.6] : Suter 보조엔진 시동 완료 시점 - * [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.0.1] : DCU 프로젝트 생성 + * [0.0.2] : DCU 펌웨어 탑재 성공 + * [0.0.3] : OLED XINTF(BUS) 방식 드라이브단 구현 + * [0.0.4] : OLED 표시 화면 구현 + * [0.0.5] : CAN-B 확인 및 맵핑 + * [0.0.6] : 시동 시퀀스 구현 및 정비 화면 수정 + * [0.1.6] : Suter 보조엔진 시동 완료 시점 + * [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 적용 */ #define MAINTENECE_PASSKEY {0,0,0,0} @@ -211,8 +212,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 +235,6 @@ typedef struct ClassGeneralOperValue } Conection; struct { - Uint16 ManualCranking; Uint16 LampTest; Uint16 KeyTest; } Maintenance; @@ -248,7 +249,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_ */