2021-10-01 09:09:20 +00:00
|
|
|
|
using Logic.ProductionToProductMapper.Files.Fw;
|
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Data;
|
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Reflection;
|
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
using Logic.ProductionToProductMapper.Cordonel;
|
|
|
|
|
|
using Xylem.Common.CommonCore.Configuration;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Applications;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
|
|
|
|
|
|
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
|
|
|
|
|
|
using Xylem.Common.Logic.ProductionOrderCore.FW;
|
|
|
|
|
|
using Xylem.Common.Logic.SoftwareAccessHelper;
|
|
|
|
|
|
using Xylem.Common.Ui.GenesisToolBox.Properties;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Xylem.Common.Ui.GenesisToolBox
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// FW update form
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public partial class FrmFwUpdate : Form
|
|
|
|
|
|
{
|
|
|
|
|
|
#region Variables
|
|
|
|
|
|
private readonly MeterBatch _meterBatch = new MeterBatch();
|
|
|
|
|
|
private GenesisMeter _currentGenesis;
|
|
|
|
|
|
private const String StrConnecting = "Connecting to PCB";
|
|
|
|
|
|
private const String StrNotConnected = "NOT CONNECTED";
|
|
|
|
|
|
private const String StrCoreRevision = "System Core Revision: ";
|
|
|
|
|
|
private const String StrPartPcbConnected = "Connected to PCB ID: ";
|
|
|
|
|
|
private const String StrFileAppsLoaded = "ABC loaded";
|
|
|
|
|
|
private const String StrUpdatePathEmpty = "No update files in path";
|
|
|
|
|
|
private const String StrPackageFileLoaded = "ADF loaded";
|
|
|
|
|
|
private const String StrPackageFileInvalid = "ADF invalid";
|
|
|
|
|
|
private const String StrPackageFileToFileAppsMismatch = "ADF to ABC mismatch";
|
|
|
|
|
|
private const String StrBurnUpgrade = "Waiting for meter response";
|
|
|
|
|
|
private const String StrOverallProcess = "Overall Process";
|
|
|
|
|
|
private readonly DataTable _dataTable = new DataTable();
|
|
|
|
|
|
|
|
|
|
|
|
//data grid table header
|
|
|
|
|
|
private const String StrAppName = "AppName";
|
|
|
|
|
|
private const String StrAppId = "AppId";
|
|
|
|
|
|
private const String StrMeterVersion = "MeterVersion";
|
|
|
|
|
|
private const String StrMeterCrc = "MeterCrc";
|
|
|
|
|
|
private const String StrFileVersion = "FileVersion";
|
|
|
|
|
|
private const String StrFileCrc = "FileCrc";
|
|
|
|
|
|
private const String StrFileSize = "FileSize [kB]";
|
|
|
|
|
|
private const String StrUpdate = "Download";
|
|
|
|
|
|
private const String StrErase = "Erase";
|
|
|
|
|
|
private const String StrStatus = "Status";
|
|
|
|
|
|
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleInstalled = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleNotInstalled = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleInvalidMeterCrc = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleUpdateRequired = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleDownloadSucceeded = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleDownloadFailed = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleDownloadOngoing = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleValidated = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleVerificationRequired = new DataGridViewCellStyle();
|
|
|
|
|
|
private readonly DataGridViewCellStyle _styleEraseRequired = new DataGridViewCellStyle();
|
|
|
|
|
|
private Boolean _updateGui = true;
|
|
|
|
|
|
private MeterFwUpdate _meterFwUpdate;
|
|
|
|
|
|
|
|
|
|
|
|
private String _lastFwUpdateState;
|
|
|
|
|
|
private Int32 _lastSingleProgress;
|
|
|
|
|
|
private DateTimeOffset _startTime;
|
|
|
|
|
|
private Boolean _resetTimeMeasurement;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static String DefaultBinaryPath
|
|
|
|
|
|
{
|
|
|
|
|
|
get => Settings.Default.InitialBinaryPath;
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
Settings.Default.InitialBinaryPath = value;
|
|
|
|
|
|
Settings.Default.Save();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static String DefaultPackageFile
|
|
|
|
|
|
{
|
|
|
|
|
|
get => Settings.Default.InitialPackageFile;
|
|
|
|
|
|
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
Settings.Default.InitialPackageFile = value;
|
|
|
|
|
|
Settings.Default.Save();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Boolean _fileAppsSuccessfulWritten;
|
|
|
|
|
|
|
|
|
|
|
|
private Boolean _tryConnectPcb;
|
|
|
|
|
|
private Boolean _packageFileToFileAppsValidated;
|
|
|
|
|
|
|
|
|
|
|
|
private const String StrUpdateErrorMessageManualControl =
|
|
|
|
|
|
"FW UPDATE FAILED!\n\n" +
|
|
|
|
|
|
"TIP1: Press [Update FW] button for next trial,\n " +
|
|
|
|
|
|
"this keeps all downloaded files without new download\n" +
|
|
|
|
|
|
"\nor\n" +
|
|
|
|
|
|
"TIP2: Demarcate largest or failed file and press [Update FW],\n" +
|
|
|
|
|
|
"this keeps all other downloaded files without new download.\n" +
|
|
|
|
|
|
"Download of demarcated file separately!\n" +
|
|
|
|
|
|
"\nor\n" +
|
|
|
|
|
|
"TIP3: Press [Connect] and select large files separately!\n" +
|
|
|
|
|
|
"This is a stepwise update, proceed until update is completed!\n";
|
|
|
|
|
|
private const String StrUpdateErrorMessage =
|
|
|
|
|
|
"FW UPDATE FAILED!\n\n";
|
|
|
|
|
|
private FwSource fwSource = FwSource.File;
|
|
|
|
|
|
private enum FwSource
|
|
|
|
|
|
{
|
|
|
|
|
|
File,
|
|
|
|
|
|
Production,
|
|
|
|
|
|
Db,
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region FormControls
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ctor FW update
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public FrmFwUpdate()
|
|
|
|
|
|
{
|
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
var cultureInfo = new CultureInfo("en-GB");
|
|
|
|
|
|
Thread.CurrentThread.CurrentUICulture = cultureInfo;
|
|
|
|
|
|
Thread.CurrentThread.CurrentCulture = cultureInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Clear data table and set genesis to not connected
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void Init()
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
lblConnectPcb.Text = StrNotConnected;
|
|
|
|
|
|
lblCoreRevision.Text = "";
|
|
|
|
|
|
lblConnectPcb.ForeColor = Color.Red;
|
|
|
|
|
|
lblWaitingForMeterResponse.Visible = false;
|
|
|
|
|
|
btnConnect.Enabled = true;
|
|
|
|
|
|
btnUpdateFw.ForeColor = Color.DarkGreen;
|
|
|
|
|
|
btnStopFwUpdate.ForeColor = Color.Red;
|
|
|
|
|
|
SetControlDownloadsLocked();
|
|
|
|
|
|
btnStopFwUpdate.Enabled = false;
|
|
|
|
|
|
btnOpenUpdateDirectory.Enabled = true;
|
|
|
|
|
|
btnOpenPackageControlFile.Enabled = true;
|
|
|
|
|
|
cbFilePartSize.Enabled = true;
|
|
|
|
|
|
CheckManualControl();
|
|
|
|
|
|
if (_meterFwUpdate != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_meterFwUpdate.SingleFilePartsRetryEnable = cbxSingleFilePartsRetryEnable.Checked;
|
|
|
|
|
|
_meterFwUpdate.ConsecutiveFilePartsRetryEnable = cbxConsecutiveFilePartsRetryEnable.Checked;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_dataTable.Rows.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void FrmFwUpdate_Load(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
_styleInstalled.BackColor = Color.White;
|
|
|
|
|
|
_styleInstalled.ForeColor = Color.Black;
|
|
|
|
|
|
|
|
|
|
|
|
_styleNotInstalled.BackColor = Color.LightGray;
|
|
|
|
|
|
_styleNotInstalled.ForeColor = Color.Black;
|
|
|
|
|
|
|
|
|
|
|
|
_styleInvalidMeterCrc.BackColor = Color.White;
|
|
|
|
|
|
_styleInvalidMeterCrc.ForeColor = Color.Purple;
|
|
|
|
|
|
|
|
|
|
|
|
_styleUpdateRequired.BackColor = Color.White;
|
|
|
|
|
|
_styleUpdateRequired.ForeColor = Color.Red;
|
|
|
|
|
|
|
|
|
|
|
|
_styleEraseRequired.BackColor = Color.LightGray;
|
|
|
|
|
|
_styleEraseRequired.ForeColor = Color.Black;
|
|
|
|
|
|
|
|
|
|
|
|
_styleDownloadOngoing.BackColor = Color.GreenYellow;
|
|
|
|
|
|
_styleDownloadOngoing.ForeColor = Color.Black;
|
|
|
|
|
|
|
|
|
|
|
|
_styleValidated.BackColor = Color.White;
|
|
|
|
|
|
_styleValidated.ForeColor = Color.Green;
|
|
|
|
|
|
|
|
|
|
|
|
_styleDownloadSucceeded.BackColor = Color.LightGreen;
|
|
|
|
|
|
_styleDownloadSucceeded.ForeColor = Color.Green;
|
|
|
|
|
|
|
|
|
|
|
|
_styleDownloadFailed.BackColor = Color.LightPink;
|
|
|
|
|
|
_styleDownloadFailed.ForeColor = Color.Red;
|
|
|
|
|
|
|
|
|
|
|
|
_styleVerificationRequired.BackColor = Color.LightGoldenrodYellow;
|
|
|
|
|
|
_styleVerificationRequired.ForeColor = Color.Green;
|
|
|
|
|
|
|
|
|
|
|
|
_dataTable.Columns.Add(StrAppName, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrAppId, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrMeterVersion, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrMeterCrc, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrFileVersion, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrFileCrc, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrFileSize, typeof(String));
|
|
|
|
|
|
_dataTable.Columns.Add(StrUpdate, typeof(Boolean));
|
|
|
|
|
|
_dataTable.Columns.Add(StrErase, typeof(Boolean));
|
|
|
|
|
|
_dataTable.Columns.Add(StrStatus, typeof(String));
|
|
|
|
|
|
|
|
|
|
|
|
var version = Assembly.GetExecutingAssembly().GetName().Version;
|
|
|
|
|
|
lblFwUpdateInfo.Text = $@"Version: {version.Major}.{version.Minor}.{version.Build}";
|
|
|
|
|
|
_resetTimeMeasurement = true;
|
|
|
|
|
|
Init();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void FrmFwUpdate_FormClosing(Object sender, FormClosingEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
_currentGenesis?.Logout();
|
|
|
|
|
|
_meterBatch?.RemoveAllMeters();
|
|
|
|
|
|
_meterBatch?.Dispose();
|
|
|
|
|
|
_meterFwUpdate?.Dispose();
|
|
|
|
|
|
_meterFwUpdate = null;
|
|
|
|
|
|
Dispose();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void cbComSlot_SelectedIndexChanged(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
_resetTimeMeasurement = true;
|
|
|
|
|
|
Init();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region DataGridControls
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Build data grid and fill it with meter and file information,
|
|
|
|
|
|
/// compare version and CRC of meter and file
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void FillDataGridWithAllInfos()
|
|
|
|
|
|
{
|
|
|
|
|
|
_dataTable.Rows.Clear();
|
|
|
|
|
|
if (_currentGenesis == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var meterApp in _currentGenesis.MeterAppListVersion)
|
|
|
|
|
|
{
|
|
|
|
|
|
var row = _dataTable.NewRow();
|
|
|
|
|
|
//application information read from configuration
|
|
|
|
|
|
row[StrAppName] = meterApp.AppName;
|
|
|
|
|
|
row[StrAppId] = MeterFwUpdate.ConvertAppIdToString(meterApp.AppId);
|
|
|
|
|
|
|
|
|
|
|
|
_dataTable.Rows.Add(row);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//output data to data grid view
|
|
|
|
|
|
gridViewApplic.DataSource = _dataTable.DefaultView;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (DataRow dataRow in _dataTable.Rows)
|
|
|
|
|
|
{
|
|
|
|
|
|
DisplayFileAppInfo(dataRow);
|
|
|
|
|
|
DisplayMeterAppInfo(dataRow);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (DataGridViewColumn column in gridViewApplic.Columns)
|
|
|
|
|
|
{
|
|
|
|
|
|
column.SortMode = DataGridViewColumnSortMode.NotSortable;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//color the results of the compare
|
|
|
|
|
|
UpdateInformationStyleSet();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Set meter application information to data grid view
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dataRow"></param>
|
|
|
|
|
|
private void DisplayMeterAppInfo(DataRow dataRow)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var meterStateAppInfo = new MeterAppStateInfo();
|
|
|
|
|
|
foreach (var meterApp in _currentGenesis.MeterAppListVersion)
|
|
|
|
|
|
{
|
|
|
|
|
|
var appId = dataRow[StrAppId].ToString();
|
|
|
|
|
|
if (appId != MeterFwUpdate.ConvertAppIdToString(meterApp.AppId))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dataRow[StrUpdate] = meterApp.Update;
|
|
|
|
|
|
dataRow[StrErase] = meterApp.Erase;
|
|
|
|
|
|
dataRow[StrStatus] = meterStateAppInfo.GetTextFromState(meterApp.Status);
|
|
|
|
|
|
|
|
|
|
|
|
dataRow[StrMeterVersion] = meterApp.StrVersion;
|
|
|
|
|
|
dataRow[StrMeterCrc] = meterApp.IsInstalled ?
|
|
|
|
|
|
MeterFwUpdate.ConvertCrcToString(meterApp.Crc) : "";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Set file application information to data grid view.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dataRow"></param>
|
|
|
|
|
|
private void DisplayFileAppInfo(DataRow dataRow)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var meterApp in _currentGenesis.MeterAppListVersion)
|
|
|
|
|
|
{
|
|
|
|
|
|
var appId = dataRow[StrAppId].ToString();
|
|
|
|
|
|
if (appId != MeterFwUpdate.ConvertAppIdToString(meterApp.AppId))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var fileApp in _meterFwUpdate.FileApps)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (meterApp.AppId != fileApp.AppId)
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dataRow[StrFileVersion] = fileApp.StrVersion;
|
|
|
|
|
|
dataRow[StrFileCrc] = MeterFwUpdate.ConvertCrcToString(fileApp.Crc);
|
|
|
|
|
|
dataRow[StrFileSize] = $"{(Double)fileApp.BinData.Count / 1024:0.000}";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Display the update information
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void UpdateInformationStyleSet()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_meterFwUpdate == null) return;
|
|
|
|
|
|
foreach (DataGridViewRow dataGridRow in gridViewApplic.Rows)
|
|
|
|
|
|
{
|
|
|
|
|
|
var testString = dataGridRow.Cells[StrStatus].Value.ToString();
|
|
|
|
|
|
//var meterAppState = MeterAppState.MeterAppNotInstalled;
|
|
|
|
|
|
var meterAppStateInfo = new MeterAppStateInfo();
|
|
|
|
|
|
//if (testString == "" && dataGridRow.Cells[StrMeterVersion].Value.ToString() == "")
|
|
|
|
|
|
//{
|
|
|
|
|
|
// //dataGridRow.Cells[StrStatus].Value = meterAppStateInfo.GetTextFromState(meterAppState);
|
|
|
|
|
|
// //dataGridRow.Cells[StrStatus].Value = MeterAppStateInfo.GetTextFromState(meterAppState);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
var meterAppState = meterAppStateInfo.GetStateFromText(testString);
|
|
|
|
|
|
//meterAppState = MeterAppStateInfo.GetStateFromText(testString);
|
|
|
|
|
|
|
|
|
|
|
|
switch (meterAppState)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MeterAppState.MeterAppUpToDate:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleValidated;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppInstallationRequired:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleUpdateRequired;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.FileAppInvalid:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleDownloadOngoing;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppVersionOutdated:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleUpdateRequired;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppNotInstalled:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleNotInstalled;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.InvalidCrc:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleInvalidMeterCrc;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppErasureRequired:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleEraseRequired;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppDownloadSucceeded:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleDownloadSucceeded;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppDownloadSuspicious:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleVerificationRequired;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppSuccessfulErased:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleDownloadSucceeded;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppSuccessfulUpdated:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleDownloadSucceeded;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppDownloadFailed:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleDownloadFailed;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MeterAppState.MeterAppDownloadActive:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleDownloadOngoing;
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
dataGridRow.DefaultCellStyle = _styleNotInstalled;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//foreach (DataGridViewRow dataGridRow in gridViewApplic.Rows)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// var testString = dataGridRow.Cells[StrStatus].Value.ToString();
|
|
|
|
|
|
// if (testString == "" && dataGridRow.Cells[StrMeterVersion].Value.ToString() == "")
|
|
|
|
|
|
// {
|
|
|
|
|
|
// dataGridRow.Cells[StrStatus].Value = MeterFwUpdate.StrMeterAppNotInstalled;
|
|
|
|
|
|
// testString = MeterFwUpdate.StrMeterAppNotInstalled;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// switch (testString)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppUpToDate:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleValidated;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppInstallationRequired:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleUpdateRequired;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrFileAppInvalid:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleDownloadOngoing;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppVersionOutdated:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleUpdateRequired;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppNotInstalled:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleNotInstalled;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrInvalidCrc:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleInvalidMeterCrc;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppErasureRequired:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleEraseRequired;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppDownloadSucceeded:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleDownloadSucceeded;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppDownloadSuspicious:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleVerificationRequired;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppSuccessfulErased:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleDownloadSucceeded;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppSuccessfulUpdated:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleDownloadSucceeded;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppDownloadFailed:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleDownloadFailed;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// case MeterFwUpdate.StrMeterAppDownloadActive:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleDownloadOngoing;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// default:
|
|
|
|
|
|
// dataGridRow.DefaultCellStyle = _styleInstalled;
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// After changing the grid view cell and data row cell contents, the meter application lists
|
|
|
|
|
|
/// have to be updated with the required action (erase or update or none of them)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dataRow"></param>
|
|
|
|
|
|
private void SetMeterAppEraseUpdateInfo(DataRow dataRow)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var meterApp in _currentGenesis.MeterAppListVersion)
|
|
|
|
|
|
{
|
|
|
|
|
|
var appId = dataRow[StrAppId].ToString();
|
|
|
|
|
|
if (appId != MeterFwUpdate.ConvertAppIdToString(meterApp.AppId))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
meterApp.Update = (Boolean)dataRow[StrUpdate];
|
|
|
|
|
|
meterApp.Erase = (Boolean)dataRow[StrErase];
|
|
|
|
|
|
}
|
|
|
|
|
|
//force upgrade file generation on update cell click
|
|
|
|
|
|
_meterFwUpdate?.AssignGenesis(_currentGenesis);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Overwrite cell click, because edit of cells is denied. This is needed for update and/or erase selection
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void gridViewApplic_CellClick(Object sender, DataGridViewCellEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (e.ColumnIndex <= 0 || !btnOpenUpdateDirectory.Enabled ||
|
|
|
|
|
|
!cbxManualControl.Checked)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var dataRow = _dataTable.Rows[e.RowIndex];
|
|
|
|
|
|
if (gridViewApplic.Columns[e.ColumnIndex].Name == StrUpdate)
|
|
|
|
|
|
{
|
|
|
|
|
|
//deny update if update file invalid
|
|
|
|
|
|
if (dataRow[StrFileVersion].ToString() == "")
|
|
|
|
|
|
{
|
|
|
|
|
|
dataRow[StrUpdate] = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//toggle selection
|
|
|
|
|
|
dataRow[StrUpdate] = (Boolean)dataRow[StrUpdate] != true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//remove erase selection
|
|
|
|
|
|
if ((Boolean)dataRow[StrUpdate])
|
|
|
|
|
|
{
|
|
|
|
|
|
dataRow[StrErase] = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
if (gridViewApplic.Columns[e.ColumnIndex].Name == StrErase)
|
|
|
|
|
|
{
|
|
|
|
|
|
//deny erase if meter file not installed or the essential applications
|
|
|
|
|
|
//needed to keep the operation for the update procedure alive
|
|
|
|
|
|
if (dataRow[StrMeterVersion].ToString() == ""
|
|
|
|
|
|
|| dataRow[StrAppName].ToString() == "SYSTEM"
|
|
|
|
|
|
|| dataRow[StrAppName].ToString() == "CONFIGEXCHANGE"
|
|
|
|
|
|
|| dataRow[StrAppName].ToString() == "IRDA")
|
|
|
|
|
|
{
|
|
|
|
|
|
dataRow[StrErase] = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//toggle selection
|
|
|
|
|
|
dataRow[StrErase] = (Boolean)dataRow[StrErase] != true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//remove update selection
|
|
|
|
|
|
if ((Boolean)dataRow[StrErase])
|
|
|
|
|
|
{
|
|
|
|
|
|
dataRow[StrUpdate] = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//update information in meter application list
|
|
|
|
|
|
SetMeterAppEraseUpdateInfo(dataRow);
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region ActivationControls
|
|
|
|
|
|
private void SetControlDownloadsUnlocked()
|
|
|
|
|
|
{
|
|
|
|
|
|
btnUpdateFw.Enabled = true;
|
|
|
|
|
|
btnStopFwUpdate.Enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
btnDownloadFiles.Enabled = true;
|
|
|
|
|
|
if (cbxSingleFilePartsRetryEnable.Checked)
|
|
|
|
|
|
{
|
|
|
|
|
|
btnRetryFileParts.Enabled = CheckRetryPossible();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
btnVerifyFiles.Enabled = true;
|
|
|
|
|
|
|
|
|
|
|
|
btnPrepareTrigger.Enabled = true;
|
|
|
|
|
|
btnTriggerUpdate.Enabled = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void SetControlDownloadsLocked()
|
|
|
|
|
|
{
|
|
|
|
|
|
btnUpdateFw.Enabled = false;
|
|
|
|
|
|
btnStopFwUpdate.Enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
btnDownloadFiles.Enabled = false;
|
|
|
|
|
|
btnRetryFileParts.Enabled = false;
|
|
|
|
|
|
btnVerifyFiles.Enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
btnPrepareTrigger.Enabled = false;
|
|
|
|
|
|
btnTriggerUpdate.Enabled = false;
|
|
|
|
|
|
btnConnect.Enabled = true;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void SetControlsDownloadIsOngoing()
|
|
|
|
|
|
{
|
|
|
|
|
|
cbFilePartSize.Enabled = false;
|
|
|
|
|
|
cbAddRetryTimeout.Enabled = false;
|
|
|
|
|
|
btnConnect.Enabled = false;
|
|
|
|
|
|
btnOpenUpdateDirectory.Enabled = false;
|
|
|
|
|
|
btnOpenPackageControlFile.Enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
btnUpdateFw.Enabled = false;
|
|
|
|
|
|
btnStopFwUpdate.Enabled = true;
|
|
|
|
|
|
|
|
|
|
|
|
btnDownloadFiles.Enabled = false;
|
|
|
|
|
|
btnRetryFileParts.Enabled = false;
|
|
|
|
|
|
btnVerifyFiles.Enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
btnPrepareTrigger.Enabled = false;
|
|
|
|
|
|
btnTriggerUpdate.Enabled = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void SetControlsDownloadIsFinished()
|
|
|
|
|
|
{
|
|
|
|
|
|
_currentGenesis.RequestProtocol.AdditionalRetryTimeoutMs = 0;
|
|
|
|
|
|
cbFilePartSize.Enabled = true;
|
|
|
|
|
|
cbAddRetryTimeout.Enabled = true;
|
|
|
|
|
|
btnConnect.Enabled = true;
|
|
|
|
|
|
btnOpenUpdateDirectory.Enabled = true;
|
|
|
|
|
|
btnOpenPackageControlFile.Enabled = true;
|
|
|
|
|
|
|
|
|
|
|
|
btnUpdateFw.Enabled = true;
|
|
|
|
|
|
btnStopFwUpdate.Enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
btnDownloadFiles.Enabled = true;
|
|
|
|
|
|
if (cbxSingleFilePartsRetryEnable.Checked)
|
|
|
|
|
|
{
|
|
|
|
|
|
btnRetryFileParts.Enabled = CheckRetryPossible();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
btnVerifyFiles.Enabled = true;
|
|
|
|
|
|
|
|
|
|
|
|
btnPrepareTrigger.Enabled = true;
|
|
|
|
|
|
btnTriggerUpdate.Enabled = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region BoardControls
|
|
|
|
|
|
private void WaitForReboot()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
lblActualProcess.Text = StrBurnUpgrade;
|
|
|
|
|
|
lblOverall.Text = @"Update Applications and Restart Meter";
|
|
|
|
|
|
ProcessViewControl(true);
|
|
|
|
|
|
|
|
|
|
|
|
//wait until meter update is completed and meter is re-booted
|
|
|
|
|
|
const Double maxBootDelayMs = 10000.0;
|
|
|
|
|
|
const Double loopDelayMs = 200.0;
|
|
|
|
|
|
var bootDelayMs = 0.0;
|
|
|
|
|
|
var text = "";
|
|
|
|
|
|
while (bootDelayMs < maxBootDelayMs && string.IsNullOrEmpty(text))
|
|
|
|
|
|
{
|
|
|
|
|
|
SetTimeDisplay();
|
|
|
|
|
|
|
|
|
|
|
|
text = RegisterConverter.ConvertTo<String>(
|
|
|
|
|
|
_currentGenesis.ReadRegister(Register.Configexchange.PCBSerialNumber, 12));
|
|
|
|
|
|
barOverallProgressUpdate.Value = barOverallProgressUpdate.Value + 4 > 100 ? 0 :
|
|
|
|
|
|
barOverallProgressUpdate.Value + 4;
|
|
|
|
|
|
var bootProcess = (Int32)(bootDelayMs * 100.0 / maxBootDelayMs);
|
|
|
|
|
|
barSingleProgressUpdate.Value = barSingleProgressUpdate.Value + bootProcess > 100 ? 0 :
|
|
|
|
|
|
barSingleProgressUpdate.Value + bootProcess;
|
|
|
|
|
|
Update();
|
|
|
|
|
|
bootDelayMs += loopDelayMs;
|
|
|
|
|
|
Thread.Sleep((Int32)loopDelayMs);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
private void Connect()
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
Init();
|
|
|
|
|
|
Int32 slotNr;
|
|
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) ||
|
|
|
|
|
|
!int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNr))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_currentGenesis?.DisposeMeter();
|
|
|
|
|
|
//dispose old meter
|
|
|
|
|
|
_meterBatch.RemoveAllMeters();
|
|
|
|
|
|
_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(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
ViewProgressPcb(true);
|
|
|
|
|
|
|
|
|
|
|
|
_meterBatch.MetersLogin();
|
|
|
|
|
|
|
|
|
|
|
|
if (!_currentGenesis.IsLoggedOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
Thread.Sleep(2000);
|
|
|
|
|
|
_meterBatch.MetersLogin();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!_currentGenesis.IsLoggedOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate?.AssignGenesis(_currentGenesis);
|
|
|
|
|
|
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
lblConnectPcb.Text = StrPartPcbConnected + _currentGenesis.PcbId;
|
|
|
|
|
|
lblCoreRevision.Text = StrCoreRevision + _currentGenesis.CoreRevision;
|
|
|
|
|
|
lblConnectPcb.ForeColor = Color.Green;
|
|
|
|
|
|
_meterFwUpdate?.CompareAllMeterAndFileApps();
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
_currentGenesis.Logout();
|
|
|
|
|
|
}));
|
|
|
|
|
|
}).ContinueWith(delegate { ViewProgressPcb(false); });
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show(ex.Message);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region ProcessControls
|
|
|
|
|
|
private void ViewProgressPcb(Boolean isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_updateGui)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_tryConnectPcb = true;
|
|
|
|
|
|
ProcessViewControl(true);
|
|
|
|
|
|
lblActualProcess.Text = StrConnecting;
|
|
|
|
|
|
lblOverall.Text = StrOverallProcess;
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_tryConnectPcb = false;
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// View all process bars and labels
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void ProcessViewControl(Boolean view)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (view)
|
|
|
|
|
|
{
|
|
|
|
|
|
lblActualProcess.Visible = true;
|
|
|
|
|
|
lblOverall.Visible = true;
|
|
|
|
|
|
barOverallProgressUpdate.Visible = true;
|
|
|
|
|
|
barSingleProgressUpdate.Visible = true;
|
|
|
|
|
|
_lastFwUpdateState = "";
|
|
|
|
|
|
tmrProgressUpdate.Enabled = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblActualProcess.Visible = false;
|
|
|
|
|
|
lblOverall.Visible = false;
|
|
|
|
|
|
barOverallProgressUpdate.Visible = false;
|
|
|
|
|
|
barSingleProgressUpdate.Visible = false;
|
|
|
|
|
|
tmrProgressUpdate.Enabled = false;
|
|
|
|
|
|
_lastFwUpdateState = "";
|
|
|
|
|
|
lblWaitingForMeterResponse.Visible = false;
|
|
|
|
|
|
lblActualProcess.Text = "";
|
|
|
|
|
|
lblOverall.Text = "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//common actions and settings
|
|
|
|
|
|
lblActualProcess.Update();
|
|
|
|
|
|
lblOverall.Update();
|
|
|
|
|
|
barOverallProgressUpdate.Value = 0;
|
|
|
|
|
|
barOverallProgressUpdate.Update();
|
|
|
|
|
|
barSingleProgressUpdate.Value = 0;
|
|
|
|
|
|
barSingleProgressUpdate.Update();
|
|
|
|
|
|
Update();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void AutomaticUpdateControl(Boolean isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_lastFwUpdateState = "";
|
|
|
|
|
|
ProcessViewControl(true);
|
|
|
|
|
|
tmrProgressUpdate.Enabled = true;
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
SetControlsDownloadIsFinished();
|
|
|
|
|
|
|
|
|
|
|
|
if (_fileAppsSuccessfulWritten)
|
|
|
|
|
|
{
|
|
|
|
|
|
WaitForReboot();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btnConnect_Click(this, null);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
var requiredUpdates = _meterFwUpdate?.GetFailedFileApps();
|
|
|
|
|
|
var text = cbxManualControl.Checked ?
|
|
|
|
|
|
StrUpdateErrorMessageManualControl : StrUpdateErrorMessage;
|
|
|
|
|
|
if (requiredUpdates != null && requiredUpdates.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
text += "\nFailed to update application:\n";
|
|
|
|
|
|
FileApplications lastFile = null;
|
|
|
|
|
|
foreach (var file in requiredUpdates)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (lastFile == null || lastFile.AppId != file.AppId)
|
|
|
|
|
|
{
|
|
|
|
|
|
text += $"{file.AppName}\n";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
lastFile = file;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
MessageBoxShow(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void DownloadFilesControl(Boolean isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_lastFwUpdateState = "";
|
|
|
|
|
|
ProcessViewControl(true);
|
|
|
|
|
|
tmrProgressUpdate.Enabled = true;
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
SetControlsDownloadIsFinished();
|
|
|
|
|
|
|
|
|
|
|
|
if (!_fileAppsSuccessfulWritten)
|
|
|
|
|
|
{
|
|
|
|
|
|
var text = "DOWNLOAD FAILED!\n\n" +
|
|
|
|
|
|
"If some files marked red:\n" +
|
|
|
|
|
|
"Download these files by select \"Download\" and\n" +
|
|
|
|
|
|
"then press \"Manual Download\" [Entire File Parts]!\n\n";
|
|
|
|
|
|
var requiredUpdates = _meterFwUpdate?.GetFailedFileApps();
|
|
|
|
|
|
if (requiredUpdates != null && requiredUpdates.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
text += "\nFailed to update application:\n";
|
|
|
|
|
|
FileApplications lastFile = null;
|
|
|
|
|
|
foreach (var file in requiredUpdates)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (lastFile == null || lastFile.AppId != file.AppId)
|
|
|
|
|
|
{
|
|
|
|
|
|
text += $"{file.AppName}\n";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
lastFile = file;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
MessageBoxShow(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
const String text = "Download of selected files succeeded!\n\n" +
|
|
|
|
|
|
"If some files marked red:\n" +
|
|
|
|
|
|
"Download these files by select \"Download\" and\n" +
|
|
|
|
|
|
"then press \"Manual Download\" [Entire File Parts]!\n\n" +
|
|
|
|
|
|
"If all files are downloaded:\n" +
|
|
|
|
|
|
"Select all green marked files \"Download\"," +
|
|
|
|
|
|
"all red written \"Erasure required\" with \"Erase\" and\n" +
|
|
|
|
|
|
"press [Trigger Upgrade] to finalize the update!";
|
|
|
|
|
|
MessageBoxShow(text, @"SUCCESS",
|
|
|
|
|
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
|
}
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void TriggerUpdateControl(Boolean isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_lastFwUpdateState = "";
|
|
|
|
|
|
ProcessViewControl(true);
|
|
|
|
|
|
tmrProgressUpdate.Enabled = true;
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
SetControlsDownloadIsFinished();
|
|
|
|
|
|
|
|
|
|
|
|
if (_fileAppsSuccessfulWritten)
|
|
|
|
|
|
{
|
|
|
|
|
|
const String text = "Trigger upgrade succeeded!\n\n" +
|
|
|
|
|
|
"Press [Connect] for verification!";
|
|
|
|
|
|
MessageBoxShow(text, @"SUCCESS",
|
|
|
|
|
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
const String text = "TRIGGER UPGRADE FAILED\n\n" +
|
|
|
|
|
|
"FW installation may be successfully executed!\n\n" +
|
|
|
|
|
|
"Press [Connect] for verification!";
|
|
|
|
|
|
|
|
|
|
|
|
MessageBoxShow(text, @"Verification Needed",
|
|
|
|
|
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
|
}
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void VerifyFilesControl(Boolean isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isActive)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_lastFwUpdateState = "";
|
|
|
|
|
|
ProcessViewControl(true);
|
|
|
|
|
|
tmrProgressUpdate.Enabled = true;
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessViewControl(false);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
SetControlsDownloadIsFinished();
|
|
|
|
|
|
|
|
|
|
|
|
if (!_fileAppsSuccessfulWritten)
|
|
|
|
|
|
{
|
|
|
|
|
|
const String text = "VERIFICATION FAILED!\n\n" +
|
|
|
|
|
|
"If some files marked red:\n" +
|
|
|
|
|
|
"Download these files by select \"Download\" and\n" +
|
|
|
|
|
|
"then press \"Manual Download\" [Entire File Parts]!";
|
|
|
|
|
|
MessageBoxShow(text, @"FAILED", MessageBoxButtons.OK,
|
|
|
|
|
|
MessageBoxIcon.Error);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
const String text = "Verification of selected files succeeded!\n\n" +
|
|
|
|
|
|
"If some files marked red:\n" +
|
|
|
|
|
|
"Download these files by select \"Download\" and\n" +
|
|
|
|
|
|
"then press \"Manual Download\" [Entire File Parts]!\n\n" +
|
|
|
|
|
|
"If all files are verified green:\n" +
|
|
|
|
|
|
"Select all green marked files \"Download\"," +
|
|
|
|
|
|
"all red written \"Erasure required\" with \"Erase\" and\n" +
|
|
|
|
|
|
"press [Trigger Upgrade] to finalize the update!";
|
|
|
|
|
|
MessageBoxShow(text, @"SUCCESS",
|
|
|
|
|
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
|
}
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region Checks
|
|
|
|
|
|
private void CheckManualControl()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cbxManualControl.Checked)
|
|
|
|
|
|
{
|
|
|
|
|
|
gbxManualDownload.Visible = true;
|
|
|
|
|
|
gbxManualTriggerControl.Visible = true;
|
|
|
|
|
|
gbxManualUploadAndVerification.Visible = true;
|
|
|
|
|
|
gbxManualTimingControl.Visible = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
gbxManualDownload.Visible = false;
|
|
|
|
|
|
gbxManualTriggerControl.Visible = false;
|
|
|
|
|
|
gbxManualUploadAndVerification.Visible = false;
|
|
|
|
|
|
gbxManualTimingControl.Visible = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
private Boolean CheckUpdateEnabled()
|
|
|
|
|
|
{
|
2022-04-06 08:42:16 +00:00
|
|
|
|
|
|
|
|
|
|
SetControlDownloadsUnlocked();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
2021-10-01 09:09:20 +00:00
|
|
|
|
//this check has been placed here to force display update
|
|
|
|
|
|
if (_meterFwUpdate != null && _currentGenesis != null &&
|
|
|
|
|
|
_packageFileToFileAppsValidated &&
|
|
|
|
|
|
(_currentGenesis.MeterAppListVersion.Any(f => f.Update)
|
|
|
|
|
|
|| _currentGenesis.MeterAppListVersion.Any(f => f.Erase)))
|
|
|
|
|
|
{
|
|
|
|
|
|
SetControlDownloadsUnlocked();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SetControlDownloadsLocked();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Boolean CheckRetryPossible()
|
|
|
|
|
|
{
|
|
|
|
|
|
return _meterFwUpdate != null && _meterFwUpdate.GetFailedFileApps().Count > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void CheckPackageFileAndFileApps()
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
_packageFileToFileAppsValidated = _meterFwUpdate.ValidateFileAppsWithPackageFile();
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_meterFwUpdate.CoreRevisionMaximum == null)
|
|
|
|
|
|
MessageBoxShow(@"Core Revision missing in ADF!", @"FAILED",
|
|
|
|
|
|
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_packageFileToFileAppsValidated)
|
|
|
|
|
|
{
|
|
|
|
|
|
lblPackageFileLoadedInfo.ForeColor = Color.Green;
|
|
|
|
|
|
lblPackageFileLoadedInfo.Text = StrPackageFileLoaded;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblPackageFileLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
lblPackageFileLoadedInfo.Text = StrPackageFileToFileAppsMismatch;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region TimerControls
|
|
|
|
|
|
private void tmrProgressUpdate_Tick(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
//cbxManualControl.Visible = true;
|
|
|
|
|
|
if (_tryConnectPcb)
|
|
|
|
|
|
{
|
|
|
|
|
|
barOverallProgressUpdate.Value = barOverallProgressUpdate.Value + 1 > 100 ? 0 :
|
|
|
|
|
|
barOverallProgressUpdate.Value + 1;
|
|
|
|
|
|
barSingleProgressUpdate.Value = barSingleProgressUpdate.Value + 4 > 100 ? 0 :
|
|
|
|
|
|
barSingleProgressUpdate.Value + 4;
|
|
|
|
|
|
lblOverall.Text = StrOverallProcess;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblOverall.Text = _meterFwUpdate?.GetFwUpdateStateOperation();
|
|
|
|
|
|
lblActualProcess.Text = _meterFwUpdate?.GetActualOperation();
|
|
|
|
|
|
|
|
|
|
|
|
var overallProgress = (Int32)(_meterFwUpdate?.OverallProcessCtrPercent ?? 0);
|
|
|
|
|
|
barOverallProgressUpdate.Value = overallProgress > 100 ? 100 : overallProgress;
|
|
|
|
|
|
barOverallProgressUpdate.Update();
|
|
|
|
|
|
|
|
|
|
|
|
var singleProgress = (Int32)(_meterFwUpdate?.SingleFileProcessCtrPercent ?? 0);
|
|
|
|
|
|
if (_meterFwUpdate?.GetFwUpdateStateOperation() != _lastFwUpdateState)
|
|
|
|
|
|
{
|
|
|
|
|
|
_lastFwUpdateState = _meterFwUpdate?.GetFwUpdateStateOperation();
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
lblWaitingForMeterResponse.Visible = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//if the communication gets frozen
|
|
|
|
|
|
lblWaitingForMeterResponse.Visible = _lastSingleProgress == singleProgress;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
barSingleProgressUpdate.Value = singleProgress > 100 ? 100 : singleProgress;
|
|
|
|
|
|
_lastSingleProgress = singleProgress;
|
|
|
|
|
|
barSingleProgressUpdate.Update();
|
|
|
|
|
|
}
|
|
|
|
|
|
SetTimeDisplay();
|
|
|
|
|
|
Update();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void SetTimeDisplay()
|
|
|
|
|
|
{
|
|
|
|
|
|
var time = DateTimeOffset.UtcNow;
|
|
|
|
|
|
var timeSpan = time - _startTime;
|
|
|
|
|
|
lblUpdateTime.Text = $@"{(UInt32)timeSpan.TotalMinutes}:{timeSpan.Seconds:00}";
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region Buttons
|
|
|
|
|
|
private void btnConnect_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_resetTimeMeasurement)
|
|
|
|
|
|
{
|
|
|
|
|
|
_startTime = DateTimeOffset.UtcNow;
|
|
|
|
|
|
_resetTimeMeasurement = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
Connect();
|
|
|
|
|
|
|
|
|
|
|
|
//if (true)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// tbxBinaryPath.Text = "C:\\Users\\drabesch_ro\\Desktop\\Cordonel_NA_20200403_B104A\\binaries\\naproduct\\";
|
|
|
|
|
|
// tbxPackageFilePathName.Text = "C:\\Users\\drabesch_ro\\Desktop\\Cordonel_NA_20200403_B104A\\naproduct.txt";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// var packageFilePathName = tbxPackageFilePathName.Text;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if (_meterFwUpdate == null) _meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
// if (_meterFwUpdate == null) return;
|
|
|
|
|
|
// if (_meterFwUpdate.LoadPackageFile(packageFilePathName))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// CheckPackageFileAndFileApps();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// lblPackageFileLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
// lblPackageFileLoadedInfo.Text = StrPackageFileInvalid;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// CheckUpdateEnabled();
|
|
|
|
|
|
// _resetTimeMeasurement = true;
|
|
|
|
|
|
|
|
|
|
|
|
// //reload last file path
|
|
|
|
|
|
// dlgBinaryPath.SelectedPath = DefaultBinaryPath;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// var binaryFilePath = tbxBinaryPath.Text;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// //copy path to package file load
|
|
|
|
|
|
// //if (String.IsNullOrEmpty(DefaultPackageFile))
|
|
|
|
|
|
// // dlgOpenPackageFile.InitialDirectory = binaryFilePath;
|
|
|
|
|
|
|
|
|
|
|
|
// tbxBinaryPath.Text = binaryFilePath;
|
|
|
|
|
|
// if (_meterFwUpdate == null) _meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
// if (_meterFwUpdate == null) return;
|
|
|
|
|
|
// if (_meterFwUpdate.LoadFileApps(binaryFilePath))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// lblFileAppsLoadedInfo.ForeColor = Color.Green;
|
|
|
|
|
|
// lblFileAppsLoadedInfo.Text = StrFileAppsLoaded;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// lblFileAppsLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
// lblFileAppsLoadedInfo.Text = StrUpdatePathEmpty;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// CheckPackageFileAndFileApps();
|
|
|
|
|
|
|
|
|
|
|
|
// if (_currentGenesis == null) return;
|
|
|
|
|
|
// _meterFwUpdate?.CompareAllMeterAndFileApps();
|
|
|
|
|
|
// _meterFwUpdate?.AssignGenesis(_currentGenesis);
|
|
|
|
|
|
// FillDataGridWithAllInfos();
|
|
|
|
|
|
// CheckUpdateEnabled();
|
|
|
|
|
|
// _resetTimeMeasurement = true;
|
|
|
|
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void btnOpenPackageControlFile_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
////reload last path
|
|
|
|
|
|
dlgOpenPackageFile.InitialDirectory = DefaultPackageFile;
|
|
|
|
|
|
|
|
|
|
|
|
if (dlgOpenPackageFile.ShowDialog() != DialogResult.OK)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var packageFilePathName = dlgOpenPackageFile.FileName;
|
|
|
|
|
|
|
|
|
|
|
|
DefaultPackageFile = packageFilePathName;
|
|
|
|
|
|
|
|
|
|
|
|
//copy path to binary file load
|
|
|
|
|
|
//if (String.IsNullOrEmpty(DefaultBinaryPath))
|
|
|
|
|
|
// dlgBinaryPath.SelectedPath = Path.GetFullPath(packageFilePathName);
|
|
|
|
|
|
|
|
|
|
|
|
tbxPackageFilePathName.Text = packageFilePathName;
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_meterFwUpdate.LoadPackageFile(packageFilePathName))
|
|
|
|
|
|
{
|
|
|
|
|
|
CheckPackageFileAndFileApps();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblPackageFileLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
lblPackageFileLoadedInfo.Text = StrPackageFileInvalid;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
_resetTimeMeasurement = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void btnOpenUpdateDirectory_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
//reload last file path
|
|
|
|
|
|
dlgBinaryPath.SelectedPath = DefaultBinaryPath;
|
|
|
|
|
|
|
|
|
|
|
|
if (dlgBinaryPath.ShowDialog() != DialogResult.OK)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var binaryFilePath = dlgBinaryPath.SelectedPath;
|
|
|
|
|
|
DefaultBinaryPath = binaryFilePath;
|
|
|
|
|
|
|
|
|
|
|
|
//copy path to package file load
|
|
|
|
|
|
//if (String.IsNullOrEmpty(DefaultPackageFile))
|
|
|
|
|
|
// dlgOpenPackageFile.InitialDirectory = binaryFilePath;
|
|
|
|
|
|
|
|
|
|
|
|
tbxBinaryPath.Text = binaryFilePath;
|
|
|
|
|
|
|
|
|
|
|
|
var meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
if (meterFwUpdate.LoadFileApps(binaryFilePath))
|
|
|
|
|
|
{
|
|
|
|
|
|
lblFileAppsLoadedInfo.ForeColor = Color.Green;
|
|
|
|
|
|
lblFileAppsLoadedInfo.Text = StrFileAppsLoaded;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblFileAppsLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
lblFileAppsLoadedInfo.Text = StrUpdatePathEmpty;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PushFwFile(meterFwUpdate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Upload selected update files and compare them with update files
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void btnVerifyFiles_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetControlsDownloadIsOngoing();
|
|
|
|
|
|
VerifyFilesControl(true);
|
|
|
|
|
|
|
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_fileAppsSuccessfulWritten = _meterFwUpdate.ManualVerifyFiles();
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
}).ContinueWith(delegate { VerifyFilesControl(false); });
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Download selected update files entirely
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void btnDownloadFiles_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Int32 fileSizePartKb;
|
|
|
|
|
|
Int32 addRetryTimeoutMs;
|
|
|
|
|
|
if (string.IsNullOrEmpty(cbFilePartSize.SelectedItem.ToString()) ||
|
|
|
|
|
|
!int.TryParse(cbFilePartSize.SelectedItem.ToString(), out fileSizePartKb))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate.MaxPartialFileDataSize = fileSizePartKb * 1024;
|
|
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(cbAddRetryTimeout.SelectedItem.ToString()) ||
|
|
|
|
|
|
!int.TryParse(cbAddRetryTimeout.SelectedItem.ToString(), out addRetryTimeoutMs))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_currentGenesis.RequestProtocol.AdditionalRetryTimeoutMs = addRetryTimeoutMs;
|
|
|
|
|
|
|
|
|
|
|
|
SetControlsDownloadIsOngoing();
|
|
|
|
|
|
DownloadFilesControl(true);
|
|
|
|
|
|
|
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_fileAppsSuccessfulWritten = _meterFwUpdate.ManualDownloadAllFileApps();
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
}).ContinueWith(delegate { DownloadFilesControl(false); });
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Download remaining files parts from previous download
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void btnRetryFileParts_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetControlsDownloadIsOngoing();
|
|
|
|
|
|
DownloadFilesControl(true);
|
|
|
|
|
|
|
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_fileAppsSuccessfulWritten = _meterFwUpdate.ManualDownloadRemainingFileAppsParts();
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
}).ContinueWith(delegate { DownloadFilesControl(false); });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Preselect "Download" trigger marks on successfully downloaded files
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void btnPrepareTrigger_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate.PrepareTrigger();
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Build update control file and trigger update of selected files
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void btnTriggerUpdate_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetControlsDownloadIsOngoing();
|
|
|
|
|
|
TriggerUpdateControl(true);
|
|
|
|
|
|
|
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_fileAppsSuccessfulWritten = _meterFwUpdate.ManualTriggerUpgrade();
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
}).ContinueWith(delegate { TriggerUpdateControl(false); });
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Automatic update of entire FW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void btnUpdateFw_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || _meterFwUpdate?.FileApps == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetControlsDownloadIsOngoing();
|
|
|
|
|
|
AutomaticUpdateControl(true);
|
|
|
|
|
|
|
|
|
|
|
|
_startTime = DateTimeOffset.UtcNow;
|
|
|
|
|
|
_resetTimeMeasurement = false;
|
|
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(cbFilePartSize.SelectedItem.ToString()) ||
|
|
|
|
|
|
!int.TryParse(cbFilePartSize.SelectedItem.ToString(), out var fileSizePartKb))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate.MaxPartialFileDataSize = fileSizePartKb * 1024;
|
|
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(cbAddRetryTimeout.SelectedItem.ToString()) ||
|
|
|
|
|
|
!int.TryParse(cbAddRetryTimeout.SelectedItem.ToString(), out var addRetryTimeoutMs))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_currentGenesis.RequestProtocol.AdditionalRetryTimeoutMs = addRetryTimeoutMs;
|
|
|
|
|
|
|
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
_fileAppsSuccessfulWritten = _meterFwUpdate.UpdateMeterFw();
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
}).ContinueWith(delegate { AutomaticUpdateControl(false); });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void btnStopFwUpdate_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_meterFwUpdate != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_meterFwUpdate.StopUpdateProcess = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void btnResetAll_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
btnStopFwUpdate_Click(this, null);
|
|
|
|
|
|
_meterFwUpdate?.ResetAll();
|
|
|
|
|
|
Init();
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
_currentGenesis.Logout();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region CheckBoxes
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// File parts are consecutive, stop process at first failed part and retry from
|
|
|
|
|
|
/// this part on all others behind
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void cbxConsecutiveFilePartsRetryEnable_CheckedChanged(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate.ConsecutiveFilePartsRetryEnable =
|
|
|
|
|
|
cbxConsecutiveFilePartsRetryEnable.Checked;
|
|
|
|
|
|
cbxSingleFilePartsRetryEnable.Checked = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Failed file parts are somewhere in between succeeded parts and will be retried separately
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void cbxSingleFilePartsRetryEnable_CheckedChanged(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate.SingleFilePartsRetryEnable =
|
|
|
|
|
|
cbxSingleFilePartsRetryEnable.Checked;
|
|
|
|
|
|
cbxConsecutiveFilePartsRetryEnable.Checked = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Activation of manual control buttons for individual update procedure
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
|
private void cbxManualControl_CheckedChanged_1(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
CheckManualControl();
|
|
|
|
|
|
_meterFwUpdate?.CompareAllMeterAndFileApps();
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region ExternalCalls
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Boolean Prepare(Int32 slot, String binaryPath, String packageInfoPath)
|
|
|
|
|
|
{
|
|
|
|
|
|
_updateGui = false;
|
|
|
|
|
|
cbComSlot.SelectedItem = slot;
|
|
|
|
|
|
|
|
|
|
|
|
Connect();
|
|
|
|
|
|
var retries = 40;
|
|
|
|
|
|
while (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
retries -= 1;
|
|
|
|
|
|
if (retries <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(10000);
|
|
|
|
|
|
tbxBinaryPath.Text = binaryPath;
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_meterFwUpdate.LoadFileApps(binaryPath))
|
|
|
|
|
|
{
|
|
|
|
|
|
lblFileAppsLoadedInfo.ForeColor = Color.Green;
|
|
|
|
|
|
lblFileAppsLoadedInfo.Text = StrFileAppsLoaded;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblFileAppsLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
lblFileAppsLoadedInfo.Text = StrUpdatePathEmpty;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CheckPackageFileAndFileApps();
|
|
|
|
|
|
|
|
|
|
|
|
if (_currentGenesis == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate?.CompareAllMeterAndFileApps();
|
|
|
|
|
|
_meterFwUpdate?.AssignGenesis(_currentGenesis);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tbxPackageFilePathName.Text = packageInfoPath;
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_meterFwUpdate == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_meterFwUpdate.LoadPackageFile(packageInfoPath))
|
|
|
|
|
|
{
|
|
|
|
|
|
CheckPackageFileAndFileApps();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
lblPackageFileLoadedInfo.ForeColor = Color.Red;
|
|
|
|
|
|
lblPackageFileLoadedInfo.Text = StrPackageFileInvalid;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (CheckUpdateEnabled())
|
|
|
|
|
|
{
|
|
|
|
|
|
btnUpdateFw_Click(null, EventArgs.Empty);
|
|
|
|
|
|
//wait for response return e
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public void StartUpdate()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public MsgEventargs LastMsgEvent;
|
|
|
|
|
|
public class MsgEventargs : EventArgs
|
|
|
|
|
|
{
|
|
|
|
|
|
public String Text;
|
|
|
|
|
|
public String Caption;
|
|
|
|
|
|
public MessageBoxButtons Buttons;
|
|
|
|
|
|
public MessageBoxIcon Icon;
|
|
|
|
|
|
}
|
|
|
|
|
|
public event EventHandler<MsgEventargs> OnMsgPopUp;
|
|
|
|
|
|
private void MessageBoxShow(String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_updateGui)
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show(text, caption, buttons, icon);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
LastMsgEvent = new MsgEventargs() { Text = text, Caption = caption, Buttons = buttons, Icon = icon };
|
|
|
|
|
|
OnMsgPopUp?.Invoke(this, LastMsgEvent);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
private void tabDb_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void tabFwSources_SelectedIndexChanged(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tabFwSources.SelectedTab == tabLocalFile)
|
|
|
|
|
|
{
|
|
|
|
|
|
checkSelectionChanged(FwSource.File);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (tabFwSources.SelectedTab == tabProduction)
|
|
|
|
|
|
{
|
|
|
|
|
|
checkSelectionChanged(FwSource.File);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (tabFwSources.SelectedTab == tabDb)
|
|
|
|
|
|
{
|
|
|
|
|
|
checkSelectionChanged(FwSource.Db);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cbxFilterFwDn.Items.Add("ALL");
|
|
|
|
|
|
|
|
|
|
|
|
cbxFilterFWType.Items.Add("ALL");
|
|
|
|
|
|
|
|
|
|
|
|
foreach (MeterSize suit in (MeterSize[])Enum.GetValues(typeof(MeterSize)))
|
|
|
|
|
|
{
|
|
|
|
|
|
cbxFilterFwDn.Items.Add(suit);
|
|
|
|
|
|
}
|
|
|
|
|
|
cbxFilterFwDn.SelectedIndex = 0;
|
|
|
|
|
|
|
|
|
|
|
|
cbxFilterFWType.Items.Add(CordonelFWTypeEnum.EMEA_433);
|
|
|
|
|
|
cbxFilterFWType.Items.Add(CordonelFWTypeEnum.EMEA_868);
|
|
|
|
|
|
cbxFilterFWType.Items.Add(CordonelFWTypeEnum.NA);
|
|
|
|
|
|
cbxFilterFWType.SelectedIndex = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btnGetFWFiles_Click(sender, e);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show("No Tab selected!");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//tabFwSources.SelectedTab = tabLocalFile;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void checkSelectionChanged(FwSource newMode)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (newMode == fwSource)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
fwSource = newMode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void PushFwFile(MeterFwUpdate meterFwUpdate)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate = meterFwUpdate;
|
|
|
|
|
|
|
|
|
|
|
|
CheckPackageFileAndFileApps();
|
|
|
|
|
|
|
|
|
|
|
|
if (_currentGenesis == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate?.CompareAllMeterAndFileApps();
|
|
|
|
|
|
_meterFwUpdate?.AssignGenesis(_currentGenesis);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
_resetTimeMeasurement = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
private void btnGetFWFiles_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
var IsDevloper = chbFilterIsDeveloper.Checked;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var url = $"http://sla12iis01/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly={IsDevloper}";
|
|
|
|
|
|
if (cbxFilterFwDn.SelectedItem.ToString() != "ALL")
|
|
|
|
|
|
{
|
|
|
|
|
|
var MyMeterSize = ((MeterSize)cbxFilterFwDn.SelectedItem).GetHashCode();
|
|
|
|
|
|
url = url + $"&CordonelFwFile_Dn={MyMeterSize}";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (cbxFilterFWType.SelectedItem.ToString() != "ALL")
|
|
|
|
|
|
{
|
|
|
|
|
|
var FWTypeEnum = ((CordonelFWTypeEnum)cbxFilterFWType.SelectedItem).GetHashCode();
|
|
|
|
|
|
url = url + $"&CordonelFwFile_Type={FWTypeEnum}";
|
|
|
|
|
|
}
|
|
|
|
|
|
url = url + $"&FileCategoryID=1";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var result = LocalWebRequest.GetRequest(url, 1000);
|
|
|
|
|
|
var a = JsonConvert.DeserializeObject<List<ClusteredFile>>(result);
|
|
|
|
|
|
|
|
|
|
|
|
dgvFiles.DataSource = a.OrderByDescending(o => o.FileDate).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
for (Int32 i = 0; i < dgvFiles.ColumnCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
dgvFiles.Columns[i].Visible = i < 5;
|
|
|
|
|
|
}
|
|
|
|
|
|
dgvFiles.AutoResizeColumns();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void dgvFiles_CellContentClick(Object sender, DataGridViewCellEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
var parentFilId = (Int32)dgvFiles.Rows[e.RowIndex].Cells[1].Value;
|
|
|
|
|
|
|
|
|
|
|
|
var url = $"{ServiceUrls.FileContentControllerUrl()}/GetFileParts?ParentFileId={parentFilId}&readContent=true";
|
|
|
|
|
|
|
|
|
|
|
|
var result = LocalWebRequest.GetRequest(url, 1000);
|
|
|
|
|
|
var a = JsonConvert.DeserializeObject<List<FilePart>>(result);
|
|
|
|
|
|
|
|
|
|
|
|
lblFwNameSelected.Text = dgvFiles.Rows[e.RowIndex].Cells[1].Value.ToString();
|
|
|
|
|
|
lblSelectedID.Text = parentFilId.ToString();
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate = new MeterFwUpdate(_currentGenesis);
|
|
|
|
|
|
|
|
|
|
|
|
var fileApps = new List<FileApplications>();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var item in a)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.FileName.ToLower().EndsWith(".bin"))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var fileApplication = new FileApplications(item.FileName)
|
|
|
|
|
|
{
|
|
|
|
|
|
BinData = new List<Byte>(item.FileContent.ToList())
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
fileApps.Add(fileApplication);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (item.FileName.ToLower().EndsWith(".txt"))
|
|
|
|
|
|
{
|
|
|
|
|
|
//encode content
|
|
|
|
|
|
String ControlFileContent = "";
|
|
|
|
|
|
|
|
|
|
|
|
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
|
|
|
|
|
ControlFileContent = enc.GetString(item.FileContent.ToArray());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate.LoadPackageFileFromText(ControlFileContent);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
_meterFwUpdate.LoadFileApps(fileApps);
|
|
|
|
|
|
|
|
|
|
|
|
_meterFwUpdate?.CompareAllMeterAndFileApps();
|
|
|
|
|
|
_meterFwUpdate?.AssignGenesis(_currentGenesis);
|
|
|
|
|
|
FillDataGridWithAllInfos();
|
|
|
|
|
|
|
|
|
|
|
|
CheckPackageFileAndFileApps();
|
|
|
|
|
|
CheckUpdateEnabled();
|
|
|
|
|
|
_resetTimeMeasurement = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void button1_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_currentGenesis.SetLcdText(true, new Byte[] { 0x00, 0x00, 0x00, 0x00 });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void btnFixBat_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
_currentGenesis.Login();
|
|
|
|
|
|
_currentGenesis.WriteRegister("GENESISFLOW_SealDisplay", (UInt32)0, true, false);
|
|
|
|
|
|
_currentGenesis.ResetAlarm(GenesisMeter.Alarm.ALL);
|
|
|
|
|
|
|
|
|
|
|
|
_currentGenesis.WriteRegister("POWERMON_WarnFromClamp", (UInt32)630720000, true, false);
|
|
|
|
|
|
_currentGenesis.WriteRegister("POWERMON_BatteryQuantity", (UInt32)2, true, false);
|
|
|
|
|
|
_currentGenesis.WriteRegister("POWERMON_StoreConfiguration", (UInt32)1, true, false);
|
|
|
|
|
|
_currentGenesis.WriteRegister("GENESISFLOW_TriggerIdle", (UInt32)0, true, false);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_currentGenesis.StoreAllApps();
|
|
|
|
|
|
_currentGenesis.Logout();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(15000);
|
|
|
|
|
|
_currentGenesis.Login();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
throw;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void label2_Click(Object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|