예제 #1
0
        /// <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;
        }
예제 #2
0
파일: Controller.cs 프로젝트: eric645/INCC6
        /// <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);
        }
예제 #3
0
        /// <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;
        }
예제 #4
0
파일: Controller.cs 프로젝트: eric645/INCC6
        /// <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);
        }