common/Ui/MagFluxToolBox/FrmSetup.cs
2026-04-23 17:50:07 +02:00

422 lines
15 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
using Xylem.Common.CommonCore.Consts;
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
using Xylem.Common.Hardware.Interfaces.Ports.SerialPorts;
using Xylem.Common.Utils.Logging;
namespace Xylem.Common.Ui.MagFluxToolBox
{
/// <summary>
/// Setup of GTB
/// </summary>
public partial class FrmSetup : Form
{
private const String RequestPortString = "RequestPort";
private const String StreamingPortString = "StreamingPort";
private const String SlotString = "Slot";
private const String ValueString = "Value";
private const String TextString = "Text";
private String _fileString;
private readonly String _serialConfigFile;
private readonly DataTable _slotConfigDataTable = new DataTable();
/// <summary>
/// Ctor
/// </summary>
public FrmSetup()
{
_serialConfigFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"MagFlux", ProgramConfig.SerialConfigFileName);
//build header of data table for reference by name
_slotConfigDataTable.Columns.Add(SlotString, typeof(String));
_slotConfigDataTable.Columns.Add(StreamingPortString, typeof(String));
_slotConfigDataTable.Columns.Add(RequestPortString, typeof(String));
InitializeComponent();
cbxSlot.Name = SlotString;
cbxRequestPort.Name = RequestPortString;
cbxStreamingPort.Name = StreamingPortString;
cbxSlot.HeaderText = SlotString;
cbxRequestPort.HeaderText = RequestPortString;
cbxStreamingPort.HeaderText = StreamingPortString;
LoadFromFile();
}
private void BtnReload_Click(Object sender, EventArgs e)
{
LoadFromFile();
}
private void BtnStore_Click(Object sender, EventArgs e)
{
StoreToPc();
}
private void StoreToPc()
{
var newFileContent = new List<SlotConfig>();
for (var row = 0; row < dgvConfig.Rows.Count; row++)
{
var slotStr = (String)dgvConfig.Rows[row].Cells[SlotString].Value;
int.TryParse(slotStr, out var slot);
var requestPort = new PortConfig()
{
PortName = (String)dgvConfig.Rows[row].Cells[RequestPortString].Value,
Type = typeof(UartSerialPort).FullName
};
var streamingPort = new PortConfig()
{
PortName = (String)dgvConfig.Rows[row].Cells[StreamingPortString].Value,
Type = typeof(UartSerialPort).FullName
};
if (!string.IsNullOrEmpty(slotStr))
{
newFileContent.Add(new SlotConfig()
{
Slot = slot, Request = requestPort, Streaming = streamingPort
});
}
}
var text = JsonConvert.SerializeObject(newFileContent);
// Overwrite only on changed content
if (text == _fileString)
{
LoadFromFile();
return;
}
//save file only on changed content
if (File.Exists(_serialConfigFile))
{
var backupSerialConfigFile = $"{Path.GetDirectoryName(_serialConfigFile)}" +
$"\\Backup_{DateTime.Now:yyyyMMdd}_{DateTime.Now:HHmmss}" +
$"_{ProgramConfig.SerialConfigFileName}";
File.Move(_serialConfigFile, backupSerialConfigFile);
}
File.WriteAllText(_serialConfigFile, text);
LoadFromFile();
}
private void LoadFromFile()
{
_slotConfigDataTable.Clear();
dgvConfig.Rows.Clear();
if (!File.Exists(_serialConfigFile))
{
return;
}
SlotConfig[] meterConfigList;
using (var tr = new StreamReader(_serialConfigFile))
{
_fileString = tr.ReadToEnd();
meterConfigList = JsonConvert.DeserializeObject<SlotConfig[]>(_fileString);
}
foreach (var item in meterConfigList)
{
var row = _slotConfigDataTable.NewRow();
row[SlotString] = item.Slot;
row[RequestPortString] = item.Request.PortName;
row[StreamingPortString] = item.Streaming.PortName;
_slotConfigDataTable.Rows.Add(row);
}
foreach (DataRow row in _slotConfigDataTable.Rows)
{
dgvConfig.Rows.Add(AddRowToGrid(row));
}
}
private DataGridViewRow AddRowToGrid(DataRow row = null)
{
var newRow = new DataGridViewRow();
var slotCell = new DataGridViewTextBoxCell();
newRow.Cells.Add(slotCell);
var requestPortCell = new DataGridViewComboBoxCell
{
DataSource = GetPorts(),
DisplayMember = TextString,
ValueMember = ValueString
};
newRow.Cells.Add(requestPortCell);
var streamingPortCell = new DataGridViewComboBoxCell
{
DataSource = GetPorts(),
DisplayMember = TextString,
ValueMember = ValueString
};
newRow.Cells.Add(streamingPortCell);
if (row == null)
{
return newRow;
}
slotCell.Value = row[SlotString];
streamingPortCell.Value = row[StreamingPortString];
requestPortCell.Value = row[RequestPortString];
return newRow;
}
private DataTable GetPorts()
{
var ret = new DataTable();
ret.Columns.Add(ValueString);
ret.Columns.Add(TextString);
var portList = SerialPort.GetPortNames().ToList();
foreach (var item in portList)
{
ret.Rows.Add(item, item);
}
foreach (DataRow row in _slotConfigDataTable.Rows)
{
if (portList.All(pl => pl != (String)row[StreamingPortString]))
{
ret.Rows.Add(row[StreamingPortString].ToString(), BaseSerialPort.PortNotAssigned);
}
if (portList.All(pl => pl != (String)row[RequestPortString]))
{
ret.Rows.Add(row[RequestPortString].ToString(), BaseSerialPort.PortNotAssigned);
}
}
return ret;
}
private static DataTable GetTypes()
{
var ret = new DataTable();
ret.Columns.Add(ValueString);
ret.Columns.Add(TextString);
ret.Rows.Add(typeof(UartSerialPort).FullName, nameof(UartSerialPort));
//ret.Rows.Add(typeof(RfidSerialPort).FullName, nameof(RfidSerialPort));
//ret.Rows.Add(typeof(IrdaSerialPort).FullName, nameof(IrdaSerialPort));
return ret;
}
private ConcurrentBag<String> _countRawData = new ConcurrentBag<String>();
private void DgvConfig_CellContentClick(Object sender, DataGridViewCellEventArgs e)
{
//if (!dgvConfig.Columns[e.ColumnIndex].Name.Contains(StreamingDetectString) &&
// !dgvConfig.Columns[e.ColumnIndex].Name.Contains(RequestDetectString))
//{
// return;
//}
//StoreToPc();
//var slotString = (String)dgvConfig.Rows[e.RowIndex].Cells[SlotString].Value;
//int.TryParse(slotString, out var slot);
//using (var mb = new MeterBatch())
//{
// using (var meter = new GenesisMeter())
// {
// meter.SetupFromConfigFile(slot, false);
// mb.AddMeter(meter);
// const String checkMark = "\u2714";
// if (dgvConfig.Columns[e.ColumnIndex].Name.Contains(StreamingDetectString))
// {
// _countRawData = new ConcurrentBag<String>();
// meter.StreamingPort.OnRawRecordReceived += delegate (Object o, BasePortDataEventArgs rawMsg)
// {
// _countRawData.Add((String)rawMsg.GetData());
// };
// Thread.Sleep(500);
// if (_countRawData.Any())
// {
// var text = $"SUCCESS\nSlot: {slot}\nStreaming port: {meter.StreamingPort.GetPortName()}\n\n{checkMark}";
// MessageBox.Show(text, @"SUCCESS", MessageBoxButtons.OK);
// dgvConfig.Rows[e.RowIndex].Cells[StreamingDetectString].Style.BackColor = Color.Green;
// }
// else
// {
// var text = $"FAILED\nSlot: {slot}\nStreaming port: {meter.StreamingPort.GetPortName()}";
// MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error);
// dgvConfig.Rows[e.RowIndex].Cells[StreamingDetectString].Style.BackColor = Color.Red;
// }
// _countRawData = new ConcurrentBag<String>();
// }
// else
// {
// meter.Logout();
// var pcbId = meter.GetPcbId();
// if (string.IsNullOrEmpty(pcbId))
// {
// var text = $"FAILED\nSlot: {slot}\nRequest port: {meter.RequestPort.GetPortName()}";
// MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error);
// dgvConfig.Rows[e.RowIndex].Cells[RequestDetectString].Style.BackColor = Color.Red;
// }
// else
// {
// var text = $"SUCCESS\nSlot: {slot}\nRequest port: {meter.RequestPort.GetPortName()}\n\n{checkMark}";
// MessageBox.Show(text, @"SUCCESS", MessageBoxButtons.OK);
// dgvConfig.Rows[e.RowIndex].Cells[RequestDetectString].Style.BackColor = Color.Green;
// }
// }
// }
//}
}
private void dgvConfig_DataError(Object sender, DataGridViewDataErrorEventArgs e)
{
}
private void FrmSetup_Load(Object sender, EventArgs e)
{
}
private void tabPage4_Click(Object sender, EventArgs e)
{
try
{
var path = NLogHelper.GetCurrentApplicationFolder();
var a = XElement.Load(path);
lblLocalCurrentPath.Text = a.Elements().First(
s => s.Name.LocalName == "variable").Attributes().First(
s => s.Value == "BasePath").NextAttribute.Value;
}
catch (Exception ex)
{
lblLocalCurrentPath.Text = ex.Message;
}
try
{
var path = NLogHelper.GetApplicationDataPath();
var b = XElement.Load(path);
lblGlobalCurrentPath.Text = b.Elements().First(
s => s.Name.LocalName == "variable").Attributes().First(
s => s.Value == "BasePath").NextAttribute.Value;
}
catch (Exception ex)
{
lblGlobalCurrentPath.Text = ex.Message;
}
}
private void Add(String path, String newDest)
{
try
{
var a = XElement.Load(path);
var firstIsVariable = a.Elements().First();
if (firstIsVariable.Name.LocalName != "variable")
{
var newElm = new XElement("variable", null);
newElm.SetAttributeValue("name", "BasePath");
newElm.SetAttributeValue("value", newDest);
a.AddFirst(newElm);
}
else if (a.Elements().First(b => b.Name.LocalName == "variable").Attributes()
.All(s => s.Value != "BasePath"))
{
var newElm = new XElement("variable", null);
newElm.SetAttributeValue("name", "BasePath");
newElm.SetAttributeValue("value", newDest);
a.AddFirst(newElm);
}
else
{
a.Elements().First(b => b.Name.LocalName == "variable").Attributes()
.First(s => s.Value == "BasePath").NextAttribute.Value = newDest;
}
a.Save(path);
tabPage4_Click(this, null);
}
catch (Exception)
{
// ignore;
}
}
private void btnLocalDefaultLocal_Click(Object sender, EventArgs e)
{
Add(NLogHelper.GetCurrentApplicationFolder(), "C:\\MagFluxLog\\");
}
private void btnLocalDefaultLan_Click(Object sender, EventArgs e)
{
//Add(NLogHelper.GetCurrentApplicationFolder(), "\\\\sla12buma\\cordonelds$\\${machinename}");
}
private void btnGlobalDefaultLocal_Click(Object sender, EventArgs e)
{
Add(NLogHelper.GetApplicationDataPath(), "C:\\MagFluxLog\\");
}
private void btnGlobalDefaultLan_Click(Object sender, EventArgs e)
{
//Add(NLogHelper.GetApplicationDataPath(), "\\\\sla12buma\\cordonelds$\\${{machinename}}");
}
private void btnGlobalSearch_Click(Object sender, EventArgs e)
{
var dia = new FolderBrowserDialog();
dia.ShowDialog();
Add(NLogHelper.GetApplicationDataPath(), dia.SelectedPath);
}
private void btnLocalSearch_Click(Object sender, EventArgs e)
{
var dia = new FolderBrowserDialog();
dia.ShowDialog();
Add(NLogHelper.GetCurrentApplicationFolder(), dia.SelectedPath);
}
private void btnAddRow_Click(Object sender, EventArgs e)
{
dgvConfig.Rows.Add(AddRowToGrid());
}
}
}