Ejemplo n.º 1
0
 public MinerOption(MinerOptionType iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType, string iSeparator)
 {
     this.Type      = iType;
     this.ShortName = iShortName;
     this.LongName  = iLongName;
     this.Default   = iDefault;
     this.FlagType  = iFlagType;
     this.Separator = iSeparator;
 }
        private static string Parse(List <MiningPair> MiningPairs, List <MinerOption> options, bool useIfDefaults = true, List <MinerOption> ignoreLogOpions = null)
        {
            const string           IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings";
            List <MinerOptionType> optionsOrder = new List <MinerOptionType>();
            Dictionary <string, Dictionary <MinerOptionType, string> > cdevOptions = new Dictionary <string, Dictionary <MinerOptionType, string> >();
            Dictionary <MinerOptionType, bool> isOptionDefaults = new Dictionary <MinerOptionType, bool>();
            Dictionary <MinerOptionType, bool> isOptionExist    = new Dictionary <MinerOptionType, bool>();

            // init devs options, and defaults
            foreach (var pair in MiningPairs)
            {
                var defaults = new Dictionary <MinerOptionType, string>();
                foreach (var option in options)
                {
                    defaults[option.Type] = option.Default;
                }
                cdevOptions[pair.Device.UUID] = defaults;
            }
            // init order and params flags, and params list
            foreach (var option in options)
            {
                MinerOptionType optionType = option.Type;
                optionsOrder.Add(optionType);

                isOptionDefaults[optionType] = true;
                isOptionExist[optionType]    = false;
            }
            // parse
            foreach (var pair in MiningPairs)
            {
                LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", pair.CurrentExtraLaunchParameters, pair.Device.UUID));
                var parameters = pair.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' ');

                IgnorePrintLogInit();


                MinerOptionType currentFlag = MinerOptionType_NONE;
                foreach (var param in parameters)
                {
                    if (param.Equals(""))   // skip
                    {
                        continue;
                    }
                    else if (currentFlag == MinerOptionType_NONE)
                    {
                        bool isIngored = true;
                        foreach (var option in options)
                        {
                            if (param.Equals(option.ShortName) || param.Equals(option.LongName))
                            {
                                isIngored = false;
                                if (option.FlagType == MinerOptionFlagType.Uni)
                                {
                                    isOptionExist[option.Type] = true;
                                    cdevOptions[pair.Device.UUID][option.Type] = "notNull"; // if Uni param is null it is not present
                                }
                                else                                                        // Sinlge and Multi param
                                {
                                    currentFlag = option.Type;
                                }
                            }
                        }
                        if (isIngored)   // ignored
                        {
                            IgnorePrintLog(param, IGNORE_PARAM, ignoreLogOpions);
                        }
                    }
                    else if (currentFlag != MinerOptionType_NONE)
                    {
                        isOptionExist[currentFlag] = true;
                        cdevOptions[pair.Device.UUID][currentFlag] = param;
                        currentFlag = MinerOptionType_NONE;
                    }
                    else     // problem
                    {
                        IgnorePrintLog(param, IGNORE_PARAM, ignoreLogOpions);
                    }
                }
            }

            string retVal = "";

            // check if is all defaults
            bool isAllDefault = true;

            foreach (var pair in MiningPairs)
            {
                foreach (var option in options)
                {
                    if (option.Default != cdevOptions[pair.Device.UUID][option.Type])
                    {
                        isAllDefault = false;
                        isOptionDefaults[option.Type] = false;
                    }
                }
            }

            if (!isAllDefault || useIfDefaults)
            {
                foreach (var option in options)
                {
                    if (!isOptionDefaults[option.Type] || isOptionExist[option.Type] || useIfDefaults)   // if options all default ignore
                    {
                        if (option.FlagType == MinerOptionFlagType.Uni)
                        {
                            // uni params if one exist use or all must exist?
                            bool isOptionInUse = false;
                            foreach (var pair in MiningPairs)
                            {
                                if (cdevOptions[pair.Device.UUID][option.Type] != null)
                                {
                                    isOptionInUse = true;
                                    break;
                                }
                            }
                            if (isOptionInUse)
                            {
                                retVal += String.Format(" {0}", option.LongName);
                            }
                        }
                        else if (option.FlagType == MinerOptionFlagType.MultiParam)
                        {
                            List <string> values = new List <string>();
                            foreach (var pair in MiningPairs)
                            {
                                values.Add(cdevOptions[pair.Device.UUID][option.Type]);
                            }
                            string MASK = " {0} {1}";
                            if (option.LongName.Contains("="))
                            {
                                MASK = " {0}{1}";
                            }
                            retVal += String.Format(MASK, option.LongName, String.Join(option.Separator, values));
                        }
                        else if (option.FlagType == MinerOptionFlagType.SingleParam)
                        {
                            HashSet <string> values = new HashSet <string>();
                            foreach (var pair in MiningPairs)
                            {
                                values.Add(cdevOptions[pair.Device.UUID][option.Type]);
                            }
                            string setValue = option.Default;
                            if (values.Count >= 1)
                            {
                                // Always take first
                                setValue = values.First();
                            }
                            string MASK = " {0} {1}";
                            if (option.LongName.Contains("="))
                            {
                                MASK = " {0}{1}";
                            }
                            retVal += String.Format(MASK, option.LongName, setValue);
                        }
                        else if (option.FlagType == MinerOptionFlagType.DuplicateMultiParam)
                        {
                            List <string> values = new List <string>();
                            string        MASK   = " {0} {1}";
                            foreach (var pair in MiningPairs)
                            {
                                values.Add(String.Format(MASK, option.LongName, cdevOptions[pair.Device.UUID][option.Type]));
                            }
                            retVal += " " + String.Join(" ", values);
                        }
                    }
                }
            }

            LogParser(String.Format("Final extra launch params parse \"{0}\"", retVal));

            return(retVal);
        }
        private static string Parse(List <ComputeDevice> CDevs, List <MinerOption> options, bool useIfDefaults = false, List <MinerOption> ignoreLogOpions = null)
        {
            const string           IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings";
            List <MinerOptionType> optionsOrder = new List <MinerOptionType>();
            Dictionary <MinerOptionType, string> paramsFlags = new Dictionary <MinerOptionType, string>();
            Dictionary <string, Dictionary <MinerOptionType, string> > cdevOptions = new Dictionary <string, Dictionary <MinerOptionType, string> >();
            Dictionary <MinerOptionType, bool> isOptionDefaults = new Dictionary <MinerOptionType, bool>();
            Dictionary <MinerOptionType, bool> isOptionExist    = new Dictionary <MinerOptionType, bool>();

            // init devs options, and defaults
            foreach (var cDev in CDevs)
            {
                var defaults = new Dictionary <MinerOptionType, string>();
                foreach (var option in options)
                {
                    defaults.Add(option.Type, option.Default);
                }
                cdevOptions.Add(cDev.UUID, defaults);
            }
            // init order and params flags, and params list
            foreach (var option in options)
            {
                MinerOptionType optionType = option.Type;
                optionsOrder.Add(optionType);
                paramsFlags.Add(optionType, option.LongName);
                isOptionDefaults.Add(option.Type, true);
                isOptionExist.Add(option.Type, false);
            }
            // parse
            foreach (var cDev in CDevs)
            {
                LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.CurrentExtraLaunchParameters, cDev.UUID));
                var parameters = cDev.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' ');

                bool prevHasIgnoreParam = false;
                int  logCount           = 0;
                Func <string, string> ignorePrintLog = (string param) => {
                    // AMD temp controll is separated and logs stuff that is ignored
                    bool printIgnore = true;
                    if (ignoreLogOpions != null)
                    {
                        foreach (var ignoreOption in ignoreLogOpions)
                        {
                            if (param.Equals(ignoreOption.ShortName) || param.Equals(ignoreOption.LongName))
                            {
                                printIgnore        = false;
                                prevHasIgnoreParam = true;
                                logCount           = 0;
                                break;
                            }
                        }
                    }
                    if (printIgnore && !prevHasIgnoreParam)
                    {
                        LogParser(String.Format(IGNORE_PARAM, param));
                    }
                    if (logCount == 1)
                    {
                        prevHasIgnoreParam = false;
                        logCount           = 0;
                    }
                    ++logCount;
                    return(""); // fake crappy C# crap
                };

                MinerOptionType currentFlag = MinerOptionType.NONE;
                foreach (var param in parameters)
                {
                    if (param.Equals(""))   // skip
                    {
                        continue;
                    }
                    else if (currentFlag == MinerOptionType.NONE)
                    {
                        bool isIngored = true;
                        foreach (var option in options)
                        {
                            if (param.Equals(option.ShortName) || param.Equals(option.LongName))
                            {
                                isIngored = false;
                                if (option.FlagType == MinerOptionFlagType.Uni)
                                {
                                    isOptionExist[option.Type]          = true;
                                    cdevOptions[cDev.UUID][option.Type] = "notNull"; // if Uni param is null it is not present
                                }
                                else                                                 // Sinlge and Multi param
                                {
                                    currentFlag = option.Type;
                                }
                            }
                        }
                        if (isIngored)   // ignored
                        {
                            ignorePrintLog(param);
                        }
                    }
                    else if (currentFlag != MinerOptionType.NONE)
                    {
                        isOptionExist[currentFlag]          = true;
                        cdevOptions[cDev.UUID][currentFlag] = param;
                        currentFlag = MinerOptionType.NONE;
                    }
                    else     // problem
                    {
                        ignorePrintLog(param);
                    }
                }
            }

            string retVal = "";

            // check if is all defaults
            bool isAllDefault = true;

            foreach (var cDev in CDevs)
            {
                foreach (var option in options)
                {
                    if (option.Default != cdevOptions[cDev.UUID][option.Type])
                    {
                        isAllDefault = false;
                        isOptionDefaults[option.Type] = false;
                    }
                }
            }

            if (!isAllDefault || useIfDefaults)
            {
                foreach (var option in options)
                {
                    if (!isOptionDefaults[option.Type] || isOptionExist[option.Type] || useIfDefaults)   // if options all default ignore
                    {
                        if (option.FlagType == MinerOptionFlagType.Uni)
                        {
                            // uni params if one exist use or all must exist?
                            bool isOptionInUse = false;
                            foreach (var cDev in CDevs)
                            {
                                if (cdevOptions[cDev.UUID][option.Type] != null)
                                {
                                    isOptionInUse = true;
                                    break;
                                }
                            }
                            if (isOptionInUse)
                            {
                                retVal += String.Format(" {0}", option.LongName);
                            }
                        }
                        else if (option.FlagType == MinerOptionFlagType.MultiParam)
                        {
                            List <string> values = new List <string>();
                            foreach (var cDev in CDevs)
                            {
                                values.Add(cdevOptions[cDev.UUID][option.Type]);
                            }
                            string MASK = " {0} {1}";
                            if (option.LongName.Contains('='))
                            {
                                MASK = " {0}{1}";
                            }
                            retVal += String.Format(MASK, option.LongName, string.Join(option.Separator, values));
                        }
                        else if (option.FlagType == MinerOptionFlagType.SingleParam)
                        {
                            HashSet <string> values = new HashSet <string>();
                            foreach (var cDev in CDevs)
                            {
                                values.Add(cdevOptions[cDev.UUID][option.Type]);
                            }
                            string setValue = option.Default;
                            if (values.Count == 1)
                            {
                                setValue = values.First();
                            }
                            string MASK = " {0} {1}";
                            if (option.LongName.Contains('='))
                            {
                                MASK = " {0}{1}";
                            }
                            retVal += String.Format(MASK, option.LongName, setValue);
                        }
                    }
                }
            }

            LogParser(String.Format("Final extra launch params parse \"{0}\"", retVal));

            return(retVal);
        }