using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Threading; using System.Windows.Forms; using DevExpress.XtraCharts; using LFP_Manager.DataStructure; namespace LFP_Manager.Controls { public delegate void CommandEvent(int sId, int cmd, int index, int flag, ref DeviceParamData aParam, ref DeviceCalibration aCalib); public partial class ucMainStatus : DevExpress.XtraEditors.XtraUserControl { #region VARIABLES private CommConfig Config; private DeviceSystemTotalData SystemTotalData; private DeviceSystemData[] SystemData; private ucModuleMainHeader ModuleMainHeader; private ucModuleMainB[] ModuleMain; private DevExpress.XtraLayout.LayoutControlItem[] lcitemModuleMain; private DevExpress.XtraLayout.EmptySpaceItem[] emptySpaceItem; private int mQty; private double TotalVoltage; private double TotalCurrent; private double TotalTemperature; private double TotalSoc; private double TotalSoh; private bool active = false; public event CommandEvent OnCommand = null; #endregion #region CONSTRUCTORS public ucMainStatus() { InitializeComponent(); mQty = csConstData.SystemInfo.MAX_MODULE_SIZE; } #endregion public void UpdateMainConfig(ref CommConfig aConfig, ref DeviceSystemData[] mSystemData) { Config = aConfig; SystemData = mSystemData; mQty = Config.ModuleQty; LoadModuleMain(mQty); lcgbModuleMain.Invalidate(); } private void LoadModuleMain(int mQty) { lcModuleMain.Controls.Clear(); lcgbModuleMain.Items.Clear(); ModuleMainHeader = new ucModuleMainHeader(); ModuleMain = new ucModuleMainB[mQty]; lcitemModuleMain = new DevExpress.XtraLayout.LayoutControlItem[mQty + 1]; int empsize = csConstData.SystemInfo.MAX_MODULE_SIZE - mQty; if (empsize > 0) { emptySpaceItem = new DevExpress.XtraLayout.EmptySpaceItem[empsize]; } int tWidth = lcgbModuleMain.Size.Width; int tHeight = lcgbModuleMain.Size.Height; lcitemModuleMain[0] = new DevExpress.XtraLayout.LayoutControlItem { Control = ModuleMainHeader, Name = String.Format("lcitemModuleMainHeader"), Size = new Size(tWidth - 4, 30), Location = new Point(2, 2), TextVisible = false, Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0) }; int emp = 0; for (int i = 0; i < csConstData.SystemInfo.MAX_MODULE_SIZE; i++) { if (i < mQty) { ModuleMain[i] = new ucModuleMainB(Config, i + 1, ref SystemData[i]); ModuleMain[i].OnCommand += SetCmdEvent; lcitemModuleMain[i + 1] = new DevExpress.XtraLayout.LayoutControlItem { Control = ModuleMain[i], Name = String.Format("lcitemModuleMain_{0}", i + 1), Size = new Size(tWidth - 4, 60), Location = new Point(2, 2 + 30 + (i * 60)), TextVisible = false, Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0) }; } else { emptySpaceItem[emp] = new DevExpress.XtraLayout.EmptySpaceItem { Size = new Size(tWidth - 4, 60), Location = new Point(2, 2 + 30 + (i * 60)) }; emp++; } } lcModuleMain.Controls.Add(ModuleMainHeader); for (int i = 0; i < csConstData.SystemInfo.MAX_MODULE_SIZE; i++) { if (i < mQty) lcModuleMain.Controls.Add(ModuleMain[i]); } DevExpress.XtraLayout.BaseLayoutItem[] abase = new DevExpress.XtraLayout.BaseLayoutItem[csConstData.SystemInfo.MAX_MODULE_SIZE + 1]; emp = 0; for (int i = 0; i < csConstData.SystemInfo.MAX_MODULE_SIZE + 1; i++) { if (i < (mQty + 1)) abase[i] = lcitemModuleMain[i]; else abase[i] = emptySpaceItem[emp++]; } lcgbModuleMain.Items.AddRange(abase); lcgbModuleMain.Invalidate(); } public void Start(ref CommConfig aConfig, ref DeviceSystemTotalData aSystemTotalData, ref DeviceSystemData[] aSystemData) { Config = aConfig; SystemTotalData = aSystemTotalData; SystemData = aSystemData; switch (Config.CommType) { case csConstData.CommType.COMM_UART_MULTI: mQty = Config.ModuleQty; break; default: mQty = Config.ModuleQty; break; } active = true; tmrDisplay.Enabled = true; } public void Stop() { active = false; tmrDisplay.Enabled = false; } public void UpdateData(ref DeviceSystemTotalData aSystemTotalData, ref DeviceSystemData[] aSystemData) { if (active) { SystemTotalData = aSystemTotalData; SystemData = aSystemData; //if (this.InvokeRequired) //{ // this.Invoke(new MethodInvoker(delegate () // { // //mQty = SystemTotalData.IdentData.ModuleQuantity; // LoadModuleMain(mQty); // OnCommand?.Invoke(0, 1, mQty, 1, ref Param, ref Calib); // })); //} //else //{ // //mQty = SystemTotalData.IdentData.ModuleQuantity; // LoadModuleMain(mQty); // OnCommand?.Invoke(0, 1, mQty, 1, ref Param, ref Calib); //} TotalVoltage = (double)SystemTotalData.ValueData.TotalVoltage / 10; TotalCurrent = (double)SystemTotalData.ValueData.TotalCurrent / 10; TotalSoc = (double)SystemTotalData.ValueData.TotalSOC / 10; TotalSoh = (double)SystemTotalData.ValueData.TotalSOH / 10; TotalTemperature = (double)SystemTotalData.ValueData.TotalTemp / 10; for (int i = 0; i < ModuleMain.Length; i++) { ModuleMain[i].UpdateData(ref SystemData[i]); } } } #region ON EVENT FUNCTION private void SetCmdEvent(int sId, int cmd, int index, int flag, ref DeviceParamData aParam, ref DeviceCalibration aCalib) { OnCommand?.Invoke(sId, cmd, index, flag, ref aParam, ref aCalib); } #endregion #region BUTTON EVENT #endregion #region TIMER EVENT private void tmrDisplay_Tick(object sender, EventArgs e) { DisplayTotalValue(); DisplayStatusAndAlarm(); } #endregion #region DISPLAY FUNCTION private void DisplayTotalValue() { if (active) { rtGraph.Text = String.Format("Real Time Graph - {0} - {1} Modules" , String.Format("V{0}", SystemTotalData.IdentData.FwVerStr) , Config.ModuleQty); dgTotalVoltage.Text = String.Format("{0:0.0}", TotalVoltage); dgTotalCurrent.Text = String.Format("{0:0.0}", TotalCurrent); dgTotalTemp.Text = String.Format("{0:0.0}", TotalTemperature); dgTotalSOC.Text = String.Format("{0:0.0}", TotalSoc); dgTotalSOH.Text = String.Format("{0:0.0}", TotalSoh); chartVI.Invalidate(); } } private void DisplayStatusAndAlarm() { if (SystemTotalData.CommFail == false) { // Operating Status if (SystemTotalData.StatusData.status == 0) { lbStatus.Text = "STANDBY"; lbStatus.ForeColor = System.Drawing.Color.Black; } else if (SystemTotalData.StatusData.status == 1) { lbStatus.Text = "CHARGING"; lbStatus.ForeColor = System.Drawing.Color.Blue; } else if (SystemTotalData.StatusData.status == 2) { lbStatus.Text = "DISCHARGING"; lbStatus.ForeColor = System.Drawing.Color.Magenta; } else if (SystemTotalData.StatusData.status == 3) { lbStatus.Text = "FLOATING"; lbStatus.ForeColor = System.Drawing.Color.Black; } else { lbStatus.Text = "UNKNOWN"; lbStatus.ForeColor = System.Drawing.Color.Black; } // Alarm Display switch (SystemTotalData.StatusData.batteryStatus) { case 0: // NORMAL lbAlarm.Text = "NORMAL"; lbAlarm.ForeColor = System.Drawing.Color.Green; break; case 1: // WARNING lbAlarm.Text = "NORMAL"; lbAlarm.ForeColor = System.Drawing.Color.Green; break; case 2: // FAULT lbAlarm.Text = "NORMAL"; lbAlarm.ForeColor = System.Drawing.Color.Green; break; case 3: // WARMING UP lbAlarm.Text = "WARMING UP"; lbAlarm.ForeColor = System.Drawing.Color.Green; break; case 4: // FAULT (Anti-Theft Comm.) lbAlarm.Text = "FAULT (Anti-Theft)"; lbAlarm.ForeColor = System.Drawing.Color.Green; break; case 5: // FAULT (Anti-Theft Gyro-Scope) lbAlarm.Text = "FAULT (Anti-Theft)"; lbAlarm.ForeColor = System.Drawing.Color.Green; break; default: lbAlarm.Text = string.Format("UNKNOWN ({0})", SystemTotalData.StatusData.batteryStatus); lbAlarm.ForeColor = System.Drawing.Color.Red; break; } } else { lbStatus.Text = "OFF-LINE"; lbStatus.ForeColor = System.Drawing.Color.Red; lbAlarm.Text = "OFF-LINE"; lbAlarm.ForeColor = System.Drawing.Color.Red; } } #endregion } }