Пример #1
0
        /// <summary>
        /// Configures and initializes/starts and configures the Pinball object
        /// </summary>
        /// <param name="GlobalConfigFilename">The global config filename.</param>
        /// <param name="TableFilename">The table filename.</param>
        /// <param name="RomName">Name of the rom.</param>
        public void Init(string GlobalConfigFilename = "", string TableFilename = "", string RomName = "")
        {

            bool GlobalConfigLoaded = true;
            //Load the global config


            try
            {
                if (!GlobalConfigFilename.IsNullOrWhiteSpace())
                {
                    FileInfo GlobalConfigFile = new FileInfo(GlobalConfigFilename);


                    GlobalConfig = GlobalConfig.GetGlobalConfigFromConfigXmlFile(GlobalConfigFile.FullName);
                    if (GlobalConfig == null)
                    {
                        GlobalConfigLoaded = false;

                        //set new global config object if it config could not be loaded from the file.
                        GlobalConfig = new GlobalConfig();
                    }
                    GlobalConfig.GlobalConfigFilename = GlobalConfigFile.FullName;
                }
                else
                {
                    GlobalConfig = new GlobalConfig();
                    GlobalConfig.GlobalConfigFilename = GlobalConfigFilename;
                }

            }
            catch (Exception E)
            {

                throw new Exception("DirectOutput framework could initialize global config.\n Inner exception: {0}".Build(E.Message), E);
            }

            if (GlobalConfig.EnableLogging)
            {
                try
                {

                    Log.Filename = GlobalConfig.GetLogFilename((!TableFilename.IsNullOrWhiteSpace() ? new FileInfo(TableFilename).FullName : ""), RomName);
                    Log.Init();

                }
                catch (Exception E)
                {

                    throw new Exception("DirectOutput framework could initialize the log file.\n Inner exception: {0}".Build(E.Message), E);
                }
            }


            try
            {
                if (GlobalConfigLoaded)
                {
                    Log.Write("Global config loaded from: {0}".Build(GlobalConfigFilename));
                }
                else
                {
                    if (!GlobalConfigFilename.IsNullOrWhiteSpace())
                    {
                        Log.Write("Could not find or load theGlobalConfig file {0}".Build(GlobalConfigFilename));
                    }
                    else
                    {
                        Log.Write("No GlobalConfig file loaded. Using newly instanciated GlobalConfig object instead.");
                    }
                }



                Log.Write("Loading Pinball parts");



                //Load global script files
                Log.Write("Loading script files");
                Scripts.LoadAndAddScripts(GlobalConfig.GetGlobalScriptFiles());




                //Load table script files
                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    Scripts.LoadAndAddScripts(GlobalConfig.GetTableScriptFiles(new FileInfo(TableFilename).FullName));
                }
                Log.Write("Script files loaded");


                Log.Write("Loading cabinet");
                //Load cabinet config
                Cabinet = null;
                FileInfo CCF = GlobalConfig.GetCabinetConfigFile();
                if (CCF != null)
                {
                    Log.Write("Will load cabinet config file: {0}".Build(CCF.FullName));
                    try
                    {
                        Cabinet = Cabinet.GetCabinetFromConfigXmlFile(CCF);
                        Cabinet.CabinetConfigurationFilename = CCF.FullName;
                        if (Cabinet.AutoConfigEnabled)
                        {
                            Log.Write("Cabinet config file has AutoConfig feature enable. Calling AutoConfig.");
                            Cabinet.AutoConfig();
                        }
                        Log.Write("Cabinet config loaded successfully from {0}".Build(CCF.FullName));
                    }
                    catch (Exception E)
                    {
                        Log.Exception("A exception occured when load cabinet config file: {0}".Build(CCF.FullName), E);


                    }
                }
                if (Cabinet == null)
                {
                    Log.Write("No cabinet config file loaded. Will use AutoConfig.");
                    //default to a new cabinet object if the config cant be loaded
                    Cabinet = new Cabinet();
                    Cabinet.AutoConfig();
                }

                Log.Write("Cabinet loaded");

                Log.Write("Loading table config");

                //Load table config

                Table = new DirectOutput.Table.Table();
                Table.AddLedControlConfig = true;

                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    FileInfo TableFile = new FileInfo(TableFilename);
                    FileInfo TCF = GlobalConfig.GetTableConfigFile(TableFile.FullName);
                    if (TCF != null)
                    {
                        Log.Write("Will load table config from {0}".Build(TCF.FullName));
                        try
                        {
                            Table = DirectOutput.Table.Table.GetTableFromConfigXmlFile(GlobalConfig.GetTableConfigFile(TableFile.FullName));
                            Table.TableConfigurationFilename = GlobalConfig.GetTableConfigFile(TableFile.FullName).FullName;
                            Log.Write("Table config loaded successfully from {0}".Build(TCF.FullName));
                        }
                        catch (Exception E)
                        {
                            Log.Exception("A exception occured when loading table config: {0}".Build(TCF.FullName), E);
                        }
                        if (Table.AddLedControlConfig)
                        {
                            Log.Write("Table config allows mix with ledcontrol configs.");
                        }
                    }
                    else
                    {
                        Log.Warning("No table config file found. Will try to load config from LedControl file(s).");
                    }
                }
                else
                {
                    Log.Write("No TableFilename specified, will use empty tableconfig");
                }
                if (Table.AddLedControlConfig)
                {
                    if (!RomName.IsNullOrWhiteSpace())
                    {
                        Log.Write("Will try to load configs from DirectOutput.ini or LedControl.ini file(s) for RomName {0}".Build(RomName));
                        //Load ledcontrol
                        LedControlConfigList L = new LedControlConfigList();
                        if (GlobalConfig.LedControlIniFiles.Count > 0)
                        {
                            Log.Write("Will try to load table config from LedControl  file(s) specified in global config.");
                            L.LoadLedControlFiles(GlobalConfig.LedControlIniFiles, false);
                        }
                        else
                        {
                            bool FoundIt = false;
                            List<string> LookupPaths = new List<string>();
                            if (!TableFilename.IsNullOrWhiteSpace())
                            {
                                if (new FileInfo(TableFilename).Directory.Exists)
                                {
                                    LookupPaths.Add(new FileInfo(TableFilename).Directory.FullName);
                                }
                            }
                            LookupPaths.AddRange(new string[] { GlobalConfig.GetGlobalConfigDirectory().FullName, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) });

                            LedControlIniFileList LedControlIniFiles = new LedControlIniFileList();

                            string[] LedControlFilenames = { "directoutputconfig", "ledcontrol" };

                            foreach (string LedControlFilename in LedControlFilenames)
                            {
                                foreach (string P in LookupPaths)
                                {
                                    DirectoryInfo DI = new DirectoryInfo(P);

                                    List<FileInfo> Files = new List<FileInfo>();
                                    foreach (FileInfo FI in DI.EnumerateFiles())
                                    {
                                        if (FI.Name.ToLower().StartsWith(LedControlFilename.ToLower()) && FI.Name.ToLower().EndsWith(".ini"))
                                        {
                                            Files.Add(FI);
                                        }
                                    }


                                    foreach (FileInfo FI in Files)
                                    {
                                        if (string.Equals(FI.Name, "{0}.ini".Build(LedControlFilename), StringComparison.OrdinalIgnoreCase))
                                        {
                                            LedControlIniFiles.Add(FI.FullName, 1);
                                            FoundIt = true;
                                        }
                                        else
                                        {
                                            string F = FI.Name.Substring(LedControlFilename.Length, FI.Name.Length - LedControlFilename.Length - 4);
                                            if (F.IsInteger())
                                            {
                                                int LedWizNr = -1;
                                                if (int.TryParse(F, out LedWizNr))
                                                {
                                                    if (!LedControlIniFiles.Contains(LedWizNr))
                                                    {
                                                        LedControlIniFiles.Add(FI.FullName, LedWizNr);
                                                        FoundIt = true;
                                                    }

                                                }

                                            }

                                        }
                                    };
                                    if (FoundIt) break;
                                }
                                if (FoundIt) break;
                            }

        

                            if (FoundIt)
                            {
                                L.LoadLedControlFiles(LedControlIniFiles, false);
                                Log.Write("{0} directoutput.ini or ledcontrol.ini files loaded.".Build(LedControlIniFiles.Count));
                            }
                            else
                            {
                                Log.Write("No directoutput.ini or ledcontrol.ini files found. No directoutput.ini or ledcontrol.ini configs will be loaded.");
                            }
                        }
                        if (!L.ContainsConfig(RomName))
                        {
                            Log.Write("No config for table found in LedControl data for RomName {0}.".Build(RomName));
                        }
                        else
                        {
                            Log.Write("Config for RomName {0} exists in LedControl data. Updating cabinet and config.".Build(RomName));

                            DirectOutput.LedControl.Setup.Configurator C = new DirectOutput.LedControl.Setup.Configurator();
                            C.EffectMinDurationMs = GlobalConfig.LedControlMinimumEffectDurationMs;
                            C.EffectRGBMinDurationMs = GlobalConfig.LedControlMinimumRGBEffectDurationMs;
                            C.Setup(L, Table, Cabinet, RomName);
                            C = null;
                            //                        L.UpdateTableConfig(Table, RomName, Cabinet);
                        }
                        L = null;
                    }
                    else
                    {

                        Log.Write("Cant load config from directoutput.ini or ledcontrol.ini file(s) since no RomName was supplied. No ledcontrol config will be loaded.");
                    }

                }
                if (Table.TableName.IsNullOrWhiteSpace())
                {
                    if (!TableFilename.IsNullOrWhiteSpace())
                    {
                        Table.TableName = Path.GetFileNameWithoutExtension(new FileInfo(TableFilename).FullName);
                    }
                    else if (!RomName.IsNullOrWhiteSpace())
                    {
                        Table.TableName = RomName;
                    }
                }
                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    Table.TableFilename = new FileInfo(TableFilename).FullName;
                }
                if (!RomName.IsNullOrWhiteSpace())
                {
                    Table.RomName = RomName;
                }
                Log.Write("Table config loading finished");



                Log.Write("Pinball parts loaded");

                Log.Write("Starting processes");
                InitStatistics();
                Cabinet.Init(this);
                Table.Init(this);
                Alarms.Init(this);
                Table.TriggerStaticEffects();
                Cabinet.Update();

                //Add the thread initializing the framework to the threadinfo list
                ThreadInfo TI = new ThreadInfo(Thread.CurrentThread);
                TI.HeartBeatTimeOutMs = 10000;
                TI.HostName = "External caller";
                TI.HeartBeat();
                ThreadInfoList.Add(TI);



                InitMainThread();
                Log.Write("Framework initialized.");
                Log.Write("Have fun! :)");


            }
            catch (Exception E)
            {
                Log.Exception("A eception occured during initialization", E);
                throw new Exception("DirectOutput framework has encountered a exception during initialization.\n Inner exception: {0}".Build(E.Message), E);
            }
        }
