-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcas5_decoder_plugin.cs
More file actions
278 lines (227 loc) · 10.5 KB
/
cas5_decoder_plugin.cs
File metadata and controls
278 lines (227 loc) · 10.5 KB
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
using TLMSuite.decoder;
using System.Collections;
namespace tlm_cas5_plugin
{
public class cas5_decoder_plugin : TLMSuite.decoder.IPlugin
{
public int Version
{
get
{
return 1;
}
}
public string Author
{
get
{
return "Tom - ZR6TG";
}
}
public string Name
{
get
{
return "Cas-5a Telemetry Decoder";
}
}
public int NoradID
{
get
{
return 54684;
}
}
public string Description
{
get
{
return "A decoder pluging for Cas-5A. Use HS Soundmodem from http://uz7.ho.ua/packetradio.htm. \nUse FSK G3RUH 4800bd setting for Sound Modem to decode received packets.";
}
}
string hexData(byte[] arr)
{
string hexframe = "";
for (int x = 0; x < arr.Length; x++)
{
hexframe += arr[x].ToString("X2");
}
return hexframe;
}
string hexData(byte[] arr, int start, int end)
{
string hexframe = "";
for (int x = start; x <= end; x++)
{
hexframe += arr[x].ToString("X2");
}
return hexframe;
}
string binaryData(byte data)
{
return Convert.ToString(data, 2).PadLeft(8,'0');
}
int temperatureConversion(byte data)
{
int temperature = 0;
temperature = data & 0x7F;
int sign = data & 0x80;
if (sign == 128)
temperature *= -1;
return temperature;
}
double voltageConversion(byte p1, byte p2)
{
double voltage = 0;
voltage = Convert.ToDouble(p1.ToString() + "." + p2.ToString());
return voltage;
}
int currentConversion(byte[] data, int index)
{
int current = 0;
current = BitConverter.ToUInt16(new byte[] { data[index + 1], data[index] },0);
return current;
}
string cameraQuality(byte data)
{
switch (data)
{
case 0: return "Highest Quality";
case 1: return "Medium Quality";
case 2: return "Low Quality";
}
return "Unknown";
}
string cameraResolution(byte data)
{
switch (data)
{
case 0: return "800x480";
case 1: return "1280x720";
case 2: return "320x240";
case 3: return "1440x896";
case 4: return "640x480";
case 5: return "1920x1080";
case 6: return "800x600";
case 7: return "1024x768";
}
return "Unknown";
}
string datetimeFormat(byte[] data, int index)
{
string dateString = "";
dateString = data[index].ToString().PadLeft(2, '0') + "/";
dateString += data[index+1].ToString().PadLeft(2, '0') + "/";
dateString += data[index+2].ToString().PadLeft(2, '0') + " ";
dateString += data[index+3].ToString().PadLeft(2, '0') + ":";
dateString += data[index+4].ToString().PadLeft(2, '0') + ":";
dateString += data[index + 5].ToString().PadLeft(2, '0');
return dateString;
}
string timeFormat(byte[] data, int index)
{
string dateString = "";
dateString += data[index].ToString().PadLeft(2, '0') + ":";
dateString += data[index + 1].ToString().PadLeft(2, '0') + ":";
dateString += data[index + 2].ToString().PadLeft(2, '0');
return dateString;
}
public Hashtable parseFrame(byte[] frame)
{
Hashtable parsedData = new Hashtable();
try
{
Ax25frames ax25frame = new Ax25frames(new Kaitai.KaitaiStream(frame));
if (ax25frame != null)
{
if (ax25frame.ax25frame.payload != null)
{
Ax25frames.UiFrame payload = (Ax25frames.UiFrame)ax25frame.ax25frame.payload;
if (payload.Ax25Info.Length == 167)
{
// function code
string functionCode = hexData(payload.Ax25Info, 0, 6);
parsedData.Add("Satellite Time", datetimeFormat(payload.Ax25Info, 7));
parsedData.Add("Function Code", functionCode);
parsedData.Add("IHU total reset counter", payload.Ax25Info[13]);
parsedData.Add("Battery Status", binaryData(payload.Ax25Info[14]));
parsedData.Add("Remote Control Frame Reception Counter", payload.Ax25Info[15]);
parsedData.Add("Remote Control Command Execution Counter", payload.Ax25Info[16]);
parsedData.Add("Telemetry Frame Transmission Counter", payload.Ax25Info[17]);
parsedData.Add("IHU Status", binaryData(payload.Ax25Info[18]));
parsedData.Add("I2C Status", binaryData(payload.Ax25Info[20]));
parsedData.Add("IHU Status 2", binaryData(payload.Ax25Info[24]));
parsedData.Add("IHU Status 3", binaryData(payload.Ax25Info[25]));
parsedData.Add("+X Cabin Plate Inner Temperature", temperatureConversion(payload.Ax25Info[26]));
parsedData.Add("-X Cabin Plate Inner Temperature", temperatureConversion(payload.Ax25Info[27]));
parsedData.Add("PCDU Temperature", temperatureConversion(payload.Ax25Info[28]));
parsedData.Add("DC/DC Temperature", temperatureConversion(payload.Ax25Info[29]));
parsedData.Add("+Z Cabin Plate Inner Temperature", temperatureConversion(payload.Ax25Info[30]));
parsedData.Add("-Z Cabin Plate Inner Temperature", temperatureConversion(payload.Ax25Info[31]));
parsedData.Add("+X Solar Array Temperature", temperatureConversion(payload.Ax25Info[32]));
parsedData.Add("-X Solar Array Temperature", temperatureConversion(payload.Ax25Info[33]));
parsedData.Add("+Y Solar Array Temperature", temperatureConversion(payload.Ax25Info[34]));
parsedData.Add("-Y Solar Array Temperature", temperatureConversion(payload.Ax25Info[35]));
parsedData.Add("+Z Solar Array Temperature", temperatureConversion(payload.Ax25Info[36]));
parsedData.Add("-Z Solar Array Temperature", temperatureConversion(payload.Ax25Info[37]));
parsedData.Add("Battery Pack 1 Temperature 1", temperatureConversion(payload.Ax25Info[38]));
parsedData.Add("Battery Pack 1 Temperature 2", temperatureConversion(payload.Ax25Info[39]));
parsedData.Add("Battery Pack 2 Temperature 3", temperatureConversion(payload.Ax25Info[40]));
parsedData.Add("Battery Pack 2 Temperature 4", temperatureConversion(payload.Ax25Info[41]));
parsedData.Add("IHU Temperature", temperatureConversion(payload.Ax25Info[42]));
parsedData.Add("UHF1 PA Temperature", temperatureConversion(payload.Ax25Info[43]));
parsedData.Add("Camera 3 Temperature", temperatureConversion(payload.Ax25Info[44]));
parsedData.Add("Camera 1 Temperature", temperatureConversion(payload.Ax25Info[45]));
parsedData.Add("Camera 2 Temperature", temperatureConversion(payload.Ax25Info[46]));
parsedData.Add("UHF2 PA Temperature", temperatureConversion(payload.Ax25Info[47]));
parsedData.Add("Battery Voltage", voltageConversion(payload.Ax25Info[48], payload.Ax25Info[49]));
parsedData.Add("Primary Power Supply Voltage (12V)", voltageConversion(payload.Ax25Info[50], payload.Ax25Info[51]));
parsedData.Add("3.8V Bus Voltage", voltageConversion(payload.Ax25Info[52], payload.Ax25Info[53]));
parsedData.Add("5.5V Bus Voltage", voltageConversion(payload.Ax25Info[54], payload.Ax25Info[55]));
parsedData.Add("IHU 3.3V Voltage", voltageConversion(payload.Ax25Info[56], payload.Ax25Info[57]));
parsedData.Add("Total Solar Array Current", currentConversion(payload.Ax25Info, 58));
parsedData.Add("Primary Bus Current", currentConversion(payload.Ax25Info, 60));
parsedData.Add("Total load Current", currentConversion(payload.Ax25Info, 62));
parsedData.Add("IHU Current", currentConversion(payload.Ax25Info, 64));
parsedData.Add("HF Receiver Current", currentConversion(payload.Ax25Info, 68));
parsedData.Add("UHF Transmitter 2 Current", currentConversion(payload.Ax25Info, 72));
parsedData.Add("UHF Transmitter 1 Current", currentConversion(payload.Ax25Info, 76));
parsedData.Add("UHF1 RF Power", currentConversion(payload.Ax25Info, 78));
parsedData.Add("UHF2 RF Power", currentConversion(payload.Ax25Info, 80));
parsedData.Add("VHF Receiver Current", currentConversion(payload.Ax25Info, 82));
parsedData.Add("VHF AGC Voltage", voltageConversion(payload.Ax25Info[84], payload.Ax25Info[85]));
parsedData.Add("Delayed Telemetry Start Time", datetimeFormat(payload.Ax25Info, 86));
parsedData.Add("Delayed Telemetry Interval Setting", timeFormat(payload.Ax25Info, 92));
parsedData.Add("Camera Controller Operating Current", currentConversion(payload.Ax25Info, 98));
parsedData.Add("Camera Operating Voltage", voltageConversion(payload.Ax25Info[100], payload.Ax25Info[101]));
parsedData.Add("Total Camera Current", currentConversion(payload.Ax25Info, 102));
parsedData.Add("Camera Working Status", binaryData(payload.Ax25Info[104]));
parsedData.Add("Camera 1 Photo Counter", binaryData(payload.Ax25Info[105]));
parsedData.Add("Camera 2 Photo Counter", binaryData(payload.Ax25Info[107]));
parsedData.Add("Camera 3 Photo Counter", binaryData(payload.Ax25Info[109]));
parsedData.Add("Camera 1 Delayed Photography Start Time", datetimeFormat(payload.Ax25Info, 111));
parsedData.Add("Camera 1 Delayed Photography Interval Setting", timeFormat(payload.Ax25Info, 117));
parsedData.Add("Camera 2 Delayed Photography Start Time", datetimeFormat(payload.Ax25Info, 121));
parsedData.Add("Camera 2 Delayed Photography Interval Setting", timeFormat(payload.Ax25Info, 127));
parsedData.Add("Camera 3 Delayed Photography Start Time", datetimeFormat(payload.Ax25Info, 131));
parsedData.Add("Camera 3 Delayed Photography Interval Setting", timeFormat(payload.Ax25Info, 137));
parsedData.Add("48 Hours Reset Time", datetimeFormat(payload.Ax25Info, 144));
parsedData.Add("Current Operating Mode", payload.Ax25Info[141].ToString());
parsedData.Add("Device Switch Status", binaryData(payload.Ax25Info[143]) + binaryData(payload.Ax25Info[142]));
parsedData.Add("Camera 1 Resolution", cameraResolution(payload.Ax25Info[158]));
parsedData.Add("Camera 2 Resolution", cameraResolution(payload.Ax25Info[160]));
parsedData.Add("Camera 3 Resolution", cameraResolution(payload.Ax25Info[162]));
parsedData.Add("Camera 1 Image Quality", cameraQuality(payload.Ax25Info[159]));
parsedData.Add("Camera 2 Image Quality", cameraQuality(payload.Ax25Info[161]));
parsedData.Add("Camera 3 Image Quality", cameraQuality(payload.Ax25Info[163]));
}
}
}
}
catch ( Exception Ex )
{
}
return parsedData;
}
}
}