40 lines
1.1 KiB
C#
40 lines
1.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Domain;
|
|
|
|
namespace Client;
|
|
|
|
public class FrameAssembler
|
|
{
|
|
private readonly Action<List<Data>> _frameCallback;
|
|
private readonly Dictionary<long, Dictionary<string, Data>> _frames = new();
|
|
private const int FrameSize = 9;
|
|
|
|
public FrameAssembler(Action<List<Data>> frameCallback)
|
|
{
|
|
_frameCallback = frameCallback ?? throw new ArgumentNullException(nameof(frameCallback));
|
|
}
|
|
|
|
public void AddData(Data data)
|
|
{
|
|
long frameIndex = data.FrameIndex;
|
|
string overlayPoint = data.OverlayPoint;
|
|
|
|
if (!_frames.ContainsKey(frameIndex))
|
|
{
|
|
_frames[frameIndex] = new Dictionary<string, Data>();
|
|
}
|
|
|
|
_frames[frameIndex][overlayPoint] = data; // Overwrite if duplicate
|
|
|
|
if (_frames[frameIndex].Count == FrameSize)
|
|
{
|
|
List<Data> frameData = _frames[frameIndex].Values
|
|
.OrderBy(d => d.OverlayPoint)
|
|
.ToList();
|
|
_frameCallback(frameData);
|
|
_frames.Remove(frameIndex);
|
|
}
|
|
}
|
|
} |