public MinerDeviceOutput(MinerDevice device)
 {
     this.DeviceId = device.GetDeviceId();
     this.DisplayName = device.GetDisplayName();
     this.DeviceVersion = device.GetDeviceVersion();
     this.DriverVersion = device.GetDriverVersion();
 }
Esempio n. 2
0
        private void StepFour_RetrieveDeviceList_Sync()
        {
            int startedWorkCount  = 0;
            int finishedWorkCount = 0;

            foreach (MinerClient client in createdClients)
            {
                if (client.Machine.Devices != null && client.Machine.Devices.Count > 0)
                {
                    continue;
                }

                MinerMachine existingMachine = ManagerInfo.Current.Machines.FirstOrDefault(m => m.FullName.Equals(client.Machine.FullName));
                if (existingMachine != null && existingMachine.Devices != null && existingMachine.Devices.Count > 0)
                {
                    // This machine has been queried before and the devices are saved in the ManagerInfo cache, read it
                    client.Machine.Devices = existingMachine.Devices;
                }
                else
                {
                    // Didn't find the machine in cache, use Executor to retrieve it
                    startedWorkCount++;
                    BackgroundWork <List <DeviceOutput> > .CreateWork(this, () => { },
                                                                      () =>
                    {
                        return(client.ExecuteDaemon <List <DeviceOutput> >("-l"));
                    },
                                                                      (taskResult) =>
                    {
                        finishedWorkCount++;
                        if (taskResult.HasError)
                        {
                            logger.Error($"ExecuteCommand on machine [{ client.Machine.FullName }] failed: " + taskResult.Exception.ToString());
                            return;
                        }

                        client.Machine.Devices            = new List <MinerDevice>();
                        List <DeviceOutput> deviceOutputs = taskResult.Result;
                        if (deviceOutputs == null || deviceOutputs.Count == 0)
                        {
                            logger.Warning("没有找到任何满足条件的硬件,请检查目标机器配置");
                            return;
                        }

                        foreach (DeviceOutput output in deviceOutputs)
                        {
                            MinerDevice device = new MinerDevice(output.DeviceId, output.DisplayName, output.DeviceVersion, output.DriverVersion);
                            client.Machine.Devices.Add(device);
                        }
                    }
                                                                      ).Execute();
                }
            }

            while (finishedWorkCount < startedWorkCount)
            {
                Thread.Sleep(30);
            }
        }
        /// <summary>
        ///
        /// </summary>
        private void StepThree_ConfigEthMiner()
        {
            logger.Trace("Start StepThree_ConfigEthMiner.");

            MinerDevice selectedDevice = (cBxTargetDeviceEth.SelectedIndex >= 0) ? displayedDeviceList.ElementAt(cBxTargetDeviceEth.SelectedIndex) : null;

            if (selectedDevice == null)
            {
                MessageBox.Show("请选择一个硬件设备");
                return;
            }

            string ethWalletAddress = txtWalletAddressEth.Text;

            ethWalletAddress = ethWalletAddress.Trim();

            if (string.IsNullOrWhiteSpace(ethWalletAddress))
            {
                MessageBox.Show("请输入钱包地址");
                return;
            }

            if (!ethWalletAddress.StartsWith("0x"))
            {
                MessageBox.Show("钱包必须是以0x开头的32位字符串");
                return;
            }

            if (cBxTargetEthPool.SelectedIndex < 0)
            {
                MessageBox.Show("请选择一个ETH矿池");
                return;
            }

            if (cBxTargetEthPoolHost.SelectedIndex < 0)
            {
                MessageBox.Show("请选择一个ETH矿池地址");
                return;
            }

            EthConfig ethConfig = new EthConfig();

            ethConfig.PoolIndex     = (EthConfig.PoolIndexes)cBxTargetEthPool.SelectedIndex;
            ethConfig.PoolHostIndex = cBxTargetEthPoolHost.SelectedIndex;
            ethConfig.WalletAddress = txtWalletAddressEth.Text.Trim();
            ethConfig.EmailAddress  = txtEmailAddressEth.Text;
            ethConfig.WorkerName    = txtEthWorkerName.Text;

            try
            {
                ethConfig.ValidateProperties();
            }
            catch (Exception ex)
            {
                MessageBox.Show("配置数据有误:" + ex.Message);
                logger.Error("ValidateProperties failed: " + ex.ToString());
                return;
            }

            BackgroundWork <int> .CreateWork(
                this,
                () => {
                ShowProgressIndicator("正在配置矿机", btnStepThreeNext, btnStepThreeBack);
            },
                () => {
                string commandParameters = string.Format(" -c \"{{ 'DeviceId':'{0}', 'EthPoolAddress':'{1}', 'AutoDecideInstanceId':true }}\"",
                                                         selectedDevice.DeviceId,
                                                         ethConfig.PoolFullAddress);
                OKResult exeResult = createdClient.ExecuteDaemon <OKResult>(commandParameters);
                return(0);
            },
                (taskResult) => {
                HideProgressIndicator();

                if (taskResult.HasError)
                {
                    MessageBox.Show("配置矿机出现错误:" + taskResult.Exception.Message);
                    logger.Error("ConfigureCommand failed: " + taskResult.Exception.ToString());
                    return;
                }

                // Save the currnet config into cache.
                createdClient.Device    = selectedDevice;
                createdClient.EthConfig = ethConfig;

                if (cKbWalletSaveToDefault.IsChecked ?? false)
                {
                    ManagerConfig.Current.DefaultEth = ethConfig;
                    ManagerConfig.Current.SaveToFile();
                }

                SwitchUIToStep(4);
            }
                ).Execute();
        }
        /// <summary>
        ///
        /// </summary>
        private void StepThree_ConfigXDaggerMiner()
        {
            logger.Trace("Start StepThree_ConfigXDaggerMiner.");

            MinerDevice selectedDevice = (cBxTargetDevice.SelectedIndex >= 0) ? displayedDeviceList.ElementAt(cBxTargetDevice.SelectedIndex) : null;

            if (selectedDevice == null)
            {
                MessageBox.Show("请选择一个硬件设备");
                return;
            }

            XDaggerConfig xDaggerConfig = new XDaggerConfig();

            xDaggerConfig.PoolAddress = txtXDaggerPoolAddress.Text.Trim();
            if (string.IsNullOrWhiteSpace(xDaggerConfig.PoolAddress))
            {
                MessageBox.Show("请输入矿池地址");
                return;
            }

            xDaggerConfig.WalletAddress = txtWalletAddress.Text.Trim();
            if (string.IsNullOrWhiteSpace(xDaggerConfig.WalletAddress))
            {
                MessageBox.Show("请输入钱包地址");
                return;
            }

            if (xDaggerConfig.WalletAddress.Length != 32)
            {
                MessageBox.Show("钱包必须为长度32位的字母与数字组合");
                return;
            }

            BackgroundWork <int?> .CreateWork(
                this,
                () => {
                ShowProgressIndicator("正在配置矿机", btnStepThreeNext, btnStepThreeBack);
            },
                () => {
                string commandParameters = string.Format(" -c \"{{ 'DeviceId':'{0}', 'XDaggerWallet':'{1}', 'XDaggerPoolAddress':'{2}', 'AutoDecideInstanceId':true }}\"",
                                                         selectedDevice.DeviceId,
                                                         xDaggerConfig.WalletAddress,
                                                         xDaggerConfig.PoolAddress);

                ConfigureOutput exeResult = createdClient.ExecuteDaemon <ConfigureOutput>(commandParameters);

                logger.Trace("ConfigureCommand finished with InstanceId: " + exeResult.InstanceId);
                return(exeResult.InstanceId);
            },
                (taskResult) => {
                HideProgressIndicator();

                if (taskResult.HasError)
                {
                    MessageBox.Show("配置矿机出现错误:" + taskResult.Exception.Message);
                    logger.Error("ConfigureCommand failed: " + taskResult.Exception.ToString());
                    return;
                }

                int?instanceId = taskResult.Result;
                if (instanceId == null)
                {
                    MessageBox.Show("配置矿机出现错误,未返回InstanceId.");
                    logger.Error("配置矿机出现错误,未返回InstanceId.");
                    return;
                }

                createdClient.InstanceId = instanceId.Value;

                // Save the currnet config into cache.
                createdClient.Device        = selectedDevice;
                createdClient.XDaggerConfig = xDaggerConfig;

                if (cKbWalletSaveToDefault.IsChecked ?? false)
                {
                    ManagerConfig.Current.DefaultXDagger = xDaggerConfig;
                    ManagerConfig.Current.SaveToFile();
                }

                SwitchUIToStep(4);
            }
                ).Execute();
        }
        private void StepThree_RetrieveDeviceList()
        {
            logger.Trace("Start StepThree_RetrieveDeviceList.");

            txtWalletAddress.Text      = ManagerConfig.Current.DefaultXDagger.WalletAddress;
            txtXDaggerPoolAddress.Text = ManagerConfig.Current.DefaultXDagger.PoolAddress;
            txtWalletAddressEth.Text   = ManagerConfig.Current.DefaultEth.WalletAddress;
            txtEmailAddressEth.Text    = ManagerConfig.Current.DefaultEth.EmailAddress;
            txtEthWorkerName.Text      = ManagerConfig.Current.DefaultEth.WorkerName;
            if (ManagerConfig.Current.DefaultEth.PoolIndex != null)
            {
                cBxTargetEthPool.SelectedIndex = ManagerConfig.Current.DefaultEth.PoolIndex.GetHashCode();
            }
            if (ManagerConfig.Current.DefaultEth.PoolHostIndex != null)
            {
                cBxTargetEthPoolHost.SelectedIndex = ManagerConfig.Current.DefaultEth.PoolHostIndex.Value;
            }

            MinerMachine existingMachine = ManagerInfo.Current.Machines.FirstOrDefault(m => m.FullName.Equals(createdClient.MachineFullName));

            if (existingMachine != null && existingMachine.Devices != null && existingMachine.Devices.Count > 0)
            {
                // This machine has been queried before and the devices are saved in the ManagerInfo cache, read it
                displayedDeviceList = existingMachine.Devices;
                cBxTargetDevice.Items.Clear();
                cBxTargetDeviceEth.Items.Clear();
                logger.Trace("Got Devices from ManagerInfo cache. Count: " + displayedDeviceList.Count);
                foreach (MinerDevice device in displayedDeviceList)
                {
                    cBxTargetDevice.Items.Add(device.DisplayName);
                    cBxTargetDeviceEth.Items.Add(device.DisplayName);
                }
            }
            else
            {
                // Didn't find the machine in cache, use Executor to retrieve it
                TargetMachineExecutor executor = TargetMachineExecutor.GetExecutor(createdClient.Machine);
                string daemonFullPath          = IO.Path.Combine(createdClient.BinaryPath, WinMinerReleaseBinary.DaemonExecutionFileName);

                BackgroundWork <List <DeviceOutput> > .CreateWork(
                    this,
                    () =>
                {
                    ShowProgressIndicator("正在获取硬件信息", btnStepThreeNext, btnStepThreeBack);
                },
                    () =>
                {
                    return(executor.ExecuteCommandAndThrow <List <DeviceOutput> >(daemonFullPath, "-l"));
                },
                    (taskResult) =>
                {
                    HideProgressIndicator();
                    if (taskResult.HasError)
                    {
                        MessageBox.Show("查询系统硬件信息错误:" + taskResult.Exception.Message);
                        logger.Error("ExecuteCommand failed: " + taskResult.Exception.ToString());
                        return;
                    }
                    List <DeviceOutput> devices = taskResult.Result;

                    if (devices == null || devices.Count == 0)
                    {
                        MessageBox.Show("没有找到任何满足条件的硬件,请检查目标机器配置");
                        logger.Warning("没有找到任何满足条件的硬件,请检查目标机器配置");
                        return;
                    }

                    cBxTargetDevice.Items.Clear();
                    cBxTargetDeviceEth.Items.Clear();
                    logger.Trace("Got Devices count: " + devices.Count);
                    foreach (DeviceOutput deviceOut in devices)
                    {
                        MinerDevice device = new MinerDevice(deviceOut.DeviceId, deviceOut.DisplayName, deviceOut.DeviceVersion, deviceOut.DriverVersion);
                        displayedDeviceList.Add(device);
                        cBxTargetDevice.Items.Add(device.DisplayName);
                        cBxTargetDeviceEth.Items.Add(device.DisplayName);

                        createdClient.Machine.Devices.Add(device);
                    }
                }
                    ).Execute();
            }
        }
Esempio n. 6
0
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="miner"></param>
 /// <param name="resource"></param>
 internal MinerEntry(IMiner miner, MinerDevice resource)
 {
     Miner = miner;
     Resource = resource;
 }