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

259 lines
8.5 KiB
C#

using Logic.ProductionToProductMapper.Cordonel;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile;
using Xylem.Common.Logic.ProductionOrderCore.OrderData;
using Xylem.Common.Logic.SoftwareAccessHelper;
using Xylem.Common.Utils.Crc16Ccitt;
namespace Xylem.Common.Ui.GenesisToolBox
{
/// <summary>
/// FW update form
/// </summary>
public partial class FrmLutManagement : Form
{
#region Variables
private MeterLutUpdate _meterLutUpdate;
private String _lastFwUpdateState;
private Int32 _lastSingleProgress;
private DateTimeOffset _startTime;
private Boolean _resetTimeMeasurement;
private readonly Boolean _updateGui = true;
private Boolean _lutFileValid;
private Boolean _tryConnectPcb;
private Boolean _lutFileSuccessfulWritten;
private const String StrUpdateErrorMessage = "METROLOGY LOOKUP TABLE UPDATE FAILED!";
private const String StrUpdateSuccessMessage = "Metrology lookup table successfulley written!";
private const String StrLutFileInvalid = "LUT FILE INVALID";
private const String StrLutFileValid = "LUT file loaded";
private const String StrLutFileId = "GEN_LUT\0";
private const Int32 IndexLutFileId = 0;
private const Int32 LengthLutFileId = 8;
// data length, calculated from version field to the end of the data section
private const Int32 IndexDataLength = 8;
private const Int32 LengthDataLength = 4;
// CCITT-CRC-16 , calculated from version field to the end of the data section
private const Int32 IndexCrc = 12;
private const Int32 LengthCrc = 2;
// version
private const Int32 IndexVersion = 14;
private const Int32 LengthVersion = 2;
// meter size as enumeration
private const Int32 IndexMeterSize = 16;
// header size of file
private const Int32 LutFileHeaderLength = LengthLutFileId + LengthDataLength + LengthCrc + LengthVersion;
// data size of file
private const Int32 LutFileDataLength = 730;
// LUT file entire file size
private const Int32 SizeLutFile = LutFileHeaderLength + LutFileDataLength;
// external update remarks form
private readonly FrmHistory _frmHistory = new FrmHistory();
private readonly Version _version;
// status information
private static readonly Color ColorDefault = Color.Black;
private static readonly Color ColorSuccess = Color.Green;
private static readonly Color ColorProcessFailed = Color.Red;
private const String StrSeparator = "-----------------------------------------------------" +
"-----------------------------------------------------";
#endregion
/// <summary>
/// Ctor FW update
/// </summary>
public FrmLutManagement()
{
InitializeComponent();
var cultureInfo = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = cultureInfo;
_version = Assembly.GetExecutingAssembly().GetName().Version;
}
String _StrLutRegion;
String _StrLutVersion;
MeterSize _MeterSize;
UInt16 _FileCrc;
UInt16 _Version;
UInt32 _DataLength;
String lutFilePathName;
String lutFileName;
private void btnOpenLutFile_Click(Object sender, EventArgs e)
{
if (dlgOpenLuFile.ShowDialog() != DialogResult.OK)
{
return;
}
var ErrorMessage = "";
lutFilePathName = dlgOpenLuFile.FileName;
lutFileName = Path.GetFileNameWithoutExtension(lutFilePathName);
var BinData = new List<Byte>(File.ReadAllBytes(lutFilePathName));
// check if LUT file contains data
if (BinData == null)
{
ErrorMessage = "File size mismatch!";
}
btnStore.Enabled = false;
var IsValid = false;
var IndexLutFileId = 0;
var LengthLutFileId = 8;
var IndexDataLength = 8;
var LengthDataLength = 4;
// extract the identifier and check, if this is a LUT file
var StrLutFileId = Encoding.UTF8.GetString(BinData.ToArray(), IndexLutFileId, IndexDataLength);
_StrLutRegion = lutFileName.Split('_')[3];
_StrLutVersion = lutFileName.Split('_')[2];
_MeterSize = (MeterSize)BinData[IndexMeterSize];
_FileCrc = (UInt16)(BinData[IndexCrc] + (BinData[IndexCrc + 1] << 8));
_Version = (UInt16)(BinData[IndexVersion] + (BinData[IndexVersion + 1] << 8));
_DataLength = (UInt32)(BinData[IndexDataLength]
+ (BinData[IndexDataLength + 1] << 8)
+ (BinData[IndexDataLength + 2] << 16)
+ (BinData[IndexDataLength + 3] << 24));
// calculate CRC and compare this with the file CRC
var entireFile = new List<Byte>();
entireFile.AddRange(BinData);
var payload = new List<Byte>();
payload.AddRange(entireFile.GetRange(IndexVersion, LutFileDataLength + LengthVersion));
var calculatedCrc = Crc16Ccitt.CalculateMsb1021(payload.ToArray());
if (calculatedCrc != _FileCrc)
{
ErrorMessage = "CRC mismatch!";
}
var CalculatedCrc = calculatedCrc;
IsValid = true;
btnStore.Enabled = IsValid;
tbxLutFilePathName.Text = lutFilePathName;
tbxMeterLutCrc.Text = _FileCrc.ToString("X4");
tbxMeterMeterSize.Text = _MeterSize.ToString();
tbxRegionRadio.Text = _StrLutRegion;
tbxVersion.Text = _StrLutVersion;
tbxDataLengt.Text = _DataLength.ToString();
//lutFilePathName.
////mettbl_202203101419_v0.04_EMEA_DN50_v1.00_0xC50F
}
/// <summary>
/// Clear data table and set genesis to not connected
/// </summary>
private void Init()
{
}
private void label6_Click(Object sender, EventArgs e)
{
}
private void button1_Click(Object sender, EventArgs e)
{
var FileList = new Dictionary<String, String>();
var fileConfig = new FileInfo(tbxLutFilePathName.Text);
FileList = new Dictionary<String, String>();
FileList.Add(fileConfig.Name, fileConfig.FullName);
StringBuilder sbUrl = new StringBuilder();
sbUrl.Append("http://10.49.40.25/MeterProcessState/api/FileUpToDate/PostLutFile");
//sbUrl.Append("http://localhost:56011//api/FileUpToDate/PostLutFile");
//
sbUrl.Append($"?DataLength={_DataLength}");
sbUrl.Append($"&version={_Version}");
sbUrl.Append($"&crc={_FileCrc}");
sbUrl.Append($"&Metersize={_MeterSize.GetHashCode()}");
sbUrl.Append($"&Region={_StrLutRegion}");
var result = LocalWebRequest.PostBinaryFileRequestAsync(sbUrl.ToString(), lutFileName, File.ReadAllBytes(lutFilePathName), 2800);
}
private void label4_Click(Object sender, EventArgs e)
{
}
private void btnLoad_Click(Object sender, EventArgs e)
{
StringBuilder sbUrl = new StringBuilder();
sbUrl.Append("http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetLutFiles");
//sbUrl.Append("http://localhost:56011/api/FileUpToDate/GetLutFiles");
//sbUrl.Append($"?DataLength={_DataLength}");
//sbUrl.Append($"&version={_Version}");
//sbUrl.Append($"&crc={_FileCrc}");
//sbUrl.Append($"&Metersize={_MeterSize.GetHashCode()}");
//sbUrl.Append($"&Region={_StrLutRegion}");
try
{
var ret = LocalWebRequest.GetRequest(sbUrl.ToString(), 80000);
var a = JsonConvert.DeserializeObject<List<CordonelMetrologyLut>>(ret);
dgvLuts.DataSource = a;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}