17 #define LOG(__msg__, __level__,__location__) m_rMFCController.l_SendLogMessage(__msg__, __level__, ".MFC3045Device", __location__)
26 m_rMFCController(rMFCController),
31 l_ParseSerialSettings(rSerialSetting, m_SerialParms);
43 static std::string toBinaryString(
const T& x)
46 ss << std::bitset<sizeof(T) * 8>(x);
52 return static_cast <F64
>(rFreqdHz)*1.0e-7;
57 return static_cast <U32
>(rFreqMHz*1.0e7);
62 return static_cast <F32
>(rFreqdHz)*1.0e-7f;
67 return static_cast <I32
>(rFreqMHz*1.0e7f);
72 F64 l_StdDevppm(DPqNaN);
73 if (rFreqRefdHz > 0 && rStdDevdHz > 0)
74 l_StdDevppm= (
static_cast <F64
>(rStdDevdHz) * 1.0e6) /
static_cast <F64
>(rFreqRefdHz);
75 return static_cast <F32
>(l_StdDevppm);
78 bool CMFC3045Device::l_UtcToStrDateISO8601(
const std::time_t & rUtcDate, std::string & rStrDate)
81 auto l_TimePointUTC = std::chrono::system_clock::from_time_t(rUtcDate);
82 rStrDate =
date::format(
"%FT%TZ", date::floor<std::chrono::seconds>(l_TimePointUTC));
84 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Fail to format time_t UTC date to string",
MTL__LOCATION__);
103 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k2400;
106 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k4800;
109 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k9600;
112 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k19200;
115 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k28800;
118 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k38400;
121 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k57600;
124 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k115200;
132 switch (rSerialSetting.
Parity)
135 rVisaSerialSetting.
Parity = eSerialParity::kNone;
138 rVisaSerialSetting.
Parity = eSerialParity::kOdd;
141 rVisaSerialSetting.
Parity = eSerialParity::kEven;
152 rVisaSerialSetting.
DataBits = eSerialDataBits::k7;
155 rVisaSerialSetting.
DataBits = eSerialDataBits::k8;
166 rVisaSerialSetting.
StopBits = eSerialStopBits::k1;
169 rVisaSerialSetting.
StopBits = eSerialStopBits::k2;
180 rVisaSerialSetting.
Handshake = eSerialHandshake::kNone;
183 rVisaSerialSetting.
Handshake = eSerialHandshake::kXonXoff;
186 rVisaSerialSetting.
Handshake = eSerialHandshake::kHardware;
196 bool CMFC3045Device::l_ReadSomeStatusReg(
const uStatusRegSel & rRdSelStatus)
202 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 1",
MTL__LOCATION__);
209 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 2",
MTL__LOCATION__);
214 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 3",
MTL__LOCATION__);
219 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 4",
MTL__LOCATION__);
224 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 5",
MTL__LOCATION__);
229 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 6",
MTL__LOCATION__);
232 catch (sMFCDeviceError & rE)
245 bool CMFC3045Device::l_SerialCommunicationSuccess()
259 bool CMFC3045Device::l_CheckPAConnected(
bool & rPAPresent)
264 if(!m_MFC3045.
StatusGet(eStatusRegister::kStatus2, l_StatusTemp))
265 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register",
MTL__LOCATION__);
266 m_RegStatus2.
RawSTB2 = l_StatusTemp;
269 catch (sMFCDeviceError & rE)
281 *(
reinterpret_cast<U64*
>(&lastcfg.
FreqMin)) != *(
reinterpret_cast<U64*
>(&newcfg.
FreqMin)) ||
282 *(
reinterpret_cast<U64*
>(&lastcfg.
FreqMax)) != *(
reinterpret_cast<U64*
>(&newcfg.
FreqMax)) ||
302 U16 l_NbMeasCylce(0);
308 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not stop any instrument acquisition",
MTL__LOCATION__);
310 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not disable SMA on instrument",
MTL__LOCATION__);
312 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set block mode to decimal",
MTL__LOCATION__);
318 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not stop any instrument acquisition",
MTL__LOCATION__);
320 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not disable SMA on instrument",
MTL__LOCATION__);
323 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
326 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to set MRE register",
MTL__LOCATION__);
328 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
332 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set min Freq measurement",
MTL__LOCATION__);
335 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set max Freq measurement",
MTL__LOCATION__);
339 l_NbMeasCylce =
static_cast<U16
>(
NCY_MIN);
341 l_NbMeasCylce =
static_cast<U16
>(
NCY_MAX);
345 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set number of measurement cycle",
MTL__LOCATION__);
348 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set block mode to decimal",
MTL__LOCATION__);
354 rError = sMFCDeviceError(sMFCDeviceError::eLevel::kNoError,
"Configuration done.",
MTL__LOCATION__);
356 catch (sMFCDeviceError & rE)
364 bool CMFC3045Device::l_ComputeMaxMeasTimeout(U64 & rMaxTimeOutMs)
369 U16 l_NbMeasCylce(0);
370 U16 l_NbPreMeasCylce(100);
371 U16 l_NbModPeriod(0);
374 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not get number of measurement cycle",
MTL__LOCATION__);
377 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not get modulation period",
MTL__LOCATION__);
381 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
383 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not get number of pre cycle",
MTL__LOCATION__);
385 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
386 rMaxTimeOutMs = 4*(l_NbModPeriod * (l_NbMeasCylce + l_NbPreMeasCylce));
388 catch (sMFCDeviceError & rE)
397 void CMFC3045Device::l_ComputeAveraging (
const std::vector<U32> & rFluxListdHz, F64 & rReturnedAveragingMHz, F64 & rReturnedStdDevppm)
401 rReturnedAveragingMHz = 0.0l;
402 rReturnedStdDevppm = 0.0l;
406 if (rFluxListdHz.empty())
410 for (std::vector<U32>::const_iterator l_it = rFluxListdHz.begin(); l_it != rFluxListdHz.end(); l_it++)
423 if (l_ValidCount > 0)
424 rReturnedAveragingMHz = rReturnedAveragingMHz / l_ValidCount;
426 rReturnedAveragingMHz = DPqNaN;
429 if (l_ValidCount > 1)
431 for (std::vector<U32>::const_iterator l_it = rFluxListdHz.begin(); l_it != rFluxListdHz.end(); l_it++)
438 rReturnedStdDevppm += l_Value * l_Value;
442 rReturnedStdDevppm = sqrt(rReturnedStdDevppm / (l_ValidCount - 1)) / rReturnedAveragingMHz * 1.0e6;
445 rReturnedStdDevppm = DPqNaN;
450 rReturnedAveragingMHz = DPqNaN;
451 rReturnedStdDevppm = DPqNaN;
459 if(rNewNormalizationTable.size() != m_NbProbesPA)
460 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Wrong Normalization table size",
MTL__LOCATION__);
463 std::vector<I32> l_ReadMFC3045NormalizationdHz;
465 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Cannot retrieve normalization table",
MTL__LOCATION__);
466 if(l_ReadMFC3045NormalizationdHz.size() < m_NbProbesPA)
467 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Missing normalization result",
MTL__LOCATION__);
471 for (
auto&& Factor_MHz : rNewNormalizationTable)
475 if (l_ReadMFC3045NormalizationdHz.at(l_ProbeIdx) !=l_Norm_dHz)
478 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Cannot set normalization table in RAM",
MTL__LOCATION__);
483 catch (sMFCDeviceError & rE)
488 rError = sMFCDeviceError(sMFCDeviceError::eLevel::kNoError,
"Write RAM done.",
MTL__LOCATION__);
494 return m_MFC3045.
Abort();
500 bool l_Connected(
false);
516 std::string l_LastCmdError;
522 if(!l_ReadSomeStatusReg(l_SelStatus))
532 U16 l_ReadRSPRegValue(0);
535 U16 l_SerialSettings;
538 if(l_ReadRSPRegValue != l_SerialSettings)
539 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Incompatible host and instrument serial settings. MFC3045 Settings: 0b" + toBinaryString(l_ReadRSPRegValue),
MTL__LOCATION__);
541 std::string l_RdString;
542 F32 l_FWVersionValue(0.0);
545 if(!m_MFC3045.
VersionGet(l_RdString, l_FWVersionValue, eWhoVersion::kMUFirmVer))
548 if(!m_MFC3045.
VersionGet(l_RdString, l_FWVersionValue, eWhoVersion::kMUEepromVer))
550 rInstrInfo.
Description +=
", MU-EEPROM Version " + l_RdString;
551 if(!m_MFC3045.
SerialNumberGet(l_RdString, eWhoSerialNum::kMUSerialNum))
557 std::string l_CalDateUTCStr;
558 std::time_t l_CalDateUTC;
567 if(!l_ReadSomeStatusReg(l_SelStatus))
586 std::string l_RdString;
587 rPaInfoChanged =
false;
594 if(!l_ReadSomeStatusReg(l_SelStatus))
602 if(!m_MFC3045.
SerialNumberGet(l_RdString, eWhoSerialNum::kPASerialNum))
604 if(l_RdString != m_PaSerialNum)
608 if(!l_ReadSomeStatusReg(l_SelStatus))
613 m_PaSerialNum = l_RdString;
643 m_NbProbesPA = l_NbProbe;
645 for (U8 l_it =1; l_it <= l_NbProbe; l_it++)
654 rPAInfo.
Description =
"MFC3048 : Continuous Wave Camera";
658 std::string l_NormDateUTCStr;
667 rPaInfoChanged =
true;
669 if(!l_ReadSomeStatusReg(l_SelStatus))
673 if(!l_ReadSomeStatusReg(l_SelStatus))
688 rPaInfoChanged =
true;
693 catch (
bool & rUsableCamera)
703 rPaInfoChanged =
true;
718 if(!l_ReadSomeStatusReg(l_SelStatus))
726 if(!l_ConfigureForOperation(rInstrState,l_Error))
730 if(!l_ReadSomeStatusReg(l_SelStatus))
737 U64 l_MaxMesTimeoutMs(0);
738 bool l_MaxTimeoutValid = l_ComputeMaxMeasTimeout(l_MaxMesTimeoutMs);
752 std::this_thread::sleep_for(std::chrono::milliseconds(200));
761 auto l_EndTime = std::chrono::system_clock::now() + std::chrono::milliseconds(l_MaxMesTimeoutMs);
767 if(l_MaxTimeoutValid)
769 if(std::chrono::system_clock::now() > l_EndTime)
773 l_SearchProg = (l_SearchProg + 1) % 99;
774 m_rMFCController.l_SendSearchProgress(l_SearchProg);
776 std::this_thread::sleep_for(std::chrono::milliseconds(SEARCH_POLLING_PERIOD_MS));
785 if(!l_ReadSomeStatusReg(l_SelStatus))
792 if (!m_rMFCController.l_IsAbortRequested())
797 std::vector<U32> l_ReadMesDatadHz;
800 if(l_ReadMesDatadHz.size() < m_NbProbesPA)
804 if (l_ReadMesDatadHz.empty())
808 m_rMFCController.l_SendSearchProgress(l_SearchProg);
811 F64 l_AverageMHz, l_StdDevPpm;
812 l_ComputeAveraging(l_ReadMesDatadHz, l_AverageMHz, l_StdDevPpm);
816 l_SearchResult.
Freq = l_AverageMHz;
817 l_SearchResult.
StdDev =
static_cast<F32
>(l_StdDevPpm);
818 m_rMFCController.l_SendSearchResult(l_SearchResult);
828 }
while (!m_rMFCController.l_IsAbortRequested() && l_IsContinuous);
831 if(!l_ReadSomeStatusReg(l_SelStatus))
839 U32 l_ReadTimeoutMs(0);
848 l_ReadSomeStatusReg(l_SelStatus);
852 return l_ReturnError;
857 bool l_MeasAllPA =
true;
865 if(!l_ReadSomeStatusReg(l_SelStatus))
873 if(!l_ConfigureForOperation(rInstrState,l_Error))
877 if(!l_ReadSomeStatusReg(l_SelStatus))
884 U64 l_MaxMesTimeoutMs(0);
885 bool l_MaxTimeoutValid = l_ComputeMaxMeasTimeout(l_MaxMesTimeoutMs);
919 std::this_thread::sleep_for(std::chrono::milliseconds(200));
927 auto l_EndTime = std::chrono::system_clock::now() + std::chrono::milliseconds(l_MaxMesTimeoutMs);
932 if(l_MaxTimeoutValid)
934 if(std::chrono::system_clock::now() > l_EndTime)
940 l_SearchProg = (l_SearchProg + 2) % 98;
941 m_rMFCController.l_SendSearchProgress(l_SearchProg);
942 std::this_thread::sleep_for(std::chrono::milliseconds(MEAS_POLLING_PERIOD_MS));
951 if(!l_ReadSomeStatusReg(l_SelStatus))
958 if(!m_rMFCController.l_IsAbortRequested())
964 m_rMFCController.l_SendSearchProgress(l_SearchProg);
966 l_MeasResult.
Timestamp =
static_cast<U64
>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
969 std::vector<U32> l_ReadMesDatadHz;
970 std::vector<U32> l_ReadStdDevDatadHz;
971 std::vector<U32> l_ReadValidCycleNb;
974 if(l_ReadMesDatadHz.size() < m_NbProbesPA)
979 if(l_ReadStdDevDatadHz.size() < m_NbProbesPA)
984 if(l_ReadValidCycleNb.size() < m_NbProbesPA)
988 for (U8 l_it =0; l_it < m_NbProbesPA; l_it++)
993 if(l_ReadValidCycleNb.at(l_it) > 0)
1000 l_Meas.
Freq = DPqNaN;
1001 l_Meas.
StdDev =
static_cast<F32
>(DPqNaN);
1008 U32 l_ReadMesDatadHz;
1009 U32 l_ReadStdDevDatadHz;
1010 U32 l_ReadValidCycleNb;
1022 if(l_ReadValidCycleNb > 0)
1029 l_Meas.
Freq = DPqNaN;
1030 l_Meas.
StdDev =
static_cast<F32
>(DPqNaN);
1035 m_rMFCController.l_SendMeasResult(l_MeasResult);
1036 if(!l_ReadSomeStatusReg(l_SelStatus))
1049 }
while (!m_rMFCController.l_IsAbortRequested() && l_IsContinuous);
1052 if(!l_ReadSomeStatusReg(l_SelStatus))
1060 U32 l_ReadTimeoutMs(0);
1070 l_ReadSomeStatusReg(l_SelStatus);
1074 return l_ReturnError;
1085 if(!l_ReadSomeStatusReg(l_SelStatus))
1092 rReturnedNormalization.
Access = rNewNormalizationRequest.
Access;
1093 rReturnedNormalization.
Table.clear();
1099 switch (rNewNormalizationRequest.
Access)
1104 std::vector<I32> l_MFC3045NormalizationdHz;
1107 if(l_MFC3045NormalizationdHz.size() < m_NbProbesPA)
1112 if(!l_ReadSomeStatusReg(l_SelStatus))
1119 for (
auto&& Factor_dHz : l_MFC3045NormalizationdHz)
1128 std::vector<I32> l_MFC3045NormalizationdHz;
1135 if(l_MFC3045NormalizationdHz.size() < m_NbProbesPA)
1139 if(!l_ReadSomeStatusReg(l_SelStatus))
1146 for (
auto&& Factor_dHz : l_MFC3045NormalizationdHz)
1156 if(!l_WriteNormalizationRAM(rNewNormalizationRequest.
Table,l_Error))
1160 if(!l_ReadSomeStatusReg(l_SelStatus))
1170 if(!l_WriteNormalizationRAM(rNewNormalizationRequest.
Table,l_Error))
1174 if(!l_ReadSomeStatusReg(l_SelStatus))
1180 std::time_t l_NewDateNorm;
1181 time(&l_NewDateNorm);
1191 if(!l_ReadSomeStatusReg(l_SelStatus))
1199 std::vector<I32> l_ReadBackMFC3045NormdHz;
1206 if(l_ReadBackMFC3045NormdHz.size() < m_NbProbesPA)
1210 if(!l_ReadSomeStatusReg(l_SelStatus))
1217 for(U8 l_it =0; l_it < m_NbProbesPA; l_it++)
1245 std::time_t l_NormDateUTC;
1246 std::string l_NormDateUTCStr;
1250 if(!l_ReadSomeStatusReg(l_SelStatus))
1262 if(!l_UtcToStrDateISO8601(l_NormDateUTC, rNormDate))
1269 if(!l_ReadSomeStatusReg(l_SelStatus))
1286 switch (rRBBusyLedState)
1289 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedOff;
1292 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedMeasuring;
1295 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedOffEndMeas;
1298 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedOn;
1301 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedBlinkSlow;
1304 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedBlinkFast;
1313 if(!l_ReadSomeStatusReg(l_SelStatus))
1318 if(!l_ReadSomeStatusReg(l_SelStatus))
1336 if(!l_ReadSomeStatusReg(l_SelStatus))
1338 rRemoteStartPressed =
false;
1342 rRemoteStartPressed =
true;
1347 rRemoteStartPressed =
false;
1355 bool l_SystemReset(
false);
1359 U16 l_NewRSPSettings, l_ReadRSPRegValue;
1366 if(!l_ReadSomeStatusReg(l_SelStatus))
1368 if(!l_ParseSerialSettings(rNewSerialSetting, l_NewVisaSerialSettings))
1373 if(!m_MFC3045.
ParseParmForRSP(l_NewVisaSerialSettings,l_NewRSPSettings))
1380 if(l_ReadRSPRegValue!= l_NewRSPSettings)
1383 if(!l_ReadSomeStatusReg(l_SelStatus))
1397 if(!l_ReadSomeStatusReg(l_SelStatus))
1405 l_SystemReset =
true;
1409 m_SerialParms = l_NewVisaSerialSettings;