diff options
Diffstat (limited to 'Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs | 173 |
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 |
