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; } } }