/// <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 timer callback and action event handlers for a DAQController instance, uses DAQBind subclass /// </summary> /// <returns></returns> public bool InitializeDAQController() { // DAQ daqbind = new DAQBind(); LMLoggers.LognLM applog = NC.App.Logger(LMLoggers.AppSection.App); daqbind.SetEventHandler(ActionEvents.EventType.PreAction, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.PreAction, applog, LogLevels.Verbose, o); daqbind.mProgressTracker.ReportProgress(0, s); //"..."); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionPrep, (object o) => { string s = "Action Prep: "; //can also look at active instrument list here LogLevels.Verbose, s = s + Instr.Instruments.Active.Count + " devices found, [" + NC.App.Opstate.SOH + "] " + DateTimeOffset.Now.ToString("MMM dd yyy HH:mm:ss.ff K"); applog.TraceEvent(LogLevels.Verbose, 0xABCE, "Action Prep: SOH " + o.ToString() + "'"); daqbind.mProgressTracker.ReportProgress(0, s); //"Prep"); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionStart, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionStart, applog, LogLevels.Verbose, o); daqbind.mProgressTracker.ReportProgress(1, s);//"Starting..."); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionInProgress, (object o) => { measStatus = new MeasurementStatus(); measStatus.UpdateWithMeasurement(); measStatus.UpdateWithInstruments(); updateGUIWithChannelRatesData = true; string s2 = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionInProgress, applog, LogLevels.Verbose, o); if (!string.IsNullOrEmpty(s2)) { s2 = "(" + s2 + ")"; } int per = 0; try { switch (daqbind.CurAction) { case NCCAction.HVCalibration: if (measStatus.snaps.iss != null && measStatus.snaps.iss.hv != null) { per = Math.Abs(Math.Min(100, (int)Math.Round(100.0 * ((double)(measStatus.snaps.iss.hv.HVread - 1) / measStatus.snaps.iss.hv.HVsetpt)))); daqbind.mProgressTracker.ReportProgress(per, // a % est of steps string.Format("{0} volts, with max voltage {1} {2}", measStatus.snaps.iss.hv.HVread, measStatus.snaps.iss.hv.HVsetpt, s2)); } break; default: per = Math.Abs(Math.Min(100, (int)Math.Round(100.0 * ((double)(measStatus.CurrentRepetition - 1) / measStatus.RequestedRepetitions)))); daqbind.mProgressTracker.ReportProgress(per, // a % est of files string.Format("{0} of {1} {2}", measStatus.CurrentRepetition, measStatus.RequestedRepetitions, s2)); // dev note: need a better focused description of the state break; } } catch (ArgumentOutOfRangeException) { applog.TraceEvent(LogLevels.Verbose, 58, "{0} inconsistent", per); } }); daqbind.SetEventHandler(ActionEvents.EventType.ActionStop, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionStop, applog, LogLevels.Info, o); daqbind.mProgressTracker.ReportProgress(100, s); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionCancel, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionCancel, applog, LogLevels.Warning, o); daqbind.mProgressTracker.ReportProgress(100, s); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionFinished, (object o) => { string s = ""; if (o != null && o is DAQControl) { DAQControl f = (DAQControl)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 = DAQControl.MeasStatusString(measStatus); updateGUIWithChannelRatesData = true; UpdateGUIWithNewdata(); } else { s = "Finished: SOH " + NC.App.Opstate.SOH + " but no processing occurred " + DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionFinished, applog, LogLevels.Verbose, 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 daqbind.mProgressTracker.ReportProgress(100, s); applog.TraceEvent(LogLevels.Verbose, ActionEvents.logid[ActionEvents.EventType.ActionFinished], s); // specialized updater for UI or file daqbind.mProgressTracker.ReportProgress(100, s); }); return(true); }
/// <summary> /// Set up timer callback and action event handlers for a DAQController instance, uses DAQBind subclass /// </summary> /// <returns></returns> public bool InitializeDAQController() { // DAQ daqbind = new DAQBind(); LMLoggers.LognLM applog = NC.App.Logger(LMLoggers.AppSection.App); daqbind.SetEventHandler(ActionEvents.EventType.PreAction, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.PreAction, applog, LogLevels.Verbose, o); daqbind.mProgressTracker.ReportProgress(0, s);//"..."); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionPrep, (object o) => { string s = "Action Prep: "; //can also look at active instrument list here LogLevels.Verbose, s = s + Instr.Instruments.Active.Count + " devices found, [" + NC.App.Opstate.SOH + "] " + DateTimeOffset.Now.ToString("MMM dd yyy HH:mm:ss.ff K"); applog.TraceEvent(LogLevels.Verbose, 0xABCE, "Action Prep: SOH " + o.ToString() + "'"); daqbind.mProgressTracker.ReportProgress(0, s);//"Prep"); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionStart, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionStart, applog, LogLevels.Verbose, o); daqbind.mProgressTracker.ReportProgress(1, s);//"Starting..."); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionInProgress, (object o) => { measStatus = new MeasurementStatus(); measStatus.UpdateWithMeasurement(); measStatus.UpdateWithInstruments(); updateGUIWithChannelRatesData = true; string s2 = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionInProgress, applog, LogLevels.Verbose, o); if (!string.IsNullOrEmpty(s2)) s2 = "(" + s2 + ")"; int per = 0; try { switch (daqbind.CurAction) { case NCCAction.HVCalibration: if (measStatus.snaps.iss != null && measStatus.snaps.iss.hv != null) { per = Math.Abs(Math.Min(100, (int)Math.Round(100.0 * ((double)(measStatus.snaps.iss.hv.HVread - 1) / measStatus.snaps.iss.hv.HVsetpt)))); daqbind.mProgressTracker.ReportProgress(per, // a % est of steps string.Format("{0} volts, with max voltage {1} {2}", measStatus.snaps.iss.hv.HVread, measStatus.snaps.iss.hv.HVsetpt, s2)); } break; default: per = Math.Abs(Math.Min(100, (int)Math.Round(100.0 * ((double)(measStatus.CurrentRepetition - 1) / measStatus.RequestedRepetitions)))); daqbind.mProgressTracker.ReportProgress(per, // a % est of files string.Format("{0} of {1} {2}", measStatus.CurrentRepetition, measStatus.RequestedRepetitions, s2)); // dev note: need a better focused description of the state break; } } catch (ArgumentOutOfRangeException) { applog.TraceEvent(LogLevels.Verbose, 58, "{0} inconsistent", per); } }); daqbind.SetEventHandler(ActionEvents.EventType.ActionStop, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionStop, applog, LogLevels.Info, o); daqbind.mProgressTracker.ReportProgress(100, s); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionCancel, (object o) => { string s = DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionCancel, applog, LogLevels.Warning, o); daqbind.mProgressTracker.ReportProgress(100, s); }); daqbind.SetEventHandler(ActionEvents.EventType.ActionFinished, (object o) => { string s = ""; if (o != null && o is DAQControl) { DAQControl f = (DAQControl)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 = DAQControl.MeasStatusString(measStatus); updateGUIWithChannelRatesData = true; UpdateGUIWithNewdata(); } else { s = "Finished: SOH " + NC.App.Opstate.SOH + " but no processing occurred " + DAQControl.LogAndSkimDAQProcessingStatus(ActionEvents.EventType.ActionFinished, applog, LogLevels.Verbose, 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 daqbind.mProgressTracker.ReportProgress(100, s); applog.TraceEvent(LogLevels.Verbose, ActionEvents.logid[ActionEvents.EventType.ActionFinished], s); // specialized updater for UI or file daqbind.mProgressTracker.ReportProgress(100, s); }); 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); }