public static IRatesComunication _ratesComunication = null; // for now should only have one of these

        public static void ClearRatesAll()
        {
            // Quickfix
            MiningStats.ClearApiDataGroups();

            _ratesComunication?.ClearRatesAll();
        }
        public static async Task MinerStatsCheck()
        {
            await _semaphore.WaitAsync();

            try
            {
                foreach (var m in _runningMiners.Values)
                {
                    // skip if not running or if await already in progress
                    if (!m.IsRunning || m.IsUpdatingApi)
                    {
                        continue;
                    }
                    var ad = m.GetSummaryAsync();
                }
                // Update GUI
                ApplicationStateManager.RefreshRates();
                // now we shoud have new global/total rate display it
                var kwhPriceInBtc = ExchangeRateApi.GetKwhPriceInBtc();
                var profitInBTC   = MiningStats.GetProfit(kwhPriceInBtc);
                ApplicationStateManager.DisplayTotalRate(profitInBTC);
            }
            catch (Exception e)
            {
                Logger.Error(Tag, $"Error occured while getting mining stats: {e.Message}");
            }
            finally
            {
                _semaphore.Release();
            }
            // TODO put this somewhere else maybe
            await RestartStagnatedMiners();
        }
Esempio n. 3
0
 public void Stop()
 {
     // TODO thing about this case, closing opening on switching
     // EthlargementIntegratedPlugin.Instance.Stop(_miningPairs);
     MinerApiWatchdog.RemoveGroup(GroupKey);
     MiningStats.RemoveGroup(MiningPairs.Select(pair => pair.Device.UUID), _plugin.PluginUUID);
     IsRunning = false;
     _miner.StopMining();
     //if (_miner is IDisposable disposableMiner)
     //{
     //    disposableMiner.Dispose();
     //}
 }
Esempio n. 4
0
        private static void SendMinerStatus(bool sendDeviceNames)
        {
            var devices   = AvailableDevices.Devices;
            var rigStatus = ApplicationStateManager.CalcRigStatusString();
            var paramList = new List <JToken>
            {
                rigStatus
            };

            var deviceList = new JArray();

            foreach (var device in devices)
            {
                try
                {
                    var array = new JArray
                    {
                        sendDeviceNames?device.Name : "",
                         device.B64Uuid // TODO
                    };
                    var status = DeviceReportStatus(device.DeviceType, device.State);
                    array.Add(status);

                    array.Add((int)Math.Round(device.Load));

                    var speedsJson = new JArray();
                    var speeds     = MiningStats.GetSpeedForDevice(device.Uuid);
                    if (speeds != null && device.State == DeviceState.Mining)
                    {
                        foreach (var kvp in speeds)
                        {
                            speedsJson.Add(new JArray((int)kvp.type, kvp.speed));
                        }
                    }
                    array.Add(speedsJson);

                    // Hardware monitoring
                    array.Add((int)Math.Round(device.Temp));
                    array.Add(device.FanSpeed);
                    array.Add((int)Math.Round(device.PowerUsage));

                    // Power mode
                    array.Add((int)device.TDPSimple);

                    // Intensity mode
                    array.Add(0);

                    deviceList.Add(array);
                }
                catch (Exception e) {
                    NHM.Common.Logger.Error("SOCKET", e.Message);
                }
            }

            paramList.Add(deviceList);

            var data = new MinerStatusMessage
            {
                param = paramList
            };
            var sendData = JsonConvert.SerializeObject(data);

            // This function is run every minute and sends data every run which has two auxiliary effects
            // Keeps connection alive and attempts reconnection if internet was dropped
            _socket?.SendData(sendData);
        }
Esempio n. 5
0
        private static string CreateMinerStatusMessage(bool sendDeviceNames = false)
        {
            var devices   = AvailableDevices.Devices;
            var rigStatus = ApplicationStateManager.CalcRigStatusString();
            var paramList = new List <JToken>
            {
                rigStatus
            };

            var deviceList = new JArray();

            foreach (var device in devices)
            {
                try
                {
                    var array = new JArray
                    {
                        sendDeviceNames?device.Name : "",
                         device.B64Uuid // TODO
                    };
                    var status = DeviceReportStatus(device.DeviceType, device.State);
                    array.Add(status);

                    array.Add((int)Math.Round(device.Load));

                    var speedsJson = new JArray();
                    var speeds     = MiningStats.GetSpeedForDevice(device.Uuid);
                    if (speeds != null && device.State == DeviceState.Mining)
                    {
                        foreach (var kvp in speeds)
                        {
                            speedsJson.Add(new JArray((int)kvp.type, kvp.speed));
                        }
                    }
                    array.Add(speedsJson);

                    // Hardware monitoring
                    array.Add((int)Math.Round(device.Temp));
                    array.Add(device.FanSpeed);
                    array.Add((int)Math.Round(device.PowerUsage));

                    // Power mode
                    array.Add((int)device.TDPSimple);

                    // Intensity mode
                    array.Add(0);

                    deviceList.Add(array);
                }
                catch (Exception e)
                {
                    NHLog.Error("NHWebSocket", e.Message);
                }
            }

            paramList.Add(deviceList);

            var data = new MinerStatusMessage
            {
                param = paramList
            };
            var sendData = JsonConvert.SerializeObject(data);

            return(sendData);
        }
