Files
JP_KDDI_LFPS_48100/LFP_Manager/Controls/ucShelfStatus.cs
2025-12-19 13:59:34 +09:00

1402 lines
60 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Linq;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraCharts;
using LFP_Manager.Forms;
using LFP_Manager.DataStructure;
using LFP_Manager.Utils;
using DevExpress.Utils.Text;
namespace LFP_Manager.Controls
{
public delegate void paramCommand(int sId, int mode, int index, int flag,
ref CsDeviceData.DeviceModuleData.DeviceParamData aParam,
ref CsDeviceData.DeviceModuleData.DeviceCalibration aCalib);
public partial class ucShelfStatus : DevExpress.XtraEditors.XtraUserControl
{
#region CONSTDATA
const int STATUS_QTY = 10;
#endregion
#region VARIABLES
int ModuleID = 1;
bool start = false;
CommConfig Config;
CsDeviceData.DeviceModuleData[] ModuleData;
DataTable[] dtVolt;
DataTable[] dtTemp;
Series[] seriesVolt;
Series[] seriesTemp;
Palette paletteV;
Palette paletteT;
public event paramCommand OnCommand = null;
public event SendDataUartEvent OnSendUartData = null;
#endregion
#region CONSTRUCTORS
public ucShelfStatus()
{
InitializeComponent();
}
#endregion
#region PROPERTIES
public void UpdateSystemId(int mID)
{
ModuleID = mID;
}
public void Start(int mID, ref CommConfig aConfig, ref CsDeviceData.DeviceModuleData[] mData)
{
ModuleID = mID;
Config = aConfig;
ModuleData = mData;
switch (Config.CommType)
{
case csConstData.CommType.COMM_UART:
btnParam.Text = "Param";
btnParam.Enabled = true;
btnCalib.Enabled = true;
btnCalib.Text = "Calib";
break;
case csConstData.CommType.COMM_RS485:
btnParam.Text = "Information";
btnParam.Enabled = true;
btnCalib.Enabled = true;
btnCalib.Text = "Calib";
break;
case csConstData.CommType.COMM_SNMP:
btnParam.Text = "Information";
btnParam.Enabled = true;
btnCalib.Enabled = false;
btnCalib.Text = "";
break;
default:
break;
}
InitDataTableVolt();
InitDataTableTemp();
vSeriesInit();
tSeriesInit();
tmrDisplay.Start();
start = true;
}
public void Stop()
{
start = false;
tmrDisplay.Stop();
}
public void ModuleIDSet(int mID)
{
ModuleID = mID;
}
public int ModuleIDGet()
{
return ModuleID;
}
public void UpdateData(CsDeviceData.DeviceModuleData[] mData)
{
ModuleData = mData;
}
#endregion
#region INIT_COMPONENT
private void InitDataTableVolt()
{
dtVolt = new DataTable[ModuleData[ModuleID - 1].cellQty];
for (int i = 0; i < dtVolt.Length; i++)
{
dtVolt[i] = new DataTable();
dtVolt[i].Columns.Add("C_No", typeof(Int32));
dtVolt[i].Columns.Add("Alarm", typeof(Int32));
dtVolt[i].Columns.Add("Value", typeof(double));
// Add data rows to the table.
DataRow row = null;
row = dtVolt[i].NewRow();
row["C_No"] = i + 1;
row["Alarm"] = 0;
row["Value"] = 3.2;
dtVolt[i].Rows.Add(row);
}
}
private void InitDataTableTemp()
{
dtTemp = new DataTable[ModuleData[ModuleID - 1].tempQty];
for (int i = 0; i < dtTemp.Length; i++)
{
dtTemp[i] = new DataTable();
dtTemp[i].Columns.Add("T_No", typeof(Int32));
dtTemp[i].Columns.Add("Alarm", typeof(Int32));
dtTemp[i].Columns.Add("Value", typeof(double));
// Add data rows to the table.
DataRow row = null;
row = dtTemp[i].NewRow();
row["T_No"] = i + 1;
row["Alarm"] = 0;
row["Value"] = 25.4;
dtTemp[i].Rows.Add(row);
}
}
private Palette vPaletteInit(string bName, short bValue)
{
paletteV = new Palette(bName);
for (int i = 0; i < dtVolt.Length; i++)
{
if (((bValue >> i) & 0x0001) == 0x0001)
paletteV.Add(Color.Orange);
else
paletteV.Add(Color.Green);
}
return paletteV;
}
private void vPaletteUpdate(ushort bValue)
{
paletteV.Clear();
for (int i = 0; i < dtVolt.Length; i++)
{
if (((bValue >> i) & 0x0001) == 0x0001)
paletteV.Add(Color.Orange);
else
paletteV.Add(Color.Green);
}
}
private Palette tPaletteInit(string bName, short bValue)
{
paletteT = new Palette(bName);
for (int i = 0; i < dtTemp.Length; i++)
{
if (((bValue >> i) & 0x0001) == 0x0001)
paletteT.Add(Color.Orange);
else
paletteT.Add(Color.Green);
}
return paletteT;
}
private void tPaletteUpdate(short bValue)
{
paletteT.Clear();
for (int i = 0; i < dtTemp.Length; i++)
{
if (((bValue >> i) & 0x0001) == 0x0001)
paletteT.Add(Color.Orange);
else
paletteT.Add(Color.Green);
}
}
private void vSeriesInit()
{
VChart.Series.Clear();
VChart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
seriesVolt = new Series[ModuleData[ModuleID - 1].cellQty];
for (int i = 0; i < seriesVolt.Length; i++)
{
seriesVolt[i] = new Series(String.Format("C_{0:00}", i + 1), ViewType.Bar)
{
DataSource = dtVolt[i],
//Label.PointOptions.PointView = PointView.ArgumentAndValues,
//Label.PointOptions.ValueNumericOptions.Format = NumericFormat.Number,
//Label.PointOptions.ValueNumericOptions.Precision = 3,
CrosshairLabelPattern = "C_{A:00} : {V:F3}",
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.Numerical,
ArgumentDataMember = "C_No",
ValueScaleType = ScaleType.Numerical,
};
((SideBySideBarSeriesView)(seriesVolt[i].View)).BarWidth = 10.0;
seriesVolt[i].ValueDataMembers.AddRange(new string[] { "Value" });
VChart.Series.Add(seriesVolt[i]);
}
VChart.PaletteRepository.Clear();
VChart.PaletteRepository.Add("V Palette", vPaletteInit("V Palette", 0));
VChart.PaletteName = "V Palette";
// Cast the chart's diagram to the XYDiagram type, to access its axes.
XYDiagram diagram = (XYDiagram)VChart.Diagram;
if (diagram.AxisY.ConstantLines.Count > 0)
diagram.AxisY.ConstantLines.Clear();
// Create a constant line.
ConstantLine constantLineMax = new ConstantLine("Limit(Max)");
ConstantLine constantLineMin = new ConstantLine("Limit(Min)");
ConstantLine constantDataMax = new ConstantLine(
String.Format(" Max({0:#0.000}V:{1:00})", 0, 0));
ConstantLine constantDataAvg = new ConstantLine(
String.Format(" Avg({0:#0.000}V) - ({1:#0.000}V)", 0, 0));
ConstantLine constantDataMin = new ConstantLine(
String.Format("Min({0:#0.000}V:{1:00})", 0, 0));
constantLineMax.Color = Color.Red;
constantLineMin.Color = Color.Red;
// Customize the behavior of the constant line.
constantLineMax.Visible = true;
constantLineMax.ShowInLegend = true;
constantLineMax.LegendText = "Limit(Max)";
constantLineMax.ShowBehind = false;
constantLineMin.Visible = true;
constantLineMin.ShowInLegend = true;
constantLineMin.LegendText = "Limit(Min)";
constantLineMin.ShowBehind = false;
constantDataMax.Visible = true;
constantDataMax.ShowInLegend = true;
constantDataMax.LegendText = "Max";
constantDataMax.ShowBehind = false;
constantDataMax.Color = Color.MediumVioletRed;
constantDataMax.Title.TextColor = Color.Black;
constantDataMax.Title.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold);
constantDataAvg.Visible = true;
constantDataAvg.ShowInLegend = true;
constantDataAvg.LegendText = "Avg";
constantDataAvg.ShowBehind = false;
constantDataAvg.Color = Color.LawnGreen;
constantDataAvg.Title.TextColor = Color.Black;
constantDataAvg.Title.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold);
constantDataMin.Visible = true;
constantDataMin.ShowInLegend = true;
constantDataMin.LegendText = "Min";
constantDataMin.ShowBehind = false;
constantDataMin.Color = Color.BlueViolet;
constantDataMin.Title.TextColor = Color.Black;
constantDataMin.Title.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold);
// Define its axis value.
constantLineMax.AxisValue = 3.85;
constantLineMin.AxisValue = 2.5;
constantDataMax.AxisValue = 0;
constantDataAvg.AxisValue = 0;
constantDataMin.AxisValue = 0;
diagram.AxisY.ConstantLines.Add(constantLineMax);
diagram.AxisY.ConstantLines.Add(constantLineMin);
diagram.AxisY.ConstantLines.Add(constantDataMax);
diagram.AxisY.ConstantLines.Add(constantDataAvg);
diagram.AxisY.ConstantLines.Add(constantDataMin);
// Axis Y
diagram.AxisY.VisualRange.Auto = false;
diagram.AxisY.VisualRange.AutoSideMargins = false;
diagram.AxisY.VisualRange.StartSideMargin = 0;
diagram.AxisY.VisualRange.EndSideMargin = 0;
diagram.AxisY.VisualRange.MaxValue = 4.0;
diagram.AxisY.VisualRange.MinValue = 2.0;
diagram.AxisY.WholeRange.MaxValue = 4.0;
diagram.AxisY.WholeRange.MinValue = 2.0;
diagram.AxisY.NumericScaleOptions.AutoGrid = false;
diagram.AxisY.NumericScaleOptions.GridAlignment = NumericGridAlignment.Ones;
diagram.AxisY.NumericScaleOptions.GridOffset = 0;
diagram.AxisY.NumericScaleOptions.GridSpacing = 0.1;
//diagram.AxisY.GridSpacing = 0.1;
diagram.AxisY.Title.Text = "Voltage(V)";
//diagram.AxisY.Label.NumericOptions.Precision = 3;
diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
diagram.AxisY.Title.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
// Axis X
diagram.AxisX.VisualRange.MaxValue = seriesVolt.Length;
diagram.AxisX.VisualRange.MinValue = 1;
diagram.AxisX.VisualRange.Auto = false;
diagram.AxisX.VisualRange.AutoSideMargins = false;
diagram.AxisX.VisualRange.SideMarginsValue = 0.5;
diagram.AxisX.Title.Text = "Cell No";
diagram.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
diagram.AxisX.Title.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
}
private void tSeriesInit()
{
TChart.Series.Clear();
TChart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
seriesTemp = new Series[ModuleData[ModuleID - 1].tempQty];
for (int i = 0; i < seriesTemp.Length; i++)
{
seriesTemp[i] = new Series(String.Format("T_{0:00}", i + 1), ViewType.Bar)
{
DataSource = dtTemp[i],
//Label.PointOptions.PointView = PointView.ArgumentAndValues,
//Label.PointOptions.ValueNumericOptions.Format = NumericFormat.Number,
//Label.PointOptions.ValueNumericOptions.Precision = 3,
CrosshairLabelPattern = "T_{A:00} : {V:F1}",
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.Numerical,
ArgumentDataMember = "T_No",
ValueScaleType = ScaleType.Numerical,
};
((SideBySideBarSeriesView)(seriesTemp[i].View)).BarWidth = 2.5;
seriesTemp[i].ValueDataMembers.AddRange(new string[] { "Value" });
TChart.Series.Add(seriesTemp[i]);
}
TChart.PaletteRepository.Clear();
TChart.PaletteRepository.Add("T Palette", tPaletteInit("T Palette", 0));
TChart.PaletteName = "T Palette";
// Cast the chart's diagram to the XYDiagram type, to access its axes.
XYDiagram diagram = (XYDiagram)TChart.Diagram;
if (diagram.AxisY.ConstantLines.Count > 0)
diagram.AxisY.ConstantLines.Clear();
diagram.Margins.All = 0;
ConstantLine constantLineMax = new ConstantLine("Limit(Max)");
ConstantLine constantLineMin = new ConstantLine("Limit(Min)");
ConstantLine constantDataMax = new ConstantLine(String.Format(" Max({0:#0.0}C)", 0));
ConstantLine constantDataAvg = new ConstantLine(String.Format(" Avg({0:#0.0}C)", 0));
ConstantLine constantDataMin = new ConstantLine(String.Format("Min({0:#0.0}C)", 0));
constantLineMax.Color = Color.Red;
constantLineMin.Color = Color.Red;
// Customize the behavior of the constant line.
constantLineMax.Visible = true;
constantLineMax.ShowInLegend = true;
constantLineMax.LegendText = "Limit(Max)";
constantLineMax.ShowBehind = false;
constantLineMin.Visible = true;
constantLineMin.ShowInLegend = true;
constantLineMin.LegendText = "Limit(Min)";
constantLineMin.ShowBehind = false;
constantDataMax.Visible = true;
constantDataMax.ShowInLegend = true;
constantDataMax.LegendText = "Max";
constantDataMax.ShowBehind = false;
constantDataMax.Color = Color.MediumVioletRed;
constantDataMax.Title.TextColor = Color.Black;
constantDataMax.Title.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold);
constantDataAvg.Visible = true;
constantDataAvg.ShowInLegend = true;
constantDataAvg.LegendText = "Avg";
constantDataAvg.ShowBehind = false;
constantDataAvg.Color = Color.LawnGreen;
constantDataAvg.Title.TextColor = Color.Black;
constantDataAvg.Title.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold);
constantDataMin.Visible = true;
constantDataMin.ShowInLegend = true;
constantDataMin.LegendText = "Min";
constantDataMin.ShowBehind = false;
constantDataMin.Color = Color.BlueViolet;
constantDataMin.Title.TextColor = Color.Black;
constantDataMin.Title.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold);
// Define its axis value.
constantLineMax.AxisValue = 60.0;
constantLineMin.AxisValue = -20.0;
constantDataMax.AxisValue = 0;
constantDataAvg.AxisValue = 0;
constantDataMin.AxisValue = 0;
diagram.AxisY.ConstantLines.Add(constantLineMax);
diagram.AxisY.ConstantLines.Add(constantLineMin);
diagram.AxisY.ConstantLines.Add(constantDataMax);
diagram.AxisY.ConstantLines.Add(constantDataAvg);
diagram.AxisY.ConstantLines.Add(constantDataMin);
// Axis Y
diagram.AxisY.VisualRange.Auto = false;
diagram.AxisY.VisualRange.AutoSideMargins = false;
diagram.AxisY.VisualRange.StartSideMargin = 0;
diagram.AxisY.VisualRange.EndSideMargin = 0;
diagram.AxisY.VisualRange.MaxValue = 80.0;
diagram.AxisY.VisualRange.MinValue = -30.0;
diagram.AxisY.WholeRange.MaxValue = 80.0;
diagram.AxisY.WholeRange.MinValue = -30.0;
diagram.AxisY.NumericScaleOptions.AutoGrid = false;
diagram.AxisY.NumericScaleOptions.GridAlignment = NumericGridAlignment.Ones;
diagram.AxisY.NumericScaleOptions.GridOffset = 0;
diagram.AxisY.NumericScaleOptions.GridSpacing = 5;
diagram.AxisY.Title.Text = "Temperature(C)";
diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
diagram.AxisY.Title.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
// Axis X
diagram.AxisX.VisualRange.MaxValue = seriesTemp.Length;
diagram.AxisX.VisualRange.MinValue = 1;
diagram.AxisX.VisualRange.Auto = false;
diagram.AxisX.VisualRange.AutoSideMargins = false;
diagram.AxisX.VisualRange.SideMarginsValue = 0.5;
diagram.AxisX.Title.Text = "Temperature No";
diagram.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
diagram.AxisX.Title.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
}
#endregion
#region DISPLAY DATA
private void tmrDisplay_Tick(object sender, EventArgs e)
{
DisplayLevelMasking();
switch (Config.CommType)
{
case csConstData.CommType.COMM_UART:
DisplayDataUart();
break;
case csConstData.CommType.COMM_RS485:
DisplayDataRs485();
break;
case csConstData.CommType.COMM_SNMP:
DisplayDataSnmp();
break;
default:
break;
}
// 하위 컨트롤 업데이트
var idx = SafeModuleIndex();
FaultAlarmGroup.SetData(Config, ModuleData[idx]);
}
void DisplayLevelMasking()
{
switch (Config.CommType)
{
case csConstData.CommType.COMM_UART:
// UART Mode
switch (Config.ControlLevel)
{
case 0: // User Level
btnCalib.Text = "Calib";
btnCalib.Enabled = false;
break;
case 1: // Technician Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
case 2: // Engineer Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
case 3: // Master Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
default: // User Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
}
break;
case csConstData.CommType.COMM_RS485:
switch (Config.ControlLevel)
{
case 0: // User Level
btnCalib.Text = "Calib";
btnCalib.Enabled = false;
break;
case 1: // Technician Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
case 2: // Engineer Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
case 3: // Master Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
default: // User Level
btnCalib.Text = "Calib";
btnCalib.Enabled = true;
break;
}
break;
case csConstData.CommType.COMM_SNMP:
// SNMP Mode
btnCalib.Enabled = false;
btnCalib.Text = "";
break;
default:
break;
}
}
void DisplayDataUart()
{
if (start)
{
dgVoltage.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.voltage) / 10);
dgCurrent.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.current) / 10);
dgSOC.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.SOC) / 10);
dgSOH.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.SOH) / 10);
dgTemperature.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.maxTemp) / 10); //Byul 21.08.09 "maxTemp"
lbFetTemp.Text = String.Format(" FET: {0:##0.0}C", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.MosTemperature) / 10);
lbAmbTemp.Text = String.Format(" AMB: {0:##0.0}C", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.AmbTemperature) / 10);
//lbFetTemp.Text = String.Format(" FAULT: 0x{0:X4}", ModuleData[ModuleID - 1].StatusData.protection);
lbHeatbeat.Text = String.Format("Cycle: {0}", ModuleData[ModuleID - 1].ValueData.cycleCount);
DisplayCellVoltage();
DisplayCellTemperature();
DisplayInformationUart();
DisplayAlarmUart();
DisplayStatusStrUart();
DisplayAlarmStrUart();
}
}
void DisplayDataRs485()
{
if (start)
{
dgVoltage.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.voltage) / 10);
dgCurrent.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.current) / 10);
dgSOC.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.SOC) / 10);
dgSOH.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.SOH) / 10);
dgTemperature.Text = String.Format("{0:0.0}", Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.maxTemp) / 10); //Byul 21.08.09 "maxTemp"
lbFetTemp.Text = String.Format(@" AVG: {0:##0.0}C", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.MosTemperature) / 10);
lbAmbTemp.Text = String.Format(@" AMB: {0:##0.0}C", Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.AmbTemperature) / 10);
lbHeatbeat.Text = String.Format("Cycle: {0}", ModuleData[ModuleID - 1].ValueData.cycleCount);
//lbHeatbeat.Text = String.Format("Cycle: {0}", ModuleData[ModuleID - 1].MaxValue.MaxChgCurrent);
DisplayCellVoltage();
DisplayCellTemperature();
DisplayInformationRs485();
DisplayAlarmRs485();
DisplayStatusStrRs485();
DisplayAlarmStrRs485();
}
}
void DisplayDataSnmp()
{
if (start)
{
dgVoltage.Text = string.Format("{0:0.0}", Convert.ToDouble(ModuleData[0].ValueData.voltage) / 10);
dgCurrent.Text = string.Format("{0:0.0}", Convert.ToDouble(ModuleData[0].ValueData.current) / 10);
dgSOC.Text = string.Format("{0:0.0}", Convert.ToDouble(ModuleData[0].ValueData.SOC) / 10);
dgSOH.Text = string.Format("{0:0.0}", Convert.ToDouble(ModuleData[0].ValueData.SOH) / 10);
dgTemperature.Text = string.Format("{0:0.0}", Convert.ToDouble(ModuleData[0].AvgData.maxTemp) / 10); //Byul 21.08.09 "maxTemp"
lbFetTemp.Text = string.Format(" FET: {0:##0.0}C", Convert.ToDouble(ModuleData[0].ValueData.MosTemperature) / 10);
lbAmbTemp.Text = string.Format(" AMB: {0:##0.0}C", Convert.ToDouble(ModuleData[0].ValueData.AmbTemperature) / 10);
lbHeatbeat.Text = string.Format("Cycle: {0}", ModuleData[0].ValueData.cycleCount);
DisplayCellVoltage();
DisplayCellTemperature();
DisplayInformationUart();
DisplayAlarmSnmp();
DisplayStatusStrSnmp();
DisplayAlarmStrSnmp();
}
}
private void DisplayInformationUart()
{
string strInfor = string.Format("V: {0} - Model: {1} - SN: {2}"
, ModuleData[ModuleID - 1].Information.SwProductRev
, ModuleData[ModuleID - 1].Information.ModelName
, ModuleData[ModuleID - 1].Information.HwSerialNumber
);
gbValue.Text = "Value - " + strInfor;
}
private void DisplayInformationRs485()
{
string strInfor = string.Format("V: {0} - Model: {1} - SN: {2}"
, ModuleData[ModuleID - 1].Information.SwProductRev
, ModuleData[ModuleID - 1].Information.ModelName
, ModuleData[ModuleID - 1].Information.HwSerialNumber
);
gbValue.Text = "Value - " + strInfor;
}
private void DisplayInformationSnmp()
{
string strInfor = string.Format("V: {0} - Model: {1} ({2}) - SN: {3} ({4})"
, ModuleData[0].Information.SwProductRev
, ModuleData[0].Information.ModelName
, ModuleData[0].Information.ProductCode
, ModuleData[0].Information.HwSerialNumber
, ModuleData[0].Information.ManufacturingDate
);
gbValue.Text = "Value - " + strInfor;
}
private void DisplayCellVoltage()
{
try
{
for (int i = 0; i < seriesVolt.Length; i++)
dtVolt[i].Rows[0]["Value"] = Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.CellVoltage[i]) / 1000;
if (ModuleData[ModuleID - 1].StatusData.cellBallanceStatus != 0x0000)
vPaletteUpdate(ModuleData[ModuleID - 1].StatusData.cellBallanceStatus);
else
vPaletteUpdate(0);
double maxValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.maxCellVoltage) / 1000;
double avgValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.avgCellVoltage) / 1000;
double minValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.minCellVoltage) / 1000;
double gapValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.diffCellVoltage) / 1000;
int maxCno = Convert.ToInt32(ModuleData[ModuleID - 1].AvgData.maxCellNum);
int minCno = Convert.ToInt32(ModuleData[ModuleID - 1].AvgData.minCellNum);
// Cast the chart's diagram to the XYDiagram type, to access its axes.
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[2].Name =
String.Format(" Max({0:#0.000}V:{1:00})", maxValue, maxCno);
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[3].Name =
String.Format(" Avg({0:#0.000}V) - ({1:#0.000}V)", avgValue, gapValue);
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[4].Name =
String.Format("Min({0:#0.000}V:{1:00})", minValue, minCno);
// Define its axis value.
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[2].AxisValue = maxValue;
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[3].AxisValue = avgValue;
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[4].AxisValue = minValue;
//VChart.Legend.Visible = true;
//VChart.Titles[0].Text =
// String.Format("Voltage Status");
//VChart.Invalidate();
}
catch (Exception)
{
//MsgBox.ErrorShow(ex);
}
}
private void DisplayCellTemperature()
{
try
{
for (int i = 0; i < seriesTemp.Length; i++)
dtTemp[i].Rows[0]["Value"] = Convert.ToDouble(ModuleData[ModuleID - 1].ValueData.CellTemperature[i]) / 10;
double maxValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.maxTemp) / 10;
double avgValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.avgTemp) / 10;
double minValue = Convert.ToDouble(ModuleData[ModuleID - 1].AvgData.minTemp) / 10;
int maxCno = Convert.ToInt32(ModuleData[ModuleID - 1].AvgData.maxTempNum);
int minCno = Convert.ToInt32(ModuleData[ModuleID - 1].AvgData.minTempNum);
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[2].Name = String.Format(" Max({0:#0.0}C:{1:00})", maxValue, maxCno);
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[3].Name = String.Format(" Avg({0:#0.0}C)", avgValue);
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[4].Name = String.Format("Min({0:#0.0}C:{1:00})", minValue, minCno);
// Define its axis value.
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[2].AxisValue = maxValue;
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[3].AxisValue = avgValue;
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[4].AxisValue = minValue;
//TChart.Legend.Visible = true;
//TChart.Titles[0].Text =
// String.Format("Temperature Status");
}
catch (Exception)
{
//MsgBox.ErrorShow(ex);
}
}
private void DisplayStatusStrUart()
{
if (ModuleData[ModuleID - 1].CommFail == false)
{
if (ModuleData[ModuleID - 1].ShelfCommFail == false)
{
switch ((int)ModuleData[ModuleID - 1].StatusData.status)
{
case 0x0000: // Stand by
lbStatus.Text = "STANDBY";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
case 0x0001: // Charging
lbStatus.Text = "CHARGING";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x0002: // Discharging
lbStatus.Text = "DISCHARGING";
lbStatus.ForeColor = System.Drawing.Color.Magenta;
break;
case 0x0004: // TRIP
if ((ModuleData[ModuleID - 1].StatusData.specialAlarm & 0x0001) != 0)
{
lbStatus.Text = "PWR-OFF"; // "ANTI -THEFT (Comm.)";
lbStatus.ForeColor = Color.Red;
}
else if ((ModuleData[ModuleID - 1].StatusData.specialAlarm & 0x0002) != 0)
{
lbStatus.Text = "PWR-OFF"; // "ANTI -THEFT (Gyro)";
lbStatus.ForeColor = Color.Red;
}
else
{
lbStatus.Text = "TRIP";
lbStatus.ForeColor = Color.Red;
}
break;
case 0x0008: // Chg-Lmt
lbStatus.Text = "CHG-LIMIT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x8000: // Stand by - Heat
lbStatus.Text = "STANDBY-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x8001: // Charging
lbStatus.Text = "CHARGING-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x8002: // Discharging
lbStatus.Text = "DISCHARGING-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Magenta;
break;
case 0x8004: // TRIP
lbStatus.Text = "TRIP-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Red;
break;
case 0x8008: // Chg-Lmt
lbStatus.Text = "CHG-LIMIT-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
default:
lbStatus.Text = "UNKNOWN";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
}
}
else
{
lbStatus.Text = "COMM FAIL";
lbStatus.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbStatus.Text = "OFF LINE";
lbStatus.ForeColor = System.Drawing.Color.Red;
}
}
private void DisplayStatusStrUart124050()
{
if (ModuleData[ModuleID - 1].CommFail == false)
{
if (ModuleData[ModuleID - 1].ShelfCommFail == false)
{
switch ((int)ModuleData[ModuleID - 1].StatusData.status)
{
case 0x0000: // Stand by
lbStatus.Text = "STANDBY";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
case 0x0001: // Charging
lbStatus.Text = "CHARGING";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x0002: // Discharging
lbStatus.Text = "DISCHARGING";
lbStatus.ForeColor = System.Drawing.Color.Magenta;
break;
case 0x0004: // TRIP
if ((ModuleData[ModuleID - 1].StatusData.errorCode & 0x8000) != 0)
{
lbStatus.Text = "PWR-OFF"; // "ANTI -THEFT (Comm.)";
lbStatus.ForeColor = Color.Red;
}
else if ((ModuleData[ModuleID - 1].StatusData.errorCode & 0x4000) != 0)
{
lbStatus.Text = "PWR-OFF"; // "ANTI -THEFT (Gyro)";
lbStatus.ForeColor = Color.Red;
}
else
{
lbStatus.Text = "TRIP";
lbStatus.ForeColor = Color.Red;
}
break;
case 0x0008: // Chg-Lmt
lbStatus.Text = "CHG-LIMIT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x8000: // Stand by - Heat
lbStatus.Text = "STANDBY-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x8001: // Charging
lbStatus.Text = "CHARGING-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x8002: // Discharging
lbStatus.Text = "DISCHARGING-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Magenta;
break;
case 0x8004: // TRIP
lbStatus.Text = "TRIP-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Red;
break;
case 0x8008: // Chg-Lmt
lbStatus.Text = "CHG-LIMIT-HEAT";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
default:
lbStatus.Text = "UNKNOWN";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
}
}
else
{
lbStatus.Text = "COMM FAIL";
lbStatus.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbStatus.Text = "OFF LINE";
lbStatus.ForeColor = System.Drawing.Color.Red;
}
}
private void DisplayAlarmStrUart()
{
if (ModuleData[ModuleID - 1].CommFail == false)
{
if (ModuleData[ModuleID - 1].ShelfCommFail == false)
{
switch (ModuleData[ModuleID - 1].StatusData.batteryStatus)
{
case 0: // NORMAL
if ((ModuleData[ModuleID - 1].StatusData.specialAlarm & 0x0001) != 0)
{
lbAlarm.Text = "FAULT (Comm)";
lbAlarm.ForeColor = Color.Red;
}
else if ((ModuleData[ModuleID - 1].StatusData.specialAlarm & 0x0002) != 0)
{
lbAlarm.Text = "FAULT (GyroScope)";
lbAlarm.ForeColor = Color.Red;
}
else
{
if ((ModuleData[ModuleID - 1].StatusData.specialAlarm & 0x0004) != 0)
{
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
}
else
{
lbAlarm.Text = "NORMAL";
lbAlarm.ForeColor = System.Drawing.Color.Green;
}
}
break;
case 1: // WARNING
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
break;
case 2: // FAULT
lbAlarm.Text = "FAULT";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 3: // WARMING UP
lbAlarm.Text = "WARMING UP";
lbAlarm.ForeColor = System.Drawing.Color.Black;
break;
case 4: // FAULT (Anti-Theft GyroScope.)
lbAlarm.Text = "FAULT (GyroScope)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 5: // FAULT (Anti-Theft Gyro-Scope)
lbAlarm.Text = "FAULT (Comm)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
default:
lbAlarm.Text = string.Format("UNKNOWN ({0})", ModuleData[ModuleID - 1].StatusData.batteryStatus);
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
}
}
else
{
lbAlarm.Text = "COMM FAIL";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbAlarm.Text = "OFF LINE";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
private void DisplayAlarmStrUart124050()
{
if (ModuleData[ModuleID - 1].CommFail == false)
{
if (ModuleData[ModuleID - 1].ShelfCommFail == false)
{
switch (ModuleData[ModuleID - 1].StatusData.batteryStatus)
{
case 0: // NORMAL
if ((ModuleData[ModuleID - 1].StatusData.errorCode & 0x8000) != 0)
{
lbAlarm.Text = "FAULT (Comm)";
lbAlarm.ForeColor = Color.Red;
}
else if ((ModuleData[ModuleID - 1].StatusData.errorCode & 0x4000) != 0)
{
lbAlarm.Text = "FAULT (GyroScope)";
lbAlarm.ForeColor = Color.Red;
}
else
{
if ((ModuleData[ModuleID - 1].StatusData.specialAlarm & 0x4000) != 0)
{
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
}
else
{
lbAlarm.Text = "NORMAL";
lbAlarm.ForeColor = System.Drawing.Color.Green;
}
}
break;
case 1: // WARNING
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
break;
case 2: // FAULT
lbAlarm.Text = "FAULT";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 3: // WARMING UP
lbAlarm.Text = "WARMING UP";
lbAlarm.ForeColor = System.Drawing.Color.Black;
break;
case 4: // FAULT (Anti-Theft GyroScope.)
lbAlarm.Text = "FAULT (GyroScope)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 5: // FAULT (Anti-Theft Gyro-Scope)
lbAlarm.Text = "FAULT (Comm)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
default:
lbAlarm.Text = string.Format("UNKNOWN ({0})", ModuleData[ModuleID - 1].StatusData.batteryStatus);
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
}
}
else
{
lbAlarm.Text = "COMM FAIL";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbAlarm.Text = "OFF LINE";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
private void DisplayStatusStrRs485()
{
if (ModuleData[ModuleID - 1].CommFail == false)
{
if (ModuleData[ModuleID - 1].ShelfCommFail == false)
{
if ((ModuleData[ModuleID - 1].StatusData.batteryStatus == 4)
|| (ModuleData[ModuleID - 1].StatusData.batteryStatus == 5))
{
lbStatus.Text = "PWR-OFF";
lbStatus.ForeColor = Color.Red;
}
else
{
switch (ModuleData[ModuleID - 1].StatusData.status)
{
case 0x0000: // Stand by
lbStatus.Text = "STANDBY";
lbStatus.ForeColor = Color.Black;
break;
case 0x0001: // Charging
lbStatus.Text = "CHARGING";
lbStatus.ForeColor = Color.Blue;
break;
case 0x0002: // Discharging
lbStatus.Text = "DISCHARGING";
lbStatus.ForeColor = Color.Magenta;
break;
case 0x0004: // PROTECT
lbStatus.Text = "TRIP";
lbStatus.ForeColor = Color.Red;
break;
case 0x0008: // Charging Lmt
lbStatus.Text = "CHG-LIMIT";
lbStatus.ForeColor = Color.Blue;
break;
default:
lbStatus.Text = string.Format("UNKNOWN({0})", ModuleData[ModuleID - 1].StatusData.status);
lbStatus.ForeColor = Color.Black;
break;
}
}
}
else
{
lbStatus.Text = "COMM FAIL";
lbStatus.ForeColor = Color.Red;
}
}
else
{
lbStatus.Text = "OFF LINE";
lbStatus.ForeColor = Color.Red;
}
}
private void DisplayAlarmStrRs485()
{
if (ModuleData[ModuleID - 1].CommFail == false)
{
if (ModuleData[ModuleID - 1].ShelfCommFail == false)
{
switch (ModuleData[ModuleID - 1].StatusData.batteryStatus)
{
case 0: // NORMAL
lbAlarm.Text = "NORMAL";
lbAlarm.ForeColor = System.Drawing.Color.Green;
break;
case 1: // WARNING
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
break;
case 2: // FAULT
lbAlarm.Text = "FAULT";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 3: // WARMING UP
lbAlarm.Text = "WARMING UP";
lbAlarm.ForeColor = System.Drawing.Color.Black;
break;
case 4: // FAULT (Anti-Theft GyroScope.)
lbAlarm.Text = "FAULT (GyroScope)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 5: // FAULT (Anti-Theft Gyro-Scope)
lbAlarm.Text = "FAULT (Comm)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
default:
lbAlarm.Text = string.Format("UNKNOWN ({0})", ModuleData[ModuleID - 1].StatusData.batteryStatus);
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
}
}
else
{
lbAlarm.Text = "COMM FAIL";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbAlarm.Text = "OFF LINE";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
private void DisplayStatusStrSnmp()
{
if (ModuleData[0].CommFail == false)
{
if (ModuleData[0].ShelfCommFail == false)
{
if ((ModuleData[0].StatusData.batteryStatus == 4)
|| (ModuleData[0].StatusData.batteryStatus == 5))
{
lbStatus.Text = "PWR-OFF";
lbStatus.ForeColor = Color.Red;
}
else
{
switch (ModuleData[0].StatusData.status)
{
case 0x0000: // Stand by
lbStatus.Text = "STANDBY";
lbStatus.ForeColor = Color.Black;
break;
case 0x0001: // Charging
lbStatus.Text = "CHARGING";
lbStatus.ForeColor = Color.Blue;
break;
case 0x0002: // Discharging
lbStatus.Text = "DISCHARGING";
lbStatus.ForeColor = Color.Magenta;
break;
case 0x0004: // PROTECT
lbStatus.Text = "TRIP";
lbStatus.ForeColor = Color.Red;
break;
case 0x0008: // Charging Lmt
lbStatus.Text = "CHG-LIMIT";
lbStatus.ForeColor = Color.Blue;
break;
default:
lbStatus.Text = "UNKNOWN";
lbStatus.ForeColor = Color.Black;
break;
}
}
}
else
{
lbStatus.Text = "COMM FAIL";
lbStatus.ForeColor = Color.Red;
}
}
else
{
lbStatus.Text = "OFF LINE";
lbStatus.ForeColor = Color.Red;
}
}
private void DisplayAlarmStrSnmp()
{
if (ModuleData[0].CommFail == false)
{
if (ModuleData[0].ShelfCommFail == false)
{
switch (ModuleData[0].StatusData.batteryStatus)
{
case 0: // NORMAL
lbAlarm.Text = "NORMAL";
lbAlarm.ForeColor = System.Drawing.Color.Green;
break;
case 1: // WARNING
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
break;
case 2: // FAULT
lbAlarm.Text = "FAULT";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 3: // WARMING UP
lbAlarm.Text = "WARMING UP";
lbAlarm.ForeColor = System.Drawing.Color.Black;
break;
case 4: // FAULT (Anti-Theft GyroScope.)
lbAlarm.Text = "FAULT (GyroScope)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
case 5: // FAULT (Anti-Theft Gyro-Scope)
lbAlarm.Text = "FAULT (Comm)";
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
default:
lbAlarm.Text = string.Format("UNKNOWN ({0})", ModuleData[0].StatusData.batteryStatus);
lbAlarm.ForeColor = System.Drawing.Color.Red;
break;
}
}
else
{
lbAlarm.Text = "COMM FAIL";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbAlarm.Text = "OFF LINE";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
private void DisplayAlarmUart()
{
}
private void DisplayAlarmRs485()
{
}
private void DisplayAlarmSnmp()
{
}
#endregion
#region BUTTON EVENT
private void btnParam_Click(object sender, EventArgs e)
{
switch (Config.CommType)
{
case csConstData.CommType.COMM_UART:
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == "fmxParamConfig")
{
frm.Activate();
return;
}
}
fmxParamConfig ParamConfigForm = new fmxParamConfig(ModuleID, Config, ModuleData[ModuleID - 1].ParamData);
ParamConfigForm.OnUpdate += UpdateParam;
ParamConfigForm.OnCommand += ParamSetCmd;
ParamConfigForm.Show();
break;
case csConstData.CommType.COMM_RS485:
FmxInformation InformationForm1 = new FmxInformation(ModuleID, Config, ref ModuleData[ModuleID - 1]);
InformationForm1.ShowDialog();
break;
case csConstData.CommType.COMM_SNMP:
FmxInformation InformationForm2 = new FmxInformation(ModuleID, Config, ref ModuleData[ModuleID - 1]);
InformationForm2.ShowDialog();
break;
default:
break;
}
}
private void btnCalibration_Click(object sender, EventArgs e)
{
switch (Config.CommType)
{
case csConstData.CommType.COMM_UART:
fmxCalibration CalibrationForm =
new fmxCalibration(ModuleID, Config, ModuleData[ModuleID - 1].ParamData, ModuleData[ModuleID - 1].CalibrationData);
CalibrationForm.OnUpdate += UpdateCalibration;
CalibrationForm.OnCommand += ParamSetCmd;
CalibrationForm.ShowDialog();
break;
case csConstData.CommType.COMM_RS485:
fmxAntiTheft AntiTheftForm = new fmxAntiTheft(ModuleID, ModuleData[ModuleID - 1].CalibrationData);
AntiTheftForm.OnUpdate += UpdateCalibrationRS485;
AntiTheftForm.OnCommand += AntiTheftSetCmd; // OnSendUartData
AntiTheftForm.OnSendUartData += OnSendUartData;
AntiTheftForm.ShowDialog();
break;
case csConstData.CommType.COMM_SNMP:
break;
}
}
#endregion
#region CONTROL EVENT FUNCTION
private void UpdateParam(object sendor)
{
((fmxParamConfig)sendor).UpdateData(ModuleData[ModuleID - 1].ParamData, ModuleData[ModuleID - 1].CalibrationData);
}
private void UpdateCalibration(object sendor)
{
((fmxCalibration)sendor).UpdateData(ModuleData[ModuleID - 1].ParamData, ModuleData[ModuleID - 1].CalibrationData, ModuleData[ModuleID - 1]);
}
private void UpdateCalibrationRS485(object sendor)
{
((fmxAntiTheft)sendor).UpdateData(ModuleData[ModuleID - 1].ParamData, ModuleData[ModuleID - 1].CalibrationData, ModuleData[ModuleID - 1]);
}
private void ParamSetCmd(int mID, int mode, int index, int flag,
ref CsDeviceData.DeviceModuleData.DeviceParamData aParam,
ref CsDeviceData.DeviceModuleData.DeviceCalibration aCalib)
{
OnCommand?.Invoke(mID, mode, index, flag, ref aParam, ref aCalib);
}
// RS485 Control Function
private void AntiTheftSetCmd(int mID, int mode, int index, int flag,
ref CsDeviceData.DeviceModuleData.DeviceParamData aParam,
ref CsDeviceData.DeviceModuleData.DeviceCalibration aCalib)
{
OnCommand?.Invoke(mID, mode, index, flag, ref aParam, ref aCalib);
}
#endregion
#region HELPERS
private int SafeModuleIndex()
{
// ModuleId는 1-based로 보이므로 내부 인덱스는 0-based
int idx = Math.Max(0, ModuleID - 1);
if (ModuleData == null || ModuleData.Length == 0) return 0;
if (idx >= ModuleData.Length) idx = 0;
return idx;
}
private ref CsDeviceData.DeviceModuleData GetModule()
{
int idx = SafeModuleIndex();
return ref ModuleData[idx];
}
#endregion
}
}