using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; namespace Xylem.Common.Ui.GenesisToolBox { public partial class FrmLog : Form { public GenesisMeter _currentGenesis { get; private set; } public MeterBatch _meterBatch { get; private set; } public FrmLog() { InitializeComponent(); } private void button1_Click(Object sender, EventArgs e) { } private void btnConnect_Click(Object sender, EventArgs e) { Connect(); } /// /// - Catch error message on unknown data type and kill meter. /// private void Connect() { try { var statusMap = new Dictionary(); if (System.IO.File.Exists("Status.json")) { var dict = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText("Status.json")); foreach (var item in dict) { statusMap.Add(int.Parse(item.Value.First.Values().First().ToString()), item.Key); } //var jo = JObject.Parse(); //((JObject)jo).ChildrenTokens //var retListRealCsd = JsonConvert.DeserializeObject(>(retStr); } Int32 slotNr; if (string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) || !int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNr)) { return; } //var drive = 1; _currentGenesis?.DisposeMeter(); //dispose old meter _meterBatch = new MeterBatch(); _currentGenesis = null; Thread.Sleep(200); //assign new meter and assign meter to FW update file if this exists _currentGenesis = new GenesisMeter(); _currentGenesis.SetupFromConfigFile(slotNr); _meterBatch.AddMeter(_currentGenesis); _currentGenesis.Configuration.UseRegisterWatchService = false; _currentGenesis.Configuration.UseMinMaxCheck = false; Task.Factory.StartNew(() => { _meterBatch.MetersLogin(); if (!_currentGenesis.IsLoggedOn) { Thread.Sleep(2000); _meterBatch.MetersLogin(); } if (!_currentGenesis.IsLoggedOn) { return; } StringBuilder print = new StringBuilder(); print.AppendLine($"Meter time: { ByteArrayStyle.ByteStyler.ToString(_currentGenesis.ReadRegister("SYSTEM_CalendarSeconds"))}"); //flush the log files print.AppendLine($"Flushing the logger"); _currentGenesis.WriteRegister("LOGGER_TriggerLogFlush", 1); // read the log index print.AppendLine($"Reading the list of log files"); var fl = get_filenames(_currentGenesis, 1); var flHash = new HashSet(fl); fl = flHash.ToList(); var data = new Dictionary>(); foreach (var fileName in fl) { print.AppendLine($"Reading the log files"); var fileData = new List(); var listBack = new List(); var namelist = new List(); //write file name to meter with meter open command, don't wait for response _currentGenesis.WriteRegister(Register.Configexchange.FileOpen, $"{1}\\{fileName}", false); //write access flag _currentGenesis.WriteRegister(Register.Configexchange.FileOpen, "r", false); //CONFIGEXCHANGE_FOpen -> 02040400315c6c6f67696e646578000072000000 //get the file pointer var _filePointer = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister( Register.Configexchange.FileOpen)); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", _filePointer, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 2, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FTell", _filePointer, false); var fixedReadBackCount = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("CONFIGEXCHANGE_FTell")); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", _filePointer, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FRead", 1, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FRead", fixedReadBackCount, false); _currentGenesis.WriteRegister("CONFIGEXCHANGE_FRead", _filePointer, false); var count_ret = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("CONFIGEXCHANGE_FRead")); while (count_ret != 0) { var numRead = 0; // while (numRead <= count_ret / 4) { var readAdd = _currentGenesis.ReadRegister("CONFIGEXCHANGE_FRead"); if (readAdd != null) { fileData.AddRange(readAdd); } numRead = numRead + 1; } count_ret = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("CONFIGEXCHANGE_FRead")); } _currentGenesis.WriteRegister(Register.Configexchange.FileClose, _filePointer); data.Add(fileName, fileData); } var loglines = new List(); foreach (var item in data) { print.AppendLine(item.Key); print.AppendLine($"all data: { ByteArrayStyle.ByteStyler.ToString(item.Value.ToArray())}"); if (item.Value != null && item.Value.Count >= 4) { var logtype = item.Value.GetRange(0, 1).First().ToString(); var status = BitConverter.ToUInt16(item.Value.GetRange(1, 2).ToArray(), 0); var count = (Int32)BitConverter.ToUInt16(item.Value.GetRange(2, 2).ToArray(), 0); count = count + 1; var extradatasize = item.Value.GetRange(3, 1).First().ToString(); //var extradatasize = BitConverter.ToChar(item.Value.GetRange(3, 1).ToArray(), 0); switch (logtype) { case "0": logtype = $"({logtype}) Informational"; break; case "1": logtype = $"({logtype}) Warning"; break; case "2": logtype = $"({logtype}) Critical"; break; } print.AppendLine($"logtype:{logtype}"); if (statusMap.ContainsKey(status)) { print.AppendLine($"status: ({status}) {statusMap[status]}"); } else { print.AppendLine($"status:{status}"); } print.AppendLine($"count:{count}"); print.AppendLine($"extradatasize:{extradatasize}"); var extradtalength = 0; if (int.TryParse(extradatasize, out extradtalength)) { print.Append("Extra data: "); for (Int32 i = 0; i <= extradtalength; i++) { print.Append(item.Value.GetRange(i, 2).First().ToString("X2")); print.Append(" "); } print.AppendLine(); } } else { print.AppendLine($"file is empty"); } } _currentGenesis.Logout(); Invoke(new Action(() => { richTextBox1.Text = print.ToString(); })); }).ContinueWith(delegate { ViewProgressPcb(false); }); } catch (Exception ex) { ViewProgressPcb(false); MessageBox.Show(ex.Message, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); // Dispose meter _meterBatch.RemoveAllMeters(); // If meter is not already assigned to batch as the config reader may fail _currentGenesis?.DisposeMeter(); } } private void ViewProgressPcb(Boolean v) { } private List get_filenames(GenesisMeter m, Int32 drive = 1) { var listBack = new List(); var namelist = new List(); //write file name to meter with meter open command, don't wait for response m.WriteRegister(Register.Configexchange.FileOpen, $"1\\logindex", false); //write access flag m.WriteRegister(Register.Configexchange.FileOpen, "r", false); //CONFIGEXCHANGE_FOpen -> 02040400315c6c6f67696e646578000072000000 //get the file pointer var _filePointer = RegisterConverter.ByteArrayToValue(m.ReadRegister( Register.Configexchange.FileOpen)); //set timeout back to default value //CONFIGEXCHANGE_FOpen <- 030a0000584400209ae0 (536888408) var eof = false; while (!eof) { //CONFIGEXCHANGE_FEOF-> 9b2007020b0904584400207a27(XD) m.WriteRegister("CONFIGEXCHANGE_FEOF", _filePointer, false); //CONFIGEXCHANGE_FEOF <-030a0000000000004194 (0) var res = RegisterConverter.ByteArrayToValue(m.ReadRegister("CONFIGEXCHANGE_FEOF")); if (res != 0) { eof = true; break; } m.WriteRegister("CONFIGEXCHANGE_FRead", 4, false); m.WriteRegister("CONFIGEXCHANGE_FRead", 1, false); m.WriteRegister("CONFIGEXCHANGE_FRead", _filePointer, false); var resLength = RegisterConverter.ByteArrayToValue(m.ReadRegister("CONFIGEXCHANGE_FRead")); var filecontent = m.ReadRegister("CONFIGEXCHANGE_FRead", resLength); namelist.Add(RegisterConverter.ByteArrayToValue(filecontent).ToString("X8")); } _currentGenesis.WriteRegister(Register.Configexchange.FileClose, _filePointer); return namelist; } private void label2_Click(Object sender, EventArgs e) { } private void cbComSlot_SelectedIndexChanged(Object sender, EventArgs e) { } } } //import opticalinterface.opticalapp as oa //import struct //import //import datetime //class LogEntry(object): // statusdict = dict() // STATUSFILENAME = 'status.json' // @classmethod // def bytes_to_log(cls, filename, data) : // logformat = "