초기 커밋.
This commit is contained in:
175
LFP_Manager/DataStructure/CsDeviceAlarmDefine.cs
Normal file
175
LFP_Manager/DataStructure/CsDeviceAlarmDefine.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace LFP_Manager.DataStructure
|
||||
{
|
||||
internal class CsAlarmDefine
|
||||
{
|
||||
//0x0001:Pack OV
|
||||
//0x0002:Cell OV
|
||||
//0x0004:Pack UV
|
||||
//0x0008:Cell UV
|
||||
//0x0010:Charge OC
|
||||
//0x0020:Discharge OC
|
||||
//0x0040: 环境温度异常
|
||||
//0x0080: MOS温度高
|
||||
//0x0100:Charge OT
|
||||
//0x0200:Discharge OT
|
||||
//0x0400:Charge UT
|
||||
//0x0800:Discharge UT
|
||||
//0x1000:Low capacity
|
||||
//0x2000: 浮充停止/Float Stoped
|
||||
//0x4000:
|
||||
|
||||
public enum eGuiWarningBit
|
||||
{
|
||||
PACK_OV = 0,
|
||||
CELL_OV = 1,
|
||||
PACK_UV = 2,
|
||||
CELL_UV = 3,
|
||||
CHG_OC = 4,
|
||||
DCH_OC = 5,
|
||||
AMB_OT = 6,
|
||||
MOS_OT = 7,
|
||||
CHG_OT = 8,
|
||||
DCH_OT = 9,
|
||||
CHG_UT = 10,
|
||||
DCH_UT = 11,
|
||||
LOW_SOC = 12,
|
||||
DIFF_VOLT = 13,
|
||||
CB_OFF = 14,
|
||||
}
|
||||
public enum eGuiProtectBit
|
||||
{
|
||||
PACK_OV = 0,
|
||||
CELL_OV = 1,
|
||||
PACK_UV = 2,
|
||||
CELL_UV = 3,
|
||||
CHG_OC = 4,
|
||||
DCH_OC = 5,
|
||||
AMB_OT = 6,
|
||||
MOS_OT = 7,
|
||||
CHG_OT = 8,
|
||||
DCH_OT = 9,
|
||||
CHG_UT = 10,
|
||||
DCH_UT = 11,
|
||||
LOW_SOC = 12,
|
||||
SC = 13,
|
||||
}
|
||||
public enum eDevWarningBit
|
||||
{
|
||||
CELL_OV = 0,
|
||||
CELL_UV = 1,
|
||||
PACK_OV = 2,
|
||||
PACK_UV = 3,
|
||||
CHG_OC = 4,
|
||||
DCH_OC = 5,
|
||||
AMB_OT = 6,
|
||||
AMB_UT = 7,
|
||||
CHG_OT = 8,
|
||||
CHG_UT = 9,
|
||||
DCH_OT = 10,
|
||||
DCH_UT = 11,
|
||||
LOW_SOC = 12,
|
||||
DIFF_VOLT = 13,
|
||||
CB_OFF = 14,
|
||||
}
|
||||
public enum eDevProtectBit
|
||||
{
|
||||
CELL_OV = 0,
|
||||
PACK_OV = 1,
|
||||
CELL_UV = 2,
|
||||
PACK_UV = 3,
|
||||
CHG_OC1 = 4,
|
||||
CHG_OC2 = 5,
|
||||
DCH_OC1 = 6,
|
||||
DCH_OC2 = 7,
|
||||
SC_CB = 8,
|
||||
CHG_OT = 9,
|
||||
CHG_UT = 10,
|
||||
DCH_OT = 11,
|
||||
DCH_UT = 12,
|
||||
}
|
||||
|
||||
private static bool HasBit(int value, int bitIndex) => (value & (1 << bitIndex)) != 0;
|
||||
private static void SetBit(ref int value, int bitIndex) => value |= (1 << bitIndex);
|
||||
private static void SetIf(int src, int srcBit, ref int dst, int dstBit)
|
||||
{
|
||||
if (HasBit(src, srcBit)) SetBit(ref dst, dstBit);
|
||||
}
|
||||
private static void SetIfAny(int src, int[] srcBits, ref int dst, int dstBit)
|
||||
{
|
||||
foreach (var b in srcBits)
|
||||
{
|
||||
if (HasBit(src, b)) { SetBit(ref dst, dstBit); break; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Device 경고 비트(eDevWarningBit) -> GUI 경고 비트(eGuiWarningBit)
|
||||
/// AMB_UT는 GUI 경고에 대응 비트가 없어 미표시.
|
||||
/// 새로 추가된 DIFF_VOLT, CB_OFF 매핑 포함.
|
||||
/// </summary>
|
||||
public static int DevWarningToGui(int devWarning)
|
||||
{
|
||||
int gui = 0;
|
||||
|
||||
SetIf(devWarning, (int)eDevWarningBit.PACK_OV, ref gui, (int)eGuiWarningBit.PACK_OV);
|
||||
SetIf(devWarning, (int)eDevWarningBit.CELL_OV, ref gui, (int)eGuiWarningBit.CELL_OV);
|
||||
SetIf(devWarning, (int)eDevWarningBit.PACK_UV, ref gui, (int)eGuiWarningBit.PACK_UV);
|
||||
SetIf(devWarning, (int)eDevWarningBit.CELL_UV, ref gui, (int)eGuiWarningBit.CELL_UV);
|
||||
|
||||
SetIf(devWarning, (int)eDevWarningBit.CHG_OC, ref gui, (int)eGuiWarningBit.CHG_OC);
|
||||
SetIf(devWarning, (int)eDevWarningBit.DCH_OC, ref gui, (int)eGuiWarningBit.DCH_OC);
|
||||
|
||||
SetIf(devWarning, (int)eDevWarningBit.AMB_OT, ref gui, (int)eGuiWarningBit.AMB_OT);
|
||||
//SetIf(devWarning, (int)eDevWarningBit.MOS_OT, ref gui, (int)eGuiWarningBit.MOS_OT);
|
||||
|
||||
SetIf(devWarning, (int)eDevWarningBit.CHG_OT, ref gui, (int)eGuiWarningBit.CHG_OT);
|
||||
SetIf(devWarning, (int)eDevWarningBit.DCH_OT, ref gui, (int)eGuiWarningBit.DCH_OT);
|
||||
SetIf(devWarning, (int)eDevWarningBit.CHG_UT, ref gui, (int)eGuiWarningBit.CHG_UT);
|
||||
SetIf(devWarning, (int)eDevWarningBit.DCH_UT, ref gui, (int)eGuiWarningBit.DCH_UT);
|
||||
|
||||
SetIf(devWarning, (int)eDevWarningBit.LOW_SOC, ref gui, (int)eGuiWarningBit.LOW_SOC);
|
||||
SetIf(devWarning, (int)eDevWarningBit.DIFF_VOLT, ref gui, (int)eGuiWarningBit.DIFF_VOLT);
|
||||
SetIf(devWarning, (int)eDevWarningBit.CB_OFF, ref gui, (int)eGuiWarningBit.CB_OFF);
|
||||
|
||||
// AMB_UT는 GUI에 해당 없음 → 미표시
|
||||
return gui;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Device 보호 비트(eDevProtectBit) -> GUI 보호 비트(eGuiProtectBit)
|
||||
/// CHG_OC1/2 → CHG_OC 집계, DCH_OC1/2 → DCH_OC 집계
|
||||
/// SC_CB(단락/차단기 트립) → SC(신규 GUI 비트) 매핑.
|
||||
/// </summary>
|
||||
public static int DevProtectToGui(int devProtect)
|
||||
{
|
||||
int gui = 0;
|
||||
|
||||
SetIf(devProtect, (int)eDevProtectBit.PACK_OV, ref gui, (int)eGuiProtectBit.PACK_OV);
|
||||
SetIf(devProtect, (int)eDevProtectBit.CELL_OV, ref gui, (int)eGuiProtectBit.CELL_OV);
|
||||
SetIf(devProtect, (int)eDevProtectBit.PACK_UV, ref gui, (int)eGuiProtectBit.PACK_UV);
|
||||
SetIf(devProtect, (int)eDevProtectBit.CELL_UV, ref gui, (int)eGuiProtectBit.CELL_UV);
|
||||
|
||||
SetIfAny(devProtect, new[] { (int)eDevProtectBit.CHG_OC1, (int)eDevProtectBit.CHG_OC2 },
|
||||
ref gui, (int)eGuiProtectBit.CHG_OC);
|
||||
SetIfAny(devProtect, new[] { (int)eDevProtectBit.DCH_OC1, (int)eDevProtectBit.DCH_OC2 },
|
||||
ref gui, (int)eGuiProtectBit.DCH_OC);
|
||||
|
||||
// 단락/차단기 트립 → SC
|
||||
SetIf(devProtect, (int)eDevProtectBit.SC_CB, ref gui, (int)eGuiProtectBit.SC);
|
||||
|
||||
SetIf(devProtect, (int)eDevProtectBit.CHG_OT, ref gui, (int)eGuiProtectBit.CHG_OT);
|
||||
SetIf(devProtect, (int)eDevProtectBit.CHG_UT, ref gui, (int)eGuiProtectBit.CHG_UT);
|
||||
SetIf(devProtect, (int)eDevProtectBit.DCH_OT, ref gui, (int)eGuiProtectBit.DCH_OT);
|
||||
SetIf(devProtect, (int)eDevProtectBit.DCH_UT, ref gui, (int)eGuiProtectBit.DCH_UT);
|
||||
|
||||
// AMB_OT, MOS_OT, LOW_SOC 보호 카테고리는 DevProtectBit에 정의되지 않아 미표시
|
||||
return gui;
|
||||
}
|
||||
}
|
||||
}
|
||||
1240
LFP_Manager/DataStructure/CsDeviceData.cs
Normal file
1240
LFP_Manager/DataStructure/CsDeviceData.cs
Normal file
File diff suppressed because it is too large
Load Diff
79
LFP_Manager/DataStructure/CsSnmpConstData.cs
Normal file
79
LFP_Manager/DataStructure/CsSnmpConstData.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace LFP_Manager.DataStructure
|
||||
{
|
||||
internal class CsSnmpConstData
|
||||
{
|
||||
public static readonly string[] SnmpOidInfo =
|
||||
{
|
||||
".1.3.6.1.2.1.15.1.0", // 0 Voltage - 10mV
|
||||
".1.3.6.1.2.1.15.2.0", // 1 Current - 10mA
|
||||
".1.3.6.1.2.1.15.3.0", // 2 #01 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.4.0", // 3 #02 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.5.0", // 4 #03 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.6.0", // 5 #04 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.7.0", // 6 #05 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.8.0", // 7 #06 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.9.0", // 8 #07 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.10.0", // 9 #08 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.11.0", // 10 #09 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.12.0", // 11 #10 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.13.0", // 12 #11 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.14.0", // 13 #12 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.15.0", // 14 #13 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.16.0", // 15 #14 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.17.0", // 16 #15 Cell Voltage - mV
|
||||
".1.3.6.1.2.1.15.18.0", // 17 #16 Cell Voltage - mV
|
||||
|
||||
".1.3.6.1.2.1.15.19.0", // 18 Temp of PCB - C
|
||||
".1.3.6.1.2.1.15.20.0", // 19 Temp of Ambient - C
|
||||
".1.3.6.1.2.1.15.21.0", // 20 Temp Max. - C
|
||||
".1.3.6.1.2.1.15.22.0", // 21 Remaining Capacity - 0.1AH
|
||||
|
||||
".1.3.6.1.2.1.15.24.0", // 23 SOH - 0.00%
|
||||
".1.3.6.1.2.1.15.25.0", // 24 SOC - 0.00%
|
||||
".1.3.6.1.2.1.15.26.0", // 25 Status
|
||||
".1.3.6.1.2.1.15.27.0", // 26 Warning
|
||||
".1.3.6.1.2.1.15.28.0", // 27 Protection
|
||||
".1.3.6.1.2.1.15.29.0", // 28 FailAndStatus
|
||||
".1.3.6.1.2.1.15.30.0", // 29 Cycle Count
|
||||
|
||||
".1.3.6.1.2.1.15.31.0", // 30 #01 Temp - C
|
||||
".1.3.6.1.2.1.15.32.0", // 31 #02 Temp - C
|
||||
".1.3.6.1.2.1.15.33.0", // 32 #03 Temp - C
|
||||
".1.3.6.1.2.1.15.34.0", // 33 #04 Temp - C
|
||||
|
||||
".1.3.6.1.2.1.15.37.0", // 34 Cell Number
|
||||
".1.3.6.1.2.1.15.38.0", // 35 Designed Capacity - 0.1AH
|
||||
".1.3.6.1.2.1.15.39.0", // 36 Average Temp - C
|
||||
".1.3.6.1.2.1.15.40.0", // 37 Max Charge Current - A
|
||||
".1.3.6.1.2.1.15.41.0", // 38 Temp Number
|
||||
|
||||
".1.3.6.1.2.1.15.42.0", // 39 DateTime - Year
|
||||
".1.3.6.1.2.1.15.43.0", // 40 DateTime - Month
|
||||
".1.3.6.1.2.1.15.44.0", // 41 DateTime - Date
|
||||
".1.3.6.1.2.1.15.45.0", // 42 DateTime - Hour
|
||||
".1.3.6.1.2.1.15.46.0", // 43 DateTime - Minute
|
||||
".1.3.6.1.2.1.15.47.0", // 44 DateTime - Second
|
||||
|
||||
".1.3.6.1.2.1.15.48.0", // 45 Flaot Voltage - 0.00V
|
||||
".1.3.6.1.2.1.15.49.0", // 46 Boost Voltage - 0.00V
|
||||
|
||||
".1.3.6.1.2.1.15.50.0", // 47 Min. Charge Temp - C
|
||||
".1.3.6.1.2.1.15.51.0", // 48 Max. Charge Temp - C
|
||||
|
||||
".1.3.6.1.2.1.15.60.0", // 49 Model - String
|
||||
".1.3.6.1.2.1.15.61.0", // 50 BMS Firmware - String
|
||||
".1.3.6.1.2.1.15.62.0", // 51 Pack Serial Number - String
|
||||
".1.3.6.1.2.1.15.63.0", // 52 Vendor Name - String
|
||||
".1.3.6.1.2.1.15.64.0", // 53 Product Code - String
|
||||
".1.3.6.1.2.1.15.65.0", // 54 MajorMinorRev - String
|
||||
".1.3.6.1.2.1.15.66.0", // 55 HwProductRev - String
|
||||
".1.3.6.1.2.1.15.67.0", // 56 Manufacture Date - String
|
||||
};
|
||||
}
|
||||
}
|
||||
192
LFP_Manager/DataStructure/csCanConstData.cs
Normal file
192
LFP_Manager/DataStructure/csCanConstData.cs
Normal file
@@ -0,0 +1,192 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace LFP_Manager.DataStructure
|
||||
{
|
||||
class csCanConstData
|
||||
{
|
||||
public class CanDeviceInfo
|
||||
{
|
||||
public const int VCI_PCI5121 = 1;
|
||||
public const int VCI_PCI9810 = 2;
|
||||
public const int VCI_USBCAN1 = 3;
|
||||
public const int VCI_USBCAN2 = 4;
|
||||
public const int VCI_USBCAN2A = 4;
|
||||
public const int VCI_PCI9820 = 5;
|
||||
public const int VCI_CAN232 = 6;
|
||||
public const int VCI_PCI5110 = 7;
|
||||
public const int VCI_CANLITE = 8;
|
||||
public const int VCI_ISA9620 = 9;
|
||||
public const int VCI_ISA5420 = 10;
|
||||
public const int VCI_PC104CAN = 11;
|
||||
public const int VCI_CANETUDP = 12;
|
||||
public const int VCI_CANETE = 12;
|
||||
public const int VCI_DNP9810 = 13;
|
||||
public const int VCI_PCI9840 = 14;
|
||||
public const int VCI_PC104CAN2 = 15;
|
||||
public const int VCI_PCI9820I = 16;
|
||||
public const int VCI_CANETTCP = 17;
|
||||
public const int VCI_PEC9920 = 18;
|
||||
public const int VCI_PCI5010U = 19;
|
||||
public const int VCI_USBCAN_E_U = 20;
|
||||
public const int VCI_USBCAN_2E_U = 21;
|
||||
public const int VCI_PCI5020U = 22;
|
||||
public const int VCI_EG20T_CAN = 23;
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="DeviceType"></param>
|
||||
/// <param name="DeviceInd"></param>
|
||||
/// <param name="Reserved"></param>
|
||||
/// <returns></returns>
|
||||
}
|
||||
|
||||
public static readonly string[] DEVICE_NAME =
|
||||
{
|
||||
"PCI5121",
|
||||
"PCI9810",
|
||||
"USBCAN1",
|
||||
"USBCAN2",
|
||||
"USBCAN2A",
|
||||
"PCI9820",
|
||||
"CAN232",
|
||||
"PCI5110",
|
||||
"CANLITE",
|
||||
"ISA9620",
|
||||
"ISA5420",
|
||||
"PC104CAN",
|
||||
"CANETUDP",
|
||||
"CANETE",
|
||||
"DNP9810",
|
||||
"PCI9840",
|
||||
"PC104CAN2",
|
||||
"PCI9820I",
|
||||
"CANETTCP",
|
||||
"PEC9920",
|
||||
"PCI5010U",
|
||||
"USBCAN_E_U",
|
||||
"USBCAN_2E_U",
|
||||
"PCI5020U",
|
||||
"EG20T_CAN",
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="DeviceType"></param>
|
||||
/// <param name="DeviceInd"></param>
|
||||
/// <param name="Reserved"></param>
|
||||
/// <returns></returns>
|
||||
};
|
||||
|
||||
public static readonly int[] DEVICE_ID =
|
||||
{
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22,
|
||||
23,
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="DeviceType"></param>
|
||||
/// <param name="DeviceInd"></param>
|
||||
/// <param name="Reserved"></param>
|
||||
/// <returns></returns>
|
||||
};
|
||||
|
||||
//0x060003--1000Kbps
|
||||
//0x060004--800Kbps
|
||||
//0x060007--500Kbps
|
||||
//0x1C0008--250Kbps
|
||||
//0x1C0011--125Kbps
|
||||
//0x160023--100Kbps
|
||||
//0x1C002C--50Kbps
|
||||
//0x1600B3--20Kbps
|
||||
//0x1C00E0--10Kbps
|
||||
//0x1C01C1--5Kbps
|
||||
|
||||
public static readonly int[] CAN_BAUDRATE =
|
||||
{
|
||||
0x060003,
|
||||
0x060004,
|
||||
0x060007,
|
||||
0x1C0008,
|
||||
0x1C0011,
|
||||
0x160023,
|
||||
0x1C002C,
|
||||
0x1600B3,
|
||||
0x1C00E0,
|
||||
0x1C01C1
|
||||
};
|
||||
|
||||
//USBCAN II Baudrate
|
||||
public static readonly int[] CAN_BAUDRATE_OTHER = // Timer 0 + Timer 1
|
||||
{
|
||||
0x0014, // 1000Kbps
|
||||
0x0016, // 800Kbps
|
||||
0x001C, // 500Kbps
|
||||
0x011C, // 250Kbps
|
||||
0x031C, // 125Kbps
|
||||
0x041C, // 100Kbps
|
||||
0x091C, // 50Kbps
|
||||
0x181C, // 20Kbps
|
||||
0x311C, // 10Kbps
|
||||
0xBFFF // 5Kbps
|
||||
};
|
||||
|
||||
public static readonly string[] CAN_BAUDRATE_STR =
|
||||
{
|
||||
"1000Kbps",
|
||||
"800Kbps",
|
||||
"500Kbps",
|
||||
"250Kbps",
|
||||
"125Kbps",
|
||||
"100Kbps",
|
||||
"50Kbps",
|
||||
"20Kbps",
|
||||
"10Kbps",
|
||||
"5Kbps"
|
||||
};
|
||||
|
||||
public class SendType
|
||||
{
|
||||
public const int Normal = 0;
|
||||
public const int Single_Normal = 1;
|
||||
public const int Loop_Back = 2;
|
||||
public const int Single_Loop_Back = 3;
|
||||
}
|
||||
|
||||
public class FrameType
|
||||
{
|
||||
public const int Standard = 0;
|
||||
public const int Extended = 1;
|
||||
}
|
||||
|
||||
public class FrameFormat
|
||||
{
|
||||
public const int Data_Frame = 0;
|
||||
public const int Remote_Frame = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
272
LFP_Manager/DataStructure/csConstData.cs
Normal file
272
LFP_Manager/DataStructure/csConstData.cs
Normal file
@@ -0,0 +1,272 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace LFP_Manager.DataStructure
|
||||
{
|
||||
class csConstData
|
||||
{
|
||||
public class SystemInfo
|
||||
{
|
||||
public const int BASE_CAN_TARGET_ADDR = 200;
|
||||
public const int MAX_MODULE_SIZE = 16;
|
||||
|
||||
public const int MAX_MODULE_CELL_SIZE = 15;
|
||||
public const int MAX_MODULE_TEMP_SIZE = 8; //Byul 21.08.09 Initial : 8
|
||||
|
||||
public static readonly int FLOATING_VOLTAGE = (int)(3.55 * MAX_MODULE_CELL_SIZE * 10);
|
||||
|
||||
public static readonly string[] CHG_MODE =
|
||||
{
|
||||
"NO CURR LMT",
|
||||
"ALWAYS CURR LMT",
|
||||
"PRE-CHG PROTECT",
|
||||
"CHG LMT AFTER OC",
|
||||
"PRE-CHG + LMT",
|
||||
};
|
||||
}
|
||||
|
||||
public class CommType
|
||||
{
|
||||
public const int COMM_UART = 0;
|
||||
public const int COMM_RS485 = 1;
|
||||
public const int COMM_SNMP = 2;
|
||||
public const int COMM_UART_MULTI = 9;
|
||||
}
|
||||
|
||||
public class UART_MODEL_INDEX
|
||||
{
|
||||
public const int LFPM_48100D = 0;
|
||||
public const int LFPM_48150D = 1;
|
||||
public const int LFPM_48200D = 2;
|
||||
public const int LFPM_48250D = 3;
|
||||
public const int LFPM_48300D = 4;
|
||||
public const int LFPM_124050D = 5;
|
||||
}
|
||||
|
||||
public static readonly string[] UART_MODEL =
|
||||
{
|
||||
"LFPM-48100SB", // 0
|
||||
"LFPM-48150SB", // 1
|
||||
"LFPM-48200SB", // 2
|
||||
"LFPM-48250SB", // 3
|
||||
"LFPM-48300SB", // 4
|
||||
};
|
||||
|
||||
public static readonly string[] UART_PROTOCOL =
|
||||
{
|
||||
"AMG",
|
||||
};
|
||||
|
||||
public class UART_PARAM_LIST
|
||||
{
|
||||
public const int DEFAULT_PARAM = 0;
|
||||
public const int CELL_UNDER_VOLTAGE = 61; //67
|
||||
public const int PACK_UNDER_VOLTAGE = 64; //64
|
||||
public const int CELL_OVER_VOLTAGE = 67; //
|
||||
public const int PACK_OVER_VOLTAGE = 70; //61
|
||||
public const int CHG_OVER_CURRENT2 = 83;
|
||||
public const int DCH_OVER_CURRENT2 = 84;
|
||||
public const int CHG_OVER_CURRENT = 78;
|
||||
public const int DCH_OVER_CURRENT = 79;
|
||||
|
||||
public const int ENV_LOW_TEMPERATURE = 0x82; // 130, 131, 132 0x82, 0x83, 0x84 - Warning, Trip, Release
|
||||
public const int ENV_HIGH_TEMPERATURE = 0x85; // 133, 134, 135 0x85, 0x86, 0x87 - Warning, Trip, Release
|
||||
|
||||
public const int CHG_LOW_TEMPERATURE = 90;
|
||||
public const int CHG_HIGH_TEMPERATURE = 93; //93
|
||||
public const int DCH_LOW_TEMPERATURE = 96;
|
||||
public const int DCH_HIGH_TEMPERATURE = 99; //99
|
||||
public const int PCB_HIGH_TEMPERATURE = 102;
|
||||
|
||||
public const int LOW_CAPACITY = 58;
|
||||
|
||||
public const int DESIGN_CAPACITY = 37;
|
||||
public const int SOC_VALUE = 24;
|
||||
public const int CYCLE_COUNT = 29;
|
||||
}
|
||||
|
||||
public class UART_CALIB_ADDR_LIST
|
||||
{
|
||||
public const int LIMIT_CHARGE = 0x502E; //
|
||||
public const int BMS_DATETIME = 0x002D;
|
||||
public const int CHAGE_MODE = 0x002F; //
|
||||
public const int ANTI_THEFT_COMM = 0x0088;
|
||||
public const int ANTI_THEFT_GYRO = 0x0089;
|
||||
|
||||
public const int BAL_VOLT = 0x38;
|
||||
public const int BAL_DIFF = 0x39;
|
||||
}
|
||||
|
||||
public class UART_PARAM_DEFAULT
|
||||
{
|
||||
public const int Warn_Cell_UV = 2800;
|
||||
public const int Protect_Cell_UV = 2500;
|
||||
public const int Release_Cell_UV = 3000;
|
||||
public const int Warn_Pack_UV = 4300;
|
||||
public const int Protect_Pack_UV = 4200;
|
||||
public const int Release_Pack_UV = 4500;
|
||||
|
||||
public const int Warn_Cell_OV = 3750;
|
||||
public const int Protect_Cell_OV = 3850;
|
||||
public const int Release_Cell_OV = 3580;
|
||||
public const int Warn_Pack_OV = 5600;
|
||||
public const int Protect_Pack_OV = 5700;
|
||||
public const int Release_Pack_OV = 5400;
|
||||
|
||||
public const int Protect_Charge_OC1 = 11000;
|
||||
public const int Protect_Discharge_OC1 = 11000;
|
||||
public const int Protect_Charge_OC2 = 12000;
|
||||
public const int Protect_Discharge_OC2 = 12000;
|
||||
public const int ReleaseTime_Charge_OC = 60;
|
||||
public const int ReleaseTime_Discharge_OC = 60;
|
||||
public const int Delay_Charge_OC1 = 5;
|
||||
public const int Delay_Discharge_OC1 = 5;
|
||||
public const int Delay_Charge_OC2 = 1;
|
||||
public const int Delay_Discharge_OC2 = 1;
|
||||
public const int Times_Charge_OC = 5;
|
||||
public const int Times_Discharge_OC = 5;
|
||||
|
||||
public const int Warn_Charge_UT = -5;
|
||||
public const int Protect_Charge_UT = -10;
|
||||
public const int Release_Charge_UT = -3;
|
||||
public const int Warn_Charge_OT = 60;
|
||||
public const int Protect_Charge_OT = 65;
|
||||
public const int Release_Charge_OT = 55;
|
||||
|
||||
public const int Warn_Discharge_UT = -20;
|
||||
public const int Protect_Discharge_UT = -25;
|
||||
public const int Release_Discharge_UT = -15;
|
||||
public const int Warn_Discharge_OT = 65;
|
||||
public const int Protect_Discharge_OT = 70;
|
||||
public const int Release_Discharge_OT = 60;
|
||||
|
||||
public const int Warn_Low_Capacity = 5;
|
||||
}
|
||||
|
||||
public class UART_124050_PARAM_DEFAULT
|
||||
{
|
||||
public const int Warn_Cell_UV = 2800;
|
||||
public const int Protect_Cell_UV = 2500;
|
||||
public const int Release_Cell_UV = 3000;
|
||||
public const int Warn_Pack_UV = 10900;
|
||||
public const int Protect_Pack_UV = 9795;
|
||||
public const int Release_Pack_UV = 11700;
|
||||
|
||||
public const int Warn_Cell_OV = 3750;
|
||||
public const int Protect_Cell_OV = 3850;
|
||||
public const int Release_Cell_OV = 3580;
|
||||
public const int Warn_Pack_OV = 14600;
|
||||
public const int Protect_Pack_OV = 15000;
|
||||
public const int Release_Pack_OV = 14000;
|
||||
|
||||
public const int Protect_Charge_OC1 = 11000;
|
||||
public const int Protect_Discharge_OC1 = 11000;
|
||||
public const int Protect_Charge_OC2 = 12000;
|
||||
public const int Protect_Discharge_OC2 = 12000;
|
||||
public const int ReleaseTime_Charge_OC = 60;
|
||||
public const int ReleaseTime_Discharge_OC = 60;
|
||||
public const int Delay_Charge_OC1 = 5;
|
||||
public const int Delay_Discharge_OC1 = 5;
|
||||
public const int Delay_Charge_OC2 = 1;
|
||||
public const int Delay_Discharge_OC2 = 1;
|
||||
public const int Times_Charge_OC = 5;
|
||||
public const int Times_Discharge_OC = 5;
|
||||
|
||||
public const int Warn_Charge_UT = -5;
|
||||
public const int Protect_Charge_UT = -10;
|
||||
public const int Release_Charge_UT = -3;
|
||||
public const int Warn_Charge_OT = 60;
|
||||
public const int Protect_Charge_OT = 65;
|
||||
public const int Release_Charge_OT = 55;
|
||||
|
||||
public const int Warn_Discharge_UT = -20;
|
||||
public const int Protect_Discharge_UT = -25;
|
||||
public const int Release_Discharge_UT = -15;
|
||||
public const int Warn_Discharge_OT = 65;
|
||||
public const int Protect_Discharge_OT = 70;
|
||||
public const int Release_Discharge_OT = 60;
|
||||
|
||||
public const int Warn_Low_Capacity = 5;
|
||||
|
||||
public const int Warn_Env_UT = -20;
|
||||
public const int Protect_Env_UT = -25;
|
||||
public const int Release_Env_UT = -15;
|
||||
public const int Warn_Env_OT = 65;
|
||||
public const int Protect_Env_OT = 70;
|
||||
public const int Release_Env_OT = 60;
|
||||
}
|
||||
|
||||
public class ResetCommandFlag
|
||||
{
|
||||
public static readonly ushort SystemReset = 0x0001;
|
||||
public static readonly ushort LcdHistoryDelete = 0x0002;
|
||||
public static readonly ushort SystemResetAll = 0x0003;
|
||||
}
|
||||
|
||||
public class Eltek_Data
|
||||
{
|
||||
public static readonly ushort MD_BASE_REG = 4000;
|
||||
public static readonly ushort MD_OFFSET = 400;
|
||||
|
||||
public static readonly ushort OpDataRegAddr = 0;
|
||||
public static readonly ushort OpDataRegSize = 15;
|
||||
public static readonly ushort ParaDataRegAddr = 200;
|
||||
public static readonly ushort ParaDataRegSize = 71;
|
||||
|
||||
public static ushort GetOpDataRegAddr(int mID)
|
||||
{
|
||||
return (ushort)(MD_BASE_REG + (MD_OFFSET * mID) + OpDataRegAddr);
|
||||
}
|
||||
public static ushort GetParamDataRegAddr(int mID)
|
||||
{
|
||||
return (ushort)(MD_BASE_REG + (MD_OFFSET * mID) + ParaDataRegAddr);
|
||||
}
|
||||
}
|
||||
public class CRC_Data
|
||||
{
|
||||
public static readonly byte[] auchCRCHi =
|
||||
{
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
|
||||
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
|
||||
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
|
||||
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
|
||||
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
|
||||
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
|
||||
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
|
||||
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
|
||||
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40
|
||||
};
|
||||
|
||||
public static readonly byte[] auchCRCLo =
|
||||
{
|
||||
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
|
||||
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
|
||||
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
|
||||
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
|
||||
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
|
||||
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
|
||||
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
|
||||
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
|
||||
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
|
||||
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
|
||||
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
|
||||
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
|
||||
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
|
||||
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
|
||||
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
|
||||
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
|
||||
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,0x40
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
1016
LFP_Manager/DataStructure/csDataStructure.cs
Normal file
1016
LFP_Manager/DataStructure/csDataStructure.cs
Normal file
File diff suppressed because it is too large
Load Diff
165
LFP_Manager/DataStructure/csDbConstData.cs
Normal file
165
LFP_Manager/DataStructure/csDbConstData.cs
Normal file
@@ -0,0 +1,165 @@
|
||||
using System;
|
||||
|
||||
namespace LFP_Manager.DataStructure
|
||||
{
|
||||
internal static class DbConstData
|
||||
{
|
||||
// ============================== //
|
||||
// DB 정의 (SQLite)
|
||||
// ============================== //
|
||||
public static class Database
|
||||
{
|
||||
// 오타 수정: AlamrHistory → AlarmHistory
|
||||
public const string FileName = @"\db\AlarmHistory.db";
|
||||
public const string TableName = "TAlarmHistory";
|
||||
|
||||
// NOTE:
|
||||
// - SQLite 권장 타입(TEXT/INTEGER/REAL) 사용
|
||||
// - 마지막 콤마 제거
|
||||
// - IF NOT EXISTS 추가
|
||||
// - 자동 증가 PK(Id) 추가
|
||||
public static readonly string CreateTable = $@"
|
||||
CREATE TABLE IF NOT EXISTS {TableName} (
|
||||
Id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
create_date TEXT NOT NULL,
|
||||
alarm_code INTEGER,
|
||||
alarm_status INTEGER,
|
||||
alarm_cname TEXT,
|
||||
alarm_sname TEXT,
|
||||
module_no INTEGER,
|
||||
ct_no INTEGER,
|
||||
alarm_param_1 REAL,
|
||||
alarm_param_2 REAL,
|
||||
alarm_param_3 REAL
|
||||
);";
|
||||
|
||||
public static readonly string CreateIndexes = $@"
|
||||
CREATE INDEX IF NOT EXISTS IX_{TableName}_create_date ON {TableName}(create_date);
|
||||
CREATE INDEX IF NOT EXISTS IX_{TableName}_create_date_alarm_code ON {TableName}(create_date, alarm_code);
|
||||
CREATE INDEX IF NOT EXISTS IX_{TableName}_create_date_module_no ON {TableName}(create_date, module_no);
|
||||
-- 선택: 코드/상태/모듈 단독 인덱스(필요할 때만)
|
||||
-- CREATE INDEX IF NOT EXISTS IX_{TableName}_alarm_code ON {TableName}(alarm_code);
|
||||
-- CREATE INDEX IF NOT EXISTS IX_{TableName}_alarm_status ON {TableName}(alarm_status);
|
||||
-- CREATE INDEX IF NOT EXISTS IX_{TableName}_module_no ON {TableName}(module_no);
|
||||
";
|
||||
}
|
||||
|
||||
// ============================== //
|
||||
// Alarm 코드 정의 (enum)
|
||||
// - 추가하신 15~18 포함
|
||||
// - 기존 숫자값 유지 (호환성)
|
||||
// ============================== //
|
||||
public enum Alarm
|
||||
{
|
||||
CELL_UNDER_VOLTAGE = 0,
|
||||
CELL_OVER_VOLTAGE = 1,
|
||||
UNDER_VOLTAGE = 2,
|
||||
OVER_VOLTAGE = 3, // 오타 수정: VOLTAGAE → VOLTAGE
|
||||
CHARGE_OVER_TEMPERATURE = 4,
|
||||
DISCHARGE_OVER_TEMPERATURE = 5,
|
||||
CHARGE_LOW_TEMPERATURE = 6,
|
||||
DISCHARGE_LOW_TEMPERATURE = 7,
|
||||
CHARGE_OVER_CURRENT = 8,
|
||||
DISCHARGE_OVER_CURRENT = 9,
|
||||
LOW_SOC = 10,
|
||||
LOW_SOH = 11,
|
||||
CELL_VOLTAGE_DIFF = 12,
|
||||
SHORT_CIRCUIT = 13,
|
||||
COMM_FAIL = 14,
|
||||
MOSFET_OVER_TERMPERATURE = 15,
|
||||
|
||||
CB_OFF = 16,
|
||||
|
||||
VOLTAGE_MEASUREMENT_ERROR = 17, // 신규
|
||||
TEMPERATURE_MEASUREMENT_ERROR = 18, // 신규
|
||||
BATTERY_CELL_UNBALANCE = 19, // 신규
|
||||
EMERGENCY_ALARM = 20, // 신규
|
||||
|
||||
STS_STAND_BY = 21,
|
||||
STS_CHARGING = 22, // 오타 수정: CHARING → CHARGING
|
||||
STS_DISCHARGING = 23,
|
||||
STS_PROTECTED = 24,
|
||||
STS_PRE_CHARGING = 25,
|
||||
STS_UNKNOWN = 30,
|
||||
START = 31,
|
||||
STOP = 32,
|
||||
}
|
||||
|
||||
// index = 코드
|
||||
private static readonly string[] AlarmNames =
|
||||
{
|
||||
/* 0 */ "CELL UNDER VOLTAGE",
|
||||
/* 1 */ "CELL OVER VOLTAGE",
|
||||
/* 2 */ "UNDER VOLTAGE",
|
||||
/* 3 */ "OVER VOLTAGE",
|
||||
/* 4 */ "CHARGE OVER TEMPERATURE",
|
||||
/* 5 */ "DISCHARGE OVER TEMPERATURE",
|
||||
/* 6 */ "CHARGE LOW TEMPERATURE",
|
||||
/* 7 */ "DISCHARGE LOW TEMPERATURE",
|
||||
/* 8 */ "CHARGE OVER CURRENT",
|
||||
/* 9 */ "DISCHARGE OVER CURRENT",
|
||||
/* 10 */ "LOW SOC",
|
||||
/* 11 */ "LOW SOH",
|
||||
/* 12 */ "CELL VOLTAGE DIFFERENCE",
|
||||
/* 13 */ "SHORT CIRCUIT",
|
||||
/* 14 */ "COMM FAIL",
|
||||
/* 15 */ "MOSFET OVER TEMPERATURE",
|
||||
/* 16 */ "CIRCUIT BREAKER OFF",
|
||||
/* 17 */ "VOLTAGE MEASUREMENT ERROR",
|
||||
/* 18 */ "TEMPERATURE MEASUREMENT ERROR",
|
||||
/* 19 */ "BATTERY CELL UNBALANCE",
|
||||
/* 20 */ "EMERGENCY ALARM",
|
||||
/* 21 */ "STAND BY",
|
||||
/* 22 */ "CHARGING",
|
||||
/* 23 */ "DISCHARGING",
|
||||
/* 24 */ "PROTECTED",
|
||||
/* 25 */ "PRE-CHARGING",
|
||||
/* 26 */ "RESERVED",
|
||||
/* 27 */ "RESERVED",
|
||||
/* 28 */ "RESERVED",
|
||||
/* 29 */ "RESERVED",
|
||||
/* 30 */ "UNKNOWN",
|
||||
/* 31 */ "START",
|
||||
/* 32 */ "STOP",
|
||||
};
|
||||
|
||||
// 기존 상수 ALARM_NAME_SIZE는 실제 길이와 어긋나므로 제거 권장.
|
||||
// 필요하시면 아래 프로퍼티로 대체하세요.
|
||||
public static int AlarmNameCount => AlarmNames.Length;
|
||||
|
||||
public static string GetAlarmName(int code)
|
||||
=> (code >= 0 && code < AlarmNames.Length) ? AlarmNames[code] : $"UNKNOWN({code})";
|
||||
|
||||
public static string GetAlarmName(Alarm code) => GetAlarmName((int)code);
|
||||
|
||||
// ============================== //
|
||||
// Flag 정의 (enum)
|
||||
// ============================== //
|
||||
public enum Flag
|
||||
{
|
||||
RELEASE = 0,
|
||||
WARNING = 1,
|
||||
PROTECT = 2,
|
||||
ERROR = 3,
|
||||
STS_CHANGED = 4,
|
||||
INFORMATION = 5,
|
||||
}
|
||||
|
||||
private static readonly string[] FlagNames =
|
||||
{
|
||||
"RELEASE",
|
||||
"WARNING",
|
||||
"PROTECT",
|
||||
"ERROR",
|
||||
"STATUS CHANGED",
|
||||
"INFORMATION",
|
||||
};
|
||||
|
||||
public static int FlagNameCount => FlagNames.Length;
|
||||
|
||||
public static string GetFlagName(int code)
|
||||
=> (code >= 0 && code < FlagNames.Length) ? FlagNames[code] : $"UNKNOWN({code})";
|
||||
|
||||
public static string GetFlagName(Flag code) => GetFlagName((int)code);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user