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 = "