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(); }
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)); }