//constructor
        public ControlSystem()
            : base()
        {
            string DeviceType = this.ControllerPrompt;

            if (DeviceType != "CP3" && DeviceType != "CP3N")
            {
                ErrorLog.Error("This program is for a CP3 or CP3N Control System");
                ErrorLog.Error("Terminating Execution");
                throw new NotSupportedException();
            }

            try
            {
                #region Onboard Devices
                //CP3 onboard devices
                //Slot-02.Slot2.1
                Ethernet_Information = AdapterInformation.GetAdapterInformation();
                //Slot-03.Slot-01
                Com01 = new TwoWaySerialDriver(this.ComPorts[1]);
                //Slot-03.Slot-02
                Com02 = new RS232OnlyTwoWaySerialDriver(this.ComPorts[2]);
                //Slot-03.Slot-03
                Com03 = new RS232OnlyTwoWaySerialDriver(this.ComPorts[3]);
                //Slot-04
                C2I_CP3_IO8 = IOs8AnalogInputCard.GetIO8AnalogInputCard(VersiPorts);
                //Slot-05
                C2I_CP3_RY8 = Relays8Card.GetRelay8Card(RelayPorts);
                //Slot-06 Port-01
                IR1 = this.IROutputPorts[1];
                //Slot-06 Port-02
                IR2 = this.IROutputPorts[2];
                //Slot-07
                C2I_CP3_SYSTEMMONITOR = System_Monitor.GetSystemMonitor();
                //Slot-07.Slot-01
                C2I_CP3_SYSTEMCONTROL = System_Control.GetSystemControl();
                //Slot-7.Slot-02
                C2I_CP3_SYSTEMINFORMATION = System_Information.GetSystemInformation();
                //Slot-10.Slot-01
                C2I_USB_HID = new USBPort(UsbHids[1]);
                #endregion

                //Single Port examples:
                //IOPort8 = new IOPort(VersiPorts[8]);
                //Relay8 = new SingleRelay(RelayPorts[8]);

                Thread.MaxNumberOfUserThreads = 20;
            }
            catch (Exception e)
            {
                ErrorLog.Error("Error in the constructor: {0}", e.Message);
            }
        }
        public static void Start(IOs8AnalogInputCard IO8AnalogInputCard)
        {
            _IO8AnalogInputCard = IO8AnalogInputCard;

            _IO8AnalogInputCard.ai1_Changed           += value => { CrestronConsole.PrintLine("Versioport 1: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai1); };
            _IO8AnalogInputCard.di1_Changed           += value => { CrestronConsole.PrintLine("Versioport 1: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di1); };
            _IO8AnalogInputCard.o1_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 1: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o1_F); };
            _IO8AnalogInputCard.pu_disable1_F_Changed += value => { CrestronConsole.PrintLine("Versioport 1: PU-Disable1 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable1_F); };
            _IO8AnalogInputCard.MinChange1_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 1: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange1_F); };

            _IO8AnalogInputCard.ai2_Changed           += value => { CrestronConsole.PrintLine("Versioport 2: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai2); };
            _IO8AnalogInputCard.di2_Changed           += value => { CrestronConsole.PrintLine("Versioport 2: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di2); };
            _IO8AnalogInputCard.o2_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 2: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o2_F); };
            _IO8AnalogInputCard.pu_disable2_F_Changed += value => { CrestronConsole.PrintLine("Versioport 2: PU-Disable2 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable2_F); };
            _IO8AnalogInputCard.MinChange2_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 2: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange2_F); };

            _IO8AnalogInputCard.ai3_Changed           += value => { CrestronConsole.PrintLine("Versioport 3: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai3); };
            _IO8AnalogInputCard.di3_Changed           += value => { CrestronConsole.PrintLine("Versioport 3: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di3); };
            _IO8AnalogInputCard.o3_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 3: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o3_F); };
            _IO8AnalogInputCard.pu_disable3_F_Changed += value => { CrestronConsole.PrintLine("Versioport 3: PU-Disable3 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable3_F); };
            _IO8AnalogInputCard.MinChange3_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 3: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange3_F); };

            _IO8AnalogInputCard.ai4_Changed           += value => { CrestronConsole.PrintLine("Versioport 4: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai4); };
            _IO8AnalogInputCard.di4_Changed           += value => { CrestronConsole.PrintLine("Versioport 4: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di4); };
            _IO8AnalogInputCard.o4_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 4: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o4_F); };
            _IO8AnalogInputCard.pu_disable4_F_Changed += value => { CrestronConsole.PrintLine("Versioport 4: PU-Disable4 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable4_F); };
            _IO8AnalogInputCard.MinChange4_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 4: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange4_F); };

            _IO8AnalogInputCard.ai5_Changed           += value => { CrestronConsole.PrintLine("Versioport 5: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai5); };
            _IO8AnalogInputCard.di5_Changed           += value => { CrestronConsole.PrintLine("Versioport 5: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di5); };
            _IO8AnalogInputCard.o5_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 5: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o5_F); };
            _IO8AnalogInputCard.pu_disable5_F_Changed += value => { CrestronConsole.PrintLine("Versioport 5: PU-Disable5 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable5_F); };
            _IO8AnalogInputCard.MinChange5_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 5: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange5_F); };

            _IO8AnalogInputCard.ai6_Changed           += value => { CrestronConsole.PrintLine("Versioport 6: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai6); };
            _IO8AnalogInputCard.di6_Changed           += value => { CrestronConsole.PrintLine("Versioport 6: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di6); };
            _IO8AnalogInputCard.o6_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 6: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o6_F); };
            _IO8AnalogInputCard.pu_disable6_F_Changed += value => { CrestronConsole.PrintLine("Versioport 6: PU-Disable6 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable6_F); };
            _IO8AnalogInputCard.MinChange6_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 6: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange6_F); };

            _IO8AnalogInputCard.ai7_Changed           += value => { CrestronConsole.PrintLine("Versioport 7: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai7); };
            _IO8AnalogInputCard.di7_Changed           += value => { CrestronConsole.PrintLine("Versioport 7: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di7); };
            _IO8AnalogInputCard.o7_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 7: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o7_F); };
            _IO8AnalogInputCard.pu_disable7_F_Changed += value => { CrestronConsole.PrintLine("Versioport 7: PU-Disable7 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable7_F); };
            _IO8AnalogInputCard.MinChange7_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 7: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange7_F); };

            _IO8AnalogInputCard.ai8_Changed           += value => { CrestronConsole.PrintLine("Versioport 8: Analog Input Changed: {0}, {1}", value, _IO8AnalogInputCard.ai8); };
            _IO8AnalogInputCard.di8_Changed           += value => { CrestronConsole.PrintLine("Versioport 8: Digital Input Changed: {0}, {1}", value, _IO8AnalogInputCard.di8); };
            _IO8AnalogInputCard.o8_F_Changed          += value => { CrestronConsole.PrintLine("Versioport 8: Digital Output Changed: {0}, {1}", value, _IO8AnalogInputCard.o8_F); };
            _IO8AnalogInputCard.pu_disable8_F_Changed += value => { CrestronConsole.PrintLine("Versioport 8: PU-Disable8 Changed: {0}, {1}", value, _IO8AnalogInputCard.pu_disable8_F); };
            _IO8AnalogInputCard.MinChange8_F_Changed  += value => { CrestronConsole.PrintLine("Versioport 8: MinChange: {0}, {1}", value, _IO8AnalogInputCard.MinChange8_F); };


            CrestronConsole.AddNewConsoleCommand(SetOutput, "TSetOutput", "Set/Reset A Versiport Output", ConsoleAccessLevelEnum.AccessOperator);
            CrestronConsole.AddNewConsoleCommand(PUDisable, "TPUDisable", "Set/Reset A Pull Up Resistor", ConsoleAccessLevelEnum.AccessOperator);
            CrestronConsole.AddNewConsoleCommand(MinChange, "TMinChange", "Set/Reset A MinChange", ConsoleAccessLevelEnum.AccessOperator);
            CrestronConsole.AddNewConsoleCommand(SetConfiguration, "TSetConf", "Sets the versiport configuration", ConsoleAccessLevelEnum.AccessOperator);
            CrestronConsole.AddNewConsoleCommand(SetResistor, "TSetResistor", "Sets the value of the External Resistor", ConsoleAccessLevelEnum.AccessOperator);
            CrestronConsole.AddNewConsoleCommand(GetProps, "TGetProps", "Gets the Properties of A Versiport", ConsoleAccessLevelEnum.AccessOperator);
            CrestronConsole.AddNewConsoleCommand(SetAnalogScale, "TAnalogScale", "Sets the Analog Scale of A Versiport", ConsoleAccessLevelEnum.AccessOperator);
        }