THM1176InstrumentManager  1.0
Qt Object abstraction for Metrolab THM1176
THM1176.h
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 
48 
49 #pragma once
50 
51 // Standard includes
52 #include <map>
53 #include <ctime>
54 #include <atomic>
55 
56 // Eigen library for linear algebra
57 #include "Eigen/Core"
58 
59 // Personal includes
60 #include "IEEE488Instrument.h"
61 #include "THM1176Types.h"
62 
63 using namespace MTL::Instrument;
64 
65 // Supported versions.
66 #define THM1176_SUPPORTED_VERSION_MIN_MAJOR 3
67 #define THM1176_SUPPORTED_VERSION_MIN_MINOR 0
68 #define THM1176_SUPPORTED_VERSION_MAX_MAJOR 3
69 #define THM1176_SUPPORTED_VERSION_MAX_MINOR 1
70 
71 using namespace MTL::Instrument::THM1176Types;
72 using namespace Eigen;
73 
74 namespace MTL {
75  namespace Instrument {
76 
77  //----------------------------------------------------------------------//
78  // Constants
84 
85  //----------------------------------------------------------------------//
86  // Class definition
97  template <class InstrType, class RsrcMgrType>
98  class CTHM1176Instrument: public InstrType
99  {
100  //----------------------------------------------------------------------//
101  // Private Attributes //
102  //----------------------------------------------------------------------//
103  private:
104  // General
105  mutable CRecursiveMutex m_Lock;
106  U32 m_Timeout;
107  std::string m_Identification;
108  sIdentifier m_IdentificationStruct;
109  CErrorList m_ErrorList;
110  CSCPIBuffer m_ReadBuffer;
111  CAbsoluteTimestamp m_BootTime;
112  CFluxList m_Ranges;
113  std::map<eUnits,U32> m_Units;
114  Matrix3f m_RotationMatrix;
115  std::string m_ManufacturingDate;
116  std::string m_CalibrationDate;
117  eUnits m_UnitsParms;
118  sAveraging<uParm> m_AveragingParms;
119  sInputTrigger<uParm> m_TriggerParms;
120  sRange<uParm> m_RangeParms;
121  eCommunicationFormat m_Format;
122  bool m_Sleep;
123  bool m_UseCalibration;
124  sAveraging<uParm> m_AveragingParmsAtInit;
125  sInputTrigger<uParm> m_TriggerParmsAtInit;
126  std::vector<std::chrono::high_resolution_clock::time_point> m_TriggerTimes;
127  std::atomic_bool m_AbortRead;
128 
129  //----------------------------------------------------------------------//
130  // Utilities //
131  //----------------------------------------------------------------------//
132  private:
133  bool ReadIdentification(std::string & rIdentification);
134  bool ParseIdentification(struct sIdentifier & rIdentification);
135  bool GetErrorList(CErrorList & rList, const std::string & rContext);
136  bool ReadBootTime(CAbsoluteTimestamp & rBootTime);
137  bool ReadAllRanges(CFluxList & rRanges);
138  bool ReadAllUnits(std::map<eUnits,U32> & rAllUnits);
139  bool ReadUseCalibration(bool & rUseCal);
140  bool ReadManufacturingDate(std::string & rDate);
141  bool ReadRotationMatrix(Matrix3f & rMatrix, std::string & rCalibrationDate);
142  bool ApplyRotationMatrix(tFlux & rBx, tFlux & rBy, tFlux & rBz);
143  bool ApplyRotationMatrix(CFluxList & rBx, CFluxList & rBy, CFluxList & rBz);
144  bool ParseMeasurements(CSCPIBufferParser & rBP, eUnits Units, CFluxList & rMeas, U32 NoMeasurements = 0);
145 
146  //----------------------------------------------------------------------//
147  // THM1176 Interface //
148  //----------------------------------------------------------------------//
149  public:
150  //----------------------------------------------------------------------//
151  // Constructors / destructors
155  CTHM1176Instrument(RsrcMgrType & rResourceManager, tResourceName ResourceName);
156 
158  virtual ~CTHM1176Instrument();
159 
160  //----------------------------------------------------------------------//
161  // General Information
164  const CErrorList & CurrentErrorList();
165 
167  void ClearErrorList();
168 
169  //----------------------------------------------------------------------//
170  // Open / Close
174  bool Connect(U32 InitialTimeout, bool Exclusive = true);
175 
177  void Disconnect();
178 
179  //----------------------------------------------------------------------//
180  // Parameters
181  // Averaging
185  bool ParmAveragingSet(const sAveraging<uParm> & rAvg);
186 
190  bool ParmAveragingGet(sAveraging<uParm> & rAvg);
191 
195  bool ParmAveragingGet(sAveraging<sBoundedParm> & rAvg);
196 
197  // Sleep
201  bool ParmSleepSet(bool Sleep);
202 
206  bool ParmSleepGet(bool & rSleep);
207 
208  // Trigger
212  bool ParmTriggerInputSet(const sInputTrigger<uParm> & rInputTrig);
213 
217  bool ParmTriggerInputGet(sInputTrigger<uParm> & rInputTrig);
218 
222  bool ParmTriggerInputGet(sInputTrigger<sBoundedParm> & rInputTrig);
223 
224  // Units
228  bool ParmUnitsSet(eUnits Units);
229 
233  bool ParmUnitsGet(eUnits & rUnits);
234 
235  // Use Calibration
239  bool ParmUseCalibrationSet(bool UseCal);
240 
244  bool ParmUseCalibrationGet(bool & rUseCal);
245 
246  // Range
250  bool ParmRangeSet(const sRange<uParm> & rRange);
251 
255  bool ParmRangeGet(sRange<uParm> & rRange);
256 
260  bool ParmRangeGet(sRange<sBoundedParm> & rRange);
261 
262  //----------------------------------------------------------------------//
263  // Files
269  bool ReadFileDirectory(U32 & rUsedBytes, U32 & rAvailableBytes, tFileList & rFileList);
270 
275  bool ReadFile(std::string Path, std::string & rContent);
276 
277  //----------------------------------------------------------------------//
278  // Initiate / Abort / Trigger
282  bool Initiate(bool Continuous = false);
283 
286  bool Abort(void);
287 
290  bool SendBusTrigger();
291 
292  //----------------------------------------------------------------------//
293  // Measurements / Data
308  bool MeasurementsGet(U32 NoMeasurements,
309  CFluxList & rBx, CFluxList & rBy, CFluxList & rBz,
310  eUnits & rUnits, U16 & rTemp, CTimestampList & rTimestampList,
311  sMeasurementConditions * pMeasurementConditions = NULL);
312 
327  bool MeasurementsGet(sArbitraryMeasurements ArbSelect,
328  CFluxList & rBx, CFluxList & rBy, CFluxList & rBz,
329  eUnits & rUnits, U16 & rTemp, CTimestampList & rTimestampList,
330  sMeasurementConditions * pMeasurementConditions = NULL);
331 
335  bool SetFormat(eCommunicationFormat Format);
336 
340  bool GetFormat(eCommunicationFormat & Format);
341 
342  //----------------------------------------------------------------------//
343  // High Level Measurement
353  bool Measure(tFlux & rBx, tFlux & rBy, tFlux & rBz,
354  bool DefaultParms = true, eUnits Units = kT,
355  tFlux ExpectedField = 0., unsigned int NoDigits = 0);
356 
367  bool Measure(CFluxList & rBx, CFluxList & rBy, CFluxList & rBz, unsigned int NoMeasurements = 1,
368  bool DefaultParms = true, eUnits Units = kT,
369  tFlux ExpectedField = 0., unsigned int NoDigits = 0);
370 
371  //----------------------------------------------------------------------//
372  // Status Handling
375  bool StatusPreset();
376 
381  bool StatusGet(sStatusRegister Reg, U16 & rStatus);
382 
387  bool StatusGet(RegisterList Regs, StatusValues & rStatus);
388 
397  bool StatusSetEnableRegister(eStatusRegisterSet Set, U16 DisableMask, U16 EnableMask);
398 
399  //----------------------------------------------------------------------//
400  // Utilities
405  bool WriteAndRead(const std::string & rWriteStr, CSCPIBuffer & rReadBuffer);
406 
410  bool GetIdentification(std::string & rIdentification);
411 
415  bool GetIdentification(sIdentifier & rIdentification);
416 
420  bool GetAllRanges(CFluxList & rRanges);
421 
426  inline bool ConvertTimestamp(const U64 RawTimestamp, CAbsoluteTimestamp & rTimestamp)
427  {
428  rTimestamp = m_BootTime + CAbsoluteTimestamp(0, RawTimestamp);
429  return true;
430  };
431 
435  bool GetAllUnits(CUnitsList & rUnits);
436 
441  bool GetDivisor(eUnits Units, U32 & rDivisor);
442 
446  bool GetRotationMatrix(Matrix3f & Matrix);
447 
452  bool GetImmediateMeasurementPeriod(const sAveraging<uParm> & rAvg, F64 & rPeriod);
453 
461  bool CalibrateZeroOffset(bool ForceCalibration = false);
462 
465  bool RestoreZeroOffset();
466 
469  bool Reset();
470 
477  bool SwitchToDFUMode();
478 
485  bool ReadInformationDates(std::string & rSManufacturingDate, std::time_t & rManufacturingDate, std::string & rSCalibrationDate, std::time_t & rCalibrationDate);
486 
493  bool AbortRead();
494 
495  };
496 
497  } // namespace Instrument
498 } // namespace MTL
MTL::Instrument::THM1176Types::RegisterList
List of SCPI status registers.
Definition: THM1176Types.h:66
MTL::Instrument::THM1176Types::eStatusRegisterSet
eStatusRegisterSet
Enumeration of SCPI status register sets.
Definition: THM1176Types.h:37
MTL::Instrument::THM1176Types::eUnits
eUnits
Enumeration of possible measurement units.
Definition: THM1176Types.h:182
U64
unsigned long long U64
64-bit unsigned integer.
Definition: OSDefines.h:33
MTL::Instrument::THM1176Types::sArbitraryMeasurements
Specify the measurement data to be returned.
Definition: THM1176Types.h:572
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 instrument class.
Definition: THM1176.h:99
MTL::Instrument::THM1176Types::sRange< uParm >
MTL::Instrument::CSCPIBufferParser
SCPI buffer parser.
Definition: SCPIInstrumentBuffer.h:217
IEEE488Instrument.h
Abstract IEEE488 instrument class: interface definition.
THM1176Types.h
Type definitions for C++ API for Metrolab THM1176/TFM1186.
MTL::Instrument::THM1176Types::sIdentifier
Instrument's identification string - parsed version.
Definition: THM1176Types.h:336
MTL::Instrument::THM1176Types::eCommunicationFormat
eCommunicationFormat
Enumeration of possible formats for returned data.
Definition: THM1176Types.h:445
MTL
Definition: CTHM1176InstrumentManager.h:179
MTL::Instrument
Definition: THM1176.h:75
MTL::Instrument::THM1176Types
Definition: THM1176TypeConversions.h:20
MTL::Instrument::CTHM1176Instrument::ConvertTimestamp
bool ConvertTimestamp(const U64 RawTimestamp, CAbsoluteTimestamp &rTimestamp)
Convert a raw timestamp to UNIX Epoch time and nanoseconds.
Definition: THM1176.h:426
MTL::Instrument::THM1176Types::sAveraging< uParm >
MTL::Instrument::THM1176Types::tFileList
std::vector< sFile > tFileList
List of directory entries.
Definition: THM1176Types.h:511
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::THM1176Types::StatusValues
List of values returned for several SCPI status registers.
Definition: THM1176Types.h:76
MTL::Instrument::tResourceName
std::string tResourceName
IEEE488 resource name.
Definition: IEEE488InstrumentTypes.h:22
MTL::Instrument::THM1176Types::kT
@ kT
Tesla.
Definition: THM1176Types.h:183
MTL::Instrument::THM1176Types::sInputTrigger< uParm >
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::CFluxList
List of flux density values.
Definition: THM1176Types.h:170
MTL::Instrument::THM1176Types::CErrorList
List of errors returned by the instrument.
Definition: THM1176Types.h:232
U16
unsigned short U16
16-bit unsigned integer.
Definition: OSDefines.h:31
MTL::Instrument::CSCPIBuffer
Instrument Buffer.
Definition: SCPIInstrumentBuffer.h:44
MTL::Synchronization::CRecursiveMutex
std::recursive_mutex CRecursiveMutex
Recursive Mutex.
Definition: Synchronization.h:20
F64
double F64
64-bit floating-point number.
Definition: OSDefines.h:35
U32
unsigned int U32
32-bit unsigned integer.
Definition: OSDefines.h:32
MTL::Instrument::THM1176Types::tFlux
F32 tFlux
Flux density value, as 32-bit floating-point number.
Definition: THM1176Types.h:30