Auto: focas-f3a — cnc_rdalmhistry alarm-history extension
Adds FocasAlarmProjection with two modes (ActiveOnly default, ActivePlusHistory) that polls cnc_rdalmhistry on connect + on a configurable cadence (5 min default, HistoryDepth=100 capped at 250). Emits historic events via IAlarmSource with SourceTimestampUtc set from the CNC's reported timestamp; dedup keyed on (OccurrenceTime, AlarmNumber, AlarmType). Ships the ODBALMHIS packed-buffer decoder + encoder in Wire/FocasAlarmHistoryDecoder.cs and threads ReadAlarmHistoryAsync through IFocasClient (default no-op so existing transport variants stay back-compat). FocasDriver now implements IAlarmSource. 13 new unit tests cover: mode switch, dedup, distinct-timestamp emission, type-as-key behaviour, OccurrenceTime passthrough (not Now), HistoryDepth clamp/fallback, and decoder round-trip. All 341 FOCAS unit tests still pass. Docs: docs/drivers/FOCAS.md (new), docs/v2/focas-deployment.md (new), docs/v2/implementation/focas-wire-protocol.md (new), docs/v2/implementation/focas-simulator-plan.md (new), docs/drivers/FOCAS-Test-Fixture.md (alarm-history bullet appended). Closes #267
This commit is contained in:
@@ -107,6 +107,29 @@ internal class FakeFocasClient : IFocasClient
|
||||
return Task.FromResult<(byte[]?, uint)>((buf, FocasStatusMapper.Good));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Canned alarm-history payload returned to <see cref="ReadAlarmHistoryAsync"/>.
|
||||
/// Defaults to empty so tests that don't care about history get the back-compat
|
||||
/// no-op behaviour. Tests asserting <c>cnc_rdalmhistry</c> behaviour seed entries
|
||||
/// here (issue #267, plan PR F3-a).
|
||||
/// </summary>
|
||||
public List<FocasAlarmHistoryEntry> AlarmHistory { get; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// Ordered log of <c>cnc_rdalmhistry</c>-shaped calls observed on this fake session
|
||||
/// (depth-per-call). Tests assert this length to verify the projection's poll
|
||||
/// cadence + that <c>HistoryDepth</c> got clamped to the wire correctly.
|
||||
/// </summary>
|
||||
public List<int> AlarmHistoryReadLog { get; } = new();
|
||||
|
||||
public virtual Task<IReadOnlyList<FocasAlarmHistoryEntry>> ReadAlarmHistoryAsync(
|
||||
int depth, CancellationToken ct)
|
||||
{
|
||||
AlarmHistoryReadLog.Add(depth);
|
||||
IReadOnlyList<FocasAlarmHistoryEntry> snap = AlarmHistory.ToList();
|
||||
return Task.FromResult(snap);
|
||||
}
|
||||
|
||||
public virtual void Dispose()
|
||||
{
|
||||
DisposeCount++;
|
||||
|
||||
Reference in New Issue
Block a user