17 #define LOG(__msg__, __level__,__location__) m_rMFCController.l_SendLogMessage(__msg__, __level__, ".MFC3045Device", __location__)
25 m_rMFCController(rMFCController),
30 l_ParseSerialSettings(rSerialSetting, m_SerialParms);
42 static std::string toBinaryString(
const T& x)
45 ss << std::bitset<sizeof(T) * 8>(x);
51 return static_cast <F64
>(rFreqdHz)*1.0e-7;
56 return static_cast <U32
>(rFreqMHz*1.0e7);
61 return static_cast <F32
>(rFreqdHz)*1.0e-7f;
66 return static_cast <I32
>(rFreqMHz*1.0e7f);
71 F64 l_StdDevppm(DPqNaN);
72 if (rFreqRefdHz > 0 && rStdDevdHz > 0)
73 l_StdDevppm= (
static_cast <F64
>(rStdDevdHz) * 1.0e6) /
static_cast <F64
>(rFreqRefdHz);
74 return static_cast <F32
>(l_StdDevppm);
77 bool CMFC3045Device::l_UtcToStrDateISO8601(
const std::time_t & rUtcDate, std::string & rStrDate)
80 auto l_TimePointUTC = std::chrono::system_clock::from_time_t(rUtcDate);
81 rStrDate =
date::format(
"%FT%TZ", date::floor<std::chrono::seconds>(l_TimePointUTC));
83 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Fail to format time_t UTC date to string",
MTL__LOCATION__);
85 catch (sMFCDeviceError & rE)
102 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k2400;
105 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k4800;
108 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k9600;
111 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k19200;
114 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k28800;
117 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k38400;
120 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k57600;
123 rVisaSerialSetting.
Baudrate = eSerialBaudrate::k115200;
131 switch (rSerialSetting.
Parity)
134 rVisaSerialSetting.
Parity = eSerialParity::kNone;
137 rVisaSerialSetting.
Parity = eSerialParity::kOdd;
140 rVisaSerialSetting.
Parity = eSerialParity::kEven;
151 rVisaSerialSetting.
DataBits = eSerialDataBits::k7;
154 rVisaSerialSetting.
DataBits = eSerialDataBits::k8;
165 rVisaSerialSetting.
StopBits = eSerialStopBits::k1;
168 rVisaSerialSetting.
StopBits = eSerialStopBits::k2;
179 rVisaSerialSetting.
Handshake = eSerialHandshake::kNone;
182 rVisaSerialSetting.
Handshake = eSerialHandshake::kXonXoff;
185 rVisaSerialSetting.
Handshake = eSerialHandshake::kHardware;
195 bool CMFC3045Device::l_ReadSomeStatusReg(
const uStatusRegSel & rRdSelStatus)
201 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 1",
MTL__LOCATION__);
208 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 2",
MTL__LOCATION__);
213 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 3",
MTL__LOCATION__);
218 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 4",
MTL__LOCATION__);
223 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 5",
MTL__LOCATION__);
228 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register 6",
MTL__LOCATION__);
231 catch (sMFCDeviceError & rE)
244 bool CMFC3045Device::l_SerialCommunicationSuccess()
258 bool CMFC3045Device::l_CheckPAConnected(
bool & rPAPresent)
263 if(!m_MFC3045.
StatusGet(eStatusRegister::kStatus2, l_StatusTemp))
264 throw sMFCDeviceError(sMFCDeviceError::eLevel::kWarning,
"Unable to read Status register",
MTL__LOCATION__);
265 m_RegStatus2.
RawSTB2 = l_StatusTemp;
268 catch (sMFCDeviceError & rE)
280 *(
reinterpret_cast<U64*
>(&lastcfg.
FreqMin)) != *(
reinterpret_cast<U64*
>(&newcfg.
FreqMin)) ||
281 *(
reinterpret_cast<U64*
>(&lastcfg.
FreqMax)) != *(
reinterpret_cast<U64*
>(&newcfg.
FreqMax)) ||
301 U16 l_NbMeasCylce(0);
307 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not stop any instrument acquisition",
MTL__LOCATION__);
309 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not disable SMA on instrument",
MTL__LOCATION__);
311 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set block mode to decimal",
MTL__LOCATION__);
317 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not stop any instrument acquisition",
MTL__LOCATION__);
319 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not disable SMA on instrument",
MTL__LOCATION__);
322 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
325 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to set MRE register",
MTL__LOCATION__);
327 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
331 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set min Freq measurement",
MTL__LOCATION__);
334 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set max Freq measurement",
MTL__LOCATION__);
338 l_NbMeasCylce =
static_cast<U16
>(
NCY_MIN);
340 l_NbMeasCylce =
static_cast<U16
>(
NCY_MAX);
344 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set number of measurement cycle",
MTL__LOCATION__);
347 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not set block mode to decimal",
MTL__LOCATION__);
353 rError = sMFCDeviceError(sMFCDeviceError::eLevel::kNoError,
"Configuration done.",
MTL__LOCATION__);
355 catch (sMFCDeviceError & rE)
363 bool CMFC3045Device::l_ComputeMaxMeasTimeout(U64 & rMaxTimeOutMs)
368 U16 l_NbMeasCylce(0);
369 U16 l_NbPreMeasCylce(100);
370 U16 l_NbModPeriod(0);
373 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not get number of measurement cycle",
MTL__LOCATION__);
376 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not get modulation period",
MTL__LOCATION__);
380 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
382 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Could not get number of pre cycle",
MTL__LOCATION__);
384 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Fail to change MU Advanced mode",
MTL__LOCATION__);
385 rMaxTimeOutMs = 4*(l_NbModPeriod * (l_NbMeasCylce + l_NbPreMeasCylce));
387 catch (sMFCDeviceError & rE)
396 void CMFC3045Device::l_ComputeAveraging (
const std::vector<U32> & rFluxListdHz, F64 & rReturnedAveragingMHz, F64 & rReturnedStdDevppm)
400 rReturnedAveragingMHz = 0.0l;
401 rReturnedStdDevppm = 0.0l;
405 if (rFluxListdHz.empty())
409 for (std::vector<U32>::const_iterator l_it = rFluxListdHz.begin(); l_it != rFluxListdHz.end(); l_it++)
422 if (l_ValidCount > 0)
423 rReturnedAveragingMHz = rReturnedAveragingMHz / l_ValidCount;
425 rReturnedAveragingMHz = DPqNaN;
428 if (l_ValidCount > 1)
430 for (std::vector<U32>::const_iterator l_it = rFluxListdHz.begin(); l_it != rFluxListdHz.end(); l_it++)
437 rReturnedStdDevppm += l_Value * l_Value;
441 rReturnedStdDevppm = sqrt(rReturnedStdDevppm / (l_ValidCount - 1)) / rReturnedAveragingMHz * 1.0e6;
444 rReturnedStdDevppm = DPqNaN;
449 rReturnedAveragingMHz = DPqNaN;
450 rReturnedStdDevppm = DPqNaN;
458 if(rNewNormalizationTable.size() != m_NbProbesPA)
459 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Wrong Normalization table size",
MTL__LOCATION__);
462 std::vector<I32> l_ReadMFC3045NormalizationdHz;
464 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Cannot retrieve normalization table",
MTL__LOCATION__);
465 if(l_ReadMFC3045NormalizationdHz.size() < m_NbProbesPA)
466 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Missing normalization result",
MTL__LOCATION__);
470 for (
auto&& Factor_MHz : rNewNormalizationTable)
474 if (l_ReadMFC3045NormalizationdHz.at(l_ProbeIdx) !=l_Norm_dHz)
477 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Cannot set normalization table in RAM",
MTL__LOCATION__);
482 catch (sMFCDeviceError & rE)
487 rError = sMFCDeviceError(sMFCDeviceError::eLevel::kNoError,
"Write RAM done.",
MTL__LOCATION__);
493 return m_MFC3045.
Abort();
499 bool l_Connected(
false);
515 std::string l_LastCmdError;
521 if(!l_ReadSomeStatusReg(l_SelStatus))
531 U16 l_ReadRSPRegValue(0);
534 U16 l_SerialSettings;
537 if(l_ReadRSPRegValue != l_SerialSettings)
538 throw sMFCDeviceError(sMFCDeviceError::eLevel::kError,
"Incompatible host and instrument serial settings. MFC3045 Settings: 0b" + toBinaryString(l_ReadRSPRegValue),
MTL__LOCATION__);
540 std::string l_RdString;
541 F32 l_FWVersionValue(0.0);
544 if(!m_MFC3045.
VersionGet(l_RdString, l_FWVersionValue, eWhoVersion::kMUFirmVer))
547 if(!m_MFC3045.
VersionGet(l_RdString, l_FWVersionValue, eWhoVersion::kMUEepromVer))
549 rInstrInfo.
Description +=
", MU-EEPROM Version " + l_RdString;
550 if(!m_MFC3045.
SerialNumberGet(l_RdString, eWhoSerialNum::kMUSerialNum))
556 std::string l_CalDateUTCStr;
557 std::time_t l_CalDateUTC;
566 if(!l_ReadSomeStatusReg(l_SelStatus))
585 std::string l_RdString;
586 rPaInfoChanged =
false;
593 if(!l_ReadSomeStatusReg(l_SelStatus))
601 if(!m_MFC3045.
SerialNumberGet(l_RdString, eWhoSerialNum::kPASerialNum))
603 if(l_RdString != m_PaSerialNum)
607 if(!l_ReadSomeStatusReg(l_SelStatus))
612 m_PaSerialNum = l_RdString;
642 m_NbProbesPA = l_NbProbe;
644 for (U8 l_it =1; l_it <= l_NbProbe; l_it++)
653 rPAInfo.
Description =
"MFC3048 : Continuous Wave Camera";
657 std::string l_NormDateUTCStr;
666 rPaInfoChanged =
true;
668 if(!l_ReadSomeStatusReg(l_SelStatus))
672 if(!l_ReadSomeStatusReg(l_SelStatus))
687 rPaInfoChanged =
true;
692 catch (
bool & rUsableCamera)
702 rPaInfoChanged =
true;
717 if(!l_ReadSomeStatusReg(l_SelStatus))
725 if(!l_ConfigureForOperation(rInstrState,l_Error))
729 if(!l_ReadSomeStatusReg(l_SelStatus))
736 U64 l_MaxMesTimeoutMs(0);
737 bool l_MaxTimeoutValid = l_ComputeMaxMeasTimeout(l_MaxMesTimeoutMs);
751 std::this_thread::sleep_for(std::chrono::milliseconds(200));
760 auto l_EndTime = std::chrono::system_clock::now() + std::chrono::milliseconds(l_MaxMesTimeoutMs);
766 if(l_MaxTimeoutValid)
768 if(std::chrono::system_clock::now() > l_EndTime)
772 l_SearchProg = (l_SearchProg + 1) % 99;
773 m_rMFCController.l_SendSearchProgress(l_SearchProg);
775 std::this_thread::sleep_for(std::chrono::milliseconds(SEARCH_POLLING_PERIOD_MS));
784 if(!l_ReadSomeStatusReg(l_SelStatus))
791 if (!m_rMFCController.l_IsAbortRequested())
796 std::vector<U32> l_ReadMesDatadHz;
799 if(l_ReadMesDatadHz.size() < m_NbProbesPA)
803 if (l_ReadMesDatadHz.empty())
807 m_rMFCController.l_SendSearchProgress(l_SearchProg);
810 F64 l_AverageMHz, l_StdDevPpm;
811 l_ComputeAveraging(l_ReadMesDatadHz, l_AverageMHz, l_StdDevPpm);
815 l_SearchResult.
Freq = l_AverageMHz;
816 l_SearchResult.
StdDev =
static_cast<F32
>(l_StdDevPpm);
817 m_rMFCController.l_SendSearchResult(l_SearchResult);
827 }
while (!m_rMFCController.l_IsAbortRequested() && l_IsContinuous);
830 if(!l_ReadSomeStatusReg(l_SelStatus))
838 U32 l_ReadTimeoutMs(0);
847 l_ReadSomeStatusReg(l_SelStatus);
851 return l_ReturnError;
856 bool l_MeasAllPA =
true;
864 if(!l_ReadSomeStatusReg(l_SelStatus))
872 if(!l_ConfigureForOperation(rInstrState,l_Error))
876 if(!l_ReadSomeStatusReg(l_SelStatus))
883 U64 l_MaxMesTimeoutMs(0);
884 bool l_MaxTimeoutValid = l_ComputeMaxMeasTimeout(l_MaxMesTimeoutMs);
918 std::this_thread::sleep_for(std::chrono::milliseconds(200));
926 auto l_EndTime = std::chrono::system_clock::now() + std::chrono::milliseconds(l_MaxMesTimeoutMs);
931 if(l_MaxTimeoutValid)
933 if(std::chrono::system_clock::now() > l_EndTime)
939 l_SearchProg = (l_SearchProg + 2) % 98;
940 m_rMFCController.l_SendSearchProgress(l_SearchProg);
941 std::this_thread::sleep_for(std::chrono::milliseconds(MEAS_POLLING_PERIOD_MS));
950 if(!l_ReadSomeStatusReg(l_SelStatus))
957 if(!m_rMFCController.l_IsAbortRequested())
963 m_rMFCController.l_SendSearchProgress(l_SearchProg);
965 l_MeasResult.
Timestamp =
static_cast<U64
>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
968 std::vector<U32> l_ReadMesDatadHz;
969 std::vector<U32> l_ReadStdDevDatadHz;
970 std::vector<U32> l_ReadValidCycleNb;
973 if(l_ReadMesDatadHz.size() < m_NbProbesPA)
978 if(l_ReadStdDevDatadHz.size() < m_NbProbesPA)
983 if(l_ReadValidCycleNb.size() < m_NbProbesPA)
987 for (U8 l_it =0; l_it < m_NbProbesPA; l_it++)
992 if(l_ReadValidCycleNb.at(l_it) > 0)
999 l_Meas.
Freq = DPqNaN;
1000 l_Meas.
StdDev =
static_cast<F32
>(DPqNaN);
1007 U32 l_ReadMesDatadHz;
1008 U32 l_ReadStdDevDatadHz;
1009 U32 l_ReadValidCycleNb;
1021 if(l_ReadValidCycleNb > 0)
1028 l_Meas.
Freq = DPqNaN;
1029 l_Meas.
StdDev =
static_cast<F32
>(DPqNaN);
1034 m_rMFCController.l_SendMeasResult(l_MeasResult);
1035 if(!l_ReadSomeStatusReg(l_SelStatus))
1048 }
while (!m_rMFCController.l_IsAbortRequested() && l_IsContinuous);
1051 if(!l_ReadSomeStatusReg(l_SelStatus))
1059 U32 l_ReadTimeoutMs(0);
1069 l_ReadSomeStatusReg(l_SelStatus);
1073 return l_ReturnError;
1084 if(!l_ReadSomeStatusReg(l_SelStatus))
1091 rReturnedNormalization.
Access = rNewNormalizationRequest.
Access;
1092 rReturnedNormalization.
Table.clear();
1098 switch (rNewNormalizationRequest.
Access)
1103 std::vector<I32> l_MFC3045NormalizationdHz;
1106 if(l_MFC3045NormalizationdHz.size() < m_NbProbesPA)
1111 if(!l_ReadSomeStatusReg(l_SelStatus))
1118 for (
auto&& Factor_dHz : l_MFC3045NormalizationdHz)
1127 std::vector<I32> l_MFC3045NormalizationdHz;
1134 if(l_MFC3045NormalizationdHz.size() < m_NbProbesPA)
1138 if(!l_ReadSomeStatusReg(l_SelStatus))
1145 for (
auto&& Factor_dHz : l_MFC3045NormalizationdHz)
1155 if(!l_WriteNormalizationRAM(rNewNormalizationRequest.
Table,l_Error))
1159 if(!l_ReadSomeStatusReg(l_SelStatus))
1169 if(!l_WriteNormalizationRAM(rNewNormalizationRequest.
Table,l_Error))
1173 if(!l_ReadSomeStatusReg(l_SelStatus))
1179 std::time_t l_NewDateNorm;
1180 time(&l_NewDateNorm);
1190 if(!l_ReadSomeStatusReg(l_SelStatus))
1198 std::vector<I32> l_ReadBackMFC3045NormdHz;
1205 if(l_ReadBackMFC3045NormdHz.size() < m_NbProbesPA)
1209 if(!l_ReadSomeStatusReg(l_SelStatus))
1216 for(U8 l_it =0; l_it < m_NbProbesPA; l_it++)
1244 std::time_t l_NormDateUTC;
1245 std::string l_NormDateUTCStr;
1249 if(!l_ReadSomeStatusReg(l_SelStatus))
1261 if(!l_UtcToStrDateISO8601(l_NormDateUTC, rNormDate))
1268 if(!l_ReadSomeStatusReg(l_SelStatus))
1285 switch (rRBBusyLedState)
1288 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedOff;
1291 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedMeasuring;
1294 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedOffEndMeas;
1297 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedOn;
1300 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedBlinkSlow;
1303 l_MFC3045RemoteLedState = eRemoteBusyLed::kRemoteLedBlinkFast;
1312 if(!l_ReadSomeStatusReg(l_SelStatus))
1317 if(!l_ReadSomeStatusReg(l_SelStatus))
1335 if(!l_ReadSomeStatusReg(l_SelStatus))
1337 rRemoteStartPressed =
false;
1341 rRemoteStartPressed =
true;
1346 rRemoteStartPressed =
false;
1354 bool l_SystemReset(
false);
1358 U16 l_NewRSPSettings, l_ReadRSPRegValue;
1365 if(!l_ReadSomeStatusReg(l_SelStatus))
1367 if(!l_ParseSerialSettings(rNewSerialSetting, l_NewVisaSerialSettings))
1372 if(!m_MFC3045.
ParseParmForRSP(l_NewVisaSerialSettings,l_NewRSPSettings))
1379 if(l_ReadRSPRegValue!= l_NewRSPSettings)
1382 if(!l_ReadSomeStatusReg(l_SelStatus))
1396 if(!l_ReadSomeStatusReg(l_SelStatus))
1404 l_SystemReset =
true;
1408 m_SerialParms = l_NewVisaSerialSettings;