Files
adas-core/adas-core.module.Relays/Devices/RelayDevice.cs
T

86 lines
2.4 KiB
C#

using System.Collections.Concurrent;
using adas_core.Domain.Enums;
using adas_core.Domain.Models.MongoModels;
using adas_core.module.Relays.Models;
using Timer = System.Timers.Timer;
namespace adas_core.module.Relays.Devices;
public abstract class RelayDevice
{
private readonly ConcurrentDictionary<int, RelayEnum.Status> _relaysStatus = new();
private readonly Timer? _timer;
public readonly Relay Relay;
public readonly RelaySettings RelaySettings;
//string host, int port, int relays, int? refreshTime, EventHandler refreshEvent
protected RelayDevice(Relay relay, RelaySettings relaySettings)
{
Relay = relay;
RelaySettings = relaySettings;
if (relaySettings.RefreshTime is > 0)
{
_timer = new Timer();
_timer.Interval = relaySettings.RefreshTime.Value * 1000;
_timer.Elapsed += delegate
{
_timer.Stop();
CheckStatus();
_timer.Start();
};
_timer.Start();
}
}
public event EventHandler<int>? RelayStatusChanged;
public abstract bool CheckDevice();
public abstract void CheckStatus();
public abstract bool GetStatusRelay();
public abstract Task<bool> GetStatusRelayAsync();
public virtual RelayEnum.Status GetStatusRelay(int outletId)
{
lock (_relaysStatus)
{
return _relaysStatus.GetValueOrDefault(outletId, RelayEnum.Status.Unknown);
}
}
public virtual void SetStatusRelay(int outletId, RelayEnum.Status status)
{
lock (_relaysStatus)
{
if (!_relaysStatus.ContainsKey(outletId) || _relaysStatus[outletId] != status)
RelayStatusChanged?.Invoke(this, outletId);
_relaysStatus[outletId] = status;
}
}
public virtual void PowerOnOffRelay(int outletId, int milliseconds)
{
Task.Run(() =>
{
PowerOffRelay(outletId);
Task.Delay(milliseconds);
PowerOnRelay(outletId);
});
}
public virtual void Refresh()
{
}
public abstract void PowerOnRelay(int outletId);
public abstract void PowerOffRelay(int outletId);
public abstract void PowerOnAll();
public abstract void PowerOffAll();
public abstract void RebootOutlet(int outletId);
public abstract void Reboot();
}