458 lines
15 KiB
C#
458 lines
15 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using GenesisCordonelInterface.API;
|
|
using log4net;
|
|
using TBF.Rig.BridgeComponents.GciBridge;
|
|
using TBF.Rig.RegisterReaders.GenesisRegReader.implementations;
|
|
using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.diagnosticLed;
|
|
using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.protocolCommons;
|
|
|
|
|
|
namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication
|
|
{
|
|
public class RadioService
|
|
{
|
|
private static readonly ILog log = LogManager.GetLogger(typeof(RadioService));
|
|
|
|
static string okResponse = "Command complete, no errors";
|
|
static string errorResponse = "Unable to execute";
|
|
|
|
private GciBridge _bridge;
|
|
|
|
public RadioService(GciBridge genesisHeadCommInterfaceBridgeComponent)
|
|
{
|
|
this._bridge = genesisHeadCommInterfaceBridgeComponent;
|
|
log.Debug("RadioService created with GciBridge= " + genesisHeadCommInterfaceBridgeComponent + "");
|
|
}
|
|
|
|
public async Task<string> ReadRequest_PCBAsyn1(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return null;
|
|
|
|
var connectTask = iHead.CommInterfaceBridge.ConnectAsync(iHead.GetSlotNr);
|
|
|
|
// Wait either for ConnectAsync or timeout
|
|
if (await Task.WhenAny(connectTask, Task.Delay(TimeSpan.FromMinutes(1))) != connectTask)
|
|
{
|
|
// Timed out
|
|
return null;
|
|
}
|
|
|
|
var result = await connectTask;
|
|
|
|
if (result == null || !result.Success || !result.IsConnected)
|
|
return null;
|
|
|
|
string pcbId = result.PcbId;
|
|
|
|
if (!string.IsNullOrEmpty(pcbId))
|
|
{
|
|
if (iHead.ConfigStruct != null)
|
|
iHead.ConfigStruct.PCBNumberString = pcbId;
|
|
|
|
return pcbId;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public async Task<string> ReadRequest_PCBAsync(GenesisSmartReader iHead)
|
|
{
|
|
log.Debug("ReadRequest_PCB called for iHead: " + iHead);
|
|
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return null;
|
|
|
|
using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(1));
|
|
|
|
PublicModels.GciConnectResult result;
|
|
|
|
try
|
|
{
|
|
log.Debug("ReadRequest_PCB() - calling ConnectAsync");
|
|
|
|
result = await iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr, cts.Token)
|
|
.ConfigureAwait(false);
|
|
|
|
log.Debug("ReadRequest_PCB() - ConnectAsync completed");
|
|
}
|
|
catch (OperationCanceledException)
|
|
{
|
|
log.Debug("ReadRequest_PCB() - ConnectAsync timeout/cancelled");
|
|
return null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.Error("ReadRequest_PCB() - ConnectAsync failed", ex);
|
|
return null;
|
|
}
|
|
|
|
if (result == null || !result.Success || !result.IsConnected)
|
|
{
|
|
log.Debug("ReadRequest_PCB() - invalid result: " + result);
|
|
return null;
|
|
}
|
|
|
|
string pcbId = result.PcbId;
|
|
|
|
if (string.IsNullOrEmpty(pcbId))
|
|
{
|
|
log.Debug("ReadRequest_PCB() - pcbId is empty");
|
|
return null;
|
|
}
|
|
|
|
if (iHead.ConfigStruct != null)
|
|
{
|
|
iHead.ConfigStruct.PCBNumberString = pcbId;
|
|
log.Debug("ReadRequest_PCB() - PCBNumberString: " + pcbId);
|
|
}
|
|
|
|
return pcbId;
|
|
}
|
|
|
|
public string ReadRequest_PCB(ref GenesisSmartReader iHead)
|
|
{
|
|
var head = iHead; // <-- copy to local (no longer ref)
|
|
|
|
log.Debug("ReadRequest_PCB called for iHead: " + head);
|
|
|
|
if (head?.CommInterfaceBridge == null)
|
|
return null;
|
|
|
|
try
|
|
{
|
|
var connectTask = Task.Run(async () =>
|
|
await head.CommInterfaceBridge.ConnectAsync(head.GetSlotNr)
|
|
);
|
|
|
|
var completedTask = Task.WhenAny(
|
|
connectTask,
|
|
Task.Delay(TimeSpan.FromMinutes(1))
|
|
).GetAwaiter().GetResult();
|
|
|
|
if (completedTask != connectTask)
|
|
{
|
|
log.Debug("ReadRequest_PCB() - Timeout happened");
|
|
return null;
|
|
}
|
|
|
|
var result = connectTask.GetAwaiter().GetResult();
|
|
log.Debug("ReadRequest_PCB() - Result: " + result);
|
|
|
|
if (result == null || !result.Success || !result.IsConnected)
|
|
return null;
|
|
|
|
var pcbId = result.PcbId;
|
|
log.Debug("Result pcbId: " + pcbId);
|
|
|
|
if (!string.IsNullOrEmpty(pcbId) && head.ConfigStruct != null)
|
|
{
|
|
head.ConfigStruct.PCBNumberString = pcbId;
|
|
log.Debug("Result set to ConfigStruct.PCBNumberString = " + head.ConfigStruct.PCBNumberString);
|
|
}
|
|
|
|
return pcbId;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.Error("ReadRequest_PCB() failed", ex);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public string ReadRequest_PCB2(ref GenesisSmartReader iHead)
|
|
{
|
|
return ReadRequest_PCBAsync(iHead).GetAwaiter().GetResult();
|
|
}
|
|
|
|
public string ReadRequest_PCB1(ref GenesisSmartReader iHead)
|
|
{
|
|
log.Debug("ReadRequest_PCB called for iHead: " + iHead.ToString());
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return null;
|
|
|
|
// -- connection --
|
|
var connectTask = iHead.CommInterfaceBridge.ConnectAsync(iHead.GetSlotNr);
|
|
log.Debug("ReadRequest_PCB() - ConnectAsync created, Now waiting for result");
|
|
|
|
var completedTask = Task.WhenAny(
|
|
connectTask,
|
|
Task.Delay(TimeSpan.FromMinutes(1))
|
|
).GetAwaiter().GetResult();
|
|
|
|
log.Debug("ReadRequest_PCB() - CompletedTask: " + completedTask);
|
|
|
|
// Timeout happened
|
|
if (completedTask != connectTask)
|
|
{
|
|
log.Debug("ReadRequest_PCB() - Timeout happened");
|
|
return null;
|
|
}
|
|
|
|
var result = connectTask.GetAwaiter().GetResult();
|
|
log.Debug("ReadRequest_PCB() - ConnectAsync completed");
|
|
|
|
if (result == null || !result.Success || !result.IsConnected)
|
|
return null;
|
|
log.Debug("ReadRequest_PCB() - result: " + result);
|
|
//~ -- connection --
|
|
|
|
string pcbId = result.PcbId;
|
|
log.Debug("ReadRequest_PCB() - pcbId: " + pcbId);
|
|
|
|
if (!string.IsNullOrEmpty(pcbId))
|
|
{
|
|
if (iHead.ConfigStruct != null)
|
|
{
|
|
iHead.ConfigStruct.PCBNumberString = pcbId;
|
|
log.Debug("ReadRequest_PCB() - iHead.ConfigStruct.PCBNumberString: " +
|
|
iHead.ConfigStruct.PCBNumberString);
|
|
}
|
|
|
|
return pcbId;
|
|
}
|
|
|
|
log.Debug("ReadRequest_PCB() - pcbId is empty");
|
|
return null;
|
|
}
|
|
|
|
public ProtocolStatuses GetActivityStatusMode(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return ProtocolStatuses.Unknown;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return ProtocolStatuses.Unknown;
|
|
|
|
var pcbResult = iHead.CommInterfaceBridge
|
|
.GetPcbIdAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (pcbResult == null || !pcbResult.Success || string.IsNullOrWhiteSpace(pcbResult.PcbId))
|
|
return ProtocolStatuses.Unknown;
|
|
|
|
if (iHead.ConfigStruct != null)
|
|
{
|
|
iHead.ConfigStruct.PCBNumberString = pcbResult.PcbId;
|
|
}
|
|
|
|
return ProtocolStatuses.Active;
|
|
}
|
|
|
|
public DiagnosticLedState SetOptoStatusMode(GenesisSmartReader iHead, DiagnosticLedState opthoStatusMode)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return DiagnosticLedState.StatusUnknown;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return DiagnosticLedState.StatusUnknown;
|
|
|
|
//SetDiagnosticLEDState
|
|
|
|
var pcbResult = iHead.CommInterfaceBridge
|
|
.GetPcbIdAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (pcbResult == null || !pcbResult.Success || string.IsNullOrWhiteSpace(pcbResult.PcbId))
|
|
return DiagnosticLedState.StatusUnknown;
|
|
|
|
if (iHead.ConfigStruct != null)
|
|
{
|
|
iHead.ConfigStruct.PCBNumberString = pcbResult.PcbId;
|
|
}
|
|
|
|
|
|
return DiagnosticLedState.StatusUnknown;
|
|
}
|
|
|
|
|
|
private static ushort SafeIntToUShort(int value)
|
|
{
|
|
if (value < ushort.MinValue || value > ushort.MaxValue)
|
|
return 0xFD; // your error code
|
|
|
|
return (ushort)value;
|
|
}
|
|
|
|
|
|
public string GetVersion(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return string.Empty;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return string.Empty;
|
|
|
|
// if (!string.IsNullOrEmpty(version))
|
|
// {
|
|
// if (iHead.ConfigStruct != null) // store mechanism
|
|
// {
|
|
// iHead.ConfigStruct.Version = version;
|
|
// }
|
|
// return version;
|
|
// }
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
|
|
public bool SetActivityMode_Active(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return false;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return false;
|
|
|
|
//Set LED to state 4
|
|
// string version = _bridge?.GciExternalInterface?.GetPcbId(iHead.GetSlotNr);
|
|
// if (!string.IsNullOrEmpty(version))
|
|
// {
|
|
// if (iHead.ConfigStruct != null) // store mechanism
|
|
// {
|
|
// iHead.ConfigStruct.Version = version;
|
|
// }
|
|
// return true;
|
|
// }
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool SetActivityMode_Idle(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return false;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return false;
|
|
|
|
//Set Activity State Idle
|
|
// string version = _bridge?.GciExternalInterface?.GetPcbId(iHead.GetSlotNr);
|
|
// if (!string.IsNullOrEmpty(version))
|
|
// {
|
|
// if (iHead.ConfigStruct != null) // store mechanism
|
|
// {
|
|
// iHead.ConfigStruct.Version = version;
|
|
// }
|
|
// return true;
|
|
// }
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool SetOptTestMode(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return false;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return false;
|
|
|
|
//Set LED to state 4
|
|
// string version = _bridge?.GciExternalInterface?.GetPcbId(iHead.GetSlotNr);
|
|
// if (!string.IsNullOrEmpty(version))
|
|
// {
|
|
// if (iHead.ConfigStruct != null) // store mechanism
|
|
// {
|
|
// iHead.ConfigStruct.Version = version;
|
|
// }
|
|
// return true;
|
|
// }
|
|
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// stop data streaming by LED
|
|
/// </summary>
|
|
/// <param name="iHead"></param>
|
|
/// <returns></returns>
|
|
public bool SetOptActiveMode(GenesisSmartReader iHead)
|
|
{
|
|
if (iHead?.CommInterfaceBridge == null)
|
|
return false;
|
|
|
|
var connectResult = iHead.CommInterfaceBridge
|
|
.ConnectAsync(iHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return false;
|
|
|
|
//Set LED to state 1
|
|
// string version = _bridge?.GciExternalInterface?.GetPcbId(iHead.GetSlotNr);
|
|
// if (!string.IsNullOrEmpty(version))
|
|
// {
|
|
// if (iHead.ConfigStruct != null) // store mechanism
|
|
// {
|
|
// iHead.ConfigStruct.Version = version;
|
|
// }
|
|
// return true;
|
|
// }
|
|
|
|
return false;
|
|
}
|
|
|
|
public string GetUnit(GenesisSmartReader iperlHead)
|
|
{
|
|
if (iperlHead?.CommInterfaceBridge == null)
|
|
return string.Empty;
|
|
|
|
var connectResult = iperlHead.CommInterfaceBridge
|
|
.ConnectAsync(iperlHead.GetSlotNr)
|
|
.GetAwaiter()
|
|
.GetResult();
|
|
|
|
if (connectResult == null || !connectResult.Success || !connectResult.IsConnected)
|
|
return string.Empty;
|
|
|
|
// string version = _bridge?.GciExternalInterface?.GetPcbId(iperlHead.GetSlotNr);
|
|
// if (!string.IsNullOrEmpty(version))
|
|
// {
|
|
// if (iperlHead.ConfigStruct != null) // store mechanism
|
|
// {
|
|
// iperlHead.ConfigStruct.Version = version;
|
|
// }
|
|
// return version;
|
|
// }
|
|
|
|
return string.Empty;
|
|
}
|
|
}
|
|
} |