diff --git a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs index 9f957fd..dc3130e 100644 --- a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs @@ -81,16 +81,22 @@ public RDMMessage BuildGetResponseMessage(GetResponse getResponseValue) return this.buildGetResponseMessage(getResponseValue); } + #endregion + } + public abstract class AbstractRDMGetParameterWrapperRanged : AbstractRDMGetParameterWrapper, IRDMGetParameterWrapperRequestRanged, IRDMGetParameterWrapperRequestRanged + { + protected AbstractRDMGetParameterWrapperRanged(in ERDM_Parameter parameter) : base(parameter) + { + } public abstract IRequestRange GetRequestRange(object value); - IRequestRange IRDMGetParameterWrapperRequest.GetRequestRange(object value) + IRequestRange IRDMGetParameterWrapperRequestRanged.GetRequestRange(object value) { return this.GetRequestRange(value); } - IRequestRange IRDMGetParameterWrapperRequest.GetRequestRange(object value) + IRequestRange IRDMGetParameterWrapperRequestRanged.GetRequestRange(object value) { return (IRequestRange)this.GetRequestRange(value); } - #endregion } } diff --git a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs index 085c058..6c1ebf9 100644 --- a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs @@ -2,7 +2,24 @@ namespace RDMSharp.ParameterWrapper { - public abstract class AbstractRDMGetSetParameterWrapper : AbstractRDMParameterWrapper, IRDMGetParameterWrapper, IRDMSetParameterWrapper + public abstract class AbstractRDMGetSetParameterWrapperRanged : AbstractRDMGetSetParameterWrapper, IRDMGetParameterWrapperRequestRanged, IRDMGetParameterWrapperRequestRanged + { + public abstract ERDM_Parameter[] DescriptiveParameters { get; } + protected AbstractRDMGetSetParameterWrapperRanged(in ERDM_Parameter parameter) : base(parameter) + { + } + public abstract IRequestRange GetRequestRange(object value); + IRequestRange IRDMGetParameterWrapperRequestRanged.GetRequestRange(object value) + { + return this.GetRequestRange(value); + } + + IRequestRange IRDMGetParameterWrapperRequestRanged.GetRequestRange(object value) + { + return (IRequestRange)this.GetRequestRange(value); + } + } + public abstract class AbstractRDMGetSetParameterWrapper : AbstractRDMParameterWrapper, IRDMGetParameterWrapper, IRDMSetParameterWrapper { public override sealed ERDM_CommandClass CommandClass => ERDM_CommandClass.GET | ERDM_CommandClass.SET; @@ -14,8 +31,6 @@ public abstract class AbstractRDMGetSetParameterWrapper typeof(SetResponse); - public abstract ERDM_Parameter[] DescriptiveParameters { get; } - protected AbstractRDMGetSetParameterWrapper(in ERDM_Parameter parameter) : base(parameter) { } @@ -96,15 +111,5 @@ public RDMMessage BuildSetResponseMessage(SetResponse setResponseValue) return this.buildSetResponseMessage(setResponseValue); } #endregion - public abstract IRequestRange GetRequestRange(object value); - IRequestRange IRDMGetParameterWrapperRequest.GetRequestRange(object value) - { - return this.GetRequestRange(value); - } - - IRequestRange IRDMGetParameterWrapperRequest.GetRequestRange(object value) - { - return (IRequestRange)this.GetRequestRange(value); - } } } diff --git a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapperEmptySetResponse.cs b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapperEmptySetResponse.cs index f408662..d430c85 100644 --- a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapperEmptySetResponse.cs +++ b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapperEmptySetResponse.cs @@ -3,7 +3,7 @@ namespace RDMSharp.ParameterWrapper { - public abstract class AbstractRDMGetSetParameterWrapperEmptySetResponse : AbstractRDMParameterWrapper, IRDMGetParameterWrapper, IRDMSetParameterWrapperRequest, IRDMSetParameterWrapperWithEmptySetResponse + public abstract class AbstractRDMGetSetParameterWrapperEmptySetResponse : AbstractRDMParameterWrapper, IRDMGetParameterWrapper, IRDMSetParameterWrapperRequest, IRDMSetParameterWrapperWithEmptySetResponse, IRDMGetParameterWrapperRequestRanged, IRDMGetParameterWrapperRequestRanged { public override sealed ERDM_CommandClass CommandClass => ERDM_CommandClass.GET | ERDM_CommandClass.SET; @@ -96,12 +96,12 @@ public RDMMessage BuildGetResponseMessage(GetResponse getResponseValue) } public abstract IRequestRange GetRequestRange(object value); - IRequestRange IRDMGetParameterWrapperRequest.GetRequestRange(object value) + IRequestRange IRDMGetParameterWrapperRequestRanged.GetRequestRange(object value) { return this.GetRequestRange(value); } - IRequestRange IRDMGetParameterWrapperRequest.GetRequestRange(object value) + IRequestRange IRDMGetParameterWrapperRequestRanged.GetRequestRange(object value) { return (IRequestRange)this.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs index 7081da4..a45c7a5 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class DMX512PersonalityDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class DMX512PersonalityDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public DMX512PersonalityDescriptionParameterWrapper() : base(ERDM_Parameter.DMX_PERSONALITY_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs index 62de57b..d6584b2 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class ParameterDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintParameterWrapper + public sealed class ParameterDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintParameterWrapper { public override ERDM_SupportedSubDevice SupportedGetSubDevices => ERDM_SupportedSubDevice.ROOT; public ParameterDescriptionParameterWrapper() : base(ERDM_Parameter.PARAMETER_DESCRIPTION) diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs index 01886f7..234a74d 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class SelfTestDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintParameterWrapper + public sealed class SelfTestDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintParameterWrapper { public SelfTestDescriptionParameterWrapper() : base(ERDM_Parameter.SELF_TEST_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs index 93f568c..8741b19 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class SensorDefinitionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class SensorDefinitionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public SensorDefinitionParameterWrapper() : base(ERDM_Parameter.SENSOR_DEFINITION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs index f2ea03f..d03c67d 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class SensorValueParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class SensorValueParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public SensorValueParameterWrapper() : base(ERDM_Parameter.SENSOR_VALUE) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs index 84bdc91..a4ddd1a 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs @@ -4,7 +4,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class SlotDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMDescriptionParameterWrapper + public sealed class SlotDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMDescriptionParameterWrapper { public SlotDescriptionParameterWrapper() : base(ERDM_Parameter.SLOT_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs index f6d6dcc..0fb048e 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class StatusIdDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintParameterWrapper + public sealed class StatusIdDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintParameterWrapper { public override ERDM_SupportedSubDevice SupportedGetSubDevices => ERDM_SupportedSubDevice.ROOT; public StatusIdDescriptionParameterWrapper() : base(ERDM_Parameter.STATUS_ID_DESCRIPTION) diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs index 61b1598..1cf26f8 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs @@ -3,7 +3,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class StatusMessageParameterWrapper : AbstractRDMGetParameterWrapper + public sealed class StatusMessageParameterWrapper : AbstractRDMGetParameterWrapperRanged { public override ERDM_SupportedSubDevice SupportedGetSubDevices => ERDM_SupportedSubDevice.ROOT; public StatusMessageParameterWrapper() : base(ERDM_Parameter.STATUS_MESSAGES) diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs index eaf1e8d..75d6c62 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class CurveDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class CurveDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public CurveDescriptionParameterWrapper() : base(ERDM_Parameter.CURVE_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs index 74d280e..2c5d47f 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class LockStateDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class LockStateDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public LockStateDescriptionParameterWrapper() : base(ERDM_Parameter.LOCK_STATE_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs index 5471264..fa96e41 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class ModulationFrequencyDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class ModulationFrequencyDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public ModulationFrequencyDescriptionParameterWrapper() : base(ERDM_Parameter.MODULATION_FREQUENCY_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs index a55d284..d20b44f 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class OutputResponseTimeDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class OutputResponseTimeDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public OutputResponseTimeDescriptionParameterWrapper() : base(ERDM_Parameter.OUTPUT_RESPONSE_TIME_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs index 2ec5f73..8d59732 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class HardwareAddressParameterWrapper : AbstractRDMGetParameterWrapper + public sealed class HardwareAddressParameterWrapper : AbstractRDMGetParameterWrapperRanged { public HardwareAddressParameterWrapper() : base(ERDM_Parameter.INTERFACE_HARDWARE_ADDRESS_TYPE) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs index 451d9fd..7c9afbf 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class IPv4Address_NetmaskParameterWrapper : AbstractRDMGetParameterWrapper + public sealed class IPv4Address_NetmaskParameterWrapper : AbstractRDMGetParameterWrapperRanged { public IPv4Address_NetmaskParameterWrapper() : base(ERDM_Parameter.IPV4_CURRENT_ADDRESS) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs index 0d21fba..8e3b307 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class InterfaceNameParameterWrapper : AbstractRDMGetParameterWrapper + public sealed class InterfaceNameParameterWrapper : AbstractRDMGetParameterWrapperRanged { public InterfaceNameParameterWrapper() : base(ERDM_Parameter.INTERFACE_LABEL) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/AddTagParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/AddTagParameterWrapper.cs new file mode 100644 index 0000000..d8d80da --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/AddTagParameterWrapper.cs @@ -0,0 +1,21 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class AddTagParameterWrapper : AbstractRDMSetParameterWrapperEmptyResponse + { + public AddTagParameterWrapper() : base(ERDM_Parameter.ADD_TAG) + { + } + public override string Name => "Add Tag"; + public override string Description => "This parameter associates a tag with a Responder. If the tag already exists on the Responder, the Responder shall just return an ACK without modifying the tag in any way."; + + protected override string setRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData, 32); + } + + protected override byte[] setRequestValueToParameterData(string value) + { + return Tools.ValueToData(value, 32); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/CheckTagParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/CheckTagParameterWrapper.cs new file mode 100644 index 0000000..1fb205b --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/CheckTagParameterWrapper.cs @@ -0,0 +1,31 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class CheckTagParameterWrapper : AbstractRDMSetParameterWrapper + { + public CheckTagParameterWrapper() : base(ERDM_Parameter.CHECK_TAG) + { + } + public override string Name => "Check Tag"; + public override string Description => "The CHECK_TAG parameter allows a Controller to test if a tag is present on a Responder."; + + protected override string setRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData, 32); + } + + protected override byte[] setRequestValueToParameterData(string value) + { + return Tools.ValueToData(value, 32); + } + + protected override bool setResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToBool(ref parameterData); + } + + protected override byte[] setResponseValueToParameterData(bool value) + { + return Tools.ValueToData(value); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ClearTagsParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ClearTagsParameterWrapper.cs new file mode 100644 index 0000000..0952719 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ClearTagsParameterWrapper.cs @@ -0,0 +1,12 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class ClearTagsParameterWrapper : AbstractRDMSetParameterWrapperEmptyRequestResponse + { + public ClearTagsParameterWrapper() : base(ERDM_Parameter.CLEAR_TAGS) + { + } + public override string Name => "Clear Tags"; + public override string Description => "This parameter removes all tags from a Responder."; + + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/CommunicationStatusNullStartCodeParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/CommunicationStatusNullStartCodeParameterWrapper.cs new file mode 100644 index 0000000..f224f2f --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/CommunicationStatusNullStartCodeParameterWrapper.cs @@ -0,0 +1,21 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class CommunicationStatusNullStartCodeParameterWrapper : AbstractRDMGetSetParameterWrapperEmptyGetRequestSetRequestSetResponse,IRDMBlueprintParameterWrapper + { + public CommunicationStatusNullStartCodeParameterWrapper() : base(ERDM_Parameter.COMMS_STATUS_NSC) + { + } + public override string Name => "Communication Status Null Start Code"; + public override string Description => "This parameter allows a Controller to retrieve statistical packet and error counters relating to NULL START Code (NSC) packets (see [DMX], Section 8.5.1)."; + + protected override GetCommunicationStatusNullStartCodeResponse getResponseParameterDataToValue(byte[] parameterData) + { + return GetCommunicationStatusNullStartCodeResponse.FromPayloadData(parameterData); + } + + protected override byte[] getResponseValueToParameterData(GetCommunicationStatusNullStartCodeResponse value) + { + return Tools.ValueToData(value); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DMX512PersonalityIdDefinitionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DMX512PersonalityIdDefinitionParameterWrapper.cs new file mode 100644 index 0000000..394546a --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DMX512PersonalityIdDefinitionParameterWrapper.cs @@ -0,0 +1,48 @@ +using System; + +namespace RDMSharp.ParameterWrapper +{ + public sealed class DMX512PersonalityIdDefinitionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintParameterWrapper + { + public DMX512PersonalityIdDefinitionParameterWrapper() : base(ERDM_Parameter.DMX_PERSONALITY_ID) + { + } + public override string Name => "DMX512 Personality ID"; + public override string Description => "A DMX512 Personality uniquely identifies a personality across different models and software versions. This allows Controllers to select the correct personality profile, even if the personality indices have changed due to additions / removals. Equivalent personalities across products from a manufacturer are required to have the same personality identifier.Any change to the DMX512 behavior of a Responder shall result in a new DMX_PERSONALITY_ID(see the major / minor descriptions below). Any manufacturers with Responders that support this parameter should publish the DMX personality identifier in the personality documentation on their website.If a Responder supports PRODUCT_URL, manufacturers are strongly encouraged to link to the personality documentation from the URL returned with PRODUCT_URL. A personality of zero means that the personality is not defined. This may mean that a custom personality is in use. For both the major and minor numbers, the values 0x0000 to 0x7FFF are manufacturer-defined, values 0x8000 to 0xFFFE are reserved. A value of 0xFFFF in both the Major Personality ID and Minor Personality ID fields indicates the personality is user-defined.For example, a media server may allow the user to define a DMX512 profile. A value of 0xFFFF in only one of the fields, but not both, is undefined, and shall be ignored."; + + private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { ERDM_Parameter.DEVICE_INFO }; + public override ERDM_Parameter[] DescriptiveParameters => descriptiveParameters; + + protected override byte[] getRequestValueToParameterData(byte parameterID) + { + return Tools.ValueToData(parameterID); + } + protected override byte getRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToByte(ref parameterData); + } + + protected override RDMPersonalityId getResponseParameterDataToValue(byte[] parameterData) + { + return RDMPersonalityId.FromPayloadData(parameterData); + } + protected override byte[] getResponseValueToParameterData(RDMPersonalityId personalityId) + { + return personalityId.ToPayloadData(); + } + + public override IRequestRange GetRequestRange(object value) + { + return DMX512PersonalityIdDefinitionParameterWrapper.GetRequestRangeInternal(value); + } + internal static IRequestRange GetRequestRangeInternal(object value) + { + if (value is RDMDeviceInfo deviceInfo) + return new RequestRange(1, (byte)(deviceInfo.Dmx512NumberOfPersonalities)); + else if (value == null) + return new RequestRange(1, byte.MaxValue); + + throw new NotSupportedException($"There is no support for the Type: {value.GetType()}"); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DeviceInfoOffstageParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DeviceInfoOffstageParameterWrapper.cs new file mode 100644 index 0000000..eb85755 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DeviceInfoOffstageParameterWrapper.cs @@ -0,0 +1,33 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class DeviceInfoOffstageParameterWrapper : AbstractRDMGetParameterWrapper,IRDMBlueprintParameterWrapper + { + public DeviceInfoOffstageParameterWrapper() : base(ERDM_Parameter.DEVICE_INFO_OFFSTAGE) + { + } + public override string Name => "Device Info Offstage"; + public override string Description => "This parameter returns the Device Info dataset for the requested Sub-Device and Personality, without having to switch the Responder into the specific personality. It allows the Device Information for a particular personality to be retrieved while remaining in the current Personality.\nGet Device Information can be used with the Root Device or with Sub-Devices. However, since the personality of the Root Device can change the number of Sub-Devices present, the Sub-Device field in the RDM header shall always be set to the Root Device. The Parameter Data indicates which Sub-Device the request is intended for.\nThe Sub-Device in the Parameter data references the Sub-Device in the selected personality and not the currently active personality, if they are different."; + + public override ERDM_Parameter[] DescriptiveParameters => throw new System.NotImplementedException(); + + protected override GetDeviceInfoOffstageRequest getRequestParameterDataToValue(byte[] parameterData) + { + return GetDeviceInfoOffstageRequest.FromPayloadData(parameterData); + } + + protected override byte[] getRequestValueToParameterData(GetDeviceInfoOffstageRequest value) + { + return Tools.ValueToData(value); + } + + protected override GetDeviceInfoOffstageResponse getResponseParameterDataToValue(byte[] parameterData) + { + return GetDeviceInfoOffstageResponse.FromPayloadData(parameterData); + } + + protected override byte[] getResponseValueToParameterData(GetDeviceInfoOffstageResponse value) + { + return Tools.ValueToData(value); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DeviceUnitNumberParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DeviceUnitNumberParameterWrapper.cs new file mode 100644 index 0000000..4478f08 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/DeviceUnitNumberParameterWrapper.cs @@ -0,0 +1,31 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class DeviceUnitNumberParameterWrapper : AbstractRDMGetSetParameterWrapperEmptyGetRequestSetResponse + { + public DeviceUnitNumberParameterWrapper() : base(ERDM_Parameter.DEVICE_UNIT_NUMBER) + { + } + public override string Name => "Device Unit Number"; + public override string Description => "A DMX512 address is only unique across a single DMX connection, and may change if certain parameters, such as personality, are altered.\r\nThe Device Unit Number parameter attempts to apply a unique identifier by allowing a Controller to store a 32-bit unit number in the Responder.\r\nUnit numbers are often used in lighting to identify individual fixtures within a rig. It is beneficial for all Controllers in a system to see a common unit number in order to allow the user to identify specific fixtures. Because of this, unit numbers should be unique across the entire rig."; + + protected override uint getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToUInt(ref parameterData); + } + + protected override byte[] getResponseValueToParameterData(uint value) + { + return Tools.ValueToData(value); + } + + protected override uint setRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToUInt(ref parameterData); + } + + protected override byte[] setRequestValueToParameterData(uint state) + { + return Tools.ValueToData(state); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/FirmwareURLParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/FirmwareURLParameterWrapper.cs new file mode 100644 index 0000000..f0fb38b --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/FirmwareURLParameterWrapper.cs @@ -0,0 +1,20 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class FirmwareURLParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest, IRDMBlueprintParameterWrapper + { + public FirmwareURLParameterWrapper() : base(ERDM_Parameter.FIRMWARE_URL) + { + } + public override string Name => "Firmware URL"; + public override string Description => "The Firmware URL parameter message should provide a link to access the product firmware on a manufacturer’s website, accessible from the public Internet. Manufacturers should make every effort to ensure this link does not change, since the message will be embedded into Responder firmware indefinitely. To reduce overhead on the wire, it is suggested that the URL be as short as possible."; + + protected override string getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData); + } + protected override byte[] getResponseValueToParameterData(string label) + { + return Tools.ValueToData(label); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/IdentifyTimeoutParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/IdentifyTimeoutParameterWrapper.cs new file mode 100644 index 0000000..dc8fddb --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/IdentifyTimeoutParameterWrapper.cs @@ -0,0 +1,31 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class IdentifyTimeoutParameterWrapper : AbstractRDMGetSetParameterWrapperEmptyGetRequestSetResponse + { + public IdentifyTimeoutParameterWrapper() : base(ERDM_Parameter.IDENTIFY_TIMEOUT) + { + } + public override string Name => "Identify Timeout"; + public override string Description => "This parameter is an extension to the IDENTIFY_DEVICE command in Section 10.11.1 of [RDM]. If this message is supported, then it extends the IDENTIFY_DEVICE function to have a specified timeout before the Identify mode stops."; + + protected override short getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToShort(ref parameterData); + } + + protected override byte[] getResponseValueToParameterData(short value) + { + return Tools.ValueToData(value); + } + + protected override short setRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToShort(ref parameterData); + } + + protected override byte[] setRequestValueToParameterData(short state) + { + return Tools.ValueToData(state); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ListTagsParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ListTagsParameterWrapper.cs new file mode 100644 index 0000000..bd6e4e0 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ListTagsParameterWrapper.cs @@ -0,0 +1,32 @@ +using Microsoft.Extensions.Primitives; +using System.Collections.Generic; +using System.Linq; + +namespace RDMSharp.ParameterWrapper +{ + public sealed class ListTagsParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest + { + public ListTagsParameterWrapper() : base(ERDM_Parameter.LIST_TAGS) + { + } + public override string Name => "List Tags"; + public override string Description => "Responder tags allow Controllers to associate textual metadata with RDM Responders\r\nManufacturers who wish to display tag data are reminded that it may contain non-displayable characters and that these must be handled appropriately. Users must be able to easily remove any tags they desire, including tags containing non-displayable characters.\r\nBecause it is possible that a Responder may have Responder tags that were set by a Controller using Unicode, it is encouraged that all Controllers implementing any of the Responder tag messages (LIST_TAGS, ADD_TAG, REMOVE_TAG, CHECK_TAG, CLEAR_TAG) should support Unicode. A Responder shall return the tags as they were originally set, regardless of encoding and regardless of what the current Controller supports."; + + protected override string[] getResponseParameterDataToValue(byte[] parameterData) + { + var rawString = Tools.DataToString(ref parameterData); + return rawString.Split((char)0).Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); + } + + protected override byte[] getResponseValueToParameterData(string[] value) + { + List data= new List(); + foreach (string s in value) + { + data.AddRange(Tools.ValueToData(s)); + data.Add(0); + } + return data.ToArray(); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ManufactorURLParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ManufactorURLParameterWrapper.cs new file mode 100644 index 0000000..e348538 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ManufactorURLParameterWrapper.cs @@ -0,0 +1,20 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class ManufactorURLParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest, IRDMBlueprintParameterWrapper + { + public ManufactorURLParameterWrapper() : base(ERDM_Parameter.MANUFACTURER_URL) + { + } + public override string Name => "Manufacturer URL"; + public override string Description => "The Manufacturer URL parameter message should provide a URL to the manufacturer’s website, accessible from the public Internet. This URL may be used by Controllers to build user-friendly interfaces that provide links, as necessary, to get further information about a product."; + + protected override string getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData); + } + protected override byte[] getResponseValueToParameterData(string label) + { + return Tools.ValueToData(label); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataJsonParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataJsonParameterWrapper.cs new file mode 100644 index 0000000..1a12476 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataJsonParameterWrapper.cs @@ -0,0 +1,34 @@ +using System; + +namespace RDMSharp.ParameterWrapper +{ + public sealed class MetadataJsonParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintParameterWrapper + { + public MetadataJsonParameterWrapper() : base(ERDM_Parameter.METADATA_JSON) + { + } + public override string Name => "Metadata JSON"; + public override string Description => "This parameter is used to request the Parameter Metadata Language description for a Manufacturer-Specific Parameter Message."; + + private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { ERDM_Parameter.SUPPORTED_PARAMETERS }; + public override ERDM_Parameter[] DescriptiveParameters => descriptiveParameters; + + protected override byte[] getRequestValueToParameterData(ERDM_Parameter parameter) + { + return Tools.ValueToData(parameter); + } + protected override ERDM_Parameter getRequestParameterDataToValue(byte[] parameterData) + { + return (ERDM_Parameter)Tools.DataToUShort(ref parameterData); + } + + protected override RDMMetadataJson getResponseParameterDataToValue(byte[] parameterData) + { + return RDMMetadataJson.FromPayloadData(parameterData); + } + protected override byte[] getResponseValueToParameterData(RDMMetadataJson metadataJson) + { + return metadataJson.ToPayloadData(); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataJsonURLParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataJsonURLParameterWrapper.cs new file mode 100644 index 0000000..55b6d9d --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataJsonURLParameterWrapper.cs @@ -0,0 +1,20 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class MetadataJsonURLParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest, IRDMBlueprintParameterWrapper + { + public MetadataJsonURLParameterWrapper() : base(ERDM_Parameter.METADATA_JSON_URL) + { + } + public override string Name => "Metadata JSON URL"; + public override string Description => "This parameter message returns a URL from which the JSON description of the parameter’s message structure can be retrieved from the public Internet.\nThe JSON description should be retrievable from this URL as a response to an HTTP GET request. A successful HTTP response shall contain the JSON description encoded in [UTF-8] in the body of the response. A successful HTTP response containing the JSON description should have a Content-Type of “application/schema-instance+json”. In addition to this Content-Type value, clients retrieving the JSON description shall also accept a Content-Type of “application/json”.\nTo reduce overhead on the wire, it is suggested that the URL be as short as possible.\nManufacturers should make every effort to ensure that all links that have been embedded into Responder firmware remain valid indefinitely, either directly or through the use of HTTP redirects."; + + protected override string getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData); + } + protected override byte[] getResponseValueToParameterData(string label) + { + return Tools.ValueToData(label); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataParameterVersionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataParameterVersionParameterWrapper.cs new file mode 100644 index 0000000..259b4ca --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/MetadataParameterVersionParameterWrapper.cs @@ -0,0 +1,34 @@ +using System; + +namespace RDMSharp.ParameterWrapper +{ + public sealed class MetadataParameterVersionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintParameterWrapper + { + public MetadataParameterVersionParameterWrapper() : base(ERDM_Parameter.METADATA_PARAMETER_VERSION) + { + } + public override string Name => "Metadata Parameter Version"; + public override string Description => "This parameter is used to get the version information for Parameter Messages for which the Responder has descriptions in the Parameter Metadata Language form.\r\nThis Parameter Message can be used by Controllers that may cache Parameter Metadata Language descriptions, to help determine whether or not to fetch the full Parameter Metadata Language description for each Manufacturer-Specific supported parameter."; + + private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { ERDM_Parameter.SUPPORTED_PARAMETERS }; + public override ERDM_Parameter[] DescriptiveParameters => descriptiveParameters; + + protected override byte[] getRequestValueToParameterData(ERDM_Parameter parameter) + { + return Tools.ValueToData(parameter); + } + protected override ERDM_Parameter getRequestParameterDataToValue(byte[] parameterData) + { + return (ERDM_Parameter)Tools.DataToUShort(ref parameterData); + } + + protected override RDMMetadataParameterVersion getResponseParameterDataToValue(byte[] parameterData) + { + return RDMMetadataParameterVersion.FromPayloadData(parameterData); + } + protected override byte[] getResponseValueToParameterData(RDMMetadataParameterVersion metadataParameterVersion) + { + return metadataParameterVersion.ToPayloadData(); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/PowerOffReadyParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/PowerOffReadyParameterWrapper.cs new file mode 100644 index 0000000..0732621 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/PowerOffReadyParameterWrapper.cs @@ -0,0 +1,21 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class PowerOffReadyParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest + { + public PowerOffReadyParameterWrapper() : base(ERDM_Parameter.POWER_OFF_READY) + { + } + public override string Name => "Power Off Ready"; + public override string Description => "This parameter is for devices that require a shutdown period so that they can enter an appropriate state before power is physically removed from the device.\r\nThis parameter indicates that the device is in an appropriate state such that power can be removed from the device without causing an issue.\r\nThis parameter may be used with the POWER_STATE message from Section 10.11.3 of [RDM], where the POWER_STATE message is used to initiate the shutdown. The POWER_OFF_READY parameter message can be used to determine if it is now appropriate to remove power from the device.\r\nDepending on the device, once a shutdown is initiated, the device may not be able to respond to any other messages. If the device is still able to respond after completing any shutdown processes, then it should queue a POWER_OFF_READY message."; + + protected override bool getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToBool(ref parameterData); + } + + protected override byte[] getResponseValueToParameterData(bool value) + { + return Tools.ValueToData(value); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ProductURLParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ProductURLParameterWrapper.cs new file mode 100644 index 0000000..aee76af --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ProductURLParameterWrapper.cs @@ -0,0 +1,20 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class ProductURLParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest, IRDMBlueprintParameterWrapper + { + public ProductURLParameterWrapper() : base(ERDM_Parameter.PRODUCT_URL) + { + } + public override string Name => "Product URL"; + public override string Description => "The Product URL parameter message should provide a link to access the product page on the manufacturer’s website, accessible from the public Internet. Manufacturers should make every effort to ensure this link does not change, since the message will be embedded into Responder firmware indefinitely. To reduce overhead on the wire, it is suggested that the URL be as short as possible. The URL may be used by Controllers to build user-friendly interfaces providing links to get further information about a product."; + + protected override string getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData); + } + protected override byte[] getResponseValueToParameterData(string label) + { + return Tools.ValueToData(label); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/RemoveTagParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/RemoveTagParameterWrapper.cs new file mode 100644 index 0000000..41d7ecd --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/RemoveTagParameterWrapper.cs @@ -0,0 +1,21 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class RemoveTagParameterWrapper : AbstractRDMSetParameterWrapperEmptyResponse + { + public RemoveTagParameterWrapper() : base(ERDM_Parameter.REMOVE_TAG) + { + } + public override string Name => "Remove Tag"; + public override string Description => "This parameter removes a tag from a Responder."; + + protected override string setRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData, 32); + } + + protected override byte[] setRequestValueToParameterData(string value) + { + return Tools.ValueToData(value, 32); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SensorTypeCustomDefinesParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SensorTypeCustomDefinesParameterWrapper.cs new file mode 100644 index 0000000..84c3d71 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SensorTypeCustomDefinesParameterWrapper.cs @@ -0,0 +1,45 @@ +using System; + +namespace RDMSharp.ParameterWrapper +{ + public sealed class SensorTypeCustomDefinesParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintParameterWrapper + { + public SensorTypeCustomDefinesParameterWrapper() : base(ERDM_Parameter.SENSOR_TYPE_CUSTOM) + { + } + public override string Name => "Sensor Type Custom Defines"; + public override string Description => "This parameter is used to obtain a text string that contains a custom friendly name that can be displayed to the user for Manufacturer-Specific Sensor Type Defines. Manufacturer-Specific Sensor Types exist in the range of 0x80-0xFF and shall not duplicate those included in other segments of the list of Sensor Types contained in [RDM] Table A-12.\r\nCustom Sensor Types shall be consistent across all products for a given manufacturer, in that a manufacturer shall not have multiple Defines for the same Sensor Type across different products with the same ESTA Manufacturer ID."; + + private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { }; + public override ERDM_Parameter[] DescriptiveParameters => descriptiveParameters; + + protected override byte[] getRequestValueToParameterData(byte id) + { + return Tools.ValueToData(id); + } + protected override byte getRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToByte(ref parameterData); + } + + protected override RDMSensorTypeCustomDefine getResponseParameterDataToValue(byte[] parameterData) + { + return RDMSensorTypeCustomDefine.FromPayloadData(parameterData); + } + protected override byte[] getResponseValueToParameterData(RDMSensorTypeCustomDefine sensorTypeCustomDefine) + { + return sensorTypeCustomDefine.ToPayloadData(); + } + + public override IRequestRange GetRequestRange(object value) + { + return SensorTypeCustomDefinesParameterWrapper.GetRequestRangeInternal(value); + } + internal static IRequestRange GetRequestRangeInternal(object value) + { + return new RequestRange(0x80, 0xff); + + throw new NotSupportedException($"There is no support for the Type: {value.GetType()}"); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SensorUnitCustomDefinesParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SensorUnitCustomDefinesParameterWrapper.cs new file mode 100644 index 0000000..e0d2c7e --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SensorUnitCustomDefinesParameterWrapper.cs @@ -0,0 +1,45 @@ +using System; + +namespace RDMSharp.ParameterWrapper +{ + public sealed class SensorUnitCustomDefinesParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintParameterWrapper + { + public SensorUnitCustomDefinesParameterWrapper() : base(ERDM_Parameter.SENSOR_UNIT_CUSTOM) + { + } + public override string Name => "Sensor Unit Custom Defines"; + public override string Description => "This parameter is used to obtain a text string that contains a custom friendly name that can be displayed to the user for Manufacturer-Specific Sensor Units. Manufacturer-Specific Sensor Units exist in the range of 0x80-0xFF and shall not duplicate those included in other segments of the list of Sensor Unit Defines contained in [RDM] Table A-13.\r\nA Custom Sensor Unit shall be consistent across all products for a given manufacturer, in that a manufacturer shall not have multiple Defines for the same sensor unit across different products with the same ESTA Manufacturer ID."; + + private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { }; + public override ERDM_Parameter[] DescriptiveParameters => descriptiveParameters; + + protected override byte[] getRequestValueToParameterData(byte id) + { + return Tools.ValueToData(id); + } + protected override byte getRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToByte(ref parameterData); + } + + protected override RDMSensorUnitCustomDefine getResponseParameterDataToValue(byte[] parameterData) + { + return RDMSensorUnitCustomDefine.FromPayloadData(parameterData); + } + protected override byte[] getResponseValueToParameterData(RDMSensorUnitCustomDefine sensorUnitCustomDefine) + { + return sensorUnitCustomDefine.ToPayloadData(); + } + + public override IRequestRange GetRequestRange(object value) + { + return SensorUnitCustomDefinesParameterWrapper.GetRequestRangeInternal(value); + } + internal static IRequestRange GetRequestRangeInternal(object value) + { + return new RequestRange(0x80, 0xff); + + throw new NotSupportedException($"There is no support for the Type: {value.GetType()}"); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SerialNumberParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SerialNumberParameterWrapper.cs new file mode 100644 index 0000000..7c85c16 --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/SerialNumberParameterWrapper.cs @@ -0,0 +1,20 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class SerialNumberParameterWrapper : AbstractRDMGetParameterWrapperEmptyRequest + { + public SerialNumberParameterWrapper() : base(ERDM_Parameter.SERIAL_NUMBER) + { + } + public override string Name => "Serial Number"; + public override string Description => "This parameter is used to obtain a text string that contains the manufacturer’s serial number for the device."; + + protected override string getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToString(ref parameterData); + } + protected override byte[] getResponseValueToParameterData(string label) + { + return Tools.ValueToData(label); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ShippingLockParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ShippingLockParameterWrapper.cs new file mode 100644 index 0000000..ff1858c --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/ShippingLockParameterWrapper.cs @@ -0,0 +1,31 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class ShippingLockParameterWrapper : AbstractRDMGetSetParameterWrapperEmptyGetRequestSetResponse + { + public ShippingLockParameterWrapper() : base(ERDM_Parameter.SHIPPING_LOCK) + { + } + public override string Name => "Shipping Lock"; + public override string Description => "Identifies the current state of the shipping lock. The SHIPPING_LOCK_STATE_PARTIALLY_LOCKED setting shall be returned when at least one, but not all axes of motion are in the locked state."; + + protected override ERDM_ShippingLockState getResponseParameterDataToValue(byte[] parameterData) + { + return Tools.DataToEnum(ref parameterData); + } + + protected override byte[] getResponseValueToParameterData(ERDM_ShippingLockState value) + { + return Tools.ValueToData(value); + } + + protected override ERDM_ShippingLockState setRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToEnum(ref parameterData); + } + + protected override byte[] setRequestValueToParameterData(ERDM_ShippingLockState state) + { + return Tools.ValueToData(state); + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/TestDataParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/TestDataParameterWrapper.cs new file mode 100644 index 0000000..9b33eac --- /dev/null +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-5/TestDataParameterWrapper.cs @@ -0,0 +1,51 @@ +namespace RDMSharp.ParameterWrapper +{ + public sealed class TestDataParameterWrapper : AbstractRDMGetSetParameterWrapper + { + public TestDataParameterWrapper() : base(ERDM_Parameter.TEST_DATA) + { + } + public override string Name => "Test Data"; + public override string Description => "This parameter is used to send RDM packets with a specific size and payload. It can be used to validate network data integrity, to test Responder packet handling, and for other troubleshooting and development operations.\r\nThis parameter should have no effect on Responder operation besides producing the RDM response.\r\nResponders are encouraged to support the full range of allowed PDLs for both GET_COMMAND_RESPONSE and SET_COMMAND_RESPONSE messages. If a Responder receives a message with a Pattern Length larger than it supports, it shall respond with a NACK Reason Code of NR_DATA_OUT_OF_RANGE."; + + protected override ushort getRequestParameterDataToValue(byte[] parameterData) + { + return Tools.DataToUShort(ref parameterData); + } + + protected override byte[] getRequestValueToParameterData(ushort value) + { + return Tools.ValueToData(value); + } + + protected override byte[] getResponseParameterDataToValue(byte[] parameterData) + { + return parameterData; + } + + protected override byte[] getResponseValueToParameterData(byte[] value) + { + return value; + } + + protected override byte[] setRequestParameterDataToValue(byte[] parameterData) + { + return parameterData; + } + + protected override byte[] setRequestValueToParameterData(byte[] value) + { + return value; + } + + protected override byte[] setResponseParameterDataToValue(byte[] parameterData) + { + return parameterData; + } + + protected override byte[] setResponseValueToParameterData(byte[] value) + { + return value; + } + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs index 4f28cc3..36f3e8e 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper() : base(ERDM_Parameter.BACKGROUND_QUEUED_STATUS_POLICY_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs index a12fb73..cae29e4 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class BindingAndControlFieldsParameterWrapper : AbstractRDMGetParameterWrapper + public sealed class BindingAndControlFieldsParameterWrapper : AbstractRDMGetParameterWrapperRanged { public BindingAndControlFieldsParameterWrapper() : base(ERDM_Parameter.BINDING_CONTROL_FIELDS) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs index 89e12f6..4a3eca1 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class DiscoveryStateParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class DiscoveryStateParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public DiscoveryStateParameterWrapper() : base(ERDM_Parameter.DISCOVERY_STATE) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs index 2df7431..2c0cc86 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointBackgroundDiscoveryParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class EndpointBackgroundDiscoveryParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public EndpointBackgroundDiscoveryParameterWrapper() : base(ERDM_Parameter.BACKGROUND_DISCOVERY) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs index 45cafc1..2b2d0f2 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointLabelParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class EndpointLabelParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public EndpointLabelParameterWrapper() : base(ERDM_Parameter.ENDPOINT_LABEL) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs index 3aafb3a..7b307cd 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointModeParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class EndpointModeParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public EndpointModeParameterWrapper() : base(ERDM_Parameter.ENDPOINT_MODE) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs index ce2599d..043aad8 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointRDMTrafficEnableParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class EndpointRDMTrafficEnableParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public EndpointRDMTrafficEnableParameterWrapper() : base(ERDM_Parameter.RDM_TRAFFIC_ENABLE) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs index c5b4d61..b9ce571 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs @@ -2,7 +2,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointTimingDescriptionParameterWrapper : AbstractRDMGetParameterWrapper, IRDMBlueprintDescriptionListParameterWrapper + public sealed class EndpointTimingDescriptionParameterWrapper : AbstractRDMGetParameterWrapperRanged, IRDMBlueprintDescriptionListParameterWrapper { public EndpointTimingDescriptionParameterWrapper() : base(ERDM_Parameter.ENDPOINT_TIMING_DESCRIPTION) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs index 3500514..c79bb67 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs @@ -4,7 +4,7 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointTimingParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class EndpointTimingParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public EndpointTimingParameterWrapper() : base(ERDM_Parameter.ENDPOINT_TIMING) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs index 4fb4690..33f1c33 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class EndpointToUniverseParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class EndpointToUniverseParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public EndpointToUniverseParameterWrapper() : base(ERDM_Parameter.ENDPOINT_TO_UNIVERSE) { diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs index c56fd19..c0e734a 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs @@ -1,6 +1,6 @@ namespace RDMSharp.ParameterWrapper { - public sealed class IdentifyEndpointParameterWrapper : AbstractRDMGetSetParameterWrapper + public sealed class IdentifyEndpointParameterWrapper : AbstractRDMGetSetParameterWrapperRanged { public IdentifyEndpointParameterWrapper() : base(ERDM_Parameter.IDENTIFY_ENDPOINT) { diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs index f590896..08542ed 100644 --- a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs @@ -8,6 +8,9 @@ public interface IRDMGetParameterWrapperRequest : IRDMParameterWrapper RDMMessage BuildGetRequestMessage(object value); byte[] GetRequestObjectToParameterData(object value); object GetRequestParameterDataToObject(byte[] parameterData); + } + public interface IRDMGetParameterWrapperRequestRanged : IRDMGetParameterWrapperRequest + { IRequestRange GetRequestRange(object value); } } \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest1.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest1.cs index 2f6e719..5ee53cd 100644 --- a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest1.cs +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest1.cs @@ -2,8 +2,6 @@ { public interface IRDMGetParameterWrapperRequest : IRDMGetParameterWrapperRequest, IRDMGetParameterWrapperRequestContravariance { - ERDM_Parameter[] DescriptiveParameters { get; } TRequest GetRequestParameterDataToValue(byte[] parameterData); - new IRequestRange GetRequestRange(object value); } } \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequestRanged.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequestRanged.cs new file mode 100644 index 0000000..8e59a0a --- /dev/null +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequestRanged.cs @@ -0,0 +1,8 @@ +namespace RDMSharp.ParameterWrapper +{ + public interface IRDMGetParameterWrapperRequestRanged : IRDMGetParameterWrapperRequest + { + ERDM_Parameter[] DescriptiveParameters { get; } + new IRequestRange GetRequestRange(object value); + } +} \ No newline at end of file diff --git a/RDMSharp/RDM/Device/AbstractRDMDevice.cs b/RDMSharp/RDM/Device/AbstractRDMDevice.cs index 340037e..c2453fc 100644 --- a/RDMSharp/RDM/Device/AbstractRDMDevice.cs +++ b/RDMSharp/RDM/Device/AbstractRDMDevice.cs @@ -750,7 +750,7 @@ public async Task UpdateParameterValue(ERDM_Parameter parameterId) case IRDMGetParameterWrapperWithEmptyGetRequest @emptyGetRequest: tasks.Add(processResponseMessage(await requestParameter(@emptyGetRequest.BuildGetRequestMessage()))); break; - case IRDMGetParameterWrapperRequest @byteGetRequest: + case IRDMGetParameterWrapperRequestRanged @byteGetRequest: foreach (ERDM_Parameter para in @byteGetRequest.DescriptiveParameters) { this.DeviceModel.ParameterValues.TryGetValue(para, out val); @@ -761,7 +761,7 @@ public async Task UpdateParameterValue(ERDM_Parameter parameterId) tasks.Add(processResponseMessage(await requestParameter(@byteGetRequest.BuildGetRequestMessage(r)))); break; - case IRDMGetParameterWrapperRequest @ushortGetRequest: + case IRDMGetParameterWrapperRequestRanged @ushortGetRequest: foreach (ERDM_Parameter para in @ushortGetRequest.DescriptiveParameters) { this.DeviceModel.ParameterValues.TryGetValue(para, out val); @@ -772,7 +772,7 @@ public async Task UpdateParameterValue(ERDM_Parameter parameterId) tasks.Add(processResponseMessage(await requestParameter(@ushortGetRequest.BuildGetRequestMessage(r)))); break; - case IRDMGetParameterWrapperRequest @uintGetRequest: + case IRDMGetParameterWrapperRequestRanged @uintGetRequest: foreach (ERDM_Parameter para in @uintGetRequest.DescriptiveParameters) { this.DeviceModel.ParameterValues.TryGetValue(para, out val); diff --git a/RDMSharp/RDM/Device/RDMDeviceModel.cs b/RDMSharp/RDM/Device/RDMDeviceModel.cs index b92e1a8..3a73af9 100644 --- a/RDMSharp/RDM/Device/RDMDeviceModel.cs +++ b/RDMSharp/RDM/Device/RDMDeviceModel.cs @@ -158,7 +158,7 @@ async Task doCurrentWrapper(IRDMParameterWrapper wrapper) if (request != null) await processMessage(await requestParameter(request)); return; - case IRDMGetParameterWrapperRequest getParameter: + case IRDMGetParameterWrapperRequestRanged getParameter: await doRange(getParameter); return; @@ -181,7 +181,7 @@ async Task doCurrentWrapper(IRDMParameterWrapper wrapper) await processMessage(await requestParameter(request)); - async Task doRange(IRDMGetParameterWrapperRequest getParameterWrapperRequest) + async Task doRange(IRDMGetParameterWrapperRequestRanged getParameterWrapperRequest) { ERDM_Parameter descriptive; object dVal = null; diff --git a/RDMSharp/RDM/Enum/ERDM_Parameter.cs b/RDMSharp/RDM/Enum/ERDM_Parameter.cs index ec7e4c4..5cd25dd 100644 --- a/RDMSharp/RDM/Enum/ERDM_Parameter.cs +++ b/RDMSharp/RDM/Enum/ERDM_Parameter.cs @@ -137,8 +137,32 @@ public enum ERDM_Parameter : ushort BACKGROUND_QUEUED_STATUS_POLICY = 0x090E, BACKGROUND_QUEUED_STATUS_POLICY_DESCRIPTION = 0x090F, + //E1.37-5 - 2024 + MANUFACTURER_URL = 0x00D0, + PRODUCT_URL = 0x00D1, + FIRMWARE_URL = 0x00D2, + SERIAL_NUMBER = 0x00D3, + DEVICE_INFO_OFFSTAGE = 0x00D4, + TEST_DATA = 0x0016, + COMMS_STATUS_NSC = 0x0017, + IDENTIFY_TIMEOUT = 0x1050, + POWER_OFF_READY = 0x1051, + SHIPPING_LOCK = 0x0650, + LIST_TAGS = 0x0651, + ADD_TAG = 0x0652, + REMOVE_TAG = 0x0653, + CHECK_TAG = 0x0654, + CLEAR_TAGS = 0x0655, + DEVICE_UNIT_NUMBER = 0x0656, + DMX_PERSONALITY_ID = 0x00E2, + SENSOR_TYPE_CUSTOM = 0x0210, + SENSOR_UNIT_CUSTOM = 0x0211, + METADATA_PARAMETER_VERSION = 0x0052, + METADATA_JSON = 0x0053, + METADATA_JSON_URL = 0x0054, + //SGM specific IDs - SERIAL_NUMBER = 0x8060, + SERIAL_NUMBER_SGM = 0x8060, REFRESH_RATE = 0x8620, //=0x8621, //=0x8622, diff --git a/RDMSharp/RDM/Enum/ERDM_ShippingLockState.cs b/RDMSharp/RDM/Enum/ERDM_ShippingLockState.cs new file mode 100644 index 0000000..d13a6c0 --- /dev/null +++ b/RDMSharp/RDM/Enum/ERDM_ShippingLockState.cs @@ -0,0 +1,19 @@ +namespace RDMSharp +{ + //E1.37-5 + public enum ERDM_ShippingLockState : byte + { + /// + /// All axes that are capable of being mechanically locked are free. + /// + UNLOCKED = 0x00, + /// + /// All axes that are capable of being mechanically locked are immobile. + /// + LOCKED = 0x01, + /// + /// Some axes are locked, restricted movement allowed. + /// + PARTIALLY_LOCKED = 0x02, + } +} diff --git a/RDMSharp/RDM/PayloadObject/GetCommunicationStatusNullStartCodeResponse.cs b/RDMSharp/RDM/PayloadObject/GetCommunicationStatusNullStartCodeResponse.cs new file mode 100644 index 0000000..ee5201d --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/GetCommunicationStatusNullStartCodeResponse.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class GetCommunicationStatusNullStartCodeResponse : AbstractRDMPayloadObject + { + public GetCommunicationStatusNullStartCodeResponse( + uint? additiveChecksumOfMostRecentPacket = null, + uint? packetCount = null, + ushort? mostRecentSlotCount = null, + ushort? minimumSlotCount = null, + ushort? maximumSlotCount = null, + uint? numberOfPacketsWithAnError = null) + { + AdditiveChecksumOfMostRecentPacket = additiveChecksumOfMostRecentPacket; + PacketCount = packetCount; + MostRecentSlotCount = mostRecentSlotCount; + MinimumSlotCount = minimumSlotCount; + MaximumSlotCount = maximumSlotCount; + NumberOfPacketsWithAnError = numberOfPacketsWithAnError; + } + + public uint? AdditiveChecksumOfMostRecentPacket { get; private set; } + public uint? PacketCount { get; private set; } + public ushort? MostRecentSlotCount { get; private set; } + public ushort? MinimumSlotCount { get; private set; } + public ushort? MaximumSlotCount { get; private set; } + public uint? NumberOfPacketsWithAnError { get; private set; } + public const int PDL = 0x13; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + if (AdditiveChecksumOfMostRecentPacket.HasValue) + b.AppendLine($"AdditiveChecksumOfMostRecentPacket: {AdditiveChecksumOfMostRecentPacket}"); + if (PacketCount.HasValue) + b.AppendLine($"PacketCount: {PacketCount}"); + if (MostRecentSlotCount.HasValue) + b.AppendLine($"MostRecentSlotCount: {MostRecentSlotCount}"); + if (MinimumSlotCount.HasValue) + b.AppendLine($"MinimumSlotCount: {MinimumSlotCount}"); + if (MaximumSlotCount.HasValue) + b.AppendLine($"MaximumSlotCount: {MaximumSlotCount}"); + if (NumberOfPacketsWithAnError.HasValue) + b.AppendLine($"NumberOfPacketsWithAnError: {NumberOfPacketsWithAnError}"); + return b.ToString(); + } + public static GetCommunicationStatusNullStartCodeResponse FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDL(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.COMMS_STATUS_NSC, PDL); + + return FromPayloadData(msg.ParameterData); + } + public static GetCommunicationStatusNullStartCodeResponse FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDL(data, PDL); + var flags=Tools.DataToBoolArray(ref data, 8); + var additiveChecksumOfMostRecentPacket = Tools.DataToUInt(ref data); + var packetCount = Tools.DataToUInt(ref data); + var mostRecentSlotCount = Tools.DataToUShort(ref data); + var minimumSlotCount = Tools.DataToUShort(ref data); + var maximumSlotCount = Tools.DataToUShort(ref data); + var numberOfPacketsWithAnError = Tools.DataToUInt(ref data); + var i = new GetCommunicationStatusNullStartCodeResponse( + additiveChecksumOfMostRecentPacket: flags[0] ? additiveChecksumOfMostRecentPacket : null, + packetCount: flags[1] ? packetCount : null, + mostRecentSlotCount: flags[2] ? mostRecentSlotCount : null, + minimumSlotCount: flags[3] ? minimumSlotCount : null, + maximumSlotCount: flags[4] ? maximumSlotCount : null, + numberOfPacketsWithAnError: flags[5] ? numberOfPacketsWithAnError : null + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData( + this.AdditiveChecksumOfMostRecentPacket.HasValue, + this.PacketCount.HasValue, + this.MostRecentSlotCount.HasValue, + this.MinimumSlotCount.HasValue, + this.MaximumSlotCount.HasValue, + this.NumberOfPacketsWithAnError.HasValue, + false, + false)); + data.AddRange(Tools.ValueToData(this.AdditiveChecksumOfMostRecentPacket)); + data.AddRange(Tools.ValueToData(this.PacketCount)); + data.AddRange(Tools.ValueToData(this.MostRecentSlotCount)); + data.AddRange(Tools.ValueToData(this.MinimumSlotCount)); + data.AddRange(Tools.ValueToData(this.MaximumSlotCount)); + data.AddRange(Tools.ValueToData(this.NumberOfPacketsWithAnError)); + return data.ToArray(); + } + } +} \ No newline at end of file diff --git a/RDMSharp/RDM/PayloadObject/GetDeviceInfoOffstageRequest.cs b/RDMSharp/RDM/PayloadObject/GetDeviceInfoOffstageRequest.cs new file mode 100644 index 0000000..c6f6986 --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/GetDeviceInfoOffstageRequest.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class GetDeviceInfoOffstageRequest : AbstractRDMPayloadObject + { + public GetDeviceInfoOffstageRequest( + byte rootPersonality = 1, + ushort subDeviceRequested = 0, + byte subDevicePersonalityRequested = 0) + { + RootPersonality = rootPersonality; + SubDeviceRequested = subDeviceRequested; + SubDevicePersonalityRequested = subDevicePersonalityRequested; + } + + public byte RootPersonality { get; private set; } + public ushort SubDeviceRequested { get; private set; } + public byte SubDevicePersonalityRequested { get; private set; } + public const int PDL = 4; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine($"RootPersonality: {RootPersonality}"); + b.AppendLine($"SubDeviceRequested: {SubDeviceRequested}"); + b.AppendLine($"SubDevicePersonalityRequested: {SubDevicePersonalityRequested}"); + + return b.ToString(); + } + public static GetDeviceInfoOffstageRequest FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDL(msg, ERDM_Command.GET_COMMAND, ERDM_Parameter.DEVICE_INFO_OFFSTAGE, PDL); + + return FromPayloadData(msg.ParameterData); + } + public static GetDeviceInfoOffstageRequest FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDL(data, PDL); + + var i = new GetDeviceInfoOffstageRequest( + rootPersonality: Tools.DataToByte(ref data), + subDeviceRequested: Tools.DataToUShort(ref data), + subDevicePersonalityRequested: Tools.DataToByte(ref data) + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.RootPersonality)); + data.AddRange(Tools.ValueToData(this.SubDeviceRequested)); + data.AddRange(Tools.ValueToData(this.SubDevicePersonalityRequested)); + return data.ToArray(); + } + } +} \ No newline at end of file diff --git a/RDMSharp/RDM/PayloadObject/GetDeviceInfoOffstageResponse.cs b/RDMSharp/RDM/PayloadObject/GetDeviceInfoOffstageResponse.cs new file mode 100644 index 0000000..21357db --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/GetDeviceInfoOffstageResponse.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class GetDeviceInfoOffstageResponse : AbstractRDMPayloadObject + { + public GetDeviceInfoOffstageResponse( + byte rootPersonality = 1, + ushort subDeviceRequested = 0, + byte subDevicePersonalityRequested = 0, + RDMDeviceInfo deviceInfo = null) + { + RootPersonality = rootPersonality; + SubDeviceRequested = subDeviceRequested; + SubDevicePersonalityRequested = subDevicePersonalityRequested; + DeviceInfo = deviceInfo; + } + + public byte RootPersonality { get; private set; } + public ushort SubDeviceRequested { get; private set; } + public byte SubDevicePersonalityRequested { get; private set; } + public RDMDeviceInfo DeviceInfo { get; private set; } + public const int PDL = 4 + RDMDeviceInfo.PDL; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine($"RootPersonality: {RootPersonality}"); + b.AppendLine($"SubDeviceRequested: {SubDeviceRequested}"); + b.AppendLine($"SubDevicePersonalityRequested: {SubDevicePersonalityRequested}"); + b.AppendLine($"DeviceInfo: {DeviceInfo}"); + + return b.ToString(); + } + public static GetDeviceInfoOffstageResponse FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDL(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.DEVICE_INFO_OFFSTAGE, PDL); + + return FromPayloadData(msg.ParameterData); + } + public static GetDeviceInfoOffstageResponse FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDL(data, PDL); + + var i = new GetDeviceInfoOffstageResponse( + rootPersonality: Tools.DataToByte(ref data), + subDeviceRequested: Tools.DataToUShort(ref data), + subDevicePersonalityRequested: Tools.DataToByte(ref data), + deviceInfo: RDMDeviceInfo.FromPayloadData(data) + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.RootPersonality)); + data.AddRange(Tools.ValueToData(this.SubDeviceRequested)); + data.AddRange(Tools.ValueToData(this.SubDevicePersonalityRequested)); + data.AddRange(Tools.ValueToData(this.DeviceInfo)); + return data.ToArray(); + } + } +} \ No newline at end of file diff --git a/RDMSharp/RDM/PayloadObject/RDMMetadataJson.cs b/RDMSharp/RDM/PayloadObject/RDMMetadataJson.cs new file mode 100644 index 0000000..b491b9e --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/RDMMetadataJson.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class RDMMetadataJson : AbstractRDMPayloadObject + { + public RDMMetadataJson( + ERDM_Parameter parameterId, + string json) + { + this.ParameterId = parameterId; + this.JSON = json; + } + + public ERDM_Parameter ParameterId { get; private set; } + public string JSON { get; private set; } + + public object Index => ParameterId; + + public const int PDL_MIN = 0x02; + public const int PDL_MAX = 0xE7; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine("RDMMetadataParameterVersion"); + b.AppendLine($"ParameterId: {ParameterId}"); + b.AppendLine($"JSON: {JSON}"); + + return b.ToString(); + } + + public static RDMMetadataJson FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDLRange(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.METADATA_JSON, PDL_MIN, PDL_MAX); + + return FromPayloadData(msg.ParameterData); + } + public static RDMMetadataJson FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDLRange(data, PDL_MIN, PDL_MAX); + + var parameterId = (ERDM_Parameter)Tools.DataToUShort(ref data); + var json = Tools.DataToString(ref data); + + var i = new RDMMetadataJson( + parameterId: parameterId, + json: json + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.ParameterId)); + data.AddRange(Tools.ValueToData(this.JSON)); + return data.ToArray(); + } + } +} diff --git a/RDMSharp/RDM/PayloadObject/RDMMetadataParameterVersion.cs b/RDMSharp/RDM/PayloadObject/RDMMetadataParameterVersion.cs new file mode 100644 index 0000000..66a98df --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/RDMMetadataParameterVersion.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class RDMMetadataParameterVersion : AbstractRDMPayloadObject + { + public RDMMetadataParameterVersion( + ERDM_Parameter parameterId, + ushort version) + { + this.ParameterId = parameterId; + this.Version = version; + } + + public ERDM_Parameter ParameterId { get; private set; } + public ushort Version { get; private set; } + + public object Index => ParameterId; + + public const int PDL = 0x04; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine("RDMMetadataParameterVersion"); + b.AppendLine($"ParameterId: {ParameterId}"); + b.AppendLine($"Version: {Version}"); + + return b.ToString(); + } + + public static RDMMetadataParameterVersion FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDL(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.METADATA_PARAMETER_VERSION, PDL); + + return FromPayloadData(msg.ParameterData); + } + public static RDMMetadataParameterVersion FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDL(data, PDL); + + var parameterId = (ERDM_Parameter)Tools.DataToUShort(ref data); + var version = Tools.DataToUShort(ref data); + + var i = new RDMMetadataParameterVersion( + parameterId: parameterId, + version: version + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.ParameterId)); + data.AddRange(Tools.ValueToData(this.Version)); + return data.ToArray(); + } + } +} diff --git a/RDMSharp/RDM/PayloadObject/RDMPersonalityId.cs b/RDMSharp/RDM/PayloadObject/RDMPersonalityId.cs new file mode 100644 index 0000000..167fe06 --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/RDMPersonalityId.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class RDMPersonalityId : AbstractRDMPayloadObject, IRDMPayloadObjectIndex + { + public RDMPersonalityId( + byte personalityId = 0, + ushort majorPersonalityId = 0, + ushort minorPersonalityId = 0) + { + this.PersonalityId = personalityId; + this.MinorPersonalityId = majorPersonalityId; + this.MinorPersonalityId = minorPersonalityId; + } + + public byte PersonalityId { get; private set; } + public ushort MajorPersonalityId { get; private set; } + public ushort MinorPersonalityId { get; private set; } + + public object MinIndex => (byte)1; + public object Index => PersonalityId; + + public const int PDL = 5; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine("RDMPersonalityId"); + b.AppendLine($"PersonalityId: {PersonalityId}"); + b.AppendLine($"MajorPersonalityId: 0x{MajorPersonalityId:X4}"); + b.AppendLine($"MinorPersonalityId: 0x{MinorPersonalityId:X4}"); + + return b.ToString(); + } + + public static RDMPersonalityId FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDL(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.DMX_PERSONALITY_ID, PDL); + + return FromPayloadData(msg.ParameterData); + } + public static RDMPersonalityId FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDL(data,PDL); + + var personalityId = Tools.DataToByte(ref data); + var majorPersonalityId = Tools.DataToUShort(ref data); + var minorPersonalityId = Tools.DataToUShort(ref data); + + var i = new RDMPersonalityId( + personalityId: personalityId, + majorPersonalityId: majorPersonalityId, + minorPersonalityId: minorPersonalityId + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.PersonalityId)); + data.AddRange(Tools.ValueToData(this.MajorPersonalityId)); + data.AddRange(Tools.ValueToData(this.MinorPersonalityId)); + return data.ToArray(); + } + } +} diff --git a/RDMSharp/RDM/PayloadObject/RDMSensorTypeCustomDefine.cs b/RDMSharp/RDM/PayloadObject/RDMSensorTypeCustomDefine.cs new file mode 100644 index 0000000..cbb7aa4 --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/RDMSensorTypeCustomDefine.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class RDMSensorTypeCustomDefine : AbstractRDMPayloadObject, IRDMPayloadObjectIndex + { + public RDMSensorTypeCustomDefine( + byte id, + string label) + { + this.Id = id; + this.Label = label; + } + + public byte Id { get; private set; } + public string Label { get; private set; } + + public object MinIndex => (byte)0x80; + public object Index => Id; + + public const int PDL_MIN = 0x01; + public const int PDL_MAX = 0x21; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine("RDMSensorTypeCustomDefine"); + b.AppendLine($"Id: 0x{Id:X2}"); + b.AppendLine($"Label: {Label}"); + + return b.ToString(); + } + + public static RDMSensorTypeCustomDefine FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDLRange(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.SENSOR_TYPE_CUSTOM, PDL_MIN, PDL_MAX); + + return FromPayloadData(msg.ParameterData); + } + public static RDMSensorTypeCustomDefine FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDLRange(data, PDL_MIN, PDL_MAX); + + var id = Tools.DataToByte(ref data); + var label = Tools.DataToString(ref data,32); + + var i = new RDMSensorTypeCustomDefine( + id: id, + label: label + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.Id)); + data.AddRange(Tools.ValueToData(this.Label)); + return data.ToArray(); + } + } +} diff --git a/RDMSharp/RDM/PayloadObject/RDMSensorUnitCustomDefine.cs b/RDMSharp/RDM/PayloadObject/RDMSensorUnitCustomDefine.cs new file mode 100644 index 0000000..b4ccd48 --- /dev/null +++ b/RDMSharp/RDM/PayloadObject/RDMSensorUnitCustomDefine.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Text; + +namespace RDMSharp +{ + public class RDMSensorUnitCustomDefine : AbstractRDMPayloadObject, IRDMPayloadObjectIndex + { + public RDMSensorUnitCustomDefine( + byte id, + string label) + { + this.Id = id; + this.Label = label; + } + + public byte Id { get; private set; } + public string Label { get; private set; } + + public object MinIndex => (byte)0x80; + public object Index => Id; + + public const int PDL_MIN = 0x01; + public const int PDL_MAX = 0x21; + + public override string ToString() + { + StringBuilder b = new StringBuilder(); + b.AppendLine("RDMSensorUnitCustomDefine"); + b.AppendLine($"Id: 0x{Id:X2}"); + b.AppendLine($"Label: {Label}"); + + return b.ToString(); + } + + public static RDMSensorUnitCustomDefine FromMessage(RDMMessage msg) + { + RDMMessageInvalidException.ThrowIfInvalidPDLRange(msg, ERDM_Command.GET_COMMAND_RESPONSE, ERDM_Parameter.SENSOR_UNIT_CUSTOM, PDL_MIN, PDL_MAX); + + return FromPayloadData(msg.ParameterData); + } + public static RDMSensorUnitCustomDefine FromPayloadData(byte[] data) + { + RDMMessageInvalidPDLException.ThrowIfInvalidPDLRange(data, PDL_MIN, PDL_MAX); + + var id = Tools.DataToByte(ref data); + var label = Tools.DataToString(ref data,32); + + var i = new RDMSensorUnitCustomDefine( + id: id, + label: label + ); + + return i; + } + public override byte[] ToPayloadData() + { + List data = new List(); + data.AddRange(Tools.ValueToData(this.Id)); + data.AddRange(Tools.ValueToData(this.Label)); + return data.ToArray(); + } + } +} diff --git a/RDMSharp/RDM/RDMMessageInvalidPDLException.cs b/RDMSharp/RDM/RDMMessageInvalidPDLException.cs index 70bbb41..33b36cc 100644 --- a/RDMSharp/RDM/RDMMessageInvalidPDLException.cs +++ b/RDMSharp/RDM/RDMMessageInvalidPDLException.cs @@ -19,7 +19,7 @@ private RDMMessageInvalidPDLException(byte[] payloadData, string message) : base } internal static void ThrowIfInvalidPDL(byte[] payloadData, params int[] expectedPDL) { - if (!expectedPDL.Contains(payloadData.Length)) throw new RDMMessageInvalidPDLException(payloadData, $"PayloadDataLength is fitting the given Values {string.Join(";", expectedPDL)}"); + if (!expectedPDL.Contains(payloadData.Length)) throw new RDMMessageInvalidPDLException(payloadData, $"PayloadDataLength {payloadData.Length} isn't fitting the given Values {string.Join(";", expectedPDL)}"); } internal static void ThrowIfInvalidPDL(RDMMessage msg, params int[] expectedPDL) { @@ -30,12 +30,12 @@ internal static void ThrowIfInvalidPDL(RDMMessage msg, params int[] expectedPDL) ArgumentNullException.ThrowIfNull(msg); #endif - if (!expectedPDL.Contains(msg.PDL)) throw new RDMMessageInvalidPDLException(msg, $"PayloadDataLength is fitting the given Values {string.Join(";", expectedPDL)}"); + if (!expectedPDL.Contains(msg.PDL)) throw new RDMMessageInvalidPDLException(msg, $"PayloadDataLength {msg.PDL} isn't fitting the given Values {string.Join(";", expectedPDL)}"); } internal static void ThrowIfInvalidPDLRange(byte[] payloadData, int expectedMinPDL, int expectedMaxPDL) { - if (payloadData.Length < expectedMinPDL) throw new RDMMessageInvalidPDLException(payloadData, $"PayloadDataLength is fitting the given Range {payloadData.Length} < {expectedMinPDL}"); - if (payloadData.Length > expectedMaxPDL) throw new RDMMessageInvalidPDLException(payloadData, $"PayloadDataLength is fitting the given Range {payloadData.Length} > {expectedMaxPDL}"); + if (payloadData.Length < expectedMinPDL) throw new RDMMessageInvalidPDLException(payloadData, $"PayloadDataLength {payloadData.Length} isn't fitting the given Range {payloadData.Length} < {expectedMinPDL}"); + if (payloadData.Length > expectedMaxPDL) throw new RDMMessageInvalidPDLException(payloadData, $"PayloadDataLength {payloadData.Length} isn't fitting the given Range {payloadData.Length} > {expectedMaxPDL}"); } internal static void ThrowIfInvalidPDLRange(RDMMessage msg, int expectedMinPDL, int expectedMaxPDL) { @@ -46,8 +46,8 @@ internal static void ThrowIfInvalidPDLRange(RDMMessage msg, int expectedMinPDL, ArgumentNullException.ThrowIfNull(msg); #endif - if (msg.PDL < expectedMinPDL) throw new RDMMessageInvalidPDLException(msg, $"PayloadDataLength is fitting the given Range {msg.PDL} < {expectedMinPDL}"); - if (msg.PDL > expectedMaxPDL) throw new RDMMessageInvalidPDLException(msg, $"PayloadDataLength is fitting the given Range {msg.PDL} > {expectedMaxPDL}"); + if (msg.PDL < expectedMinPDL) throw new RDMMessageInvalidPDLException(msg, $"PayloadDataLength {msg.PDL} isn't fitting the given Range {msg.PDL} < {expectedMinPDL}"); + if (msg.PDL > expectedMaxPDL) throw new RDMMessageInvalidPDLException(msg, $"PayloadDataLength {msg.PDL} isn't fitting the given Range {msg.PDL} > {expectedMaxPDL}"); } } } \ No newline at end of file diff --git a/RDMSharp/RDM/Tools.cs b/RDMSharp/RDM/Tools.cs index 7dc5be4..4214ccc 100644 --- a/RDMSharp/RDM/Tools.cs +++ b/RDMSharp/RDM/Tools.cs @@ -1,4 +1,6 @@ -using System; +using org.dmxc.wkdt.Light.RDM; +using System; +using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; @@ -317,7 +319,8 @@ public static string DataToString(ref byte[] data, int take = 0) data = Array.Empty(); } return res; - } + } + public static bool DataToBool(ref byte[] data) { const int length = 1; diff --git a/RDMSharpTests/RDM/ParameterWrappersTest.cs b/RDMSharpTests/RDM/ParameterWrappersTest.cs index 5f783c4..ab29ac9 100644 --- a/RDMSharpTests/RDM/ParameterWrappersTest.cs +++ b/RDMSharpTests/RDM/ParameterWrappersTest.cs @@ -107,6 +107,31 @@ public class ParameterWrappersTest ERDM_Parameter.DNS_HOSTNAME, ERDM_Parameter.DNS_DOMAIN_NAME }; + private static readonly ERDM_Parameter[] e1_37_5Parameters = new ERDM_Parameter[] + { + ERDM_Parameter.MANUFACTURER_URL, + ERDM_Parameter.PRODUCT_URL, + ERDM_Parameter.FIRMWARE_URL, + ERDM_Parameter.SERIAL_NUMBER, + ERDM_Parameter.DEVICE_INFO_OFFSTAGE, + ERDM_Parameter.TEST_DATA, + ERDM_Parameter.COMMS_STATUS_NSC, + ERDM_Parameter.IDENTIFY_TIMEOUT, + ERDM_Parameter.POWER_OFF_READY, + ERDM_Parameter.SHIPPING_LOCK, + ERDM_Parameter.LIST_TAGS, + ERDM_Parameter.ADD_TAG, + ERDM_Parameter.REMOVE_TAG, + ERDM_Parameter.CHECK_TAG, + ERDM_Parameter.CLEAR_TAGS, + ERDM_Parameter.DEVICE_UNIT_NUMBER, + ERDM_Parameter.DMX_PERSONALITY_ID, + ERDM_Parameter.SENSOR_TYPE_CUSTOM, + ERDM_Parameter.SENSOR_UNIT_CUSTOM, + ERDM_Parameter.METADATA_PARAMETER_VERSION, + ERDM_Parameter.METADATA_JSON, + ERDM_Parameter.METADATA_JSON_URL + }; private static readonly ERDM_Parameter[] e1_37_7Parameters = new ERDM_Parameter[] { ERDM_Parameter.ENDPOINT_LIST, @@ -135,7 +160,7 @@ public class ParameterWrappersTest }; private static readonly ERDM_Parameter[] sgmParameters = new ERDM_Parameter[] { - ERDM_Parameter.SERIAL_NUMBER, + ERDM_Parameter.SERIAL_NUMBER_SGM, ERDM_Parameter.REFRESH_RATE, ERDM_Parameter.DIMMING_CURVE, ERDM_Parameter.FAN_MODE, @@ -163,7 +188,7 @@ public void Setup() [Test] public void CheckAllParametersArDefined() { - var parameterLeft = parameters.Except(e1_20Parameters).Except(e1_37_1Parameters).Except(e1_37_2Parameters).Except(e1_37_7Parameters).Except(e1_33Parameters).Except(sgmParameters).ToList(); + var parameterLeft = parameters.Except(e1_20Parameters).Except(e1_37_1Parameters).Except(e1_37_2Parameters).Except(e1_37_5Parameters).Except(e1_37_7Parameters).Except(e1_33Parameters).Except(sgmParameters).ToList(); Assert.Multiple(() => { @@ -190,6 +215,12 @@ public void CheckE1_37_2WrappersDefined() Assert.That(notDefinedParameters, Is.Empty, $"The not defined Parameters:{Environment.NewLine}{ParameterWrappersTest.ParametersToString(notDefinedParameters)}"); } [Test] + public void CheckE1_37_5WrappersDefined() + { + var notDefinedParameters = e1_37_5Parameters.Except(parameterWrappers.Select(pw => pw.Parameter)).ToArray(); + Assert.That(notDefinedParameters, Is.Empty, $"The not defined Parameters:{Environment.NewLine}{ParameterWrappersTest.ParametersToString(notDefinedParameters)}"); + } + [Test] public void CheckE1_37_7WrappersDefined() { var notDefinedParameters = e1_37_7Parameters.Except(parameterWrappers.Select(pw => pw.Parameter)).ToArray(); @@ -236,6 +267,9 @@ public void AssemblyListenerTest() foreach (ERDM_Parameter parameter in e1_37_2Parameters) Assert.That(parameterWrappers.Where(pw => pw.Parameter == parameter).ToList(), Has.Count.EqualTo(1), $"There are more then one ParameterWrapper for the Parameter: {parameter}"); + + foreach (ERDM_Parameter parameter in e1_37_5Parameters) + Assert.That(parameterWrappers.Where(pw => pw.Parameter == parameter).ToList(), Has.Count.EqualTo(1), $"There are more then one ParameterWrapper for the Parameter: {parameter}"); foreach (ERDM_Parameter parameter in e1_37_7Parameters) Assert.That(parameterWrappers.Where(pw => pw.Parameter == parameter).ToList(), Has.Count.EqualTo(1), $"There are more then one ParameterWrapper for the Parameter: {parameter}"); @@ -246,7 +280,7 @@ public void AssemblyListenerTest() foreach (ERDM_Parameter parameter in sgmParameters) Assert.That(parameterWrappers.Where(pw => pw.Parameter == parameter).ToList(), Has.Count.EqualTo(1), $"There are more then one ParameterWrapper for the Parameter: {parameter}"); }); - Assert.That(e1_20Parameters.Length + e1_37_1Parameters.Length + e1_37_2Parameters.Length + e1_37_7Parameters.Length + e1_33Parameters.Length + sgmParameters.Length, Is.EqualTo(parameterWrappers.Count)); + Assert.That(e1_20Parameters.Length + e1_37_1Parameters.Length + e1_37_2Parameters.Length + e1_37_5Parameters.Length + e1_37_7Parameters.Length + e1_33Parameters.Length + sgmParameters.Length, Is.EqualTo(parameterWrappers.Count)); } [Test] public void GenericParameterWrapperTestFwBw() @@ -283,6 +317,11 @@ public void ParameterWrapperE1_37_2TestFwBw() TestParameterWrapperForwardBackwardSerialization(e1_37_2Parameters.Select(p => manager.GetRDMParameterWrapperByID(p))); } [Test] + public void ParameterWrapperE1_37_5TestFwBw() + { + TestParameterWrapperForwardBackwardSerialization(e1_37_5Parameters.Select(p => manager.GetRDMParameterWrapperByID(p))); + } + [Test] public void ParameterWrapperE1_37_7TestFwBw() { TestParameterWrapperForwardBackwardSerialization(e1_37_7Parameters.Select(p => manager.GetRDMParameterWrapperByID(p))); @@ -294,298 +333,323 @@ public void ParameterWrapperSGMTestFwBw() } private static void TestParameterWrapperForwardBackwardSerialization(IEnumerable wrappers) { - object value = getValue(null!); - foreach (var wrapper in wrappers) + Assert.Multiple(() => { - byte tested = 0; - - if (wrapper is IRDMGetParameterWrapperRequest getRequest) + object value = getValue(null!); + foreach (var wrapper in wrappers) { - tested++; - value = getValue(getRequest.GetRequestType); - value.GetHashCode();//For Coverage; + byte tested = 0; - Assert.That(value, Is.Not.Null); - var data = getRequest.GetRequestObjectToParameterData(value); - var res = getRequest.GetRequestParameterDataToObject(data); - Assert.That(res, Is.EqualTo(value)); + if (wrapper is IRDMGetParameterWrapperRequest getRequest) + { + tested++; + value = getValue(getRequest.GetRequestType); + Assert.That(value, Is.Not.Null, $"Wrapper {wrapper}"); + value.GetHashCode();//For Coverage; - RDMMessage buildGetRequestMessage = getRequest.BuildGetRequestMessage(value); - Assert.That(buildGetRequestMessage, Is.Not.Null); - } - if (wrapper is IRDMGetParameterWrapperResponse getResponse) - { - tested++; - value = getValue(getResponse.GetResponseType); - value.GetHashCode();//For Coverage; + var data = getRequest.GetRequestObjectToParameterData(value); + var res = getRequest.GetRequestParameterDataToObject(data); + Assert.That(res, Is.EqualTo(value), $"Wrapper {wrapper}"); - Assert.That(value, Is.Not.Null); - var data = getResponse.GetResponseObjectToParameterData(value); - var res = getResponse.GetResponseParameterDataToObject(data); - Assert.That(res, Is.EqualTo(value)); + RDMMessage buildGetRequestMessage = getRequest.BuildGetRequestMessage(value); + Assert.That(buildGetRequestMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMGetParameterWrapperResponse getResponse) + { + tested++; + value = getValue(getResponse.GetResponseType); + Assert.That(value, Is.Not.Null, $"Wrapper {wrapper}"); + value.GetHashCode();//For Coverage; - RDMMessage buildGetResponseMessage = getResponse.BuildGetResponseMessage(value); - Assert.That(buildGetResponseMessage, Is.Not.Null); - } - if (wrapper is IRDMSetParameterWrapperRequest setRequest) - { - tested++; - value = getValue(setRequest.SetRequestType); - value.GetHashCode();//For Coverage; + var data = getResponse.GetResponseObjectToParameterData(value); + var res = getResponse.GetResponseParameterDataToObject(data); + Assert.That(res, Is.EqualTo(value), $"Wrapper {wrapper}"); - Assert.That(value, Is.Not.Null); - var data = setRequest.SetRequestObjectToParameterData(value); - var res = setRequest.SetRequestParameterDataToObject(data); - Assert.That(res, Is.EqualTo(value)); + RDMMessage buildGetResponseMessage = getResponse.BuildGetResponseMessage(value); + Assert.That(buildGetResponseMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMSetParameterWrapperRequest setRequest) + { + tested++; + value = getValue(setRequest.SetRequestType); + Assert.That(value, Is.Not.Null, $"Wrapper {wrapper}"); + value.GetHashCode();//For Coverage; - RDMMessage buildSetRequestMessage = setRequest.BuildSetRequestMessage(value); - Assert.That(buildSetRequestMessage, Is.Not.Null); - } - if (wrapper is IRDMSetParameterWrapperResponse setResponse) - { - tested++; - value = getValue(setResponse.SetResponseType); - value.GetHashCode();//For Coverage; + var data = setRequest.SetRequestObjectToParameterData(value); + var res = setRequest.SetRequestParameterDataToObject(data); + Assert.That(res, Is.EqualTo(value), $"Wrapper {wrapper}"); - Assert.That(value, Is.Not.Null); - var data = setResponse.SetResponseObjectToParameterData(value); - var res = setResponse.SetResponseParameterDataToObject(data); - Assert.That(res, Is.EqualTo(value)); + RDMMessage buildSetRequestMessage = setRequest.BuildSetRequestMessage(value); + Assert.That(buildSetRequestMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMSetParameterWrapperResponse setResponse) + { + tested++; + value = getValue(setResponse.SetResponseType); + Assert.That(value, Is.Not.Null, $"Wrapper {wrapper}"); + value.GetHashCode();//For Coverage; + var data = setResponse.SetResponseObjectToParameterData(value); + var res = setResponse.SetResponseParameterDataToObject(data); + Assert.That(res, Is.EqualTo(value), $"Wrapper {wrapper}"); - RDMMessage buildSetResponseMessage = setResponse.BuildSetResponseMessage(value); - Assert.That(buildSetResponseMessage, Is.Not.Null); - } - if (wrapper is IRDMGetParameterWrapperWithEmptyGetRequest iGetParameterWrapperEmptyRequest) - { - tested++; - RDMMessage buildGetRequestMessage = iGetParameterWrapperEmptyRequest.BuildGetRequestMessage(); - Assert.That(buildGetRequestMessage, Is.Not.Null); - } - if (wrapper is IRDMGetParameterWrapperWithEmptyGetResponse iGetParameterWrapperEmptyResponse) - { - tested++; - RDMMessage buildGetResponseMessage = iGetParameterWrapperEmptyResponse.BuildGetResponseMessage(); - Assert.That(buildGetResponseMessage, Is.Not.Null); - } - if (wrapper is IRDMSetParameterWrapperWithEmptySetRequest iSetParameterWrapperEmptyRequest) - { - tested++; - RDMMessage buildSetRequestMessage = iSetParameterWrapperEmptyRequest.BuildSetRequestMessage(); - Assert.That(buildSetRequestMessage, Is.Not.Null); - } - if (wrapper is IRDMSetParameterWrapperWithEmptySetResponse iSetParameterWrapperEmptyResponse) - { - tested++; - RDMMessage buildSetResponseMessage = iSetParameterWrapperEmptyResponse.BuildSetResponseMessage(); - Assert.That(buildSetResponseMessage, Is.Not.Null); + + RDMMessage buildSetResponseMessage = setResponse.BuildSetResponseMessage(value); + Assert.That(buildSetResponseMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMGetParameterWrapperWithEmptyGetRequest iGetParameterWrapperEmptyRequest) + { + tested++; + RDMMessage buildGetRequestMessage = iGetParameterWrapperEmptyRequest.BuildGetRequestMessage(); + Assert.That(buildGetRequestMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMGetParameterWrapperWithEmptyGetResponse iGetParameterWrapperEmptyResponse) + { + tested++; + RDMMessage buildGetResponseMessage = iGetParameterWrapperEmptyResponse.BuildGetResponseMessage(); + Assert.That(buildGetResponseMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMSetParameterWrapperWithEmptySetRequest iSetParameterWrapperEmptyRequest) + { + tested++; + RDMMessage buildSetRequestMessage = iSetParameterWrapperEmptyRequest.BuildSetRequestMessage(); + Assert.That(buildSetRequestMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is IRDMSetParameterWrapperWithEmptySetResponse iSetParameterWrapperEmptyResponse) + { + tested++; + RDMMessage buildSetResponseMessage = iSetParameterWrapperEmptyResponse.BuildSetResponseMessage(); + Assert.That(buildSetResponseMessage, Is.Not.Null, $"Wrapper {wrapper}"); + } + if (wrapper is AbstractRDMParameterWrapper abstractRDMParameterWrapperEmpty4) + { + tested++; + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetRequestObjectToParameterData(null); }); + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetRequestParameterDataToObject(null); }); + + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetResponseObjectToParameterData(null); }); + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetResponseParameterDataToObject(null); }); + + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetRequestObjectToParameterData(null); }); + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetRequestParameterDataToObject(null); }); + + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetResponseObjectToParameterData(null); }); + Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetResponseParameterDataToObject(null); }); + } + Assert.That(tested, Is.AtLeast(2), $"At {wrapper}"); } - if (wrapper is AbstractRDMParameterWrapper abstractRDMParameterWrapperEmpty4) + + static object getValue(Type type) { - tested++; - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetRequestObjectToParameterData(null); }); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetRequestParameterDataToObject(null); }); + if (type == typeof(string)) + return "Test String"; + if (type == typeof(bool)) + return true; + if (type == typeof(sbyte)) + return (sbyte)55; + if (type == typeof(byte)) + return (byte)99; + if (type == typeof(short)) + return (short)-0x1234; + if (type == typeof(ushort)) + return (ushort)1523; + if (type == typeof(ushort?)) + return (ushort?)1523; + if (type == typeof(int)) + return (int)-0x123334; + if (type == typeof(uint)) + return (uint)154523; + if (type == typeof(byte[])) + return new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; + if (type == typeof(RDMRealTimeClock)) + return new RDMRealTimeClock(DateTime.Now); + if (type == typeof(RDMDMXPersonality)) + return new RDMDMXPersonality(3, 4); + if (type == typeof(RDMCurve)) + return new RDMCurve(3, 4); + if (type == typeof(RDMPresetPlayback)) + return new RDMPresetPlayback(3, 200); + if (type == typeof(RDMSensorValue)) + return new RDMSensorValue(3, 200); + if (type == typeof(RDMPresetStatus)) + return new RDMPresetStatus(3, 200); + if (type == typeof(RDMCommunicationStatus)) + return new RDMCommunicationStatus(3, 200); + if (type == typeof(RDMDeviceInfo)) + return new RDMDeviceInfo(3, 200); + if (type == typeof(RDMDMXPersonalityDescription)) + return new RDMDMXPersonalityDescription(3, 200); + if (type == typeof(RDMParameterDescription)) + return new RDMParameterDescription(3, 200); + if (type == typeof(RDMProxiedDeviceCount)) + return new RDMProxiedDeviceCount(3); + if (type == typeof(RDMProxiedDevices)) + return new RDMProxiedDevices([new UID((ushort)EManufacturer.Swisson_AG, 1342143), new UID((ushort)EManufacturer.DMXControlProjects_eV, 334412), new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)]); + if (type == typeof(RDMSelfTestDescription)) + return new RDMSelfTestDescription(3); + if (type == typeof(RDMSensorDefinition)) + return new RDMSensorDefinition(3); + if (type == typeof(RDMSlotDescription)) + return new RDMSlotDescription(3); + if (type == typeof(GetBrokerStatusResponse)) + return new GetBrokerStatusResponse(true, ERDM_BrokerStatus.ACTIVE); + if (type == typeof(GetSetComponentScope)) + return new GetSetComponentScope(3, scopeString: "eqadeqew", new IPv4Address(123, 45, 22, 4)); + if (type == typeof(TCPCommsEntry)) + return new TCPCommsEntry("eqadeqew"); + if (type == typeof(RDMCurveDescription)) + return new RDMCurveDescription(3); + if (type == typeof(RDMDimmerInfo)) + return new RDMDimmerInfo(3, 200); + if (type == typeof(RDMDMXBlockAddress)) + return new RDMDMXBlockAddress(3, 200); + if (type == typeof(RDMDMX_xxxx_Mode)) + return new RDMDMX_xxxx_Mode(3, 200); + if (type == typeof(SetLockPinRequest)) + return new SetLockPinRequest(3, 200); + if (type == typeof(RDMLockStateDescription)) + return new RDMLockStateDescription(3); + if (type == typeof(GetLockStateResponse)) + return new GetLockStateResponse(3, 200); + if (type == typeof(RDMMinimumLevel)) + return new RDMMinimumLevel(3, 200); + if (type == typeof(RDMModulationFrequencyDescription)) + return new RDMModulationFrequencyDescription(3, 200); + if (type == typeof(RDMModulationFrequency)) + return new RDMModulationFrequency(3, 200); + if (type == typeof(RDMOutputResponseTimeDescription)) + return new RDMOutputResponseTimeDescription(3); + if (type == typeof(RDMOutputResponseTime)) + return new RDMOutputResponseTime(3, 200); + if (type == typeof(SetLockStateRequest)) + return new SetLockStateRequest(12314, 23); + if (type == typeof(RDMPresetInfo)) + return new RDMPresetInfo(true, true, true, true, true, true, 12354, 21567, 7432, 23467, 7632, 24567, 7532, 23456, ushort.MaxValue, 23456, 6543, ushort.MaxValue, 5432); + if (type == typeof(GetInterfaceListResponse)) + return new GetInterfaceListResponse(new InterfaceDescriptor(1, 444), new InterfaceDescriptor(4, 32)); + if (type == typeof(GetInterfaceNameResponse)) + return new GetInterfaceNameResponse(2, "Test"); + if (type == typeof(GetHardwareAddressResponse)) + return new GetHardwareAddressResponse(9, new MACAddress(12, 34, 56, 88, 55, 32)); + if (type == typeof(GetSetIPV4_xxx_Mode)) + return new GetSetIPV4_xxx_Mode(2, true); + if (type == typeof(GetIPv4CurrentAddressResponse)) + return new GetIPv4CurrentAddressResponse(4, new IPv4Address(123, 45, 22, 4), 12, ERDM_DHCPStatusMode.ACTIVE); + if (type == typeof(GetSetIPv4StaticAddress)) + return new GetSetIPv4StaticAddress(3, new IPv4Address(123, 45, 22, 4), 20); + if (type == typeof(GetSetIPv4DefaultRoute)) + return new GetSetIPv4DefaultRoute(5, new IPv4Address(153, 49, 122, 234)); + if (type == typeof(GetSetIPv4NameServer)) + return new GetSetIPv4NameServer(2, new IPv4Address(123, 45, 22, 4)); + if (type == typeof(GetEndpointListResponse)) + return new GetEndpointListResponse(1, new EndpointDescriptor(4, ERDM_EndpointType.PHYSICAL), new EndpointDescriptor(7, ERDM_EndpointType.VIRTUAL)); + if (type == typeof(GetSetIdentifyEndpoint)) + return new GetSetIdentifyEndpoint(3, true); + if (type == typeof(GetSetEndpointToUniverse)) + return new GetSetEndpointToUniverse(1, 55); + if (type == typeof(GetSetEndpointMode)) + return new GetSetEndpointMode(1, ERDM_EndpointMode.OUTPUT); + if (type == typeof(GetSetEndpointLabel)) + return new GetSetEndpointLabel(3, "Test Endpoint Label"); + if (type == typeof(GetSetEndpointRDMTrafficEnable)) + return new GetSetEndpointRDMTrafficEnable(56, true); + if (type == typeof(GetDiscoveryStateResponse)) + return new GetDiscoveryStateResponse(1, 545, ERDM_DiscoveryState.NOT_ACTIVE); + if (type == typeof(GetSetEndpointBackgroundDiscovery)) + return new GetSetEndpointBackgroundDiscovery(1, true); + if (type == typeof(GetEndpointTimingResponse)) + return new GetEndpointTimingResponse(1, 44, 55); + if (type == typeof(GetEndpointTimingDescriptionResponse)) + return new GetEndpointTimingDescriptionResponse(1, "Test Timing"); + if (type == typeof(GetEndpointRespondersResponse)) + return new GetEndpointRespondersResponse(1, [new UID((ushort)EManufacturer.Swisson_AG, 1342143), new UID((ushort)EManufacturer.DMXControlProjects_eV, 334412), new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)]); + if (type == typeof(GetEndpointResponderListChangeResponse)) + return new GetEndpointResponderListChangeResponse(1, 55); + if (type == typeof(GetBindingAndControlFieldsResponse)) + return new GetBindingAndControlFieldsResponse(1, new UID((ushort)EManufacturer.Swisson_AG, 1342143), 22, new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)); + if (type == typeof(GetBackgroundQueuedStatusPolicyResponse)) + return new GetBackgroundQueuedStatusPolicyResponse(21, 55); + if (type == typeof(GetBackgroundQueuedStatusPolicyDescriptionResponse)) + return new GetBackgroundQueuedStatusPolicyDescriptionResponse(21, "Test QueuedStatusPolicyDescription"); + if (type == typeof(SetDiscoveryStateRequest)) + return new SetDiscoveryStateRequest(22, ERDM_DiscoveryState.INCOMPLETE); + if (type == typeof(SetEndpointTimingRequest)) + return new SetEndpointTimingRequest(22, 34); + if (type == typeof(GetBindingAndControlFieldsRequest)) + return new GetBindingAndControlFieldsRequest(22, new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)); + if (type == typeof(GetDeviceInfoOffstageRequest)) + return new GetDeviceInfoOffstageRequest(23, 3, 1); + if (type == typeof(GetDeviceInfoOffstageResponse)) + return new GetDeviceInfoOffstageResponse(23, 3, 1, (RDMDeviceInfo)getValue(typeof(RDMDeviceInfo))); + if (type == typeof(GetCommunicationStatusNullStartCodeResponse)) + return new GetCommunicationStatusNullStartCodeResponse(23, 3, 1, 3, 2, 99); + if (type == typeof(RDMPersonalityId)) + return new RDMPersonalityId(23, 0x3442, 0x9994); + if (type == typeof(RDMSensorTypeCustomDefine)) + return new RDMSensorTypeCustomDefine(0x99, "Test Sensor Type"); + if (type == typeof(RDMSensorUnitCustomDefine)) + return new RDMSensorUnitCustomDefine(0xee, "~"); + if (type == typeof(RDMMetadataParameterVersion)) + return new RDMMetadataParameterVersion(ERDM_Parameter.BATTERY_EXTENSION, 33); + if (type == typeof(RDMMetadataJson)) + return new RDMMetadataJson(ERDM_Parameter.BATTERY_EXTENSION, "{\r\n \"name\": \"FIRMWARE_URL\",\r\n \"notes\": \"E1.37-5\",\r\n \"manufacturer_id\": 0,\r\n \"pid\": 210,\r\n \"version\": 1,\r\n \"get_request_subdevice_range\": [ \"root\", \"subdevices\" ],\r\n \"get_request\": [],\r\n \"get_response\": [\r\n {\r\n \"name\": \"url\",\r\n \"type\": \"string\",\r\n \"notes\": \"The spec says that the minimum length is 5, but we shouldn't restrict because that would imply we know what the URL scheme is.\",\r\n \"format\": \"url\"\r\n }\r\n ]\r\n}"); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetResponseObjectToParameterData(null); }); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.GetResponseParameterDataToObject(null); }); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetRequestObjectToParameterData(null); }); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetRequestParameterDataToObject(null); }); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetResponseObjectToParameterData(null); }); - Assert.Throws(typeof(NotSupportedException), () => { abstractRDMParameterWrapperEmpty4.SetResponseParameterDataToObject(null); }); - } - Assert.That(tested, Is.AtLeast(2)); - } + if (type == typeof(ERDM_DisplayInvert)) + return ERDM_DisplayInvert.AUTO; + if (type == typeof(ERDM_LampMode)) + return ERDM_LampMode.ON_MODE_AFTER_CAL; + if (type == typeof(ERDM_LampState)) + return ERDM_LampState.STANDBY; + if (type == typeof(ERDM_IdentifyMode)) + return ERDM_IdentifyMode.LOUD; + if (type == typeof(ERDM_PowerState)) + return ERDM_PowerState.STANDBY; + if (type == typeof(ERDM_ResetType)) + return ERDM_ResetType.Warm; + if (type == typeof(ERDM_Status)) + return ERDM_Status.GET_LAST_MESSAGE; + if (type == typeof(ERDM_MergeMode)) + return ERDM_MergeMode.DMX_ONLY; + if (type == typeof(ERDM_BrokerStatus)) + return ERDM_BrokerStatus.ACTIVE; + if (type == typeof(ERDM_ShippingLockState)) + return ERDM_ShippingLockState.PARTIALLY_LOCKED; - static object getValue(Type type) - { - if (type == typeof(string)) - return "Test String"; - if (type == typeof(bool)) - return true; - if (type == typeof(sbyte)) - return (sbyte)55; - if (type == typeof(byte)) - return (byte)99; - if (type == typeof(short)) - return (short)-0x1234; - if (type == typeof(ushort)) - return (ushort)1523; - if (type == typeof(ushort?)) - return (ushort?)1523; - if (type == typeof(int)) - return (int)-0x123334; - if (type == typeof(uint)) - return (uint)154523; - if (type == typeof(byte[])) - return new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; - if (type == typeof(RDMRealTimeClock)) - return new RDMRealTimeClock(DateTime.Now); - if (type == typeof(RDMDMXPersonality)) - return new RDMDMXPersonality(3, 4); - if (type == typeof(RDMCurve)) - return new RDMCurve(3, 4); - if (type == typeof(RDMPresetPlayback)) - return new RDMPresetPlayback(3, 200); - if (type == typeof(RDMSensorValue)) - return new RDMSensorValue(3, 200); - if (type == typeof(RDMPresetStatus)) - return new RDMPresetStatus(3, 200); - if (type == typeof(RDMCommunicationStatus)) - return new RDMCommunicationStatus(3, 200); - if (type == typeof(RDMDeviceInfo)) - return new RDMDeviceInfo(3, 200); - if (type == typeof(RDMDMXPersonalityDescription)) - return new RDMDMXPersonalityDescription(3, 200); - if (type == typeof(RDMParameterDescription)) - return new RDMParameterDescription(3, 200); - if (type == typeof(RDMProxiedDeviceCount)) - return new RDMProxiedDeviceCount(3); - if (type == typeof(RDMProxiedDevices)) - return new RDMProxiedDevices([new UID((ushort)EManufacturer.Swisson_AG, 1342143), new UID((ushort)EManufacturer.DMXControlProjects_eV, 334412), new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)]); - if (type == typeof(RDMSelfTestDescription)) - return new RDMSelfTestDescription(3); - if (type == typeof(RDMSensorDefinition)) - return new RDMSensorDefinition(3); - if (type == typeof(RDMSlotDescription)) - return new RDMSlotDescription(3); - if (type == typeof(GetBrokerStatusResponse)) - return new GetBrokerStatusResponse(true, ERDM_BrokerStatus.ACTIVE); - if (type == typeof(GetSetComponentScope)) - return new GetSetComponentScope(3, scopeString: "eqadeqew", new IPv4Address(123, 45, 22, 4)); - if (type == typeof(TCPCommsEntry)) - return new TCPCommsEntry("eqadeqew"); - if (type == typeof(RDMCurveDescription)) - return new RDMCurveDescription(3); - if (type == typeof(RDMDimmerInfo)) - return new RDMDimmerInfo(3, 200); - if (type == typeof(RDMDMXBlockAddress)) - return new RDMDMXBlockAddress(3, 200); - if (type == typeof(RDMDMX_xxxx_Mode)) - return new RDMDMX_xxxx_Mode(3, 200); - if (type == typeof(SetLockPinRequest)) - return new SetLockPinRequest(3, 200); - if (type == typeof(RDMLockStateDescription)) - return new RDMLockStateDescription(3); - if (type == typeof(GetLockStateResponse)) - return new GetLockStateResponse(3, 200); - if (type == typeof(RDMMinimumLevel)) - return new RDMMinimumLevel(3, 200); - if (type == typeof(RDMModulationFrequencyDescription)) - return new RDMModulationFrequencyDescription(3, 200); - if (type == typeof(RDMModulationFrequency)) - return new RDMModulationFrequency(3, 200); - if (type == typeof(RDMOutputResponseTimeDescription)) - return new RDMOutputResponseTimeDescription(3); - if (type == typeof(RDMOutputResponseTime)) - return new RDMOutputResponseTime(3, 200); - if (type == typeof(SetLockStateRequest)) - return new SetLockStateRequest(12314, 23); - if (type == typeof(RDMPresetInfo)) - return new RDMPresetInfo(true, true, true, true, true, true, 12354, 21567, 7432, 23467, 7632, 24567, 7532, 23456, ushort.MaxValue, 23456, 6543, ushort.MaxValue, 5432); - if (type == typeof(GetInterfaceListResponse)) - return new GetInterfaceListResponse(new InterfaceDescriptor(1, 444), new InterfaceDescriptor(4, 32)); - if (type == typeof(GetInterfaceNameResponse)) - return new GetInterfaceNameResponse(2, "Test"); - if (type == typeof(GetHardwareAddressResponse)) - return new GetHardwareAddressResponse(9, new MACAddress(12, 34, 56, 88, 55, 32)); - if (type == typeof(GetSetIPV4_xxx_Mode)) - return new GetSetIPV4_xxx_Mode(2, true); - if (type == typeof(GetIPv4CurrentAddressResponse)) - return new GetIPv4CurrentAddressResponse(4, new IPv4Address(123, 45, 22, 4), 12, ERDM_DHCPStatusMode.ACTIVE); - if (type == typeof(GetSetIPv4StaticAddress)) - return new GetSetIPv4StaticAddress(3, new IPv4Address(123, 45, 22, 4), 20); - if (type == typeof(GetSetIPv4DefaultRoute)) - return new GetSetIPv4DefaultRoute(5, new IPv4Address(153, 49, 122, 234)); - if (type == typeof(GetSetIPv4NameServer)) - return new GetSetIPv4NameServer(2, new IPv4Address(123, 45, 22, 4)); - if (type == typeof(GetEndpointListResponse)) - return new GetEndpointListResponse(1, new EndpointDescriptor(4, ERDM_EndpointType.PHYSICAL), new EndpointDescriptor(7, ERDM_EndpointType.VIRTUAL)); - if (type == typeof(GetSetIdentifyEndpoint)) - return new GetSetIdentifyEndpoint(3, true); - if (type == typeof(GetSetEndpointToUniverse)) - return new GetSetEndpointToUniverse(1, 55); - if (type == typeof(GetSetEndpointMode)) - return new GetSetEndpointMode(1, ERDM_EndpointMode.OUTPUT); - if (type == typeof(GetSetEndpointLabel)) - return new GetSetEndpointLabel(3, "Test Endpoint Label"); - if (type == typeof(GetSetEndpointRDMTrafficEnable)) - return new GetSetEndpointRDMTrafficEnable(56, true); - if (type == typeof(GetDiscoveryStateResponse)) - return new GetDiscoveryStateResponse(1, 545, ERDM_DiscoveryState.NOT_ACTIVE); - if (type == typeof(GetSetEndpointBackgroundDiscovery)) - return new GetSetEndpointBackgroundDiscovery(1, true); - if (type == typeof(GetEndpointTimingResponse)) - return new GetEndpointTimingResponse(1, 44, 55); - if (type == typeof(GetEndpointTimingDescriptionResponse)) - return new GetEndpointTimingDescriptionResponse(1, "Test Timing"); - if (type == typeof(GetEndpointRespondersResponse)) - return new GetEndpointRespondersResponse(1, [new UID((ushort)EManufacturer.Swisson_AG, 1342143), new UID((ushort)EManufacturer.DMXControlProjects_eV, 334412), new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)]); - if (type == typeof(GetEndpointResponderListChangeResponse)) - return new GetEndpointResponderListChangeResponse(1, 55); - if (type == typeof(GetBindingAndControlFieldsResponse)) - return new GetBindingAndControlFieldsResponse(1, new UID((ushort)EManufacturer.Swisson_AG, 1342143), 22, new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)); - if (type == typeof(GetBackgroundQueuedStatusPolicyResponse)) - return new GetBackgroundQueuedStatusPolicyResponse(21, 55); - if (type == typeof(GetBackgroundQueuedStatusPolicyDescriptionResponse)) - return new GetBackgroundQueuedStatusPolicyDescriptionResponse(21, "Test QueuedStatusPolicyDescription"); - if (type == typeof(SetDiscoveryStateRequest)) - return new SetDiscoveryStateRequest(22, ERDM_DiscoveryState.INCOMPLETE); - if (type == typeof(SetEndpointTimingRequest)) - return new SetEndpointTimingRequest(22, 34); - if (type == typeof(GetBindingAndControlFieldsRequest)) - return new GetBindingAndControlFieldsRequest(22, new UID((ushort)EManufacturer.Martin_Professional_AS, 3123)); - if (type == typeof(ERDM_DisplayInvert)) - return ERDM_DisplayInvert.AUTO; - if (type == typeof(ERDM_LampMode)) - return ERDM_LampMode.ON_MODE_AFTER_CAL; - if (type == typeof(ERDM_LampState)) - return ERDM_LampState.STANDBY; - if (type == typeof(ERDM_IdentifyMode)) - return ERDM_IdentifyMode.LOUD; - if (type == typeof(ERDM_PowerState)) - return ERDM_PowerState.STANDBY; - if (type == typeof(ERDM_ResetType)) - return ERDM_ResetType.Warm; - if (type == typeof(ERDM_Status)) - return ERDM_Status.GET_LAST_MESSAGE; - if (type == typeof(ERDM_MergeMode)) - return ERDM_MergeMode.DMX_ONLY; - if (type == typeof(ERDM_BrokerStatus)) - return ERDM_BrokerStatus.ACTIVE; + if (type == typeof(ERDM_Parameter)) + return ERDM_Parameter.LAMP_HOURS; + if (type == typeof(ERDM_Parameter[])) + return e1_20Parameters; + if (type == typeof(RDMStatusMessage[])) + return new RDMStatusMessage[] { new RDMStatusMessage(1, ERDM_Status.ERROR, ERDM_StatusMessage.BREAKER_TRIP), new RDMStatusMessage(1, ERDM_Status.WARNING, ERDM_StatusMessage.WATTS) }; + if (type == typeof(RDMSlotInfo[])) + return new RDMSlotInfo[] { new RDMSlotInfo(1, ERDM_SlotType.PRIMARY, ERDM_SlotCategory.PAN), new RDMSlotInfo(2, ERDM_SlotType.SEC_FINE, ERDM_SlotCategory.PAN), new RDMSlotInfo(3, ERDM_SlotType.PRIMARY, ERDM_SlotCategory.TILT), new RDMSlotInfo(4, ERDM_SlotType.SEC_FINE, ERDM_SlotCategory.TILT) }; + if (type == typeof(ERDM_ProductDetail[])) + return new ERDM_ProductDetail[] { ERDM_ProductDetail.ANALOG_DEMULTIPLEX, ERDM_ProductDetail.BUBBLE, ERDM_ProductDetail.CONFETTI, ERDM_ProductDetail.CO2 }; + if (type == typeof(string[])) + return new string[] { "de", "en", "es" }; + if (type == typeof(RDMDefaultSlotValue[])) + return new RDMDefaultSlotValue[] { new RDMDefaultSlotValue(1, 128), new RDMDefaultSlotValue(2, 12), new RDMDefaultSlotValue(3, 44), }; - if (type == typeof(ERDM_Parameter)) - return ERDM_Parameter.LAMP_HOURS; - if (type == typeof(ERDM_Parameter[])) - return e1_20Parameters; - if (type == typeof(RDMStatusMessage[])) - return new RDMStatusMessage[] { new RDMStatusMessage(1, ERDM_Status.ERROR, ERDM_StatusMessage.BREAKER_TRIP), new RDMStatusMessage(1, ERDM_Status.WARNING, ERDM_StatusMessage.WATTS) }; - if (type == typeof(RDMSlotInfo[])) - return new RDMSlotInfo[] { new RDMSlotInfo(1, ERDM_SlotType.PRIMARY, ERDM_SlotCategory.PAN), new RDMSlotInfo(2, ERDM_SlotType.SEC_FINE, ERDM_SlotCategory.PAN), new RDMSlotInfo(3, ERDM_SlotType.PRIMARY, ERDM_SlotCategory.TILT), new RDMSlotInfo(4, ERDM_SlotType.SEC_FINE, ERDM_SlotCategory.TILT) }; - if (type == typeof(ERDM_ProductDetail[])) - return new ERDM_ProductDetail[] { ERDM_ProductDetail.ANALOG_DEMULTIPLEX, ERDM_ProductDetail.BUBBLE, ERDM_ProductDetail.CONFETTI, ERDM_ProductDetail.CO2 }; - if (type == typeof(string[])) - return new string[] { "de", "en", "es" }; - if (type == typeof(RDMDefaultSlotValue[])) - return new RDMDefaultSlotValue[] { new RDMDefaultSlotValue(1, 128), new RDMDefaultSlotValue(2, 12), new RDMDefaultSlotValue(3, 44), }; - #region SGM - if (type == typeof(RefreshRate)) - return new RefreshRate((byte)34); - if (type == typeof(EDimmingCurve)) - return EDimmingCurve.GAMMA_CORRECTED; - if (type == typeof(EFanMode)) - return EFanMode.HIGH; - if (type == typeof(EDimMode)) - return EDimMode.MAX_POWER; - if (type == typeof(EInvertPixelOrder)) - return EInvertPixelOrder.INVERT; - if (type == typeof(EBatteryExtension)) - return EBatteryExtension._20H; - #endregion + #region SGM + if (type == typeof(RefreshRate)) + return new RefreshRate((byte)34); + if (type == typeof(EDimmingCurve)) + return EDimmingCurve.GAMMA_CORRECTED; + if (type == typeof(EFanMode)) + return EFanMode.HIGH; + if (type == typeof(EDimMode)) + return EDimMode.MAX_POWER; + if (type == typeof(EInvertPixelOrder)) + return EInvertPixelOrder.INVERT; + if (type == typeof(EBatteryExtension)) + return EBatteryExtension._20H; + #endregion - return null!; - } + return null!; + } + }); } private static string ParametersToString(params ERDM_Parameter[] parameters)