private void UpdateDeviceStatTimer_Tick(object sender, EventArgs e)
        {
            Speed = 0;
            double cpuSpeed = 0;
            double gpuSpeed = 0;

            Devices.ForEach(x => { x.Speed = 0; });

            if (!IsIdle)
            {
                foreach (var mp in _minerProcesses)
                {
                    foreach (var miner in mp.Miners)
                    {
                        Devices.Where(x => x.ADLAdapterIndex == miner.Device.ADLAdapterIndex).FirstOrDefault().Speed += miner.Speed;
                        gpuSpeed += miner.Speed;
                    }
                }

                try
                {
                    if (SelectedMinerSettings.IsCPUMiningEnabled && SelectedMinerSettings.ApplicationMode.Equals(ApplicationMode.Normal))
                    {
                        using (var client = new WebClient())
                        {
                            var json     = client.DownloadString("http://localhost:54321");
                            var response = JsonConvert.DeserializeObject <XmrigJson>(json);

                            if (response != null)
                            {
                                cpuSpeed += response.hashrate.total.First();

                                var cpuDevice = Devices.Where(x => x.ADLAdapterIndex == -2).FirstOrDefault();
                                if (cpuDevice != null)
                                {
                                    cpuDevice.Speed          = cpuSpeed;
                                    cpuDevice.SharesAccepted = response.results.shares_good;
                                    cpuDevice.SharesRejected = response.results.shares_total - response.results.shares_good;
                                }
                            }
                        }
                    }
                }
                catch
                {
                    //ham megesszük
                };
            }

            Speed = cpuSpeed + gpuSpeed;

            if (SelectedMinerSettings.IsRemoteManagementEnabled)
            {
                List <SimpleDevice> devices = new List <SimpleDevice>();
                Devices.ForEach(x => devices.Add(new SimpleDevice()
                {
                    Activity  = x.Activity,
                    Algo      = string.Empty,
                    Fan       = x.FanSpeed,
                    ID        = x.ADLAdapterIndex,
                    Intensity = x.Intensity,
                    Name      = x.Name,
                    Speed     = x.Speed,
                    Temp      = x.Temperature,
                    Threads   = x.Threads,
                    Worksize  = x.WorkSize,
                    Shares    = x.Shares
                }));
                RemoteManagerHandler.SendMessageAsync(new SimpleMinerManager.Model.StatusMessage()
                {
                    CPUSpeed = cpuSpeed, GPUSpeed = gpuSpeed, Speed = Speed, IP = IPAddress, Worker = SelectedMinerSettings.RemoteManagerWorkerName, Devices = devices, State = IsIdle ? "Idle" : "Working"
                }, SelectedMinerSettings.RemoteManagerHost);
            }

            Hash = $"Current speed {Speed:N2} h/s (CPU: {cpuSpeed:N2} h/s, GPU: {gpuSpeed:N2} h/s)";
            RaisePropertyChanged(nameof(Hash));
            RefreshDevices?.Invoke();
            //Messenger.Default.Send<MinerOutputMessage>(new MinerOutputMessage() { OutputText = Hash });
        }
        public MainViewModel()
        {
            setDefaultValues();

            registerMessageListeners();

            Log.SetLogger(log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType));
            Log.InsertInfo($"Starting Simple Miner v{VersionNumber} OS: Windows{OSType}");

            Utils.TryKillProcess(Consts.ProcessName);

            loadConfigFile();
            SetApplicationMode(SelectedMinerSettings.ApplicationMode);

            if (SelectedMinerSettings.IsAutoUpdateEnabled)
            {
                if (Process.GetProcessesByName("SimpleMinerUpdater2").Length == 0)
                {
                    ThreadPool.QueueUserWorkItem(delegate
                    {
                        File.Copy(AutoUpdatePathOrig, AutoUpdatePath, true);
                        var psi = new ProcessStartInfo()
                        {
                            FileName        = AutoUpdatePath,
                            UseShellExecute = false,
                            CreateNoWindow  = true
                        };

#if X86
                        psi.Arguments = "is32bit";
#endif
                        Process.Start(psi);
                    });
                }
            }

            if (SelectedMinerSettings.IsRemoteManagementEnabled)
            {
                List <SimpleDevice> devices = new List <SimpleDevice>();
                Devices.ForEach(x => devices.Add(new SimpleDevice()
                {
                    Activity  = x.Activity,
                    Algo      = string.Empty,
                    Fan       = x.FanSpeed,
                    ID        = x.ADLAdapterIndex,
                    Intensity = x.Intensity,
                    Name      = x.Name,
                    Speed     = x.Speed,
                    Temp      = x.Temperature,
                    Threads   = x.Threads,
                    Worksize  = x.WorkSize,
                    Shares    = x.Shares
                }));

                RemoteManagerHandler.SendMessageAsync(new SimpleMinerManager.Model.RegisterMessage()
                {
                    IP      = IPAddress,
                    Worker  = SelectedMinerSettings.RemoteManagerWorkerName,
                    Devices = devices,
                    RemotePoolListEnabled = SelectedMinerSettings.IsRemotePoolListEnabled,
                    State   = "Idle",
                    Version = Consts.VersionNumber
                }, SelectedMinerSettings.RemoteManagerHost);
            }

            ThreadNumber       = SelectedMinerSettings.NumberOfThreads;
            isAutostartMining  = SelectedMinerSettings.IsAutostartMining;
            StartingDelayInSec = SelectedMinerSettings.StartingDelayInSec;

            SetCommands();

            tempDelayInSec = SelectedMinerSettings.StartingDelayInSec;
            if (SelectedMinerSettings.IsLaunchOnWindowsStartup && SelectedMinerSettings.IsLaunchOnWindowsStartup != Utils.IsStartupItem())
            {
                setStartup(0);
            }
            else
            {
                Utils.RemoveProgramFromStartup();
            }

            if (SelectedMinerSettings.IsAutostartMining)
            {
                autoStartMiningWithDelay();
            }

            if (IsGenerateDefaultPoolList)
            {
                SavePools(null);
            }

            if (CustomSettings != null)
            {
                AboutContact = CustomSettings.ContactEmailAddress ?? AboutContact;
            }

            if (SelectedMinerSettings.VersionNumber != VersionNumber)
            {
                DirectoryInfo di = new DirectoryInfo(ApplicationPath + "\\Miners\\Kernel\\Bins");

                if (di.Exists)
                {
                    foreach (var file in di.GetFiles())
                    {
                        file.Delete();
                    }
                }

                SelectedMinerSettings.VersionNumber = VersionNumber;
            }

            InitializeOpenCLDevices();
        }