public void Perform() { if (file) { if (NC.App.AppContext.INCCXfer) { fctrlbind = procFctrl; } else { fctrlbind = measFctrl; } fctrlbind.StartAction(); } else { daqbind.StartAction(); } }
public void Perform() { if (file) { if (NC.App.AppContext.INCCXfer) fctrlbind = procFctrl; else fctrlbind = measFctrl; fctrlbind.StartAction(); } else daqbind.StartAction(); }
/// <summary> /// Set up action event handlers for a FileCtrl instance, uses FCtrlBind subclass /// </summary> /// <returns></returns> public bool InitializeFileControllers() { procFctrl = new FCtrlBind(); measFctrl = new FCtrlBind(); LMLoggers.LognLM applog = NC.App.Logger(LMLoggers.AppSection.App); /* * The action event handlers. * * There are 7 event types, see ActionEvents.EventType. * * The code fires a registered event handler at appropriate processing stages based on the action event type. * Unregistered handlers are simply ignored. * E.g. The ActionStart event is fired when an action starts. An action is a specific user task such as 'assay' * over NCD files or an assay from live LMMM DAQ. * * In the examples shown here for NCD file processing, very little reporting actually occurs. * The parameter for each event hnadler is an object, and as yet undefined. * I would use delegates to force the appropriate parameter types here, unlike the timer callbacks above. * But I've not yet completed this design and implementation * * Implementing these to report complex status to the logger and the UI control is the next step. * * I do not know which approach will serve us better for a large system, but we do have both timer pull and system push approaches here, so I'll keep them for now. * */ /// set up the 7 magic event handlers /// here I have a base handler that does the same thing for every event (writes a string to the log), /// and I reuse that string by posting it to the progress handler measFctrl.SetEventHandler(ActionEvents.EventType.PreAction, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.PreAction, applog, LogLevels.Verbose, o); measFctrl.mProgressTracker.ReportProgress(0, s);// "..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionPrep, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionPrep, applog, LogLevels.Verbose, o); measFctrl.mProgressTracker.ReportProgress(0, s);//"Prep"); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionStart, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStart, applog, LogLevels.Verbose, o); measFctrl.mProgressTracker.ReportProgress(1, s);//"Starting..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionInProgress, (object o) => { measStatus = new MeasurementStatus(); measStatus.UpdateWithMeasurement(); measStatus.UpdateWithInstruments(); updateGUIWithChannelRatesData = true; string s2 = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionInProgress, applog, LogLevels.Verbose, o); if (!string.IsNullOrEmpty(s2)) s2 = "(" + s2 + ")"; int per = Math.Abs(Math.Min(100, (int)Math.Round(100.0 * ((measStatus.CurrentRepetition - 1) / (double)measStatus.RequestedRepetitions)))); try { measFctrl.mProgressTracker.ReportProgress(per, // a % est of files string.Format("{0} of {1} {2}", measStatus.CurrentRepetition, measStatus.RequestedRepetitions, s2)); // n of m, and file name } catch (ArgumentOutOfRangeException) { applog.TraceEvent(LogLevels.Verbose, 58, "{0} inconsistent", per); } }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionStop, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStop, applog, LogLevels.Warning, o); measFctrl.mProgressTracker.ReportProgress(100, s);//"Stopping..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionCancel, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionCancel, applog, LogLevels.Warning, o); measFctrl.mProgressTracker.ReportProgress(100, s);//"Cancelling..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionFinished, (object o) => { string s = ""; if (o != null && o is FileCtrl) { FileCtrl f = (FileCtrl)o; measStatus = new MeasurementStatus(); // preps local state for refresh on channel and computed rates for now, follow up with all other state measStatus.UpdateWithMeasurement(); s = FileCtrl.MeasStatusString(measStatus); updateGUIWithChannelRatesData = true; UpdateGUIWithNewdata(); } NC.App.Opstate.SOH = NCC.OperatingState.Stopped; // in case we got here after a Cancel // general logger: to the console, and/or listbox and/or log file or DB applog.TraceEvent(LogLevels.Verbose, ActionEvents.logid[ActionEvents.EventType.ActionFinished], s); // specialized updater for UI or file measFctrl.mProgressTracker.ReportProgress(100, "Completed"); }); procFctrl.SetEventHandler(ActionEvents.EventType.PreAction, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.PreAction, applog, LogLevels.Verbose, o); procFctrl.mProgressTracker.ReportProgress(0, s);// "..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionPrep, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionPrep, applog, LogLevels.Verbose, o); procFctrl.mProgressTracker.ReportProgress(0, s);//"Prep"); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionStart, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStart, applog, LogLevels.Verbose, o); procFctrl.mProgressTracker.ReportProgress(1, s);//"Starting..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionInProgress, (object o) => { NCCTransfer.TransferEventArgs e = (NCCTransfer.TransferEventArgs)o; procFctrl.mProgressTracker.ReportProgress(e.percent, e.msg); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionStop, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStop, applog, LogLevels.Warning, o); procFctrl.mProgressTracker.ReportProgress(100, s);//"Stopping..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionCancel, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionCancel, applog, LogLevels.Warning, o); procFctrl.mProgressTracker.ReportProgress(100, s);//"Cancelling..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionFinished, (object o) => { NC.App.Opstate.SOH = OperatingState.Stopped; // in case we got here after a Cancel // general logger: to the console, and/or listbox and/or log file or DB applog.TraceEvent(LogLevels.Verbose, ActionEvents.logid[ActionEvents.EventType.ActionFinished]); // specialized updater for UI or file procFctrl.mProgressTracker.ReportProgress(100, "Completed"); }); NC.App.Opstate.SOH = OperatingState.Void; return true; }
/// <summary> /// Set up action event handlers for a FileCtrl instance, uses FCtrlBind subclass /// </summary> /// <returns></returns> public bool InitializeFileControllers() { procFctrl = new FCtrlBind(); measFctrl = new FCtrlBind(); LMLoggers.LognLM applog = NC.App.Logger(LMLoggers.AppSection.App); /* * The action event handlers. * * There are 7 event types, see ActionEvents.EventType. * * The code fires a registered event handler at appropriate processing stages based on the action event type. * Unregistered handlers are simply ignored. * E.g. The ActionStart event is fired when an action starts. An action is a specific user task such as 'assay' * over NCD files or an assay from live LMMM DAQ. * * In the examples shown here for NCD file processing, very little reporting actually occurs. * The parameter for each event hnadler is an object, and as yet undefined. * I would use delegates to force the appropriate parameter types here, unlike the timer callbacks above. * But I've not yet completed this design and implementation * * Implementing these to report complex status to the logger and the UI control is the next step. * * I do not know which approach will serve us better for a large system, but we do have both timer pull and system push approaches here, so I'll keep them for now. * */ /// set up the 7 magic event handlers /// here I have a base handler that does the same thing for every event (writes a string to the log), /// and I reuse that string by posting it to the progress handler measFctrl.SetEventHandler(ActionEvents.EventType.PreAction, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.PreAction, applog, LogLevels.Verbose, o); measFctrl.mProgressTracker.ReportProgress(0, s);// "..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionPrep, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionPrep, applog, LogLevels.Verbose, o); measFctrl.mProgressTracker.ReportProgress(0, s);//"Prep"); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionStart, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStart, applog, LogLevels.Verbose, o); measFctrl.mProgressTracker.ReportProgress(1, s);//"Starting..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionInProgress, (object o) => { measStatus = new MeasurementStatus(); measStatus.UpdateWithMeasurement(); measStatus.UpdateWithInstruments(); updateGUIWithChannelRatesData = true; string s2 = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionInProgress, applog, LogLevels.Verbose, o); if (!string.IsNullOrEmpty(s2)) { s2 = "(" + s2 + ")"; } int per = Math.Abs(Math.Min(100, (int)Math.Round(100.0 * ((measStatus.CurrentRepetition - 1) / (double)measStatus.RequestedRepetitions)))); try { measFctrl.mProgressTracker.ReportProgress(per, // a % est of files string.Format("{0} of {1} {2}", measStatus.CurrentRepetition, measStatus.RequestedRepetitions, s2)); // n of m, and file name } catch (ArgumentOutOfRangeException) { applog.TraceEvent(LogLevels.Verbose, 58, "{0} inconsistent", per); } }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionStop, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStop, applog, LogLevels.Warning, o); measFctrl.mProgressTracker.ReportProgress(100, s);//"Stopping..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionCancel, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionCancel, applog, LogLevels.Warning, o); measFctrl.mProgressTracker.ReportProgress(100, s);//"Cancelling..."); }); measFctrl.SetEventHandler(ActionEvents.EventType.ActionFinished, (object o) => { string s = ""; if (o != null && o is FileCtrl) { FileCtrl f = (FileCtrl)o; measStatus = new MeasurementStatus(); // preps local state for refresh on channel and computed rates for now, follow up with all other state measStatus.UpdateWithMeasurement(); s = FileCtrl.MeasStatusString(measStatus); updateGUIWithChannelRatesData = true; UpdateGUIWithNewdata(); } NC.App.Opstate.SOH = NCC.OperatingState.Stopped; // in case we got here after a Cancel // general logger: to the console, and/or listbox and/or log file or DB applog.TraceEvent(LogLevels.Verbose, ActionEvents.logid[ActionEvents.EventType.ActionFinished], s); // specialized updater for UI or file measFctrl.mProgressTracker.ReportProgress(100, "Completed"); }); procFctrl.SetEventHandler(ActionEvents.EventType.PreAction, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.PreAction, applog, LogLevels.Verbose, o); procFctrl.mProgressTracker.ReportProgress(0, s);// "..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionPrep, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionPrep, applog, LogLevels.Verbose, o); procFctrl.mProgressTracker.ReportProgress(0, s);//"Prep"); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionStart, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStart, applog, LogLevels.Verbose, o); procFctrl.mProgressTracker.ReportProgress(1, s);//"Starting..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionInProgress, (object o) => { NCCTransfer.TransferEventArgs e = (NCCTransfer.TransferEventArgs)o; procFctrl.mProgressTracker.ReportProgress(e.percent, e.msg); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionStop, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionStop, applog, LogLevels.Warning, o); procFctrl.mProgressTracker.ReportProgress(100, s);//"Stopping..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionCancel, (object o) => { string s = FileCtrl.LogAndSkimFileProcessingStatus(ActionEvents.EventType.ActionCancel, applog, LogLevels.Warning, o); procFctrl.mProgressTracker.ReportProgress(100, s);//"Cancelling..."); }); procFctrl.SetEventHandler(ActionEvents.EventType.ActionFinished, (object o) => { NC.App.Opstate.SOH = OperatingState.Stopped; // in case we got here after a Cancel // general logger: to the console, and/or listbox and/or log file or DB applog.TraceEvent(LogLevels.Verbose, ActionEvents.logid[ActionEvents.EventType.ActionFinished]); // specialized updater for UI or file procFctrl.mProgressTracker.ReportProgress(100, "Completed"); }); NC.App.Opstate.SOH = OperatingState.Void; return(true); }