Engine idle, Generating 시퀀스 수정

This commit is contained in:
2026-04-15 09:40:00 +09:00
parent ac74d913e9
commit 8dd7ba8bbd
9 changed files with 302 additions and 393 deletions

2
.gitignore vendored Normal file
View File

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

View File

@@ -1,16 +0,0 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
]
}
],
"version": 4
}

161
Comm.c
View File

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

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 CDrawStatusTitle(const int8* title, const int8* pageNumStr);
static void CDrawSensorTitle(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 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 (전역 변수 및 구조체 초기화) */ /* 5. Global Variables & Structure Initialization (전역 변수 및 구조체 초기화) */
@@ -101,16 +103,20 @@ static void CDrawPageTitle(const int8* title, const int8* pageNumStr)
{ {
Uint16 uiTitleLen = 0U; 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) 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); CDrawTitleBox(uiTitleLen * 6U);
if (pageNumStr != NULL) if (pageNumStr != NULL)
@@ -246,7 +252,7 @@ static void CDrawPageLineTwoFloat(Uint16 row, const int8* label, float32 value1,
finalBuf[j] = ASCII_NULL; /* '\0' */ 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) 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 // Status 2
CStrncat(OledOperValue.cStrBuff[row], statusStr2, CStrLen(statusStr2)); 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) static void CPageApu1(void)
@@ -350,7 +356,7 @@ static void CPageApu1(void)
CStrncat(OledOperValue.cStrBuff[IDX_OLED_ROW_4], cTemp, CStrLen(cTemp)); 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; uiDummyRun = (uiDummyRun == 1U) ? 0U : uiDummyRun;
} }
@@ -542,16 +548,16 @@ static void CPageWarning1(void)
CDrawPageTitle("Warning", "1/2"); CDrawPageTitle("Warning", "1/2");
// LINE 1 // 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 // 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 // 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 // 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) static void CPageWarning2(void)
@@ -560,10 +566,10 @@ static void CPageWarning2(void)
CDrawPageTitle("Warning", "2/2"); CDrawPageTitle("Warning", "2/2");
/* LINE 1 */ /* 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 */ /* 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) static void CPageFault1(void)
@@ -572,16 +578,16 @@ static void CPageFault1(void)
CDrawFaultTitle("APU Fault", "1/7"); CDrawFaultTitle("APU Fault", "1/7");
// LINE 1 // 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 // 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 // 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 // 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) static void CPageFault2(void)
@@ -590,16 +596,16 @@ static void CPageFault2(void)
CDrawFaultTitle("APU Fault", "2/7"); CDrawFaultTitle("APU Fault", "2/7");
// LINE 1 // 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 // 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 // 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 // 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) static void CPageFault3(void)
@@ -608,16 +614,16 @@ static void CPageFault3(void)
CDrawFaultTitle("APU Fault", "3/7"); CDrawFaultTitle("APU Fault", "3/7");
// LINE 1 // 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 // 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 // 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 // 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) static void CPageFault4(void)
@@ -626,7 +632,7 @@ static void CPageFault4(void)
CDrawFaultTitle((const int8*)"APU Fault", (const int8*)"4/7"); CDrawFaultTitle((const int8*)"APU Fault", (const int8*)"4/7");
/* LINE 1: */ /* 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) static void CPageFault5(void)
@@ -635,16 +641,16 @@ static void CPageFault5(void)
CDrawFaultTitle("GCU Fault", "5/7"); CDrawFaultTitle("GCU Fault", "5/7");
// LINE 1 // 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 // 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 // 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 // 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) static void CPageFault6(void)
@@ -653,16 +659,16 @@ static void CPageFault6(void)
CDrawFaultTitle("GCU Fault", "6/7"); CDrawFaultTitle("GCU Fault", "6/7");
// LINE 1 // 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 // 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 // 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 // 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) static void CPageFault7(void)
@@ -671,13 +677,13 @@ static void CPageFault7(void)
CDrawFaultTitle("ECU Fault", "7/7"); CDrawFaultTitle("ECU Fault", "7/7");
// LINE 1 // 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 // 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 // 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) static void CDrawAlarmBox(void)
@@ -730,7 +736,7 @@ static void CDrawPostStatusLine(Uint16 row, const int8* l1, Uint16 s1, const int
} }
else else
{ {
CTextAlign(OledOperValue.cAlignBuffer, OledOperValue.cStrBuff[row]); CTextAlign(OledOperValue.cAlignBuffer, (const int8*)OledOperValue.cStrBuff[row]);
pPrintStr = OledOperValue.cAlignBuffer; pPrintStr = OledOperValue.cAlignBuffer;
} }
@@ -835,17 +841,12 @@ static void CPageMaintenance(void)
// LINE 1 // LINE 1
CLineFocus((OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_1) ? 1U : 0U); CLineFocus((OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_1) ? 1U : 0U);
cTemp = (GeneralOperValue.Maintenance.ManualCranking > 0U) ? (int8*)"ON " : (int8*)"OFF"; cTemp = (GeneralOperValue.Maintenance.LampTest > 0U) ? (int8*)"ON " : (int8*)"OFF";
CDrawPageLine(IDX_OLED_ROW_1, "Manual Cranking ", cTemp, NULL); CDrawPageLine(IDX_OLED_ROW_1, "Lamp Test ", cTemp, NULL);
// LINE 2 // LINE 2
CLineFocus((OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_2) ? 1U : 0U); 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, "Switch Test ", NULL, NULL);
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);
} }
static void CPageVersion(void) static void CPageVersion(void)
@@ -859,21 +860,21 @@ static void CPageVersion(void)
// LINE 2 // LINE 2
CMakeVersionString(cTemp, (int16)FIRMWARE_VERSION_MAJOR, (int16)FIRMWARE_VERSION_MINOR, (int16)FIRMWARE_VERSION_PATCH); 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 // LINE 3
CMakeVersionString(cTemp, (int16)Rx200.VersionMajor, (int16)Rx200.VersionMinor, (int16)Rx200.VersionPatch); 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 // LINE 4
CMakeVersionString(cTemp, (int16)Rx300.VersionMajor, (int16)Rx300.VersionMinor, (int16)Rx300.VersionPatch); 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) static void CDrawCenteredLine(Uint16 y, const int8* text)
{ {
CStrncpy(OledOperValue.cStrBuff[IDX_OLED_ROW_0], text, CStrLen(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); 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) static void CPageKeyTest(void)
@@ -1074,21 +1075,21 @@ static void CInitProgress(void)
{ {
OledOperValue.Color.TxtColor = 1U; 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); 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); 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); (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); CDrawStr(0, (Uint16)IDX_OLED_LINE_2, OledOperValue.cAlignBuffer);
} }
static void CAddLineIndent(int8 *buffer, const int8 *str) static void CAddLineIndent(int8 *buffer, const int8 *str)
{ {
Uint16 i; 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) if (uiSpaceNeeded > 0U)
{ {
@@ -1171,7 +1172,7 @@ static void CDrawLine(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2)
int16 err = 0; int16 err = 0;
int16 ystep = 0; int16 ystep = 0;
dx = uiX2 - uiX1; dx = (uiX1 > uiX2) ? (uiX1 - uiX2) : (uiX2 - uiX1);
dy = (uiY1 > uiY2) ? (uiY1 - uiY2) : (uiY2 - uiY1); dy = (uiY1 > uiY2) ? (uiY1 - uiY2) : (uiY2 - uiY1);
if (dy > dx) if (dy > dx)
@@ -1322,23 +1323,35 @@ void CInitXintf(void)
static void CDrawStr(Uint16 x, Uint16 y, const int8* str) static void CDrawStr(Uint16 x, Uint16 y, const int8* str)
{ {
Uint16 i = 0U; Uint16 i = 0U;
Uint16 uiHighByte = 0U; /* 2바이트 문자 조합용 임시 변수 */
Uint16 uiLowByte = 0U;
if (str != NULL) if (str != NULL)
{ {
/* 널 문자를 만나거나 최대 한계에 도달할 때까지 그리기 수행 */ while ((i < (Uint16)TXT_MAX_LEN) && (str[i] != ASCII_NULL))
while ((str[i] != ASCII_NULL) && (i < (Uint16)TXT_MAX_LEN))
{ {
if (((Uint8)str[i] & 0x80U) != 0U) 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++; 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 else
{ {
CDrawChar(x, y, (Uint16)str[i], TXT_TYPE_ENG); CDrawChar(x, y, (Uint16)str[i], TXT_TYPE_ENG);
x += TXT_ENG_WIDTH; x += TXT_ENG_WIDTH;
} }
i++; i++;
} }
} }
@@ -1505,50 +1518,62 @@ static Uint16 CStrLen(const int8 *s)
} }
static void CStrncpy(int8 *pTarget, const int8 *pSource, Uint16 Size) static void CStrncpy(int8 *pTarget, const int8 *pSource, Uint16 Size)
{ {
Uint16 i; Uint16 i = 0U;
Uint16 uiSafeLimit; 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++) if ((pTarget != NULL) && (pSource != NULL))
for (i = 0U; (i < uiSafeLimit) && (i < (TXT_MAX_LEN - 1U)); i++)
{ {
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) static void CStrncat(int8 *pTarget, const int8 *pSource, Uint16 Size)
{ {
Uint16 i; Uint16 i = 0U; /* pSource를 읽을 인덱스 */
Uint16 uiTargetSize; Uint16 uiTargetSize = 0U;
Uint16 uiRemainSpace; Uint16 uiRemainSpace;
Uint16 uiSafeLimit; Uint16 uiSafeLimit;
uiTargetSize = 0U; int8 *pCurTarget = pTarget;
if (pTarget != NULL) if ((pTarget != NULL) && (pSource != NULL))
{ {
/* 함수를 부르지 않고, 해당 위치에서 직접 널 문자를 찾을 때까지 카운트 (FUNCR 증가 없음) */ while ((uiTargetSize < (Uint16)TXT_MAX_LEN) && (*pCurTarget != ASCII_NULL))
while (pTarget[uiTargetSize] != ASCII_NULL)
{ {
uiTargetSize++; uiTargetSize++;
pCurTarget++; /* 포인터 주소를 1바이트씩 직접 전진 */
} }
}
if (uiTargetSize < (Uint16)(TXT_MAX_LEN - 1U)) 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++)
{ {
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 x = 0U; // cTmp에 추출된 숫자의 개수 (자릿수 카운트)
Uint16 y = 0U; // 최종 문자열 Array에 값을 써넣을 인덱스 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 }; int8 cTmp[6] = { ASCII_NULL, ASCII_NULL, ASCII_NULL, ASCII_NULL, ASCII_NULL, ASCII_NULL };
// 출력할 배열 전체를 공백(ASCII 32 = ' ')으로 초기화 for (i = 0U; (i < uiSafeLen) && (i < (Uint16)TXT_MAX_LEN); i++)
for (i = 0U; (i < ArrayLen) && (i < TXT_MAX_LEN); i++)
{ {
Array[i] = ASCII_BLANK; Array[i] = ASCII_BLANK;
} }
@@ -1589,9 +1613,8 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
// 추출한 숫자를 최종 배열에 배치 (우측 정렬 적용) // 추출한 숫자를 최종 배열에 배치 (우측 정렬 적용)
if (x == 0U) if (x == 0U)
{ {
// 수치가 0인 경우, 지정된 고정 위치(y=3)에 '0' 표시
y = 4U; y = 4U;
if (y < ArrayLen) if (y < uiSafeLen)
{ {
Array[y] = ASCII_0; Array[y] = ASCII_0;
y++; y++;
@@ -1601,14 +1624,11 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
{ {
if (x > 0U) if (x > 0U)
{ {
// 앞서 '* 10'으로 부풀리며 추가되었던 최하위 숫자(0)를 버리기 위해 인덱스를 1 감소시킴
x = (Uint16)(x - 1U); x = (Uint16)(x - 1U);
} }
// 전체 폭(5칸 기준)에서 자릿수를 빼서, 문자가 쓰이기 시작할 시작 위치(y) 계산
y = (x <= 5U) ? (Uint16)(5U - x) : 0U; y = (x <= 5U) ? (Uint16)(5U - x) : 0U;
// 부호('-')가 들어갈 자리 지정 (숫자가 시작되는 곳의 바로 앞 칸)
if (y < 1U) if (y < 1U)
{ {
uiSignLocate = 0U; uiSignLocate = 0U;
@@ -1622,23 +1642,22 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
uiSignLocate = 0U; uiSignLocate = 0U;
} }
// 계산된 부호 위치에 '-' 또는 공백 삽입
if (uiSign == 1U) if (uiSign == 1U)
{ {
if ((uiSignLocate > 0U) && (uiSignLocate < 6U) && (uiSignLocate < ArrayLen)) if ((uiSignLocate > 0U) && (uiSignLocate < 6U) && (uiSignLocate < uiSafeLen))
{ {
Array[uiSignLocate] = ASCII_MINUS; // '-' Array[uiSignLocate] = ASCII_MINUS; // '-'
} }
} }
else else
{ {
if (uiSignLocate < ArrayLen) if (uiSignLocate < uiSafeLen)
{ {
Array[uiSignLocate] = ASCII_BLANK; // ' ' 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]; Array[y] = cTmp[x];
y++; y++;
@@ -1646,23 +1665,29 @@ static void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
} }
} }
// 문자열의 끝을 알리는 널(NULL, ASCII 0) 문자 삽입하여 문자열 완성 if (y < uiSafeLen)
if ((y < ArrayLen) && (y < TXT_MAX_LEN))
{ {
Array[y] = ASCII_NULL; Array[y] = ASCII_NULL;
} }
else 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) static void CFloatToString(float32 Data, int8 *Array, Uint16 ArrayLen)
{ {
int32 iTemp; // 음수 처리를 위해 signed int32 사용 (범위 확보) float32 fData = Data;
int32 iTemp; // 음수 처리
Uint16 isNegative = 0U; // 음수 여부 플래그 Uint16 isNegative = 0U; // 음수 여부 플래그
int8 cTmp[10]; // 임시 변환 버퍼 int8 cTmp[10]; // 임시 변환 버퍼
Uint16 len = 0U; // 현재 변환된 문자 길이 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; isNegative = 1U;
Data = -Data; // 절대값으로 변환 fData = -fData; // 절대값으로 변환
} }
// 소수점 1자리 정수로 변환 (예: 12.34 -> 123.4 -> 123) // 소수점 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' 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자리를 넘으면 6자리로 자름
if (len > 6U)
{
len = 6U;
}
if (ArrayLen >= 7U) // ArrayLen 보호 if (ArrayLen >= 7U) // ArrayLen 보호
{ {
startIdx = 6U - len; if (len > 0U)
for (i = 0U; i < len; i++)
{ {
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; Array[6] = ASCII_NULL;
@@ -1977,3 +2001,17 @@ static void CDrawFaultTitle(const int8* title, const int8* pageNumStr)
{ {
CDrawPageTitle(title, 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);
}

160
Oper.c
View File

@@ -10,10 +10,7 @@
#define ENGINE_OPERATION_SPEED (2400U) #define ENGINE_OPERATION_SPEED (2400U)
#define ENGINE_DIFF_SPEED (400U) // 2800 - 2400 #define ENGINE_DIFF_SPEED (400U) // 2800 - 2400
// IDLE_SEQ_MOD
#define RPM_RAMP_START (1500U)
#define RPM_RAMP_END (2400U) #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 TIME_RAMP_UP (TIME_1SEC * 3UL) // 3초
#define LED_OFF (0U) #define LED_OFF (0U)
@@ -39,6 +36,7 @@ static void CProcessApuStateGenerating(void);
static void CProcessApuStateCooldown(void); static void CProcessApuStateCooldown(void);
static void CProcessApuStateStopping(void); static void CProcessApuStateStopping(void);
static void CProcessApuStateTransition(void); // 비상/시동/정지 전이 판별용 static void CProcessApuStateTransition(void); // 비상/시동/정지 전이 판별용
static void CExecuteApuState(Uint16 uiState);
static void CSetEngineActualRpm(Uint16 Rpm); static void CSetEngineActualRpm(Uint16 Rpm);
static float32 CGetGcuLoadPower(void); static float32 CGetGcuLoadPower(void);
static Uint16 CDynamicRpmControl(void); static Uint16 CDynamicRpmControl(void);
@@ -123,40 +121,18 @@ static void CProcessApuStateRetryCranking(void)
static void CProcessApuStateEngineIdle(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) if (((Rx301.State >> 1U) & 0x07U) == (Uint16)IDX_ECU_STAT_OPERATION)
{ {
// ECU OPERATION 확인 즉시 발전 상태로 전환 (RPM Ramp는 CProcessApuStateGenerating에서 수행) // ECU OPERATION 확인 즉시 발전 상태로 전환 (RPM Ramp는 CProcessApuStateGenerating에서 수행)
GeneralOperValue.ulRampStartClock = 0UL; GeneralOperValue.ulRampStartClock = 0UL;
GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING; GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING;
} }
#endif
} }
static void CProcessApuStateGenerating(void) 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; Uint32 ulElapsed;
Uint16 uiRampRange;
Uint16 uiRampRpm; Uint16 uiRampRpm;
CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING); CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING);
@@ -170,27 +146,29 @@ static void CProcessApuStateGenerating(void)
{ {
if (GeneralOperValue.ulRampStartClock == 0UL) if (GeneralOperValue.ulRampStartClock == 0UL)
{ {
Uint16 uiActual = CGetEngineActualRpm();
GeneralOperValue.uiRampStartRpm = (uiActual < RPM_RAMP_END) ? uiActual : RPM_RAMP_END;
GeneralOperValue.ulRampStartClock = CGetSoftClock(); GeneralOperValue.ulRampStartClock = CGetSoftClock();
CSetEngineActualRpm(RPM_RAMP_START); CSetEngineActualRpm(GeneralOperValue.uiRampStartRpm);
} }
else 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) 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); CSetEngineActualRpm(uiRampRpm);
} }
else else
{ {
GeneralOperValue.uiRampComplete = 1U; GeneralOperValue.uiRampComplete = 1U;
GeneralOperValue.uiDynamicRPM = CDynamicRpmControl(); GeneralOperValue.uiDynamicRPM = CDynamicRpmControl();
CSetEngineActualRpm(GeneralOperValue.uiDynamicRPM); CSetEngineActualRpm(GeneralOperValue.uiDynamicRPM);
} }
} }
} }
#endif
} }
static void CProcessApuStateCooldown(void) static void CProcessApuStateCooldown(void)
@@ -292,49 +270,53 @@ void CApuOperProcedure(void)
CSetAuxCtrlPin(IDX_CS_FUEL_PUMP, FuelPumpSig); CSetAuxCtrlPin(IDX_CS_FUEL_PUMP, FuelPumpSig);
} }
// 각 상태별 동작 수행 CExecuteApuState(GeneralOperValue.uiApuState);
switch (GeneralOperValue.uiApuState) }
}
static void CExecuteApuState(Uint16 uiState)
{
switch (uiState)
{
case (Uint16)IDX_APU_OPER_READY:
{ {
case (Uint16)IDX_APU_OPER_READY: CProcessApuStateReady();
{ break;
CProcessApuStateReady(); }
break; case (Uint16)IDX_APU_OPER_PREHEAT:
} {
case (Uint16)IDX_APU_OPER_PREHEAT: CProcessApuStatePreheat();
{ break;
CProcessApuStatePreheat(); }
break; case (Uint16)IDX_APU_OPER_CRANKING:
} {
case (Uint16)IDX_APU_OPER_CRANKING: CProcessApuStateCranking();
{ break;
CProcessApuStateCranking(); }
break; case (Uint16)IDX_APU_OPER_RETRY_CRANKING:
} {
case (Uint16)IDX_APU_OPER_RETRY_CRANKING: CProcessApuStateRetryCranking();
{ break;
CProcessApuStateRetryCranking(); }
break; case (Uint16)IDX_APU_OPER_ENGINE_IDLE:
} {
case (Uint16)IDX_APU_OPER_ENGINE_IDLE: CProcessApuStateEngineIdle();
{ break;
CProcessApuStateEngineIdle(); }
break; case (Uint16)IDX_APU_OPER_GENERATING:
} {
case (Uint16)IDX_APU_OPER_GENERATING: CProcessApuStateGenerating();
{ break;
CProcessApuStateGenerating(); }
break; case (Uint16)IDX_APU_OPER_COOLDOWN:
} {
case (Uint16)IDX_APU_OPER_COOLDOWN: CProcessApuStateCooldown();
{ break;
CProcessApuStateCooldown(); }
break; default:
} {
default: CProcessApuStateStopping();
{ break;
CProcessApuStateStopping();
break;
}
} }
} }
} }
@@ -384,10 +366,6 @@ static void CInitialStandby(void)
GeneralOperValue.uiEmergency = 0U; GeneralOperValue.uiEmergency = 0U;
GeneralOperValue.ulRampStartClock = 0UL; // IDLE_SEQ_MOD
GeneralOperValue.uiRampComplete = 0U; // IDLE_SEQ_MOD
GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1U; // GPIO_FAULT_CMD GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1U; // GPIO_FAULT_CMD
} }
@@ -409,10 +387,6 @@ static void CEmergencyStop(void)
GeneralOperValue.uiEmergency = 1U; GeneralOperValue.uiEmergency = 1U;
GeneralOperValue.ulRampStartClock = 0UL; // IDLE_SEQ_MOD
GeneralOperValue.uiRampComplete = 0U; // IDLE_SEQ_MOD
GpioDataRegs.GPBSET.bit.GPIO55 = 1U; //GPIO_FAULT_CMD GpioDataRegs.GPBSET.bit.GPIO55 = 1U; //GPIO_FAULT_CMD
} }
@@ -468,12 +442,7 @@ void CSetEcuCommand(Uint16 Command)
// [ECU_OPER_CMD_START] // [ECU_OPER_CMD_START]
GeneralOperValue.EcuCommand.EngineStart = 1U; GeneralOperValue.EcuCommand.EngineStart = 1U;
GeneralOperValue.EcuCommand.EngineStop = 0U; GeneralOperValue.EcuCommand.EngineStop = 0U;
#if 0 // RPM 테스트 CSetEngineActualRpm(1200U);
CSetEngineActualRpm(Rx400.SetRPM.PCAN_RPM);
#else
//CSetEngineActualRpm(2400U);
CSetEngineActualRpm(1500U); // Target Idle
#endif
} }
} }
@@ -482,21 +451,8 @@ int16 CGetEngCoolantTemperature(void)
return (int16) Rx321.CoolantTemperature - 40; // 온도 오프셋 -40도 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) if (GeneralOperValue.Maintenance.LampTest == 1U)
{ {
CLedControl(0U, 1U); CLedControl(0U, 1U);

2
Oper.h
View File

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

41
State.c
View File

@@ -48,6 +48,7 @@ static void CKeyCheck(Uint32 ulChangeKey, Uint32 ulKeyRead);
static void CMoveFocusLine(Uint16 maxLines, Uint16 direction); static void CMoveFocusLine(Uint16 maxLines, Uint16 direction);
static void CChangePasswordDigit(Uint16 direction); static void CChangePasswordDigit(Uint16 direction);
static inline void CCalcAdcSum(CAdcCalcValue *AdcBuff); static inline void CCalcAdcSum(CAdcCalcValue *AdcBuff);
static inline Uint16 CIsBitSet(Uint32 value, Uint16 bitNumber);
/* ========================================================================= */ /* ========================================================================= */
/* 5. Global Variables & Structure Initialization (전역 변수 및 구조체 초기화) */ /* 5. Global Variables & Structure Initialization (전역 변수 및 구조체 초기화) */
@@ -168,6 +169,11 @@ void CDisplayAlarmPopup(void)
// WarningValue는 경고가 사라질수 있기 때문에 랫치 하지 않음 // WarningValue는 경고가 사라질수 있기 때문에 랫치 하지 않음
Uint32 WarningValue = (((Uint32)Rx210.GcuWarning & (Uint32)MASK_LOW_NIBBLE) | (((Uint32)Rx310.EcuWarning & 0xFDU) << 4U)); 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로 바뀐 비트만 추출 // 0 → 1로 바뀐 비트만 추출
Uint64 NewFault = FaultValue & (~PrevFaultValue); Uint64 NewFault = FaultValue & (~PrevFaultValue);
Uint32 NewWarning = WarningValue & (~PrevWarningValue); Uint32 NewWarning = WarningValue & (~PrevWarningValue);
@@ -176,11 +182,6 @@ void CDisplayAlarmPopup(void)
PrevFaultValue = FaultValue; PrevFaultValue = FaultValue;
PrevWarningValue = WarningValue; PrevWarningValue = WarningValue;
Uint16 i;
Uint16 UpdatePage = 0U; // 0: 유지, 1: Fault 이동, 2: Warning 이동
Uint64 TargetFault = 0U; // 검색할 대상 변수 (Fault)
Uint32 TargetWarning = 0U; // 검색할 대상 변수 (Warning)
if (NewFault > 0ULL) if (NewFault > 0ULL)
{ {
TargetFault = NewFault; // 새로 뜬 Fault만 검색 대상 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_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_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)); 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_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_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)); 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 */ /* Engine Heater */
if (ENGINE_HEATER_OUT() == 1U) if (ENGINE_HEATER_OUT() == 1U)
@@ -381,7 +381,11 @@ void CAlarmProcedure(void)
if (GeneralOperValue.uiAlarmReset == 1U) if (GeneralOperValue.uiAlarmReset == 1U)
{ {
CInitAlarmOperValue(); CInitAlarmOperValue();
ulDcuTotalAlarm = 0UL; /* 전체 비트 클리어 */
/* 전체 비트 클리어 */
ulDcuTotalAlarm = 0UL;
ulGcuTotalAlarm = 0UL;
ulEcuTotalAlarm = 0UL;
if (CSoftWaitCountProcedure(SOFTTIMER_WAIT_ALARM_RESET, TIME_1SEC) == (Uint16)TIME_OVER) if (CSoftWaitCountProcedure(SOFTTIMER_WAIT_ALARM_RESET, TIME_1SEC) == (Uint16)TIME_OVER)
{ {
@@ -927,7 +931,7 @@ static void CProcessArrowUpFocusChange(void)
} }
else 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.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 else
{ {
CMoveFocusLine(3U, DIR_DOWN); CMoveFocusLine(2U, DIR_DOWN);
} }
} }
} }
@@ -1158,16 +1162,12 @@ static void CProcessEnterPassword(void)
static void CProcessEnterMaintenance(void) static void CProcessEnterMaintenance(void)
{ {
if (OledOperValue.uiFocusLine == (Uint16)IDX_OLED_LINE_FOCUS_1) 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; GeneralOperValue.Maintenance.LampTest = (GeneralOperValue.Maintenance.LampTest == 1U) ? 0U : 1U;
} }
else 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; GeneralOperValue.Maintenance.KeyTest = (GeneralOperValue.Maintenance.KeyTest == 1U) ? 0U : 1U;
OledOperValue.uiPageNum = (Uint16)IDX_OLED_PAGE_KEY_TEST; OledOperValue.uiPageNum = (Uint16)IDX_OLED_PAGE_KEY_TEST;
@@ -1294,3 +1294,10 @@ static void CKeyBattleModeProcess(void)
{ {
KeyOperValue.KeyList.BattleMode = KeyOperValue.KeyList.BattleMode ^ 1U; KeyOperValue.KeyList.BattleMode = KeyOperValue.KeyList.BattleMode ^ 1U;
} }
static inline Uint16 CIsBitSet(Uint32 value, Uint16 bitNumber)
{
Uint32 ulMask = 1UL << (Uint32)bitNumber;
return (((value & ulMask) != 0UL) ? 1U : 0U);
}

11
main.c
View File

@@ -125,7 +125,7 @@ int main(void)
} }
else 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) void DELAY_USEC(Uint32 ulMicroSeconds)
{ {
Uint32 ulDelayCount; Uint32 ulDelayCount;

34
main.h
View File

@@ -71,21 +71,22 @@
*/ */
/* Firmware 버전 (Semantic Versioning) */ /* Firmware 버전 (Semantic Versioning) */
#define FIRMWARE_VERSION_MAJOR (0) // 하위버전과 호환 되지 않는 변화가 생길 때 증가, 대대적인 변화가 있을 때 #define FIRMWARE_VERSION_MAJOR (0) // 하위버전과 호환 되지 않는 변화가 생길 때 증가, 대대적인 변화가 있을 때
#define FIRMWARE_VERSION_MINOR (1) // 하위버전과 호환 되면서 새로운 기능이 생길 때 증가, 기존 기능이 변경되거나 사용 방법이 변경 될 때 #define FIRMWARE_VERSION_MINOR (1) // 하위버전과 호환 되면서 새로운 기능이 생길 때 증가, 기존 기능이 변경되거나 사용 방법이 변경 될 때
#define FIRMWARE_VERSION_PATCH (9) // 하위버전과 호환 되면서 버그 수정, 기능적으로 변경된것을 알아차리지 못할 정도의 소소한 변경이 있을 때 #define FIRMWARE_VERSION_PATCH (10) // 하위버전과 호환 되면서 버그 수정, 기능적으로 변경된것을 알아차리지 못할 정도의 소소한 변경이 있을 때
/* Version History /* Version History
* [0.0.1] : DCU 프로젝트 생성 * [0.0.1] : DCU 프로젝트 생성
* [0.0.2] : DCU 펌웨어 탑재 성공 * [0.0.2] : DCU 펌웨어 탑재 성공
* [0.0.3] : OLED XINTF(BUS) 방식 드라이브단 구현 * [0.0.3] : OLED XINTF(BUS) 방식 드라이브단 구현
* [0.0.4] : OLED 표시 화면 구현 * [0.0.4] : OLED 표시 화면 구현
* [0.0.5] : CAN-B 확인 및 맵핑 * [0.0.5] : CAN-B 확인 및 맵핑
* [0.0.6] : 시동 시퀀스 구현 및 정비 화면 수정 * [0.0.6] : 시동 시퀀스 구현 및 정비 화면 수정
* [0.1.6] : Suter 보조엔진 시동 완료 시점 * [0.1.6] : Suter 보조엔진 시동 완료 시점
* [0.1.7] : 발전상태 전환 조건 추가 26-02-23 * [0.1.7] : 발전상태 전환 조건 추가 26-02-23
* [0.1.8] : 장치 운용시간 로직 추가(Eeprom 사용), define USE_EEPROM 26-03-16 <삭제> * [0.1.8] : 장치 운용시간 로직 추가(Eeprom 사용), define USE_EEPROM 26-03-16 <삭제>
* [0.1.9] : IPS 회로 변경으로 전압센싱 추가 및 고장 알람 비트 추가, CAN-A 채널 송신 데이터 추가 26-03-26 * [0.1.9] : IPS 회로 변경으로 전압센싱 추가 및 고장 알람 비트 추가, CAN-A 채널 송신 데이터 추가 26-03-26
* [0.1.10] : 외부 CAN 적용
*/ */
#define MAINTENECE_PASSKEY {0,0,0,0} #define MAINTENECE_PASSKEY {0,0,0,0}
@@ -211,8 +212,9 @@ typedef struct ClassGeneralOperValue
Uint16 uiRetryCrankingCount; Uint16 uiRetryCrankingCount;
Uint16 uiWriteEepromDataStart; Uint16 uiWriteEepromDataStart;
Uint32 ulTotalOperationHour; Uint32 ulTotalOperationHour;
Uint32 ulRampStartClock; // IDLE_SEQ_MOD Uint32 ulRampStartClock;
Uint16 uiRampComplete; // IDLE_SEQ_MOD Uint16 uiRampComplete;
Uint16 uiRampStartRpm;
struct struct
{ {
Uint16 PlayCmd; Uint16 PlayCmd;
@@ -233,7 +235,6 @@ typedef struct ClassGeneralOperValue
} Conection; } Conection;
struct struct
{ {
Uint16 ManualCranking;
Uint16 LampTest; Uint16 LampTest;
Uint16 KeyTest; Uint16 KeyTest;
} Maintenance; } Maintenance;
@@ -248,7 +249,6 @@ void CSoftWaitCountClear(Uint16 Index);
Uint32 CGetSoftClock(void); Uint32 CGetSoftClock(void);
void CUpdateFault(Uint32 *pData, Uint16 uiIdx, Uint16 uiCond); void CUpdateFault(Uint32 *pData, Uint16 uiIdx, Uint16 uiCond);
void DELAY_USEC(Uint32 ulMicroSeconds); void DELAY_USEC(Uint32 ulMicroSeconds);
Uint16 CIsBitSet(Uint32 ulData, Uint16 uiIdx);
void CSetAuxCtrlPin(E_AUX_CS_IDX eIdx, Uint16 uiState); void CSetAuxCtrlPin(E_AUX_CS_IDX eIdx, Uint16 uiState);
#endif /* SOURCE_MAIN_H_ */ #endif /* SOURCE_MAIN_H_ */