Пример #2
0
        /// <summary>
        /// Configures the Pinball object.<br/>
        /// Loads the global config, table config and cabinet config
        /// </summary>
        /// <param name="GlobalConfigFilename">The global config filename.</param>
        /// <param name="TableFilename">The table filename.</param>
        /// <param name="RomName">Name of the rom.</param>
        public void Setup(string GlobalConfigFilename = "", string TableFilename = "", string RomName = "")
        {
            bool GlobalConfigLoaded = true;

            //Load the global config


            try
            {
                if (!GlobalConfigFilename.IsNullOrWhiteSpace())
                {
                    FileInfo GlobalConfigFile = new FileInfo(GlobalConfigFilename);


                    GlobalConfig = GlobalConfig.GetGlobalConfigFromConfigXmlFile(GlobalConfigFile.FullName);
                    if (GlobalConfig == null)
                    {
                        GlobalConfigLoaded = false;

                        //set new global config object if it config could not be loaded from the file.
                        GlobalConfig = new GlobalConfig();
                    }
                    GlobalConfig.GlobalConfigFilename = GlobalConfigFile.FullName;
                }
                else
                {
                    GlobalConfig = new GlobalConfig();
                    GlobalConfig.GlobalConfigFilename = GlobalConfigFilename;
                }
            }
            catch (Exception E)
            {
                throw new Exception("DirectOutput framework could not initialize global config.\n Inner exception: {0}".Build(E.Message), E);
            }

            if (GlobalConfig.EnableLogging)
            {
                if (GlobalConfig.ClearLogOnSessionStart)
                {
                    try
                    {
                        FileInfo LF = new FileInfo(GlobalConfig.GetLogFilename((!TableFilename.IsNullOrWhiteSpace() ? new FileInfo(TableFilename).FullName : ""), RomName));
                        if (LF.Exists)
                        {
                            LF.Delete();
                        }
                    }
                    catch { }
                }
                try
                {
                    Log.Filename = GlobalConfig.GetLogFilename((!TableFilename.IsNullOrWhiteSpace() ? new FileInfo(TableFilename).FullName : ""), RomName);
                    Log.Init();
                }
                catch (Exception E)
                {
                    throw new Exception("DirectOutput framework could initialize the log file.\n Inner exception: {0}".Build(E.Message), E);
                }
            }


            try
            {
                if (GlobalConfigLoaded)
                {
                    Log.Write("Global config loaded from: {0}".Build(GlobalConfigFilename));
                }
                else
                {
                    if (!GlobalConfigFilename.IsNullOrWhiteSpace())
                    {
                        Log.Write("Could not find or load theGlobalConfig file {0}".Build(GlobalConfigFilename));
                    }
                    else
                    {
                        Log.Write("No GlobalConfig file loaded. Using newly instanciated GlobalConfig object instead.");
                    }
                }



                Log.Write("Loading Pinball parts");



                Log.Write("Loading cabinet");
                //Load cabinet config
                Cabinet = null;
                FileInfo CCF = GlobalConfig.GetCabinetConfigFile();
                if (CCF != null)
                {
                    if (CCF.Exists)
                    {
                        Log.Write("Will load cabinet config file: {0}".Build(CCF.FullName));
                        try
                        {
                            Cabinet = Cabinet.GetCabinetFromConfigXmlFile(CCF);

                            Log.Write("{0} output controller defnitions and {1} toy definitions loaded from cabinet config.".Build(Cabinet.OutputControllers.Count, Cabinet.Toys.Count));


                            Cabinet.CabinetConfigurationFilename = CCF.FullName;
                            if (Cabinet.AutoConfigEnabled)
                            {
                                Log.Write("Cabinet config file has AutoConfig feature enabled. Calling AutoConfig.");
                                try
                                {
                                    Cabinet.AutoConfig();
                                }
                                catch (Exception E)
                                {
                                    Log.Exception("A eception occured during cabinet auto configuration", E);
                                }
                                Log.Write("Autoconfig complete.");
                            }
                            Log.Write("Cabinet config loaded successfully from {0}".Build(CCF.FullName));
                        }
                        catch (Exception E)
                        {
                            Log.Exception("A exception occured when loading cabinet config file: {0}".Build(CCF.FullName), E);
                        }
                    }
                    else
                    {
                        Log.Warning("Cabinet config file {0} does not exist.".Build(CCF.FullName));
                    }
                }
                if (Cabinet == null)
                {
                    Log.Write("No cabinet config file loaded. Will use AutoConfig.");
                    //default to a new cabinet object if the config cant be loaded
                    Cabinet = new Cabinet();
                    Cabinet.AutoConfig();
                }

                Log.Write("Cabinet loaded");

                Log.Write("Loading table config");

                //Load table config

                Table = new DirectOutput.Table.Table();
                Table.AddLedControlConfig = true;

                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    FileInfo TableFile = new FileInfo(TableFilename);
                    FileInfo TCF       = GlobalConfig.GetTableConfigFile(TableFile.FullName);
                    if (TCF != null)
                    {
                        Log.Write("Will load table config from {0}".Build(TCF.FullName));
                        try
                        {
                            Table = DirectOutput.Table.Table.GetTableFromConfigXmlFile(GlobalConfig.GetTableConfigFile(TableFile.FullName));
                            Table.TableConfigurationFilename = GlobalConfig.GetTableConfigFile(TableFile.FullName).FullName;
                            Log.Write("Table config loaded successfully from {0}".Build(TCF.FullName));
                        }
                        catch (Exception E)
                        {
                            Log.Exception("A exception occured when loading table config: {0}".Build(TCF.FullName), E);
                        }
                        if (Table.AddLedControlConfig)
                        {
                            Log.Write("Table config allows mix with ledcontrol configs.");
                        }
                    }
                    else
                    {
                        Log.Warning("No table config file found. Will try to load config from LedControl file(s).");
                    }
                }
                else
                {
                    Log.Write("No TableFilename specified, will use empty tableconfig");
                }
                if (Table.AddLedControlConfig)
                {
                    if (!RomName.IsNullOrWhiteSpace())
                    {
                        Log.Write("Will try to load configs from DirectOutput.ini or LedControl.ini file(s) for RomName {0}".Build(RomName));
                        //Load ledcontrol

                        Dictionary <int, FileInfo> LedControlIniFiles = GlobalConfig.GetIniFilesDictionary(TableFilename);


                        LedControlConfigList L = new LedControlConfigList();
                        if (LedControlIniFiles.Count > 0)
                        {
                            L.LoadLedControlFiles(LedControlIniFiles, false);
                            Log.Write("{0} directoutputconfig.ini or ledcontrol.ini files loaded.".Build(LedControlIniFiles.Count));
                        }
                        else
                        {
                            Log.Write("No directoutputconfig.ini or ledcontrol.ini files found.");
                        }

                        if (!L.ContainsConfig(RomName))
                        {
                            Log.Write("No config for table found in LedControl data for RomName {0}.".Build(RomName));
                        }
                        else
                        {
                            Log.Write("Config for RomName {0} exists in LedControl data. Updating cabinet and config.".Build(RomName));

                            DirectOutput.LedControl.Setup.Configurator C = new DirectOutput.LedControl.Setup.Configurator();
                            C.EffectMinDurationMs    = GlobalConfig.LedControlMinimumEffectDurationMs;
                            C.EffectRGBMinDurationMs = GlobalConfig.LedControlMinimumRGBEffectDurationMs;
                            C.Setup(L, Table, Cabinet, RomName);
                            C = null;
                            //                        L.UpdateTableConfig(Table, RomName, Cabinet);

                            //Check DOF Version
                            Version DOFVersion = typeof(Pinball).Assembly.GetName().Version;

                            if (L.Any(LC => LC.MinDOFVersion != null && LC.MinDOFVersion.CompareTo(DOFVersion) > 0))
                            {
                                Version MaxVersion = null;
                                foreach (LedControlConfig LC in L)
                                {
                                    if (LC.MinDOFVersion != null && (MaxVersion == null || MaxVersion.CompareTo(LC.MinDOFVersion) > 0))
                                    {
                                        MaxVersion = LC.MinDOFVersion;
                                    }
                                }


                                Log.Warning("UPDATE DIRECT OUTPUT FRAMEWORK!");
                                if (MaxVersion != null)
                                {
                                    Log.Warning("Current DOF version is {0}, but DOF version {1} or later is required by one or several config files.".Build(DOFVersion, MaxVersion));
                                }
                                try
                                {
                                    Process.Start(Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "UpdateNotification.exe"));
                                }
                                catch (Exception E)
                                {
                                    Log.Exception("A exception occured when displaying the update notification", E);
                                }
                            }
                        }
                        L = null;
                    }
                    else
                    {
                        Log.Write("Cant load config from directoutput.ini or ledcontrol.ini file(s) since no RomName was supplied. No ledcontrol config will be loaded.");
                    }
                }
                if (Table.TableName.IsNullOrWhiteSpace())
                {
                    if (!TableFilename.IsNullOrWhiteSpace())
                    {
                        Table.TableName = Path.GetFileNameWithoutExtension(new FileInfo(TableFilename).FullName);
                    }
                    else if (!RomName.IsNullOrWhiteSpace())
                    {
                        Table.TableName = RomName;
                    }
                }
                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    Table.TableFilename = new FileInfo(TableFilename).FullName;
                }
                if (!RomName.IsNullOrWhiteSpace())
                {
                    Table.RomName = RomName;
                }
                Log.Write("Table config loading finished: romname=" + RomName + ", tablename=" + Table.TableName);


                //update table overrider with romname and tablename references, and activate valid overrides
                TableOverrideSettings.Instance.activeromName   = RomName;
                TableOverrideSettings.Instance.activetableName = Table.TableName;
                TableOverrideSettings.Instance.activateOverrides();

                Log.Write("Pinball parts loaded");
            }
            catch (Exception E)
            {
                Log.Exception("DirectOutput framework has encountered a exception during setup.", E);
                throw new Exception("DirectOutput framework has encountered a exception during setup.\n Inner exception: {0}".Build(E.Message), E);
            }
        }
