THM1176InstrumentDriver  1.0
C++ API for Metrolab THM1176
CTHM1176MeasurementsTest.cpp
Go to the documentation of this file.
1 // Copyright (c) 2020 Metrolab Technology S.A., Geneva, Switzerland (www.metrolab.com)
2 // See the included file LICENSE.txt for the licensing conditions.
3 
7 
8 #include "gtest/gtest.h"
9 #include "THM1176TestUtilities.h"
10 #include <ctime>
11 #include <chrono>
12 #include <thread>
13 
14 using namespace MTL::Instrument;
15 using namespace MTL::Instrument::THM1176Types;
16 
17 static const I32 THM1176_NO_MEASUREMENTS (3);
18 static const U32 THM1176_AVG_COUNT (100);
19 static const F64 THM1176_IMMEDIATE_TIME_PER_ACQ (1.0281823091218700E+05); // ns
20 static const F64 THM1176_IMMEDIATE_TIME_PER_MEAS (4.4532792007542600E+04); // ns
22 
24 class CTHM1176MeasuresTest : public ::testing::Test
25 {
26 protected:
27  static THM1176_TEST_RESOURCE_MANAGER_CLASS * pResourceManager;
29 
30  static void SetUpTestCase()
31  {
32  ASSERT_EQ(true, ConnectToTHM1176(pResourceManager, pTHM1176));
33  ASSERT_NE(nullptr, pResourceManager);
34  ASSERT_NE(nullptr, pTHM1176);
35  ASSERT_EQ(true, pTHM1176->IsOpen());
36  ASSERT_EQ(true, pTHM1176->Reset());
37  }
38 
39  static void TearDownTestCase()
40  {
41  delete pTHM1176;
42  pTHM1176 = nullptr;
43  delete pResourceManager;
44  pResourceManager = nullptr;
45  }
46 
47  virtual void SetUp()
48  {
49  // Reset the instrument.
50  ASSERT_NE(pTHM1176, nullptr);
51  ASSERT_EQ(true, pTHM1176->Reset());
52 
53  // Set lowest range and enable averaging, so that PACKED,1 will hopefully work.
54  sRange<sBoundedParm> l_RangeBounds;
55  ASSERT_EQ(true, pTHM1176->ParmRangeGet(l_RangeBounds));
56  sRange<uParm> l_Range;
57  l_Range.Auto = false;
58  l_Range.Range = l_RangeBounds.Range.Min;
59  ASSERT_EQ(true, pTHM1176->ParmRangeSet(l_Range));
60 
61  sAveraging<sBoundedParm> l_AvgBounds;
62  ASSERT_EQ(true, pTHM1176->ParmAveragingGet(l_AvgBounds));
63  sAveraging<uParm> l_Avg;
65  ASSERT_EQ(true, pTHM1176->ParmAveragingSet(l_Avg));
66 
67  // Acquire THM1176_NO_MEASUREMENTS measurements with immediate trigger.
68  sInputTrigger<sBoundedParm> l_TrigBounds;
69  ASSERT_EQ(true, pTHM1176->ParmTriggerInputGet(l_TrigBounds));
70  sInputTrigger<uParm> l_Trig;
73  ASSERT_EQ(true, pTHM1176->ParmTriggerInputSet(l_Trig));
74  ASSERT_EQ(true, pTHM1176->Initiate());
75  }
76 };
77 THM1176_TEST_RESOURCE_MANAGER_CLASS * CTHM1176MeasuresTest::pResourceManager = nullptr;
79 
82 {
83  // Format should be ASCII by default.
84  CSCPIBuffer l_Buffer;
85  ASSERT_EQ(true, pTHM1176->Write("FORM?") && pTHM1176->Read(l_Buffer));
86  EXPECT_EQ("ASCII\n", std::string(l_Buffer.begin(), l_Buffer.end()));
87 
88  // Test setting to INTEGER.
89  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
90  ASSERT_EQ(true, pTHM1176->Write("FORM?") && pTHM1176->Read(l_Buffer));
91  EXPECT_EQ("INTEGER\n", std::string(l_Buffer.begin(), l_Buffer.end()));
92 
93  // Test setting back to ASCII.
94  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
95  ASSERT_EQ(true, pTHM1176->Write("FORM?") && pTHM1176->Read(l_Buffer));
96  EXPECT_EQ("ASCII\n", std::string(l_Buffer.begin(), l_Buffer.end()));
97 
98  // Test setting to PACKED,2.
99  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
100  ASSERT_EQ(true, pTHM1176->Write("FORM?") && pTHM1176->Read(l_Buffer));
101  EXPECT_EQ("PACKED,2\n", std::string(l_Buffer.begin(), l_Buffer.end()));
102 
103  // Test setting to PACKED,1.
104  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
105  ASSERT_EQ(true, pTHM1176->Write("FORM?") && pTHM1176->Read(l_Buffer));
106  EXPECT_EQ("PACKED,1\n", std::string(l_Buffer.begin(), l_Buffer.end()));
107 }
108 
111 {
112  eCommunicationFormat l_Format;
113 
114  // Format should be ASCII by default.
115  ASSERT_EQ(true, pTHM1176->GetFormat(l_Format) && l_Format == kComFormatAscii);
116 
117  // Test setting to INTEGER.
118  ASSERT_EQ(true, pTHM1176->Write("FORM INTEGER"));
119  ASSERT_EQ(true, pTHM1176->GetFormat(l_Format) && l_Format == kComFormatInteger);
120 
121  // Test setting back to ASCII.
122  ASSERT_EQ(true, pTHM1176->Write("FORM ASCII"));
123  ASSERT_EQ(true, pTHM1176->GetFormat(l_Format) && l_Format == kComFormatAscii);
124 
125  // Test setting to PACKED,2.
126  ASSERT_EQ(true, pTHM1176->Write("FORM PACKED,2"));
127  ASSERT_EQ(true, pTHM1176->GetFormat(l_Format) && l_Format == kComFormatPacked2Byte);
128 
129  // Test setting to PACKED,1.
130  ASSERT_EQ(true, pTHM1176->Write("FORM PACKED,1"));
131  ASSERT_EQ(true, pTHM1176->GetFormat(l_Format) && l_Format == kComFormatPacked1Byte);
132 }
133 
135 TEST_F(CTHM1176MeasuresTest, MeasurementsGet)
136 {
137  CFluxList l_Bx, l_By, l_Bz;
138  eUnits l_Units;
139  U16 l_Temperature;
140  CTimestampList l_TimestampList;
141  U64 l_TimestampInterval;
142  CErrorList l_ErrorList;
143 
144  // NoMeasurements = 0.
145  {
146  // ASCII format.
147  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
148  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
149  ASSERT_EQ(false, pTHM1176->MeasurementsGet(0, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
150  {
151  l_ErrorList = pTHM1176->CurrentErrorList();
152  EXPECT_EQ(3, l_ErrorList.size());
153  EXPECT_EQ(-222, l_ErrorList[0].Code);
154  EXPECT_EQ(-222, l_ErrorList[1].Code);
155  EXPECT_EQ(-222, l_ErrorList[2].Code);
156  }
157  EXPECT_EQ(0, l_Bx.size());
158  EXPECT_EQ(0, l_By.size());
159  EXPECT_EQ(0, l_Bz.size());
160  EXPECT_EQ(0, l_Temperature);
161  ASSERT_EQ(0, l_TimestampList.size());
162 
163  // Retrieve the data in INTEGER format.
164  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
165  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
166  ASSERT_EQ(false, pTHM1176->MeasurementsGet(0, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
167  {
168  l_ErrorList = pTHM1176->CurrentErrorList();
169  EXPECT_EQ(3, l_ErrorList.size());
170  EXPECT_EQ(-222, l_ErrorList[0].Code);
171  EXPECT_EQ(-222, l_ErrorList[1].Code);
172  EXPECT_EQ(-222, l_ErrorList[2].Code);
173  }
174  EXPECT_EQ(0, l_Bx.size());
175  EXPECT_EQ(0, l_By.size());
176  EXPECT_EQ(0, l_Bz.size());
177  EXPECT_EQ(0, l_Temperature);
178  ASSERT_EQ(0, l_TimestampList.size());
179 
180  // Retrieve the data in PACKED,2 format.
181  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
182  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
183  ASSERT_EQ(false, pTHM1176->MeasurementsGet(0, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
184  {
185  l_ErrorList = pTHM1176->CurrentErrorList();
186  EXPECT_EQ(3, l_ErrorList.size());
187  EXPECT_EQ(-222, l_ErrorList[0].Code);
188  EXPECT_EQ(-222, l_ErrorList[1].Code);
189  EXPECT_EQ(-222, l_ErrorList[2].Code);
190  }
191  EXPECT_EQ(0, l_Bx.size());
192  EXPECT_EQ(0, l_By.size());
193  EXPECT_EQ(0, l_Bz.size());
194  EXPECT_EQ(0, l_Temperature);
195  ASSERT_EQ(0, l_TimestampList.size());
196 
197  // Retrieve the data in PACKED,1 format.
198  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
199  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
200  ASSERT_EQ(false, pTHM1176->MeasurementsGet(0, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
201  {
202  l_ErrorList = pTHM1176->CurrentErrorList();
203  EXPECT_EQ(3, l_ErrorList.size());
204  EXPECT_EQ(-222, l_ErrorList[0].Code);
205  EXPECT_EQ(-222, l_ErrorList[1].Code);
206  EXPECT_EQ(-222, l_ErrorList[2].Code);
207  }
208  EXPECT_EQ(0, l_Bx.size());
209  EXPECT_EQ(0, l_By.size());
210  EXPECT_EQ(0, l_Bz.size());
211  EXPECT_EQ(0, l_Temperature);
212  ASSERT_EQ(0, l_TimestampList.size());
213  }
214 
215  // NoMeasurements = THM1176_NO_MEASUREMENTS.
216  {
217  // ASCII format.
218  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
219  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
220  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
221  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
222  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
223  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
224  EXPECT_LT(0, l_Temperature);
225  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
226  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
227  {
228  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
229  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
230  }
231 
232  // Retrieve the data in INTEGER format.
233  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
234  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
235  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
236  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
237  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
238  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
239  EXPECT_LT(0, l_Temperature);
240  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
241  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
242  {
243  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
244  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
245  }
246 
247  // Retrieve the data in PACKED,2 format.
248  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
249  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
250  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
251  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
252  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
253  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
254  EXPECT_LT(0, l_Temperature);
255  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
256  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
257  {
258  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
259  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
260  }
261 
262  // Retrieve the data in PACKED,1 format.
263  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
264  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
265  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
266  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
267  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
268  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
269  EXPECT_LT(0, l_Temperature);
270  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
271  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
272  {
273  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
274  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
275  }
276  }
277 
278  // NoMeasurements = THM1176_NO_MEASUREMENTS-1.
279  {
280  // ASCII format.
281  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
282  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
283  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS-1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
284  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bx.size());
285  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
286  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bz.size());
287  EXPECT_LT(0, l_Temperature);
288  ASSERT_EQ(THM1176_NO_MEASUREMENTS-1, l_TimestampList.size());
289  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 2; i++)
290  {
291  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
292  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
293  }
294 
295  // Retrieve the data in INTEGER format.
296  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
297  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
298  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS-1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
299  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bx.size());
300  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
301  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bz.size());
302  EXPECT_LT(0, l_Temperature);
303  ASSERT_EQ(THM1176_NO_MEASUREMENTS-1, l_TimestampList.size());
304  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 2; i++)
305  {
306  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
307  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
308  }
309 
310  // Retrieve the data in PACKED,2 format.
311  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
312  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
313  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS-1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
314  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bx.size());
315  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
316  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bz.size());
317  EXPECT_LT(0, l_Temperature);
318  ASSERT_EQ(THM1176_NO_MEASUREMENTS-1, l_TimestampList.size());
319  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 2; i++)
320  {
321  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
322  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
323  }
324 
325  // Retrieve the data in PACKED,1 format.
326  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
327  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
328  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS-1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
329  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bx.size());
330  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
331  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_Bz.size());
332  EXPECT_LT(0, l_Temperature);
333  ASSERT_EQ(THM1176_NO_MEASUREMENTS-1, l_TimestampList.size());
334  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 2; i++)
335  {
336  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
337  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
338  }
339  }
340  // NoMeasurements = THM1176_NO_MEASUREMENTS+1.
341  {
342  // ASCII format.
343  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
344  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
345  ASSERT_EQ(false, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS+1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
346  {
347  l_ErrorList = pTHM1176->CurrentErrorList();
348  EXPECT_EQ(3, l_ErrorList.size());
349  EXPECT_EQ(-222, l_ErrorList[0].Code);
350  EXPECT_EQ(-222, l_ErrorList[1].Code);
351  EXPECT_EQ(-222, l_ErrorList[2].Code);
352  }
353  EXPECT_EQ(0, l_Bx.size());
354  EXPECT_EQ(0, l_By.size());
355  EXPECT_EQ(0, l_Bz.size());
356  EXPECT_EQ(0, l_Temperature);
357  ASSERT_EQ(0, l_TimestampList.size());
358 
359  // Retrieve the data in INTEGER format.
360  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
361  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
362  ASSERT_EQ(false, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS+1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
363  {
364  l_ErrorList = pTHM1176->CurrentErrorList();
365  EXPECT_EQ(3, l_ErrorList.size());
366  EXPECT_EQ(-222, l_ErrorList[0].Code);
367  EXPECT_EQ(-222, l_ErrorList[1].Code);
368  EXPECT_EQ(-222, l_ErrorList[2].Code);
369  }
370  EXPECT_EQ(0, l_Bx.size());
371  EXPECT_EQ(0, l_By.size());
372  EXPECT_EQ(0, l_Bz.size());
373  EXPECT_EQ(0, l_Temperature);
374  ASSERT_EQ(0, l_TimestampList.size());
375 
376  // Retrieve the data in PACKED,2 format.
377  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
378  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
379  ASSERT_EQ(false, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS+1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
380  {
381  l_ErrorList = pTHM1176->CurrentErrorList();
382  EXPECT_EQ(3, l_ErrorList.size());
383  EXPECT_EQ(-222, l_ErrorList[0].Code);
384  EXPECT_EQ(-222, l_ErrorList[1].Code);
385  EXPECT_EQ(-222, l_ErrorList[2].Code);
386  }
387  EXPECT_EQ(0, l_Bx.size());
388  EXPECT_EQ(0, l_By.size());
389  EXPECT_EQ(0, l_Bz.size());
390  EXPECT_EQ(0, l_Temperature);
391  ASSERT_EQ(0, l_TimestampList.size());
392 
393  // Retrieve the data in PACKED,1 format.
394  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
395  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
396  ASSERT_EQ(false, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS+1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
397  {
398  l_ErrorList = pTHM1176->CurrentErrorList();
399  EXPECT_EQ(3, l_ErrorList.size());
400  EXPECT_EQ(-222, l_ErrorList[0].Code);
401  EXPECT_EQ(-222, l_ErrorList[1].Code);
402  EXPECT_EQ(-222, l_ErrorList[2].Code);
403  }
404  EXPECT_EQ(0, l_Bx.size());
405  EXPECT_EQ(0, l_By.size());
406  EXPECT_EQ(0, l_Bz.size());
407  EXPECT_EQ(0, l_Temperature);
408  ASSERT_EQ(0, l_TimestampList.size());
409  }
410  // Try changing units.
411  {
412  CFluxList l_Bx1, l_By1, l_Bz1;
413 
414  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
415  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
416 
417  CUnitsList l_AllUnits;
418  ASSERT_EQ(true, pTHM1176->GetAllUnits(l_AllUnits));
419  ASSERT_LT(1, l_AllUnits.size());
420 
421  ASSERT_EQ(true, pTHM1176->ParmUnitsSet(l_AllUnits[0]));
422  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
423  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
424  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
425  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
426 
427  ASSERT_EQ(true, pTHM1176->ParmUnitsSet(l_AllUnits[1]));
428  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx1, l_By1, l_Bz1, l_Units, l_Temperature, l_TimestampList));
429  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx1.size());
430  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By1.size());
431  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz1.size());
432 
433  U32 l_Divisor, l_Divisor1;
434  ASSERT_EQ(true, pTHM1176->GetDivisor(l_AllUnits[0], l_Divisor));
435  ASSERT_EQ(true, pTHM1176->GetDivisor(l_AllUnits[1], l_Divisor1));
436 
437  for (auto l_pBx = l_Bx.begin(), l_pBx1 = l_Bx1.begin();
438  l_pBx < l_Bx.end() && l_pBx1 < l_Bx1.end();
439  l_pBx++, l_pBx1++)
440  EXPECT_FLOAT_EQ(*l_pBx * l_Divisor, *l_pBx1 * l_Divisor1);
441  for (auto l_pBy = l_By.begin(), l_pBy1 = l_By1.begin();
442  l_pBy < l_By.end() && l_pBy1 < l_By1.end();
443  l_pBy++, l_pBy1++)
444  EXPECT_FLOAT_EQ(*l_pBy * l_Divisor, *l_pBy1 * l_Divisor1);
445  for (auto l_pBz = l_Bz.begin(), l_pBz1 = l_Bz1.begin();
446  l_pBz < l_Bz.end() && l_pBz1 < l_Bz1.end();
447  l_pBz++, l_pBz1++)
448  EXPECT_FLOAT_EQ(*l_pBz * l_Divisor, *l_pBz1 * l_Divisor1);
449  }
450  // Try with UseCalibration off, in ASCII and Integer format.
451  {
452  CFluxList l_Bx1, l_By1, l_Bz1;
453 
454  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
455  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
456  ASSERT_EQ(true, pTHM1176->ParmUseCalibrationSet(false));
457 
458  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
459  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
460  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
461  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
462 
463  for (auto l_pBx = l_Bx.begin(); l_pBx < l_Bx.end(); l_pBx++)
464  EXPECT_FLOAT_EQ(*l_pBx, std::round(*l_pBx));
465  for (auto l_pBy = l_By.begin(); l_pBy < l_By.end(); l_pBy++)
466  EXPECT_FLOAT_EQ(*l_pBy, std::round(*l_pBy));
467  for (auto l_pBz = l_Bz.begin(); l_pBz < l_Bz.end(); l_pBz++)
468  EXPECT_FLOAT_EQ(*l_pBz, std::round(*l_pBz));
469 
470  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
471  ASSERT_EQ(true, pTHM1176->ParmUseCalibrationSet(false));
472 
473  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx1, l_By1, l_Bz1, l_Units, l_Temperature, l_TimestampList));
474  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx1.size());
475  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By1.size());
476  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz1.size());
477 
478  for (auto l_pBx = l_Bx.begin(), l_pBx1 = l_Bx1.begin();
479  l_pBx < l_Bx.end() && l_pBx1 < l_Bx1.end();
480  l_pBx++, l_pBx1++)
481  EXPECT_FLOAT_EQ(*l_pBx, *l_pBx1);
482  for (auto l_pBy = l_By.begin(), l_pBy1 = l_By1.begin();
483  l_pBy < l_By.end() && l_pBy1 < l_By1.end();
484  l_pBy++, l_pBy1++)
485  EXPECT_FLOAT_EQ(*l_pBy, *l_pBy1);
486  for (auto l_pBz = l_Bz.begin(), l_pBz1 = l_Bz1.begin();
487  l_pBz < l_Bz.end() && l_pBz1 < l_Bz1.end();
488  l_pBz++, l_pBz1++)
489  EXPECT_FLOAT_EQ(*l_pBz, *l_pBz1);
490 
491  ASSERT_EQ(true, pTHM1176->ParmUseCalibrationSet(true));
492  }
493  // Continuous measurements.
494  {
495  // Set timed trigger with 10 ms period and 20 measurements.
496  sInputTrigger<sBoundedParm> l_TrigBounds;
497  ASSERT_EQ(true, pTHM1176->ParmTriggerInputGet(l_TrigBounds));
498  sInputTrigger<uParm> l_Trig;
499  l_Trig.Source = kInputTrigSrcTimer;
500  l_Trig.Count = 20;
501  l_Trig.Period_s = 0.01;
502  ASSERT_EQ(true, pTHM1176->ParmTriggerInputSet(l_Trig));
503 
504  // Initiate continuously.
505  ASSERT_EQ(true, pTHM1176->Initiate(true));
506 
507  // Wait a little, to consistently cause overrun errors
508  // (but this should be the only error!).
509  std::this_thread::sleep_for(std::chrono::seconds(1));
510 
511  // Read the data in ASCII format (just to be consistent, not relevant for the test).
512  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
513  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
514  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Trig.Count, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
515  EXPECT_EQ(l_Trig.Count, l_Bx.size());
516  EXPECT_EQ(l_Trig.Count, l_By.size());
517  EXPECT_EQ(l_Trig.Count, l_Bz.size());
518  EXPECT_LT(0, l_Temperature);
519 
520  // Check the timestamp list.
521  ASSERT_EQ(l_Trig.Count, l_TimestampList.size());
522  for (int i = 0; i < l_Trig.Count - 1; i++)
523  {
524  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
525  EXPECT_EQ(l_TimestampInterval, l_Trig.Period_s * 1E9);
526  }
527 
528  // Wait a second, then do another fetch, this time retrieving the Measurement Conditions.
529  std::this_thread::sleep_for(std::chrono::seconds(1));
530 
531  sMeasurementConditions l_MeasurementConditions;
532  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Trig.Count, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList, &l_MeasurementConditions));
533  EXPECT_EQ(l_Trig.Count, l_Bx.size());
534  EXPECT_EQ(l_Trig.Count, l_By.size());
535  EXPECT_EQ(l_Trig.Count, l_Bz.size());
536  EXPECT_LT(0, l_Temperature);
537 
538  // Check the timestamp list.
539  ASSERT_EQ(l_Trig.Count, l_TimestampList.size());
540  for (int i = 0; i < l_Trig.Count - 1; i++)
541  {
542  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
543  EXPECT_EQ(l_TimestampInterval, l_Trig.Period_s * 1E9);
544  }
545 
546  // Check the Measurement Conditions.
547  EXPECT_EQ(l_MeasurementConditions.AveragingParms.NoPoints, THM1176_AVG_COUNT);
548  EXPECT_EQ(l_MeasurementConditions.TriggerParms.Source, l_Trig.Source);
549  EXPECT_EQ(l_MeasurementConditions.TriggerParms.Count, l_Trig.Count);
550  EXPECT_EQ(l_MeasurementConditions.TriggerParms.Period_s, l_Trig.Period_s);
551  EXPECT_EQ(l_MeasurementConditions.UseCalibration, true);
552 
553  // Test the GetEstimatedPeriod() method.
554  F64 l_Period;
555  ASSERT_EQ(true, l_TimestampList.GetEstimatedPeriod(l_Period));
556  EXPECT_DOUBLE_EQ(l_Period, l_Trig.Period_s * 1E9);
557 
558  // Check to make sure we got a Data Overrun error.
559  l_ErrorList = pTHM1176->CurrentErrorList();
560  EXPECT_EQ(1, l_ErrorList.size());
561  EXPECT_EQ(204, l_ErrorList[0].Code);
562  }
563  // Bus Triggered measurements.
564  {
565  // Reset to have a clean slate.
566  pTHM1176->Reset();
567 
568  // Set bus trigger.
569  sInputTrigger<uParm> l_Trig;
570  l_Trig.Source = kInputTrigSrcBus;
572  l_Trig.Period_s = 0;
573  ASSERT_EQ(true, pTHM1176->ParmTriggerInputSet(l_Trig));
574 
575  // Initiate.
576  ASSERT_EQ(true, pTHM1176->Initiate(false));
577 
578  // Trigger at 1-second intervals.
579  std::vector<std::chrono::time_point<std::chrono::high_resolution_clock>> l_TriggerTimes;
580  for (int i = 0; i < THM1176_NO_MEASUREMENTS; i++)
581  {
582  ASSERT_EQ(true, pTHM1176->SendBusTrigger());
583 
584  // Save the current time.
585  l_TriggerTimes.push_back (std::chrono::high_resolution_clock::now());
586 
587  // Print it out for debugging.
588  std::time_t l_Now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
589  char l_DateTimeString[32];
590  std::strftime(l_DateTimeString, 31, "%FT%T", std::localtime(&l_Now));
591  std::cout << "Send trigger " << i << std::string(l_DateTimeString) << std::endl;
592 
593  // NOTE: We seem to be getting spurious 206 (Timer Overrun) errors here – firmware bug?
594  // To catch it, uncomment the assertion, below.
595  U16 l_Status;
596  ASSERT_EQ(true, pTHM1176->StatusGet(sStatusRegister(kStatusByte, kStatusEvent), l_Status));
597  // ASSERT_EQ(0, l_Status);
598  pTHM1176->ClearErrorList();
599 
600  std::this_thread::sleep_for(std::chrono::seconds(1));
601  }
602 
603  // Read the data in ASCII format (just to be consistent, not relevant for the test).
604  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
605  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
606  ASSERT_EQ(true, pTHM1176->MeasurementsGet(THM1176_NO_MEASUREMENTS, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
607  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
608  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
609  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
610  EXPECT_LT(0, l_Temperature);
611 
612  // Pay particular attention to the timestamps.
613  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
614  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
615  {
616  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
617  F64 l_ExpectedTimestampInterval = std::chrono::duration_cast<std::chrono::nanoseconds>(l_TriggerTimes[i+1] - l_TriggerTimes[i]).count();
618  EXPECT_NEAR(static_cast<F64>(l_TimestampInterval), l_ExpectedTimestampInterval, 1E7);
619  }
620 
621  // Convert the timestamps to absolute timestamps, and print them out.
622  for (int i = 0; i < THM1176_NO_MEASUREMENTS; i++)
623  {
624  CAbsoluteTimestamp l_AbsolutTimestamp;
625  ASSERT_EQ(true, pTHM1176->ConvertTimestamp(l_TimestampList[i], l_AbsolutTimestamp));
626  std::cout << "Timestamp: " << l_AbsolutTimestamp << std::endl;
627  }
628 
629  // We expect no errors.
630  l_ErrorList = pTHM1176->CurrentErrorList();
631  EXPECT_EQ(0, l_ErrorList.size());
632  }
633 }
634 
636 TEST_F(CTHM1176MeasuresTest, MeasurementsGetArbitrary)
637 {
638  CFluxList l_Bx, l_By, l_Bz;
639  eUnits l_Units;
640  U16 l_Temperature;
641  CTimestampList l_TimestampList;
642  U64 l_TimestampInterval;
643  CErrorList l_ErrorList;
644 
645  // NoMeasurements = 0, retrieve all.
646  {
647  sArbitraryMeasurements l_Select = { true, true, true, true, true, 0 };
648 
649  // ASCII format.
650  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
651  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
652  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
653  {
654  l_ErrorList = pTHM1176->CurrentErrorList();
655  EXPECT_EQ(3, l_ErrorList.size());
656  EXPECT_EQ(-222, l_ErrorList[0].Code);
657  EXPECT_EQ(-222, l_ErrorList[1].Code);
658  EXPECT_EQ(-222, l_ErrorList[2].Code);
659  }
660  EXPECT_EQ(0, l_Bx.size());
661  EXPECT_EQ(0, l_By.size());
662  EXPECT_EQ(0, l_Bz.size());
663  EXPECT_EQ(0, l_Temperature);
664  ASSERT_EQ(0, l_TimestampList.size());
665 
666  // Retrieve the data in INTEGER format.
667  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
668  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
669  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
670  {
671  l_ErrorList = pTHM1176->CurrentErrorList();
672  EXPECT_EQ(3, l_ErrorList.size());
673  EXPECT_EQ(-222, l_ErrorList[0].Code);
674  EXPECT_EQ(-222, l_ErrorList[1].Code);
675  EXPECT_EQ(-222, l_ErrorList[2].Code);
676  }
677  EXPECT_EQ(0, l_Bx.size());
678  EXPECT_EQ(0, l_By.size());
679  EXPECT_EQ(0, l_Bz.size());
680  EXPECT_EQ(0, l_Temperature);
681  ASSERT_EQ(0, l_TimestampList.size());
682 
683  // Retrieve the data in PACKED,2 format.
684  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
685  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
686  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
687  {
688  l_ErrorList = pTHM1176->CurrentErrorList();
689  EXPECT_EQ(3, l_ErrorList.size());
690  EXPECT_EQ(-222, l_ErrorList[0].Code);
691  EXPECT_EQ(-222, l_ErrorList[1].Code);
692  EXPECT_EQ(-222, l_ErrorList[2].Code);
693  }
694  EXPECT_EQ(0, l_Bx.size());
695  EXPECT_EQ(0, l_By.size());
696  EXPECT_EQ(0, l_Bz.size());
697  EXPECT_EQ(0, l_Temperature);
698  ASSERT_EQ(0, l_TimestampList.size());
699 
700  // Retrieve the data in PACKED,1 format.
701  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
702  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
703  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
704  {
705  l_ErrorList = pTHM1176->CurrentErrorList();
706  EXPECT_EQ(3, l_ErrorList.size());
707  EXPECT_EQ(-222, l_ErrorList[0].Code);
708  EXPECT_EQ(-222, l_ErrorList[1].Code);
709  EXPECT_EQ(-222, l_ErrorList[2].Code);
710  }
711  EXPECT_EQ(0, l_Bx.size());
712  EXPECT_EQ(0, l_By.size());
713  EXPECT_EQ(0, l_Bz.size());
714  EXPECT_EQ(0, l_Temperature);
715  ASSERT_EQ(0, l_TimestampList.size());
716  }
717 
718  // NoMeasurements = THM1176_NO_MEASUREMENTS, retrieve first set.
719  {
720  sArbitraryMeasurements l_Select = { true, false, true, false, true, static_cast<U32>(THM1176_NO_MEASUREMENTS) };
721 
722  // ASCII format.
723  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
724  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
725  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
726  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
727  EXPECT_EQ(0, l_By.size());
728  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
729  EXPECT_EQ(0, l_Temperature);
730  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
731  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
732  {
733  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
734  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
735  }
736  l_ErrorList = pTHM1176->CurrentErrorList();
737  ASSERT_EQ(1, l_ErrorList.size());
738  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
739  pTHM1176->ClearErrorList();
740 
741  // Retrieve the data in INTEGER format.
742  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
743  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
744  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
745  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
746  EXPECT_EQ(0, l_By.size());
747  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
748  EXPECT_EQ(0, l_Temperature);
749  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
750  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
751  {
752  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
753  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
754  }
755  l_ErrorList = pTHM1176->CurrentErrorList();
756  ASSERT_EQ(1, l_ErrorList.size());
757  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
758  pTHM1176->ClearErrorList();
759 
760  // Retrieve the data in PACKED,2 format.
761  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
762  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
763  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
764  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
765  EXPECT_EQ(0, l_By.size());
766  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
767  EXPECT_EQ(0, l_Temperature);
768  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
769  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
770  {
771  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
772  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
773  }
774  l_ErrorList = pTHM1176->CurrentErrorList();
775  ASSERT_EQ(1, l_ErrorList.size());
776  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
777  pTHM1176->ClearErrorList();
778 
779  // Retrieve the data in PACKED,1 format.
780  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
781  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
782  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
783  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
784  EXPECT_EQ(0, l_By.size());
785  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
786  EXPECT_EQ(0, l_Temperature);
787  ASSERT_EQ(THM1176_NO_MEASUREMENTS, l_TimestampList.size());
788  for (int i = 0; i < THM1176_NO_MEASUREMENTS - 1; i++)
789  {
790  l_TimestampInterval = l_TimestampList[i+1] - l_TimestampList[i];
791  EXPECT_EQ(l_TimestampInterval, THM1176_TIME_PER_MEASUREMENT);
792  }
793  l_ErrorList = pTHM1176->CurrentErrorList();
794  ASSERT_EQ(1, l_ErrorList.size());
795  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
796  pTHM1176->ClearErrorList();
797  }
798 
799  // NoMeasurements = THM1176_NO_MEASUREMENTS-1, retrieve second set.
800  {
801  sArbitraryMeasurements l_Select = { false, true, false, true, false, THM1176_NO_MEASUREMENTS-1 };
802 
803  // ASCII format.
804  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
805  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
806  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
807  EXPECT_EQ(0, l_Bx.size());
808  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
809  EXPECT_EQ(0, l_Bz.size());
810  EXPECT_LT(0, l_Temperature);
811  ASSERT_EQ(0, l_TimestampList.size());
812  l_ErrorList = pTHM1176->CurrentErrorList();
813  ASSERT_EQ(1, l_ErrorList.size());
814  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
815  pTHM1176->ClearErrorList();
816 
817  // Retrieve the data in INTEGER format.
818  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
819  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
820  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
821  EXPECT_EQ(0, l_Bx.size());
822  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
823  EXPECT_EQ(0, l_Bz.size());
824  EXPECT_LT(0, l_Temperature);
825  ASSERT_EQ(0, l_TimestampList.size());
826  l_ErrorList = pTHM1176->CurrentErrorList();
827  ASSERT_EQ(1, l_ErrorList.size());
828  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
829  pTHM1176->ClearErrorList();
830 
831  // Retrieve the data in PACKED,2 format.
832  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
833  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
834  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
835  EXPECT_EQ(0, l_Bx.size());
836  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
837  EXPECT_EQ(0, l_Bz.size());
838  EXPECT_LT(0, l_Temperature);
839  ASSERT_EQ(0, l_TimestampList.size());
840  l_ErrorList = pTHM1176->CurrentErrorList();
841  ASSERT_EQ(1, l_ErrorList.size());
842  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
843  pTHM1176->ClearErrorList();
844 
845  // Retrieve the data in PACKED,1 format.
846  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
847  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
848  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
849  EXPECT_EQ(0, l_Bx.size());
850  EXPECT_EQ(THM1176_NO_MEASUREMENTS-1, l_By.size());
851  EXPECT_EQ(0, l_Bz.size());
852  EXPECT_LT(0, l_Temperature);
853  ASSERT_EQ(0, l_TimestampList.size());
854  l_ErrorList = pTHM1176->CurrentErrorList();
855  ASSERT_EQ(1, l_ErrorList.size());
856  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
857  pTHM1176->ClearErrorList();
858  }
859  // NoMeasurements = THM1176_NO_MEASUREMENTS+1, retrieve all.
860  {
861  sArbitraryMeasurements l_Select = { true, true, true, true, true, THM1176_NO_MEASUREMENTS+1 };
862 
863  // ASCII format.
864  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
865  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatAscii));
866  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
867  {
868  l_ErrorList = pTHM1176->CurrentErrorList();
869  EXPECT_EQ(3, l_ErrorList.size());
870  EXPECT_EQ(-222, l_ErrorList[0].Code);
871  EXPECT_EQ(-222, l_ErrorList[1].Code);
872  EXPECT_EQ(-222, l_ErrorList[2].Code);
873  }
874  EXPECT_EQ(0, l_Bx.size());
875  EXPECT_EQ(0, l_By.size());
876  EXPECT_EQ(0, l_Bz.size());
877  EXPECT_EQ(0, l_Temperature);
878  ASSERT_EQ(0, l_TimestampList.size());
879 
880  // Retrieve the data in INTEGER format.
881  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
882  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
883  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
884  {
885  l_ErrorList = pTHM1176->CurrentErrorList();
886  EXPECT_EQ(3, l_ErrorList.size());
887  EXPECT_EQ(-222, l_ErrorList[0].Code);
888  EXPECT_EQ(-222, l_ErrorList[1].Code);
889  EXPECT_EQ(-222, l_ErrorList[2].Code);
890  }
891  EXPECT_EQ(0, l_Bx.size());
892  EXPECT_EQ(0, l_By.size());
893  EXPECT_EQ(0, l_Bz.size());
894  EXPECT_EQ(0, l_Temperature);
895  ASSERT_EQ(0, l_TimestampList.size());
896 
897  // Retrieve the data in PACKED,2 format.
898  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
899  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked2Byte));
900  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
901  {
902  l_ErrorList = pTHM1176->CurrentErrorList();
903  EXPECT_EQ(3, l_ErrorList.size());
904  EXPECT_EQ(-222, l_ErrorList[0].Code);
905  EXPECT_EQ(-222, l_ErrorList[1].Code);
906  EXPECT_EQ(-222, l_ErrorList[2].Code);
907  }
908  EXPECT_EQ(0, l_Bx.size());
909  EXPECT_EQ(0, l_By.size());
910  EXPECT_EQ(0, l_Bz.size());
911  EXPECT_EQ(0, l_Temperature);
912  ASSERT_EQ(0, l_TimestampList.size());
913 
914  // Retrieve the data in PACKED,1 format.
915  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
916  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatPacked1Byte));
917  ASSERT_EQ(false, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
918  {
919  l_ErrorList = pTHM1176->CurrentErrorList();
920  EXPECT_EQ(3, l_ErrorList.size());
921  EXPECT_EQ(-222, l_ErrorList[0].Code);
922  EXPECT_EQ(-222, l_ErrorList[1].Code);
923  EXPECT_EQ(-222, l_ErrorList[2].Code);
924  }
925  EXPECT_EQ(0, l_Bx.size());
926  EXPECT_EQ(0, l_By.size());
927  EXPECT_EQ(0, l_Bz.size());
928  EXPECT_EQ(0, l_Temperature);
929  ASSERT_EQ(0, l_TimestampList.size());
930  }
931  // Try changing units.
932  {
933  sArbitraryMeasurements l_Select = { true, true, true, false, false, static_cast<U32>(THM1176_NO_MEASUREMENTS) };
934  CFluxList l_Bx1, l_By1, l_Bz1;
935 
936  l_Bx.clear(); l_By.clear(); l_Bz.clear(); l_Temperature = 0; l_TimestampList.clear();
937  ASSERT_EQ(true, pTHM1176->SetFormat(kComFormatInteger));
938 
939  CUnitsList l_AllUnits;
940  ASSERT_EQ(true, pTHM1176->GetAllUnits(l_AllUnits));
941  ASSERT_LT(1, l_AllUnits.size());
942 
943  ASSERT_EQ(true, pTHM1176->ParmUnitsSet(l_AllUnits[0]));
944  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
945  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx.size());
946  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By.size());
947  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz.size());
948 
949  ASSERT_EQ(true, pTHM1176->ParmUnitsSet(l_AllUnits[1]));
950  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx1, l_By1, l_Bz1, l_Units, l_Temperature, l_TimestampList));
951  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bx1.size());
952  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_By1.size());
953  EXPECT_EQ(THM1176_NO_MEASUREMENTS, l_Bz1.size());
954 
955  U32 l_Divisor, l_Divisor1;
956  ASSERT_EQ(true, pTHM1176->GetDivisor(l_AllUnits[0], l_Divisor));
957  ASSERT_EQ(true, pTHM1176->GetDivisor(l_AllUnits[1], l_Divisor1));
958 
959  for (auto l_pBx = l_Bx.begin(), l_pBx1 = l_Bx1.begin();
960  l_pBx < l_Bx.end() && l_pBx1 < l_Bx1.end();
961  l_pBx++, l_pBx1++)
962  EXPECT_FLOAT_EQ(*l_pBx * l_Divisor, *l_pBx1 * l_Divisor1);
963  for (auto l_pBy = l_By.begin(), l_pBy1 = l_By1.begin();
964  l_pBy < l_By.end() && l_pBy1 < l_By1.end();
965  l_pBy++, l_pBy1++)
966  EXPECT_FLOAT_EQ(*l_pBy * l_Divisor, *l_pBy1 * l_Divisor1);
967  for (auto l_pBz = l_Bz.begin(), l_pBz1 = l_Bz1.begin();
968  l_pBz < l_Bz.end() && l_pBz1 < l_Bz1.end();
969  l_pBz++, l_pBz1++)
970  EXPECT_FLOAT_EQ(*l_pBz * l_Divisor, *l_pBz1 * l_Divisor1);
971  }
972 }
973 
975 TEST_F(CTHM1176MeasuresTest, ApplyRotationMatrix)
976 {
977  // Note 1: This test is most meaningful with a magnetic field.
978  // Note 2: Initial testing compared results manually with LabVIEW THM1176 software (v 4.1).
979  CFluxList l_Bx, l_By, l_Bz;
980  eUnits l_Units;
981  U16 l_Temperature = 0;
982  CTimestampList l_TimestampList;
983  CErrorList l_ErrorList;
984 
985  // Fetch Bx, By, Bz separately – cannot apply angle correction.
986  CFluxList l_BxRaw, l_ByRaw, l_BzRaw;
987  sArbitraryMeasurements l_Select;
988 
989  l_Select = { true, false, false, false, false, 1 };
990  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_BxRaw, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
991  EXPECT_EQ(1, l_BxRaw.size());
992  EXPECT_EQ(0, l_By.size());
993  EXPECT_EQ(0, l_Bz.size());
994  EXPECT_EQ(0, l_Temperature);
995  ASSERT_EQ(0, l_TimestampList.size());
996  l_ErrorList = pTHM1176->CurrentErrorList();
997  ASSERT_EQ(1, l_ErrorList.size());
998  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
999  pTHM1176->ClearErrorList();
1000 
1001  l_Select = { false, true, false, false, false, 1 };
1002  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_ByRaw, l_Bz, l_Units, l_Temperature, l_TimestampList));
1003  EXPECT_EQ(0, l_Bx.size());
1004  EXPECT_EQ(1, l_ByRaw.size());
1005  EXPECT_EQ(0, l_Bz.size());
1006  EXPECT_EQ(0, l_Temperature);
1007  ASSERT_EQ(0, l_TimestampList.size());
1008  l_ErrorList = pTHM1176->CurrentErrorList();
1009  ASSERT_EQ(1, l_ErrorList.size());
1010  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
1011  pTHM1176->ClearErrorList();
1012 
1013  l_Select = { false, false, true, false, false, 1 };
1014  ASSERT_EQ(true, pTHM1176->MeasurementsGet(l_Select, l_Bx, l_By, l_BzRaw, l_Units, l_Temperature, l_TimestampList));
1015  EXPECT_EQ(0, l_Bx.size());
1016  EXPECT_EQ(0, l_By.size());
1017  EXPECT_EQ(1, l_BzRaw.size());
1018  EXPECT_EQ(0, l_Temperature);
1019  ASSERT_EQ(0, l_TimestampList.size());
1020  l_ErrorList = pTHM1176->CurrentErrorList();
1021  ASSERT_EQ(1, l_ErrorList.size());
1022  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
1023  pTHM1176->ClearErrorList();
1024 
1025  // Apply the rotation matrix.
1026  Matrix3f l_Matrix;
1027  ASSERT_EQ(true, pTHM1176->GetRotationMatrix(l_Matrix));
1028  Vector3f l_B;
1029  l_B << l_BxRaw[0], l_ByRaw[0], l_BzRaw[0];
1030  l_B = l_Matrix * l_B;
1031 
1032  // Fetch l_Bx, By, Bz all together – angle correction applied.
1033  l_Select = { true, true, true, false, false, 1 };
1034  ASSERT_EQ(true, pTHM1176->MeasurementsGet(1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
1035  EXPECT_EQ(1, l_Bx.size());
1036  EXPECT_EQ(1, l_By.size());
1037  EXPECT_EQ(1, l_Bz.size());
1038  EXPECT_LT(0, l_Temperature);
1039  ASSERT_EQ(1, l_TimestampList.size());
1040  l_ErrorList = pTHM1176->CurrentErrorList();
1041  ASSERT_EQ(0, l_ErrorList.size());
1042 
1043  // Check the results.
1044  EXPECT_FLOAT_EQ(l_B(0), l_Bx[0]);
1045  EXPECT_FLOAT_EQ(l_B(1), l_By[0]);
1046  EXPECT_FLOAT_EQ(l_B(2), l_Bz[0]);
1047 
1048  // Make sure that we get a warning when Use Calibration is off.
1049  ASSERT_EQ(true, pTHM1176->ParmUseCalibrationSet(false));
1050  // NOTE: We seem to be getting spurious 206 (Timer Overrun) errors here – firmware bug?
1051  // To catch it, uncomment the assertion, below.
1052  U16 l_Status = pTHM1176->Initiate();
1053  // ASSERT_EQ(true, l_Status);
1054 
1055  l_Select = { true, true, true, false, false, 1 };
1056  ASSERT_EQ(true, pTHM1176->MeasurementsGet(1, l_Bx, l_By, l_Bz, l_Units, l_Temperature, l_TimestampList));
1057  EXPECT_EQ(1, l_Bx.size());
1058  EXPECT_EQ(1, l_By.size());
1059  EXPECT_EQ(1, l_Bz.size());
1060  EXPECT_LT(0, l_Temperature);
1061  ASSERT_EQ(1, l_TimestampList.size());
1062  l_ErrorList = pTHM1176->CurrentErrorList();
1063  ASSERT_EQ(1, l_ErrorList.size());
1064  EXPECT_EQ(THM1176_NO_ANGLE_CORRECTION_CODE, l_ErrorList[0].Code);
1065  pTHM1176->ClearErrorList();
1066 }
1067 
TEST_F
TEST_F(CTHM1176MeasuresTest, SetFormat)
Definition: CTHM1176MeasurementsTest.cpp:81
MTL::Instrument::THM1176Types::sMeasurementConditions::UseCalibration
bool UseCalibration
Use calibration data.
Definition: THM1176Types.h:601
MTL::Instrument::CTHM1176Instrument::ParmTriggerInputGet
bool ParmTriggerInputGet(sInputTrigger< uParm > &rInputTrig)
Fetch current trigger input parameters.
Definition: THM1176.cpp:1012
MTL::Instrument::THM1176Types::kInputTrigSrcBus
@ kInputTrigSrcBus
Bus trigger: start measurement upon USB trigger message.
Definition: THM1176Types.h:399
MTL::Instrument::THM1176Types::sRange::Range
ParmType< tFlux > Range
Measurement range, if auto-ranging is not enabled.
Definition: THM1176Types.h:460
THM1176TestUtilities.h
Utility functions used to test THM1176 API.
MTL::Instrument::THM1176Types::sInputTrigger::Period_s
ParmType< F64 > Period_s
Trigger period, for timed trigger.
Definition: THM1176Types.h:407
MTL::Instrument::CSCPIBuffer::end
std::vector< MTL_INSTRUMENT_BUFFER_TYPE >::iterator end()
Return an iterator to the end of the buffer.
Definition: SCPIInstrumentBuffer.h:138
MTL::Instrument::THM1176Types::eUnits
eUnits
Enumeration of possible measurement units.
Definition: THM1176Types.h:182
CTHM1176MeasuresTest
Test THM1176 API: MeasurementsGet, SetFormat.
Definition: CTHM1176MeasurementsTest.cpp:25
MTL::Instrument::THM1176Types::sMeasurementConditions::AveragingParms
sAveraging< uParm > AveragingParms
Averaging parameters.
Definition: THM1176Types.h:599
U64
unsigned long long U64
64-bit unsigned integer.
Definition: OSDefines.h:33
CTHM1176MeasuresTest::pTHM1176
static CTHM1176Instrument< THM1176_TEST_INSTRUMENT_CLASS, THM1176_TEST_RESOURCE_MANAGER_CLASS > * pTHM1176
Definition: CTHM1176MeasurementsTest.cpp:28
THM1176_NO_MEASUREMENTS
static const I32 THM1176_NO_MEASUREMENTS(3)
MTL::Instrument::THM1176Types::sArbitraryMeasurements
Specify the measurement data to be returned.
Definition: THM1176Types.h:572
MTL::Instrument::THM1176Types::CTimestampList::GetEstimatedPeriod
bool GetEstimatedPeriod(F64 &Period)
Estimate the measurement period from this timestamp list, by means of a least-squares fit.
Definition: THM1176Types.cpp:424
MTL::Instrument::THM1176Types::sMeasurementConditions
Summary of the parameters used to make a measurement.
Definition: THM1176Types.h:598
MTL::Instrument::THM1176_NO_ANGLE_CORRECTION_CODE
static const I32 THM1176_NO_ANGLE_CORRECTION_CODE
Warning that angle correction was not applied.
Definition: THM1176.h:83
MTL::Instrument::CTHM1176Instrument< THM1176_TEST_INSTRUMENT_CLASS, THM1176_TEST_RESOURCE_MANAGER_CLASS >
THM1176_TIME_PER_MEASUREMENT
static const U64 THM1176_TIME_PER_MEASUREMENT(static_cast< U64 >(THM1176_IMMEDIATE_TIME_PER_MEAS+THM1176_AVG_COUNT *THM1176_IMMEDIATE_TIME_PER_ACQ+0.5))
MTL::Instrument::THM1176Types::sRange
Measurement range parameter.
Definition: THM1176Types.h:458
THM1176_IMMEDIATE_TIME_PER_MEAS
static const F64 THM1176_IMMEDIATE_TIME_PER_MEAS(4.4532792007542600E+04)
MTL::Instrument::CSCPIBuffer::begin
std::vector< MTL_INSTRUMENT_BUFFER_TYPE >::iterator begin()
Return an iterator to the beginning of the buffer.
Definition: SCPIInstrumentBuffer.h:122
MTL::Instrument::CTHM1176Instrument::ParmTriggerInputSet
bool ParmTriggerInputSet(const sInputTrigger< uParm > &rInputTrig)
Set trigger input parameters.
Definition: THM1176.cpp:974
THM1176_AVG_COUNT
static const U32 THM1176_AVG_COUNT(100)
MTL::Instrument::THM1176Types::kComFormatAscii
@ kComFormatAscii
Human-legible text.
Definition: THM1176Types.h:446
MTL::Instrument::CTHM1176Instrument::ParmRangeSet
bool ParmRangeSet(const sRange< uParm > &rRange)
Set measurement range.
Definition: THM1176.cpp:1178
MTL::Instrument::CTHM1176Instrument::ParmRangeGet
bool ParmRangeGet(sRange< uParm > &rRange)
Fetch currently selected measurement range.
Definition: THM1176.cpp:1204
CTHM1176MeasuresTest::pResourceManager
static THM1176_TEST_RESOURCE_MANAGER_CLASS * pResourceManager
Definition: CTHM1176MeasurementsTest.cpp:27
ConnectToTHM1176
bool ConnectToTHM1176(THM1176_TEST_RESOURCE_MANAGER_CLASS *&rpResourceManager, CTHM1176Instrument< THM1176_TEST_INSTRUMENT_CLASS, THM1176_TEST_RESOURCE_MANAGER_CLASS > *&rpTHM1176)
Connect to a THM1176.
Definition: THM1176TestUtilities.cpp:41
THM1176_IMMEDIATE_TIME_PER_ACQ
static const F64 THM1176_IMMEDIATE_TIME_PER_ACQ(1.0281823091218700E+05)
MTL::Instrument::THM1176Types::sRange::Auto
bool Auto
Auto-ranging enabled.
Definition: THM1176Types.h:459
MTL::Instrument::THM1176Types::eCommunicationFormat
eCommunicationFormat
Enumeration of possible formats for returned data.
Definition: THM1176Types.h:445
CTHM1176MeasuresTest::TearDownTestCase
static void TearDownTestCase()
Definition: CTHM1176MeasurementsTest.cpp:39
MTL::Instrument::THM1176Types::sInputTrigger::Count
ParmType< U16 > Count
Trigger count: take this many measurements before sending results.
Definition: THM1176Types.h:408
CTHM1176MeasuresTest::SetUp
virtual void SetUp()
Definition: CTHM1176MeasurementsTest.cpp:47
MTL::Instrument
Definition: THM1176.h:75
MTL::Instrument::THM1176Types
Definition: THM1176TypeConversions.h:20
MTL::Instrument::THM1176Types::sAveraging
Averaging parameter.
Definition: THM1176Types.h:367
MTL::Instrument::THM1176Types::kInputTrigSrcImmediate
@ kInputTrigSrcImmediate
Immediate trigger: start measurement immediately after previous one completes.
Definition: THM1176Types.h:397
MTL::Instrument::THM1176Types::kStatusByte
@ kStatusByte
Status Byte.
Definition: THM1176Types.h:38
MTL::Instrument::THM1176Types::kStatusEvent
@ kStatusEvent
Event register.
Definition: THM1176Types.h:46
I32
int I32
32-bit signed integer.
Definition: OSDefines.h:28
MTL::Instrument::THM1176Types::CAbsoluteTimestamp
Timestamp for a measurement.
Definition: THM1176Types.h:530
MTL::Instrument::THM1176Types::CTimestampList
List of timestamps.
Definition: THM1176Types.h:555
MTL::Instrument::CTHM1176Instrument::Initiate
bool Initiate(bool Continuous=false)
Initiate measurements.
Definition: THM1176.cpp:1400
MTL::Instrument::THM1176Types::sInputTrigger
Input trigger parameter.
Definition: THM1176Types.h:405
MTL::Instrument::THM1176Types::sStatusRegister
Complete identification of a SCPI status register.
Definition: THM1176Types.h:52
MTL::Instrument::THM1176Types::CUnitsList
List of measurement units.
Definition: THM1176Types.h:194
MTL::Instrument::THM1176Types::sMeasurementConditions::TriggerParms
sInputTrigger< uParm > TriggerParms
Trigger parameters.
Definition: THM1176Types.h:600
MTL::Instrument::THM1176Types::kComFormatInteger
@ kComFormatInteger
Binary (32-bit integers)
Definition: THM1176Types.h:447
MTL::Instrument::THM1176Types::CFluxList
List of flux density values.
Definition: THM1176Types.h:170
MTL::Instrument::CTHM1176Instrument::ParmAveragingGet
bool ParmAveragingGet(sAveraging< uParm > &rAvg)
Fetch the currently selected averaging parameter.
Definition: THM1176.cpp:904
MTL::Instrument::CTHM1176Instrument::Reset
bool Reset()
Reset the instrument to power-on configuration.
Definition: THM1176.cpp:2104
MTL::Instrument::THM1176Types::CErrorList
List of errors returned by the instrument.
Definition: THM1176Types.h:232
MTL::Instrument::THM1176Types::sInputTrigger::Source
eInputTriggerSource Source
Trigger source.
Definition: THM1176Types.h:406
U16
unsigned short U16
16-bit unsigned integer.
Definition: OSDefines.h:31
MTL::Instrument::CSCPIBuffer
Instrument Buffer.
Definition: SCPIInstrumentBuffer.h:44
F64
double F64
64-bit floating-point number.
Definition: OSDefines.h:35
CTHM1176MeasuresTest::SetUpTestCase
static void SetUpTestCase()
Definition: CTHM1176MeasurementsTest.cpp:30
U32
unsigned int U32
32-bit unsigned integer.
Definition: OSDefines.h:32
MTL::Instrument::CTHM1176Instrument::ParmAveragingSet
bool ParmAveragingSet(const sAveraging< uParm > &rAvg)
Set the averaging parameter.
Definition: THM1176.cpp:892
MTL::Instrument::THM1176Types::sAveraging::NoPoints
ParmType< U16 > NoPoints
Number of points in block average.
Definition: THM1176Types.h:368
MTL::Instrument::THM1176Types::kComFormatPacked2Byte
@ kComFormatPacked2Byte
Binary packed: first field value as I32, remainder deltas as I16.
Definition: THM1176Types.h:448
MTL::Instrument::THM1176Types::kComFormatPacked1Byte
@ kComFormatPacked1Byte
Binary packed: first field value as I32, remainder deltas as I8.
Definition: THM1176Types.h:449
MTL::Instrument::THM1176Types::kInputTrigSrcTimer
@ kInputTrigSrcTimer
Timed trigger: start measurement at regular intervals.
Definition: THM1176Types.h:398