Example #1
0
 public void StopAllMinersNonProfitable()
 {
     if (_runningGroupMiners != null) {
         foreach (var groupMiner in _runningGroupMiners.Values) {
             groupMiner.End();
         }
         _runningGroupMiners = new Dictionary<string, GroupMiner>();
     }
     if (_ethminerNVIDIAPaused != null) {
         _ethminerNVIDIAPaused.End();
         _ethminerNVIDIAPaused = null;
     }
     if (_ethminerAMDPaused != null) {
         _ethminerAMDPaused.End();
         _ethminerAMDPaused = null;
     }
     if (_mainFormRatesComunication != null) {
         _mainFormRatesComunication.ClearRates(-1);
     }
 }
Example #2
0
        public void SwichMostProfitableGroupUpMethod(Dictionary<AlgorithmType, NiceHashSMA> NiceHashData, bool log = true)
        {
            #if (SWITCH_TESTING)
            MiningDevice.SetNextTest();
            #endif
            List<MiningPair> profitableDevices = new List<MiningPair>();
            double CurrentProfit = 0.0d;
            foreach (var device in _miningDevices) {
                // calculate profits
                device.CalculateProfits(NiceHashData);
                // check if device has profitable algo
                if (device.HasProfitableAlgo()) {
                    profitableDevices.Add(device.GetMostProfitablePair());
                    CurrentProfit += device.GetCurrentMostProfitValue;
                }
            }
            // print profit statuses
            if (log) {
                StringBuilder stringBuilderFull = new StringBuilder();
                stringBuilderFull.AppendLine("Current device profits:");
                foreach (var device in _miningDevices) {
                    StringBuilder stringBuilderDevice = new StringBuilder();
                    stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", device.Device.UUID, device.Device.GetFullName()));
                    foreach (var algo in device.Algorithms) {
                        stringBuilderDevice.AppendLine(String.Format("\t\tPROFIT = {0}\t(SPEED = {1}\t\t| NHSMA = {2})\t[{3}]",
                            algo.Value.CurrentProfit.ToString(DOUBLE_FORMAT), // Profit
                            algo.Value.AvaragedSpeed, // Speed
                            algo.Value.CurNhmSMADataVal, // NiceHashData
                            AlgorithmNiceHashNames.GetName(algo.Key) // Name
                        ));
                    }
                    // most profitable
                    stringBuilderDevice.AppendLine(String.Format("\t\tMOST PROFITABLE ALGO: {0}, PROFIT: {1}",
                        AlgorithmNiceHashNames.GetName(device.MostProfitableKey),
                        device.GetCurrentMostProfitValue.ToString(DOUBLE_FORMAT)));
                    stringBuilderFull.AppendLine(stringBuilderDevice.ToString());
                }
                Helpers.ConsolePrint(TAG, stringBuilderFull.ToString());
            }

            // check if should mine
            // Only check if profitable inside this method when getting SMA data, cheching during mining is not reliable
            if (CheckIfShouldMine(CurrentProfit, log) == false) {
                return;
            }

            Dictionary<string, List<MiningPair>> newGroupedMiningPairs = new Dictionary<string,List<MiningPair>>();
            // group devices with same supported algorithms
            {
                var currentGroupedDevices = new List<GroupedDevices>();
                for (int first = 0; first < profitableDevices.Count; ++first) {
                    var firstDev = profitableDevices[first].Device;
                    // check if is in group
                    bool isInGroup = false;
                    foreach (var groupedDevices in currentGroupedDevices) {
                        if (groupedDevices.Contains(firstDev.UUID)) {
                            isInGroup = true;
                            break;
                        }
                    }
                    // if device is not in any group create new group and check if other device should group
                    if (isInGroup == false) {
                        var newGroup = new GroupedDevices();
                        var miningPairs = new List<MiningPair>() { profitableDevices[first] };
                        newGroup.Add(firstDev.UUID);
                        for (int second = first + 1; second < profitableDevices.Count; ++second) {
                            // check if we should group
                            var firstPair = profitableDevices[first];
                            var secondPair = profitableDevices[second];
                            if (GroupingLogic.ShouldGroup(firstPair, secondPair)) {
                                var secondDev = profitableDevices[second].Device;
                                newGroup.Add(secondDev.UUID);
                                miningPairs.Add(profitableDevices[second]);
                            }
                        }
                        currentGroupedDevices.Add(newGroup);
                        newGroupedMiningPairs[CalcGroupedDevicesKey(newGroup)] = miningPairs;
                    }
                }
            }
            //bool IsMinerStatsCheckUpdate = false;
            {
                // check which groupMiners should be stopped and which ones should be started and which to keep running
                Dictionary<string, GroupMiner> toStopGroupMiners = new Dictionary<string, GroupMiner>();
                Dictionary<string, GroupMiner> toRunNewGroupMiners = new Dictionary<string, GroupMiner>();
                // check what to stop/update
                foreach (string runningGroupKey in _runningGroupMiners.Keys) {
                    if (newGroupedMiningPairs.ContainsKey(runningGroupKey) == false) {
                        // runningGroupKey not in new group definately needs to be stopped and removed from curently running
                        toStopGroupMiners[runningGroupKey] = _runningGroupMiners[runningGroupKey];
                    } else {
                        // runningGroupKey is contained but needs to check if mining algorithm is changed
                        var miningPairs = newGroupedMiningPairs[runningGroupKey];
                        var newAlgoType = GetMinerPairAlgorithmType(miningPairs);
                        if(newAlgoType != AlgorithmType.NONE && newAlgoType != AlgorithmType.INVALID) {
                            // if algoType valid and different from currently running update
                            if (newAlgoType != _runningGroupMiners[runningGroupKey].AlgorithmType) {
                                // remove current one and schedule to stop mining
                                toStopGroupMiners[runningGroupKey] = _runningGroupMiners[runningGroupKey];
                                // create new one TODO check if DaggerHashimoto
                                GroupMiner newGroupMiner = null;
                                if (newAlgoType == AlgorithmType.DaggerHashimoto) {
                                    if (_ethminerNVIDIAPaused != null && _ethminerNVIDIAPaused.Key == runningGroupKey) {
                                        newGroupMiner = _ethminerNVIDIAPaused;
                                    }
                                    if (_ethminerAMDPaused != null && _ethminerAMDPaused.Key == runningGroupKey) {
                                        newGroupMiner = _ethminerAMDPaused;
                                    }
                                }
                                if (newGroupMiner == null) {
                                    newGroupMiner = new GroupMiner(miningPairs, runningGroupKey);
                                }
                                toRunNewGroupMiners[runningGroupKey] = newGroupMiner;
                            }
                        }
                    }
                }
                // check brand new
                foreach (var kvp in newGroupedMiningPairs) {
                    var key = kvp.Key;
                    var miningPairs = kvp.Value;
                    if (_runningGroupMiners.ContainsKey(key) == false) {
                        GroupMiner newGroupMiner = new GroupMiner(miningPairs, key);
                        toRunNewGroupMiners[key] = newGroupMiner;
                    }
                }
                // stop old miners
                foreach (var toStop in toStopGroupMiners.Values) {
                    toStop.Stop();
                    _runningGroupMiners.Remove(toStop.Key);
                    // TODO check if daggerHashimoto and save
                    if(toStop.AlgorithmType == AlgorithmType.DaggerHashimoto) {
                        if (toStop.DeviceType == DeviceType.NVIDIA) {
                            _ethminerNVIDIAPaused = toStop;
                        } else if (toStop.DeviceType == DeviceType.AMD) {
                            _ethminerAMDPaused = toStop;
                        }
                    }
                }
                // start new miners
                foreach (var toStart in toRunNewGroupMiners.Values) {
                    toStart.Start(_miningLocation, _btcAdress, _worker);
                    _runningGroupMiners[toStart.Key] = toStart;
                }
            }

            // stats quick fix code
            //if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) {
                MinerStatsCheck(NiceHashData);
            //}
        }
