diff --git a/src/AppFuncs.tt b/src/AppFuncs.tt index efdfa8f..92081e7 100644 --- a/src/AppFuncs.tt +++ b/src/AppFuncs.tt @@ -31,7 +31,7 @@ <# foreach (var registerMetadata in DeviceMetadata.Registers) { - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); #> void app_read_REG_<#= registerName #>(void); <# @@ -41,7 +41,7 @@ void app_read_REG_<#= registerName #>(void); <# foreach (var registerMetadata in DeviceMetadata.Registers) { - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); #> bool app_write_REG_<#= registerName #>(void *a); <# diff --git a/src/AppFuncsImpl.tt b/src/AppFuncsImpl.tt index 324c963..54a03d4 100644 --- a/src/AppFuncsImpl.tt +++ b/src/AppFuncsImpl.tt @@ -25,7 +25,7 @@ void (*app_func_rd_pointer[])(void) = { registerIndex = 0; foreach (var registerMetadata in deviceRegisters) { - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); #> &app_read_REG_<#= registerName #><#= ++registerIndex < deviceRegisters.Count ? "," : string.Empty #> <# @@ -38,7 +38,7 @@ bool (*app_func_wr_pointer[])(void*) = { registerIndex = 0; foreach (var registerMetadata in deviceRegisters) { - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); #> &app_write_REG_<#= registerName #><#= ++registerIndex < deviceRegisters.Count ? "," : string.Empty #> <# @@ -49,7 +49,7 @@ foreach (var registerMetadata in deviceRegisters) foreach (var registerMetadata in deviceRegisters) { var register = registerMetadata.Value; - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); var firmwareType = TemplateHelper.GetFirmwareType(register.Type); var allowWrite = (register.Access & RegisterAccess.Write) != 0; var isArrayRegister = register.Length > 0; diff --git a/src/AppRegs.tt b/src/AppRegs.tt index ffa5eb7..8d0fe7c 100644 --- a/src/AppRegs.tt +++ b/src/AppRegs.tt @@ -22,7 +22,7 @@ int totalRegisterSize = 0; foreach (var registerMetadata in DeviceMetadata.Registers) { var register = registerMetadata.Value; - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); maxRegisterNameLength = Math.Max(maxRegisterNameLength, registerName.Length); minRegisterAddress = Math.Min(minRegisterAddress, register.Address); maxRegisterAddress = Math.Max(maxRegisterAddress, register.Address); @@ -33,8 +33,8 @@ foreach (var registerMetadata in DeviceMetadata.Registers) void init_ios(void); <# var maxPinNameLength = Math.Max( - inputPins.Count > 0 ? inputPins.Max(pin => FirmwareNamingConvention.Instance.Apply(pin.Key).Length) : 0, - outputPins.Count > 0 ? outputPins.Max(pin => FirmwareNamingConvention.Instance.Apply(pin.Key).Length) : 0); + inputPins.Count > 0 ? inputPins.Max(pin => TemplateHelper.GetFirmwareName(pin.Key).Length) : 0, + outputPins.Count > 0 ? outputPins.Max(pin => TemplateHelper.GetFirmwareName(pin.Key).Length) : 0); if (inputPins.Count > 0) { #> @@ -44,7 +44,7 @@ if (inputPins.Count > 0) <# foreach (var pin in inputPins) { - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var descriptionOffset = maxPinNameLength - pinName.Length + 10; #> // <#= pinName #><#= new string(' ', descriptionOffset) #>Description: <#= pin.Value.Description #> @@ -56,7 +56,7 @@ if (inputPins.Count > 0) foreach (var pin in inputPins) { var pinInfo = pin.Value; - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var nameOffset = maxPinNameLength - pinName.Length + 4; #> #define read_<#= pinName #> read_io(<#= pinInfo.Port #>, <#= pinInfo.PinNumber #>)<#= new string(' ', nameOffset) #>// <#= pinName #> @@ -77,7 +77,7 @@ if (outputPins.Count > 0) <# foreach (var pin in outputPins) { - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var descriptionOffset = maxPinNameLength - pinName.Length + 10; #> // <#= pinName #><#= new string(' ', descriptionOffset) #>Description: <#= pin.Value.Description #> @@ -88,7 +88,7 @@ if (outputPins.Count > 0) foreach (var pin in outputPins) { var pinInfo = pin.Value; - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var setFunc = pinInfo.Invert ? "clear_io" : "set_io"; var clrFunc = pinInfo.Invert ? "set_io" : "clear_io"; #> @@ -114,7 +114,7 @@ typedef struct foreach (var registerMetadata in DeviceMetadata.Registers) { var register = registerMetadata.Value; - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); var arrayType = register.Length > 0 ? $"[{register.Length}]" : string.Empty; var firmwareType = TemplateHelper.GetFirmwareType(register.Type); #> @@ -133,7 +133,7 @@ foreach (var registerMetadata in DeviceMetadata.Registers) { var register = registerMetadata.Value; var registerAddress = register.Address.ToString(); - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); var registerType = TemplateHelper.GetFirmwareRegisterType(register.Type); var addressOffset = new string(' ', maxRegisterNameLength - registerName.Length - registerAddress.Length + 6); var descriptionOffset = new string(' ', 7 - registerType.Length); @@ -158,25 +158,17 @@ foreach (var registerMetadata in DeviceMetadata.Registers) /* Registers' bits */ /************************************************************************/ <# -var maxBitNameLength = DeviceMetadata.BitMasks.Values - .SelectMany(mask => mask.Bits) - .Select(bitField => FirmwareNamingConvention.Instance.Apply(bitField.Key).Length) - .Prepend(0).Max(); -var maxMemberNameLength = (from groupMask in DeviceMetadata.GroupMasks - let maskName = FirmwareGroupMaskNamingConvention.Instance.Apply(groupMask.Key) - from member in groupMask.Value.Values - let memberName = FirmwareNamingConvention.Instance.Apply(member.Key) - select maskName.Length + memberName.Length) - .Prepend(0).Max(); -var maxBitMemberNameLength = Math.Max(maxBitNameLength, maxMemberNameLength); +var maxBitMaskNameLength = TemplateHelper.GetMaxFirmwareBitMaskNameLength(DeviceMetadata); +var maxGroupMaskNameLength = TemplateHelper.GetMaxFirmwareGroupMaskNameLength(DeviceMetadata); +var maxMaskNameLength = Math.Max(maxBitMaskNameLength, maxGroupMaskNameLength); foreach (var bitMask in DeviceMetadata.BitMasks) { var mask = bitMask.Value; foreach (var bitField in mask.Bits) { var fieldInfo = bitField.Value; - var fieldName = FirmwareNamingConvention.Instance.Apply(bitField.Key); - var fieldNamePadding = new string(' ', maxBitMemberNameLength - fieldName.Length + 6); + var fieldName = TemplateHelper.GetFirmwareName(bitField.Key); + var fieldNamePadding = new string(' ', maxMaskNameLength - fieldName.Length + 6); var bitShift = (int)Math.Log(fieldInfo.Value, 2); var bitShiftPadding = new string(' ', 8 - bitShift.ToString().Length); #> @@ -190,8 +182,8 @@ foreach (var groupMask in DeviceMetadata.GroupMasks) { var mask = groupMask.Value; var maskSelect = TemplateHelper.GetMaskSelect(mask).ToString("X2"); - var maskName = FirmwareGroupMaskNamingConvention.Instance.Apply(groupMask.Key); - var maskNamePadding = new string(' ', maxBitMemberNameLength - maskName.Length); + var maskName = TemplateHelper.GetFirmwareGroupMaskName(groupMask.Key); + var maskNamePadding = new string(' ', maxMaskNameLength - maskName.Length); var maskSelectPadding = new string(' ', 11 - maskSelect.Length); #> #define MSK_<#= maskName #>_SEL<#= maskNamePadding #>0x<#= maskSelect #><#= maskSelectPadding #>// @@ -200,8 +192,8 @@ foreach (var groupMask in DeviceMetadata.GroupMasks) foreach (var member in mask.Values) { var memberInfo = member.Value; - var memberName = FirmwareNamingConvention.Instance.Apply(member.Key); - var memberNamePadding = new string(' ', maxBitMemberNameLength - memberName.Length - maskName.Length + 4); + var memberName = TemplateHelper.GetFirmwareName(member.Key); + var memberNamePadding = new string(' ', maxMaskNameLength - memberName.Length - maskName.Length + 4); var memberHexValue = memberInfo.Value.ToString("X2"); var memberHexPadding = new string(' ', 11 - memberHexValue.Length); #> diff --git a/src/AppRegsImpl.tt b/src/AppRegsImpl.tt index 4c20622..84f9cd5 100644 --- a/src/AppRegsImpl.tt +++ b/src/AppRegsImpl.tt @@ -26,7 +26,7 @@ int totalRegisterSize = 0; foreach (var registerMetadata in deviceRegisters) { var register = registerMetadata.Value; - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); maxRegisterNameLength = Math.Max(maxRegisterNameLength, registerName.Length); minRegisterAddress = Math.Min(minRegisterAddress, register.Address); maxRegisterAddress = Math.Max(maxRegisterAddress, register.Address); @@ -40,8 +40,8 @@ foreach (var registerMetadata in deviceRegisters) void init_ios(void) {<# var maxPinNameLength = Math.Max( - inputPins.Count > 0 ? inputPins.Max(pin => FirmwareNamingConvention.Instance.Apply(pin.Key).Length) : 0, - outputPins.Count > 0 ? outputPins.Max(pin => FirmwareNamingConvention.Instance.Apply(pin.Key).Length) : 0); + inputPins.Count > 0 ? inputPins.Max(pin => TemplateHelper.GetFirmwareName(pin.Key).Length) : 0, + outputPins.Count > 0 ? outputPins.Max(pin => TemplateHelper.GetFirmwareName(pin.Key).Length) : 0); if (inputPins.Count > 0) { #> @@ -51,7 +51,7 @@ if (inputPins.Count > 0) foreach (var pin in inputPins) { var pinInfo = pin.Value; - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var pullMode = TemplateHelper.GetFirmwarePullMode(pinInfo.PinMode); var senseMode = TemplateHelper.GetFirmwareSenseMode(pinInfo.TriggerMode); var descriptionPadding = new string(' ', 49 - pinInfo.Port.Length - pullMode.Length - senseMode.Length); @@ -72,7 +72,7 @@ if (inputPins.Count > 0) var pinInfo = pin.Value; var port = pinInfo.Port; var pinNumber = pinInfo.PinNumber.ToString(); - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); if (!pinInfo.InterruptNumber.HasValue) Error($"({pinName}) Interrupt number must be specified if interrupt priority is set."); var interruptNumber = pinInfo.InterruptNumber.GetValueOrDefault(); @@ -94,7 +94,7 @@ if (outputPins.Count > 0) foreach (var pin in outputPins) { var pinInfo = pin.Value; - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var descriptionOffset = maxPinNameLength - pinName.Length + 10; var inputEnable = pinInfo.AllowRead ? "IN_EN_IO_EN" : "IN_EN_IO_DIS"; var outMode = TemplateHelper.GetFirmwareOutputIO(pinInfo.PinMode); @@ -110,7 +110,7 @@ if (outputPins.Count > 0) } foreach (var pin in outputPins) { - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); var pinState = pin.Value.InitialState > 0 ? "set" : "clr"; #> <#= pinState #>_<#= pinName #>; @@ -154,7 +154,7 @@ uint8_t *app_regs_pointer[] = { registerIndex = 0; foreach (var registerMetadata in deviceRegisters) { - var registerName = FirmwareNamingConvention.Instance.Apply(registerMetadata.Key); + var registerName = TemplateHelper.GetFirmwareName(registerMetadata.Key); #> (uint8_t*)(&app_regs.REG_<#= registerName #>)<#= ++registerIndex < deviceRegisters.Count ? "," : string.Empty #> <# diff --git a/src/Firmware.cs b/src/Firmware.cs index 6992162..ee06f62 100644 --- a/src/Firmware.cs +++ b/src/Firmware.cs @@ -283,6 +283,37 @@ public static string GetFirmwareType(PayloadType payloadType) }; } + public static string GetFirmwareName(string value) + { + return FirmwareNamingConvention.Instance.Apply(value); + } + + public static string GetFirmwareGroupMaskName(string value) + { + var suffixIndex = value.LastIndexOf("Mask"); + if (suffixIndex >= 1) + value = value.Substring(0, suffixIndex); + return GetFirmwareName(value); + } + + public static int GetMaxFirmwareBitMaskNameLength(DeviceInfo deviceMetadata) + { + return deviceMetadata.BitMasks.Values + .SelectMany(mask => mask.Bits) + .Select(bitField => GetFirmwareName(bitField.Key).Length) + .Prepend(0).Max(); + } + + public static int GetMaxFirmwareGroupMaskNameLength(DeviceInfo deviceMetadata) + { + return (from groupMask in deviceMetadata.GroupMasks + let maskName = GetFirmwareGroupMaskName(groupMask.Key) + from member in groupMask.Value.Values + let memberName = GetFirmwareName(member.Key) + select maskName.Length + memberName.Length) + .Prepend(0).Max(); + } + public static string GetFirmwareRegisterType(PayloadType payloadType) { return payloadType switch diff --git a/src/Interrupts.tt b/src/Interrupts.tt index 0317226..d6bcbcd 100644 --- a/src/Interrupts.tt +++ b/src/Interrupts.tt @@ -42,7 +42,7 @@ var interruptPins = TemplateHelper.GetPortPinsOfType(PortPinMetada foreach (var pin in interruptPins) { var pinInfo = pin.Value; - var pinName = FirmwareNamingConvention.Instance.Apply(pin.Key); + var pinName = TemplateHelper.GetFirmwareName(pin.Key); if (!pinInfo.InterruptNumber.HasValue) Error($"({pinName}) Interrupt number must be specified if interrupt priority is set."); var interruptNumber = pinInfo.InterruptNumber.GetValueOrDefault(); diff --git a/tests/ExpectedOutput/device.app_funcs.c b/tests/ExpectedOutput/device.app_funcs.c index b435b9c..ea3572a 100644 --- a/tests/ExpectedOutput/device.app_funcs.c +++ b/tests/ExpectedOutput/device.app_funcs.c @@ -22,7 +22,8 @@ void (*app_func_rd_pointer[])(void) = { &app_read_REG_PULSE_DO_PORT0, &app_read_REG_PULSE_DO0, &app_read_REG_START_PULSE, - &app_read_REG_START_PULSE_TRAIN + &app_read_REG_START_PULSE_TRAIN, + &app_read_REG_ENCODER_MODE }; bool (*app_func_wr_pointer[])(void*) = { @@ -39,7 +40,8 @@ bool (*app_func_wr_pointer[])(void*) = { &app_write_REG_PULSE_DO_PORT0, &app_write_REG_PULSE_DO0, &app_write_REG_START_PULSE, - &app_write_REG_START_PULSE_TRAIN + &app_write_REG_START_PULSE_TRAIN, + &app_write_REG_ENCODER_MODE }; /************************************************************************/ @@ -244,3 +246,20 @@ bool app_write_REG_START_PULSE_TRAIN(void *a) app_regs.REG_START_PULSE_TRAIN[0] = reg[0]; return true; } + +/************************************************************************/ +/* REG_ENCODER_MODE */ +/************************************************************************/ +void app_read_REG_ENCODER_MODE(void) +{ + //app_regs.REG_ENCODER_MODE = 0; + +} + +bool app_write_REG_ENCODER_MODE(void *a) +{ + uint8_t reg = *((uint8_t*)a); + + app_regs.REG_ENCODER_MODE = reg; + return true; +} diff --git a/tests/ExpectedOutput/device.app_funcs.h b/tests/ExpectedOutput/device.app_funcs.h index 525a2c7..f247f28 100644 --- a/tests/ExpectedOutput/device.app_funcs.h +++ b/tests/ExpectedOutput/device.app_funcs.h @@ -34,6 +34,7 @@ void app_read_REG_PULSE_DO_PORT0(void); void app_read_REG_PULSE_DO0(void); void app_read_REG_START_PULSE(void); void app_read_REG_START_PULSE_TRAIN(void); +void app_read_REG_ENCODER_MODE(void); bool app_write_REG_DIGITAL_INPUTS(void *a); bool app_write_REG_ANALOG_DATA(void *a); @@ -49,6 +50,7 @@ bool app_write_REG_PULSE_DO_PORT0(void *a); bool app_write_REG_PULSE_DO0(void *a); bool app_write_REG_START_PULSE(void *a); bool app_write_REG_START_PULSE_TRAIN(void *a); +bool app_write_REG_ENCODER_MODE(void *a); #endif /* _APP_FUNCTIONS_H_ */ \ No newline at end of file diff --git a/tests/ExpectedOutput/device.app_ios_and_regs.c b/tests/ExpectedOutput/device.app_ios_and_regs.c index 0f4f06d..7609ccf 100644 --- a/tests/ExpectedOutput/device.app_ios_and_regs.c +++ b/tests/ExpectedOutput/device.app_ios_and_regs.c @@ -77,7 +77,8 @@ uint8_t app_regs_type[] = { TYPE_U16, TYPE_U16, TYPE_U16, - TYPE_U16 + TYPE_U16, + TYPE_U8 }; uint16_t app_regs_n_elements[] = { @@ -94,7 +95,8 @@ uint16_t app_regs_n_elements[] = { 1, 1, 1, - 2 + 2, + 1 }; uint8_t *app_regs_pointer[] = { @@ -111,5 +113,6 @@ uint8_t *app_regs_pointer[] = { (uint8_t*)(&app_regs.REG_PULSE_DO_PORT0), (uint8_t*)(&app_regs.REG_PULSE_DO0), (uint8_t*)(&app_regs.REG_START_PULSE), - (uint8_t*)(&app_regs.REG_START_PULSE_TRAIN) + (uint8_t*)(&app_regs.REG_START_PULSE_TRAIN), + (uint8_t*)(&app_regs.REG_ENCODER_MODE) }; \ No newline at end of file diff --git a/tests/ExpectedOutput/device.app_ios_and_regs.h b/tests/ExpectedOutput/device.app_ios_and_regs.h index a2e61ac..6e1cdd2 100644 --- a/tests/ExpectedOutput/device.app_ios_and_regs.h +++ b/tests/ExpectedOutput/device.app_ios_and_regs.h @@ -145,6 +145,7 @@ typedef struct uint16_t REG_PULSE_DO0; uint16_t REG_START_PULSE; uint16_t REG_START_PULSE_TRAIN[2]; + uint8_t REG_ENCODER_MODE; } AppRegs; /************************************************************************/ @@ -165,6 +166,7 @@ typedef struct #define ADD_REG_PULSE_DO0 43 // U16 #define ADD_REG_START_PULSE 100 // U16 Starts a PWM pulse. #define ADD_REG_START_PULSE_TRAIN 101 // U16 Starts a PWM pulse train. +#define ADD_REG_ENCODER_MODE 103 // U8 Configures the operation mode of the encoder. /************************************************************************/ /* Tests registers' memory limits */ @@ -174,24 +176,27 @@ typedef struct /************************************************************************/ /* Memory limits */ #define APP_REGS_ADD_MIN 0x20 -#define APP_REGS_ADD_MAX 0x65 -#define APP_NBYTES_OF_REG_BANK 117 +#define APP_REGS_ADD_MAX 0x67 +#define APP_NBYTES_OF_REG_BANK 118 /************************************************************************/ /* Registers' bits */ /************************************************************************/ -#define B_DIO0 (1<<0) // -#define B_DIO1 (1<<1) // -#define B_DIO2 (1<<2) // -#define B_DIO3 (1<<3) // -#define B_DI_PORT0 (1<<8) // -#define B_TEST_DI_PORT1 (1<<9) // -#define B_SUPPLY_PORT0 (1<<10) // -#define B_PORT_DIO1 (1<<11) // -#define MSK_PWM_PORT_SEL 0x0F // -#define GM_PWM_PORT_PWM0 0x01 // -#define GM_PWM_PORT_PWM1 0x02 // -#define GM_PWM_PORT_PWM2 0x04 // -#define GM_PWM_PORT_PWM3 0x0A // +#define B_DIO0 (1<<0) // +#define B_DIO1 (1<<1) // +#define B_DIO2 (1<<2) // +#define B_DIO3 (1<<3) // +#define B_DI_PORT0 (1<<8) // +#define B_TEST_DI_PORT1 (1<<9) // +#define B_SUPPLY_PORT0 (1<<10) // +#define B_PORT_DIO1 (1<<11) // +#define MSK_PWM_PORT_SEL 0x0F // +#define GM_PWM_PORT_PWM0 0x01 // +#define GM_PWM_PORT_PWM1 0x02 // +#define GM_PWM_PORT_PWM2 0x04 // +#define GM_PWM_PORT_PWM3 0x0A // +#define MSK_ENCODER_MODE_SEL 0x01 // +#define GM_ENCODER_MODE_POSITION 0x00 // +#define GM_ENCODER_MODE_DISPLACEMENT 0x01 // #endif /* _APP_REGS_H_ */ \ No newline at end of file diff --git a/tests/ExpectedOutput/device.async.cs b/tests/ExpectedOutput/device.async.cs index 2386928..2b36d15 100644 --- a/tests/ExpectedOutput/device.async.cs +++ b/tests/ExpectedOutput/device.async.cs @@ -593,5 +593,51 @@ public async Task WriteStartPulseTrainAsync(StartPulseTrainPayload value, Cancel var request = StartPulseTrain.FromPayload(MessageType.Write, value); await CommandAsync(request, cancellationToken); } + + /// + /// Asynchronously reads the contents of the register. + /// + /// + /// A which can be used to cancel the operation. + /// + /// + /// A task that represents the asynchronous read operation. The task result contains + /// the register payload. + /// + public async Task ReadEncoderModeAsync(CancellationToken cancellationToken = default) + { + var reply = await CommandAsync(HarpCommand.ReadByte(EncoderMode.Address), cancellationToken); + return EncoderMode.GetPayload(reply); + } + + /// + /// Asynchronously reads the timestamped contents of the register. + /// + /// + /// A which can be used to cancel the operation. + /// + /// + /// A task that represents the asynchronous read operation. The task result contains + /// the timestamped register payload. + /// + public async Task> ReadTimestampedEncoderModeAsync(CancellationToken cancellationToken = default) + { + var reply = await CommandAsync(HarpCommand.ReadByte(EncoderMode.Address), cancellationToken); + return EncoderMode.GetTimestampedPayload(reply); + } + + /// + /// Asynchronously writes a value to the register. + /// + /// The value to write in the register. + /// + /// A which can be used to cancel the operation. + /// + /// The task object representing the asynchronous write operation. + public async Task WriteEncoderModeAsync(EncoderModeMask value, CancellationToken cancellationToken = default) + { + var request = EncoderMode.FromPayload(MessageType.Write, value); + await CommandAsync(request, cancellationToken); + } } } diff --git a/tests/ExpectedOutput/device.cs b/tests/ExpectedOutput/device.cs index 628a92f..82436b7 100644 --- a/tests/ExpectedOutput/device.cs +++ b/tests/ExpectedOutput/device.cs @@ -50,7 +50,8 @@ public Device() : base(WhoAmI) { } { 42, typeof(PulseDOPort0) }, { 43, typeof(PulseDO0) }, { 100, typeof(StartPulse) }, - { 101, typeof(StartPulseTrain) } + { 101, typeof(StartPulseTrain) }, + { 103, typeof(EncoderMode) } }; /// @@ -279,6 +280,7 @@ public IObservable> Process(IObservable /// /// + /// [XmlInclude(typeof(DigitalInputs))] [XmlInclude(typeof(AnalogData))] [XmlInclude(typeof(ComplexConfiguration))] @@ -293,6 +295,7 @@ public IObservable> Process(IObservable /// /// + /// [XmlInclude(typeof(DigitalInputs))] [XmlInclude(typeof(AnalogData))] [XmlInclude(typeof(ComplexConfiguration))] @@ -342,6 +346,7 @@ string INamedElement.Name [XmlInclude(typeof(PulseDO0))] [XmlInclude(typeof(StartPulse))] [XmlInclude(typeof(StartPulseTrain))] + [XmlInclude(typeof(EncoderMode))] [XmlInclude(typeof(TimestampedDigitalInputs))] [XmlInclude(typeof(TimestampedAnalogData))] [XmlInclude(typeof(TimestampedComplexConfiguration))] @@ -356,6 +361,7 @@ string INamedElement.Name [XmlInclude(typeof(TimestampedPulseDO0))] [XmlInclude(typeof(TimestampedStartPulse))] [XmlInclude(typeof(TimestampedStartPulseTrain))] + [XmlInclude(typeof(TimestampedEncoderMode))] [Description("Filters and selects specific messages reported by the Tests device.")] public partial class Parse : ParseBuilder, INamedElement { @@ -388,6 +394,7 @@ public Parse() /// /// /// + /// [XmlInclude(typeof(DigitalInputs))] [XmlInclude(typeof(AnalogData))] [XmlInclude(typeof(ComplexConfiguration))] @@ -402,6 +409,7 @@ public Parse() [XmlInclude(typeof(PulseDO0))] [XmlInclude(typeof(StartPulse))] [XmlInclude(typeof(StartPulseTrain))] + [XmlInclude(typeof(EncoderMode))] [Description("Formats a sequence of values as specific Tests register messages.")] public partial class Format : FormatBuilder, INamedElement { @@ -1923,6 +1931,103 @@ public static Timestamped GetPayload(HarpMessage message } } + /// + /// Represents a register that configures the operation mode of the encoder. + /// + [Description("Configures the operation mode of the encoder.")] + public partial class EncoderMode + { + /// + /// Represents the address of the register. This field is constant. + /// + public const int Address = 103; + + /// + /// Represents the payload type of the register. This field is constant. + /// + public const PayloadType RegisterType = PayloadType.U8; + + /// + /// Represents the length of the register. This field is constant. + /// + public const int RegisterLength = 1; + + /// + /// Returns the payload data for register messages. + /// + /// A object representing the register message. + /// A value representing the message payload. + public static EncoderModeMask GetPayload(HarpMessage message) + { + return (EncoderModeMask)message.GetPayloadByte(); + } + + /// + /// Returns the timestamped payload data for register messages. + /// + /// A object representing the register message. + /// A value representing the timestamped message payload. + public static Timestamped GetTimestampedPayload(HarpMessage message) + { + var payload = message.GetTimestampedPayloadByte(); + return Timestamped.Create((EncoderModeMask)payload.Value, payload.Seconds); + } + + /// + /// Returns a Harp message for the register. + /// + /// The type of the Harp message. + /// The value to be stored in the message payload. + /// + /// A object for the register + /// with the specified message type and payload. + /// + public static HarpMessage FromPayload(MessageType messageType, EncoderModeMask value) + { + return HarpMessage.FromByte(Address, messageType, (byte)value); + } + + /// + /// Returns a timestamped Harp message for the + /// register. + /// + /// The timestamp of the message payload, in seconds. + /// The type of the Harp message. + /// The value to be stored in the message payload. + /// + /// A object for the register + /// with the specified message type, timestamp, and payload. + /// + public static HarpMessage FromPayload(double timestamp, MessageType messageType, EncoderModeMask value) + { + return HarpMessage.FromByte(Address, timestamp, messageType, (byte)value); + } + } + + /// + /// Provides methods for manipulating timestamped messages from the + /// EncoderMode register. + /// + /// + [Description("Filters and selects timestamped messages from the EncoderMode register.")] + public partial class TimestampedEncoderMode + { + /// + /// Represents the address of the register. This field is constant. + /// + public const int Address = EncoderMode.Address; + + /// + /// Returns timestamped payload data for register messages. + /// + /// A object representing the register message. + /// A value representing the timestamped message payload. + public static Timestamped GetPayload(HarpMessage message) + { + return EncoderMode.GetTimestampedPayload(message); + } + } + /// /// Represents an operator which creates standard message payloads for the /// Tests device. @@ -1941,6 +2046,7 @@ public static Timestamped GetPayload(HarpMessage message /// /// /// + /// [XmlInclude(typeof(CreateDigitalInputsPayload))] [XmlInclude(typeof(CreateAnalogDataPayload))] [XmlInclude(typeof(CreateComplexConfigurationPayload))] @@ -1955,6 +2061,7 @@ public static Timestamped GetPayload(HarpMessage message [XmlInclude(typeof(CreatePulseDO0Payload))] [XmlInclude(typeof(CreateStartPulsePayload))] [XmlInclude(typeof(CreateStartPulseTrainPayload))] + [XmlInclude(typeof(CreateEncoderModePayload))] [XmlInclude(typeof(CreateTimestampedDigitalInputsPayload))] [XmlInclude(typeof(CreateTimestampedAnalogDataPayload))] [XmlInclude(typeof(CreateTimestampedComplexConfigurationPayload))] @@ -1969,6 +2076,7 @@ public static Timestamped GetPayload(HarpMessage message [XmlInclude(typeof(CreateTimestampedPulseDO0Payload))] [XmlInclude(typeof(CreateTimestampedStartPulsePayload))] [XmlInclude(typeof(CreateTimestampedStartPulseTrainPayload))] + [XmlInclude(typeof(CreateTimestampedEncoderModePayload))] [Description("Creates standard message payloads for the Tests device.")] public partial class CreateMessage : CreateMessageBuilder, INamedElement { @@ -2878,6 +2986,60 @@ public HarpMessage GetMessage(double timestamp, MessageType messageType) } } + /// + /// Represents an operator that creates a message payload + /// that configures the operation mode of the encoder. + /// + [DisplayName("EncoderModePayload")] + [Description("Creates a message payload that configures the operation mode of the encoder.")] + public partial class CreateEncoderModePayload + { + /// + /// Gets or sets the value that configures the operation mode of the encoder. + /// + [Description("The value that configures the operation mode of the encoder.")] + public EncoderModeMask EncoderMode { get; set; } + + /// + /// Creates a message payload for the EncoderMode register. + /// + /// The created message payload value. + public EncoderModeMask GetPayload() + { + return EncoderMode; + } + + /// + /// Creates a message that configures the operation mode of the encoder. + /// + /// Specifies the type of the created message. + /// A new message for the EncoderMode register. + public HarpMessage GetMessage(MessageType messageType) + { + return Harp.Generators.Tests.EncoderMode.FromPayload(messageType, GetPayload()); + } + } + + /// + /// Represents an operator that creates a timestamped message payload + /// that configures the operation mode of the encoder. + /// + [DisplayName("TimestampedEncoderModePayload")] + [Description("Creates a timestamped message payload that configures the operation mode of the encoder.")] + public partial class CreateTimestampedEncoderModePayload : CreateEncoderModePayload + { + /// + /// Creates a timestamped message that configures the operation mode of the encoder. + /// + /// The timestamp of the message payload, in seconds. + /// Specifies the type of the created message. + /// A new timestamped message for the EncoderMode register. + public HarpMessage GetMessage(double timestamp, MessageType messageType) + { + return Harp.Generators.Tests.EncoderMode.FromPayload(timestamp, messageType, GetPayload()); + } + } + /// /// Represents the payload of the AnalogData register. /// @@ -3311,6 +3473,15 @@ public enum PwmPort : byte Pwm3 = 10 } + /// + /// Specifies the type of encoder mode. + /// + public enum EncoderModeMask : byte + { + Position = 0, + Displacement = 1 + } + internal static partial class PayloadMarshal { internal static T[] GetSubArray(T[] array, int offset, int count) diff --git a/tests/Metadata/device.yml b/tests/Metadata/device.yml index 9a7ad6b..38b87cc 100644 --- a/tests/Metadata/device.yml +++ b/tests/Metadata/device.yml @@ -160,6 +160,12 @@ registers: offset: 1 mask: 0xFF interfaceType: byte + EncoderMode: + address: 103 + type: U8 + access: Write + maskType: EncoderModeMask + description: Configures the operation mode of the encoder. bitMasks: PortDigitalIOS: bits: @@ -178,3 +184,8 @@ groupMasks: Pwm1: 0x2 Pwm2: 0x4 Pwm3: 0xA + EncoderModeMask: + description: Specifies the type of encoder mode. + values: + Position: 0x0 + Displacement: 0x1