Tezzeret  1
Tezzeret
GmMfamData.hpp
1 /*
2  * GmMfamData.hpp
3  *
4  * Created on: May 29, 2016
5  * Author: RCRAM
6  */
7 
8 
9 
10 #ifndef GMMFAMDATA_HPP_
11 #define GMMFAMDATA_HPP_
12 
13 #include <geotypes.hpp>
14 
15 #ifndef GMMETA_HPP_
16 #include <GmMeta.hpp>
17 #endif
18 
19 #include <GmError.hpp>
20 
21 namespace Geometrics {
22 
23 // ============= Metadata IDs ==================
24 // ===== This is the authority for mag data types
25 // These should never be edited once used, as
26 // other program - Android clients for example
27 // may use them, based on other sources that
28 // will not be changed if the values here
29 // are changed.
30 // =============================================
31 #define GM_MFAM_SPI_PACKET01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x01)
32 #define GM_MFAM_INDEXED_SPI01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x02)
33 #define GM_MFAM_INDEXED_SPI_W_A2DQUAD01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x03)
34 
35 /*****************************************************************************/
36 /* Transmit IndexedMfamSpiPacketWithHeader, sizeof == 40 */
37 /* Decimal value 65540 (for use in other programs. */
38 /*****************************************************************************/
39 #define GM_MFAM_INDEXED_SPI_W_HEADER (GM_DATA_DOMAIN_MAGNETOMETER | 0x04)
40 
41 #define GM_MFAM_ARRAY_INDEXED_SPI (GM_DATA_DOMAIN_MAGNETOMETER | 0x05)
42 #define GM_MFAM_SIMPLE_TEXT_01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x06)
43 #define GM_MFAM_864_LEGACY_TEXT_ONE_SENSOR (GM_DATA_DOMAIN_MAGNETOMETER | 0x07)
44 #define GM_MFAM_LONG_TEXT_01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x08)
45 // Unused.
46 //#define GM_MAG_INDEXED_860_W_HEADER (GM_DATA_DOMAIN_MAGNETOMETER | 0x09)
47 
48 /* GM_860_BINARY_01 and GM_MAG_860_TIMESTAMPED are both used both as
49  * data types in structures and in format specifiers for writing data to storages
50  */
51 #define GM_860_BINARY_01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x0A)
52 #define GM_MFAM_ARRAY_01 (GM_DATA_DOMAIN_MAGNETOMETER | 0x0B)
53 #define GM_MAG_860_TIMESTAMPED (GM_DATA_DOMAIN_MAGNETOMETER | 0x0C)
54 
55 
56 /******************************************************************************
57  * Formats for MFAM data but with all the aux fields included, used in the
58  * first case for filtering applications, where the aux fields no longer work
59  * because all of the fields are in each record.
60  *****************************************************************************/
61 #define GM_MFAM_FILTERED_INDEXED (GM_DATA_DOMAIN_MAGNETOMETER | 0x0D)
62 #define GM_MFAM_FILTERED_INDEXED_W_HEADER (GM_DATA_DOMAIN_MAGNETOMETER | 0x0E)
63 #define GM_MFAM_FILTERED_ARRAY_INDEXED_SPI (GM_DATA_DOMAIN_MAGNETOMETER | 0x0F)
64 #define GM_MFAM_FILTERED_ARRAY (GM_DATA_DOMAIN_MAGNETOMETER | 0x10)
65 #define GM_MFAM_FILTERED_PACKET (GM_DATA_DOMAIN_MAGNETOMETER | 0x11)
66 /********* End of filtered data types. ***************************************/
67 
68 
69 #define GM_MFAM_QUAD_16_ANALOGS (GM_DATA_DOMAIN_ANALOG | 01)
70 
71 #ifndef DWORD
72 typedef unsigned long DWORD;
73 #endif
74 
75 // Conversion from integer mag data to float.
76 #define MFAM_NANOTESLAS_PER_LSB 5.0E-5
77 #define MAG_DATA_AS_FLOAT(x) (1.0*(x)*MFAM_NANOTESLAS_PER_LSB)
78 
79 // This is the counter to register all the different data
80 // records with each other.
81 extern uint64_t g_uiGlobalMasterSampleCounter;
82 
83 union SysStat
84 {
85  struct {
86  unsigned int iFault:1;
87  unsigned int iRunMode:4;
88  unsigned int iReserved:2;
89  unsigned int iCompromised:1;
90  unsigned int iFaultId:5;
91  unsigned int i10MHz:1;
92  unsigned int iPpsAvailable:1;
93  unsigned int iPpsLocked:1;
94  } m_iDetails;
95  uint16_t m_iSummary;
96 };
97 
98 //typedef union SysStat SystemStatus ;
99 
100 // =========================================================
101 // Data structure received from the MFAM unit, through
102 // SPI bus
103 // =========================================================
104 PACKED_PRAGMA
105 typedef struct PACKED_SPEC s_MfamSpiPacket {
106  // Union of a few different data types, including the
107  // fiducial number.
108  uint16_t frameid; // The FID number as gotten by the macro
109  // GET_FID_COUNT is a SIGNED 16-bit integer,
110  // not unsigned, as might have been guessed from
111  // this declaration of the composite field.
112 
113  // Information about system status.
114  // union SysStat sysstat;
115  uint16_t sysstat;
116 
117  // These next 4 fields are in this order in order to align the 2 mag data fields
118  // on 32-bit boundaries. That design decision was made in the MFAM FPGA.
119  uint32_t mag1data;
120  uint16_t mag1stat;
121  uint16_t mag2stat;
122  uint32_t mag2data;
123 
124  // Auxiliary fields.
125  uint16_t auxsenx;
126  uint16_t auxseny;
127  uint16_t auxsenz;
128  uint16_t auxsent;
129 } MfamSpiPacket; // Structure size is 24
130 
131 PACKED_PRAGMA
132 typedef struct PACKED_SPEC s_MfamFilteredPacket {
133  // Union of a few different data types, including the
134  // fiducial number.
135  uint16_t frameid; // The FID number as gotten by the macro
136  // GET_FID_COUNT is a SIGNED 16-bit integer,
137  // not unsigned, as might have been guessed from
138  // this declaration of the composite field.
139 
140  // Information about system status.
141  // union SysStat sysstat;
142  uint16_t sysstat;
143 
144  uint32_t mag1data;
145  uint16_t mag1stat;
146  uint16_t mag2stat;
147  uint32_t mag2data;
148 
149  // Auxiliary fields.
150  uint16_t mTemperature,
151  mCompassX,
152  mCompassY,
153  mCompassZ,
154  mGyroX,
155  mGyroY,
156  mGyroZ,
157  mAccelerometerX,
158  mAccelerometerY,
159  mAccelerometerZ;
160 } MfamFilteredPacket; // Structure size is 36
161 
162 typedef struct PACKED_SPEC s_MfamFloatPacket {
163  // Union of a few different data types, including the
164  // fiducial number.
165  uint16_t frameid; // Offset zero, length 2
166  // The FID number as gotten by the macro
167  // GET_FID_COUNT is a SIGNED 16-bit integer,
168  // not unsigned, as might have been guessed from
169  // this declaration of the composite field.
170 
171  // Information about system status.
172  uint16_t sysstat; // Offset 2, length 2
173 
174  double mag1data; // Offset 4, length 8
175  uint16_t mag1stat; // Offset 12, length 2
176  uint16_t mag2stat; // Offset 14, length 2
177  double mag2data; // Offset 16, length 8
178 
179  // Auxiliary fields.
180  float mTemperature, // Offset 24, length 4
181  mCompassX, // Offset 28, length 4
182  mCompassY, // Offset 32, length 4
183  mCompassZ, // Offset 36, length 4
184  mGyroX, // Offset 40, length 4
185  mGyroY, // Offset 44, length 4
186  mGyroZ, // Offset 48, length 4
187  mAccelerometerX, // Offset 52, length 4
188  mAccelerometerY, // Offset 56, length 4
189  mAccelerometerZ; // Offset 60, length 4
190 } MfamFloatPacket; // Structure size is 64
191 
192 
193 
194 // Used for sending arrays of data in a standard acquisition application.
195 /* This is used with both mfamSpiPacket and MfamFilteredPacket;
196  *
197  */
198 PACKED_PRAGMA
199 typedef struct PACKED_SPEC s_MfamArrayHeader
200 {
201  DWORD dwRecordType;
202  uint32_t uRecordSize;
203  uint64_t m_uiStartIndex;
204  uint32_t m_uiCount;
205 } MfamArrayHeader; // structure size is 20
206 
207 /***********************************************************
208  * Structure to index a packet --------------------
209  * Used with both MfamSpiPacket and MfamFilteredPacket
210  ************************************************************/
211 PACKED_PRAGMA
212 typedef struct PACKED_SPEC s_PacketIndex
213 {
214  uint64_t uiPacketIndex; // Offset 0, length 8
215 } PacketIndex; // Packet size is 8
216 
217 // -------- MFAM data with indexing added. -----------------
218 PACKED_PRAGMA
219 typedef struct PACKED_SPEC s_IndexedSpiPacket {
220  PacketIndex piIndex;
221  MfamSpiPacket spMFAMSpiPacket;
222  } IndexedMfamSpiPacket; // structure size is 32
223 
224 #ifdef GOOFY
225  // -------- MFAM Filtered packet with indexing added. -----------------
226  PACKED_PRAGMA
227  typedef struct PACKED_SPEC s_IndexedMfamFilteredPacket {
228  PacketIndex piIndex;
229  MfamFloatPacket mMfamFilteredPacket;
230 
231  public:
232  IndexedMfamFilteredPacket (IndexedMfamSpiPacket *spiPacket,
233  bool onlyLoki);
234  } IndexedMfamFilteredPacket; // structure size is 44
235 #endif
236 
237 /* Forward definition for function ToOldData */
238 struct IndexedMfamSpiPacketWithHeader;
239 
240 // -------- MFAM Filtered packet with indexing added. -----------------
241 PACKED_PRAGMA
242 struct PACKED_SPEC IndexedMfamFilteredPacket {
243  PacketIndex piIndex; // Offset 0, length 8
244  MfamFloatPacket mMfamFilteredPacket; // Offset 8, length 64
245 
246 public:
248  IndexedMfamFilteredPacket (IndexedMfamSpiPacket *spiPacket,
249  bool onlyLoki);
250  void ToOldData (IndexedMfamSpiPacketWithHeader *dest);
251 } ; // structure size is 72
252 
253 
254 #ifdef GOOFY
255  PACKED_PRAGMA
256  typedef struct PACKED_SPEC s_IndexedMfamSpiPacketWithHeader
257 {
258  // dwRecordType should be GM_MFAM_INDEXED_SPI_W_HEADER
259  DWORD dwRecordType;
260  uint32_t uRecordSize;
261  IndexedMfamSpiPacket imspData;
262 } IndexedMfamSpiPacketWithHeader; // structure size is 40
263 #endif
264 
265 PACKED_PRAGMA
267 {
268  // dwRecordType should be GM_MFAM_INDEXED_SPI_W_HEADER
269  DWORD dwRecordType;
270  uint32_t uRecordSize;
271  IndexedMfamSpiPacket imspData;
272 }; // structure size is 40
273 
274 
275 PACKED_PRAGMA
276 typedef struct PACKED_SPEC s_IndexedMfamFilteredPacketWithHeader
277 {
278  // dwRecordType should be GM_MFAM_FILTERED_INDEXED_W_HEADER
279  DWORD dwRecordType; // Offset 0, length 4
280  uint32_t uRecordSize; // Offset 4, length 4
281  IndexedMfamFilteredPacket imspData; // Offset 8, length 72
282 } IndexedMfamFilteredPacketWithHeader; // structure size is 80
283 
284 
285 #define GM_SIZEOF_INDEXED_SPI_W_HEADER (sizeof(IndexedMfamSpiPacketWithHeader))
286 #define GM_SIZEOF_INDEXED_MFAM_FILTERED_W_HEADER (sizeof(IndexedMfamFilteredPacketWithHeader))
287 
288 // This record, with the correct value in data type,
289 // precedes an array of records of type IndexedMfamSpiPacket,
290 // ?? when used in a framing application?
292 {
293  // m_dwRecordType should be GM_MFAM_ARRAY_INDEXED_SPI
294  DWORD m_dwRecordType;
295  // m_uint32RecordSize should be (sizeof(IndexedMfamSpiPacket) *
296  // m_uint32RecordCount)
297  uint32_t m_uint32RecordSize;
298  uint32_t m_uint32RecordCount;
300 
301 /* Data for the LabView streamer application */
302 #define MFAM_STREAMER_CACHE_SIZE 40
303 
305 {
306 public:
307  MfamSpiPacket mfam;
308  uint32_t dummy[2];
309 };
310 
312 {
313 public:
314  char mHeader[16];
315  ExpandedMfam mDataBlock[MFAM_STREAMER_CACHE_SIZE];
316  char mGpsString[84];
317 };
318 
319 
320 // -------- Analog measurements obtained within -----------
321 // the mag appliance.
322 
323 typedef struct s_A2d32Quadruple
324 {
325  uint32_t adc0;
326  uint32_t adc1;
327  uint32_t adc2;
328  uint32_t adc3;
330 
331 typedef struct s_IndexedAnalog32Quad
332 {
333  uint64_t m_iIndex;
334  A2d32Quadruple m_qAnalogData;
336 
337 // Four 16-bit A2D measurements, packaged together.
338 typedef struct s_A2d16Quadruple
339 {
340  uint16_t adc0;
341  uint16_t adc1;
342  uint16_t adc2;
343  uint16_t adc3;
345 
347 {
348  IndexedMfamSpiPacket ispMagData;
349  A2d16Quadruple a1qAnalogs;
351 
352 /****************************************************/
353 /* MFAM data values, masks, and types. */
354 /****************************************************/
355 #define FID_COUNT_MASK 0x7FF
356 #define AUX_DATA_MASK 0x3800
357 #define MAG_1_VALID 0x4000
358 #define MAG_2_VALID 0x8000
359 #define COMPASS_MASK 0x800
360 #define SERIAL_MASK 0x3800
361 #define GYRO_MASK 0x1000
362 #define ACCEL_MASK 0x2000
363 #define SERIAL_V_MASK 0x3800
364 
365 #define VALID_MFAM_FID_TEMPLATE(INDEX) MAG_2_VALID | MAG_1_VALID | INDEX
366 
367 #define IS_MAG1_VALID(x) ((x) & MAG_1_VALID)
368 #define IS_MAG2_VALID(x) ((x) & MAG_2_VALID)
369 
370 #define GET_FID_COUNT(x) ((x) & FID_COUNT_MASK)
371 
372 #define IS_COMPASS(x) ((((x) & COMPASS_MASK)==COMPASS_MASK)
373 #define IS_GYRO(x) ((((x) & GYRO_MASK)==GYRO_MASK)
374 #define IS_ACCEL(x) (((x) & ACCEL_MASK)==ACCEL_MASK)
375 #define IS_SERIAL(x) (((x) & SERIAL_V_MASK)==SERIAL_V_MASK)
376 
377 
378 #define LOCK_MASK 0x4000
379 #define PPS_MASK 0x8000
380 #define FAILURE_MASK 0x1
381 
382 #define IS_PPS_RECEIVED(x) ((x) & PPS_MASK)
383 #define IS_PPS_LOCKED(x) ((x) & LOCK_MASK)
384 #define IS_MAG_FAILED(x) ((x) & FAILURE_MASK)
385 
386 // Check individual mag status.
387 #define DEAD_ZONE_MASK 0x0001
388 
389 #define IS_DEAD_ZONE(x) ((x) & DEAD_ZONE_MASK)
390 
391 #define GET_MAG(x) (double(x) * MAG_TO_NT)
392 
393 // ================================================
394 // System Status Masks for the sysstat field,
395 // in the packet off of the SPI bus.
396 #define MAIN_STATE_MASK 0x3C00
397 #define SUB_STATE_MASK 0x0380
398 #define COMPASS_FAILURE_MASK 0x0380
399 #define STARTUP_FAIL_MASK 0x0001
400 #define MAIN_MODE_MASK 0x0007
401 #define MFAM_IN_STARTUP 0x0002
402 #define MFAM_IN_MAG_MODE 0x0004
403 
404 #define MAG_IS_STARTING(x) ((x)&MFAM_IN_STARTUP)
405 #define MAG_IS_RUNNING(x) ((x)&MFAM_IN_MAG_MODE)
406 
407 // =========== Status values in the field from
408 // the bus.
409 
410 #define STATE_MASK_HEATING 1 << 10
411 #define STATE_MASK_MAG1_LASER_HEATER_RAMPING 2 << 10
412 #define STATE_MASK_MAG1_PROBE_LASER_LOCKING 3 << 10
413 #define STATE_MASK_MAG1_PUMP_LASER_HEATER_RAMPING 4 << 10
414 #define STATE_MASK_MAG1_PUMP_LASER_LOCKING 5 << 10
415 #define STATE_MASK_MAG1_MOVING_LASERS_TO_OPERATING_POINT 6 << 10
416 #define STATE_MASK_MAG2_LASER_HEATER_RAMPING 7 << 10
417 #define STATE_MASK_MAG2_PROBE_LASER_LOCKING 8 << 10
418 #define STATE_MASK_MAG2_PUMP_LASER_HEATER_RAMPING 9 << 10
419 #define STATE_MASK_MAG2_PUMP_LASER_LOCKING 10 << 10
420 #define STATE_MASK_MAG2_MOVING_LASERS_TO_OPERATING_POINT 11 << 10
421 
422 // Substates of STATE_MASK_HEATING
423 #define STATE_MASK_HEATING_FULL 1 << 7
424 #define STATE_MASK_HEATING_MAG1_OK 2 << 7
425 #define STATE_MASK_HEATING_MAG2_OK 3 << 7
426 #define STATE_MASK_HEATING_SERVOS_ENABLED 4 << 7
427 
428 
429 // ============== System states. These are application
430 // values, not the values straight off of the bus
431 
432 #define STATE_HEATING_FULL 21
433 #define STATE_HEATING_MAG1_OK 22
434 #define STATE_HEATING_MAG2_OK 23
435 #define STATE_HEATING_SERVOS_ENABLED 24
436 #define STATE_HEATING_MASK 31
437 #define STATE_MAG1_LASER_HEATER_RAMPING 32
438 #define STATE_MAG1_PROBE_LASER_LOCKING 33
439 #define STATE_MAG1_PUMP_LASER_HEATER_RAMPING 34
440 #define STATE_MAG1_PUMP_LASER_LOCKING 35
441 #define STATE_MAG1_MOVING_LASERS_TO_OPERATING_POINT 36
442 #define STATE_MAG2_LASER_HEATER_RAMPING 37
443 #define STATE_MAG2_PROBE_LASER_LOCKING 38
444 #define STATE_MAG2_PUMP_LASER_HEATER_RAMPING 39
445 #define STATE_MAG2_PUMP_LASER_LOCKING 40
446 #define STATE_MAG2_MOVING_LASERS_TO_OPERATING_POINT 41
447 
448 // ============ Sub states =======================
449 //
450 
451 extern "C" uint16_t ParseMfamSystemStatus (const uint16_t uiSystemStatus);
452 
453 }
454 
455 #endif /* GMMFAMDATA_HPP_ */
456 
Definition: GmMfamData.hpp:305
Definition: GmMfamData.hpp:312
GmApp/GmLoggingApp.hpp>
Definition: Analogs.hpp:47
Definition: GmMfamData.hpp:242
Definition: GmMfamData.hpp:267
Definition: GmMfamData.hpp:339
Definition: GmMfamData.hpp:324
Definition: GmMfamData.hpp:332
Definition: GmMfamData.hpp:219
Definition: GmMfamData.hpp:200
Definition: GmMfamData.hpp:132
Definition: GmMfamData.hpp:162
Definition: GmMfamData.hpp:105
Definition: GmMfamData.hpp:213
Definition: GmMfamData.hpp:347
Definition: GmMfamData.hpp:292
Definition: GmMfamData.hpp:84