// Get field value from table entry.
        // Returns null if not found.
        public object GetField(string parameterNameOrIndex, string fieldNameOrId)
        {
            if (!String.IsNullOrWhiteSpace(parameterNameOrIndex))
            {
                DeviceParameter d = Find(parameterNameOrIndex);
                if (d != null)
                {
                    switch (DeviceParameter.GetFieldId(fieldNameOrId))
                    {
                    case DeviceParameter.FieldId.IndexField:
                        return(d.ParamIndex);

                    case DeviceParameter.FieldId.CategoryField:
                        return(d.ParamCategory);

                    case DeviceParameter.FieldId.VariableKindField:
                        return(d.ParamVarKind);

                    case DeviceParameter.FieldId.SizeField:
                        return(d.ParamSize);

                    case DeviceParameter.FieldId.StorageFlagsField:
                        return(d.ParamStorageFlags);

                    case DeviceParameter.FieldId.MinValueField:
                        return(d.MinValue);

                    case DeviceParameter.FieldId.MaxValueField:
                        return(d.MaxValue);

                    case DeviceParameter.FieldId.DefaultValueField:
                        return(d.DefaultValue);

                    case DeviceParameter.FieldId.RamValueField:
                        return(d.RamValue);

                    case DeviceParameter.FieldId.EepromValueField:
                        return(d.EEPromValue);

                    case DeviceParameter.FieldId.NameField:
                        return(d.ParamName);

                    default:
                        break;
                    }
                }
            }
            return(null);
        }
        // Update a field in a table entry. Create new entry if necessary.
        // Returns null on success, otherwise error message.
        public string PutField(string parameterNameOrIndex, string fieldNameOrId, object value)
        {
            string result = null;

            if (!String.IsNullOrWhiteSpace(parameterNameOrIndex) && value != null)
            {
                DeviceParameter d     = Find(parameterNameOrIndex);
                bool            isNew = (d == null);
                if (isNew)
                {
                    d = new DeviceParameter(parameterNameOrIndex);
                }
                switch (DeviceParameter.GetFieldId(fieldNameOrId))
                {
                case DeviceParameter.FieldId.IndexField:
                    try {
                        int v = (int)value;
                        if (v >= 0)
                        {
                            if (!isNew && d.ParamIndex >= 0)
                            {
                                IndexTable.Remove(d.ParamIndex);
                            }
                            d.ParamIndex = v;
                            isNew        = true;
                        }
                        else
                        {
                            result = "Error: negative index.";
                        }
                    } catch (Exception) {
                        result = "Error: invalid index type.";
                    }
                    break;

                case DeviceParameter.FieldId.CategoryField:
                    try {
                        int v = (int)value;
                        if (v >= 0)
                        {
                            d.ParamCategory = v;
                        }
                        else
                        {
                            result = "Error: negative category.";
                        }
                    } catch (Exception) {
                        result = "Error: invalid category type.";
                    }
                    break;

                case DeviceParameter.FieldId.VariableKindField:
                    try {
                        VariableKind v = VariableValue.StringToVK(value.ToString());
                        d.ParamVarKind = v;
                        if (v == VariableKind.VK_None)
                        {
                            result = "Error: bad representation kind.";
                        }
                    } catch (Exception) {
                        result = "Error: invalid representation kind type.";
                    }
                    break;

                case DeviceParameter.FieldId.SizeField:
                    try {
                        int v = (int)value;
                        if (v >= 0)
                        {
                            d.ParamSize = v;
                        }
                        else
                        {
                            d.ParamSize = VariableValue.DataSize(d.ParamVarKind);
                        }
                    } catch (Exception) {
                        result = "Error: invalid size value.";
                    }
                    break;

                case DeviceParameter.FieldId.StorageFlagsField:
                    try {
                        StorageFlags v = VariableValue.StringToSF(value.ToString());
                        d.ParamStorageFlags = v;
                        if (v == StorageFlags.SF_None)
                        {
                            result = "Error: bad storage flags.";
                        }
                    } catch (Exception) {
                        result = "Error: invalid storage flags type.";
                    }
                    break;

                case DeviceParameter.FieldId.MinValueField:
                    try {
                        d.MinValue = new VariableValue(d.ParamVarKind, value.ToString());
                    } catch (Exception) {
                        result = "Error: invalid min value type.";
                    }
                    break;

                case DeviceParameter.FieldId.MaxValueField:
                    try {
                        d.MaxValue = new VariableValue(d.ParamVarKind, value.ToString());
                    } catch (Exception) {
                        result = "Error: invalid max value type.";
                    }
                    break;

                case DeviceParameter.FieldId.DefaultValueField:
                    try {
                        d.DefaultValue = new VariableValue(d.ParamVarKind, value.ToString());
                    } catch (Exception) {
                        result = "Error: invalid default value type.";
                    }
                    break;

                case DeviceParameter.FieldId.RamValueField:
                    try {
                        d.RamValue = new VariableValue(d.ParamVarKind, value.ToString());
                    } catch (Exception) {
                        result = "Error: invalid ram value type.";
                    }
                    break;

                case DeviceParameter.FieldId.EepromValueField:
                    try {
                        d.EEPromValue = new VariableValue(d.ParamVarKind, value.ToString());
                    } catch (Exception) {
                        result = "Error: invalid Eeprom value type.";
                    }
                    break;

                case DeviceParameter.FieldId.NameField:
                    try {
                        string s = value.ToString().Trim().ToLower();
                        if (!isNew && !String.IsNullOrWhiteSpace(d.ParamName))
                        {
                            NameTable.Remove(d.ParamName);
                        }
                        d.ParamName = s;
                        isNew       = true;
                    } catch (Exception) {
                        result = "Error: invalid index type.";
                    }
                    break;

                default:
                    result = "Error: invalid field name or Id.";
                    break;
                }
                if (isNew && result == null)
                {
                    Add(d);
                }
            }
            return(result);
        }