Develop - GciBridge -> GCI -> PreadjustmentUI functions 2
This commit is contained in:
parent
ad208f9633
commit
bc72130d09
@ -243,6 +243,16 @@ namespace GenesisCordonelInterface.API
|
|||||||
return string.IsNullOrWhiteSpace(port) ? "<empty>" : port;
|
return string.IsNullOrWhiteSpace(port) ? "<empty>" : port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ConcurrentDictionary<RegisterDefinition, Byte[]> GetRegistersDicForSlot(int slot)
|
||||||
|
{
|
||||||
|
var meter = GetMeterThreadSafe(slot);
|
||||||
|
|
||||||
|
if (meter == null)
|
||||||
|
throw new Exception($"Slot {slot} not initialized.");
|
||||||
|
|
||||||
|
return meter.GetRegistersDic();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ================================== INIT/UPDATE ==================================
|
#region ================================== INIT/UPDATE ==================================
|
||||||
@ -1748,6 +1758,163 @@ namespace GenesisCordonelInterface.API
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustmentUI AMPLITUDE TEST process ==================================
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Execute standalone amplitude test process.
|
||||||
|
/// </summary>
|
||||||
|
public Task<bool> Preadjustment_AmplitudeTestAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
if (pp.Setting.TempOnly)
|
||||||
|
return Task.FromResult(true);
|
||||||
|
|
||||||
|
IProcess process;
|
||||||
|
|
||||||
|
if (pp.Setting.NumberOfPaths == 1)
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new SPAmplitudeTestProcess(
|
||||||
|
"Amplitude Test Single",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.Amplitude,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.AmplitudeFailed(pp.Setting.Culture),
|
||||||
|
4 * 60);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new AmplitudeTestProcess(
|
||||||
|
"Amplitude Test",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.Amplitude,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.AmplitudeFailed(pp.Setting.Culture),
|
||||||
|
4 * 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ExecuteProcessAsync(
|
||||||
|
process,
|
||||||
|
pp,
|
||||||
|
token);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustmentUI TEMPERATURE CALIBRATION process ==================================
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_TemperatureCalibrationAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
IProcess process;
|
||||||
|
|
||||||
|
if (pp.Setting.NumberOfPaths == 1)
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new SPTemperatureCalibrationProcess(
|
||||||
|
"Temperature Calibration Single",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.TempCal,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilTemperatureCalibrationFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.TempCalFailed(pp.Setting.Culture),
|
||||||
|
2 * 60);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new TemperatureCalibrationProcess(
|
||||||
|
"Temperature Calibration",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.TempCal,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilTemperatureCalibrationFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.TempCalFailed(pp.Setting.Culture),
|
||||||
|
2 * 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ExecuteProcessAsync(
|
||||||
|
process,
|
||||||
|
pp,
|
||||||
|
token);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustmentUI OFFSET TEST process ==================================
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_OffsetTestAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
if (pp.Setting.TempOnly)
|
||||||
|
return Task.FromResult(true);
|
||||||
|
|
||||||
|
IProcess process;
|
||||||
|
|
||||||
|
if (pp.Setting.NumberOfPaths == 1)
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new SPOffsetTestProcess(
|
||||||
|
"Offset Test Single",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.Offset,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilZeroflowOffsetTestFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.ZeroflowOffsetTestFailed(pp.Setting.Culture),
|
||||||
|
18 * 60);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new OffsetTestProcess(
|
||||||
|
"Offset Test",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.Offset,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilZeroflowOffsetTestFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.ZeroflowOffsetTestFailed(pp.Setting.Culture),
|
||||||
|
18 * 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ExecuteProcessAsync(
|
||||||
|
process,
|
||||||
|
pp,
|
||||||
|
token);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustmentUI COMPLETION process ==================================
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_CompletionAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
IProcess process;
|
||||||
|
|
||||||
|
if (pp.Setting.NumberOfPaths == 1)
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new SPCompletionProcess(
|
||||||
|
"Completion Single",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.Completion,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilCompletionFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.CompletionFailed(pp.Setting.Culture),
|
||||||
|
1 * 60);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
process =
|
||||||
|
new CompletionProcess(
|
||||||
|
"Completion",
|
||||||
|
PreAdjustmentControl.StatusPanelItems.Completion,
|
||||||
|
PreAdjustmentControl.PredefinedMessages.WaitUntilCompletionFinished(pp.Setting.Culture),
|
||||||
|
PreAdjustmentControl.PredefinedMessages.CompletionFailed(pp.Setting.Culture),
|
||||||
|
1 * 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ExecuteProcessAsync(
|
||||||
|
process,
|
||||||
|
pp,
|
||||||
|
token);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region ================================== PreAdjustmentUI process threading ==================================
|
#region ================================== PreAdjustmentUI process threading ==================================
|
||||||
|
|
||||||
public async Task<bool> ExecuteProcessAsync(
|
public async Task<bool> ExecuteProcessAsync(
|
||||||
|
|||||||
@ -466,11 +466,37 @@ namespace GenesisCordonelInterface.API
|
|||||||
ProcessProgress pp,
|
ProcessProgress pp,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
return _innerMeterAPI.Preadjustment_PreparationAsync(
|
return _innerMeterAPI.Preadjustment_PreparationAsync(pp, token);
|
||||||
pp,
|
|
||||||
token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_AmplitudeTestAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return _innerMeterAPI.Preadjustment_AmplitudeTestAsync(pp, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_TemperatureCalibrationAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return _innerMeterAPI.Preadjustment_TemperatureCalibrationAsync(pp, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_OffsetTestAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return _innerMeterAPI.Preadjustment_OffsetTestAsync(pp, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<bool> Preadjustment_CompletionAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return _innerMeterAPI.Preadjustment_CompletionAsync(pp, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -25,6 +25,15 @@ namespace GenesisCordonelInterface.Core.Threading
|
|||||||
|
|
||||||
public static class RetryWorker
|
public static class RetryWorker
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Executes an asynchronous operation with retry and timeout protection.
|
||||||
|
///
|
||||||
|
/// Important:
|
||||||
|
/// The timeout here protects the caller from waiting forever, but it does not forcibly abort
|
||||||
|
/// the underlying hardware operation. Because hardware/COM calls may continue running after
|
||||||
|
/// the timeout signal, this method waits for the original action to finish before starting
|
||||||
|
/// the next retry. This prevents overlapping COM requests on the same device.
|
||||||
|
/// </summary>
|
||||||
public static async Task<RetryResult<T>> RunWithRetryAsync<T>(
|
public static async Task<RetryResult<T>> RunWithRetryAsync<T>(
|
||||||
Func<Task<T>> action,
|
Func<Task<T>> action,
|
||||||
Func<T, bool> isSuccess,
|
Func<T, bool> isSuccess,
|
||||||
@ -41,21 +50,53 @@ namespace GenesisCordonelInterface.Core.Threading
|
|||||||
|
|
||||||
for (int attempt = 1; attempt <= maxAttempts; attempt++)
|
for (int attempt = 1; attempt <= maxAttempts; attempt++)
|
||||||
{
|
{
|
||||||
var actionTask = action();
|
Task<T> actionTask = null;
|
||||||
var timeoutTask = Task.Delay(timeoutMs);
|
|
||||||
|
|
||||||
var completedTask = await Task.WhenAny(actionTask, timeoutTask);
|
try
|
||||||
|
|
||||||
if (completedTask == timeoutTask)
|
|
||||||
{
|
{
|
||||||
timedOut = true;
|
log?.Invoke($"{operationName} started. Attempt {attempt}/{maxAttempts}");
|
||||||
log?.Invoke($"{operationName} timeout attempt {attempt}/{maxAttempts}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lastResult = await actionTask;
|
|
||||||
|
|
||||||
if (isSuccess(lastResult))
|
// Start real operation, for example Connect/GetPcbId/Login.
|
||||||
|
actionTask = action();
|
||||||
|
|
||||||
|
// Start independent timeout timer.
|
||||||
|
var timeoutTask = Task.Delay(timeoutMs);
|
||||||
|
|
||||||
|
// Wait until either operation completes or timeout expires.
|
||||||
|
var completedTask = await Task.WhenAny(actionTask, timeoutTask)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (completedTask == timeoutTask)
|
||||||
|
{
|
||||||
|
timedOut = true;
|
||||||
|
|
||||||
|
log?.Invoke(
|
||||||
|
$"{operationName} timed out. Attempt {attempt}/{maxAttempts}. " +
|
||||||
|
"Waiting for the running operation to finish before retry.");
|
||||||
|
|
||||||
|
// Critical part:
|
||||||
|
// Do NOT immediately start another retry.
|
||||||
|
// The hardware operation may still be active in ApiWorker.
|
||||||
|
// Starting another attempt immediately could corrupt communication.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
lastResult = await actionTask.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log?.Invoke(
|
||||||
|
$"{operationName} finished after timeout with exception: " +
|
||||||
|
$"{ex.GetType().Name}: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Operation completed before timeout.
|
||||||
|
lastResult = await actionTask.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decide whether the returned result means success.
|
||||||
|
if (lastResult != null && isSuccess(lastResult))
|
||||||
{
|
{
|
||||||
return new RetryResult<T>
|
return new RetryResult<T>
|
||||||
{
|
{
|
||||||
@ -63,15 +104,29 @@ namespace GenesisCordonelInterface.Core.Threading
|
|||||||
Success = true,
|
Success = true,
|
||||||
Attempts = attempt,
|
Attempts = attempt,
|
||||||
Duration = DateTime.Now - started,
|
Duration = DateTime.Now - started,
|
||||||
TimedOut = false
|
TimedOut = timedOut
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
logResult?.Invoke($"{operationName} failed attempt {attempt}/{maxAttempts}", lastResult);
|
logResult?.Invoke(
|
||||||
|
$"{operationName} failed. Attempt {attempt}/{maxAttempts}",
|
||||||
|
lastResult);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Covers exceptions thrown before timeout handling or by action startup.
|
||||||
|
log?.Invoke(
|
||||||
|
$"{operationName} exception on attempt {attempt}/{maxAttempts}: " +
|
||||||
|
$"{ex.GetType().Name}: {ex.Message}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delay before next retry, except after the final attempt.
|
||||||
if (attempt < maxAttempts)
|
if (attempt < maxAttempts)
|
||||||
await Task.Delay(delayMs);
|
{
|
||||||
|
log?.Invoke($"{operationName} waiting {delayMs} ms before retry.");
|
||||||
|
|
||||||
|
await Task.Delay(delayMs).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new RetryResult<T>
|
return new RetryResult<T>
|
||||||
|
|||||||
@ -1505,6 +1505,182 @@ namespace TBF.Rig.BridgeComponents.GciBridge
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustment AMPLITUDE TEST bridge ==================================
|
||||||
|
|
||||||
|
public async Task<bool> Preadjustment_AmplitudeTestAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
const string operation = nameof(Preadjustment_AmplitudeTestAsync);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
EnsureExternalInterface();
|
||||||
|
|
||||||
|
if (pp == null)
|
||||||
|
throw new ArgumentNullException(nameof(pp));
|
||||||
|
|
||||||
|
log.InfoFormat("{0}: {1} Start.", Name, operation);
|
||||||
|
|
||||||
|
bool result =
|
||||||
|
await gciExternalInterface
|
||||||
|
.Preadjustment_AmplitudeTestAsync(
|
||||||
|
pp,
|
||||||
|
token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
log.InfoFormat(
|
||||||
|
"{0}: {1} Finish. Success={2}",
|
||||||
|
Name,
|
||||||
|
operation,
|
||||||
|
result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log.Error(
|
||||||
|
string.Format("{0}: {1} failed.", Name, operation),
|
||||||
|
ex);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustment TEMPERATURE CALIBRATION bridge ==================================
|
||||||
|
|
||||||
|
public async Task<bool> Preadjustment_TemperatureCalibrationAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
const string operation = nameof(Preadjustment_TemperatureCalibrationAsync);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
EnsureExternalInterface();
|
||||||
|
|
||||||
|
if (pp == null)
|
||||||
|
throw new ArgumentNullException(nameof(pp));
|
||||||
|
|
||||||
|
log.InfoFormat("{0}: {1} Start.", Name, operation);
|
||||||
|
|
||||||
|
bool result =
|
||||||
|
await gciExternalInterface
|
||||||
|
.Preadjustment_TemperatureCalibrationAsync(
|
||||||
|
pp,
|
||||||
|
token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
log.InfoFormat(
|
||||||
|
"{0}: {1} Finish. Success={2}",
|
||||||
|
Name,
|
||||||
|
operation,
|
||||||
|
result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log.Error(
|
||||||
|
string.Format("{0}: {1} failed.", Name, operation),
|
||||||
|
ex);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustment OFFSET TEST bridge ==================================
|
||||||
|
|
||||||
|
public async Task<bool> Preadjustment_OffsetTestAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
const string operation = nameof(Preadjustment_OffsetTestAsync);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
EnsureExternalInterface();
|
||||||
|
|
||||||
|
if (pp == null)
|
||||||
|
throw new ArgumentNullException(nameof(pp));
|
||||||
|
|
||||||
|
log.InfoFormat("{0}: {1} Start.", Name, operation);
|
||||||
|
|
||||||
|
bool result =
|
||||||
|
await gciExternalInterface
|
||||||
|
.Preadjustment_OffsetTestAsync(
|
||||||
|
pp,
|
||||||
|
token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
log.InfoFormat(
|
||||||
|
"{0}: {1} Finish. Success={2}",
|
||||||
|
Name,
|
||||||
|
operation,
|
||||||
|
result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log.Error(
|
||||||
|
string.Format("{0}: {1} failed.", Name, operation),
|
||||||
|
ex);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ================================== PreAdjustment COMPLETION bridge ==================================
|
||||||
|
|
||||||
|
public async Task<bool> Preadjustment_CompletionAsync(
|
||||||
|
ProcessProgress pp,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
const string operation = nameof(Preadjustment_CompletionAsync);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
EnsureExternalInterface();
|
||||||
|
|
||||||
|
if (pp == null)
|
||||||
|
throw new ArgumentNullException(nameof(pp));
|
||||||
|
|
||||||
|
log.InfoFormat("{0}: {1} Start.", Name, operation);
|
||||||
|
|
||||||
|
bool result =
|
||||||
|
await gciExternalInterface
|
||||||
|
.Preadjustment_CompletionAsync(
|
||||||
|
pp,
|
||||||
|
token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
log.InfoFormat(
|
||||||
|
"{0}: {1} Finish. Success={2}",
|
||||||
|
Name,
|
||||||
|
operation,
|
||||||
|
result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log.Error(
|
||||||
|
string.Format("{0}: {1} failed.", Name, operation),
|
||||||
|
ex);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region ======================================= Helpers =======================================
|
#region ======================================= Helpers =======================================
|
||||||
private UDSRPublicModels.DataQuery CreatePasswordQuery(string pcbId)
|
private UDSRPublicModels.DataQuery CreatePasswordQuery(string pcbId)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -15,6 +15,7 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug
|
|||||||
private MainForm _mainform;
|
private MainForm _mainform;
|
||||||
private MainView _mainView;
|
private MainView _mainView;
|
||||||
public Grid.MeterGridManager _gridManager;
|
public Grid.MeterGridManager _gridManager;
|
||||||
|
public event Action SelectedSlotsChanged;
|
||||||
|
|
||||||
private bool isRefreshing;
|
private bool isRefreshing;
|
||||||
private List<string> comPorts = new List<string>();
|
private List<string> comPorts = new List<string>();
|
||||||
@ -267,8 +268,16 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug
|
|||||||
|
|
||||||
if (columnName == "Selected")
|
if (columnName == "Selected")
|
||||||
{
|
{
|
||||||
bool selected = Convert.ToBoolean(grid.Rows[e.RowIndex].Cells["Selected"].Value);
|
bool selected =
|
||||||
|
Convert.ToBoolean(
|
||||||
|
grid.Rows[e.RowIndex]
|
||||||
|
.Cells["Selected"]
|
||||||
|
.Value);
|
||||||
|
|
||||||
_api.SetSlotSelected(slot, selected);
|
_api.SetSlotSelected(slot, selected);
|
||||||
|
|
||||||
|
SelectedSlotsChanged?.Invoke();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using Common;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|||||||
@ -7,9 +7,8 @@
|
|||||||
private System.Windows.Forms.GroupBox grpSlots;
|
private System.Windows.Forms.GroupBox grpSlots;
|
||||||
|
|
||||||
private System.Windows.Forms.Button preparationActionButton;
|
private System.Windows.Forms.Button preparationActionButton;
|
||||||
private System.Windows.Forms.Button btnUpdateSlot;
|
|
||||||
private System.Windows.Forms.Button detectActionButton;
|
private System.Windows.Forms.Button detectActionButton;
|
||||||
private System.Windows.Forms.Button btnCleanAllSlots;
|
private System.Windows.Forms.Button temperatureCalibrationActionButton;
|
||||||
|
|
||||||
private System.Windows.Forms.Button btnCancel;
|
private System.Windows.Forms.Button btnCancel;
|
||||||
private System.Windows.Forms.TextBox txtLog;
|
private System.Windows.Forms.TextBox txtLog;
|
||||||
@ -25,47 +24,41 @@
|
|||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.grpSlots = new System.Windows.Forms.GroupBox();
|
this.grpSlots = new System.Windows.Forms.GroupBox();
|
||||||
this.writeRegisterNameComboBox = new System.Windows.Forms.ComboBox();
|
this.completionActionButton = new System.Windows.Forms.Button();
|
||||||
this.readRegisterNameComboBox = new System.Windows.Forms.ComboBox();
|
this.offsetTestActionButton = new System.Windows.Forms.Button();
|
||||||
this.label4 = new System.Windows.Forms.Label();
|
|
||||||
this.writeRegisterValueTextBox = new System.Windows.Forms.TextBox();
|
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
|
||||||
this.label2 = new System.Windows.Forms.Label();
|
|
||||||
this.writeRegisterButton = new System.Windows.Forms.Button();
|
|
||||||
this.readRegisterButton = new System.Windows.Forms.Button();
|
|
||||||
this.btnConnect = new System.Windows.Forms.Button();
|
|
||||||
this.btnDisconnect = new System.Windows.Forms.Button();
|
|
||||||
this.btnLogin = new System.Windows.Forms.Button();
|
|
||||||
this.btnGetPcbId = new System.Windows.Forms.Button();
|
|
||||||
this.preparationActionButton = new System.Windows.Forms.Button();
|
this.preparationActionButton = new System.Windows.Forms.Button();
|
||||||
this.btnUpdateSlot = new System.Windows.Forms.Button();
|
|
||||||
this.detectActionButton = new System.Windows.Forms.Button();
|
this.detectActionButton = new System.Windows.Forms.Button();
|
||||||
this.btnCleanAllSlots = new System.Windows.Forms.Button();
|
this.temperatureCalibrationActionButton = new System.Windows.Forms.Button();
|
||||||
this.btnCleanSlot = new System.Windows.Forms.Button();
|
this.amplitudeTestActionButton = new System.Windows.Forms.Button();
|
||||||
this.btnCancel = new System.Windows.Forms.Button();
|
this.btnCancel = new System.Windows.Forms.Button();
|
||||||
this.txtLog = new System.Windows.Forms.TextBox();
|
this.txtLog = new System.Windows.Forms.TextBox();
|
||||||
|
this.button1 = new System.Windows.Forms.Button();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.label2 = new System.Windows.Forms.Label();
|
||||||
|
this.label3 = new System.Windows.Forms.Label();
|
||||||
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
|
this.label5 = new System.Windows.Forms.Label();
|
||||||
|
this.label6 = new System.Windows.Forms.Label();
|
||||||
|
this.label7 = new System.Windows.Forms.Label();
|
||||||
this.grpSlots.SuspendLayout();
|
this.grpSlots.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// grpSlots
|
// grpSlots
|
||||||
//
|
//
|
||||||
this.grpSlots.Controls.Add(this.writeRegisterNameComboBox);
|
this.grpSlots.Controls.Add(this.label7);
|
||||||
this.grpSlots.Controls.Add(this.readRegisterNameComboBox);
|
this.grpSlots.Controls.Add(this.label6);
|
||||||
|
this.grpSlots.Controls.Add(this.label5);
|
||||||
this.grpSlots.Controls.Add(this.label4);
|
this.grpSlots.Controls.Add(this.label4);
|
||||||
this.grpSlots.Controls.Add(this.writeRegisterValueTextBox);
|
|
||||||
this.grpSlots.Controls.Add(this.label3);
|
this.grpSlots.Controls.Add(this.label3);
|
||||||
this.grpSlots.Controls.Add(this.label2);
|
this.grpSlots.Controls.Add(this.label2);
|
||||||
this.grpSlots.Controls.Add(this.writeRegisterButton);
|
this.grpSlots.Controls.Add(this.label1);
|
||||||
this.grpSlots.Controls.Add(this.readRegisterButton);
|
this.grpSlots.Controls.Add(this.button1);
|
||||||
this.grpSlots.Controls.Add(this.btnConnect);
|
this.grpSlots.Controls.Add(this.completionActionButton);
|
||||||
this.grpSlots.Controls.Add(this.btnDisconnect);
|
this.grpSlots.Controls.Add(this.offsetTestActionButton);
|
||||||
this.grpSlots.Controls.Add(this.btnLogin);
|
|
||||||
this.grpSlots.Controls.Add(this.btnGetPcbId);
|
|
||||||
this.grpSlots.Controls.Add(this.preparationActionButton);
|
this.grpSlots.Controls.Add(this.preparationActionButton);
|
||||||
this.grpSlots.Controls.Add(this.btnUpdateSlot);
|
|
||||||
this.grpSlots.Controls.Add(this.detectActionButton);
|
this.grpSlots.Controls.Add(this.detectActionButton);
|
||||||
this.grpSlots.Controls.Add(this.btnCleanAllSlots);
|
this.grpSlots.Controls.Add(this.temperatureCalibrationActionButton);
|
||||||
this.grpSlots.Controls.Add(this.btnCleanSlot);
|
this.grpSlots.Controls.Add(this.amplitudeTestActionButton);
|
||||||
this.grpSlots.Location = new System.Drawing.Point(10, 10);
|
this.grpSlots.Location = new System.Drawing.Point(10, 10);
|
||||||
this.grpSlots.Name = "grpSlots";
|
this.grpSlots.Name = "grpSlots";
|
||||||
this.grpSlots.Size = new System.Drawing.Size(689, 304);
|
this.grpSlots.Size = new System.Drawing.Size(689, 304);
|
||||||
@ -74,146 +67,56 @@
|
|||||||
this.grpSlots.Text = "Slots by selection in the table";
|
this.grpSlots.Text = "Slots by selection in the table";
|
||||||
this.grpSlots.Enter += new System.EventHandler(this.grpSlots_Enter);
|
this.grpSlots.Enter += new System.EventHandler(this.grpSlots_Enter);
|
||||||
//
|
//
|
||||||
// writeRegisterNameComboBox
|
// completionActionButton
|
||||||
//
|
//
|
||||||
this.writeRegisterNameComboBox.FormattingEnabled = true;
|
this.completionActionButton.Location = new System.Drawing.Point(390, 249);
|
||||||
this.writeRegisterNameComboBox.Location = new System.Drawing.Point(300, 264);
|
this.completionActionButton.Name = "completionActionButton";
|
||||||
this.writeRegisterNameComboBox.Name = "writeRegisterNameComboBox";
|
this.completionActionButton.Size = new System.Drawing.Size(150, 28);
|
||||||
this.writeRegisterNameComboBox.Size = new System.Drawing.Size(213, 21);
|
this.completionActionButton.TabIndex = 3;
|
||||||
this.writeRegisterNameComboBox.TabIndex = 15;
|
this.completionActionButton.Text = "Completition";
|
||||||
//
|
//
|
||||||
// readRegisterNameComboBox
|
// offsetTestActionButton
|
||||||
//
|
//
|
||||||
this.readRegisterNameComboBox.FormattingEnabled = true;
|
this.offsetTestActionButton.Location = new System.Drawing.Point(334, 215);
|
||||||
this.readRegisterNameComboBox.Location = new System.Drawing.Point(300, 230);
|
this.offsetTestActionButton.Name = "offsetTestActionButton";
|
||||||
this.readRegisterNameComboBox.Name = "readRegisterNameComboBox";
|
this.offsetTestActionButton.Size = new System.Drawing.Size(150, 28);
|
||||||
this.readRegisterNameComboBox.Size = new System.Drawing.Size(213, 21);
|
this.offsetTestActionButton.TabIndex = 5;
|
||||||
this.readRegisterNameComboBox.TabIndex = 14;
|
this.offsetTestActionButton.Text = "Offset test";
|
||||||
//
|
|
||||||
// label4
|
|
||||||
//
|
|
||||||
this.label4.AutoSize = true;
|
|
||||||
this.label4.Location = new System.Drawing.Point(224, 233);
|
|
||||||
this.label4.Name = "label4";
|
|
||||||
this.label4.Size = new System.Drawing.Size(78, 13);
|
|
||||||
this.label4.TabIndex = 13;
|
|
||||||
this.label4.Text = "Register name:";
|
|
||||||
//
|
|
||||||
// writeRegisterValueTextBox
|
|
||||||
//
|
|
||||||
this.writeRegisterValueTextBox.Location = new System.Drawing.Point(555, 264);
|
|
||||||
this.writeRegisterValueTextBox.Name = "writeRegisterValueTextBox";
|
|
||||||
this.writeRegisterValueTextBox.Size = new System.Drawing.Size(117, 20);
|
|
||||||
this.writeRegisterValueTextBox.TabIndex = 12;
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
this.label3.AutoSize = true;
|
|
||||||
this.label3.Location = new System.Drawing.Point(517, 267);
|
|
||||||
this.label3.Name = "label3";
|
|
||||||
this.label3.Size = new System.Drawing.Size(36, 13);
|
|
||||||
this.label3.TabIndex = 10;
|
|
||||||
this.label3.Text = "value:";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
this.label2.AutoSize = true;
|
|
||||||
this.label2.Location = new System.Drawing.Point(224, 267);
|
|
||||||
this.label2.Name = "label2";
|
|
||||||
this.label2.Size = new System.Drawing.Size(78, 13);
|
|
||||||
this.label2.TabIndex = 9;
|
|
||||||
this.label2.Text = "Register name:";
|
|
||||||
//
|
|
||||||
// writeRegisterButton
|
|
||||||
//
|
|
||||||
this.writeRegisterButton.Location = new System.Drawing.Point(15, 259);
|
|
||||||
this.writeRegisterButton.Name = "writeRegisterButton";
|
|
||||||
this.writeRegisterButton.Size = new System.Drawing.Size(203, 28);
|
|
||||||
this.writeRegisterButton.TabIndex = 7;
|
|
||||||
this.writeRegisterButton.Text = "WriteRegister(slot, registerName, value)";
|
|
||||||
this.writeRegisterButton.Click += new System.EventHandler(this.writeRegisterButton_Click);
|
|
||||||
//
|
|
||||||
// readRegisterButton
|
|
||||||
//
|
|
||||||
this.readRegisterButton.Location = new System.Drawing.Point(15, 225);
|
|
||||||
this.readRegisterButton.Name = "readRegisterButton";
|
|
||||||
this.readRegisterButton.Size = new System.Drawing.Size(203, 28);
|
|
||||||
this.readRegisterButton.TabIndex = 6;
|
|
||||||
this.readRegisterButton.Text = "ReadRegister(slot, registerName)";
|
|
||||||
//
|
|
||||||
// btnConnect
|
|
||||||
//
|
|
||||||
this.btnConnect.Location = new System.Drawing.Point(15, 158);
|
|
||||||
this.btnConnect.Name = "btnConnect";
|
|
||||||
this.btnConnect.Size = new System.Drawing.Size(150, 28);
|
|
||||||
this.btnConnect.TabIndex = 3;
|
|
||||||
this.btnConnect.Text = "Connect(slot)";
|
|
||||||
//
|
|
||||||
// btnDisconnect
|
|
||||||
//
|
|
||||||
this.btnDisconnect.Location = new System.Drawing.Point(15, 191);
|
|
||||||
this.btnDisconnect.Name = "btnDisconnect";
|
|
||||||
this.btnDisconnect.Size = new System.Drawing.Size(150, 28);
|
|
||||||
this.btnDisconnect.TabIndex = 4;
|
|
||||||
this.btnDisconnect.Text = "Disconnect(slot)";
|
|
||||||
//
|
|
||||||
// btnLogin
|
|
||||||
//
|
|
||||||
this.btnLogin.Location = new System.Drawing.Point(171, 158);
|
|
||||||
this.btnLogin.Name = "btnLogin";
|
|
||||||
this.btnLogin.Size = new System.Drawing.Size(150, 28);
|
|
||||||
this.btnLogin.TabIndex = 17;
|
|
||||||
this.btnLogin.Text = "Login(slot)";
|
|
||||||
//
|
|
||||||
// btnGetPcbId
|
|
||||||
//
|
|
||||||
this.btnGetPcbId.Location = new System.Drawing.Point(15, 125);
|
|
||||||
this.btnGetPcbId.Name = "btnGetPcbId";
|
|
||||||
this.btnGetPcbId.Size = new System.Drawing.Size(150, 28);
|
|
||||||
this.btnGetPcbId.TabIndex = 5;
|
|
||||||
this.btnGetPcbId.Text = "GetPcb(slot)";
|
|
||||||
//
|
//
|
||||||
// preparationActionButton
|
// preparationActionButton
|
||||||
//
|
//
|
||||||
this.preparationActionButton.Location = new System.Drawing.Point(15, 25);
|
this.preparationActionButton.Location = new System.Drawing.Point(203, 113);
|
||||||
this.preparationActionButton.Name = "preparationActionButton";
|
this.preparationActionButton.Name = "preparationActionButton";
|
||||||
this.preparationActionButton.Size = new System.Drawing.Size(150, 28);
|
this.preparationActionButton.Size = new System.Drawing.Size(150, 28);
|
||||||
this.preparationActionButton.TabIndex = 0;
|
this.preparationActionButton.TabIndex = 0;
|
||||||
this.preparationActionButton.Text = "Preparation";
|
this.preparationActionButton.Text = "Preparation";
|
||||||
this.preparationActionButton.Click += new System.EventHandler(this.preparationActionButton_Click);
|
this.preparationActionButton.Click += new System.EventHandler(this.preparationActionButton_Click);
|
||||||
//
|
//
|
||||||
// btnUpdateSlot
|
|
||||||
//
|
|
||||||
this.btnUpdateSlot.Location = new System.Drawing.Point(171, 25);
|
|
||||||
this.btnUpdateSlot.Name = "btnUpdateSlot";
|
|
||||||
this.btnUpdateSlot.Size = new System.Drawing.Size(150, 28);
|
|
||||||
this.btnUpdateSlot.TabIndex = 16;
|
|
||||||
this.btnUpdateSlot.Text = "UpdateSlot(slot)";
|
|
||||||
//
|
|
||||||
// detectActionButton
|
// detectActionButton
|
||||||
//
|
//
|
||||||
this.detectActionButton.Location = new System.Drawing.Point(15, 58);
|
this.detectActionButton.Location = new System.Drawing.Point(171, 79);
|
||||||
this.detectActionButton.Name = "detectActionButton";
|
this.detectActionButton.Name = "detectActionButton";
|
||||||
this.detectActionButton.Size = new System.Drawing.Size(150, 28);
|
this.detectActionButton.Size = new System.Drawing.Size(150, 28);
|
||||||
this.detectActionButton.TabIndex = 1;
|
this.detectActionButton.TabIndex = 1;
|
||||||
this.detectActionButton.Text = "Detect";
|
this.detectActionButton.Text = "Detect";
|
||||||
this.detectActionButton.Click += new System.EventHandler(this.detectActionButton_Click);
|
this.detectActionButton.Click += new System.EventHandler(this.detectActionButton_Click);
|
||||||
//
|
//
|
||||||
// btnCleanAllSlots
|
// temperatureCalibrationActionButton
|
||||||
//
|
//
|
||||||
this.btnCleanAllSlots.Location = new System.Drawing.Point(171, 92);
|
this.temperatureCalibrationActionButton.Location = new System.Drawing.Point(285, 181);
|
||||||
this.btnCleanAllSlots.Name = "btnCleanAllSlots";
|
this.temperatureCalibrationActionButton.Name = "temperatureCalibrationActionButton";
|
||||||
this.btnCleanAllSlots.Size = new System.Drawing.Size(150, 28);
|
this.temperatureCalibrationActionButton.Size = new System.Drawing.Size(150, 28);
|
||||||
this.btnCleanAllSlots.TabIndex = 2;
|
this.temperatureCalibrationActionButton.TabIndex = 2;
|
||||||
this.btnCleanAllSlots.Text = "CleanAllSlots()";
|
this.temperatureCalibrationActionButton.Text = "Temperature calibration";
|
||||||
|
this.temperatureCalibrationActionButton.Click += new System.EventHandler(this.amplitudeTestActionButton_Click);
|
||||||
//
|
//
|
||||||
// btnCleanSlot
|
// amplitudeTestActionButton
|
||||||
//
|
//
|
||||||
this.btnCleanSlot.Location = new System.Drawing.Point(15, 92);
|
this.amplitudeTestActionButton.Location = new System.Drawing.Point(246, 147);
|
||||||
this.btnCleanSlot.Name = "btnCleanSlot";
|
this.amplitudeTestActionButton.Name = "amplitudeTestActionButton";
|
||||||
this.btnCleanSlot.Size = new System.Drawing.Size(150, 28);
|
this.amplitudeTestActionButton.Size = new System.Drawing.Size(150, 28);
|
||||||
this.btnCleanSlot.TabIndex = 18;
|
this.amplitudeTestActionButton.TabIndex = 18;
|
||||||
this.btnCleanSlot.Text = "CleanSlot(slot)";
|
this.amplitudeTestActionButton.Text = "Amplitude test";
|
||||||
//
|
//
|
||||||
// btnCancel
|
// btnCancel
|
||||||
//
|
//
|
||||||
@ -239,6 +142,84 @@
|
|||||||
this.txtLog.TabIndex = 5;
|
this.txtLog.TabIndex = 5;
|
||||||
this.txtLog.WordWrap = false;
|
this.txtLog.WordWrap = false;
|
||||||
//
|
//
|
||||||
|
// button1
|
||||||
|
//
|
||||||
|
this.button1.Location = new System.Drawing.Point(17, 28);
|
||||||
|
this.button1.Name = "button1";
|
||||||
|
this.button1.Size = new System.Drawing.Size(150, 28);
|
||||||
|
this.button1.TabIndex = 108;
|
||||||
|
this.button1.Text = "Preadjustment init";
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.AutoSize = true;
|
||||||
|
this.label1.Location = new System.Drawing.Point(176, 121);
|
||||||
|
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(22, 13);
|
||||||
|
this.label1.TabIndex = 109;
|
||||||
|
this.label1.Text = "--->";
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
this.label2.AutoSize = true;
|
||||||
|
this.label2.Location = new System.Drawing.Point(219, 155);
|
||||||
|
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label2.Name = "label2";
|
||||||
|
this.label2.Size = new System.Drawing.Size(22, 13);
|
||||||
|
this.label2.TabIndex = 110;
|
||||||
|
this.label2.Text = "--->";
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
this.label3.AutoSize = true;
|
||||||
|
this.label3.Location = new System.Drawing.Point(258, 189);
|
||||||
|
this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label3.Name = "label3";
|
||||||
|
this.label3.Size = new System.Drawing.Size(22, 13);
|
||||||
|
this.label3.TabIndex = 111;
|
||||||
|
this.label3.Text = "--->";
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
this.label4.AutoSize = true;
|
||||||
|
this.label4.Location = new System.Drawing.Point(307, 223);
|
||||||
|
this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label4.Name = "label4";
|
||||||
|
this.label4.Size = new System.Drawing.Size(22, 13);
|
||||||
|
this.label4.TabIndex = 112;
|
||||||
|
this.label4.Text = "--->";
|
||||||
|
//
|
||||||
|
// label5
|
||||||
|
//
|
||||||
|
this.label5.AutoSize = true;
|
||||||
|
this.label5.Location = new System.Drawing.Point(363, 257);
|
||||||
|
this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label5.Name = "label5";
|
||||||
|
this.label5.Size = new System.Drawing.Size(22, 13);
|
||||||
|
this.label5.TabIndex = 113;
|
||||||
|
this.label5.Text = "--->";
|
||||||
|
//
|
||||||
|
// label6
|
||||||
|
//
|
||||||
|
this.label6.AutoSize = true;
|
||||||
|
this.label6.Location = new System.Drawing.Point(14, 87);
|
||||||
|
this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label6.Name = "label6";
|
||||||
|
this.label6.Size = new System.Drawing.Size(117, 13);
|
||||||
|
this.label6.TabIndex = 114;
|
||||||
|
this.label6.Text = "Preadjustment process:";
|
||||||
|
//
|
||||||
|
// label7
|
||||||
|
//
|
||||||
|
this.label7.AutoSize = true;
|
||||||
|
this.label7.Location = new System.Drawing.Point(144, 87);
|
||||||
|
this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.label7.Name = "label7";
|
||||||
|
this.label7.Size = new System.Drawing.Size(22, 13);
|
||||||
|
this.label7.TabIndex = 115;
|
||||||
|
this.label7.Text = "--->";
|
||||||
|
//
|
||||||
// PreadjustmentActionsView
|
// PreadjustmentActionsView
|
||||||
//
|
//
|
||||||
this.BackColor = System.Drawing.SystemColors.Control;
|
this.BackColor = System.Drawing.SystemColors.Control;
|
||||||
@ -254,18 +235,16 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private System.Windows.Forms.Button btnConnect;
|
private System.Windows.Forms.Button completionActionButton;
|
||||||
private System.Windows.Forms.Button btnDisconnect;
|
private System.Windows.Forms.Button offsetTestActionButton;
|
||||||
private System.Windows.Forms.Button btnGetPcbId;
|
private System.Windows.Forms.Button amplitudeTestActionButton;
|
||||||
private System.Windows.Forms.Button readRegisterButton;
|
private System.Windows.Forms.Button button1;
|
||||||
private System.Windows.Forms.TextBox writeRegisterValueTextBox;
|
private System.Windows.Forms.Label label5;
|
||||||
|
private System.Windows.Forms.Label label4;
|
||||||
private System.Windows.Forms.Label label3;
|
private System.Windows.Forms.Label label3;
|
||||||
private System.Windows.Forms.Label label2;
|
private System.Windows.Forms.Label label2;
|
||||||
private System.Windows.Forms.Button writeRegisterButton;
|
private System.Windows.Forms.Label label1;
|
||||||
private System.Windows.Forms.Label label4;
|
private System.Windows.Forms.Label label7;
|
||||||
private System.Windows.Forms.ComboBox writeRegisterNameComboBox;
|
private System.Windows.Forms.Label label6;
|
||||||
private System.Windows.Forms.ComboBox readRegisterNameComboBox;
|
|
||||||
private System.Windows.Forms.Button btnLogin;
|
|
||||||
private System.Windows.Forms.Button btnCleanSlot;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,19 +120,15 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
Cursor = busy ? Cursors.WaitCursor : Cursors.Default;
|
Cursor = busy ? Cursors.WaitCursor : Cursors.Default;
|
||||||
|
|
||||||
preparationActionButton.Enabled = !busy;
|
preparationActionButton.Enabled = !busy;
|
||||||
btnUpdateSlot.Enabled = !busy;
|
|
||||||
detectActionButton.Enabled = !busy;
|
detectActionButton.Enabled = !busy;
|
||||||
btnCleanAllSlots.Enabled = !busy;
|
temperatureCalibrationActionButton.Enabled = !busy;
|
||||||
btnGetPcbId.Enabled = !busy;
|
offsetTestActionButton.Enabled = !busy;
|
||||||
btnConnect.Enabled = !busy;
|
completionActionButton.Enabled = !busy;
|
||||||
btnDisconnect.Enabled = !busy;
|
amplitudeTestActionButton.Enabled = !busy;
|
||||||
readRegisterButton.Enabled = !busy;
|
amplitudeTestActionButton.Enabled = !busy;
|
||||||
writeRegisterButton.Enabled = !busy;
|
temperatureCalibrationActionButton.Enabled = !busy;
|
||||||
readRegisterNameComboBox.Enabled = !busy;
|
offsetTestActionButton.Enabled = !busy;
|
||||||
writeRegisterNameComboBox.Enabled = !busy;
|
completionActionButton.Enabled = !busy;
|
||||||
writeRegisterValueTextBox.Enabled = !busy;
|
|
||||||
btnLogin.Enabled = !busy;
|
|
||||||
btnCleanSlot.Enabled = !busy;
|
|
||||||
|
|
||||||
btnCancel.Enabled = busy;
|
btnCancel.Enabled = busy;
|
||||||
}
|
}
|
||||||
@ -154,13 +150,7 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
|
|
||||||
private void LoadRegisterComboBoxes()
|
private void LoadRegisterComboBoxes()
|
||||||
{
|
{
|
||||||
var registers = _bridge.GetAllRegisterNames();
|
|
||||||
|
|
||||||
readRegisterNameComboBox.Items.Clear();
|
|
||||||
writeRegisterNameComboBox.Items.Clear();
|
|
||||||
|
|
||||||
readRegisterNameComboBox.Items.AddRange(registers.ToArray());
|
|
||||||
writeRegisterNameComboBox.Items.AddRange(registers.ToArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void grpSlots_Enter(object sender, EventArgs e)
|
private void grpSlots_Enter(object sender, EventArgs e)
|
||||||
@ -281,6 +271,70 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void amplitudeTestActionButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExecuteAsync(async token =>
|
||||||
|
{
|
||||||
|
var pp = CreatePreparationProgress();
|
||||||
|
|
||||||
|
bool success = await _bridge.Preadjustment_AmplitudeTestAsync(pp, token);
|
||||||
|
|
||||||
|
Log(success
|
||||||
|
? "Amplitude Test completed."
|
||||||
|
: "Amplitude Test failed.");
|
||||||
|
|
||||||
|
RefreshGrid();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void temperatureCalibrationActionButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExecuteAsync(async token =>
|
||||||
|
{
|
||||||
|
var pp = CreatePreparationProgress();
|
||||||
|
|
||||||
|
bool success = await _bridge.Preadjustment_TemperatureCalibrationAsync(pp, token);
|
||||||
|
|
||||||
|
Log(success
|
||||||
|
? "Temperature Calibration completed."
|
||||||
|
: "Temperature Calibration failed.");
|
||||||
|
|
||||||
|
RefreshGrid();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void offsetTestActionButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExecuteAsync(async token =>
|
||||||
|
{
|
||||||
|
var pp = CreatePreparationProgress();
|
||||||
|
|
||||||
|
bool success = await _bridge.Preadjustment_OffsetTestAsync(pp, token);
|
||||||
|
|
||||||
|
Log(success
|
||||||
|
? "Offset Test completed."
|
||||||
|
: "Offset Test failed.");
|
||||||
|
|
||||||
|
RefreshGrid();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void completionActionButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExecuteAsync(async token =>
|
||||||
|
{
|
||||||
|
var pp = CreatePreparationProgress();
|
||||||
|
|
||||||
|
bool success = await _bridge.Preadjustment_CompletionAsync(pp, token);
|
||||||
|
|
||||||
|
Log(success
|
||||||
|
? "Completion completed."
|
||||||
|
: "Completion failed.");
|
||||||
|
|
||||||
|
RefreshGrid();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void writeRegisterButton_Click(object sender, EventArgs e)
|
private void writeRegisterButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
/*ExecuteAsync(async token =>
|
/*ExecuteAsync(async token =>
|
||||||
|
|||||||
@ -42,6 +42,7 @@
|
|||||||
this.btnGetSlot = new System.Windows.Forms.Button();
|
this.btnGetSlot = new System.Windows.Forms.Button();
|
||||||
this.btnCleanAllSlots = new System.Windows.Forms.Button();
|
this.btnCleanAllSlots = new System.Windows.Forms.Button();
|
||||||
this.btnCleanSlot = new System.Windows.Forms.Button();
|
this.btnCleanSlot = new System.Windows.Forms.Button();
|
||||||
|
this.writeRegisterValueTypeLabel = new System.Windows.Forms.Label();
|
||||||
this.btnCancel = new System.Windows.Forms.Button();
|
this.btnCancel = new System.Windows.Forms.Button();
|
||||||
this.txtLog = new System.Windows.Forms.TextBox();
|
this.txtLog = new System.Windows.Forms.TextBox();
|
||||||
this.grpSlots.SuspendLayout();
|
this.grpSlots.SuspendLayout();
|
||||||
@ -49,6 +50,9 @@
|
|||||||
//
|
//
|
||||||
// grpSlots
|
// grpSlots
|
||||||
//
|
//
|
||||||
|
this.grpSlots.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.grpSlots.Controls.Add(this.writeRegisterNameComboBox);
|
this.grpSlots.Controls.Add(this.writeRegisterNameComboBox);
|
||||||
this.grpSlots.Controls.Add(this.readRegisterNameComboBox);
|
this.grpSlots.Controls.Add(this.readRegisterNameComboBox);
|
||||||
this.grpSlots.Controls.Add(this.label4);
|
this.grpSlots.Controls.Add(this.label4);
|
||||||
@ -66,9 +70,10 @@
|
|||||||
this.grpSlots.Controls.Add(this.btnGetSlot);
|
this.grpSlots.Controls.Add(this.btnGetSlot);
|
||||||
this.grpSlots.Controls.Add(this.btnCleanAllSlots);
|
this.grpSlots.Controls.Add(this.btnCleanAllSlots);
|
||||||
this.grpSlots.Controls.Add(this.btnCleanSlot);
|
this.grpSlots.Controls.Add(this.btnCleanSlot);
|
||||||
|
this.grpSlots.Controls.Add(this.writeRegisterValueTypeLabel);
|
||||||
this.grpSlots.Location = new System.Drawing.Point(10, 10);
|
this.grpSlots.Location = new System.Drawing.Point(10, 10);
|
||||||
this.grpSlots.Name = "grpSlots";
|
this.grpSlots.Name = "grpSlots";
|
||||||
this.grpSlots.Size = new System.Drawing.Size(689, 304);
|
this.grpSlots.Size = new System.Drawing.Size(726, 304);
|
||||||
this.grpSlots.TabIndex = 2;
|
this.grpSlots.TabIndex = 2;
|
||||||
this.grpSlots.TabStop = false;
|
this.grpSlots.TabStop = false;
|
||||||
this.grpSlots.Text = "Slots by selection in the table";
|
this.grpSlots.Text = "Slots by selection in the table";
|
||||||
@ -103,7 +108,7 @@
|
|||||||
//
|
//
|
||||||
this.writeRegisterValueTextBox.Location = new System.Drawing.Point(555, 264);
|
this.writeRegisterValueTextBox.Location = new System.Drawing.Point(555, 264);
|
||||||
this.writeRegisterValueTextBox.Name = "writeRegisterValueTextBox";
|
this.writeRegisterValueTextBox.Name = "writeRegisterValueTextBox";
|
||||||
this.writeRegisterValueTextBox.Size = new System.Drawing.Size(117, 20);
|
this.writeRegisterValueTextBox.Size = new System.Drawing.Size(85, 20);
|
||||||
this.writeRegisterValueTextBox.TabIndex = 12;
|
this.writeRegisterValueTextBox.TabIndex = 12;
|
||||||
//
|
//
|
||||||
// label3
|
// label3
|
||||||
@ -223,6 +228,15 @@
|
|||||||
this.btnCleanSlot.Text = "CleanSlot(slot)";
|
this.btnCleanSlot.Text = "CleanSlot(slot)";
|
||||||
this.btnCleanSlot.Click += new System.EventHandler(this.btnCleanSlot_Click);
|
this.btnCleanSlot.Click += new System.EventHandler(this.btnCleanSlot_Click);
|
||||||
//
|
//
|
||||||
|
// writeRegisterValueTypeLabel
|
||||||
|
//
|
||||||
|
this.writeRegisterValueTypeLabel.AutoSize = true;
|
||||||
|
this.writeRegisterValueTypeLabel.Location = new System.Drawing.Point(646, 267);
|
||||||
|
this.writeRegisterValueTypeLabel.Name = "writeRegisterValueTypeLabel";
|
||||||
|
this.writeRegisterValueTypeLabel.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.writeRegisterValueTypeLabel.TabIndex = 19;
|
||||||
|
this.writeRegisterValueTypeLabel.Text = "type: -";
|
||||||
|
//
|
||||||
// btnCancel
|
// btnCancel
|
||||||
//
|
//
|
||||||
this.btnCancel.Enabled = false;
|
this.btnCancel.Enabled = false;
|
||||||
@ -243,18 +257,18 @@
|
|||||||
this.txtLog.Name = "txtLog";
|
this.txtLog.Name = "txtLog";
|
||||||
this.txtLog.ReadOnly = true;
|
this.txtLog.ReadOnly = true;
|
||||||
this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
this.txtLog.Size = new System.Drawing.Size(689, 232);
|
this.txtLog.Size = new System.Drawing.Size(726, 232);
|
||||||
this.txtLog.TabIndex = 5;
|
this.txtLog.TabIndex = 5;
|
||||||
this.txtLog.WordWrap = false;
|
this.txtLog.WordWrap = false;
|
||||||
//
|
//
|
||||||
// GenesisCordonelInterfaceView
|
// SlotsComPortsRegistersActionsView
|
||||||
//
|
//
|
||||||
this.BackColor = System.Drawing.SystemColors.Control;
|
this.BackColor = System.Drawing.SystemColors.Control;
|
||||||
this.Controls.Add(this.grpSlots);
|
this.Controls.Add(this.grpSlots);
|
||||||
this.Controls.Add(this.btnCancel);
|
this.Controls.Add(this.btnCancel);
|
||||||
this.Controls.Add(this.txtLog);
|
this.Controls.Add(this.txtLog);
|
||||||
this.Name = "GenesisCordonelInterfaceView";
|
this.Name = "SlotsComPortsRegistersActionsView";
|
||||||
this.Size = new System.Drawing.Size(719, 603);
|
this.Size = new System.Drawing.Size(756, 603);
|
||||||
this.grpSlots.ResumeLayout(false);
|
this.grpSlots.ResumeLayout(false);
|
||||||
this.grpSlots.PerformLayout();
|
this.grpSlots.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
@ -275,5 +289,6 @@
|
|||||||
private System.Windows.Forms.ComboBox readRegisterNameComboBox;
|
private System.Windows.Forms.ComboBox readRegisterNameComboBox;
|
||||||
private System.Windows.Forms.Button btnLogin;
|
private System.Windows.Forms.Button btnLogin;
|
||||||
private System.Windows.Forms.Button btnCleanSlot;
|
private System.Windows.Forms.Button btnCleanSlot;
|
||||||
|
private System.Windows.Forms.Label writeRegisterValueTypeLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -17,6 +17,8 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
private CancellationTokenSource _cts;
|
private CancellationTokenSource _cts;
|
||||||
private readonly Action _addSlotAction;
|
private readonly Action _addSlotAction;
|
||||||
private readonly Action _saveAction;
|
private readonly Action _saveAction;
|
||||||
|
private readonly Dictionary<string, Type> _registerTypes =
|
||||||
|
new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
public SlotsComPortsRegistersActionsView(
|
public SlotsComPortsRegistersActionsView(
|
||||||
MainView mainview,
|
MainView mainview,
|
||||||
@ -33,6 +35,13 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
LoadRegisterComboBoxes();
|
LoadRegisterComboBoxes();
|
||||||
|
|
||||||
|
_mainView._batchPanel.SelectedSlotsChanged -= LoadRegisterComboBoxes;
|
||||||
|
_mainView._batchPanel.SelectedSlotsChanged += LoadRegisterComboBoxes;
|
||||||
|
writeRegisterNameComboBox.SelectedIndexChanged -= writeRegisterNameComboBox_SelectedIndexChanged;
|
||||||
|
writeRegisterNameComboBox.SelectedIndexChanged += writeRegisterNameComboBox_SelectedIndexChanged;
|
||||||
|
writeRegisterNameComboBox.TextChanged -= writeRegisterNameComboBox_SelectedIndexChanged;
|
||||||
|
writeRegisterNameComboBox.TextChanged += writeRegisterNameComboBox_SelectedIndexChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddSlot()
|
private void AddSlot()
|
||||||
@ -48,14 +57,14 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
private List<GciPublicModels.MeterBatchDebugStatus> GetSelectedSlots()
|
private List<GciPublicModels.MeterBatchDebugStatus> GetSelectedSlots()
|
||||||
{
|
{
|
||||||
if (_mainView == null || _mainView._batchPanel == null)
|
if (_mainView == null || _mainView._batchPanel == null)
|
||||||
throw new Exception("Meter batch grid is not available.");
|
{
|
||||||
|
Log("Meter batch grid is not available.");
|
||||||
|
|
||||||
var slots = _mainView._batchPanel.GetSelectedGridData();
|
return new List<GciPublicModels.MeterBatchDebugStatus>();
|
||||||
|
}
|
||||||
|
|
||||||
if (slots.Count == 0)
|
return _mainView._batchPanel.GetSelectedGridData()
|
||||||
throw new Exception("No selected slots in grid.");
|
?? new List<GciPublicModels.MeterBatchDebugStatus>();
|
||||||
|
|
||||||
return slots;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RefreshGrid(int? removedSlot = null)
|
private void RefreshGrid(int? removedSlot = null)
|
||||||
@ -414,16 +423,7 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
if (string.IsNullOrWhiteSpace(valueText))
|
if (string.IsNullOrWhiteSpace(valueText))
|
||||||
throw new Exception("Write register value is empty.");
|
throw new Exception("Write register value is empty.");
|
||||||
|
|
||||||
object value;
|
object value = ConvertTextToRegisterValue(registerName, valueText);
|
||||||
|
|
||||||
if (registerName == "GENESISFLOW_LedMode")
|
|
||||||
{
|
|
||||||
value = byte.Parse(valueText);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = valueText;
|
|
||||||
}
|
|
||||||
|
|
||||||
var tasks = GetSelectedSlots()
|
var tasks = GetSelectedSlots()
|
||||||
.Select(async slot =>
|
.Select(async slot =>
|
||||||
@ -530,18 +530,162 @@ namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge
|
|||||||
|
|
||||||
private void LoadRegisterComboBoxes()
|
private void LoadRegisterComboBoxes()
|
||||||
{
|
{
|
||||||
var registers = _bridge.GetAllRegisterNames();
|
_registerTypes.Clear();
|
||||||
|
|
||||||
readRegisterNameComboBox.Items.Clear();
|
readRegisterNameComboBox.Items.Clear();
|
||||||
writeRegisterNameComboBox.Items.Clear();
|
writeRegisterNameComboBox.Items.Clear();
|
||||||
|
|
||||||
readRegisterNameComboBox.Items.AddRange(registers.ToArray());
|
var selectedSlots = GetSelectedSlots();
|
||||||
writeRegisterNameComboBox.Items.AddRange(registers.ToArray());
|
|
||||||
|
if (selectedSlots.Count == 0)
|
||||||
|
{
|
||||||
|
Log("No selected slot.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int slot = selectedSlots
|
||||||
|
.OrderBy(x => x.Slot)
|
||||||
|
.First()
|
||||||
|
.Slot;
|
||||||
|
|
||||||
|
var registers = _mainView._laatzenApi.GetRegistersDicForSlot(slot);
|
||||||
|
|
||||||
|
var uniqueRegisters = registers
|
||||||
|
.GroupBy(x => x.Key.GetIdent())
|
||||||
|
.Select(g => g.First())
|
||||||
|
.OrderBy(x => x.Key.GetIdent())
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var item in uniqueRegisters)
|
||||||
|
{
|
||||||
|
string registerName = item.Key.GetIdent();
|
||||||
|
Type dataType = item.Key.DataType;
|
||||||
|
|
||||||
|
_registerTypes[registerName] = dataType;
|
||||||
|
|
||||||
|
readRegisterNameComboBox.Items.Add(registerName);
|
||||||
|
writeRegisterNameComboBox.Items.Add(registerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log($"Loaded {uniqueRegisters.Count} unique registers from slot {slot}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void grpSlots_Enter(object sender, EventArgs e)
|
private void grpSlots_Enter(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeRegisterNameComboBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
string registerName = Convert.ToString(writeRegisterNameComboBox.Text).Trim();
|
||||||
|
|
||||||
|
if (_registerTypes.TryGetValue(registerName, out var type))
|
||||||
|
{
|
||||||
|
writeRegisterValueTypeLabel.Text = $"type: {type.Name}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeRegisterValueTypeLabel.Text = "type: -";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private object ConvertTextToRegisterValue(
|
||||||
|
string registerName,
|
||||||
|
string valueText)
|
||||||
|
{
|
||||||
|
if (!_registerTypes.TryGetValue(
|
||||||
|
registerName,
|
||||||
|
out var targetType))
|
||||||
|
{
|
||||||
|
throw new Exception(
|
||||||
|
$"Unknown register type for register '{registerName}'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ConvertTextToType(
|
||||||
|
valueText,
|
||||||
|
targetType,
|
||||||
|
registerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private object ConvertTextToType(
|
||||||
|
string valueText,
|
||||||
|
Type targetType,
|
||||||
|
string registerName)
|
||||||
|
{
|
||||||
|
if (targetType == typeof(string))
|
||||||
|
return valueText;
|
||||||
|
|
||||||
|
if (targetType.IsEnum)
|
||||||
|
{
|
||||||
|
return Enum.Parse(
|
||||||
|
targetType,
|
||||||
|
valueText,
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetType == typeof(byte[]))
|
||||||
|
{
|
||||||
|
return ParseByteArray(valueText);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetType.Name == "Enum8")
|
||||||
|
{
|
||||||
|
return byte.Parse(valueText);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Convert.ChangeType(
|
||||||
|
valueText,
|
||||||
|
targetType,
|
||||||
|
System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception(
|
||||||
|
$"Value '{valueText}' cannot be converted to '{targetType.Name}' for register '{registerName}'.",
|
||||||
|
ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] ParseByteArray(string valueText)
|
||||||
|
{
|
||||||
|
valueText = valueText.Trim();
|
||||||
|
|
||||||
|
if (valueText.Contains("-") ||
|
||||||
|
valueText.Contains(" "))
|
||||||
|
{
|
||||||
|
return valueText
|
||||||
|
.Split(
|
||||||
|
new[] { '-', ' ', ',', ';' },
|
||||||
|
StringSplitOptions.RemoveEmptyEntries)
|
||||||
|
.Select(x => x.Replace("0x", ""))
|
||||||
|
.Select(x => Convert.ToByte(x, 16))
|
||||||
|
.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
valueText =
|
||||||
|
valueText.Replace("0x", "");
|
||||||
|
|
||||||
|
if (valueText.Length % 2 != 0)
|
||||||
|
{
|
||||||
|
throw new Exception(
|
||||||
|
"Hex string length must be even.");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] result =
|
||||||
|
new byte[valueText.Length / 2];
|
||||||
|
|
||||||
|
for (int i = 0; i < result.Length; i++)
|
||||||
|
{
|
||||||
|
string hex =
|
||||||
|
valueText.Substring(i * 2, 2);
|
||||||
|
|
||||||
|
result[i] =
|
||||||
|
Convert.ToByte(hex, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4450,6 +4450,10 @@
|
|||||||
<Project>{d0c8d887-ed52-40ab-a069-90bce0e801e2}</Project>
|
<Project>{d0c8d887-ed52-40ab-a069-90bce0e801e2}</Project>
|
||||||
<Name>CordonelPreadjustmentUi</Name>
|
<Name>CordonelPreadjustmentUi</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\ExternalProjects\Laatzen\Genesis\Common\Hardware\WaterMeter\Genesis\Registers\Registers.csproj">
|
||||||
|
<Project>{f4aaf7e6-7333-4284-b735-e32deb076c64}</Project>
|
||||||
|
<Name>Registers</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\ExternalProjects\Laatzen\Genesis\Common\Logic\ProductionOrderCore\ProductionOrderCore.csproj">
|
<ProjectReference Include="..\ExternalProjects\Laatzen\Genesis\Common\Logic\ProductionOrderCore\ProductionOrderCore.csproj">
|
||||||
<Project>{6d2777bb-7a88-466d-a49b-3266f9bf0160}</Project>
|
<Project>{6d2777bb-7a88-466d-a49b-3266f9bf0160}</Project>
|
||||||
<Name>ProductionOrderCore</Name>
|
<Name>ProductionOrderCore</Name>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user