/// <summary>
        /// Implicit constructor
        /// </summary>
        public MainController()
        {
            Actuators            = new Actuators();
            ActuatorInContext    = new ActuatorController();
            actuatorErrorHandler = new ActuatorErrorHandler(this);
            logController        = new LogController();
            notifList            = new List <Notification>();
            isFirstTimeLaunch    = true;

            InitActuators();
            InitBgWorkers();
        }
        /// <summary>
        /// Comprehensive method which logs all members of Entities.ActuatorEntity objects
        /// </summary>
        /// <param name="actuator">object of type Controller.ActuatorController </param>
        public void LogAllSettings(ActuatorController actuator)
        {
            Logger.Log.Info(
                "\nActuator entire log: \n\n" +
                "accessories_settings_t:" +
                "\n\t LimitSwitchesSettings:    " + actuator.AccessoriesSettings.LimitSwitchesSettings +
                "\n\t MagneticBrakeInfo:        " + actuator.AccessoriesSettings.MagneticBrakeInfo +
                "\n\t MBRatedCurrent:           " + actuator.AccessoriesSettings.MBRatedCurrent +
                "\n\t MBRatedVoltage:           " + actuator.AccessoriesSettings.MBRatedVoltage +
                "\n\t MBSettings:               " + actuator.AccessoriesSettings.MBSettings +
                "\n\t MBTorque:                 " + actuator.AccessoriesSettings.MBTorque +
                "\n\t TemperatureSensorInfo:    " + actuator.AccessoriesSettings.TemperatureSensorInfo +
                "\n\t TSGrad:                   " + actuator.AccessoriesSettings.TSGrad +
                "\n\t TSMax:                    " + actuator.AccessoriesSettings.TSMax +
                "\n\t TSMin:                    " + actuator.AccessoriesSettings.TSMin +
                "\n\t TSSettings:               " + actuator.AccessoriesSettings.TSSettings +

                "\n\n analog_data_t:" +
                "\n\t A1Voltage:                " + actuator.AnalogData.A1Voltage +
                "\n\t A1Voltage_ADC:            " + actuator.AnalogData.A1Voltage_ADC +
                "\n\t A2Voltage:                " + actuator.AnalogData.A2Voltage +
                "\n\t A2Voltage_ADC:            " + actuator.AnalogData.A2Voltage_ADC +
                "\n\t ACurrent:                 " + actuator.AnalogData.ACurrent +
                "\n\t ACurrent_ADC:             " + actuator.AnalogData.ACurrent_ADC +
                "\n\t B1Voltage:                " + actuator.AnalogData.B1Voltage +
                "\n\t B1Voltage_ADC:            " + actuator.AnalogData.B1Voltage_ADC +
                "\n\t B2Voltage:                " + actuator.AnalogData.B2Voltage +
                "\n\t B2Voltage_ADC:            " + actuator.AnalogData.B2Voltage_ADC +
                "\n\t deprecated:               " + actuator.AnalogData.deprecated +
                "\n\t FullCurrent:              " + actuator.AnalogData.FullCurrent +
                "\n\t FullCurrent_ADC:          " + actuator.AnalogData.FullCurrent_ADC +
                "\n\t H5:                       " + actuator.AnalogData.H5 +
                "\n\t H5_ADC:                   " + actuator.AnalogData.H5_ADC +
                "\n\t Joy:                      " + actuator.AnalogData.Joy +
                "\n\t Joy_ADC:                  " + actuator.AnalogData.Joy_ADC +
                "\n\t L:                        " + actuator.AnalogData.L +
                "\n\t L5:                       " + actuator.AnalogData.L5 +
                "\n\t L5_ADC:                   " + actuator.AnalogData.L5_ADC +
                "\n\t Pot:                      " + actuator.AnalogData.Pot +
                "\n\t Pot_ADC:                  " + actuator.AnalogData.Pot_ADC +
                "\n\t R:                        " + actuator.AnalogData.R +
                "\n\t SupVoltage:               " + actuator.AnalogData.SupVoltage +
                "\n\t SupVoltage_ADC:           " + actuator.AnalogData.SupVoltage_ADC +
                "\n\t Temp:                     " + actuator.AnalogData.Temp +
                "\n\t Temp_ADC:                 " + actuator.AnalogData.Temp_ADC +

                "\n\n brake_settings_t:" +
                "\n\t t1:                       " + actuator.BrakeSettings.t1 +
                "\n\t t2:                       " + actuator.BrakeSettings.t2 +
                "\n\t t3:                       " + actuator.BrakeSettings.t3 +
                "\n\t t4:                       " + actuator.BrakeSettings.t4 +

                "\n\n calibration_settings_t:" +
                "\n\t CSS1_A:                   " + actuator.CalibrationSettings.CSS1_A +
                "\n\t CSS1_B:                   " + actuator.CalibrationSettings.CSS1_B +
                "\n\t CSS2_A:                   " + actuator.CalibrationSettings.CSS2_A +
                "\n\t CSS2_B:                   " + actuator.CalibrationSettings.CSS2_B +
                "\n\t FullCurrent_A:            " + actuator.CalibrationSettings.FullCurrent_A +
                "\n\t FullCurrent_B:            " + actuator.CalibrationSettings.FullCurrent_B +

                "\n\n chart_data_t:" +
                "\n\t DutyCycle:                " + actuator.ChartData.DutyCycle +
                "\n\t Joy:                      " + actuator.ChartData.Joy +
                "\n\t Pot:                      " + actuator.ChartData.Pot +
                "\n\t WindingCurrentA:          " + actuator.ChartData.WindingCurrentA +
                "\n\t WindingCurrentB:          " + actuator.ChartData.WindingCurrentB +
                "\n\t WindingCurrentC:          " + actuator.ChartData.WindingCurrentC +
                "\n\t WindingVoltageA:          " + actuator.ChartData.WindingVoltageA +
                "\n\t WindingVoltageB:          " + actuator.ChartData.WindingVoltageB +
                "\n\t WindingVoltageC:          " + actuator.ChartData.WindingVoltageC +

                "\n\n controller_name_t:" +
                "\n\t ControllerName:           " + actuator.ControllerName.ControllerName +
                "\n\t CtrlFlags:                " + actuator.ControllerName.CtrlFlags.ToString("X") +

                "\n\n control_settings_t:" +
                "\n\t DeltaPosition:            " + actuator.ControlSettings.DeltaPosition +
                "\n\t Flags:                    " + actuator.ControlSettings.Flags +
                "\n\t MaxClickTime:             " + actuator.ControlSettings.MaxClickTime +
                "\n\t MaxSpeed:                 " + actuator.ControlSettings.MaxSpeed +
                "\n\t Timeout:                  " + actuator.ControlSettings.Timeout +
                "\n\t uDeltaPosition:           " + actuator.ControlSettings.uDeltaPosition +
                "\n\t uMaxSpeed:                " + actuator.ControlSettings.uMaxSpeed +

                "\n\n ctp_settings_t:" +
                "\n\t CTPFlags:                 " + actuator.CtpSettings.CTPFlags.ToString("X") +
                "\n\t CTPMinError:              " + actuator.CtpSettings.CTPMinError +

                "\n\n device_information_t:" +
                "\n\t Major:                    " + actuator.DeviceInformation.Major +
                "\n\t Manufacturer:             " + actuator.DeviceInformation.Manufacturer +
                "\n\t ManufacturerId:           " + actuator.DeviceInformation.ManufacturerId +
                "\n\t Minor:                    " + actuator.DeviceInformation.Minor +
                "\n\t ProductDescription:       " + actuator.DeviceInformation.ProductDescription +
                "\n\t Release:                  " + actuator.DeviceInformation.Release +

                "\n\n edges_settings_t:" +
                "\n\t BorderFlags               " + actuator.EdgesSettings.BorderFlags +
                "\n\t EnderFlags                " + actuator.EdgesSettings.EnderFlags +
                "\n\t LeftBorder                " + actuator.EdgesSettings.LeftBorder +
                "\n\t RightBorder               " + actuator.EdgesSettings.RightBorder +
                "\n\t uLeftBorder               " + actuator.EdgesSettings.uLeftBorder +
                "\n\t uRightBorder              " + actuator.EdgesSettings.uRightBorder +

                "\n\n encoder_information_t:" +
                "\n\t Manufacturer:             " + actuator.EncoderInformation.Manufacturer +
                "\n\t PartNumber:               " + actuator.EncoderInformation.PartNumber +

                "\n\n encoder_settings_t:" +
                "\n\t EncoderSettings           " + actuator.EncoderSettings.EncoderSettings +
                "\n\t MaxCurrentConsumption     " + actuator.EncoderSettings.MaxCurrentConsumption +
                "\n\t MaxOperatingFrequency     " + actuator.EncoderSettings.MaxOperatingFrequency +
                "\n\t PPR                       " + actuator.EncoderSettings.PPR +
                "\n\t SupplyVoltageMax          " + actuator.EncoderSettings.SupplyVoltageMax +
                "\n\t SupplyVoltageMin          " + actuator.EncoderSettings.SupplyVoltageMin +

                "\n\n encoder_settings_t:" +
                "\n\t Antiplay                  " + actuator.EngineSettings.Antiplay +
                "\n\t EngineFlags               " + actuator.EngineSettings.EngineFlags +
                "\n\t MicrostepMode             " + actuator.EngineSettings.MicrostepMode +
                "\n\t NomCurrent                " + actuator.EngineSettings.NomCurrent +
                "\n\t NomSpeed                  " + actuator.EngineSettings.NomSpeed +
                "\n\t NomVoltage                " + actuator.EngineSettings.NomVoltage +
                "\n\t StepsPerRev               " + actuator.EngineSettings.StepsPerRev +
                "\n\t uNomSpeed                 " + actuator.EngineSettings.uNomSpeed +

                "\n\n encoder_settings_t:" +
                "\n\t DriverType                " + actuator.EntypeSettings.DriverType +
                "\n\t EngineType                " + actuator.EntypeSettings.EngineType +

                "\n\n extio_settings_t:" +
                "\n\t EXTIOModeFlags            " + actuator.ExtioSettings.EXTIOModeFlags.ToString("X") +
                "\n\t EXTIOSetupFlags           " + actuator.ExtioSettings.EXTIOSetupFlags.ToString("X") +

                "\n\n home_settings_t:" +
                "\n\t FastHome                  " + actuator.HomeSettings.FastHome +
                "\n\t HomeDelta                 " + actuator.HomeSettings.HomeDelta +
                "\n\t HomeFlags                 " + actuator.HomeSettings.HomeFlags +
                "\n\t SlowHome                  " + actuator.HomeSettings.SlowHome +
                "\n\t uFastHome                 " + actuator.HomeSettings.uFastHome +
                "\n\t uHomeDelta                " + actuator.HomeSettings.uHomeDelta +
                "\n\t uSlowHome                 " + actuator.HomeSettings.uSlowHome +

                "\n\n measurements_t:" +
                "\n\t Error                     " + actuator.MeasurementsData.Error +
                "\n\t Length                    " + actuator.MeasurementsData.Length +
                "\n\t Speed                     " + actuator.MeasurementsData.Speed +

                "\n\n motor_information_t:" +
                "\n\t Manufacturer              " + actuator.MotorInformation.Manufacturer +
                "\n\t PartNumber                " + actuator.MotorInformation.PartNumber +

                "\n\n motor_settings_t:" +
                "\n\t DetentTorque              " + actuator.MotorSettings.DetentTorque +
                "\n\t MaxCurrent                " + actuator.MotorSettings.MaxCurrent +
                "\n\t MaxCurrentTime            " + actuator.MotorSettings.MaxCurrentTime +
                "\n\t MaxSpeed                  " + actuator.MotorSettings.MaxSpeed +
                "\n\t MechanicalTimeConstant    " + actuator.MotorSettings.MechanicalTimeConstant +
                "\n\t MotorType                 " + actuator.MotorSettings.MotorType +
                "\n\t NoLoadCurrent             " + actuator.MotorSettings.NoLoadCurrent +
                "\n\t NoLoadSpeed               " + actuator.MotorSettings.NoLoadSpeed +
                "\n\t NominalCurrent            " + actuator.MotorSettings.NominalCurrent +
                "\n\t NominalPower              " + actuator.MotorSettings.NominalPower +
                "\n\t NominalSpeed              " + actuator.MotorSettings.NominalSpeed +
                "\n\t NominalTorque             " + actuator.MotorSettings.NominalTorque +
                "\n\t NominalVoltage            " + actuator.MotorSettings.NominalVoltage +
                "\n\t Phases                    " + actuator.MotorSettings.Phases +
                "\n\t Poles                     " + actuator.MotorSettings.Poles +
                "\n\t ReservedField             " + actuator.MotorSettings.ReservedField +
                "\n\t RotorInertia              " + actuator.MotorSettings.RotorInertia +
                "\n\t SpeedConstant             " + actuator.MotorSettings.SpeedConstant +
                "\n\t SpeedTorqueGradient       " + actuator.MotorSettings.SpeedTorqueGradient +
                "\n\t StallTorque               " + actuator.MotorSettings.StallTorque +
                "\n\t TorqueConstant            " + actuator.MotorSettings.TorqueConstant +
                "\n\t WindingInductance         " + actuator.MotorSettings.WindingInductance +
                "\n\t WindingResistance         " + actuator.MotorSettings.WindingResistance +

                "\n\n move_settings_t:" +
                "\n\t Accel                     " + actuator.MoveSettings.Accel +
                "\n\t AntiplaySpeed             " + actuator.MoveSettings.AntiplaySpeed +
                "\n\t Decel                     " + actuator.MoveSettings.Decel +
                "\n\t Speed                     " + actuator.MoveSettings.Speed +
                "\n\t uAntiplaySpeed            " + actuator.MoveSettings.uAntiplaySpeed +
                "\n\t uSpeed                    " + actuator.MoveSettings.uSpeed +

                "\n\n pid_settings_t:" +
                "\n\t Kdf                       " + actuator.PidSettings.Kdf +
                "\n\t KdU                       " + actuator.PidSettings.KdU +
                "\n\t Kif                       " + actuator.PidSettings.Kif +
                "\n\t KiU                       " + actuator.PidSettings.KiU +
                "\n\t Kpf                       " + actuator.PidSettings.Kpf +
                "\n\t KpU                       " + actuator.PidSettings.KpU +

                "\n\n get_position_t:" +
                "\n\t EncPosition               " + actuator.GetPositionData.EncPosition +
                "\n\t Position                  " + actuator.GetPositionData.Position +
                "\n\t uPosition                 " + actuator.GetPositionData.uPosition +

                "\n\n get_position_t:" +
                "\n\t CurrentSetTime            " + actuator.PowerSettings.CurrentSetTime +
                "\n\t CurrReductDelay           " + actuator.PowerSettings.CurrReductDelay +
                "\n\t HoldCurrent               " + actuator.PowerSettings.HoldCurrent +
                "\n\t PowerFlags                " + actuator.PowerSettings.PowerFlags +
                "\n\t PowerOffDelay             " + actuator.PowerSettings.PowerOffDelay +

                "\n\n get_position_t:" +
                "\n\tCriticalIpwr               " + actuator.SecureSettings.CriticalIpwr +
                "\n\tCriticalIusb               " + actuator.SecureSettings.CriticalIusb +
                "\n\tCriticalT                  " + actuator.SecureSettings.CriticalT +
                "\n\tCriticalUpwr               " + actuator.SecureSettings.CriticalUpwr +
                "\n\tCriticalUusb               " + actuator.SecureSettings.CriticalUusb +
                "\n\tFlags                      " + actuator.SecureSettings.Flags +
                "\n\tLowUpwrOff                 " + actuator.SecureSettings.LowUpwrOff +
                "\n\tMinimumUusb                " + actuator.SecureSettings.MinimumUusb +

                "\n\n status_t:" +
                "\n\t CmdBufFreeSpace           " + actuator.Status.CmdBufFreeSpace +
                "\n\t CurPosition               " + actuator.Status.CurPosition +
                "\n\t CurSpeed                  " + actuator.Status.CurSpeed +
                "\n\t CurT                      " + actuator.Status.CurT +
                "\n\t EncPosition               " + actuator.Status.EncPosition +
                "\n\t EncSts                    " + actuator.Status.EncSts +
                "\n\t Flags                     " + actuator.Status.Flags +
                "\n\t GPIOFlags                 " + actuator.Status.GPIOFlags +
                "\n\t Ipwr                      " + actuator.Status.Ipwr +
                "\n\t Iusb                      " + actuator.Status.Iusb +
                "\n\t MoveSts                   " + actuator.Status.MoveSts +
                "\n\t MvCmdSts                  " + actuator.Status.MvCmdSts +
                "\n\t PWRSts                    " + actuator.Status.PWRSts +
                "\n\t uCurPosition              " + actuator.Status.uCurPosition +
                "\n\t uCurSpeed                 " + actuator.Status.uCurSpeed +
                "\n\t Upwr                      " + actuator.Status.Upwr +
                "\n\t Uusb                      " + actuator.Status.Uusb +
                "\n\t WindSts                   " + actuator.Status.WindSts +

                "\n\n status_calb_t:" +
                "\n\t CmdBufFreeSpace           " + actuator.StatusCalibration.CmdBufFreeSpace +
                "\n\t CurPosition               " + actuator.StatusCalibration.CurPosition +
                "\n\t CurSpeed                  " + actuator.StatusCalibration.CurSpeed +
                "\n\t CurT                      " + actuator.StatusCalibration.CurT +
                "\n\t EncPosition               " + actuator.StatusCalibration.EncPosition +
                "\n\t EncSts                    " + actuator.StatusCalibration.EncSts +
                "\n\t Flags                     " + actuator.StatusCalibration.Flags +
                "\n\t GPIOFlags                 " + actuator.StatusCalibration.GPIOFlags +
                "\n\t Ipwr                      " + actuator.StatusCalibration.Ipwr +
                "\n\t Iusb                      " + actuator.StatusCalibration.Iusb +
                "\n\t MoveSts                   " + actuator.StatusCalibration.MoveSts +
                "\n\t MvCmdSts                  " + actuator.StatusCalibration.MvCmdSts +
                "\n\t PWRSts                    " + actuator.StatusCalibration.PWRSts +
                "\n\t Upwr                      " + actuator.StatusCalibration.Upwr +
                "\n\t Uusb                      " + actuator.StatusCalibration.Uusb +
                "\n\t WindSts                   " + actuator.StatusCalibration.WindSts +

                "\n\n sync_in_settings_t:" +
                "\n\t ClutterTime               " + actuator.SyncInSettings.ClutterTime +
                "\n\t Position                  " + actuator.SyncInSettings.Position +
                "\n\t Speed                     " + actuator.SyncInSettings.Speed +
                "\n\t SyncInFlags               " + actuator.SyncInSettings.SyncInFlags +
                "\n\t uPosition                 " + actuator.SyncInSettings.uPosition +
                "\n\t uSpeed                    " + actuator.SyncInSettings.uSpeed +

                "\n\n sync_out_settings_t:" +
                "\n\t ClutterTime               " + actuator.SyncOutSettings.Accuracy +
                "\n\t Position                  " + actuator.SyncOutSettings.SyncOutFlags +
                "\n\t Speed                     " + actuator.SyncOutSettings.SyncOutPeriod +
                "\n\t SyncInFlags               " + actuator.SyncOutSettings.SyncOutPulseSteps +
                "\n\t uPosition                 " + actuator.SyncOutSettings.uAccuracy
                );
        }
        /// <summary>
        /// Log events that refer to the execution of methods contained in the class Controller.ActuatorController
        /// </summary>
        /// <param name="infoLog">represents all possible log types, of type Entities.Enums.ActuatorLog</param>
        /// <param name="actuator">object of type Controller.ActuatorController </param>
        /// <param name="ActuatorLogTiming">defines either start, end, or don't care of the time when event occurs, of type >Entities.Enums.ActuatorLogTiming</param>
        // Parameters ActuatorController and Enums.ActuatorLogTiming are optional
        // LogActuatorInfo can be called with either 1, 2, or 3 parameters
        public void LogActuatorInfo(Enums.ActuatorLog infoLog,
                                    ActuatorController actuator = dummyActuator,
                                    Enums.ActuatorLogTiming ActuatorLogTiming = Enums.ActuatorLogTiming.DontCare)
        {
            //switch (infoLog)
            //{
            //    case Enums.ActuatorLog.CloseDevice:
            //        Logger.Log.Info(actuator.DeviceName + " was successfully closed");
            //        break;

            //    case Enums.ActuatorLog.MoveHome:
            //        if (ActuatorLogTiming == Enums.ActuatorLogTiming.Start)
            //            Logger.Log.Info(actuator.DeviceName + " intends to move to home position (0 steps, 0 microsteps)" +
            //                            " with the speed" + " TO BE IMPELMENTED BLYAT");
            //        else
            //        {
            //            actuator.GetStatus(actuator.DeviceID);

            //            Logger.Log.Info(actuator.DeviceName + " arrived at home position (" + actuator.Status.uCurPosition + " steps and " +
            //                            actuator.Status.uCurPosition + " microsteps) with the speed");
            //        }
            //        break;

            //    case Enums.ActuatorLog.MoveLeft:
            //        Logger.Log.Info(actuator.DeviceName + " started moving continuously left");
            //        break;

            //    case Enums.ActuatorLog.MoveToPosition:
            //        if (ActuatorLogTiming == Enums.ActuatorLogTiming.Start)
            //            Logger.Log.Info(actuator.DeviceName + " intends to move to position " + actuator.PositionSteps + " steps and " +
            //                            actuator.PositionMicrosteps + " microsteps with the speed");
            //        else
            //        {
            //            actuator.GetStatus(actuator.DeviceID);

            //            Logger.Log.Info(actuator.DeviceName + " arrived at position " + actuator.Status.CurPosition + " steps and " +
            //                            actuator.Status.uCurPosition + " microsteps with the speed");
            //        }
            //        break;

            //    case Enums.ActuatorLog.MoveRelatively:
            //        if (ActuatorLogTiming == Enums.ActuatorLogTiming.Start)
            //            Logger.Log.Info(actuator.DeviceName + " intends to shift by " + actuator.DeltaSteps + " steps and " +
            //                            actuator.DeltaMicrosteps + " microsteps with the speed");
            //        else
            //        {
            //            actuator.GetStatus(actuator.DeviceID);

            //            Logger.Log.Info(actuator.DeviceName + " arrived at position " + actuator.Status.CurPosition + " steps and " +
            //                            actuator.Status.uCurPosition + " microsteps with the speed");
            //        }
            //        break;

            //    case Enums.ActuatorLog.PowerOff:
            //        Logger.Log.Info(actuator.DeviceName + " successfully powered off");
            //        break;

            //    case Enums.ActuatorLog.MoveRight:
            //        Logger.Log.Info(actuator.DeviceName + " started moving continuously right");
            //        break;

            //    case Enums.ActuatorLog.SoftStop:
            //        if (ActuatorLogTiming == Enums.ActuatorLogTiming.Start)
            //            Logger.Log.Info(actuator.DeviceName + " intends to soft stop");
            //        else
            //        {
            //            actuator.GetStatus(actuator.DeviceID);
            //            Logger.Log.Info(actuator.DeviceName + " soft stopped at postion " + actuator.Status.CurPosition + " steps and " +
            //                                actuator.Status.uCurPosition + " microsteps ");
            //        }
            //        break;

            //    case Enums.ActuatorLog.HardStop:
            //        if (ActuatorLogTiming == Enums.ActuatorLogTiming.Start)
            //            Logger.Log.Info(actuator.DeviceName + " intends to hard stop");
            //        else
            //        {
            //            actuator.GetStatus(actuator.DeviceID);
            //            Logger.Log.Info(actuator.DeviceName + " hard stopped at postion" + actuator.Status.CurPosition + " steps and " +
            //                                actuator.Status.uCurPosition + " microsteps ");
            //        }
            //        break;

            //    case Enums.ActuatorLog.SetZero:
            //        Logger.Log.Info(actuator.DeviceName + " successfully set its new home (zero) position");
            //        break;

            //    case Enums.ActuatorLog.WaitForStop:
            //        Logger.Log.Info(actuator.DeviceName + " successfully waited and stopped");
            //        break;

            //    case Enums.ActuatorLog.OpenDevice:
            //        Logger.Log.Info(actuator.DeviceName + " was successfully opened");
            //        break;

            //    case Enums.ActuatorLog.NewActuatorInContext:
            //        Logger.Log.Info("Actuator with ID = " + actuator.DeviceID + " and name = " + actuator.DeviceName + " was brought into context");
            //        break;

            //    default: break;
            //}
        }