/// <summary>
        /// Updates the machine configuration collections. Switches, lamps, coils etc.
        /// </summary>
        private void UpdateMachineConfigCollections()
        {
            Log("Updating UI Collections");

            //Add only the switches not containing dedicated and flipper
            if (MachineConfig.PRSwitches != null)
            {
                Log("Adding dedicated switches");

                //Quick hack for PDB switches. Need to put the 64-127 range of switch into the dedicated collection...
                if (MachineConfig.GetMachineType() == MachineType.PDB)
                {
                    var lowRange = MachineConfig.PRSwitches.Where(x => x.Number.Contains("SD") &&
                                                                  Convert.ToByte(x.Number.Replace("SD", "")) < 64);
                    var hiRange = MachineConfig.PRSwitches.Where(x => x.Number.Contains("SD") &&
                                                                 (Convert.ToByte(x.Number.Replace("SD", "")) < 128 && Convert.ToByte(x.Number.Replace("SD", "")) > 63));

                    Switches.AddRange(lowRange.Select(x => new SwitchViewModel(x)));
                    DedicatedSwitches.AddRange(hiRange.Select(x => new SwitchViewModel(x)));
                }
                else
                {
                    DedicatedSwitches.AddRange(MachineConfig.PRSwitches
                                               .Where(x => x.Number.Contains("SD"))
                                               .Select(x => new SwitchViewModel(x)).OrderBy(x => x.Number));

                    Log("Adding switches");
                    Switches.AddRange(MachineConfig.PRSwitches
                                      .Where(x => !x.Number.Contains("F") & !x.Number.Contains("SD"))
                                      .Select(x => new SwitchViewModel(x)).OrderBy(x => x.Number));
                }

                Log("Adding flipper switches");
                FlippersSwitches.AddRange(MachineConfig.PRSwitches
                                          .Where(x => x.Number.Contains("SF"))
                                          .Select(x => new SwitchViewModel(x)).OrderBy(x => x.Number));
            }
            else
            {
                Log("PRSwitches doesn't exist");
            }

            if (MachineConfig.PRCoils != null)
            {
                Coils.AddRange(MachineConfig.PRCoils.Select(x => new SolenoidFlasherViewModel(x)).OrderBy(x => x.Number));
            }
            else
            {
                Log("PRCoils doesn't exist");
            }

            if (MachineConfig.PRLamps != null)
            {
                Lamps.AddRange(MachineConfig.PRLamps.Select(x => new LampViewModel(x)).OrderBy(x => x.Number));
            }
            else
            {
                Log("PRLamps doesn't exist");
            }

            if (MachineConfig.PRLeds != null)
            {
                PRLeds.AddRange(MachineConfig.PRLeds.Select(x => new LampViewModel(x)));//.OrderBy(x => x.Number.Replace("A8-", "")));
            }
            else
            {
                Log("PRLeds doesn't exist");
            }
        }
        private void SaveMachineConfig()
        {
            var mConfig = MachineConfig;

            Log("Saving Machine configuration");

            Log("Adding Flipper switches");
            mConfig.PRSwitches.Clear();
            mConfig.PRSwitches
            .AddRange(FlippersSwitches.Select(x => new PRSwitch()
            {
                Name         = x.Name,
                Number       = x.Number,
                Tags         = x.Tags,
                SwitchType   = x.Type,
                Label        = x.Label,
                VpSwitchType = x.VpSwitchType
            }));

            var allSwitches = Switches;

            if (mConfig.GetMachineType() == MachineType.PDB)
            {
                UpdateSwitchesBeforeSaved(mConfig);
                UpdateDedicatedBeforeSave(mConfig);
            }
            else
            {
                UpdateDedicatedBeforeSave(mConfig);
                UpdateSwitchesBeforeSaved(mConfig);
            }

            //Save Lamps
            Log("Adding Lamps");
            mConfig.PRLamps?.Clear();

            if (mConfig.PRLamps == null)
            {
                Log("No PRLEDs found in config.", Category.Warn);
            }
            else
            {
                foreach (var item in Lamps)
                {
                    if (item.Name != "NOT USED")
                    {
                        var lamp = new PRLamp()
                        {
                            Name   = item.Name,
                            Number = item.Number,
                            Tags   = item.Tags,
                            Label  = item.Label
                        };

                        MachineConfig.PRLamps.Add(lamp);
                    }
                }
            }

            //Save LEds
            Log("Adding LEDs");
            if (mConfig.PRLeds == null)
            {
                Log("No PRLEDs found in config.", Category.Warn);
            }
            else
            {
                mConfig.PRLeds.Clear();
                foreach (var item in PRLeds)
                {
                    if (item.Name != "NOT USED")
                    {
                        var lamp = new PRLed()
                        {
                            Name   = item.Name,
                            Number = item.Number,
                            Tags   = item.Tags,
                            Label  = item.Label
                        };

                        mConfig.PRLeds.Add(lamp);
                    }
                }
            }

            mConfig.PRCoils.Clear();
            mConfig.PRFlippers.Clear();

            Log("Adding Coils");
            foreach (var coil in Coils)
            {
                var number = coil.Number;
                if (MachineConfig.GetMachineType() == MachineType.PDB)
                {
                    number = coil.Number.Split(':')[1];
                }

                if (coil.Name != "NOT USED")
                {
                    var newcoil = new PRCoil()
                    {
                        Name          = coil.Name,
                        Number        = number,
                        Tags          = coil.Tags,
                        PatterOffTime = coil.PatterOffTime,
                        PatterOnTime  = coil.PatterOnTime,
                        BallSearch    = coil.BallSearch,
                        PulseTime     = coil.PulseTime,
                        SolenoidType  = coil.SolenoidType,
                        Label         = coil.Label
                    };

                    mConfig.PRCoils.Add(newcoil);

                    //Add PRFlippers list from the coil name once
                    if (coil.Name.Contains("Main"))
                    {
                        mConfig.PRFlippers.Add(newcoil.Name.Replace("Main", string.Empty));
                    }
                }
            }

            Log("Attempting Save...");
            _skeletonGameProvider.SaveMachineConfig(mConfig);
        }