public static bool FindParameter(int _commandNum) { ClearParameters(); if (_commandNum < 0 || _commandNum >= commandName.Count) { return(false); } //collect parameters var _stopSearch = commandDbLineNum[_commandNum] + 1; while (_stopSearch < _commandDataBase.Rows.Count && _commandDataBase.Rows[_stopSearch][CSVColumns.CommandName].ToString() == "") { _stopSearch++; } for (var i = commandDbLineNum[_commandNum] + 1; i < _stopSearch; i++) { if (_commandDataBase.Rows[i][CSVColumns.ParameterName].ToString() != "") { paramDbLineNum.Add(i); paramName.Add(_commandDataBase.Rows[i][CSVColumns.ParameterName].ToString()); paramDesc.Add(_commandDataBase.Rows[i][CSVColumns.Description].ToString()); paramType.Add(_commandDataBase.Rows[i][CSVColumns.ParameterType].ToString()); } } errors = false; //Error in parameter found //process each parameter for (var parameter = 0; parameter < paramDbLineNum.Count; parameter++) { paramPosition.Add(commandPosition[_commandNum] + ResultLength(_commandNum)); bitName.Add(new List <string>()); bitValue.Add(new List <string>()); bitDescription.Add(new List <string>()); //collect predefined RAW values var predefinedParamsRaw = new List <string>(); var j = paramDbLineNum[parameter] + 1; while (j < _commandDataBase.Rows.Count && _commandDataBase.Rows[j][CSVColumns.ParameterValue].ToString() != "") { predefinedParamsRaw.Add(_commandDataBase.Rows[j][CSVColumns.ParameterValue].ToString()); j++; } //Calculate predefined params var predefinedParamsVal = new List <int>(); foreach (var expresion in predefinedParamsRaw) { var val = 0; //select formula basing on parameter value "?k=1:n+n1 ?k-2:n*n1" if (expresion.StartsWith("?")) { var tmpstr = expresion.Trim().Replace("\r", "").Replace("\n", "").Split('?'); foreach (var str in tmpstr) { if (str != "") { var equation = str.Substring(0, str.IndexOf(':')); //calculate equation if needed for (var i2 = 0; i2 < paramName.Count - 1; i2++) //insert all parameters before current into equation { equation = equation.Replace(paramName[i2], paramValue[i2]); equation = equation.Replace('=', '-'); } if (Accessory.Evaluate(equation) == 0) { var equation2 = str.Substring(str.IndexOf(':') + 1).Trim(); for (var i3 = 0; i3 < paramName.Count - 1; i3++) { equation2 = equation2.Replace(paramName[i3], paramValue[i3]); } try { val = (int)Accessory.Evaluate(equation2); } catch { } } } } } else if (expresion.StartsWith("@")) { var equation = expresion.Substring(1); //insert all parameters before current into equation for (var i2 = 0; i2 < paramName.Count - 1; i2++) { equation = equation.Replace(paramName[i2], paramValue[i2]); } val = (int)Accessory.Evaluate(equation); // = str.Substring(str.IndexOf(':') + 1); } else { if (!int.TryParse(expresion.Trim(), out val)) { val = 0; } } predefinedParamsVal.Add(val); } //get parameter from text var tmpStrLength = 0; var predefinedFound = false; //Matching predefined parameter found and it's number is in "predefinedParameterMatched" var errMessage = ""; byte l = 0, h = 0; var predefinedParameterMatched = 0; var _prmType = _commandDataBase.Rows[paramDbLineNum[parameter]][CSVColumns.ParameterType].ToString() .ToLower(); if (_prmType == DataTypes.Byte) { if (paramPosition[parameter] + 1 <= sourceData.Count) { paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], 1)); l = paramRAWValue[parameter].ToArray()[0]; } else { errors = true; errMessage = "!!!ERR: Out of data!!!"; paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], sourceData.Count - paramPosition[parameter])); } paramValue.Add(l.ToString()); } else if (_prmType == DataTypes.Bitfield) { if (paramPosition[parameter] + 1 <= sourceData.Count) { paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], 1)); l = paramRAWValue[parameter].ToArray()[0]; for (byte i2 = 0; i2 < 8; i2++) { bitName[parameter].Add("bit" + i2); bitValue[parameter].Add(Accessory.GetBit(l, i2).ToString()); bitDescription[parameter] .Add(_commandDataBase.Rows[paramDbLineNum[parameter] + i2 + 1][CSVColumns.Description] .ToString()); } } else { errors = true; errMessage = "!!!ERR: Out of data!!!"; paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], sourceData.Count - paramPosition[parameter])); } paramValue.Add(l.ToString()); } else if (_prmType == DataTypes.Word) { if (paramPosition[parameter] + 2 <= sourceData.Count) { paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], 2)); l = paramRAWValue[parameter].GetRange(0, 1)[0]; h = paramRAWValue[parameter].GetRange(1, 1)[0]; } else { errors = true; errMessage = "!!!ERR: Out of data!!!"; paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], sourceData.Count - paramPosition[parameter])); } paramValue.Add((h * 256 + l).ToString()); } else if (_prmType == DataTypes.Rword) { if (paramPosition[parameter] + 2 <= sourceData.Count) { paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], 2)); h = paramRAWValue[parameter].GetRange(0, 1)[0]; l = paramRAWValue[parameter].GetRange(1, 1)[0]; } else { errors = true; errMessage = "!!!ERR: Out of data!!!"; paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], sourceData.Count - paramPosition[parameter])); } paramValue.Add((h * 256 + l).ToString()); } else if (_prmType == DataTypes.Textstring || _prmType == DataTypes.Decstring || _prmType == DataTypes.Hexstring || _prmType == DataTypes.Binarystring) { if (predefinedParamsVal.Count > 0) { //look for the end of the string (predefined byte) while (predefinedFound == false && paramPosition[parameter] + tmpStrLength <= sourceData.Count) { //check for each predefined value for (var i1 = 0; i1 < predefinedParamsVal.Count; i1++) { if (paramPosition[parameter] + tmpStrLength + 1 <= sourceData.Count) { if (sourceData[paramPosition[parameter] + tmpStrLength] == predefinedParamsVal[i1]) { predefinedFound = true; predefinedParameterMatched = i1; paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], tmpStrLength)); } } else { errors = true; errMessage = "!!!ERR: Out of data!!!"; } } tmpStrLength++; } if (tmpStrLength < 1) { errors = true; errMessage = "!!!ERR: Out of data!!!"; } if (errors) { paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], sourceData.Count - paramPosition[parameter])); } if (paramRAWValue[parameter].Count != 0) { if ((_prmType == DataTypes.Textstring || _prmType == DataTypes.Decstring || _prmType == DataTypes.Hexstring) && Accessory.PrintableByteArray(paramRAWValue[parameter].ToArray())) { paramValue.Add(Encoding.GetEncoding(Settings.Default.CodePage) .GetString(paramRAWValue[parameter].ToArray())); } else { paramValue.Add("[" + Accessory.ConvertByteArrayToHex(paramRAWValue[parameter].ToArray()) + "]"); } } else { paramValue.Add(""); } } else { errors = true; errMessage = "!!!ERR: There must be predefined values!!!"; paramRAWValue.Add(null); paramValue.Add(""); } } else if (_prmType == DataTypes.Textarray || _prmType == DataTypes.Decarray || _prmType == DataTypes.Hexarray || _prmType == DataTypes.Binaryarray) { if (predefinedParamsVal.Count == 1) { predefinedFound = true; predefinedParameterMatched = 0; if (paramPosition[parameter] + predefinedParamsVal[0] <= sourceData.Count) { paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], (byte)predefinedParamsVal[0])); } else { errors = true; errMessage = "!!!ERR: Out of data bound!!!"; paramRAWValue.Add(sourceData.GetRange(paramPosition[parameter], sourceData.Count - paramPosition[parameter])); } if (paramRAWValue[parameter].Count != 0) { if ((_prmType == DataTypes.Textarray || _prmType == DataTypes.Decarray || _prmType == DataTypes.Hexarray) && Accessory.PrintableByteArray(paramRAWValue[parameter].ToArray())) { paramValue.Add(Encoding.GetEncoding(Settings.Default.CodePage) .GetString(paramRAWValue[parameter].ToArray())); } else { paramValue.Add("[" + Accessory.ConvertByteArrayToHex(paramRAWValue[parameter].ToArray()) + "]"); } } else { paramValue.Add(""); } } else { errors = true; errMessage = "!!!ERR: There must be only one predefined value!!!"; paramRAWValue.Add(null); paramValue.Add(""); } } else { predefinedFound = true; errors = true; errMessage = "!!!ERR: Incorrect parameter type!!!"; paramRAWValue.Add(new List <byte>()); paramValue.Add(""); } if (errors) { paramDesc[parameter] += errMessage + "\r\n"; } //compare parameter value with predefined values to get proper description if (predefinedFound == false && !errors) { for (var i1 = 0; i1 < predefinedParamsVal.Count; i1++) { if (paramValue[parameter] == predefinedParamsVal[i1].ToString()) { predefinedFound = true; predefinedParameterMatched = i1; i1 = predefinedParamsVal.Count; } } if (predefinedParamsVal.Count > 0 && predefinedFound == false) { errors = true; //if no parameters match predefined } } //get description for predefined parameter //if description is within current command parameters group if (paramDbLineNum[parameter] + predefinedParameterMatched + 1 <= commandDbLineNum[_commandNum] + commandDbHeight[_commandNum] && predefinedFound) { paramDesc[parameter] += _commandDataBase.Rows[paramDbLineNum[parameter] + predefinedParameterMatched + 1][ CSVColumns.Description].ToString(); } } ResultLength(_commandNum); return(!errors); }