130 lines
3.6 KiB
C#
130 lines
3.6 KiB
C#
using MoniteurBaie.DataModels;
|
|
using MoniteurBaie.Utils;
|
|
|
|
namespace MoniteurBaie.SerialCom;
|
|
|
|
public sealed class MockBatteryController : IBatteryController
|
|
{
|
|
private readonly List<IObserver<BatteryControllerPacket>> _serialObservers = new();
|
|
private readonly BlockingListener<string> _commandListener = new();
|
|
|
|
public Task Open(CancellationToken cancellationToken)
|
|
{
|
|
var readThread = new Thread(DoRead)
|
|
{
|
|
IsBackground = true
|
|
};
|
|
readThread.Start();
|
|
|
|
var writeThread = new Thread(DoWrite)
|
|
{
|
|
IsBackground = true
|
|
};
|
|
writeThread.Start();
|
|
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
public IDisposable AddSerialObserver(IObserver<BatteryControllerPacket> observer)
|
|
{
|
|
_serialObservers.Add(observer);
|
|
return new Disposer(() => _serialObservers.Remove(observer));
|
|
}
|
|
|
|
public Task SendCommand(string command, CancellationToken cancellationToken)
|
|
{
|
|
_commandListener.Push(command);
|
|
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
private void DoRead()
|
|
{
|
|
while (true)
|
|
{
|
|
var packet = CreateFakePacket();
|
|
|
|
foreach (var observer in _serialObservers)
|
|
{
|
|
observer.OnNext(packet);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static BatteryControllerPacket CreateFakePacket()
|
|
{
|
|
Thread.Sleep(Random.Shared.Next(1000 - 50, 1000 + 50));
|
|
|
|
return new(
|
|
DateTime.Now,
|
|
$"COM,{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.NextSingle()},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(100)},{Random.Shared.Next(100)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)},{Random.Shared.Next(2)}");
|
|
}
|
|
|
|
private void DoWrite()
|
|
{
|
|
try
|
|
{
|
|
while (true)
|
|
{
|
|
_commandListener.Next();
|
|
}
|
|
}
|
|
catch (ObjectDisposedException)
|
|
{
|
|
}
|
|
}
|
|
|
|
#region IObservable
|
|
|
|
IDisposable IObservable<BatteryControllerPacket>.Subscribe(IObserver<BatteryControllerPacket> observer)
|
|
{
|
|
return AddSerialObserver(observer);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IObserver
|
|
|
|
void IObserver<string>.OnCompleted()
|
|
{
|
|
|
|
}
|
|
|
|
void IObserver<string>.OnError(Exception error)
|
|
{
|
|
|
|
}
|
|
|
|
void IObserver<string>.OnNext(string value)
|
|
{
|
|
SendCommand(value, default);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IDisposable
|
|
|
|
private bool _disposedValue;
|
|
|
|
private void Dispose(bool disposing)
|
|
{
|
|
if (!_disposedValue)
|
|
{
|
|
if (disposing)
|
|
{
|
|
_commandListener.Dispose();
|
|
}
|
|
|
|
_disposedValue = true;
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(disposing: true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
#endregion
|
|
}
|