///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using log4net;
using NHibernate;
using Common;
using Config.Entities;
using SharedDatabase.Entities;
namespace TBF.UiBridge
{
///
/// Provides separation of the UI and the state machine.
///
static class Bridge
{
static readonly ILog log = LogManager.GetLogger(typeof(Bridge));
public static readonly Queue Ui2MachineQueue;
public static int BatchNr;
static Bridge()
{
Ui2MachineQueue = new Queue();
}
///
/// This function should be called from the UI
///
///
public static void Ui2Bench(UI2BenchCmd cmd)
{
lock (Ui2MachineQueue)
{
Ui2MachineQueue.Enqueue(cmd);
}
}
///
/// This function should be called from state machine operations
///
public static void Bench2UI(ButtonsEtc flags)
{
if (ButtonsEtcHandler == null) return;
try { ButtonsEtcHandler(null, new ButtonsEtcEventArgs(flags)); }
catch (Exception e) { log.Error("UiEventHandler(...) failed", e); }
}
public static event EventHandler ButtonsEtcHandler;
///
/// Called from the state machine when a procedure is selected and UI needs to be updated.
///
public static void OnProcedureSelected(object sender, ProcedureSelectedEventArgs data)
{
if (ProcedureSelectedHandler == null) return;
try { ProcedureSelectedHandler(sender, data); }
catch (Exception e) { log.Error("ProcedureSelectedHandler(...) failed", e); }
}
public static event EventHandler ProcedureSelectedHandler;
///
/// Called from the state machine when a test is selected and UI needs to be updated.
///
public static void OnTestSelected(object sender, TestSelectedEventArgs data)
{
TBF.Rig.Sequences.ProcessData.ClearProcessValues();
if (TestSelectedHandler == null) return;
try { TestSelectedHandler(sender, data); }
catch (Exception e) { log.Error("TestSelectedHandler(...) failed", e); }
}
public static event EventHandler TestSelectedHandler;
///
/// Called from the state machine when a test is selected and UI needs to be updated.
///
public static void OnFlowDetected(object sender, FlowDetectedEventArgs data)
{
TBF.Rig.Sequences.ProcessData.ClearProcessValues();
if (FlowDetectedHandler == null) return;
try { FlowDetectedHandler(sender, data); }
catch (Exception e) { log.Error("FlowDetectedHandler(...) failed", e); }
}
public static event EventHandler FlowDetectedHandler;
///
/// Called from the state machine when progress bars need to be updated.
///
public static void OnTestProgress(object sender, TestProgressEventArgs data)
{
if (TestProgressHandler == null) return;
try { TestProgressHandler(sender, data); }
catch (Exception e) { log.Error("TestProgressHandler(...) failed", e); }
}
public static event EventHandler TestProgressHandler;
///
/// Called from the state machine when one test of the adjustment process was completed and UI needs to be updated.
///
public static void OnAdjustmentInProgress(object sender, AdjustmentInProgressEventArgs data)
{
if (AdjustmentInProgressHandler == null) return;
try { AdjustmentInProgressHandler(sender, data); }
catch (Exception e) { log.Error("AdjustmentInProgressHandler(...) failed", e); }
}
public static event EventHandler AdjustmentInProgressHandler;
///
/// Called from the state machine when one test of the pulses test process was completed and UI needs to be updated.
///
public static void OnPulsesTestInProgress(object sender, PulsesTestInProgressEventArgs data)
{
if (PulsesTestInProgressHandler == null) return;
try { PulsesTestInProgressHandler(sender, data); }
catch (Exception e) { log.Error("PulsesTestInProgressHandler(...) failed", e); }
}
public static event EventHandler PulsesTestInProgressHandler;
///
/// Called from the state machine when 'Activity' information changes.
///
public static void OnCompoundDetection(object sender, string message)
{
if (CompoundDetectionHandler == null) return;
try { CompoundDetectionHandler(sender, new CompoundDetectionEventArgs(message)); }
catch (Exception e) { log.Error("CompoundDetectionHandler(...) failed", e); }
}
public static event EventHandler CompoundDetectionHandler;
///
/// Called from the state machine when the test is completed and UI needs to be updated.
///
public static void OnTestCompleted(object sender, TestCompletedEventArgs data)
{
TBF.Rig.Sequences.ProcessData.SaveProcessData();
if (TestCompletedHandler == null) return;
try { TestCompletedHandler(sender, data); }
catch (Exception e) { log.Error("TestCompletedHandler(...) failed", e); }
}
public static event EventHandler TestCompletedHandler;
///
/// Called from the state machine when the procedure is completed and UI needs to be updated.
///
public static void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs data)
{
if (ProcedureCompletedHandler == null) return;
try { ProcedureCompletedHandler(sender, data); }
catch (Exception e) { log.Error("ProcedureCompletedHandler(...) failed", e); }
}
public static event EventHandler ProcedureCompletedHandler;
///
/// Called from the state machine when 'Activity' information changes.
///
public static void OnActivity(object sender, string activity)
{
if (ActivityHandler == null) return;
try { ActivityHandler(sender, new ActivityEventArgs(ActivityEventArgs.Update.Activity, activity, null, false)); }
catch (Exception e) { log.Error("ActivityHandler(...) failed", e); }
}
public static void OnMessage(object sender, string message)
{
if (ActivityHandler == null) return;
try { ActivityHandler(sender, new ActivityEventArgs(ActivityEventArgs.Update.Message, null, message, false)); }
catch (Exception e) { log.Error("ActivityHandler(...) failed", e); }
}
public static void OnError(object sender, string message)
{
if (ActivityHandler == null) return;
try { ActivityHandler(sender, new ActivityEventArgs(ActivityEventArgs.Update.Message, null, message, true)); }
catch (Exception e) { log.Error("ActivityHandler(...) failed", e); }
}
public static event EventHandler ActivityHandler;
///
/// 'State machine tick' event handler (typically called in RunDevieAfter() of the control board
///
public static void OnStateMachineTick(object sender, StateMachineTickEventArgs args)
{
if (StateMachineTickHandler != null) StateMachineTickHandler(sender, args);
}
public static event EventHandler StateMachineTickHandler;
///
/// 'State machine state has changed' event handler
///
public static void OnStateChanged(object sender, string stateChangedMsg)
{
if (StateChangedHandler == null) return;
try { StateChangedHandler(sender, new StateChangedEventArgs(stateChangedMsg)); }
catch (Exception e) { string s = e.ToString(); }
}
public static event EventHandler StateChangedHandler;
///
/// Called from the state machine when an operation forces a modeless dialog close.
///
public static void OnCloseModelessForm(object sender, EventArgs args)
{
if (CloseModelessFormHandler == null) return;
try { CloseModelessFormHandler(sender, null); }
catch (Exception e) { log.Error("CloseModelessFormHandler(...) failed", e); }
}
public static event EventHandler CloseModelessFormHandler;
///
/// Called from the state machine when a procedure is selected and UI needs to be updated.
///
public static void OnCameraUICmd(object sender, CameraUICmdEventArgs data)
{
if (CameraUICmdHandler == null) return;
try
{
log.DebugFormat("CameraUICmdHandler: {0}", data.CameraUICmd);
foreach (EventHandler handler in CameraUICmdHandler.GetInvocationList())
{
var localHandler = handler;
Task.Run(() =>
{
try
{
localHandler(sender, data);
}
catch (Exception e)
{
log.Error("CameraUICmdHandler(...) failed", e);
}
});
}
}
catch (Exception e) { log.Error("CameraUICmdHandler(...) failed", e); }
}
public static event EventHandler CameraUICmdHandler;
///
/// Called from a camera when camera state (shown as a caption in PicturesTabPage) changes
///
public static void OnCameraInfo(int cameraIdx, string info)
{
if (CameraInfoHandler == null) return;
try { CameraInfoHandler(null, new CameraInfoEventArgs(cameraIdx, info)); }
catch (Exception e) { log.Error("CameraInfoHandler(...) failed", e); }
}
public static event EventHandler CameraInfoHandler;
///
/// Called from any RTP listener thread (e.g. MJpeg RTP listener thread)
///
public static void OnImage(int cameraIdx, System.Drawing.Image image)
{
if (ImageHandler == null) return;
try { ImageHandler(null, new ImageEventArgs(cameraIdx, image)); }
catch (Exception e) { log.Error("ImageHandler(...) failed", e); }
}
public static event EventHandler ImageHandler;
///
/// Called from TestMethods.Counter component when counters in LocalSettings should be saved.
///
public static void OnSaveSettings(object sender, SaveSettingsEventArgs data)
{
if (SaveSettingsHandler == null) return;
try { SaveSettingsHandler(sender, data); }
catch (Exception e) { log.Error("SaveSettingsHandler(...) failed", e); }
}
public static event EventHandler SaveSettingsHandler;
public static void TriggerEvent(ISession session, string source, EventClass clss, Severity severity, string message, string moreInfo, SubscriberGroup groups)
{
SharedDatabase.Entities.Event evnt = new Event(null, source, clss, severity, message, moreInfo, null);
SharedDatabase.EventsDB.SaveEvent(session, evnt, groups);
if (EventHandler != null)
{
try { EventHandler(null, new EventEventArgs(evnt)); }
catch (Exception e) { log.Error("EventHandler(...) failed", e); }
}
}
public static void TriggerEvent(ISession session, SharedDatabase.Entities.Event evnt)
{
SharedDatabase.EventsDB.SaveEvent(session, evnt, evnt.SubscriberGroups);
if (EventHandler != null)
{
try { EventHandler(null, new EventEventArgs(evnt)); }
catch (Exception e) { log.Error("EventHandler(...) failed", e); }
}
}
public static event EventHandler EventHandler;
public static void OnRouteChange(object sender, RouteChangeArgs args)
{
if (RouteChangeHandler == null) return;
try { RouteChangeHandler(sender, args); }
catch (Exception e) { log.Error("RouteChangeHandler(...) failed", e); }
}
public static event EventHandler RouteChangeHandler;
public static void OnMeasurementRequest(object sender, MeasurementRequestArgs args)
{
if (MeasurementRequestHandler == null) return;
try { MeasurementRequestHandler(sender, args); }
catch (Exception e) { log.Error("MeasurementRequestHandler(...) failed", e); }
}
public static event EventHandler MeasurementRequestHandler;
public static void OnSetpointChange(object sender, SetpointChangeArgs args)
{
if (SetpointChangeHandler == null) return;
try { SetpointChangeHandler(sender, args); }
catch (Exception e) { log.Error("SetpointChangeHandler(...) failed", e); }
}
public static event EventHandler SetpointChangeHandler;
}
}