Example #3
0
        public void StopAllMiners()
        {
            if (_runningGroupMiners != null) {
                foreach (var groupMiner in _runningGroupMiners.Values) {
                    groupMiner.End();
                }
                _runningGroupMiners = new Dictionary<string, GroupMiner>();
            }
            if (_ethminerNVIDIAPaused != null) {
                _ethminerNVIDIAPaused.End();
                _ethminerNVIDIAPaused = null;
            }
            if (_ethminerAMDPaused != null) {
                _ethminerAMDPaused.End();
                _ethminerAMDPaused = null;
            }
            if (_mainFormRatesComunication != null) {
                _mainFormRatesComunication.ClearRatesALL();
            }

            // restroe/enable sleep
            _preventSleepTimer.Stop();
            _internetCheckTimer.Stop();
            Helpers.AllowMonitorPowerdownAndSleep();

            // delete generated bin files
            // check for bins files
            var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", ""));
            var DONT_DELETE = "equiw200k9.bin";
            var deleteContains = "equiw200k9";
            var alwaysDeleteContains2 = "silentarmy_gpu";
            if (dirInfo != null && dirInfo.Exists) {
                foreach (FileInfo file in dirInfo.GetFiles()) {
                    if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) {
                        file.Delete();
                    }
                    if (file.Name.Contains(alwaysDeleteContains2)) {
                        file.Delete();
                    }
                }
            }
        }