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

268
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;
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);
}