diff --git a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs index 17b7785..9f957fd 100644 --- a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetParameterWrapper.cs @@ -81,7 +81,16 @@ public RDMMessage BuildGetResponseMessage(GetResponse getResponseValue) return this.buildGetResponseMessage(getResponseValue); } - public abstract RequestRange GetRequestRange(object value); + 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); + } #endregion } } diff --git a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs index 5a58101..085c058 100644 --- a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapper.cs @@ -96,7 +96,15 @@ 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); + } - public abstract RequestRange GetRequestRange(object 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 71b0a62..f408662 100644 --- a/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapperEmptySetResponse.cs +++ b/RDMSharp/ParameterWrapper/Abstract/AbstractRDMGetSetParameterWrapperEmptySetResponse.cs @@ -95,7 +95,16 @@ public RDMMessage BuildGetResponseMessage(GetResponse getResponseValue) return this.buildGetResponseMessage(getResponseValue); } - public abstract RequestRange GetRequestRange(object value); + 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); + } #endregion } } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs index 429cff3..7081da4 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/DMX512PersonalityDescriptionParameterWrapper.cs @@ -34,7 +34,7 @@ protected override byte[] getResponseValueToParameterData(RDMDMXPersonalityDescr return personalityDescription.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMDMXPersonality perso) return new RequestRange((byte)perso.MinIndex, (byte)perso.Count); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs index 2374776..62de57b 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/ParameterDescriptionParameterWrapper.cs @@ -35,7 +35,7 @@ protected override byte[] getResponseValueToParameterData(RDMParameterDescriptio return parameterDescription.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { throw new NotSupportedException($"There is no support for the Type: {value.GetType().ToString()}"); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs index 97633e5..01886f7 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SelfTestDescriptionParameterWrapper.cs @@ -31,7 +31,7 @@ protected override byte[] getResponseValueToParameterData(RDMSelfTestDescription return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return new RequestRange(0, byte.MaxValue); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs index 6136f6b..100ddc0 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorDefinitionParameterWrapper.cs @@ -36,7 +36,7 @@ protected override byte[] getResponseValueToParameterData(RDMSensorDefinition se return sensorDefinition.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMDeviceInfo deviceInfo) return new RequestRange(0, (byte)(deviceInfo.SensorCount - 1)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs index 8e96f28..955c93a 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SensorValueParameterWrapper.cs @@ -10,7 +10,7 @@ public SensorValueParameterWrapper() : base(ERDM_Parameter.SENSOR_VALUE) public override string Name => "Sensor Value"; public override string Description => "This parameter shall be used to retrieve or reset sensor data."; - private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { ERDM_Parameter.DEVICE_INFO }; + private static readonly ERDM_Parameter[] descriptiveParameters = new ERDM_Parameter[] { ERDM_Parameter.SENSOR_DEFINITION }; public override ERDM_Parameter[] DescriptiveParameters => descriptiveParameters; protected override byte[] getRequestValueToParameterData(byte sensorId) @@ -51,7 +51,7 @@ protected override byte[] setResponseValueToParameterData(RDMSensorValue value) return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMDeviceInfo deviceInfo) return new RequestRange(0, (byte)(deviceInfo.SensorCount - 1)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs index 6010adb..84bdc91 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/SlotDescriptionParameterWrapper.cs @@ -36,7 +36,7 @@ protected override byte[] getResponseValueToParameterData(RDMSlotDescription val { return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMDeviceInfo deviceInfo) return new RequestRange(0, (ushort)(deviceInfo.Dmx512Footprint)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs index ee87619..f6d6dcc 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusIdDescriptionParameterWrapper.cs @@ -31,7 +31,7 @@ protected override byte[] getResponseValueToParameterData(string value) { return Tools.ValueToData(value); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return new RequestRange(0, ushort.MaxValue); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs index 09944f2..61b1598 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.20/StatusMessageParameterWrapper.cs @@ -46,7 +46,7 @@ protected override byte[] getResponseValueToParameterData(RDMStatusMessage[] val return bytes.ToArray(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return new RequestRange(0, (ERDM_Status)0x04); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.33/ComponentScopeParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.33/ComponentScopeParameterWrapper.cs index e096d75..8274a4b 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.33/ComponentScopeParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.33/ComponentScopeParameterWrapper.cs @@ -45,7 +45,7 @@ protected override byte[] setRequestValueToParameterData(GetSetComponentScope co { return componentScope.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs index 8a91e3a..eaf1e8d 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/CurveDescriptionParameterWrapper.cs @@ -37,7 +37,7 @@ protected override byte[] getResponseValueToParameterData(RDMCurveDescription va return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMCurve curve) return new RequestRange(1, (byte)(curve.Count)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs index b674802..74d280e 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/LockStateDescriptionParameterWrapper.cs @@ -36,7 +36,7 @@ protected override byte[] getResponseValueToParameterData(RDMLockStateDescriptio return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is GetLockStateResponse lockState) return new RequestRange(1, (byte)(lockState.Count)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs index 27e2a08..5471264 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/ModulationFrequencyDescriptionParameterWrapper.cs @@ -36,7 +36,7 @@ protected override byte[] getResponseValueToParameterData(RDMModulationFrequency return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMModulationFrequency modulationFrequency) return new RequestRange(1, (byte)(modulationFrequency.Count)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs index 2eea69e..a55d284 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/OutputResponseTimeDescriptionParameterWrapper.cs @@ -35,7 +35,7 @@ protected override byte[] getResponseValueToParameterData(RDMOutputResponseTimeD return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMOutputResponseTime outputResponseTime) return new RequestRange(1, (byte)(outputResponseTime.Count)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/PresetStatusParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/PresetStatusParameterWrapper.cs index 5253626..d2ca734 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/PresetStatusParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-1/PresetStatusParameterWrapper.cs @@ -45,7 +45,7 @@ protected override byte[] setRequestValueToParameterData(RDMPresetStatus presetS return presetStatus.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is RDMPresetInfo presetInfo) return new RequestRange(0x0001, presetInfo.MaximumSceneNumber); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/DHCPParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/DHCPParameterWrapper.cs index cc43d6d..64d912d 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/DHCPParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/DHCPParameterWrapper.cs @@ -42,7 +42,7 @@ protected override byte[] setRequestValueToParameterData(GetSetIPV4_xxx_Mode dhc { return dhcpMode.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs index a07e434..2ec5f73 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/HardwareAddressParameterWrapper.cs @@ -29,7 +29,7 @@ protected override byte[] getResponseValueToParameterData(GetHardwareAddressResp { return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs index b47cff5..451d9fd 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4Address_NetmaskParameterWrapper.cs @@ -29,7 +29,7 @@ protected override byte[] getResponseValueToParameterData(GetIPv4CurrentAddressR { return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4DefaultRouteParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4DefaultRouteParameterWrapper.cs index 90965ff..1fa7f13 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4DefaultRouteParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4DefaultRouteParameterWrapper.cs @@ -45,7 +45,7 @@ protected override byte[] setRequestValueToParameterData(GetSetIPv4DefaultRoute { return defaultRoute.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4NameServerParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4NameServerParameterWrapper.cs index ba81d72..01db428 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4NameServerParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4NameServerParameterWrapper.cs @@ -39,7 +39,7 @@ protected override byte[] setRequestValueToParameterData(GetSetIPv4NameServer na { return nameServer.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4StaticAddressParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4StaticAddressParameterWrapper.cs index 96f9aaf..e6e6535 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4StaticAddressParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/IPv4StaticAddressParameterWrapper.cs @@ -42,7 +42,7 @@ protected override byte[] setRequestValueToParameterData(GetSetIPv4StaticAddress { return staticAddress.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs index abcb2af..0d21fba 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/InterfaceNameParameterWrapper.cs @@ -29,7 +29,7 @@ protected override byte[] getResponseValueToParameterData(GetInterfaceNameRespon { return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/ZeroconfModeParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/ZeroconfModeParameterWrapper.cs index 9b85672..2f9261e 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/ZeroconfModeParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-2/ZeroconfModeParameterWrapper.cs @@ -42,7 +42,7 @@ protected override byte[] setRequestValueToParameterData(GetSetIPV4_xxx_Mode dhc { return dhcpMode.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return ListInterfacesParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs index d2b85ff..4f28cc3 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BackgroundQueuedStatusMessagePolicyDescriptionParameterWrapper.cs @@ -33,7 +33,7 @@ protected override byte[] getResponseValueToParameterData(GetBackgroundQueuedSta { return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs index 89c3334..a12fb73 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/BindingAndControlFieldsParameterWrapper.cs @@ -33,7 +33,7 @@ protected override byte[] getResponseValueToParameterData(GetBindingAndControlFi { return response.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { throw new System.NotSupportedException(); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs index c64dbe0..89e12f6 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/DiscoveryStateParameterWrapper.cs @@ -52,7 +52,7 @@ protected override byte[] setResponseValueToParameterData(ushort value) { return Tools.ValueToData(value); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs index 4fc87ea..2df7431 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointBackgroundDiscoveryParameterWrapper.cs @@ -57,7 +57,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs index 7feeff7..45cafc1 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointLabelParameterWrapper.cs @@ -52,7 +52,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs index c2c139b..3aafb3a 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointModeParameterWrapper.cs @@ -50,7 +50,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs index 003b4a1..ce2599d 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointRDMTrafficEnableParameterWrapper.cs @@ -53,7 +53,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs index 8544007..c5b4d61 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingDescriptionParameterWrapper.cs @@ -36,7 +36,7 @@ protected override byte[] getResponseValueToParameterData(GetEndpointTimingDescr return value.ToPayloadData(); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value is GetEndpointTimingResponse getEndpointTiming) return new RequestRange(1, (byte)(getEndpointTiming.Count)); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs index dfe4779..3500514 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointTimingParameterWrapper.cs @@ -56,7 +56,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { if (value == null) return new RequestRange(0x0001, 0xF9FF); diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs index 5d796aa..4fb4690 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/EndpointToUniverseParameterWrapper.cs @@ -52,7 +52,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs index c5c223d..c56fd19 100644 --- a/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Catalogue/E1.37-7/IdentifyEndpointParameterWrapper.cs @@ -50,7 +50,7 @@ protected override byte[] setResponseValueToParameterData(ushort endpointId) { return Tools.ValueToData(endpointId); } - public override RequestRange GetRequestRange(object value) + public override IRequestRange GetRequestRange(object value) { return EndpointListParameterWrapper.GetRequestRange(value); } diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMBlueprintDescriptionListParameterWrapper.cs b/RDMSharp/ParameterWrapper/Interface/IRDMBlueprintDescriptionListParameterWrapper.cs index 06f6429..d34b557 100644 --- a/RDMSharp/ParameterWrapper/Interface/IRDMBlueprintDescriptionListParameterWrapper.cs +++ b/RDMSharp/ParameterWrapper/Interface/IRDMBlueprintDescriptionListParameterWrapper.cs @@ -2,5 +2,6 @@ { public interface IRDMBlueprintDescriptionListParameterWrapper : IRDMBlueprintParameterWrapper, IRDMDescriptionParameterWrapper { + ERDM_Parameter[] DescriptiveParameters { get; } } } \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperGetResponseContravariance.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperGetResponseContravariance.cs new file mode 100644 index 0000000..569df6b --- /dev/null +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperGetResponseContravariance.cs @@ -0,0 +1,8 @@ +namespace RDMSharp.ParameterWrapper +{ + public interface IRDMGetParameterWrapperGetResponseContravariance : IRDMGetParameterWrapperResponse + { + RDMMessage BuildGetResponseMessage(TResponse value); + byte[] GetResponseValueToParameterData(TResponse value); + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs index 217d350..f590896 100644 --- a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest.cs @@ -8,5 +8,6 @@ public interface IRDMGetParameterWrapperRequest : IRDMParameterWrapper RDMMessage BuildGetRequestMessage(object value); byte[] GetRequestObjectToParameterData(object value); object GetRequestParameterDataToObject(byte[] parameterData); + 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 37d150f..2f6e719 100644 --- a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest1.cs +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequest1.cs @@ -1,11 +1,9 @@ namespace RDMSharp.ParameterWrapper { - public interface IRDMGetParameterWrapperRequest : IRDMGetParameterWrapperRequest + public interface IRDMGetParameterWrapperRequest : IRDMGetParameterWrapperRequest, IRDMGetParameterWrapperRequestContravariance { ERDM_Parameter[] DescriptiveParameters { get; } - RequestRange GetRequestRange(object value); - RDMMessage BuildGetRequestMessage(TRequest value); - byte[] GetRequestValueToParameterData(TRequest value); TRequest GetRequestParameterDataToValue(byte[] parameterData); + new IRequestRange GetRequestRange(object value); } } \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequestContravariance.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequestContravariance.cs new file mode 100644 index 0000000..388292d --- /dev/null +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperRequestContravariance.cs @@ -0,0 +1,8 @@ +namespace RDMSharp.ParameterWrapper +{ + public interface IRDMGetParameterWrapperRequestContravariance : IRDMGetParameterWrapperRequest + { + RDMMessage BuildGetRequestMessage(TRequest value); + byte[] GetRequestValueToParameterData(TRequest value); + } +} \ No newline at end of file diff --git a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperResponse1.cs b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperResponse1.cs index 720c5ce..dff4661 100644 --- a/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperResponse1.cs +++ b/RDMSharp/ParameterWrapper/Interface/IRDMGetParameterWrapperResponse1.cs @@ -1,9 +1,7 @@ namespace RDMSharp.ParameterWrapper { - public interface IRDMGetParameterWrapperResponse : IRDMGetParameterWrapperResponse + public interface IRDMGetParameterWrapperResponse : IRDMGetParameterWrapperResponse, IRDMGetParameterWrapperGetResponseContravariance { - RDMMessage BuildGetResponseMessage(TResponse value); TResponse GetResponseParameterDataToValue(byte[] parameterData); - byte[] GetResponseValueToParameterData(TResponse value); } } \ No newline at end of file diff --git a/RDMSharp/RDM/Device/AbstractGeneratedRDMDevice.cs b/RDMSharp/RDM/Device/AbstractGeneratedRDMDevice.cs index e489c7b..a510ee3 100644 --- a/RDMSharp/RDM/Device/AbstractGeneratedRDMDevice.cs +++ b/RDMSharp/RDM/Device/AbstractGeneratedRDMDevice.cs @@ -19,6 +19,7 @@ public abstract class AbstractGeneratedRDMDevice : AbstractRDMDevice #endregion public abstract string DeviceModelDescription { get; } public abstract GeneratedPersonality[] Personalities { get; } + public abstract Sensor[] Sensors { get; } public abstract bool SupportDMXAddress { get; } @@ -135,6 +136,13 @@ protected AbstractGeneratedRDMDevice(RDMUID uid, ERDM_Parameter[] parameters, st _params.Add(ERDM_Parameter.SLOT_DESCRIPTION); _params.Add(ERDM_Parameter.DEFAULT_SLOT_VALUE); } + if ((Sensors?.Length ?? 0) != 0) + { + _params.Add(ERDM_Parameter.SENSOR_DEFINITION); + _params.Add(ERDM_Parameter.SENSOR_VALUE); + if(Sensors.Any(s=>s.RecordedValueSupported)) + _params.Add(ERDM_Parameter.RECORD_SENSORS); + } Parameters = _params.Distinct().ToArray(); #endregion @@ -178,6 +186,52 @@ protected AbstractGeneratedRDMDevice(RDMUID uid, ERDM_Parameter[] parameters, st } #endregion + #region Sensors + if (Sensors != null) + { + if (Sensors.Length >= byte.MaxValue) + throw new ArgumentOutOfRangeException($"There to many {Sensors}! Maxumum is {byte.MaxValue - 1}"); + + if (Sensors.Length != 0) + { + var sensorDef = new ConcurrentDictionary(); + foreach (var sensor in Sensors) + { + if (!sensorDef.TryAdd(sensor.SensorId, (RDMSensorDefinition)sensor)) + throw new Exception($"{sensor.SensorId} already used as {nameof(sensor.SensorId)}"); + + SetGeneratedSensorDescription((RDMSensorDefinition)sensor); + SetGeneratedSensorValue((RDMSensorValue)sensor); + sensor.PropertyChanged += (o, e) => + { + switch (e.PropertyName) + { + case nameof(Sensor.Type): + case nameof(Sensor.Unit): + case nameof(Sensor.Prefix): + case nameof(Sensor.RangeMaximum): + case nameof(Sensor.RangeMinimum): + case nameof(Sensor.NormalMaximum): + case nameof(Sensor.NormalMinimum): + case nameof(Sensor.LowestHighestValueSupported): + case nameof(Sensor.RecordedValueSupported): + SetGeneratedSensorDescription((RDMSensorDefinition)sensor); + break; + case nameof(Sensor.PresentValue): + case nameof(Sensor.LowestValue): + case nameof(Sensor.HighestValue): + case nameof(Sensor.RecordedValue): + SetGeneratedSensorValue((RDMSensorValue)sensor); + break; + } + }; + } + + trySetParameter(ERDM_Parameter.SENSOR_DEFINITION, sensorDef); + } + } + #endregion + #region DMX-Address if (Parameters.Contains(ERDM_Parameter.DMX_START_ADDRESS)) DMXAddress = 1; @@ -195,7 +249,8 @@ private void updateDeviceInfo() SoftwareVersionID, dmx512CurrentPersonality: currentPersonality, dmx512NumberOfPersonalities: (byte)(Personalities?.Length ?? 0), - dmx512StartAddress: dmxAddress); + dmx512StartAddress: dmxAddress, + sensorCount: (byte)(Sensors?.Length ?? 0)); } private bool trySetParameter(ERDM_Parameter parameter, object value) { @@ -206,7 +261,7 @@ private bool trySetParameter(ERDM_Parameter parameter, object value) { case IRDMSetParameterWrapperResponse setParameterWrapperResponse: if (setParameterWrapperResponse.SetResponseType != value.GetType()) - throw new NotSupportedException($"The Type of {nameof(value)} is not supported as Response for Parameter: {parameter}, the only supported Type is {setParameterWrapperResponse.SetResponseType}"); + throw new NotSupportedException($"The Type of {value.GetType()} is not supported as Response for Parameter: {parameter}, the only supported Type is {setParameterWrapperResponse.SetResponseType}"); break; } base.SetGeneratedParameterValue(parameter, value); diff --git a/RDMSharp/RDM/Device/AbstractRDMDevice.cs b/RDMSharp/RDM/Device/AbstractRDMDevice.cs index 9ffac65..c6cf884 100644 --- a/RDMSharp/RDM/Device/AbstractRDMDevice.cs +++ b/RDMSharp/RDM/Device/AbstractRDMDevice.cs @@ -39,8 +39,8 @@ public abstract class AbstractRDMDevice : IRDMDevice public IReadOnlyDictionary ParameterValues => parameterValues.AsReadOnly(); private readonly HashSet pendingParametersUpdateRequest = new HashSet(); - private readonly ConcurrentDictionary sensorValues = new ConcurrentDictionary(); - public IReadOnlyDictionary SensorValues => sensorValues.AsReadOnly(); + private readonly ConcurrentDictionary sensors = new ConcurrentDictionary(); + public IReadOnlyDictionary Sensors => sensors.AsReadOnly(); private readonly HashSet pendingSensorValuesUpdateRequest = new HashSet(); private ConcurrentDictionary slots = new ConcurrentDictionary(); @@ -80,11 +80,21 @@ private protected void SetGeneratedParameterValue(ERDM_Parameter parameter, obje return; } } + private protected void SetGeneratedSensorDescription(RDMSensorDefinition value) + { + if (!IsGenerated) + return; + + Sensor sensor = sensors.GetOrAdd(value.SensorId, (a) => new Sensor(a)); + sensor.UpdateDescription(value); + } private protected void SetGeneratedSensorValue(RDMSensorValue value) { if (!IsGenerated) return; - sensorValues.AddOrUpdate(value.SensorId, value, (o, p) => value); + + Sensor sensor = sensors.GetOrAdd(value.SensorId, (a) => new Sensor(a)); + sensor.UpdateValue(value); } public async Task SetParameter(ERDM_Parameter parameter, object value = null) { @@ -248,7 +258,16 @@ protected RDMMessage processRequestMessage(RDMMessage rdmMessage) List sp = new List(); sp.Add(ERDM_Parameter.DEVICE_INFO); sp.AddRange(parameterValues.Keys); - response = _supportedParametersParameterWrapper.BuildGetResponseMessage(sp.ToArray()); + if (deviceModel != null) + sp.AddRange(deviceModel.SupportedParameters); + if (!sensors.IsEmpty) + { + sp.Add(ERDM_Parameter.SENSOR_DEFINITION); + sp.Add(ERDM_Parameter.SENSOR_VALUE); + if(sensors.Any(s=>s.Value.RecordedValueSupported)) + sp.Add(ERDM_Parameter.RECORD_SENSORS); + } + response = _supportedParametersParameterWrapper.BuildGetResponseMessage(sp.Distinct().ToArray()); break; case QueuedMessageParameterWrapper _queuedMessageParameterWrapper: response = statusMessageParameterWrapper.BuildGetResponseMessage([]); @@ -299,6 +318,11 @@ protected RDMMessage processRequestMessage(RDMMessage rdmMessage) when responseValue is ushort _ushort: response = dmx512StartingAddressParameterWrapper.BuildGetResponseMessage(_ushort); break; + case SensorValueParameterWrapper sensorValueParameterWrapper: + if (sensors.TryGetValue((byte)rdmMessage.Value, out Sensor sensor)) + response = sensorValueParameterWrapper.BuildGetResponseMessage((RDMSensorValue)sensor); + break; + case IRDMGetParameterWrapperResponse getParameterWrapperResponse: response = getParameterWrapperResponse.BuildGetResponseMessage(responseValue); break; @@ -616,17 +640,18 @@ private async Task processResponseMessage(RDMMessage rdmMessage) } this.OnPropertyChanged(nameof(this.Slots)); break; - case SensorDefinitionParameterWrapper _sensorDefinitionParameterWrapper: + case SensorValueParameterWrapper _sensorValueParameterWrapper: if (value is not RDMSensorValue sensorValue) { if (value != null) - Logger?.LogError($"The response does not contain the expected data {typeof(RDMSensorValue)}!{Environment.NewLine}{rdmMessage}"); + Logger?.LogError($"The response does not contain the expected data {typeof(RDMSensorDefinition)}!{Environment.NewLine}{rdmMessage}"); else Logger?.LogError($"No response received"); return; } - sensorValues.AddOrUpdate(sensorValue.SensorId, sensorValue, (x, y) => sensorValue); - this.OnPropertyChanged(nameof(this.SensorValues)); + Sensor sensorV = sensors.GetOrAdd(sensorValue.SensorId, (a) => new Sensor(a)); + sensorV.UpdateValue(sensorValue); + this.OnPropertyChanged(nameof(this.Sensors)); break; case IRDMGetParameterWrapperWithEmptyGetRequest @emptyGetRequest: @@ -790,7 +815,16 @@ public async Task UpdateSensorValues() { List tasks = new List(); foreach (var sd in this.DeviceModel.GetSensorDefinitions()) + { + sensors.GetOrAdd(sd.SensorId, (a) => + { + var s = new Sensor(a); + s.UpdateDescription(sd); + return s; + }); + tasks.Add(this.UpdateSensorValue(sd.SensorId)); + } await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(TimeSpan.FromSeconds(10))); } diff --git a/RDMSharp/RDM/Device/RDMDeviceModel.cs b/RDMSharp/RDM/Device/RDMDeviceModel.cs index 43ec3f2..76863bb 100644 --- a/RDMSharp/RDM/Device/RDMDeviceModel.cs +++ b/RDMSharp/RDM/Device/RDMDeviceModel.cs @@ -133,18 +133,78 @@ internal async Task Initialize() if (pw is not IRDMBlueprintParameterWrapper) continue; + RDMMessage request = null; if (pw is IRDMBlueprintDescriptionListParameterWrapper blueprintDL) - pw = pmManager.GetRDMParameterWrapperByID(blueprintDL.ValueParameterID); + { + foreach (IRDMParameterWrapper _pm in blueprintDL.DescriptiveParameters.Select(pid => pmManager.GetRDMParameterWrapperByID(pid))) + await doCurrentWrapper(_pm); + //if (blueprintDL.DescriptiveParameters?.Contains(blueprintDL.ValueParameterID) == false) + // await doCurrentWrapper(pmManager.GetRDMParameterWrapperByID(blueprintDL.ValueParameterID)); - RDMMessage request = null; - if (pw is IRDMGetParameterWrapperWithEmptyGetRequest emptyGet) - request = emptyGet.BuildGetRequestMessage(); + await doCurrentWrapper(pw); + } + else + await doCurrentWrapper(pw); - if (request == null) - continue; + async Task doCurrentWrapper(IRDMParameterWrapper wrapper) + { + if (this.parameterValues.ContainsKey(wrapper.Parameter)) + return; + + switch (wrapper) + { + case IRDMGetParameterWrapperWithEmptyGetRequest emptyGet: + request = emptyGet.BuildGetRequestMessage(); + if (request != null) + await processMessage(await requestParameter(request)); + return; + case IRDMGetParameterWrapperRequest getParameter: + await doRange(getParameter); + return; + + //case IRDMGetParameterWrapperRequestContravariance getContravarianceByte: + // doRange(getContravarianceByte); + // return; + + //case IRDMGetParameterWrapperRequestContravariance getContravarianceObject: + // break; + //case IRDMGetParameterWrapperRequestContravariance getContravarianceObject: + // break; + default: + break; + } - await processMessage(await requestParameter(request)); + + if (request == null) + return; + + + await processMessage(await requestParameter(request)); + async Task doRange(IRDMGetParameterWrapperRequest getParameterWrapperRequest) + { + ERDM_Parameter descriptive; + object dVal = null; + IRequestRange range = null; + if (getParameterWrapperRequest is IRDMBlueprintDescriptionListParameterWrapper blueprintDL) + { + descriptive = blueprintDL.DescriptiveParameters.FirstOrDefault(); + if (descriptive != default) + this.parameterValues.TryGetValue(descriptive, out dVal); + } + if (dVal == null) + return; + range = getParameterWrapperRequest.GetRequestRange(dVal); + if (range == null) + return; + foreach (var r in range.ToEnumerator()) + { + request = getParameterWrapperRequest.BuildGetRequestMessage(r); + if (request != null) + await processMessage(await requestParameter(request)); + } + } + } } IsInitialized = true; Initialized?.Invoke(this, EventArgs.Empty); @@ -345,8 +405,8 @@ public RDMSensorDefinition[] GetSensorDefinitions() return Array.Empty(); else { - var definitions = value as HashSet; - return definitions.Cast().ToArray(); + var definitions = value as ConcurrentDictionary; + return definitions.Values.Cast().ToArray(); } } catch diff --git a/RDMSharp/RDM/IRDMDevice.cs b/RDMSharp/RDM/IRDMDevice.cs index e7be16e..09c5adc 100644 --- a/RDMSharp/RDM/IRDMDevice.cs +++ b/RDMSharp/RDM/IRDMDevice.cs @@ -13,7 +13,7 @@ public interface IRDMDevice : IDisposable, INotifyPropertyChanged RDMDeviceInfo DeviceInfo { get; } IReadOnlyDictionary ParameterValues { get; } - IReadOnlyDictionary SensorValues { get; } + IReadOnlyDictionary Sensors { get; } IReadOnlyDictionary Slots { get; } bool IsDisposing { get; } diff --git a/RDMSharp/RDM/PayloadObject/RequestRange.cs b/RDMSharp/RDM/PayloadObject/RequestRange.cs index 09860b5..57af859 100644 --- a/RDMSharp/RDM/PayloadObject/RequestRange.cs +++ b/RDMSharp/RDM/PayloadObject/RequestRange.cs @@ -3,23 +3,48 @@ namespace RDMSharp { - public class RequestRange + public class RequestRange: IRequestRange, IRequestRange { - public readonly T Start; - public readonly T End; + + object IRequestRange.Start => _start; + + object IRequestRange.End => _end; + + T IRequestRange.Start => (T)Convert.ChangeType(_start, typeof(T)); + + T IRequestRange.End => (T)Convert.ChangeType(_end, typeof(T)); + + private ulong _start; + private ulong _end; public RequestRange(T start, T end) { - this.Start = start; - this.End = end; + _start = Convert.ToUInt64(start); + _end = Convert.ToUInt64(end); } - public IEnumerable ToEnumerator() + IEnumerable IRequestRange.ToEnumerator() { - ulong start = Convert.ToUInt64(this.Start); - ulong end = Convert.ToUInt64(this.End); - for (ulong i = start; i <= end; i++) + for (ulong i = _start; i <= _end; i++) yield return (T)Convert.ChangeType(i, typeof(T)); } + IEnumerable IRequestRange.ToEnumerator() + { + for (ulong i = _start; i <= _end; i++) + yield return (T)Convert.ChangeType(i, typeof(T)); + } + } + public interface IRequestRange + { + T Start { get; } + T End { get; } + public IEnumerable ToEnumerator(); + } + public interface IRequestRange + { + object Start { get; } + object End { get; } + + public IEnumerable ToEnumerator(); } } \ No newline at end of file diff --git a/RDMSharp/RDM/Sensor.cs b/RDMSharp/RDM/Sensor.cs index 5e667b3..6836b98 100644 --- a/RDMSharp/RDM/Sensor.cs +++ b/RDMSharp/RDM/Sensor.cs @@ -9,7 +9,7 @@ public class Sensor : INotifyPropertyChanged, IEquatable { public event PropertyChangedEventHandler PropertyChanged; - public readonly ushort SensorId; + public readonly byte SensorId; private ERDM_SensorType type; public ERDM_SensorType Type @@ -236,10 +236,11 @@ protected Sensor(in byte sensorId, internal void UpdateDescription(RDMSensorDefinition sensorDescription) { if (this.SensorId != sensorDescription.SensorId) - throw new InvalidOperationException($"The given {nameof(sensorDescription)} has not the expected id of {this.SensorId} but {sensorDescription.SlotId}"); + throw new InvalidOperationException($"The given {nameof(sensorDescription)} has not the expected id of {this.SensorId} but {sensorDescription.SensorId}"); this.Description = sensorDescription.Description; this.Type = sensorDescription.Type; + this.Unit = sensorDescription.Unit; this.Prefix = sensorDescription.Prefix; this.RangeMinimum = sensorDescription.RangeMinimum; this.RangeMaximum = sensorDescription.RangeMaximum; @@ -264,17 +265,16 @@ protected virtual void UpdateValue(short value) PresentValue = value; if (this.LowestHighestValueSupported) updateLowestHighstValue(value); - if (this.RecordedValueSupported) - updateLRecordedValue(value); } private void updateLowestHighstValue(short value) { LowestValue = Math.Min(LowestValue, value); HighestValue = Math.Max(HighestValue, value); } - private void updateLRecordedValue(short value) + internal void RecordValue(short value) { - RecordedValue = value; + if (this.RecordedValueSupported) + RecordedValue = value; } internal void ResetValues() { @@ -387,14 +387,28 @@ public override int GetHashCode() #endif } - public static bool operator ==(Sensor left, Sensor right) + + public static implicit operator RDMSensorDefinition(Sensor _this) { - return EqualityComparer.Default.Equals(left, right); + return new RDMSensorDefinition(_this.SensorId, + _this.Type, + _this.Unit, + _this.Prefix, + _this.RangeMinimum, + _this.RangeMaximum, + _this.NormalMinimum, + _this.NormalMaximum, + _this.LowestHighestValueSupported, + _this.RecordedValueSupported, + _this.Description); } - - public static bool operator !=(Sensor left, Sensor right) + public static implicit operator RDMSensorValue(Sensor _this) { - return !(left == right); + return new RDMSensorValue(_this.SensorId, + _this.PresentValue, + _this.LowestValue, + _this.HighestValue, + _this.RecordedValue); } } } \ No newline at end of file diff --git a/RDMSharpTests/Devices/Mock/MockGeneratedDevice1.cs b/RDMSharpTests/Devices/Mock/MockGeneratedDevice1.cs index 1945e7d..fbbdef1 100644 --- a/RDMSharpTests/Devices/Mock/MockGeneratedDevice1.cs +++ b/RDMSharpTests/Devices/Mock/MockGeneratedDevice1.cs @@ -40,10 +40,13 @@ internal sealed class MockGeneratedDevice1 : AbstractMockGeneratedDevice new Slot(8, ERDM_SlotCategory.COLOR_ADD_BLUE,ERDM_SlotType.SEC_FINE, "Blue Fine" ))]; private static readonly Sensor[] SENSORS = [ - new MockSensor1(1, 1, 3000), - new MockSensor1(2, 2, 8000), - new MockSensor1(3, 3, 12000)]; + new MockSensorTemp(0, 1, 3000), + new MockSensorTemp(1, 2, 8000), + new MockSensorTemp(2, 3, 12000), + new MockSensorVolt3_3(3, 331), + new MockSensorVolt5(4, 498)]; public override GeneratedPersonality[] Personalities => PERSONALITYS; + public override Sensor[] Sensors => SENSORS; public MockGeneratedDevice1(RDMUID uid) : base(uid, [ERDM_Parameter.IDENTIFY_DEVICE, ERDM_Parameter.BOOT_SOFTWARE_VERSION_LABEL], "Dummy Manufacturer 9FFF") { this.DeviceLabel = "Dummy Device 1"; @@ -51,9 +54,23 @@ public MockGeneratedDevice1(RDMUID uid) : base(uid, [ERDM_Parameter.IDENTIFY_DEV this.TrySetParameter(ERDM_Parameter.BOOT_SOFTWARE_VERSION_LABEL, $"Dummy Software"); } - private class MockSensor1 : Sensor + private class MockSensorTemp : Sensor { - public MockSensor1(in byte sensorId, byte number, short initValue) : base(sensorId, ERDM_SensorType.TEMPERATURE, ERDM_SensorUnit.CENTIGRADE, ERDM_UnitPrefix.CENTI, $"Mock Temp. {number}", -2000, 10000, 2000, 5000, true, true) + public MockSensorTemp(in byte sensorId, byte number, short initValue) : base(sensorId, ERDM_SensorType.TEMPERATURE, ERDM_SensorUnit.CENTIGRADE, ERDM_UnitPrefix.CENTI, $"Mock Temp. {number}", -2000, 10000, 2000, 5000, true, true) + { + UpdateValue(initValue); + } + } + private class MockSensorVolt3_3 : Sensor + { + public MockSensorVolt3_3(in byte sensorId, short initValue) : base(sensorId, ERDM_SensorType.VOLTAGE, ERDM_SensorUnit.VOLTS_DC, ERDM_UnitPrefix.CENTI, $"Mock 3.3V Rail", -200, 500, 330, 360, true, true) + { + UpdateValue(initValue); + } + } + private class MockSensorVolt5 : Sensor + { + public MockSensorVolt5(in byte sensorId, short initValue) : base(sensorId, ERDM_SensorType.VOLTAGE, ERDM_SensorUnit.VOLTS_DC, ERDM_UnitPrefix.CENTI, $"Mock 5V Rail ", -200, 1000, 470, 530, true, true) { UpdateValue(initValue); } diff --git a/RDMSharpTests/Devices/TestRDMSendReceive.cs b/RDMSharpTests/Devices/TestRDMSendReceive.cs index 34b7e9f..010ff61 100644 --- a/RDMSharpTests/Devices/TestRDMSendReceive.cs +++ b/RDMSharpTests/Devices/TestRDMSendReceive.cs @@ -1,5 +1,6 @@ using RDMSharpTests.Devices.Mock; using System.Diagnostics; +using System.Reflection.Metadata; namespace RDMSharpTests.RDM.Devices { @@ -27,7 +28,8 @@ public async Task TestDevice1() { var parameterValuesRemote = remote.GetAllParameterValues(); var parameterValuesGenerated = generated.GetAllParameterValues(); - Assert.Multiple(() => + + Assert.Multiple(() => { foreach (var parameter in parameterValuesGenerated.Keys) { @@ -41,6 +43,11 @@ public async Task TestDevice1() } Assert.That(parameterValuesRemote, Has.Count.EqualTo(parameterValuesGenerated.Count)); }); + Assert.Multiple(() => + { + Assert.That(remote.DeviceModel.SupportedBlueprintParameters, Contains.Item(ERDM_Parameter.SENSOR_DEFINITION)); + Assert.That(remote.DeviceModel.SupportedNonBlueprintParameters, Contains.Item(ERDM_Parameter.SENSOR_VALUE)); + }); Assert.Multiple(() => { @@ -49,6 +56,15 @@ public async Task TestDevice1() Assert.That(remote.GetAllParameterValues()[ERDM_Parameter.DEVICE_MODEL_DESCRIPTION], Is.EqualTo(generated.DeviceModelDescription)); Assert.That(remote.GetAllParameterValues()[ERDM_Parameter.MANUFACTURER_LABEL], Is.EqualTo(generated.ManufacturerLabel)); Assert.That(((RDMDMXPersonality)remote.GetAllParameterValues()[ERDM_Parameter.DMX_PERSONALITY]).Index, Is.EqualTo(generated.CurrentPersonality)); + }); + Assert.Multiple(() => + { + Assert.That(remote.Sensors.Values, Has.Count.EqualTo(generated.Sensors.Length)); + Assert.That(remote.Sensors.Values, Is.EqualTo(generated.Sensors)); + foreach (var s in generated.Sensors) + { + Assert.That(remote.Sensors.Values, Contains.Item(s)); + } }); await remote.SetParameter(ERDM_Parameter.DMX_START_ADDRESS, (ushort)512);