Engine idle, Generating 시퀀스 수정
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.vscode/settings.json
|
||||
.gitignore
|
||||
161
Comm.c
161
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;
|
||||
}
|
||||
|
||||
242
Display.c
242
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;
|
||||
|
||||
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
76
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,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
2
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);
|
||||
|
||||
41
State.c
41
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);
|
||||
}
|
||||
|
||||
11
main.c
11
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;
|
||||
|
||||
11
main.h
11
main.h
@@ -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_ */
|
||||
|
||||
Reference in New Issue
Block a user