forked from CPL/Simulator
127 lines
3.5 KiB
C#
127 lines
3.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using TelemetryIO;
|
|
|
|
namespace DroneClient.Models
|
|
{
|
|
public class monitorItem
|
|
{
|
|
public int slotNo = 0;
|
|
public int offset = 0;
|
|
public int len = 0;
|
|
public int id = 0;
|
|
|
|
public monitorItem()
|
|
{
|
|
|
|
}
|
|
public monitorItem(int slotNo, int offset, int len, int id)
|
|
{
|
|
this.slotNo = slotNo;
|
|
this.offset = offset;
|
|
this.len = len;
|
|
this.id = id;
|
|
}
|
|
}
|
|
|
|
public class MonitorContainer
|
|
{
|
|
public const int monitorMaxFill = 32;
|
|
public int monitorFillLevel = 0;
|
|
public monitorItem[] monitorItems = new monitorItem[monitorMaxFill];
|
|
public int isMonitor = 0;
|
|
private static volatile MonitorContainer instance;
|
|
private static readonly object _lock = new object();
|
|
|
|
public static MonitorContainer Instance
|
|
{
|
|
get
|
|
{
|
|
if (instance == null)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
if (instance == null)
|
|
{
|
|
instance = new MonitorContainer();
|
|
}
|
|
}
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
}
|
|
|
|
private MonitorContainer()
|
|
{
|
|
for (int i = 0; i < monitorMaxFill; i++)
|
|
{
|
|
monitorItems[i] = new monitorItem();
|
|
}
|
|
}
|
|
|
|
public void resetMonitorContainer()
|
|
{
|
|
for (int i = 0; i < monitorMaxFill; i++)
|
|
{
|
|
monitorItems[i] = new monitorItem();
|
|
}
|
|
}
|
|
|
|
public int monitorPut(int slot, int offset, int len)
|
|
{
|
|
int ret_id = 0;
|
|
if (monitorFillLevel < monitorMaxFill)
|
|
{
|
|
monitorItems[monitorFillLevel].slotNo = slot;
|
|
monitorItems[monitorFillLevel].offset = offset;
|
|
monitorItems[monitorFillLevel].len = len;
|
|
monitorItems[monitorFillLevel].id = (slot << 8) + offset;
|
|
ret_id = monitorItems[monitorFillLevel].id;
|
|
monitorFillLevel++;
|
|
isMonitor = 1;
|
|
}
|
|
|
|
return ret_id;
|
|
}
|
|
|
|
public int monitorRemove(int id)
|
|
{
|
|
int match = 0;
|
|
int ret_id = 0;
|
|
for (int i = 0; i < monitorMaxFill; i++)
|
|
{
|
|
if (monitorItems[i].id == id)
|
|
{
|
|
match = 1;
|
|
if (monitorFillLevel > 0) monitorFillLevel--;
|
|
ret_id = id;
|
|
}
|
|
|
|
if (match > 0)
|
|
{
|
|
if (monitorItems[i].len == 0) return ret_id;
|
|
if (i < 31)
|
|
{
|
|
monitorItems[i].id = monitorItems[i + 1].id;
|
|
monitorItems[i].offset = monitorItems[i + 1].offset;
|
|
monitorItems[i].slotNo = monitorItems[i + 1].slotNo;
|
|
monitorItems[i].len = monitorItems[i + 1].len;
|
|
}
|
|
else
|
|
{
|
|
monitorItems[i].id = 0;
|
|
monitorItems[i].offset = 0;
|
|
monitorItems[i].slotNo = 0;
|
|
monitorItems[i].len = 0;
|
|
}
|
|
}
|
|
}
|
|
return ret_id;
|
|
}
|
|
}
|
|
}
|