Files
K2_DCU/.staticdata/.previous/20260113_090354/K2DCU/fs/0774309b5590755c2cd745aa7b91cb35
2026-04-14 00:56:31 +09:00

1444 lines
42 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "main.h"
#include "CFont.h"
#pragma DATA_SECTION(CommandBus,"ZONE6_COM");
#pragma DATA_SECTION(DataBus,"ZONE6_DAT");
volatile Uint16 CommandBus, DataBus;
const Uint16 uiBitMask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
int8 cNumBuffer[7] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
int8 *pNumBuffer = cNumBuffer;
COledOperValue OledOperValue;
static void CPageApu1(void);
static void CPageApu2(void);
static void CPageMenu1(void);
static void CPageMenu2(void);
static void CPageTemp(void);
static void CPageSensor1(void);
static void CPageSensor2(void);
static void CPageSensor3(void);
static void CPageSensor4(void);
static void CPageWarning1(void);
static void CPageWarning2(void);
static void CPageFault1(void);
static void CPageFault2(void);
static void CPageFault3(void);
static void CPageFault4(void);
static void CPageFault5(void);
static void CPageFault6(void);
static void CPageAlarmReset(void);
static void CPagePassword(void);
static void CPageMaintenence(void);
static void CPageKeyTest(void);
static void CPageShutdown(void);
Uint16 CStrLen(const int8 *s);
void CInitOledModule(void);
void CDrawChar(Uint16 x, Uint16 y, Uint16 ch, Uint16 type);
void CInitProgress(void);
void CDrawStr(Uint16 x, Uint16 y, int8* str, Uint16 len);
void CTextAlign(int8 *buffer, const int8 *str);
static inline void CPutPixel(Uint16 x, Uint16 y, Uint16 Color);
void CDrawBox(Uint16 x, Uint16 y, Uint16 w, Uint16 h);
void CDrawLine(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2);
void CLcdWrite(Uint16 Data, Uint16 Command);
void CSetDrawRegion(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2);
void CSetPageAddress(Uint16 Address);
void CSetColumnAddress(Uint16 x);
void COledWrite(Uint16 Data, Uint16 Command);
void CInitOledStructure(void);
static void CStrncpy(int8 *pTarget, const int8 *pSource, Uint16 Size);
void CStrncat(int8 *pTarget, const int8 *pSource, Uint16 Size);
void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen);
static void CFloatToString(float32 Data, int8 *Array, Uint16 ArrayLen);
static void CLineFocus(Uint16 isFocus);
static void CHourToString(int32 num, int8 *str);
void CAddLineIndent(int8 *buffer, const int8 *str);
static const int8* CGetApuStateString(eApuOperIdx idx);
static void CDrawTitleBox(Uint16 TitleLen);
static void CDrawCenteredLine(Uint16 y, const int8* text);
static const CPageHandler PageTable[OLED_PAGE_MAX] =
{
{ OLED_PAGE_APU1, CPageApu1 },
{ OLED_PAGE_APU2, CPageApu2 },
{ OLED_PAGE_MENU1, CPageMenu1 },
{ OLED_PAGE_MENU2, CPageMenu2 },
{ OLED_PAGE_TEMP, CPageTemp },
{ OLED_PAGE_SENSOR1, CPageSensor1 },
{ OLED_PAGE_SENSOR2, CPageSensor2 },
{ OLED_PAGE_SENSOR3, CPageSensor3 },
{ OLED_PAGE_SENSOR4, CPageSensor4 },
{ OLED_PAGE_WARNING1, CPageWarning1 },
{ OLED_PAGE_WARNING2, CPageWarning2 },
{ OLED_PAGE_FAULT1, CPageFault1 },
{ OLED_PAGE_FAULT2, CPageFault2 },
{ OLED_PAGE_FAULT3, CPageFault3 },
{ OLED_PAGE_FAULT4, CPageFault4 },
{ OLED_PAGE_FAULT5, CPageFault5 },
{ OLED_PAGE_FAULT6, CPageFault6 },
{ OLED_PAGE_RESET_ALARM, CPageAlarmReset },
{ OLED_PAGE_PASSWORD, CPagePassword },
{ OLED_PAGE_MAINTENENCE, CPageMaintenence },
{ OLED_PAGE_KEY_TEST, CPageKeyTest },
{ OLED_PAGE_SHUTDOWN, CPageShutdown }
};
static void CDrawPageTitle(const int8* title, const int8* pageNumStr)
{
CStrncpy(OledOperValue.cStrBuff[OLED_ROW_0], title, CStrLen(title));
CDrawStr(10U, OLED_LINE_TITLE, OledOperValue.cStrBuff[OLED_ROW_0], CStrLen((const int8*)OledOperValue.cStrBuff[OLED_ROW_0]));
CDrawTitleBox(CStrLen((const int8*)OledOperValue.cStrBuff[OLED_ROW_0]) * 6U);
if (pageNumStr != NULL)
{
CStrncpy(OledOperValue.cStrBuff[OLED_ROW_0], pageNumStr, CStrLen(pageNumStr));
CDrawStr(100U, OLED_LINE_TITLE, OledOperValue.cStrBuff[OLED_ROW_0], CStrLen(OledOperValue.cStrBuff[OLED_ROW_0]));
}
}
static void CDrawPageLine(Uint16 row, const int8* label, const int8* valueStr, const int8* unitStr)
{
Uint16 drawY = 0U;
switch(row)
{
case OLED_ROW_1: drawY = OLED_LINE_1; break;
case OLED_ROW_2: drawY = OLED_LINE_2; break;
case OLED_ROW_3: drawY = OLED_LINE_3; break;
case OLED_ROW_4: drawY = OLED_LINE_4; break;
default: return; // Invalid row
}
CStrncpy(OledOperValue.cStrBuff[row], label, CStrLen(label));
if (valueStr != NULL)
{
CStrncat(OledOperValue.cStrBuff[row], valueStr, CStrLen(valueStr));
}
if (unitStr != NULL)
{
CStrncat(OledOperValue.cStrBuff[row], unitStr, CStrLen(unitStr));
}
CDrawStr(0U, drawY, OledOperValue.cStrBuff[row], CStrLen(OledOperValue.cStrBuff[row]));
}
static void CDrawPageLineFloat(Uint16 row, const int8* label, float32 value, const int8* unitStr)
{
CFloatToString(value, pNumBuffer, sizeof(cNumBuffer));
CDrawPageLine(row, label, pNumBuffer, unitStr);
}
static void CDrawPageLineInt(Uint16 row, const int8* label, int32 value, const int8* unitStr)
{
CDecToString((int16)value, pNumBuffer, sizeof(cNumBuffer));
CDrawPageLine(row, label, pNumBuffer, unitStr);
}
static void CDrawTwoStatusLine(Uint16 row, const int8* label1, Uint16 status1, const int8* label2, Uint16 status2)
{
Uint16 drawY = 0U;
const int8* statusStr1 = (status1 == 1U) ? (const int8*)"1" : (const int8*)"0";
const int8* statusStr2 = (status2 == 1U) ? (const int8*)"1" : (const int8*)"0";
switch(row)
{
case OLED_ROW_1: drawY = OLED_LINE_1; break;
case OLED_ROW_2: drawY = OLED_LINE_2; break;
case OLED_ROW_3: drawY = OLED_LINE_3; break;
case OLED_ROW_4: drawY = OLED_LINE_4; break;
default: return;
}
// Label 1
CStrncpy(OledOperValue.cStrBuff[row], label1, CStrLen(label1));
// Status 1
CStrncat(OledOperValue.cStrBuff[row], statusStr1, CStrLen(statusStr1));
// Spacing
CStrncat(OledOperValue.cStrBuff[row], (const int8*)" ", 7U);
// Label 2
CStrncat(OledOperValue.cStrBuff[row], label2, CStrLen(label2));
// Status 2
CStrncat(OledOperValue.cStrBuff[row], statusStr2, CStrLen(statusStr2));
CDrawStr(0U, drawY, OledOperValue.cStrBuff[row], CStrLen(OledOperValue.cStrBuff[row]));
}
static void CPageApu1(void)
{
const int8 *cTemp = "";
float32 fTemp;
// TITLE
CDrawPageTitle("APU Status", "1/2");
// LINE 1
fTemp = Rx220.GcuData.DcVoltage;
CDrawPageLineFloat(OLED_ROW_1, "DC Voltage ", fTemp, " V");
// LINE 2
fTemp = Rx220.GcuData.DcCurrent;
CDrawPageLineFloat(OLED_ROW_2, "DC Current ", fTemp, " A");
// LINE 3
fTemp = (Rx220.GcuData.DcVoltage * Rx220.GcuData.DcCurrent);
CDrawPageLineFloat(OLED_ROW_3, "Power ", fTemp, " kW");
// LINE 4
cTemp = CGetApuStateString((eApuOperIdx)GeneralOperValue.uiApuState);
CStrncpy(OledOperValue.cStrBuff[OLED_ROW_4], "Status", CStrLen((const int8*)"Status"));
CAddLineIndent(OledOperValue.cStrBuff[OLED_ROW_4], cTemp);
CStrncat(OledOperValue.cStrBuff[OLED_ROW_4], cTemp, CStrLen(cTemp));
CDrawStr(0U, OLED_LINE_4, OledOperValue.cStrBuff[OLED_ROW_4], CStrLen(OledOperValue.cStrBuff[OLED_ROW_4]));
}
static void CPageApu2(void)
{
int16 iTemp;
// TITLE
CDrawPageTitle("APU Status", "2/2");
// LINE 1
iTemp = CGetEngineActualRpm();
CDrawPageLineInt(OLED_ROW_1, "ENG.RPM ", (int32)iTemp, " rpm");
// LINE 2
iTemp = CGetEngCoolantTemperature();
CDrawPageLineInt(OLED_ROW_2, "Coolant ", (int32)iTemp, " ¡É");
// LINE 3
iTemp = Rx320.EcuData.ActualTorque;
CDrawPageLineInt(OLED_ROW_3, "Torque ", (int32)iTemp, " %");
// LINE 4
CHourToString((int32)GeneralOperValue.ulTotalOperationHour, pNumBuffer);
CDrawPageLine(OLED_ROW_4, "ENG.Hour ", pNumBuffer, " Hr");
}
static void CPageMenu1(void)
{
// TITLE
CDrawPageTitle("Menu", "1/2");
// LINE 1
CLineFocus((OledOperValue.uiFocusLine == 0U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_1, "1. APU Status ", NULL, NULL);
// LINE 2
CLineFocus((OledOperValue.uiFocusLine == 1U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_2, "2. Temperature ", NULL, NULL);
// LINE 3
CLineFocus((OledOperValue.uiFocusLine == 2U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_3, "3. Sensor ", NULL, NULL);
// LINE 4
CLineFocus((OledOperValue.uiFocusLine == 3U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_4, "4. Warning ", NULL, NULL);
}
static void CPageMenu2(void)
{
// TITLE
CDrawPageTitle("Menu", "2/2");
// LINE 1
CLineFocus((OledOperValue.uiFocusLine == 0U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_1, "5. Fault ", NULL, NULL);
// LINE 2
CLineFocus((OledOperValue.uiFocusLine == 1U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_2, "6. Alarm Reset ", NULL, NULL);
// LINE 3
CLineFocus((OledOperValue.uiFocusLine == 2U) ? 1U : 0U);
CDrawPageLine(OLED_ROW_3, "7. Maintenence ", NULL, NULL);
}
static void CPageTemp(void)
{
int16 iTemp;
// TITLE
CDrawPageTitle("Temperature", "1/1");
// LINE 1
iTemp = Rx221.GcuData.PcbTemperature - 40;
CDrawPageLineInt(OLED_ROW_1, "PCB Temp. ", (int32)iTemp, " ¡É");
// LINE 2
iTemp = Rx221.GcuData.FetTemperature - 40;
CDrawPageLineInt(OLED_ROW_2, "FET Temp. ", (int32)iTemp, " ¡É");
// LINE 3
iTemp = Rx221.GcuData.GenTemperature1 - 40;
CDrawPageLineInt(OLED_ROW_3, "Gen.Temp1. ", (int32)iTemp, " ¡É");
// LINE4
iTemp = Rx221.GcuData.GenTemperature2 - 40;
CDrawPageLineInt(OLED_ROW_4, "Gen.Temp2. ", (int32)iTemp, " ¡É");
}
static void CPageSensor1(void)
{
float32 fTemp;
// TITLE
CDrawPageTitle("Apu Sensor", "1/4");
// LINE 1
fTemp = (Adc_EngineHeater_I.fLpfValue < 0.0f) ? 0.0f : Adc_EngineHeater_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_1, "EngineHeater", fTemp, " A");
// LINE 2
fTemp = (Adc_GlowPlug_I.fLpfValue < 0.0f) ? 0.0f : Adc_GlowPlug_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_2, "GlowPlug ", fTemp, " A");
// LINE 3
fTemp = (Adc_Solenoid_I.fLpfValue < 0.0f) ? 0.0f : Adc_Solenoid_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_3, "Solenoid ", fTemp, " A");
// LINE 4
fTemp = (Adc_FuelPump_I.fLpfValue < 0.0f) ? 0.0f : Adc_FuelPump_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_4, "FuelPump ", fTemp, " A");
}
static void CPageSensor2(void)
{
float32 fTemp;
// TITLE
CDrawPageTitle("Apu Sensor", "2/4");
// LINE 1
fTemp = (Adc_CoolantPump_I.fLpfValue < 0.0f) ? 0.0f : Adc_CoolantPump_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_1, "CoolantPump ", fTemp, " A");
// LINE 2
fTemp = (Adc_Fan1_I.fLpfValue < 0.0f) ? 0.0f : Adc_Fan1_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_2, "Fan1 ", fTemp, " A");
// LINE 3
fTemp = (Adc_Fan2_I.fLpfValue < 0.0f) ? 0.0f : Adc_Fan2_I.fLpfValue;
CDrawPageLineFloat(OLED_ROW_3, "Fan2 ", fTemp, " A");
}
static void CPageSensor3(void)
{
int16 iTemp;
// TITLE
CDrawPageTitle("ECU Sensor", "3/4");
// LINE 1
iTemp = Rx321.EcuData.BarometicPressure;
CDrawPageLineInt(OLED_ROW_1, "Barometric ", (int32)iTemp, " mb");
// LINE 2
iTemp = Rx321.EcuData.Fan1Speed;
CDrawPageLineInt(OLED_ROW_2, "Fan1 Speed ", (int32)iTemp, " %");
// LINE 3
iTemp = Rx321.EcuData.Fan2Speed;
CDrawPageLineInt(OLED_ROW_3, "Fan2 Speed ", (int32)iTemp, " %");
// LINE 4
iTemp = Rx321.EcuData.CoolantPumpSpeed;
CDrawPageLineInt(OLED_ROW_4, "C.Pump Speed ", (int32)iTemp, " %");
}
static void CPageSensor4(void)
{
int16 iTemp;
// TITLE
CDrawPageTitle("GCU Sensor", "4/4");
// LINE 1
iTemp = Rx220.GcuData.Rpm;
CDrawPageLineInt(OLED_ROW_1, "GEN.RPM ", (int32)iTemp, " rpm");
}
static void CDrawPageLineStatus(Uint16 row, const int8* label, Uint16 status)
{
const int8* statusStr = (status == 1U) ? (const int8*)"1" : (const int8*)"0";
CDrawPageLine(row, label, statusStr, NULL);
}
static void CPageWarning1(void)
{
// TITLE
CDrawPageTitle("Warning", "1/2");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "PCBOT:", Rx210.GcuWarning.bit.PcbOverHeat, "FETOT:", Rx210.GcuWarning.bit.FetOverHeat);
// LINE 2
CDrawTwoStatusLine(OLED_ROW_2, "GEOT1:", Rx210.GcuWarning.bit.GenOverHeat1, "GEOT2:", Rx210.GcuWarning.bit.GenOverHeat2);
// LINE 3
CDrawTwoStatusLine(OLED_ROW_3, "ENGOT:", Rx310.EcuWarning.bit.EngineOverHeat, "L-OIL:", Rx310.EcuWarning.bit.LowOilLevel);
// LINE 4
CDrawTwoStatusLine(OLED_ROW_4, "INTOT:", Rx310.EcuWarning.bit.IntakeOverHeat, "INTLP:", Rx310.EcuWarning.bit.IntakeLoPressure);
}
static void CPageWarning2(void)
{
// TITLE
CDrawPageTitle("Warning", "2/2");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "ENGLT:", Rx310.EcuWarning.bit.EngineLoTemperature, "ENGSF:", Rx310.EcuWarning.bit.EngineSensor);
// LINE 2
CDrawPageLineStatus(OLED_ROW_2, "DEFAC:", Rx310.EcuWarning.bit.DefaltValueActive);
}
static void CPageFault1(void)
{
// TITLE
CDrawPageTitle("Apu Fault", "1/6");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "CARCT:", FaultBitValue.bit.CarCommTimeout, "GCUCT:", FaultBitValue.bit.GcuCommTimeout);
// LINE 2
CDrawTwoStatusLine(OLED_ROW_2, "ECUCT:", FaultBitValue.bit.EcuCommTimeOut, "RPMER:", FaultBitValue.bit.RpmError);
// LINE 3
CDrawTwoStatusLine(OLED_ROW_3, "EHLOC:", FaultBitValue.bit.EngineHeatOverCurrent, "GPLOC:", FaultBitValue.bit.GlowPlugOverCurrent);
// LINE 4
CDrawTwoStatusLine(OLED_ROW_4, "SOLOC:", FaultBitValue.bit.SolenoidOverCurrent, "FPLOC:", FaultBitValue.bit.FuelPumpOverCurrent);
}
static void CPageFault2(void)
{
// TITLE
CDrawPageTitle("Apu Fault", "2/6");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "CPLOC:", FaultBitValue.bit.CoolantPumpOverCurrent, "F1LOC:", FaultBitValue.bit.Fan1OverCurrent);
// LINE 2
CDrawTwoStatusLine(OLED_ROW_2, "F2LOC:", FaultBitValue.bit.Fan2OverCurrent, "EHLLO:", FaultBitValue.bit.EngineHeatOpen);
// LINE 3
CDrawTwoStatusLine(OLED_ROW_3, "GPLLO:", FaultBitValue.bit.GlowPlugOpen, "SOLLO:", FaultBitValue.bit.SolenoidOpen);
// LINE 4
CDrawTwoStatusLine(OLED_ROW_4, "FPLLO:", FaultBitValue.bit.FuelPumpOpen, "CPLLO:", FaultBitValue.bit.CoolantPumpOpen);
}
static void CPageFault3(void)
{
// TITLE
CDrawPageTitle("Apu Fault", "3/6");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "F1LLO:", FaultBitValue.bit.Fan1Open, "F2LLO:", FaultBitValue.bit.Fan2Open);
}
static void CPageFault4(void)
{
// TITLE
CDrawPageTitle("Gcu Fault", "4/6");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "HTRIP:", Rx210.GcuFault.bit.HwTrip, "HIGBT:", Rx210.GcuFault.bit.HwIgbt);
// LINE 2
CDrawTwoStatusLine(OLED_ROW_2, "HDCOV:", Rx210.GcuFault.bit.HwDc, "GNOCU:", Rx210.GcuFault.bit.GenOverCurrentU);
// LINE 3
CDrawTwoStatusLine(OLED_ROW_3, "GNOCV:", Rx210.GcuFault.bit.GenOverCurrentV, "GNOCW:", Rx210.GcuFault.bit.GenOverCurrentW);
// LINE 4
CDrawTwoStatusLine(OLED_ROW_4, "SDCOV:", Rx210.GcuFault.bit.DcOverVoltage, "SDCOC:", Rx210.GcuFault.bit.DcOverCurrent);
}
static void CPageFault5(void)
{
// TITLE
CDrawPageTitle("Gcu Fault", "5/6");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "SMOOC:", Rx210.GcuFault.bit.CrankningOverCurrent, "PCBOT:", Rx210.GcuFault.bit.PcbOverHeat);
// LINE 2
CDrawTwoStatusLine(OLED_ROW_2, "FETOT:", Rx210.GcuFault.bit.FetOverHeat, "GW1OT:", Rx210.GcuFault.bit.GenTempOverHeat1);
// LINE 3
CDrawTwoStatusLine(OLED_ROW_3, "GW2OT:", Rx210.GcuFault.bit.GenTempOverHeat2, "GENOS:", Rx210.GcuFault.bit.GenOverSpeed);
// LINE 4
CDrawTwoStatusLine(OLED_ROW_4, "RSICF:", Rx210.GcuFault.bit.ResolverIC, "RSPRT:", Rx210.GcuFault.bit.ResolverParity);
}
static void CPageFault6(void)
{
// TITLE
CDrawPageTitle("Ecu Fault", "6/6");
// LINE 1
CDrawTwoStatusLine(OLED_ROW_1, "OILMS:", Rx310.EcuFault.bit.OilPressureMissing, "INTOT:", Rx310.EcuFault.bit.IntakeOverHeat);
// LINE 2
CDrawTwoStatusLine(OLED_ROW_2, "ENGOT:", Rx310.EcuFault.bit.EngineOverHeat, "ACTUA:", Rx310.EcuFault.bit.Actuator);
// LINE 3
CDrawTwoStatusLine(OLED_ROW_3, "RPMSG:", Rx310.EcuFault.bit.RpmSignal, "ENGSF:", Rx310.EcuFault.bit.EngineStartFail);
}
static void CDrawAlarmBox(void)
{
CDrawLine(5U, 10U, 122U, 10U); // Top
CDrawLine(5U, 10U, 5U, 58U); // Left
CDrawLine(5U, 59U, 122U, 59U); // Bottom
CDrawLine(122U, 10U, 122U, 58U); // Right
}
static void CDrawPostStatusLine(Uint16 row, const int8* l1, Uint16 s1, const int8* l2, Uint16 s2, const int8* l3, Uint16 s3)
{
const int8* s1Str = (s1 == 0U) ? (const int8*)"P" : (const int8*)"F";
Uint16 y = 0U;
// Label 1 + Status 1
CStrncpy(OledOperValue.cStrBuff[row], l1, CStrLen(l1));
CStrncat(OledOperValue.cStrBuff[row], s1Str, 1U);
// Label 2 + Status 2
if (l2 != NULL)
{
CStrncat(OledOperValue.cStrBuff[row], (const int8*)" ", 2U);
CStrncat(OledOperValue.cStrBuff[row], l2, CStrLen(l2));
CStrncat(OledOperValue.cStrBuff[row], (s2 == 0U) ? (const int8*)"P" : (const int8*)"F", 1U);
}
// Label 3 + Status 3
if (l3 != NULL)
{
CStrncat(OledOperValue.cStrBuff[row], (const int8*)" ", 2U);
CStrncat(OledOperValue.cStrBuff[row], l3, 13U);
CStrncat(OledOperValue.cStrBuff[row], (s3 == 0U) ? (const int8*)"P" : (const int8*)"F", 1U);
}
CTextAlign(OledOperValue.cAlignBuffer, OledOperValue.cStrBuff[row]);
switch(row)
{
case OLED_ROW_2: y = OLED_LINE_2; break;
case OLED_ROW_3: y = OLED_LINE_3; break;
case OLED_ROW_4: y = OLED_LINE_4; break;
default: break;
}
CDrawStr(0U, y, OledOperValue.cAlignBuffer, CStrLen(OledOperValue.cAlignBuffer));
}
static void CPageAlarmReset(void)
{
const int8 *cTemp = "";
// LINE 1
CDrawCenteredLine(OLED_LINE_1, "Reset all faults?");
// LINE 2
CDrawCenteredLine(OLED_LINE_2, "(no clear warnings)");
// LINE 3
cTemp = (OledOperValue.uiResetAnswer == 1U) ? (int8*)"YES" : (int8*)" NO";
CDrawCenteredLine(OLED_LINE_3 + 5U, cTemp);
// BOX
CDrawAlarmBox();
}
static void CPagePassword(void)
{
const int8 *cTemp = "";
int8 maskBuffer[16];
int16 iTemp[2] = { 0, '\0' };
// TITLE
CDrawPageTitle("Input Password", NULL);
switch (OledOperValue.uiFocusDigit)
{
case OLED_PASS_DIGIT_1:
{
iTemp[0] = GeneralOperValue.uiPassword[OLED_PASS_DIGIT_1] + '0';
cTemp = (int8*)iTemp;
CStrncpy(maskBuffer, "[", 2);
CStrncat(maskBuffer, cTemp, 1);
CStrncat(maskBuffer, "][*][*][*]", 10);
break;
}
case OLED_PASS_DIGIT_2:
{
iTemp[0] = GeneralOperValue.uiPassword[OLED_PASS_DIGIT_2] + '0';
cTemp = (int8*)iTemp;
CStrncpy(maskBuffer, "[*][", 4);
CStrncat(maskBuffer, cTemp, 1);
CStrncat(maskBuffer, "][*][*]", 7);
break;
}
case OLED_PASS_DIGIT_3:
{
iTemp[0] = GeneralOperValue.uiPassword[OLED_PASS_DIGIT_3] + '0';
cTemp = (int8*)iTemp;
CStrncpy(maskBuffer, "[*][*][", 7);
CStrncat(maskBuffer, cTemp, 1);
CStrncat(maskBuffer, "][*]", 4);
break;
}
default:
{
iTemp[0] = GeneralOperValue.uiPassword[OLED_PASS_DIGIT_4] + '0';
cTemp = (int8*)iTemp;
CStrncpy(maskBuffer, "[*][*][*][", 10);
CStrncat(maskBuffer, cTemp, 1);
CStrncat(maskBuffer, "]", 1);
break;
}
}
CTextAlign(OledOperValue.cAlignBuffer, maskBuffer);
CDrawStr(0U, OLED_LINE_2, OledOperValue.cAlignBuffer, CStrLen(OledOperValue.cAlignBuffer));
}
static void CPageMaintenence(void)
{
const int8 *cTemp = "";
// TITLE
CDrawPageTitle("Maintenence", "1/1");
// LINE 1
CLineFocus((OledOperValue.uiFocusLine == OLED_LINE_FOCUS_1) ? 1U : 0U);
cTemp = (GeneralOperValue.Maintenence.ManualCranking > 0U) ? (int8*)"ON " : (int8*)"OFF";
CDrawPageLine(OLED_ROW_1, "Manual Cranking ", cTemp, NULL);
// LINE 2
CLineFocus((OledOperValue.uiFocusLine == OLED_LINE_FOCUS_2) ? 1U : 0U);
cTemp = (GeneralOperValue.Maintenence.LampTest > 0U) ? (int8*)"ON " : (int8*)"OFF";
CDrawPageLine(OLED_ROW_2, "Lamp Test ", cTemp, NULL);
// LINE 3
CLineFocus((OledOperValue.uiFocusLine == OLED_LINE_FOCUS_3) ? 1U : 0U);
CDrawPageLine(OLED_ROW_3, "Switch Test ", NULL, NULL);
}
static void CDrawCenteredLine(Uint16 y, const int8* text)
{
CStrncpy(OledOperValue.cStrBuff[OLED_ROW_0], text, CStrLen(text));
CTextAlign(OledOperValue.cAlignBuffer, OledOperValue.cStrBuff[OLED_ROW_0]);
CDrawStr(0U, y, OledOperValue.cAlignBuffer, CStrLen(OledOperValue.cAlignBuffer));
}
static void CDrawKeyTestBox(void)
{
CDrawLine(0U, 0U, 125U, 0U); // Top
CDrawLine(0U, 0U, 0U, 22U); // Left
CDrawLine(0U, 23U, 2U, 25U); // Left diag
CDrawLine(3U, 25U, 123U, 25U); // Bottom
CDrawLine(124U, 25U, 126U, 23U); // Right diag
CDrawLine(126U, 0U, 126U, 22U); // Right
}
static void CDrawKeyStatusLine(Uint16 row, const int8* l1, Uint16 s1, const int8* l2, Uint16 s2, const int8* l3, Uint16 s3)
{
const int8* s1Str = (s1 == 1U) ? (const int8*)"1" : (const int8*)"0";
// Label 1 + Status 1
CStrncpy(OledOperValue.cStrBuff[row], l1, CStrLen(l1));
CStrncat(OledOperValue.cStrBuff[row], s1Str, 1U);
// Label 2 + Status 2
if (l2 != NULL)
{
CStrncat(OledOperValue.cStrBuff[row], (const int8*)" ", 1U);
CStrncat(OledOperValue.cStrBuff[row], l2, CStrLen(l2));
CStrncat(OledOperValue.cStrBuff[row], (s2 == 1U) ? (const int8*)"1" : (const int8*)"0", 1U);
}
// Label 3 + Status 3
if (l3 != NULL)
{
CStrncat(OledOperValue.cStrBuff[row], (const int8*)" ", 1U);
CStrncat(OledOperValue.cStrBuff[row], l3, CStrLen(l3));
CStrncat(OledOperValue.cStrBuff[row], (s3 == 1U) ? (const int8*)"1" : (const int8*)"0", 1U);
}
// Determine Y based on row
Uint16 y = 0U;
switch(row) {
case OLED_ROW_2: y = OLED_LINE_2; break;
case OLED_ROW_3: y = OLED_LINE_3; break;
case OLED_ROW_4: y = OLED_LINE_4; break;
default: break;
}
CDrawStr(0U, y, OledOperValue.cStrBuff[row], CStrLen(OledOperValue.cStrBuff[row]));
}
static void CPageKeyTest(void)
{
// TITLE1
CDrawCenteredLine(OLED_LINE_TITLE + 2U, "Key input Test");
// TITLE2
CDrawCenteredLine(OLED_LINE_1 - 1U, "(Back to Up&Down)");
// BOX
CDrawKeyTestBox();
// LINE 2
// " Stat:" + Status
// This is special indentation.
// I can reuse CDrawKeyStatusLine if I pass proper label.
// " Stat:" is 19 chars.
CDrawKeyStatusLine(OLED_ROW_2, " Stat:", GPIO_KEY_START(), NULL, 0, NULL, 0);
// LINE 3
// " Up:" + s + " " + "Entr:" + s + " " + "Powr:" + s
CDrawKeyStatusLine(OLED_ROW_3, " Up:", GPIO_KEY_UP(), "Entr:", GPIO_KEY_ENTER(), "Powr:", GPIO_KEY_POWER());
// LINE 4
// "Down:" + s + " " + "Menu:" + s + " " + "Emgc:" + s
CDrawKeyStatusLine(OLED_ROW_4, "Down:", GPIO_KEY_DOWN(), "Menu:", GPIO_KEY_MENU(), "Emgc:", GPIO_KEY_EMERGENCY());
}
static void CPageShutdown(void)
{
// LINE 1
CDrawCenteredLine(OLED_LINE_1, "System");
// LINE 2
CDrawCenteredLine(OLED_LINE_2, "Shutting down...");
}
void CSetPage(Uint16 PageNum)
{
int16 i;
if (OledOperValue.uiOldPageNum != PageNum)
{
COledBufferReset();
OledOperValue.uiOldPageNum = PageNum;
}
for (i = 0; i < OLED_PAGE_MAX; i++)
{
if (OledOperValue.uiPageNum == i)
{
CLineFocus(0U);
PageTable[i].pAction(); // CPageHandler ÂüÁ¶
}
}
}
void COledBufferReset(void)
{
(void) memset(OledOperValue.uiBuff, 0, sizeof(int8) * OLED_WIDTH * OLED_PAGE);
(void) memset(OledOperValue.cStrBuff, 0, sizeof(int8) * TXT_LINE_LEN * TXT_MAX_LEN);
}
static void CDrawTitleBox(Uint16 TitleLen)
{
CDrawLine(8U, 0U, 8U, 9U); // ¿ÞÂÊ
CDrawLine(8U, 10U, 10U, 12U); // ¿ÞÂÊ ¸ð¼­¸®
CDrawLine(11U, 12U, (TitleLen + 9U), 12U); // ¾Æ·¡ÂÊ
CDrawLine((TitleLen + 10U), 12U, (TitleLen + 12U), 10U); // ¿À¸¥ÂÊ ¸ð¼­¸®
CDrawLine((TitleLen + 12U), 0U, (TitleLen + 12U), 9U); // ¿À¸¥ÂÊ
if (OledOperValue.uiPageNum != OLED_PAGE_PASSWORD)
{
// ¼­ºê ŸÀÌÆ² ¹Ú½º
CDrawLine(98U, 0U, 98U, 9U); // ¿ÞÂÊ
CDrawLine(98U, 10U, 100U, 12U); // ¿ÞÂÊ ¸ð¼­¸®
CDrawLine(101U, 12U, 118U, 12U); // ¾Æ·¡ÂÊ
CDrawLine(119U, 12U, 121U, 10U); // ¿À¸¥ÂÊ ¸ð¼­¸®
CDrawLine(121U, 0U, 121U, 9U); // ¿À¸¥ÂÊ
}
}
void COledReflash(Uint16 x, Uint16 y, Uint16 width, Uint16 height)
{
Uint16 i, j;
for (j = y / 8; j < (y + height) / 8; j++)
{
for (i = x; i < (x + width); i++)
{
CSetPageAddress(j);
CSetColumnAddress(i);
COledWrite(OledOperValue.uiBuff[i][j], MODE_DATA);
}
}
}
void CInitOled(void)
{
Uint16 uiPageNum;
int16 i;
CInitOledModule();
for(uiPageNum = 0; uiPageNum < 8; uiPageNum++)
{
COledWrite((Uint16)(0xB0 | uiPageNum), MODE_COMMAND);
for(i = 0; i < OLED_WIDTH; i++)
{
COledWrite(0x00, MODE_DATA);
}
}
CInitProgress();
}
void CInitProgress(void)
{
OledOperValue.Color.TxtColor = 1U;
CTextAlign(OledOperValue.cAlignBuffer, "K2 APU");
CDrawStr(0, OLED_LINE_TITLE, OledOperValue.cAlignBuffer, CStrLen(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");
CDrawStr(0, OLED_LINE_2, OledOperValue.cAlignBuffer, CStrLen(OledOperValue.cAlignBuffer));
}
void CAddLineIndent(int8 *buffer, const int8 *str)
{
Uint16 i;
Uint16 uiSpaceNeeded = (TXT_MAX_LEN - 1) - CStrLen(buffer) - CStrLen(str);
if (uiSpaceNeeded > 0)
{
for (i = 0U; i < uiSpaceNeeded; i++)
{
CStrncat(buffer, " ", 1);
}
}
}
void CTextAlign(int8 *buffer, const int8 *str)
{
Uint16 uiIndent, uiLen, i, j;
uiLen = 0;
i = 0;
while (str[i] != '\0') // strÀº int8* À̹ǷÎ, int8 ŸÀÔÀÇ ³Î Á¾·á °ª(0) ãÀ½
{
uiLen++;
i++;
}
if (uiLen >= TXT_MAX_LEN)
{
uiIndent = 0;
}
else
{
uiIndent = ((TXT_MAX_LEN - 1U) - uiLen) / 2U;
}
if ((uiIndent > 0U) && (uiIndent < TXT_MAX_LEN)) // ¸®¼Ò½º °úµµ ¼Òºñ ¹æÁö
{
for (i = 0U; i < uiIndent; i++)
{
buffer[i] = (int8)' ';
}
for (j = 0U; j < uiLen; j++)
{
buffer[i + j] = str[j];
}
}
buffer[i + uiLen] = 0;
}
void CDrawBox(Uint16 x, Uint16 y, Uint16 w, Uint16 h)
{
CDrawLine(x, y, w, y); // À­º¯
CDrawLine(x, (y + 1U), x, (y + h)); // ÁÂÃø ¸·´ë
CDrawLine(x, (y + h), w, (y + h)); // ¾Æ·§ º¯
CDrawLine(w, (y + 1U), w, (y + h - 1U)); // ¿ìÃø ¸·´ë
}
void CSetDrawRegion(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2)
{
if (x2 > OledOperValue.Point.X2)
{
OledOperValue.Point.X2 = x2;
}
if (y2 > OledOperValue.Point.Y2)
{
OledOperValue.Point.Y2 = y2;
}
}
void CDrawLine(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2)
{
Uint16 tmp = 0, x = 0, y = 0, dx = 0, dy = 0, swapxy = 0;
Uint16 loop_end = 0;
Uint16 minor_limit = 0; // º¸Á¶Ãà(y) ÇѰ谪
int16 err = 0, ystep = 0;
dx = x2 - x1;
dy = (y1 > y2) ? (y1 - y2) : (y2 - y1);
if (dy > dx)
{
swapxy = 1;
tmp = dx; dx = dy; dy = tmp;
tmp = x1; x1 = y1; y1 = tmp;
tmp = x2; x2 = y2; y2 = tmp;
loop_end = OLED_HEIGHT - 1;
minor_limit = OLED_WIDTH - 1;
}
else
{
loop_end = OLED_WIDTH - 1;
minor_limit = OLED_HEIGHT - 1;
}
if (x2 > loop_end)
{
x2 = loop_end;
}
err = dx >> 1;
ystep = (y2 > y1) ? 1 : -1;
y = y1;
if (swapxy == 0)
{
for(x = x1; x <= x2; x++)
{
if (y > minor_limit) break;
CPutPixel(x, y, OledOperValue.Color.TxtColor);
err -= (Uint16) dy;
if ( err < 0 )
{
y += (Uint16) ystep;
err += (Uint16) dx;
}
}
}
else
{
for(x = x1; x <= x2; x++)
{
if (y > minor_limit) break;
CPutPixel(y, x, OledOperValue.Color.TxtColor);
err -= (Uint16) dy;
if ( err < 0 )
{
y += (Uint16) ystep;
err += (Uint16) dx;
}
}
}
}
static inline void CPutPixel(Uint16 x, Uint16 y, Uint16 Color)
{
Uint16 uiPage = y / 8U;
Uint16 uiOffset = y % 8U;
if (x >= OLED_WIDTH || y >= OLED_HEIGHT)
{
x = OLED_WIDTH;
y = OLED_HEIGHT;
}
else
{
if (x < OLED_WIDTH)
{
if (Color)
{
OledOperValue.uiBuff[x][uiPage] |= (0x01U << uiOffset);
}
else
{
OledOperValue.uiBuff[x][uiPage] &= (Uint16) ~(0x01U << uiOffset);
}
}
}
}
void CSetPageAddress(Uint16 Address)
{
COledWrite((Uint16)(Address | 0xB0), MODE_COMMAND);
}
void CSetColumnAddress(Uint16 x)
{
Uint16 HighAddress;
Uint16 LowAddress;
x += 0; // ER_OLEDM024-1G is +2, ER_OLEDM024-2G is +0
HighAddress = ((x >> 4) & 0x0F) | 0x10;
LowAddress = x & 0x0F;
COledWrite(LowAddress, MODE_COMMAND);
COledWrite(HighAddress, MODE_COMMAND);
}
void CInitXintf(void)
{
/* for All Zones Timing for all zones based on XTIMCLK = SYSCLKOUT (150MHz) */
EALLOW;
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
XintfRegs.XINTCNF2.bit.WRBUFF = 0; /* No write buffering */
XintfRegs.XINTCNF2.bit.CLKOFF = 0; /* XCLKOUT is enabled */
XintfRegs.XINTCNF2.bit.CLKMODE = 1; /* XCLKOUT = XTIMCLK */
/* Zone write timing */
XintfRegs.XTIMING6.bit.XWRLEAD = 1;
XintfRegs.XTIMING6.bit.XWRACTIVE = 13;
XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
/* Zone read timing */
XintfRegs.XTIMING6.bit.XRDLEAD = 1;
XintfRegs.XTIMING6.bit.XRDACTIVE = 13;
XintfRegs.XTIMING6.bit.XRDTRAIL = 1;
XintfRegs.XTIMING6.bit.X2TIMING = 1;
XintfRegs.XTIMING6.bit.USEREADY = 1;
XintfRegs.XTIMING6.bit.READYMODE = 1;
XintfRegs.XTIMING6.bit.XSIZE = 3;
GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 3; // OLED_D0 XD0
GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 3; // OLED_D1 XD1
GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 3; // OLED_D2 XD2
GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 3; // OLED_D3 XD3
GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 3; // OLED_D4 XD4
GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 3; // OLED_D5 XD5
GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 3; // OLED_D6 XD6
GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 3; // OLED_D7 XD7
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3; // OLED_CS_C XZCS6
GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 3; // OLED_WR_C XWE0
GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 3; // OLED_A0_C XWE1
EDIS;
}
void CDrawStr(Uint16 x, Uint16 y, int8* str, Uint16 len)
{
Uint16 i;
if ((len > 0U) && (len < TXT_MAX_LEN)) // ¸®¼Ò½º °úµµ ¼Òºñ ¹æÁö
{
for(i = 0; i < len; i++)
{
if (str[i] & 0x80)
{
CDrawChar(x, y, (Uint16)((str[i] << 8) | str[i + 1]), TXT_TYPE_ETC);
i++;
x += TXT_ENG_WIDTH * 2U;
}
else
{
CDrawChar(x, y, (Uint16)str[i], TXT_TYPE_ENG);
x += TXT_ENG_WIDTH;
}
}
}
}
void CDrawChar(Uint16 x, Uint16 y, Uint16 ch, Uint16 type)
{
const Uint16* pFontData;
Uint16 uiFontIndex = 0;
Uint16 i, j;
Uint16 uiCharWidth;
if (type == 0) // Eng Char
{
uiCharWidth = TXT_ENG_WIDTH;
ch -= 0x20U; // font offset
pFontData = EngFontTable[ch];
}
else
{
uiCharWidth = TXT_ENG_WIDTH * 2U;
ch = (ch == 0xA1C9U) ? 0x00U : ch;
pFontData = EtcFontTable[ch];
}
CSetDrawRegion(x, y, (x + TXT_ENG_WIDTH), (y + TXT_ENG_HEIGHT));
for(j = 0; j < TXT_ENG_HEIGHT; j++)
{
for(i = 0; i < uiCharWidth; i++)
{
if (pFontData[uiFontIndex / 8] & uiBitMask[uiFontIndex % 8])
{
CPutPixel((x + i), (y + j), OledOperValue.Color.TxtColor);
}
else
{
CPutPixel((x + i), (y + j), OledOperValue.Color.BgColor);
}
uiFontIndex++;
}
}
}
void CInitOledModule(void)
{
GPIO_OLED_RESET(1U);
DELAY_US(2000L);
GPIO_OLED_RESET(0U);
DELAY_US(2000L);
GPIO_OLED_RESET(1U);
DELAY_US(2000L);
COledWrite(0xFD, MODE_COMMAND); // Command Lock
COledWrite(0x12, MODE_COMMAND); //
COledWrite(0xAE, MODE_COMMAND); // oled off
COledWrite(0xA1, MODE_COMMAND); // 1U segment column address high to low
COledWrite(0xC8, MODE_COMMAND); // COM output scan from high to low
COledWrite(0x81, MODE_COMMAND); // 1U contrast
COledWrite(0xFF, MODE_COMMAND);
COledWrite(0xAF, MODE_COMMAND); // oled on
CInitOledStructure();
OledOperValue.uiProgressValue = OLED_LOAD_PROGRESS_X + 1;
}
void COledWrite(Uint16 Data, Uint16 Command)
{
if (Command == MODE_COMMAND)
{
CommandBus = Data;
}
else
{
DataBus = Data;
}
}
void CInitOledStructure(void)
{
(void) memset(&OledOperValue, 0, sizeof(COledOperValue));
OledOperValue.uiResetAnswer = 1U;
}
void CInitKeyOperValue(void)
{
(void) memset(&KeyOperValue, 0, sizeof(CKeyOperValue));
}
Uint16 CStrLen(const int8 *s)
{
// ¿øº» Æ÷ÀÎÅÍÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ ÀúÀåÇÕ´Ï´Ù.
const int8 *p = s;
// Æ÷ÀÎÅͰ¡ ³Î Á¾·á ¹®ÀÚ('\0', Áï ASCII 0)¸¦ °¡¸®Å°Áö ¾ÊÀ» ¶§±îÁö Æ÷ÀÎÅ͸¦ Áõ°¡½Ãŵ´Ï´Ù.
// ¹®ÀÚ¿­Àº ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£¿¡ ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù.
while (*p != '\0')
{
p++;
}
// ÃÖÁ¾ ÁÖ¼Ò(³Î ¹®ÀÚ ´ÙÀ½)¿Í ½ÃÀÛ ÁÖ¼ÒÀÇ Â÷À̰¡ ¹®ÀÚ¿­ÀÇ ±æÀ̰¡ µË´Ï´Ù.
return (Uint16)(p - s);
}
static void CStrncpy(int8 *pTarget, const int8 *pSource, Uint16 Size)
{
Uint16 i;
for (i = 0; i < Size; i++)
{
pTarget[i] = pSource[i];
}
pTarget[i] = '\0';
}
void CStrncat(int8 *pTarget, const int8 *pSource, Uint16 Size)
{
Uint16 i;
Uint16 uiTargetSize;
uiTargetSize = (Uint16)CStrLen(pTarget);
if ((uiTargetSize + Size) < TXT_MAX_LEN)
{
for (i = 0; i < Size; i++)
{
pTarget[uiTargetSize + i] = pSource[i];
}
pTarget[uiTargetSize + i] = '\0';
}
}
void CDecToString(int16 Data, int8 *Array, Uint16 ArrayLen)
{
Uint16 uiSign = 0U, uiSignLocate = 0U, i;
Uint16 x, y;
int32 lData = (int32) Data * 10;
int8 cTmp[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
for (i = 0; i < ArrayLen; i++)
{
Array[i] = ' ';
}
if (lData < 0)
{
// Ç¥½ÃÇÒ ¼ýÀÚ°¡ À½¼öÀÎ °æ¿ì
uiSign = 1U;
lData = -lData;
}
while (lData > 0U)
{
cTmp[x++] = (lData % 10) + '0';
lData /= 10U;
}
if (x == 0) // ¼öÄ¡°¡ 0ÀÇ °æ¿ì.
{
y = 3U;
Array[y++] = '0';
}
else
{
y = 5 - x; // Ãâ·Â µÇ´Â ¹®ÀÚÀÇ Á¤·ÄÀ» À§ÇÔ.
x = x - 1; // ¸¶Áö¸·À¸·Î ÀúÀåµÈ ¹öÆÛ À妽ºÀÇ °ªÀº »©ÁÜ.
if (y < 1)
{
uiSignLocate = 0U;
}
else
{
if ((y >= 1) && (y <= 5))
{
uiSignLocate = (Uint16)(y - 1); // '-' ºÎÈ£¸¦ Ç¥½ÃÇÒ ÀÚ¸®
}
}
if (uiSign == 1U) // '-' ºÎÈ£ Ç¥½Ã À§Ä¡ ÁöÁ¤Çϱâ À§ÇÔ.
{
if ((uiSignLocate > 0U) && (uiSignLocate < 6U))
{
Array[uiSignLocate] = '-';
}
}
else
{
Array[uiSignLocate] = ' ';
}
while (x > 0)
{
Array[y++] = cTmp[x--];
}
}
Array[y] = '\0'; // End of string.
}
static void CFloatToString(float32 Data, int8 *Array, Uint16 ArrayLen)
{
Uint16 x = 0U, y = 0U, i;
int16 iTemp = (int16)(Data * 10);
int8 cTmp[4] = { 0x00, 0x00, 0x00, 0x00 };
for (i = 0; i < ArrayLen; i++)
{
Array[i] = ' ';
}
while (iTemp > 0U)
{
cTmp[x++] = (iTemp % 10) + '0';
iTemp /= 10U;
}
if (x == 0U) // ¼öÄ¡°¡ 0.0ÀÏ °æ¿ì.
{
y = 3U;
Array[y++] = '0';
Array[y++] = '.';
Array[y++] = '0';
}
else
{
if (x == 1U)
{
y = 3U;
Array[y++] = '0';
Array[y++] = '.';
Array[y++] = cTmp[0];
}
else
{
y = 5U - x; // Ãâ·Â µÇ´Â ¹®ÀÚÀÇ Á¤·ÄÀ» À§ÇÔ.
x = x - 1U; // ¸¶Áö¸·À¸·Î ÀúÀåµÈ ¹öÆÛ À妽ºÀÇ °ªÀº »©ÁÜ.
while (x > 0U)
{
Array[y++] = cTmp[x--];
if (x == 0U)
{
Array[y++] = '.';
Array[y++] = cTmp[0];
}
}
}
}
Array[y] = '\0'; // End of string.
}
void CInitializePage(void)
{
if (AdcOperValue.uiOffsetAdjustStart == 0U)
{
CDrawLine((Uint16)(OledOperValue.uiProgressValue + 1U), (Uint16)(OLED_LOAD_PROGRESS_Y + 2U), (Uint16)(OledOperValue.uiProgressValue + 1U), (Uint16)(OLED_LOAD_PROGRESS_Y + 8U));
if (OledOperValue.uiProgressValue < OLED_LOAD_PROGRESS_W - 3) // -3Àº ÇÁ·Î±×·¡½º ¹ÙÀÇ Á¿ìÃø 1Çȼ¿ °ø°£ ÁÜ.
{
OledOperValue.uiProgressValue++;
}
else
{
OledOperValue.uiProgressDone = 1U;
}
}
}
void CDisplayPostFail(void)
{
CDrawCenteredLine(OLED_LINE_TITLE, "Power On Self-Test");
CDrawCenteredLine(OLED_LINE_1, "(P:PASS F:FAIL)");
// LINE 2
CDrawPostStatusLine(OLED_ROW_2, "EHT:", PowerOnCheckValue.EngineHeaterSensor, "GPL:", PowerOnCheckValue.GlowPlugSensor, "SOL:", PowerOnCheckValue.SolenoidSensor);
// LINE 3
CDrawPostStatusLine(OLED_ROW_3, "FUP:", PowerOnCheckValue.FuelPumpSensor, "CLP:", PowerOnCheckValue.CoolantPumpSensor, "FN1:", PowerOnCheckValue.Fan1Sensor);
// LINE 4
// Only FN2
CDrawPostStatusLine(OLED_ROW_4, "FN2:", PowerOnCheckValue.Fan2Sensor, NULL, 0, NULL, 0);
}
static void CLineFocus(Uint16 isFocus)
{
if (isFocus == 1U)
{
OledOperValue.Color.TxtColor = 0U;
OledOperValue.Color.BgColor = 1U;
}
else
{
OledOperValue.Color.TxtColor = 1U;
OledOperValue.Color.BgColor = 0U;
}
}
void CReversString(int8 *str, int16 length)
{
Uint16 i = 0U;
Uint16 end = length - 1U;
int8 temp;
while (i < end)
{
temp = str[i];
str[i] = str[end];
str[end] = temp;
i++;
end--;
}
}
static void CHourToString(int32 num, int8 *str)
{
Uint16 i = 0U;
Uint16 end;
Uint32 temp = num; // ÀԷ¹ÞÀº °ª (¿¹: 1234567 -> "12345.67")
// 1. ¼Ò¼öÁ¡ µÑ° ÀÚ¸® (100ºÐÀÇ 1)
str[i++] = (temp % 10) + '0';
temp = temp / 10;
// 2. ¼Ò¼öÁ¡ ù° ÀÚ¸® (10ºÐÀÇ 1)
str[i++] = (temp % 10) + '0';
temp = temp / 10;
// 3. ¼Ò¼öÁ¡ »ðÀÔ
str[i++] = '.';
// 4. Á¤¼öºÎ º¯È¯
// ÀÔ·ÂÀÌ 0À̾ ÃÖ¼Ò "0"Àº ÂïÈ÷µµ·Ï do-while »ç¿ë
do
{
str[i++] = (temp % 10) + '0';
temp = temp / 10;
}
while (temp != 0);
// 5. °ø¹é ä¿ì±â (ÀÚ¸®¼ö ¸ÂÃã)
// Á¤¼ö5ÀÚ¸® + Á¡1ÀÚ¸® + ¼Ò¼ö2ÀÚ¸® = ÃÑ 8ÀÚ¸®
while (i < 8U)
{
str[i++] = ' ';
}
str[i] = '\0'; // ¹®ÀÚ¿­ ³¡ ¾Ë¸²
end = i - 1U;
i = 0U;
while (i < end)
{
int8 swapTemp = str[i];
str[i] = str[end];
str[end] = swapTemp;
i++;
end--;
}
}
static const int8* CGetApuStateString(eApuOperIdx idx)
{
// À妽º¿Í 1:1 ¸ÅĪµÇ´Â ¹®ÀÚ¿­ ¹è¿­ Á¤ÀÇ staticÀ» »ç¿ëÇÏ¿© ÇÔ¼ö È£Ãâ ¶§¸¶´Ù ¹è¿­À» ´Ù½Ã »ý¼ºÇÏÁö ¾Êµµ·Ï ÇÔ
static const int8* strTable[] =
{
"BOOT", // 0: APU_OPER_IDX_BOOT
"INIT", // 1: APU_OPER_IDX_INITIAL
"POST", // 2: APU_OPER_IDX_POST
"EMERGENCY", // 3: APU_OPER_IDX_EMERGENCY
"STANDBY", // 4: APU_OPER_IDX_STANDBY
"START_CHECK", // 5: APU_OPER_IDX_START_CHECK
"PREHEAT", // 6: APU_OPER_IDX_ACTIVE_ENG_HEAT
"CRANKING", // 7: APU_OPER_IDX_CRANKING
"WARM_UP", // 8: APU_OPER_IDX_ENG_WARMING_UP
"CHECK_OPER", // 9: APU_OPER_IDX_CHECK_OPERATION
"GENERATING", // 10: APU_OPER_IDX_SET_GCU_GEN_START
"STABLED", // 11: APU_OPER_IDX_ENG_START_DONE
"STOP", // 12: APU_OPER_IDX_ENG_STOP_NORMAL
"COOLDOWN" // 13: APU_OPER_IDX_ENG_STOP_COOLDOWN
};
return strTable[idx];
}