Files

172 lines
5.7 KiB
C#

using System;
namespace StandardScene.Fass2Simulator
{
public sealed class Fass2SimVehicle
{
private readonly object _syncRoot = new object();
public Fass2SimVehicle(Fass2SimConfig config)
{
Car = config.VehicleCode;
Length = config.CarLength;
Width = config.CarWidth;
BatteryCharge = config.BatteryCharge;
BatteryHealth = 100;
BatteryVoltage = 480;
State = config.InitialState;
Node = config.InitialNode;
Speed = 500;
}
public ushort Car { get; }
public ushort Length { get; set; }
public ushort Width { get; set; }
public byte BatteryCharge { get; set; }
public byte BatteryHealth { get; set; }
public ushort BatteryCurrent { get; set; }
public ushort BatteryVoltage { get; set; }
public ushort HeadingAngle { get; set; }
public byte State { get; set; }
public ulong Alarm { get; set; }
public ulong Task { get; set; }
public byte LastCommand { get; set; }
public ushort Node { get; set; }
public ushort Distance { get; set; }
public byte StartStop { get; set; }
public byte Direction { get; set; }
public byte Orientation { get; set; }
public byte Byroad { get; set; }
public ushort Speed { get; set; }
public byte Obstacle { get; set; }
public byte Audio { get; set; }
public byte Light { get; set; }
public byte Charge { get; set; }
public byte Rest { get; set; }
public byte Lift { get; set; }
public byte Clamp { get; set; }
public byte Tray { get; set; }
public byte Roll { get; set; }
public byte Shutdown { get; set; }
public long StateReportsSent { get; private set; }
public long CommandsReceived { get; private set; }
public long AckReceived { get; private set; }
public DateTime LastAckUtc { get; private set; } = DateTime.MinValue;
public void RecordStateReportSent()
{
lock (_syncRoot)
{
StateReportsSent++;
}
}
public void RecordCommandReceived()
{
lock (_syncRoot)
{
CommandsReceived++;
}
}
public void RecordAckReceived()
{
lock (_syncRoot)
{
AckReceived++;
LastAckUtc = DateTime.UtcNow;
}
}
public Fass2SimVehicleSnapshot Snapshot()
{
lock (_syncRoot)
{
return CopySnapshotUnsafe();
}
}
/// <summary>
/// 供已持有其它引擎锁的代码路径读取快照,避免与 UI 线程 Snapshot() 争用 _syncRoot 导致死锁。
/// </summary>
internal Fass2SimVehicleSnapshot CopySnapshotUnsafe()
{
return new Fass2SimVehicleSnapshot
{
Car = Car,
Length = Length,
Width = Width,
BatteryCharge = BatteryCharge,
BatteryHealth = BatteryHealth,
BatteryCurrent = BatteryCurrent,
BatteryVoltage = BatteryVoltage,
HeadingAngle = HeadingAngle,
State = State,
Alarm = Alarm,
Task = Task,
LastCommand = LastCommand,
Node = Node,
Distance = Distance,
StartStop = StartStop,
Direction = Direction,
Orientation = Orientation,
Byroad = Byroad,
Speed = Speed,
Obstacle = Obstacle,
Audio = Audio,
Light = Light,
Charge = Charge,
Rest = Rest,
Lift = Lift,
Clamp = Clamp,
Tray = Tray,
Roll = Roll,
Shutdown = Shutdown,
StateReportsSent = StateReportsSent,
CommandsReceived = CommandsReceived,
AckReceived = AckReceived,
LastAckUtc = LastAckUtc
};
}
}
public sealed class Fass2SimVehicleSnapshot
{
public ushort Car { get; set; }
public ushort Length { get; set; }
public ushort Width { get; set; }
public byte BatteryCharge { get; set; }
public byte BatteryHealth { get; set; }
public ushort BatteryCurrent { get; set; }
public ushort BatteryVoltage { get; set; }
public ushort HeadingAngle { get; set; }
public byte State { get; set; }
public ulong Alarm { get; set; }
public ulong Task { get; set; }
public byte LastCommand { get; set; }
public ushort Node { get; set; }
public ushort Distance { get; set; }
public byte StartStop { get; set; }
public byte Direction { get; set; }
public byte Orientation { get; set; }
public byte Byroad { get; set; }
public ushort Speed { get; set; }
public byte Obstacle { get; set; }
public byte Audio { get; set; }
public byte Light { get; set; }
public byte Charge { get; set; }
public byte Rest { get; set; }
public byte Lift { get; set; }
public byte Clamp { get; set; }
public byte Tray { get; set; }
public byte Roll { get; set; }
public byte Shutdown { get; set; }
public long StateReportsSent { get; set; }
public long CommandsReceived { get; set; }
public long AckReceived { get; set; }
public DateTime LastAckUtc { get; set; }
}
}