/
MAVList.cs
158 lines (133 loc) · 4.26 KB
/
MAVList.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace MissionPlanner.Mavlink
{
public class MAVList : IEnumerable<MAVState>, IDisposable
{
private Dictionary<int, MAVState> masterlist = new Dictionary<int, MAVState>();
private Dictionary<int, MAVState> hiddenlist = new Dictionary<int, MAVState>();
public MAVLinkInterface parent;
object locker = new object();
public MAVList(MAVLinkInterface mavLinkInterface)
{
parent = mavLinkInterface;
// add blank item
hiddenlist.Add(0, new MAVState(parent, 0, 0));
}
public void AddHiddenList(byte sysid, byte compid)
{
int id = GetID((byte)sysid, (byte)compid);
lock (locker)
hiddenlist[id] = new MAVState(parent, sysid, compid);
}
public MAVState this[int sysid, int compid]
{
get
{
int id = GetID((byte)sysid, (byte)compid);
lock (locker)
{
// 3dr radio special case
if (hiddenlist.ContainsKey(id))
return hiddenlist[id];
if (!masterlist.ContainsKey(id))
{
AddHiddenList((byte) sysid, (byte) compid);
return hiddenlist[id];
}
return masterlist[id];
}
}
set
{
int id = GetID((byte)sysid, (byte)compid);
lock (locker)
{
masterlist[id] = value;
}
}
}
public int Count
{
get { return masterlist.Count; }
}
public List<int> GetRawIDS()
{
return masterlist.Keys.ToList<int>();
}
public void Clear()
{
masterlist.Clear();
}
public bool Contains(byte sysid, byte compid, bool includehidden = true)
{
lock (locker)
{
foreach (var item in masterlist.ToArray())
{
if (item.Value.sysid == sysid && item.Value.compid == compid)
return true;
}
if (includehidden)
{
foreach (var item in hiddenlist.ToArray())
{
if (item.Value.sysid == sysid && item.Value.compid == compid)
return true;
}
}
}
return false;
}
internal void Create(byte sysid, byte compid)
{
int id = GetID((byte)sysid, (byte)compid);
lock (locker)
{
// move from hidden to visible
if (hiddenlist.ContainsKey(id))
{
masterlist[id] = hiddenlist[id];
hiddenlist.Remove(id);
}
if (!masterlist.ContainsKey(id))
masterlist[id] = new MAVState(parent, sysid, compid);
}
}
public IEnumerator<MAVState> GetEnumerator()
{
foreach (var key in masterlist.Values.ToArray())
{
yield return key;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public static int GetID(byte sysid, byte compid)
{
return sysid*256 + compid;
}
public static (byte sysid, byte compid) FromID(int id)
{
return ((byte)(id / 256), (byte)(id & 0xff));
}
public void Dispose()
{
lock (locker)
{
foreach (var MAV in hiddenlist)
{
MAV.Value.Dispose();
}
foreach (var MAV in masterlist)
{
MAV.Value.Dispose();
}
}
}
}
}