Esempio n. 6
0
        public async Task <ApiData> GetSummaryAsync()
        {
            var apiData = new ApiData();

            if (!IsUpdatingApi)
            {
                IsUpdatingApi = true;
                await _apiSemaphore.WaitAsync();

                try
                {
                    apiData = await _miner.GetMinerStatsDataAsync();
                }
                catch (Exception e)
                {
                    Logger.Error(MinerTag(), $"GetSummaryAsync error: {e.Message}");
                }
                finally
                {
                    IsUpdatingApi = false;
                    _apiSemaphore.Release();
                }
            }

            UpdateApiTimestamp(apiData);

            // TODO workaround plugins should return this info
            // create empty stub if it is null
            if (apiData == null)
            {
                Logger.Debug(MinerTag(), "GetSummary returned null... Will create ZERO fallback");
                apiData = new ApiData();
            }
            if (apiData.AlgorithmSpeedsPerDevice == null)
            {
                apiData = new ApiData();
                var perDevicePowerDict  = new Dictionary <string, int>();
                var perDeviceSpeedsDict = new Dictionary <string, IReadOnlyList <AlgorithmTypeSpeedPair> >();
                var perDeviceSpeeds     = MiningPairs.Select(pair => (pair.Device.UUID, pair.Algorithm.IDs.Select(type => new AlgorithmTypeSpeedPair(type, 0d))));
                foreach (var kvp in perDeviceSpeeds)
                {
                    var uuid = kvp.Item1; // kvp.UUID compiler doesn't recognize ValueTypes lib???
                    perDeviceSpeedsDict[uuid] = kvp.Item2.ToList();
                    perDevicePowerDict[uuid]  = 0;
                }
                apiData.AlgorithmSpeedsPerDevice = perDeviceSpeedsDict;
                apiData.PowerUsagePerDevice      = perDevicePowerDict;
                apiData.PowerUsageTotal          = 0;
                apiData.AlgorithmSpeedsTotal     = perDeviceSpeedsDict.First().Value;
            }
            else if (apiData.AlgorithmSpeedsPerDevice != null && apiData.PowerUsagePerDevice.Count == 0)
            {
                var perDevicePowerDict = new Dictionary <string, int>();
                foreach (var kvp in MiningPairs)
                {
                    var uuid = kvp.Device.UUID;
                    perDevicePowerDict[uuid] = 0;
                }
                apiData.PowerUsagePerDevice = perDevicePowerDict;
                apiData.PowerUsageTotal     = 0;
            }

            // TODO temporary here move it outside later
            MiningStats.UpdateGroup(apiData, _plugin.PluginUUID, _plugin.Name);

            return(apiData);
        }
Esempio n. 7
0
        private MiningStats MapDTO(ClaymoreMessageDTO dto)
        {
            var entity = new MiningStats();

            entity.MinerVersion  = dto.Result[0];
            entity.UptimeMinutes = int.Parse(dto.Result[1]);

            var primaryCoinHashrateAndShares = dto.Result[2].Split(";");
            var primaryHashratesPerGPU       = dto.Result[3].Split(";");

            var secondaryCoinHashrateAndShares = dto.Result[4].Split(";");
            var secondaryHashratesPerGPU       = dto.Result[5].Split(";");

            var temperaturesAndFanSpeedsPerGPU = dto.Result[6].Split(";");
            var poolAddresses       = dto.Result[7].Split(";");
            var invalidsAndSwitches = dto.Result[8].Split(";");

            var primaryCoin = new CoinStats();

            primaryCoin.PoolAddress    = poolAddresses[0];
            primaryCoin.Hashrate       = long.Parse(primaryCoinHashrateAndShares[0]);
            primaryCoin.Shares         = int.Parse(primaryCoinHashrateAndShares[1]);
            primaryCoin.RejectedShares = int.Parse(primaryCoinHashrateAndShares[2]);
            primaryCoin.InvalidShares  = int.Parse(invalidsAndSwitches[0]);
            primaryCoin.PoolSwitches   = int.Parse(invalidsAndSwitches[1]);
            entity.PrimaryCoin         = primaryCoin;
            entity.SecondaryCoin       = null;

            if (poolAddresses.Length == 2)
            {
                var secondaryCoin = new CoinStats();
                secondaryCoin.PoolAddress    = poolAddresses[1];
                secondaryCoin.Hashrate       = long.Parse(secondaryCoinHashrateAndShares[0]);
                secondaryCoin.Shares         = int.Parse(secondaryCoinHashrateAndShares[1]);
                secondaryCoin.RejectedShares = int.Parse(secondaryCoinHashrateAndShares[2]);
                secondaryCoin.InvalidShares  = int.Parse(invalidsAndSwitches[2]);
                secondaryCoin.PoolSwitches   = int.Parse(invalidsAndSwitches[3]);
                entity.SecondaryCoin         = secondaryCoin;
            }

            var gpuList = new List <GPUStats>();

            entity.GPUStats = gpuList;

            for (var i = 0; i < primaryHashratesPerGPU.Length; i++)
            {
                var gpuStat              = new GPUStats();
                var primaryHashrate      = long.Parse(primaryHashratesPerGPU[i]);
                var rawSecondaryHashrate = secondaryHashratesPerGPU[i];
                var secondaryHashrate    = rawSecondaryHashrate == "off" ? (long?)null : long.Parse(rawSecondaryHashrate);
                var temperature          = int.Parse(temperaturesAndFanSpeedsPerGPU[i * 2]);
                var fanspeed             = int.Parse(temperaturesAndFanSpeedsPerGPU[i * 2 + 1]);

                gpuStat.PrimaryHashrate   = primaryHashrate;
                gpuStat.SecondaryHashrate = secondaryHashrate;
                gpuStat.Temperature       = temperature;
                gpuStat.FanSpeed          = fanspeed;

                gpuList.Add(gpuStat);
            }

            return(entity);
        }