Пример #3
0
        /// <summary>
        /// Configures and initializes/starts and configures the Pinball object
        /// </summary>
        /// <param name="GlobalConfigFilename">The global config filename.</param>
        /// <param name="TableFilename">The table filename.</param>
        /// <param name="RomName">Name of the rom.</param>
        public void Init(string GlobalConfigFilename = "", string TableFilename = "", string RomName = "")
        {
            bool GlobalConfigLoaded = true;

            //Load the global config


            try
            {
                if (!GlobalConfigFilename.IsNullOrWhiteSpace())
                {
                    FileInfo GlobalConfigFile = new FileInfo(GlobalConfigFilename);


                    GlobalConfig = GlobalConfig.GetGlobalConfigFromConfigXmlFile(GlobalConfigFile.FullName);
                    if (GlobalConfig == null)
                    {
                        GlobalConfigLoaded = false;

                        //set new global config object if it config could not be loaded from the file.
                        GlobalConfig = new GlobalConfig();
                    }
                    GlobalConfig.GlobalConfigFilename = GlobalConfigFile.FullName;
                }
                else
                {
                    GlobalConfig = new GlobalConfig();
                    GlobalConfig.GlobalConfigFilename = GlobalConfigFilename;
                }
            }
            catch (Exception E)
            {
                throw new Exception("DirectOutput framework could initialize global config.\n Inner exception: {0}".Build(E.Message), E);
            }

            if (GlobalConfig.EnableLogging)
            {
                try
                {
                    Log.Filename = GlobalConfig.GetLogFilename((!TableFilename.IsNullOrWhiteSpace() ? new FileInfo(TableFilename).FullName : ""), RomName);
                    Log.Init();
                }
                catch (Exception E)
                {
                    throw new Exception("DirectOutput framework could initialize the log file.\n Inner exception: {0}".Build(E.Message), E);
                }
            }


            try
            {
                if (GlobalConfigLoaded)
                {
                    Log.Write("Global config loaded from: {0}".Build(GlobalConfigFilename));
                }
                else
                {
                    if (!GlobalConfigFilename.IsNullOrWhiteSpace())
                    {
                        Log.Write("Could not find or load theGlobalConfig file {0}".Build(GlobalConfigFilename));
                    }
                    else
                    {
                        Log.Write("No GlobalConfig file loaded. Using newly instanciated GlobalConfig object instead.");
                    }
                }



                Log.Write("Loading Pinball parts");



                //Load global script files
                Log.Write("Loading script files");
                Scripts.LoadAndAddScripts(GlobalConfig.GetGlobalScriptFiles());



                //Load table script files
                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    Scripts.LoadAndAddScripts(GlobalConfig.GetTableScriptFiles(new FileInfo(TableFilename).FullName));
                }
                Log.Write("Script files loaded");


                Log.Write("Loading cabinet");
                //Load cabinet config
                Cabinet = null;
                FileInfo CCF = GlobalConfig.GetCabinetConfigFile();
                if (CCF != null)
                {
                    Log.Write("Will load cabinet config file: {0}".Build(CCF.FullName));
                    try
                    {
                        Cabinet = Cabinet.GetCabinetFromConfigXmlFile(CCF);
                        Cabinet.CabinetConfigurationFilename = CCF.FullName;
                        if (Cabinet.AutoConfigEnabled)
                        {
                            Log.Write("Cabinet config file has AutoConfig feature enable. Calling AutoConfig.");
                            Cabinet.AutoConfig();
                        }
                        Log.Write("Cabinet config loaded successfully from {0}".Build(CCF.FullName));
                    }
                    catch (Exception E)
                    {
                        Log.Exception("A exception occured when load cabinet config file: {0}".Build(CCF.FullName), E);
                    }
                }
                if (Cabinet == null)
                {
                    Log.Write("No cabinet config file loaded. Will use AutoConfig.");
                    //default to a new cabinet object if the config cant be loaded
                    Cabinet = new Cabinet();
                    Cabinet.AutoConfig();
                }

                Log.Write("Cabinet loaded");

                Log.Write("Loading table config");

                //Load table config

                Table = new DirectOutput.Table.Table();
                Table.AddLedControlConfig = true;

                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    FileInfo TableFile = new FileInfo(TableFilename);
                    FileInfo TCF       = GlobalConfig.GetTableConfigFile(TableFile.FullName);
                    if (TCF != null)
                    {
                        Log.Write("Will load table config from {0}".Build(TCF.FullName));
                        try
                        {
                            Table = DirectOutput.Table.Table.GetTableFromConfigXmlFile(GlobalConfig.GetTableConfigFile(TableFile.FullName));
                            Table.TableConfigurationFilename = GlobalConfig.GetTableConfigFile(TableFile.FullName).FullName;
                            Log.Write("Table config loaded successfully from {0}".Build(TCF.FullName));
                        }
                        catch (Exception E)
                        {
                            Log.Exception("A exception occured when loading table config: {0}".Build(TCF.FullName), E);
                        }
                        if (Table.AddLedControlConfig)
                        {
                            Log.Write("Table config allows mix with ledcontrol configs.");
                        }
                    }
                    else
                    {
                        Log.Warning("No table config file found. Will try to load config from LedControl file(s).");
                    }
                }
                else
                {
                    Log.Write("No TableFilename specified, will use empty tableconfig");
                }
                if (Table.AddLedControlConfig)
                {
                    if (!RomName.IsNullOrWhiteSpace())
                    {
                        Log.Write("Will try to load configs from DirectOutput.ini or LedControl.ini file(s) for RomName {0}".Build(RomName));
                        //Load ledcontrol
                        LedControlConfigList L = new LedControlConfigList();
                        if (GlobalConfig.LedControlIniFiles.Count > 0)
                        {
                            Log.Write("Will try to load table config from LedControl  file(s) specified in global config.");
                            L.LoadLedControlFiles(GlobalConfig.LedControlIniFiles, false);
                        }
                        else
                        {
                            bool          FoundIt     = false;
                            List <string> LookupPaths = new List <string>();
                            if (!TableFilename.IsNullOrWhiteSpace())
                            {
                                if (new FileInfo(TableFilename).Directory.Exists)
                                {
                                    LookupPaths.Add(new FileInfo(TableFilename).Directory.FullName);
                                }
                            }
                            LookupPaths.AddRange(new string[] { GlobalConfig.GetGlobalConfigDirectory().FullName, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) });

                            LedControlIniFileList LedControlIniFiles = new LedControlIniFileList();

                            string[] LedControlFilenames = { "directoutputconfig", "ledcontrol" };

                            foreach (string LedControlFilename in LedControlFilenames)
                            {
                                foreach (string P in LookupPaths)
                                {
                                    DirectoryInfo DI = new DirectoryInfo(P);

                                    List <FileInfo> Files = new List <FileInfo>();
                                    foreach (FileInfo FI in DI.EnumerateFiles())
                                    {
                                        if (FI.Name.ToLower().StartsWith(LedControlFilename.ToLower()) && FI.Name.ToLower().EndsWith(".ini"))
                                        {
                                            Files.Add(FI);
                                        }
                                    }


                                    foreach (FileInfo FI in Files)
                                    {
                                        if (string.Equals(FI.Name, "{0}.ini".Build(LedControlFilename), StringComparison.OrdinalIgnoreCase))
                                        {
                                            LedControlIniFiles.Add(FI.FullName, 1);
                                            FoundIt = true;
                                        }
                                        else
                                        {
                                            string F = FI.Name.Substring(LedControlFilename.Length, FI.Name.Length - LedControlFilename.Length - 4);
                                            if (F.IsInteger())
                                            {
                                                int LedWizNr = -1;
                                                if (int.TryParse(F, out LedWizNr))
                                                {
                                                    if (!LedControlIniFiles.Contains(LedWizNr))
                                                    {
                                                        LedControlIniFiles.Add(FI.FullName, LedWizNr);
                                                        FoundIt = true;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    ;
                                    if (FoundIt)
                                    {
                                        break;
                                    }
                                }
                                if (FoundIt)
                                {
                                    break;
                                }
                            }



                            if (FoundIt)
                            {
                                L.LoadLedControlFiles(LedControlIniFiles, false);
                                Log.Write("{0} directoutput.ini or ledcontrol.ini files loaded.".Build(LedControlIniFiles.Count));
                            }
                            else
                            {
                                Log.Write("No directoutput.ini or ledcontrol.ini files found. No directoutput.ini or ledcontrol.ini configs will be loaded.");
                            }
                        }
                        if (!L.ContainsConfig(RomName))
                        {
                            Log.Write("No config for table found in LedControl data for RomName {0}.".Build(RomName));
                        }
                        else
                        {
                            Log.Write("Config for RomName {0} exists in LedControl data. Updating cabinet and config.".Build(RomName));

                            DirectOutput.LedControl.Setup.Configurator C = new DirectOutput.LedControl.Setup.Configurator();
                            C.EffectMinDurationMs    = GlobalConfig.LedControlMinimumEffectDurationMs;
                            C.EffectRGBMinDurationMs = GlobalConfig.LedControlMinimumRGBEffectDurationMs;
                            C.Setup(L, Table, Cabinet, RomName);
                            C = null;
                            //                        L.UpdateTableConfig(Table, RomName, Cabinet);
                        }
                        L = null;
                    }
                    else
                    {
                        Log.Write("Cant load config from directoutput.ini or ledcontrol.ini file(s) since no RomName was supplied. No ledcontrol config will be loaded.");
                    }
                }
                if (Table.TableName.IsNullOrWhiteSpace())
                {
                    if (!TableFilename.IsNullOrWhiteSpace())
                    {
                        Table.TableName = Path.GetFileNameWithoutExtension(new FileInfo(TableFilename).FullName);
                    }
                    else if (!RomName.IsNullOrWhiteSpace())
                    {
                        Table.TableName = RomName;
                    }
                }
                if (!TableFilename.IsNullOrWhiteSpace())
                {
                    Table.TableFilename = new FileInfo(TableFilename).FullName;
                }
                if (!RomName.IsNullOrWhiteSpace())
                {
                    Table.RomName = RomName;
                }
                Log.Write("Table config loading finished");



                Log.Write("Pinball parts loaded");

                Log.Write("Starting processes");
                InitStatistics();
                Cabinet.Init(this);
                Table.Init(this);
                Alarms.Init(this);
                Table.TriggerStaticEffects();
                Cabinet.Update();

                //Add the thread initializing the framework to the threadinfo list
                ThreadInfo TI = new ThreadInfo(Thread.CurrentThread);
                TI.HeartBeatTimeOutMs = 10000;
                TI.HostName           = "External caller";
                TI.HeartBeat();
                ThreadInfoList.Add(TI);



                InitMainThread();
                Log.Write("Framework initialized.");
                Log.Write("Have fun! :)");
            }
            catch (Exception E)
            {
                Log.Exception("A eception occured during initialization", E);
                throw new Exception("DirectOutput framework has encountered a exception during initialization.\n Inner exception: {0}".Build(E.Message), E);
            }
        }