aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs')
-rw-r--r--Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs173
1 files changed, 150 insertions, 23 deletions
diff --git a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs
index 7440f2ee4..19b416173 100644
--- a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs
+++ b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs
@@ -19,6 +19,7 @@ using Tango.Settings;
using System.IO;
using Tango.BL.Entities;
using Tango.PMR.Hardware;
+using Google.Protobuf;
namespace Tango.Integration.Operation
{
@@ -48,8 +49,32 @@ namespace Tango.Integration.Operation
/// Occurs when there is new diagnostics data available.
/// </summary>
public event EventHandler<PushDiagnosticsResponse> DiagnosticsDataAvailable;
+
+ /// <summary>
+ /// Occurs when a new debug log is available.
+ /// </summary>
public event EventHandler<DebugLogResponse> DebugLogAvailable;
+ /// <summary>
+ /// Occurs when a request has been sent.
+ /// </summary>
+ public event EventHandler<IMessage> RequestSent;
+
+ /// <summary>
+ /// Occurs when a response has been sent.
+ /// </summary>
+ public event EventHandler<IMessage> ResponseSent;
+
+ /// <summary>
+ /// Occurs when a request has timed out.
+ /// </summary>
+ public event EventHandler<RequestFailedEventArgs> RequestFailed;
+
+ /// <summary>
+ /// Occurs when a request response has been received.
+ /// </summary>
+ public event EventHandler<IMessage> ResponseReceived;
+
#endregion
#region Properties
@@ -137,22 +162,32 @@ namespace Tango.Integration.Operation
{
var request = new PushDiagnosticsRequest();
- LogRequest(request);
+ LogRequestSent(request);
+
+ bool responseLogged = false;
SendContinuousRequest<PushDiagnosticsRequest, PushDiagnosticsResponse>(request).ObserveOn(new NewThreadScheduler()).Subscribe(
(response) =>
{
_diagnosticsSent = true;
OnDiagnosticsDataAvailable(response);
+
+ if (!responseLogged)
+ {
+
+ responseLogged = true;
+ }
},
(ex) =>
{
_diagnosticsSent = false;
+ LogManager.Log(ex, "Diagnostics response has reached an exception.");
//Do I need separate event for each one ??
},
() =>
{
_diagnosticsSent = false;
+ LogManager.Log("Diagnostics response completed!?", LogCategory.Warning);
//What to do now ??
});
}
@@ -171,7 +206,7 @@ namespace Tango.Integration.Operation
if (value && State == TransportComponentState.Connected && !_debugSent)
{
var request = new DebugLogRequest();
- LogRequest(request);
+ LogRequestSent(request);
SendContinuousRequest<DebugLogRequest, DebugLogResponse>(request).ObserveOn(new NewThreadScheduler())
.Subscribe
@@ -226,6 +261,42 @@ namespace Tango.Integration.Operation
DebugLogAvailable?.Invoke(this, data);
}
+ /// <summary>
+ /// Called when the request has been sent
+ /// </summary>
+ /// <param name="response">The request.</param>
+ protected virtual void OnRequestSent(IMessage request)
+ {
+ RequestSent?.Invoke(this, request);
+ }
+
+ /// <summary>
+ /// Called when the response has been received
+ /// </summary>
+ /// <param name="response">The response.</param>
+ protected virtual void OnResponseReceived(IMessage response)
+ {
+ ResponseReceived?.Invoke(this, response);
+ }
+
+ /// <summary>
+ /// Called when the response has been sent
+ /// </summary>
+ /// <param name="response">The response.</param>
+ protected virtual void OnResponseSent(IMessage response)
+ {
+ ResponseSent?.Invoke(this, response);
+ }
+
+ /// <summary>
+ /// Called when the request has been failed
+ /// </summary>
+ /// <param name="request">The request.</param>
+ protected virtual void OnRequestFailed(IMessage request, Exception exception)
+ {
+ RequestFailed?.Invoke(this, new RequestFailedEventArgs(request, exception));
+ }
+
#endregion
#region Protected Methods
@@ -335,16 +406,24 @@ namespace Tango.Integration.Operation
}
});
- LogRequest(request);
+ LogRequestSent(request);
+ bool responseLogged = false;
SendContinuousRequest<JobRequest, JobResponse>(request).Subscribe((response) =>
{
handler.RaiseStatusReceived(response.Message.Status);
+
+ if (!responseLogged)
+ {
+ responseLogged = true;
+ LogResponseReceived(response.Message);
+ }
}, (ex) =>
{
if (!handler.IsCanceled)
{
handler.RaiseFailed(ex);
+ LogRequestFailed(request, ex);
}
}, () =>
{
@@ -364,8 +443,22 @@ namespace Tango.Integration.Operation
UploadProcessParametersRequest request = new UploadProcessParametersRequest();
request.ProcessParameters = new ProcessParameters();
processParameters.MapPrimitivesTo(request.ProcessParameters);
- LogRequest(request);
- return await SendRequest<UploadProcessParametersRequest, UploadProcessParametersResponse>(request);
+
+ UploadProcessParametersResponse response = null;
+
+ try
+ {
+ LogRequestSent(request);
+ response = await SendRequest<UploadProcessParametersRequest, UploadProcessParametersResponse>(request);
+ LogResponseReceived(response);
+ }
+ catch (Exception ex)
+ {
+ LogRequestFailed(request, ex);
+ throw ex;
+ }
+
+ return response;
}
/// <summary>
@@ -377,7 +470,7 @@ namespace Tango.Integration.Operation
{
UploadHardwareConfigurationRequest request = new UploadHardwareConfigurationRequest();
request.HardwareConfiguration = hardwareConfiguration;
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<UploadHardwareConfigurationRequest, UploadHardwareConfigurationResponse>(request);
}
@@ -388,8 +481,21 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<MotorJoggingResponse> StartMotorJogging(MotorJoggingRequest request)
{
- LogRequest(request);
- return await SendRequest<MotorJoggingRequest, MotorJoggingResponse>(request);
+ MotorJoggingResponse response = null;
+
+ try
+ {
+ LogRequestSent(request);
+ response = await SendRequest<MotorJoggingRequest, MotorJoggingResponse>(request);
+ LogResponseReceived(response);
+ }
+ catch (Exception ex)
+ {
+ LogRequestFailed(request, ex);
+ throw ex;
+ }
+
+ return response;
}
/// <summary>
@@ -399,7 +505,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<MotorAbortJoggingResponse> StopMotorJogging(MotorAbortJoggingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<MotorAbortJoggingRequest, MotorAbortJoggingResponse>(request);
}
@@ -410,7 +516,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public IObservable<MotorHomingResponse> StartMotorHoming(MotorHomingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return SendContinuousRequest<MotorHomingRequest, MotorHomingResponse>(request).Select(x => x.Message);
}
@@ -421,7 +527,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<MotorAbortHomingResponse> StopMotorHoming(MotorAbortHomingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<MotorAbortHomingRequest, MotorAbortHomingResponse>(request);
}
@@ -432,7 +538,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<DispenserJoggingResponse> StartDispenserJogging(DispenserJoggingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<DispenserJoggingRequest, DispenserJoggingResponse>(request);
}
@@ -443,7 +549,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<DispenserAbortJoggingResponse> StopDispenserJogging(DispenserAbortJoggingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<DispenserAbortJoggingRequest, DispenserAbortJoggingResponse>(request);
}
@@ -454,7 +560,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public IObservable<DispenserHomingResponse> StartDispenserHoming(DispenserHomingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return SendContinuousRequest<DispenserHomingRequest, DispenserHomingResponse>(request).Select(x => x.Message);
}
@@ -465,7 +571,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<DispenserAbortHomingResponse> StopDispenserHoming(DispenserAbortHomingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<DispenserAbortHomingRequest, DispenserAbortHomingResponse>(request);
}
@@ -476,7 +582,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<SetDigitalOutResponse> SetDigitalOut(SetDigitalOutRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<SetDigitalOutRequest, SetDigitalOutResponse>(request);
}
@@ -487,7 +593,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<ThreadJoggingResponse> StartThreadJogging(ThreadJoggingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<ThreadJoggingRequest, ThreadJoggingResponse>(request);
}
@@ -498,7 +604,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<ThreadAbortJoggingResponse> StopThreadJogging(ThreadAbortJoggingRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<ThreadAbortJoggingRequest, ThreadAbortJoggingResponse>(request);
}
@@ -509,7 +615,7 @@ namespace Tango.Integration.Operation
/// <returns></returns>
public async Task<SetComponentValueResponse> SetComponentValue(SetComponentValueRequest request)
{
- LogRequest(request);
+ LogRequestSent(request);
return await SendRequest<SetComponentValueRequest, SetComponentValueResponse>(request);
}
@@ -518,12 +624,33 @@ namespace Tango.Integration.Operation
#region Private Methods
/// <summary>
- /// Logs the request.
+ /// Logs the request sent.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ private void LogRequestSent(IMessage message)
+ {
+ _logManager.Log(String.Format("Sending request '{0}'...{1}{2}", message.GetType().Name, Environment.NewLine, message.ToJsonString()));
+ OnRequestSent(message);
+ }
+
+ /// <summary>
+ /// Logs the request failed.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ private void LogRequestFailed(IMessage message, Exception ex)
+ {
+ _logManager.Log(String.Format("Request failed '{0}'...{1}{2}{1}{3}", message.GetType().Name, Environment.NewLine, message.ToJsonString(), ex.ToString()), LogCategory.Error);
+ OnRequestFailed(message, ex);
+ }
+
+ /// <summary>
+ /// Logs the response received.
/// </summary>
- /// <param name="obj">The object.</param>
- private void LogRequest(Object obj)
+ /// <param name="message">The message.</param>
+ private void LogResponseReceived(IMessage message)
{
- _logManager.Log(String.Format("Sending message '{0}'...{1}{2}", obj.GetType().Name, Environment.NewLine, obj.ToJsonString()));
+ _logManager.Log(String.Format("Response received '{0}'...{1}{2}", message.GetType().Name, Environment.NewLine, message.ToJsonString()));
+ OnResponseReceived(message);
}
#endregion