Skip to content

Commit

Permalink
Strongly type event handlers (no more casting)
Browse files Browse the repository at this point in the history
  • Loading branch information
jdomnitz committed Sep 3, 2024
1 parent f5b8af9 commit f5eacc5
Show file tree
Hide file tree
Showing 51 changed files with 86 additions and 91 deletions.
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,6 @@ dotnet_diagnostic.CA2016.severity = error

# IDE0042: Deconstruct variable declaration
dotnet_diagnostic.IDE0042.severity = none

# CA2200: Rethrow to preserve stack details
dotnet_diagnostic.CA2200.severity = suggestion
3 changes: 2 additions & 1 deletion TestConsole/TestConsole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Serilog;
using System.Reflection;
using ZWaveDotNet.CommandClasses;
using ZWaveDotNet.CommandClassReports;
using ZWaveDotNet.Entities;
using ZWaveDotNet.Entities.Enums;
using ZWaveDotNet.Enums;
Expand Down Expand Up @@ -130,7 +131,7 @@ private static void AttachListeners(Node node)
node.GetCommandClass<SwitchBinary>()!.SwitchReport += Node_Updated;
}

private static async Task Node_Updated(Node sender, CommandClassEventArgs args)
private static async Task Node_Updated<T>(Node sender, CommandClassEventArgs<T> args) where T : ICommandClassReport
{
if (args.Report == null)
return;
Expand Down
2 changes: 1 addition & 1 deletion UnitTests/UnitTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
<PackageReference Include="NUnit" Version="4.2.1" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="NUnit.Analyzers" Version="4.3.0">
<PrivateAssets>all</PrivateAssets>
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Alarm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.Alarm, 1, 2)]
public class Alarm : CommandClassBase
{
public event CommandClassEvent? Updated;
public event CommandClassEvent<AlarmReport>? Updated;

enum AlarmCommand
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/ApplicationCapability.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.ApplicationCapability)]
public class ApplicationCapability : CommandClassBase
{
public event CommandClassEvent? CommandClassUnsupported;
public event CommandClassEvent<ApplicationCapabilityReport>? CommandClassUnsupported;

public ApplicationCapability(Node node, byte endpoint) : base(node, endpoint, CommandClass.ApplicationCapability) { }

Expand Down
4 changes: 2 additions & 2 deletions ZWaveDotNet/CommandClasses/ApplicationStatus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.ApplicationStatus)]
public class ApplicationStatus : CommandClassBase
{
public event CommandClassEvent? ApplicationBusy;
public event CommandClassEvent? RequestRejected;
public event CommandClassEvent<ApplicationStatusReport>? ApplicationBusy;
public event CommandClassEvent<ReportMessage>? RequestRejected;

enum ApplicationStatusCommands
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Basic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.Basic, 2)]
public class Basic : CommandClassBase
{
public event CommandClassEvent? Report;
public event CommandClassEvent<BasicReport>? Report;

enum BasicCommand : byte
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/BasicTariff.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.BasicTariff)]
public class BasicTariff : CommandClassBase
{
public event CommandClassEvent? Report;
public event CommandClassEvent<BasicTariffReport>? Report;

enum BasicTariffCommand : byte
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Battery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.Battery, 3)]
public class Battery : CommandClassBase
{
public event CommandClassEvent? Status;
public event CommandClassEvent<BatteryLevelReport>? Status;

enum BatteryCommand
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/CentralScene.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.CentralScene, 1, 3)]
public class CentralScene : CommandClassBase
{
public event CommandClassEvent? SceneNotification;
public event CommandClassEvent<CentralSceneNotification>? SceneNotification;

enum CentralSceneCommand : byte
{
Expand Down
6 changes: 3 additions & 3 deletions ZWaveDotNet/CommandClasses/CommandClassBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace ZWaveDotNet.CommandClasses
{
public abstract class CommandClassBase
{
public delegate Task CommandClassEvent(Node sender, CommandClassEventArgs args);
public delegate Task CommandClassEvent<T>(Node sender, CommandClassEventArgs<T> args) where T : ICommandClassReport;
public bool Secure;

protected Node node;
Expand Down Expand Up @@ -300,10 +300,10 @@ protected async Task<ReportMessage> SendReceive(Enum command, Enum response, Can
return await src.Task;
}

protected async Task FireEvent(CommandClassEvent? evt, ICommandClassReport? report)
protected async Task FireEvent<T>(CommandClassEvent<T>? evt, T? report) where T : ICommandClassReport?

Check warning on line 303 in ZWaveDotNet/CommandClasses/CommandClassBase.cs

View workflow job for this annotation

GitHub Actions / build

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'CommandClassBase.CommandClassEvent<T>'. Nullability of type argument 'T' doesn't match constraint type 'ZWaveDotNet.CommandClassReports.ICommandClassReport'.
{
if (evt != null)
await evt.Invoke(node, new CommandClassEventArgs(this, report));
await evt.Invoke(node, new CommandClassEventArgs<T>(this, report));
}
}
}
6 changes: 3 additions & 3 deletions ZWaveDotNet/CommandClasses/CommandClassEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@

namespace ZWaveDotNet.CommandClasses
{
public class CommandClassEventArgs : EventArgs
public class CommandClassEventArgs<T> : EventArgs where T : ICommandClassReport
{
public ICommandClassReport? Report { get; set; }
public T? Report { get; set; }
public CommandClassBase Source { get; set; }

public CommandClassEventArgs(CommandClassBase source, ICommandClassReport? report)
public CommandClassEventArgs(CommandClassBase source, T? report)
{
Report = report;
Source = source;
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/DeviceResetLocally.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.DeviceResetLocally)]
public class DeviceResetLocally : CommandClassBase
{
public event CommandClassEvent? DeviceReset;
public event CommandClassEvent<ReportMessage>? DeviceReset;
public enum ResetLocallyCommand
{
Notification = 0x01
Expand Down
2 changes: 0 additions & 2 deletions ZWaveDotNet/CommandClasses/HRVControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ public class HRVControl : CommandClassBase
{
public HRVControl(Node node, byte endpoint) : base(node, endpoint, CommandClass.HRVControl) { }

public event CommandClassEvent? Updated;

enum HRVControlCommand
{
ModeSet = 0x01,
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/HRVStatus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class HRVStatus : CommandClassBase
{
public HRVStatus(Node node, byte endpoint) : base(node, endpoint, CommandClass.HRVStatus) { }

public event CommandClassEvent? Updated;
public event CommandClassEvent<HRVStatusReport>? Updated;

enum HRVStatusCommand
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Hail.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.Hail)]
public class Hail : CommandClassBase
{
public event CommandClassEvent? Hailed;
public event CommandClassEvent<ReportMessage>? Hailed;

enum HailCommand : byte
{
Expand Down
2 changes: 0 additions & 2 deletions ZWaveDotNet/CommandClasses/HumidityControlMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ public class HumidityControlMode : CommandClassBase
{
public HumidityControlMode(Node node, byte endpoint) : base(node, endpoint, CommandClass.HumidityControlMode) { }

public event CommandClassEvent? Updated;

enum HumidityControlModeCommand
{
Set = 0x01,
Expand Down
2 changes: 0 additions & 2 deletions ZWaveDotNet/CommandClasses/HumidityControlOperatingState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ public class HumidityControlOperatingState : CommandClassBase
{
public HumidityControlOperatingState(Node node, byte endpoint) : base(node, endpoint, CommandClass.HumidityControlOperatingState) { }

public event CommandClassEvent? Updated;

enum HumidityControlOperatingStateCommand
{
Get = 0x01,
Expand Down
2 changes: 0 additions & 2 deletions ZWaveDotNet/CommandClasses/HumidityControlSetpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ public class HumidityControlSetpoint : CommandClassBase
{
public HumidityControlSetpoint(Node node, byte endpoint) : base(node, endpoint, CommandClass.HumidityControlSetpoint) { }

public event CommandClassEvent? Updated;

enum HumidityControlSetpointCommand
{
Set = 0x01,
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/MTPWindowCovering.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.MTPWindowCovering)]
public class MTPWindowCovering : CommandClassBase
{
public event CommandClassEvent? PositionChanged;
public event CommandClassEvent<MTPWindowCoveringReport>? PositionChanged;

enum MTPWindowCommand : byte
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/ManufacturerProprietary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.ManufacturerProprietary)]
public class ManufacturerProprietary : CommandClassBase
{
public event CommandClassEvent? Received;
public event CommandClassEvent<ManufacturerProprietaryReport>? Received;

public ManufacturerProprietary(Node node, byte endpoint) : base(node, endpoint, CommandClass.ManufacturerProprietary) { }

Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Meter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.Meter, 1, 6)]
public class Meter : CommandClassBase
{
public event CommandClassEvent? Updated;
public event CommandClassEvent<MeterReport>? Updated;

enum MeterCommand
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/MeterPulse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.MeterPulse)]
public class MeterPulse : CommandClassBase
{
public event CommandClassEvent? Report;
public event CommandClassEvent<MeterPulseReport>? Report;

enum MeterPulseCommand : byte
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/MultiChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.MultiChannel, 1, 4)]
public class MultiChannel : CommandClassBase
{
public event CommandClassEvent? EndpointCapabilitiesUpdated;
public event CommandClassEvent<EndPointCapabilities>? EndpointCapabilitiesUpdated;

public enum MultiChannelCommand
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Notification.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class Notification : CommandClassBase
{
private const byte FIRST_AVAILABLE = 0xFF;

public event CommandClassEvent? Updated;
public event CommandClassEvent<NotificationReport>? Updated;

enum NotificationCommand
{
Expand Down
2 changes: 1 addition & 1 deletion ZWaveDotNet/CommandClasses/Proprietary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace ZWaveDotNet.CommandClasses
[CCVersion(CommandClass.Proprietary)]
public class Proprietary : CommandClassBase
{
public event CommandClassEvent? Report;
public event CommandClassEvent<ReportMessage>? Report;

enum ProprietaryCommand : byte
{
Expand Down
14 changes: 7 additions & 7 deletions ZWaveDotNet/CommandClasses/Security0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,14 @@ internal async Task SchemeGet(CancellationToken cancellationToken = default)

internal async Task KeySet(CancellationToken cancellationToken = default)
{
Log.Information($"Setting Network Key on {node.ID}");
Log.Verbose($"Setting Network Key on {node.ID}");
CommandMessage data = new CommandMessage(controller, node.ID, endpoint, commandClass, (byte)Security0Command.NetworkKeySet, false, controller.NetworkKeyS0);
await TransmitTemp(data.Payload, cancellationToken).ConfigureAwait(false);
}

protected async Task<ReportMessage> GetNonce(CancellationToken cancellationToken)
{
Log.Information("Fetching Nonce");
Log.Verbose("Fetching Nonce");
return await SendReceive(Security0Command.NonceGet, Security0Command.NonceReport, cancellationToken);
}

Expand All @@ -84,7 +84,7 @@ public async Task TransmitTemp(List<byte> payload, CancellationToken cancellatio
return; //This should never happen
}

Log.Information("Creating Temp Payload for " + node.ID.ToString());
Log.Verbose("Creating Temp Payload for " + node.ID.ToString());
byte[] receiversNonce = report.Payload.ToArray();
byte[] sendersNonce = new byte[8];
new Random().NextBytes(sendersNonce);
Expand All @@ -107,7 +107,7 @@ public async Task Encapsulate(List<byte> payload, CancellationToken cancellation
if (report.IsMulticastMethod())
return; //This should never happen

Log.Information("Creating Payload for " + node.ID.ToString());
Log.Verbose("Creating Payload for " + node.ID.ToString());
byte[] receiversNonce = report.Payload.ToArray();
byte[] sendersNonce = new byte[8];
new Random().NextBytes(sendersNonce);
Expand Down Expand Up @@ -159,12 +159,12 @@ public async Task Encapsulate(List<byte> payload, CancellationToken cancellation

if (msg.Command == (byte)Security0Command.MessageEncapNonceGet)
{
Log.Information("Providing Next Nonce");
Log.Verbose("Providing Next Nonce");
using CancellationTokenSource cts = new CancellationTokenSource(3000);
await controller.Nodes[msg.SourceNodeID].GetCommandClass<Security0>()!.SendCommand(Security0Command.NonceReport, cts.Token, controller.SecurityManager.CreateS0Nonce(msg.SourceNodeID)).ConfigureAwait(false);
}

Log.Information("Decrypted: " + msg.ToString());
Log.Verbose("Decrypted: " + msg.ToString());
return msg;
}

Expand All @@ -179,7 +179,7 @@ protected override async Task<SupervisionStatus> Handle(ReportMessage message)
return SupervisionStatus.Fail;
if (message.SecurityLevel != SecurityKey.S0 || (message.Flags & ReportFlags.Security) != ReportFlags.Security)
{
Log.Information("Network Key Verify Received without proper security");
Log.Warning("Network Key Verify Received without proper security");
return SupervisionStatus.Fail;
}
keyVerified.TrySetResult();
Expand Down
Loading

0 comments on commit f5eacc5

Please sign in to comment.