422 lines
15 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|