Пример #1
0
        private static void GenerateRegisterAddressEnum(CodeWriter code, string prefix, XElement[] registerElements)
        {
            string registerAddressEnumName = GetRegisterAddressEnumName(prefix);

            code.AppendLine($"public enum {registerAddressEnumName}");
            code.AppendLine("{");
            code.Indent++; // Enum

            Iterate(registerElements, (registerElement, isLastRegister) =>
            {
                GenerateDescription(code, GetDescription(registerElement));

                string name  = GetName(registerElement);
                byte address = GetRegisterAddress(registerElement);

                code.AppendLine($"{name} = {ToHex(address, 2)}{(isLastRegister ? string.Empty : ",")}");

                if (!isLastRegister)
                {
                    code.AppendLine();
                }
            });

            code.Indent--; // Enum
            code.AppendLine("}");
            code.AppendLine();
        }
Пример #2
0
        private void GenerateEnum(
            CodeWriter code,
            RegisterMode registerMode,
            int registerLength,
            List <RegisterProperty> properties,
            XElement element,
            bool isFlags)
        {
            string name     = GetName(element);
            string enumName = name + "Enum";

            int byteIndex;
            var bitsRange = GetBitsRange(element, registerLength, null, out byteIndex);

            EnumValue[] enumValues = element.Elements("Value")
                                     .Select(GetEnumValue)
                                     .OrderBy(x => x.Value)
                                     .ToArray();

            switch (registerMode)
            {
            case RegisterMode.ReadWrite:
                if (enumValues.Count(x => x.IsDefault) != 1)
                {
                    throw new Exception("Exactly one default enum value expected: " + name);
                }
                break;

            case RegisterMode.ReadClear:
            case RegisterMode.ReadOnly:
                if (enumValues.Count(x => x.IsDefault) != 0)
                {
                    throw new Exception("No default enum value expected: " + name);
                }
                break;
            }

            GenerateDescription(code, GetDescription(element));

            //code.AppendLine(bitsRange.FromBits == bitsRange.ToBits
            //    ? $"[BitMask({bitsRange.FromBits})]"
            //    : $"[BitMask({bitsRange.FromBits}, {bitsRange.ToBits})]");

            string integerType = GetIntegerType(bitsRange);

            if (isFlags)
            {
                code.AppendLine("[Flags]");
            }

            code.AppendLine($"public enum {enumName} : {integerType}");
            code.AppendLine("{");
            code.Indent++; // Enum values

            bool isFirst = true;

            Iterate(enumValues, (enumValue, isLast) =>
            {
                if (isFirst)
                {
                    isFirst = false;
                }
                else if (!string.IsNullOrEmpty(enumValue.Description))
                {
                    code.AppendLine();
                }

                byte value = enumValue.Value;
                //byte value = (byte)(enumValue.Value << bitsRange.FromBits);

                GenerateDescription(code, enumValue.Description);
                code.AppendLine($"{enumValue.Name} = {ToHex(value, 2)}{(isLast ? string.Empty : ",")}");
            });

            code.Indent--; // Enum values
            code.AppendLine("}");
            code.AppendLine();

            string defaultValue;

            if (registerMode == RegisterMode.ReadWrite)
            {
                defaultValue = enumName + "." + enumValues.Single(x => x.IsDefault).Name;
            }
            else
            {
                defaultValue = null;
            }

            Action <CodeWriter, string[]> appendPropertyAssigmentFromBytes = (codeWriter, byteParameterNames) =>
            {
                var composedValue = GetComposedValue(bitsRange, registerLength, byteIndex, byteParameterNames);
                codeWriter.AppendLine($"{name} = ({enumName})Enum.ToObject(typeof({enumName}), {composedValue});");
            };

            Func <string[]> getByteIndexAsByteStrings = () =>
                                                        GetDecomposedValues(name, bitsRange, registerLength, byteIndex, false);

            properties.Add(new RegisterProperty(
                               PropertyType.Enum,
                               registerMode,
                               name,
                               GetLocalName(name),
                               enumName,
                               defaultValue,
                               GetDescription(element),
                               (codeWriter, paramName) => { },
                               appendPropertyAssigmentFromBytes,
                               getByteIndexAsByteStrings,
                               byteIndex));
        }