From de2feb9fe0f58e8058248a31353bc947d3785c1e Mon Sep 17 00:00:00 2001 From: xin Date: Sun, 27 Feb 2022 13:34:47 +0800 Subject: [PATCH 01/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E6=97=B6=E9=97=B4=20rlx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 23afc7b..8dc4e25 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ /othersoft/calibration_console/.idea/ /othersoft/calibration_console/build/ /othersoft/shuttercali/project/LocationCali/cmake-build-debug +/othersoft/calibration_console/cmake-build-debug/ From 393a16c67d90aa61c8b1ada7f792040aff8de3c0 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 28 Feb 2022 10:43:26 +0800 Subject: [PATCH 02/53] =?UTF-8?q?1.=E7=BD=91=E7=BB=9C=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF=E8=BE=93=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E5=8C=85=E6=8B=AC=E4=B8=8A=E4=BC=A0=E6=97=B6=E3=80=81=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=B1=BB=E5=9E=8B=E7=AD=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/MainDataGrabber.cpp | 1 + source/Uploader/DataFileTransfer.cpp | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index 137ea6b..d8b14a9 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -131,6 +131,7 @@ int CMainDataGrabber::InitLS() m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition); + //m_ctrlLS.ILMES_MoveToPos(2); return 0; } diff --git a/source/Uploader/DataFileTransfer.cpp b/source/Uploader/DataFileTransfer.cpp index ab10ccd..409aa69 100644 --- a/source/Uploader/DataFileTransfer.cpp +++ b/source/Uploader/DataFileTransfer.cpp @@ -58,6 +58,7 @@ int ZZ_HttpTransfer::SendData() qbSend.append((char*)m_vecCalcedData[i][j].fData, sizeof(float)*m_vecCalcedData[i][j].iPixels); m_pNetworkManagerThread->post(qnRequest, qbSend); + qDebug() << "Network Sending: Data"; m_iFlagIsReplied = 0; int iCount = 0; while (!m_iFlagIsReplied) @@ -68,6 +69,7 @@ int ZZ_HttpTransfer::SendData() { m_iFlagIsReplied = 1; qDebug() << "Reply Timeout:Upload Data "; + qDebug() << "UpLoadAddr:" << qstrURL; } } } @@ -129,6 +131,7 @@ int ZZ_HttpTransfer::SendInfo() qbSend = qstrSend.toLatin1(); m_pNetworkManager->post(qnRequest, qbSend); + qDebug() << "Network Sending:Dev Info "; m_iFlagIsReplied = 0; int iCount = 0; while (!m_iFlagIsReplied) @@ -139,6 +142,7 @@ int ZZ_HttpTransfer::SendInfo() { m_iFlagIsReplied = 1; qDebug() << "Reply Timeout:Upload Info "; + qDebug() << "UpLoadAddr:" << qstrURL; } } } @@ -199,6 +203,7 @@ int ZZ_HttpTransfer::SendErr() qbSend = qstrSend.toLatin1(); m_pNetworkManager->post(qnRequest, qbSend); + qDebug() << "Network Sending:Warning Info "; m_iFlagIsReplied = 0; int iCount = 0; while (!m_iFlagIsReplied) @@ -209,6 +214,7 @@ int ZZ_HttpTransfer::SendErr() { m_iFlagIsReplied = 1; qDebug() << "Reply Timeout:Upload Info "; + qDebug() << "UpLoadAddr:" << qstrURL; } } return 0; @@ -252,8 +258,13 @@ int ZZ_HttpTransfer::SlotReplyFinished(QNetworkReply* qnReply) QByteArray qbData = qnReply->readAll(); if (qnReply->error()== QNetworkReply::NoError) { + qDebug() << "Reply NoError:" << "Server:" << qstrURL; m_iFlagIsReplied = 1; } + else + { + qDebug() << "Reply Error:" << qnReply->error() << "Server:" << qstrURL; + } qnReply->abort(); qnReply->close(); qnReply->deleteLater(); @@ -269,8 +280,13 @@ int ZZ_HttpTransfer::SlotReplyFinishedThread(QNetworkReply* qnReply) QByteArray qbData = qnReply->readAll(); if (qnReply->error() == QNetworkReply::NoError) { + qDebug() << "Reply NoError:" << "Server:"<error()<< "Server:"<abort(); qnReply->close(); qnReply->deleteLater(); From d306f93f8b833aa74f8f086d26d4e8cb8a98b923 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 28 Feb 2022 14:49:46 +0800 Subject: [PATCH 03/53] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E4=BA=86=E6=B8=A9?= =?UTF-8?q?=E5=BA=A6=E8=AE=BE=E7=BD=AE=E9=94=99=E8=AF=AF=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E3=80=82-5=E6=94=B9=E4=B8=BA=E4=B8=8Dreturn?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/AbstractFSController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index cd8a395..38b9aa3 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -96,7 +96,7 @@ int CAbstractFSController::InitializeFSControl() if (iRes != 0) { qDebug() << "SetDeviceTemperature Failed" << iRes; - return 5; + //return 5; } iFlagInit = 1; return 0; From f2bd257609968a9d28fdbafba31a393f0fd957ba Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 28 Feb 2022 15:18:57 +0800 Subject: [PATCH 04/53] echart --- source/CaptureThread/Scheduler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index b14a7bf..1b09b6d 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -28,7 +28,7 @@ void Scheduler::Preheating() #ifdef _DEBUG QThread::msleep(5000); #else - QThread::msleep(900000);//NEED TO CHANGE BEFOR HAND TO CUSTOM + //QThread::msleep(900000);//NEED TO CHANGE BEFOR HAND TO CUSTOM #endif qDebug() << "Preheating Finished"; } @@ -78,7 +78,7 @@ int Scheduler::OnTimeCounter() { m_iFlagIsOnRestart = 1; } - system("gpio write 1 0");//É豸¶Ïµç + system("gpio write 1 0");//�豸�ϵ� qDebug() << "gpio write 1 0......"< Date: Mon, 28 Feb 2022 16:06:12 +0800 Subject: [PATCH 05/53] =?UTF-8?q?1.=E5=BC=80=E5=90=AF=E4=BA=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=8A=E4=BC=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/MainDataGrabber.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index d8b14a9..92ac2cd 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -499,7 +499,7 @@ int CMainDataGrabber::GrabOnceFinished() //emit SignalPushOneDataFrame(vecData); m_pmduUploader->SetData(vecData); - // emit SignalPushOneDataFrame(); + emit SignalPushOneDataFrame(); m_pdfpSaver->SetData(vecData); m_pdfpSaver->WriteDataFile(); m_iFlagIsCapturing = 0; From ac7f13f7c01e28c41acf05e0c8966d0c3c5a315f Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 28 Feb 2022 16:48:48 +0800 Subject: [PATCH 06/53] =?UTF-8?q?1.=E6=9B=B4=E6=94=B9=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9B=9D=E5=85=89=E6=9C=80=E5=A4=A7=E6=9B=9D=E5=85=89?= =?UTF-8?q?=E6=97=B6=E9=97=B4=EF=BC=8C=E6=94=B9=E4=B8=BA=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AF=BB=E5=87=BA=E7=9A=84=E6=9C=80=E5=A4=A7=E6=97=B6=E9=97=B4?= =?UTF-8?q?=EF=BC=88MS=EF=BC=89-1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/AbstractFSController.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index 38b9aa3..8496078 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -226,7 +226,7 @@ int CAbstractFSController::PerformAutoExposure() dFactor = dTemp / (iDeviceDepth * m_fsInfo.fMaxFactor); iExposureTime = (float)(iExposureTime / dFactor); } - if (/*fExposureTime > 100 || */iExposureTime < 10) + if (/*fExposureTime > 100 || */iExposureTime < m_daDeviceAttr.iMinIntegrationTimeInMS) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; @@ -236,12 +236,12 @@ int CAbstractFSController::PerformAutoExposure() bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; - if (iExposureTime > 120000) + if (iExposureTime > m_daDeviceAttr.iMaxIntegrationTimeInMS - 1) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; - float fPredictedExposureTime = 120000; - iRes = m_pFSCtrl->SetExposureTime(120000); + float fPredictedExposureTime = m_daDeviceAttr.iMaxIntegrationTimeInMS-1; + iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS-1); if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; @@ -250,7 +250,7 @@ int CAbstractFSController::PerformAutoExposure() else { //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; - qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID; + qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS-1 << "MS" << " Thread ID:" << m_iThreadID; } bFlagIsOverMaxExposureTime = true; break; From 0aee19931fd44b38af40dc15403a8fe6b3cc8088 Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 28 Feb 2022 16:51:53 +0800 Subject: [PATCH 07/53] echart --- othersoft/install.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/othersoft/install.sh b/othersoft/install.sh index 6ff263c..1c2cf20 100644 --- a/othersoft/install.sh +++ b/othersoft/install.sh @@ -25,7 +25,8 @@ cmake ../../calibration_console make -j4 cp ./ocean_optics_calibration_console /home/pi/bin cd ../ - +sudo killall Mywathdog.sh +sudo killall TowerOptoSifAndSpectral cd ../../ cp -r ./html/* /var/www/html chmod +x /var/www/html/php/*.sh @@ -46,4 +47,5 @@ sudo apt-get install -y timedatectl timedatectl set-timezone Asia/Shanghai date -R sudo hwclock -w -f /dev/rtc0 + #tc From ff48d5ac0e0dfed3681ed6ea868107e4509c36db Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 28 Feb 2022 17:23:23 +0800 Subject: [PATCH 08/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=A5=E7=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.cpp b/main.cpp index f52e0da..f02ae9f 100644 --- a/main.cpp +++ b/main.cpp @@ -19,7 +19,7 @@ int main(int argc, char *argv[]) QCoreApplication a(argc, argv); - system("gpio mode 1 output");//¿ØÖÆÕë½Å³õʼ»¯ + system("gpio mode 1 output");//������ų�ʼ�� qDebug() << "gpio mode 1 output......" << endl; ////////////////////////////////////////////////////////////////////////// //// @@ -49,9 +49,10 @@ int main(int argc, char *argv[]) QT_LOG::ZZ_InitLogger("/home/data/Log/"); //////////////////////////////////////////////////////////////////////////config ///turn on power supply - system("gpio write 1 1");//É豸Éϵç + system("gpio mode 1 out"); + system("gpio write 1 1");//�豸�ϵ� qDebug() << "gpio write 1 1......" << endl; - + QThread::msleep(5000); bRes = m_scConfiggerLoader.Initialize(); if (bRes) { From c92eed71456273fb85251493b427c91e18edf381 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 28 Feb 2022 18:05:52 +0800 Subject: [PATCH 09/53] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9B=9D=E5=85=89=202.=E5=8A=A0=E6=88=90=E4=BA=86Recv?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/AbstractFSController.cpp | 45 ++++++++++--------- source/FS/ATPControl_Serial_QT.cpp | 10 ++--- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index 8496078..a16978e 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -181,7 +181,7 @@ int CAbstractFSController::PerformAutoExposure() } double dTemp = dSum / iCount; - qDebug() << "Avg " << dTemp; + qDebug() << "Avg " << dTemp << " Thread ID:" << m_iThreadID; if (dTemp >= iDeviceDepth * 0.99) { @@ -226,33 +226,38 @@ int CAbstractFSController::PerformAutoExposure() dFactor = dTemp / (iDeviceDepth * m_fsInfo.fMaxFactor); iExposureTime = (float)(iExposureTime / dFactor); } - if (/*fExposureTime > 100 || */iExposureTime < m_daDeviceAttr.iMinIntegrationTimeInMS) - { - bFlagIsAutoExposureOK = false; - bFlagIsAutoExposureFailed = true; - bFlagIsLowerMinExposureTime = true; - } + } bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; - if (iExposureTime > m_daDeviceAttr.iMaxIntegrationTimeInMS - 1) + if (/*fExposureTime > 100 || */iExposureTime <= m_daDeviceAttr.iMinIntegrationTimeInMS) + { + bFlagIsAutoExposureOK = false; + bFlagIsAutoExposureFailed = true; + bFlagIsLowerMinExposureTime = true; + + qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; + break; + } + + if (iExposureTime > m_daDeviceAttr.iMaxIntegrationTimeInMS-1) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; - float fPredictedExposureTime = m_daDeviceAttr.iMaxIntegrationTimeInMS-1; - iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS-1); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; - return 3; - } - else - { - //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; - qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS-1 << "MS" << " Thread ID:" << m_iThreadID; - } bFlagIsOverMaxExposureTime = true; + //float fPredictedExposureTime = m_daDeviceAttr.iMaxIntegrationTimeInMS-1; + //iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS-1); + //if (iRes != 0) + //{ + //qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + //return 3; + //} + //else + //{ + //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; + qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS-1 << "MS" << " Thread ID:" << m_iThreadID; + //} break; } diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index 1cf3cf2..b75ff5b 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -324,7 +324,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) int iCounter = 0; while (qbData.size() < 4) { - m_pSerialPort->waitForReadyRead(1000); + m_pSerialPort->waitForReadyRead(5000); QByteArray qbTemp = m_pSerialPort->readAll(); qbData.append(qbTemp); @@ -394,7 +394,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { - qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Not Enough Data.Exit Code:1" << qbData.size(); return 1; } iCounter++; @@ -402,7 +402,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if ((ZZ_U8)qbData[0] != (ZZ_U8)0xaa || (ZZ_U8)qbData[1] != (ZZ_U8)0x55) { - qDebug() << "Err:RecvData Failed,Wrong Header.Exit Code:2" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Wrong Header.Exit Code:2" << qbData.size(); return 2; } @@ -415,7 +415,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { - qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Incomplete Data.Exit Code:3" << qbData.size(); return 3; } iCounter++; @@ -435,7 +435,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) ZZ_U8 ucTemp = qbData[qbData.size() - 1]; if ((ZZ_U8)usCheckSum != ucTemp) { - qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; + qDebug() << "Err:RecvData_ShortLag Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; //qbData.clear(); //return 4; return 0; From 40fa2301b9b080d73d32212d6a8f051b52d29063 Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 28 Feb 2022 18:09:49 +0800 Subject: [PATCH 10/53] =?UTF-8?q?=E5=B1=8F=E8=94=BD=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/install.sh b/othersoft/install.sh index 1c2cf20..2b85a47 100644 --- a/othersoft/install.sh +++ b/othersoft/install.sh @@ -38,7 +38,7 @@ cp ./root/start.sh /root chmod +x /root/start.sh mkdir /home/data cd ../ -rm -rf ./TowerOptoSifAndSpectral +#rm -rf ./TowerOptoSifAndSpectral cd /root/filebrew chmod +x ./filebrowser ./filebrowser config set -a 0.0.0.0 From 90e9c235960a73ed5e1a8da7da24ba1b962df060 Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 28 Feb 2022 18:32:20 +0800 Subject: [PATCH 11/53] average --- othersoft/shuttercali/project/LocationCali/main.cpp | 1 - othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/othersoft/shuttercali/project/LocationCali/main.cpp b/othersoft/shuttercali/project/LocationCali/main.cpp index a7a4587..feb4ac8 100644 --- a/othersoft/shuttercali/project/LocationCali/main.cpp +++ b/othersoft/shuttercali/project/LocationCali/main.cpp @@ -124,7 +124,6 @@ int main(int argc, char* argv[]) - aa->Settingshuttertime(shuttertime); aa->GetOnePlot(oneplot); diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp b/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp index e4246b4..47e318f 100644 --- a/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp +++ b/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp @@ -38,6 +38,7 @@ bool SensorOptoSky::initSensor(int id /*= 0*/) } SensorInfo = GetSensorInfo(); + float a = GettingTempratrue(); //SendComment() return true; @@ -132,6 +133,9 @@ STRSensorInfo SensorOptoSky::GetSensorInfo() SendComment(SET_AVERAGE_NUMBER, bbb); GetReturn(SET_AVERAGE_NUMBER, bbb); se.maxValue = 65535; + bbb[0] = 0x00; + bbb[1] = 0x01; + SendComment(SET_AVERAGE_NUMBER,bbb); return se; } From f94173dba35bcde09a5a792f50496cf208406c47 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 1 Mar 2022 09:53:11 +0800 Subject: [PATCH 12/53] =?UTF-8?q?1.=E5=B1=8F=E8=94=BD=E4=BA=86IS1=E7=9A=84?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/AbstractFSController.cpp | 34 +++++++++++++------ source/FS/ATPControl_Serial_QT.cpp | 4 +-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index a16978e..84e9ba8 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -260,17 +260,16 @@ int CAbstractFSController::PerformAutoExposure() //} break; } - - iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; - return 3; - } - else - { - qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; - } + } + iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; + return 3; + } + else + { + qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; } fPredictedExposureTime = iExposureTime; qDebug() << "--------------------------Stop PerformAutoExposure" << " Thread ID:" << m_iThreadID; @@ -304,11 +303,24 @@ int CAbstractFSController::TakeSignalFrame() DataFrame CAbstractFSController::TakeOneFrame() { + using namespace ZZ_MISCDEF::IRIS; //int iExpTime = 0; DataFrame dfTemp; // m_pFSCtrl->GetExposureTime(iExpTime); // dfTemp.usExposureTimeInMS = iExpTime; // m_pFSCtrl->GetDeviceTemperature(dfTemp.fTemperature); + + if (m_fsInfo.ucDeviceModel== DeviceModel::ISIF) + { + float fTemp; + m_pFSCtrl->GetDeviceTemperature(fTemp); + dfTemp.fTemperature = fTemp; + } + else if(m_fsInfo.ucDeviceModel == DeviceModel::IS1) + { + dfTemp.fTemperature = 0; + } + int iRes = m_pFSCtrl->SingleShot(dfTemp); if (iRes != 0) { diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index b75ff5b..f2127c5 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -731,11 +731,9 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) // dfData.lData[i] = usData[i]; // } } - float fTemp; - GetDeviceTemperature(fTemp); dfData.usExposureTimeInMS = m_iExposureTime; - dfData.fTemperature = fTemp; + return 0; From 9da7bc31aa767a5fbab3c4b8ad026d8c4b0dff7a Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 1 Mar 2022 10:56:40 +0800 Subject: [PATCH 13/53] =?UTF-8?q?1.=E7=BD=91=E7=BB=9C=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=81=A2=E5=A4=8D=E4=BA=86=E6=AD=A3=E5=BC=8F?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Uploader/DataFileTransfer.cpp | 1 - source/Uploader/RadianceConverter.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/source/Uploader/DataFileTransfer.cpp b/source/Uploader/DataFileTransfer.cpp index 409aa69..5998ab5 100644 --- a/source/Uploader/DataFileTransfer.cpp +++ b/source/Uploader/DataFileTransfer.cpp @@ -51,7 +51,6 @@ int ZZ_HttpTransfer::SendData() qstrSend += /*"ExpTime:" +*/ QString("%1").arg(m_vecCalcedData[i][j].usExposureTimeInMS) + "##"; qstrSend += /*"Bands:" +*/ QString("%1").arg(m_vecCalcedData[i][j].iPixels) + "##"; qstrSend += /*"temp:" +*/ QString("%1").arg(m_vecCalcedData[i][j].fTemperature) + "##"; - //send qbSend.clear(); qbSend.append(qstrSend.toLatin1()); diff --git a/source/Uploader/RadianceConverter.cpp b/source/Uploader/RadianceConverter.cpp index 653a0f5..5468819 100644 --- a/source/Uploader/RadianceConverter.cpp +++ b/source/Uploader/RadianceConverter.cpp @@ -15,10 +15,10 @@ RadConverter::~RadConverter() int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams, vector> &struAllCalFrame) { /////param - //int iScanPoints = struGrabberRTParams.apsParams.iTotalPosition - 1; - //int iDevices = struGrabberRTParams.fscParams.ucDeviceNumber; - int iScanPoints = 4; - int iDevices = 1; + int iScanPoints = struGrabberRTParams.apsParams.iTotalPosition - 1; + int iDevices = struGrabberRTParams.fscParams.ucDeviceNumber; + //int iScanPoints = 4; + //int iDevices = 1; /////check dir QDir qdirPath(m_qstrCalFilePath); if (!qdirPath.exists()) From 29be390ecea5d84c31927b18299779ff8dd738c6 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 1 Mar 2022 11:39:48 +0800 Subject: [PATCH 14/53] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=9D=E5=85=89=E6=97=B6=E4=BA=A7=E7=94=9F?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/AbstractFSController.cpp | 61 +++++++++++++++---- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index 84e9ba8..78453f8 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -231,13 +231,37 @@ int CAbstractFSController::PerformAutoExposure() bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; + + if (/*fExposureTime > 100 || */iExposureTime <= m_daDeviceAttr.iMinIntegrationTimeInMS) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; bFlagIsLowerMinExposureTime = true; - qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; +// qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMinIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; +// iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); +// if (iRes != 0) +// { +// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; +// return 3; +// } +// else +// { +// qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; +// } + + iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + return 3; + } + else + { + qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMinIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID; + } + break; } @@ -256,21 +280,34 @@ int CAbstractFSController::PerformAutoExposure() //else //{ //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; - qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS-1 << "MS" << " Thread ID:" << m_iThreadID; //} + + iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS - 1); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + return 3; + } + else + { + qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; + } + break; } + + iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; + return 3; + } + else + { + qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; + } } - iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; - return 3; - } - else - { - qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; - } + fPredictedExposureTime = iExposureTime; qDebug() << "--------------------------Stop PerformAutoExposure" << " Thread ID:" << m_iThreadID; //emit SignalAcqFinished(m_iThreadID, 1); From f660397697dad96c4329268d4423cfaed6f4f154 Mon Sep 17 00:00:00 2001 From: tangchao Date: Tue, 1 Mar 2022 13:38:51 +0800 Subject: [PATCH 15/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E7=94=B1?= =?UTF-8?q?=E4=BA=8E=E4=BB=AA=E5=99=A8=E9=80=9A=E8=AE=AF=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8Catp=E6=9B=9D=E5=85=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=8D=E8=83=BD=E5=A4=A7=E4=BA=8E65s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source_Files/ATPControl_Serial_QT.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 4480fd5..551cd14 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -589,12 +589,12 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; - if (iExposureTime > 120000) + if (iExposureTime > 65000) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; - float fPredictedExposureTime = 120000; - iRes = SetExposureTime(120000); + float fPredictedExposureTime = 65000; + iRes = SetExposureTime(65000); if (iRes != 0) { // qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; From d15ec2b237f9c0443c90d3b318dec6e0bd89382c Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Wed, 2 Mar 2022 13:26:49 +0800 Subject: [PATCH 16/53] =?UTF-8?q?1.=E5=9C=A8ATP=E7=B3=BB=E5=88=97=E8=B0=B1?= =?UTF-8?q?=E4=BB=AA=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=86SetAvgTimes=E5=87=BD=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E5=B0=86=E5=B9=B3=E5=9D=87=E9=87=87=E9=9B=86=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=BA1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/FS/ATPControl_Serial_QT.cpp | 31 ++++++++++++++++++++++++++++++ source/FS/ATPControl_Serial_QT.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index f2127c5..ce9bb17 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -72,6 +72,7 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe GetDeviceInfo(m_diDeviceInfo); GetExposureTime_Init(); + SetAvgTimes(1); std::string::size_type szPostion = m_diDeviceInfo.strSN.find(strDeviceName); if (szPostion == std::string::npos) @@ -255,6 +256,36 @@ int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature) return 0; } +int ZZ_ATPControl_Serial_Qt::SetAvgTimes(int iTimes /*= 1*/) +{ + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(SET_AVERAGE_NUMBER); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:3"; + return 3; + } + return 0; +} + int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init() { QByteArray qbSend, qbRecv; diff --git a/source/FS/ATPControl_Serial_QT.h b/source/FS/ATPControl_Serial_QT.h index 7fa4fde..c6d91c8 100644 --- a/source/FS/ATPControl_Serial_QT.h +++ b/source/FS/ATPControl_Serial_QT.h @@ -62,6 +62,8 @@ public: //×Ô¶¯ÆØ¹â int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float &fPredictedExposureTime); +private: + int SetAvgTimes(int iTimes = 1); #ifdef _DEBUG public: From 71a28e030495423e49abb8232537b9a745b3405d Mon Sep 17 00:00:00 2001 From: xin Date: Wed, 2 Mar 2022 13:48:35 +0800 Subject: [PATCH 17/53] =?UTF-8?q?=E6=89=93=E5=BC=80=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CMakeFiles/CMakeOutput.log | 92 +++++++++---------- othersoft/install.sh | 2 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeOutput.log b/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeOutput.log index d4c3d39..08a8748 100644 --- a/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeOutput.log +++ b/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeOutput.log @@ -28,15 +28,15 @@ The CXX compiler identification is GNU, found in "D:/03MyGit/TowerOptoSifAndSpec Detecting C compiler ABI info compiled with the following output: Change Dir: D:/03MyGit/TowerOptoSifAndSpectral/TowerOptoSifAndSpectral/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeTmp -Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_be04c && [1/2] Building C object CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj +Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_e1679 && [1/2] Building C object CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj Using built-in specs. COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\gcc.exe Target: x86_64-w64-mingw32 Configured with: ../../../src/gcc-7.3.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/lib -L/c/mingw730/prerequisites/x86_64-zlib-static/lib -L/c/mingw730/prerequisites/x86_64-w64-mingw32-static/lib ' Thread model: posix gcc version 7.3.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona' - C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj -version -o C:\Users\xin\AppData\Local\Temp\ccnSkcqm.s +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona' + C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj -version -o C:\Users\xin\AppData\Local\Temp\ccHyc9vt.s GNU C11 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) version 7.3.0 (x86_64-w64-mingw32) compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.18-GMP @@ -57,13 +57,13 @@ GNU C11 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) version 7.3.0 (x86_6 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: afb3948cd5c0c8f535365414e7310436 -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona' - C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj C:\Users\xin\AppData\Local\Temp\ccnSkcqm.s +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona' + C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj C:\Users\xin\AppData\Local\Temp\ccHyc9vt.s GNU assembler version 2.30 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.30 COMPILER_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/ LIBRARY_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../ -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona' -[2/2] Linking C executable cmTC_be04c.exe +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona' +[2/2] Linking C executable cmTC_e1679.exe Using built-in specs. COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\gcc.exe COLLECT_LTO_WRAPPER=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe @@ -73,9 +73,9 @@ Thread model: posix gcc version 7.3.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) COMPILER_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/ LIBRARY_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_be04c.exe' '-mtune=core2' '-march=nocona' - C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccRLMu5s.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_be04c.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj --out-implib libcmTC_be04c.dll.a --major-image-version 0 --minor-image-version 0 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_be04c.exe' '-mtune=core2' '-march=nocona' +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_e1679.exe' '-mtune=core2' '-march=nocona' + C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\cc1qmxxy.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_e1679.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj --out-implib libcmTC_e1679.dll.a --major-image-version 0 --minor-image-version 0 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_e1679.exe' '-mtune=core2' '-march=nocona' @@ -96,15 +96,15 @@ Parsed C implicit link information from above output: link line regex: [^( *|.*[/\])(ld\.exe|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] ignore line: [Change Dir: D:/03MyGit/TowerOptoSifAndSpectral/TowerOptoSifAndSpectral/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeTmp] ignore line: [] - ignore line: [Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_be04c && [1/2] Building C object CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj] + ignore line: [Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_e1679 && [1/2] Building C object CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\gcc.exe] ignore line: [Target: x86_64-w64-mingw32] ignore line: [Configured with: ../../../src/gcc-7.3.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/lib -L/c/mingw730/prerequisites/x86_64-zlib-static/lib -L/c/mingw730/prerequisites/x86_64-w64-mingw32-static/lib '] ignore line: [Thread model: posix] ignore line: [gcc version 7.3.0 (x86_64-posix-seh-rev0 Built by MinGW-W64 project) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona'] - ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj -version -o C:\Users\xin\AppData\Local\Temp\ccnSkcqm.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona'] + ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj -version -o C:\Users\xin\AppData\Local\Temp\ccHyc9vt.s] ignore line: [GNU C11 (x86_64-posix-seh-rev0 Built by MinGW-W64 project) version 7.3.0 (x86_64-w64-mingw32)] ignore line: [ compiled by GNU C version 7.3.0 GMP version 6.1.2 MPFR version 4.0.1 MPC version 1.1.0 isl version isl-0.18-GMP] ignore line: [] @@ -125,8 +125,8 @@ Parsed C implicit link information from above output: ignore line: [] ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] ignore line: [Compiler executable checksum: afb3948cd5c0c8f535365414e7310436] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona'] - ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj C:\Users\xin\AppData\Local\Temp\ccnSkcqm.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona'] + ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj C:\Users\xin\AppData\Local\Temp\ccHyc9vt.s] ignore line: [GNU assembler version 2.30 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.30] ignore line: [COMPILER_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/] @@ -137,8 +137,8 @@ Parsed C implicit link information from above output: ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona'] - ignore line: [[2/2] Linking C executable cmTC_be04c.exe] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj' '-c' '-mtune=core2' '-march=nocona'] + ignore line: [[2/2] Linking C executable cmTC_e1679.exe] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\gcc.exe] ignore line: [COLLECT_LTO_WRAPPER=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe] @@ -155,13 +155,13 @@ Parsed C implicit link information from above output: ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_be04c.exe' '-mtune=core2' '-march=nocona'] - link line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccRLMu5s.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_be04c.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj --out-implib libcmTC_be04c.dll.a --major-image-version 0 --minor-image-version 0 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_e1679.exe' '-mtune=core2' '-march=nocona'] + link line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\cc1qmxxy.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_e1679.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj --out-implib libcmTC_e1679.dll.a --major-image-version 0 --minor-image-version 0 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o] arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe] ==> ignore arg [-plugin] ==> ignore arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll] ==> ignore arg [-plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe] ==> ignore - arg [-plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccRLMu5s.res] ==> ignore + arg [-plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\cc1qmxxy.res] ==> ignore arg [-plugin-opt=-pass-through=-lmingw32] ==> ignore arg [-plugin-opt=-pass-through=-lgcc] ==> ignore arg [-plugin-opt=-pass-through=-lgcc_eh] ==> ignore @@ -185,7 +185,7 @@ Parsed C implicit link information from above output: arg [i386pep] ==> ignore arg [-Bdynamic] ==> search dynamic arg [-o] ==> ignore - arg [cmTC_be04c.exe] ==> ignore + arg [cmTC_e1679.exe] ==> ignore arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o] ==> obj [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o] arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o] ==> obj [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o] arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0] @@ -194,9 +194,9 @@ Parsed C implicit link information from above output: arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib] arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib] arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../..] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../..] - arg [CMakeFiles/cmTC_be04c.dir/CMakeCCompilerABI.c.obj] ==> ignore + arg [CMakeFiles/cmTC_e1679.dir/CMakeCCompilerABI.c.obj] ==> ignore arg [--out-implib] ==> ignore - arg [libcmTC_be04c.dll.a] ==> ignore + arg [libcmTC_e1679.dll.a] ==> ignore arg [--major-image-version] ==> ignore arg [0] ==> ignore arg [--minor-image-version] ==> ignore @@ -242,15 +242,15 @@ Parsed C implicit link information from above output: Detecting CXX compiler ABI info compiled with the following output: Change Dir: D:/03MyGit/TowerOptoSifAndSpectral/TowerOptoSifAndSpectral/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeTmp -Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_672af && [1/2] Building CXX object CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj +Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_c97b8 && [1/2] Building CXX object CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj Using built-in specs. COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\c++.exe Target: x86_64-w64-mingw32 Configured with: ../../../src/gcc-7.3.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/lib -L/c/mingw730/prerequisites/x86_64-zlib-static/lib -L/c/mingw730/prerequisites/x86_64-w64-mingw32-static/lib ' Thread model: posix gcc version 7.3.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona' - C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1plus.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj -version -o C:\Users\xin\AppData\Local\Temp\ccabIW9c.s +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona' + C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1plus.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj -version -o C:\Users\xin\AppData\Local\Temp\cc5Ei9fH.s GNU C++14 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) version 7.3.0 (x86_64-w64-mingw32) compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.18-GMP @@ -277,13 +277,13 @@ GNU C++14 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) version 7.3.0 (x86 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 86cf749bb84a0f12f1d61bff4e68fffd -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona' - C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj C:\Users\xin\AppData\Local\Temp\ccabIW9c.s +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona' + C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj C:\Users\xin\AppData\Local\Temp\cc5Ei9fH.s GNU assembler version 2.30 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.30 COMPILER_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/ LIBRARY_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../ -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona' -[2/2] Linking CXX executable cmTC_672af.exe +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona' +[2/2] Linking CXX executable cmTC_c97b8.exe Using built-in specs. COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\c++.exe COLLECT_LTO_WRAPPER=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe @@ -293,9 +293,9 @@ Thread model: posix gcc version 7.3.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) COMPILER_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/ LIBRARY_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/;C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_672af.exe' '-shared-libgcc' '-mtune=core2' '-march=nocona' - C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccafbaEp.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_672af.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj --out-implib libcmTC_672af.dll.a --major-image-version 0 --minor-image-version 0 -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_672af.exe' '-shared-libgcc' '-mtune=core2' '-march=nocona' +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_c97b8.exe' '-shared-libgcc' '-mtune=core2' '-march=nocona' + C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccBDm4zM.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_c97b8.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj --out-implib libcmTC_c97b8.dll.a --major-image-version 0 --minor-image-version 0 -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_c97b8.exe' '-shared-libgcc' '-mtune=core2' '-march=nocona' @@ -322,15 +322,15 @@ Parsed CXX implicit link information from above output: link line regex: [^( *|.*[/\])(ld\.exe|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] ignore line: [Change Dir: D:/03MyGit/TowerOptoSifAndSpectral/TowerOptoSifAndSpectral/othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeTmp] ignore line: [] - ignore line: [Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_672af && [1/2] Building CXX object CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj] + ignore line: [Run Build Command(s):C:/Program Files/JetBrains/CLion 2021.1.1/bin/ninja/win/ninja.exe cmTC_c97b8 && [1/2] Building CXX object CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\c++.exe] ignore line: [Target: x86_64-w64-mingw32] ignore line: [Configured with: ../../../src/gcc-7.3.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw730/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/include -I/c/mingw730/prerequisites/x86_64-zlib-static/include -I/c/mingw730/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64/opt/lib -L/c/mingw730/prerequisites/x86_64-zlib-static/lib -L/c/mingw730/prerequisites/x86_64-w64-mingw32-static/lib '] ignore line: [Thread model: posix] ignore line: [gcc version 7.3.0 (x86_64-posix-seh-rev0 Built by MinGW-W64 project) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona'] - ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1plus.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj -version -o C:\Users\xin\AppData\Local\Temp\ccabIW9c.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona'] + ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/cc1plus.exe -quiet -v -iprefix C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/ -D_REENTRANT C:/Program Files/JetBrains/CLion 2021.1.1/bin/cmake/win/share/cmake-3.21/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=core2 -march=nocona -auxbase-strip CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj -version -o C:\Users\xin\AppData\Local\Temp\cc5Ei9fH.s] ignore line: [GNU C++14 (x86_64-posix-seh-rev0 Built by MinGW-W64 project) version 7.3.0 (x86_64-w64-mingw32)] ignore line: [ compiled by GNU C version 7.3.0 GMP version 6.1.2 MPFR version 4.0.1 MPC version 1.1.0 isl version isl-0.18-GMP] ignore line: [] @@ -357,8 +357,8 @@ Parsed CXX implicit link information from above output: ignore line: [] ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] ignore line: [Compiler executable checksum: 86cf749bb84a0f12f1d61bff4e68fffd] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona'] - ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj C:\Users\xin\AppData\Local\Temp\ccabIW9c.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona'] + ignore line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj C:\Users\xin\AppData\Local\Temp\cc5Ei9fH.s] ignore line: [GNU assembler version 2.30 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.30] ignore line: [COMPILER_PATH=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/] @@ -369,8 +369,8 @@ Parsed CXX implicit link information from above output: ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona'] - ignore line: [[2/2] Linking CXX executable cmTC_672af.exe] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=core2' '-march=nocona'] + ignore line: [[2/2] Linking CXX executable cmTC_c97b8.exe] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=C:\Qt\Qt5.12.7\Tools\mingw730_64\bin\c++.exe] ignore line: [COLLECT_LTO_WRAPPER=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe] @@ -387,13 +387,13 @@ Parsed CXX implicit link information from above output: ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/] ignore line: [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_672af.exe' '-shared-libgcc' '-mtune=core2' '-march=nocona'] - link line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccafbaEp.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_672af.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj --out-implib libcmTC_672af.dll.a --major-image-version 0 --minor-image-version 0 -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_c97b8.exe' '-shared-libgcc' '-mtune=core2' '-march=nocona'] + link line: [ C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe -plugin C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll -plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccBDm4zM.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-liconv -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=C:/mingw730/x86_64-730-posix-seh-rt_v5-rev0/mingw64 -m i386pep -Bdynamic -o cmTC_c97b8.exe C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0 -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib -LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../.. CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj --out-implib libcmTC_c97b8.dll.a --major-image-version 0 --minor-image-version 0 -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtend.o] arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/collect2.exe] ==> ignore arg [-plugin] ==> ignore arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/liblto_plugin-0.dll] ==> ignore arg [-plugin-opt=C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe] ==> ignore - arg [-plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccafbaEp.res] ==> ignore + arg [-plugin-opt=-fresolution=C:\Users\xin\AppData\Local\Temp\ccBDm4zM.res] ==> ignore arg [-plugin-opt=-pass-through=-lmingw32] ==> ignore arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore arg [-plugin-opt=-pass-through=-lgcc] ==> ignore @@ -417,7 +417,7 @@ Parsed CXX implicit link information from above output: arg [i386pep] ==> ignore arg [-Bdynamic] ==> search dynamic arg [-o] ==> ignore - arg [cmTC_672af.exe] ==> ignore + arg [cmTC_c97b8.exe] ==> ignore arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o] ==> obj [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o] arg [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o] ==> obj [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/crtbegin.o] arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0] @@ -426,9 +426,9 @@ Parsed CXX implicit link information from above output: arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../lib] arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/lib] arg [-LC:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../..] ==> dir [C:/Qt/Qt5.12.7/Tools/mingw730_64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../..] - arg [CMakeFiles/cmTC_672af.dir/CMakeCXXCompilerABI.cpp.obj] ==> ignore + arg [CMakeFiles/cmTC_c97b8.dir/CMakeCXXCompilerABI.cpp.obj] ==> ignore arg [--out-implib] ==> ignore - arg [libcmTC_672af.dll.a] ==> ignore + arg [libcmTC_c97b8.dll.a] ==> ignore arg [--major-image-version] ==> ignore arg [0] ==> ignore arg [--minor-image-version] ==> ignore diff --git a/othersoft/install.sh b/othersoft/install.sh index 2b85a47..1c2cf20 100644 --- a/othersoft/install.sh +++ b/othersoft/install.sh @@ -38,7 +38,7 @@ cp ./root/start.sh /root chmod +x /root/start.sh mkdir /home/data cd ../ -#rm -rf ./TowerOptoSifAndSpectral +rm -rf ./TowerOptoSifAndSpectral cd /root/filebrew chmod +x ./filebrowser ./filebrowser config set -a 0.0.0.0 From 847e4b40618720d8e7391168dd91ab04c220ba48 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 7 Mar 2022 09:51:55 +0800 Subject: [PATCH 18/53] =?UTF-8?q?1.=E5=B1=8F=E8=94=BD=E4=BA=86=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E5=A4=96=E7=9A=84=E8=AE=A1=E6=97=B6=E7=AD=89=E5=BE=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/Scheduler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index b14a7bf..1145a68 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -40,7 +40,7 @@ void Scheduler::SelfStart() void Scheduler::StartAsPlanned() { - bool bStopWait = false; + /*bool bStopWait = false; QTime qtTime = QTime::currentTime(); while (!bStopWait) { @@ -49,7 +49,7 @@ void Scheduler::StartAsPlanned() { bStopWait = true; } - } + }*/ int iIntervalInMS = m_struAcqTime.qtInterval.hour() * 3600 * 1000 + m_struAcqTime.qtInterval.minute() * 60 * 1000 + m_struAcqTime.qtInterval.second() * 1000; From d266e1d7d01aa59d7278b7a8979fe794ce1938e0 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 7 Mar 2022 09:58:50 +0800 Subject: [PATCH 19/53] =?UTF-8?q?1.=E9=87=8D=E6=96=B0=E6=89=93=E5=BC=80?= =?UTF-8?q?=E4=BA=86=E5=A4=96=E9=83=A8=E7=AD=89=E5=BE=85=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E4=BA=86=E7=AD=89=E5=BE=85=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/Scheduler.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index 1145a68..9b116ff 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -40,16 +40,17 @@ void Scheduler::SelfStart() void Scheduler::StartAsPlanned() { - /*bool bStopWait = false; - QTime qtTime = QTime::currentTime(); + bool bStopWait = false; + while (!bStopWait) { - QThread::msleep(100); + QThread::msleep(10000); + QTime qtTime = QTime::currentTime(); if (m_struAcqTime.qtStartTime <= qtTime && qtTime < m_struAcqTime.qtStopTime) { bStopWait = true; } - }*/ + } int iIntervalInMS = m_struAcqTime.qtInterval.hour() * 3600 * 1000 + m_struAcqTime.qtInterval.minute() * 60 * 1000 + m_struAcqTime.qtInterval.second() * 1000; From e699a415f9f577968cbd1c561b0814ab9b3771d6 Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 7 Mar 2022 11:18:27 +0800 Subject: [PATCH 20/53] =?UTF-8?q?=E5=BC=80=E5=90=AF=E9=A2=84=E7=83=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- root/start.sh | 2 +- source/CaptureThread/Scheduler.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8dc4e25..6252131 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ ################################################################################ -# æ­¤ .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 +# æ­¤ .gitignore 文件已由 Micosoft(R) Visual Studio 自动创建。 ################################################################################ /build @@ -16,3 +16,4 @@ /othersoft/calibration_console/build/ /othersoft/shuttercali/project/LocationCali/cmake-build-debug /othersoft/calibration_console/cmake-build-debug/ +/othersoft/calibration_console/cmake-build-debug/ diff --git a/root/start.sh b/root/start.sh index b9a4dae..d8d05db 100644 --- a/root/start.sh +++ b/root/start.sh @@ -4,5 +4,5 @@ chmod +x /root/frp_0.34.3_linux_arm/frpc chmod +x /root/ffwatch.sh /root/ffwatch.sh & chmod +x /root/Mywathdog.sh -/root/Mywathdog.sh & +bash /root/Mywathdog.sh & diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index d58b5f0..b455a8d 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -28,7 +28,7 @@ void Scheduler::Preheating() #ifdef _DEBUG QThread::msleep(5000); #else - //QThread::msleep(900000);//NEED TO CHANGE BEFOR HAND TO CUSTOM + QThread::msleep(900000);//NEED TO CHANGE BEFOR HAND TO CUSTOM #endif qDebug() << "Preheating Finished"; } From 6cac8bde4ff1ae44a9732930cf1197d4e91d4d2d Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 7 Mar 2022 11:21:29 +0800 Subject: [PATCH 21/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=87=8D=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/install.sh b/othersoft/install.sh index 1c2cf20..dffe938 100644 --- a/othersoft/install.sh +++ b/othersoft/install.sh @@ -47,5 +47,5 @@ sudo apt-get install -y timedatectl timedatectl set-timezone Asia/Shanghai date -R sudo hwclock -w -f /dev/rtc0 - +sudo reboot #tc From 10f57947cf3c66c8829a3064123c248afdaf327b Mon Sep 17 00:00:00 2001 From: tangchao Date: Mon, 7 Mar 2022 16:54:26 +0800 Subject: [PATCH 22/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E6=A0=87?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8E=E7=BC=80=E5=90=8D=EF=BC=88dat=20?= =?UTF-8?q?=E2=86=92=20cal=EF=BC=89=EF=BC=8C=E4=BB=A5=E4=BE=BF=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E7=94=A8=E6=94=B9=E5=90=8D=EF=BC=8CeasySif=E5=8F=AF?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/calibration_console/Source_Files/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index ace785d..843c75b 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -160,7 +160,7 @@ int main(int argc, char *argv[]) //¸´ÖÆ·øÉ䶨±êÎļþ QDateTime curDateTime = QDateTime::currentDateTime(); QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); - QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".dat"); + QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); copyFileToPath(query.calFileOutputName,destName,true); //¶Ï¿ª¹âÆ×ÒÇ From e9cbf077afbfee2a613d130ce37f16e866fb90be Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 8 Mar 2022 16:16:25 +0800 Subject: [PATCH 23/53] =?UTF-8?q?1.=E5=9C=A8=E9=87=87=E9=9B=86=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E5=92=8C=E5=81=9C=E6=AD=A2=E5=89=8D=E5=90=8E=E5=88=86?= =?UTF-8?q?=E5=88=AB=E5=B0=86=E4=BF=9D=E6=8C=81=E7=94=B5=E6=B5=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=B8=BA0.4=E5=92=8C0.=202.=E5=9C=A8=E6=96=AD?= =?UTF-8?q?=E7=94=B5=E5=90=8E=E5=B0=86=E4=BF=9D=E6=8C=81=E7=94=B5=E6=B5=81?= =?UTF-8?q?=E8=AE=BE=E4=B8=BA0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CaptureThread/MainDataGrabber.cpp | 31 ++++++++++++++++++++++-- source/CaptureThread/MainDataGrabber.h | 1 + source/CaptureThread/Scheduler.cpp | 1 + source/CaptureThread/Scheduler.h | 1 + 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index 92ac2cd..8b3f7a9 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -252,6 +252,7 @@ int CMainDataGrabber::SetupMsgPipelines() connect(this, &CMainDataGrabber::SignalGrabOnceFinished, this, &CMainDataGrabber::GrabOnceFinished); connect(m_psScheduler, &Scheduler::SignalGrabOnce, this, &CMainDataGrabber::OnTimeCounter); + connect(m_psScheduler, &Scheduler::SignalZeroHoldCurrent, this, &CMainDataGrabber::OnZeroHoldCurrent); connect(this, &CMainDataGrabber::SignalStartGrab, this, &CMainDataGrabber::StartGrabTimer); connect(this, &CMainDataGrabber::SignalGrabOnceFinished_Signal, this, &CMainDataGrabber::GrabOnceFinished_Signal); connect(this, &CMainDataGrabber::SignalGrabOnceFinished_Dark, this, &CMainDataGrabber::GrabOnceFinished_Dark); @@ -443,6 +444,15 @@ int CMainDataGrabber::GrabOnceFinished() m_pControlThread[i]->ClearBuffer(); } + + ////hold current + bool bRes = m_ctrlLS.SetHoldCurrent(0.4f); + if (!bRes) + { + qDebug() << "SetHoldCurrent 0.4 Failed"; + } + Delay_MSec(1000); + //// for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++) { ResetThreadStatus(); @@ -479,9 +489,15 @@ int CMainDataGrabber::GrabOnceFinished() { Delay_MSec(1000); } - } - + ////hold current + bRes = m_ctrlLS.SetHoldCurrent(0); + if (!bRes) + { + qDebug() << "SetHoldCurrent 0 Failed"; + } + Delay_MSec(1000); + //// std::vector> vecData; for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) @@ -544,3 +560,14 @@ int CMainDataGrabber::GrabOnceFinished() return 0; } + int CMainDataGrabber::OnZeroHoldCurrent() + { + bool bRes = m_ctrlLS.SetHoldCurrent(0); + if (!bRes) + { + qDebug() << "OnZeroHoldCurrent Failed"; + } + + return 0; + } + diff --git a/source/CaptureThread/MainDataGrabber.h b/source/CaptureThread/MainDataGrabber.h index a440052..0fd2df4 100644 --- a/source/CaptureThread/MainDataGrabber.h +++ b/source/CaptureThread/MainDataGrabber.h @@ -75,6 +75,7 @@ public slots: int InitLS(); int StartGrabTimer(); int OnTimeCounter(); + int OnZeroHoldCurrent(); int HandleThreadEvent_Signal(int iThreadID, int iFlagStatus); int HandleThreadEvent_Dark(int iThreadID, int iFlagStatus); diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index 9b116ff..986ad29 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -79,6 +79,7 @@ int Scheduler::OnTimeCounter() { m_iFlagIsOnRestart = 1; } + emit SignalZeroHoldCurrent(); system("gpio write 1 0");//É豸¶Ïµç qDebug() << "gpio write 1 0......"< Date: Thu, 17 Mar 2022 16:59:03 +0800 Subject: [PATCH 24/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=87=8D=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/install.sh b/othersoft/install.sh index dffe938..1c2cf20 100644 --- a/othersoft/install.sh +++ b/othersoft/install.sh @@ -47,5 +47,5 @@ sudo apt-get install -y timedatectl timedatectl set-timezone Asia/Shanghai date -R sudo hwclock -w -f /dev/rtc0 -sudo reboot + #tc From ba66f60f631e17251f3c0c5fd60bb03986587c96 Mon Sep 17 00:00:00 2001 From: tangchao Date: Mon, 21 Mar 2022 09:18:15 +0800 Subject: [PATCH 25/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8Datp=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E6=9B=9D=E5=85=89=E4=B8=BA6ms=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=8C10ms=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calibration_console/Source_Files/ATPControl_Serial_QT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 551cd14..586339f 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -200,7 +200,7 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) int iTempExpTime = 0; GetExposureTime(iTempExpTime); - iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); + iRes = SetExposureTime(10); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SetExposureTime error.Exit Code:2"; From 00ef87ab2a1cc4fdee7268eaa07c6ed495ba4016 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 21 Mar 2022 14:11:34 +0800 Subject: [PATCH 26/53] =?UTF-8?q?1.bug=E4=BF=AE=E5=A4=8D=E3=80=82QEPro?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=9C=80=E5=B0=8F=E6=9B=9D=E5=85=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=9C=AA=E6=8D=A2=E7=AE=97=E5=88=B0=E6=AF=AB=E7=A7=92?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E8=87=AA=E5=8A=A8=E6=9B=9D=E5=85=89?= =?UTF-8?q?=E5=87=BA=E9=94=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/FS/OControl_USB.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/FS/OControl_USB.cpp b/source/FS/OControl_USB.cpp index aea8c47..517cc20 100644 --- a/source/FS/OControl_USB.cpp +++ b/source/FS/OControl_USB.cpp @@ -465,7 +465,7 @@ int OceanOptics_lib::GetDeviceAttribute(DeviceAttribute &Attr) long minimum_time; minimum_time = seabreeze_get_min_integration_time_microsec(m_iSpectralmeterHandle, &error); - Attr.iMinIntegrationTimeInMS = minimum_time; + Attr.iMinIntegrationTimeInMS = (int)((double)minimum_time / (double)1000); Attr.iMaxIntegrationTimeInMS = 60000; if (spec_length > 0) { From 0ff26a98b7659ba0dfbe65b7237316f566ba9cf9 Mon Sep 17 00:00:00 2001 From: tangchao Date: Mon, 21 Mar 2022 14:18:26 +0800 Subject: [PATCH 27/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E6=9B=9D=E5=85=89=E6=97=B6=E9=97=B4=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=9A=E5=BE=AE=E7=A7=92=20=E2=86=92=20=E6=AF=AB?= =?UTF-8?q?=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/calibration_console/Source_Files/library.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/calibration_console/Source_Files/library.cpp b/othersoft/calibration_console/Source_Files/library.cpp index 3386b35..45173d6 100644 --- a/othersoft/calibration_console/Source_Files/library.cpp +++ b/othersoft/calibration_console/Source_Files/library.cpp @@ -468,7 +468,7 @@ int OceanOptics_lib::GetDeviceAttribute(DeviceAttribute &Attr) long minimum_time; minimum_time = seabreeze_get_min_integration_time_microsec(m_iSpectralmeterHandle, &error); - Attr.iMinIntegrationTimeInMS = minimum_time; + Attr.iMinIntegrationTimeInMS = minimum_time/1000; Attr.iMaxIntegrationTimeInMS = 60000; if (spec_length > 0) { From b06596ac92eff91255836aa6e54d6c4fb79ea706 Mon Sep 17 00:00:00 2001 From: tangchao Date: Thu, 21 Apr 2022 14:00:45 +0800 Subject: [PATCH 28/53] =?UTF-8?q?=EF=BC=881=EF=BC=89=E5=B0=86atp=E5=85=89?= =?UTF-8?q?=E8=B0=B1=E4=BB=AA=E7=9A=84=E6=8E=A7=E5=88=B6=E7=B1=BB=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=88=B0=E5=8D=93=E5=93=A5=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E8=BF=9E=E6=8E=A5atp=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20=EF=BC=882=EF=BC=89=E5=B0=86?= =?UTF-8?q?=E8=AF=BB=E5=8F=96OceanOptics=E7=9A=84=E9=9D=9E=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E6=AD=A3=E6=96=87=E4=BB=B6=20=20=E9=9B=86?= =?UTF-8?q?=E6=88=90=E5=88=B0=E5=AE=9A=E6=A0=87=E7=A8=8B=E5=BA=8F=E4=B8=AD?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header_Files/ATPControl_Serial_QT.h | 23 +- .../FiberSpectrometerOperationBase.h | 8 + .../Header_Files/ZZ_Types.h | 6 + .../Header_Files/atpFiberImager.h | 2 + .../Header_Files/library.h | 2 + .../Header_Files/oceanOpticsFiberImager.h | 2 + .../Source_Files/ATPControl_Serial_QT.cpp | 134 ++++---- .../Source_Files/atpFiberImager.cpp | 9 +- .../Source_Files/library.cpp | 71 +++++ .../calibration_console/Source_Files/main.cpp | 295 +++++++++++++++--- .../Source_Files/oceanOpticsFiberImager.cpp | 7 + 11 files changed, 431 insertions(+), 128 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h b/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h index 937ffde..bfedc57 100644 --- a/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h +++ b/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h @@ -3,6 +3,7 @@ ////////////////////////////////////////////////////////////////////////// #pragma once //#include "pch.h" + #include "ZZ_Types.h" #include "ZZ_Math.h" #include @@ -14,7 +15,7 @@ using namespace ZZ_MISCDEF; using namespace ZZ_MISCDEF::ATP; using namespace ZZ_MISCDEF::IRIS::FS; -class ZZ_ATPControl_Serial_Qt :public CIrisFSBase +class ZZ_ATPControl_Serial_Qt:public CIrisFSBase { Q_OBJECT public: @@ -33,10 +34,10 @@ public: void Close(); //µ¥´Î²âÊԲɼ¯ ÓÃÒÔÈ·ÈÏÉ豸ÏñËØÊý - int SingleShot(int& iPixels); + int SingleShot(int &iPixels); //µ¥´ÎÊý¾Ý²É¼¯ - int SingleShot(DataFrame& dfData); + int SingleShot(DataFrame &dfData); //µ¥´Î°µ±³¾°²É¼¯ //int SingleShotDark(ATPDataFrame &dfData); @@ -46,15 +47,15 @@ public: int SetExposureTime(int iExposureTimeInMS); //»ñÈ¡ÆØ¹âʱ¼äÉèÖà - int GetExposureTime(int& iExposureTimeInMS); + int GetExposureTime(int &iExposureTimeInMS); //int GetWaveLength(float *pfWaveLength); //»ñÈ¡É豸ÐÅÏ¢ - int GetDeviceInfo(DeviceInfo& Info); + int GetDeviceInfo(DeviceInfo &Info); //»ñÈ¡Éè±¸ÌØÕ÷Êý¾Ý - int GetDeviceAttribute(DeviceAttribute& Attr); + int GetDeviceAttribute(DeviceAttribute &Attr); //int GetDeviceListInfo(); //use type name to enum @@ -62,10 +63,12 @@ public: int SetDeviceTemperature(float fTemperature); //»ñÈ¡ÎÂ¶È - int GetDeviceTemperature(float& fTemperature); + int GetDeviceTemperature(float &fTemperature); //×Ô¶¯ÆØ¹â - int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float& fPredictedExposureTime); + int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float &fPredictedExposureTime); +private: + int SetAvgTimes(int iTimes = 1); #ifdef _DEBUG public: @@ -74,7 +77,7 @@ private: #endif //port int m_iBaudRate; - QSerialPort* m_pSerialPort; + QSerialPort *m_pSerialPort; //ATP DeviceInfo m_diDeviceInfo; @@ -94,6 +97,6 @@ public slots: int Init_Self(); signals: void SignalInit_Self(); - //private slots : +//private slots : //void ReadMessage(); }; \ No newline at end of file diff --git a/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h b/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h index 1ad2686..5318d9e 100644 --- a/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h +++ b/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h @@ -30,6 +30,14 @@ public: virtual void singleShot(DataFrame &dfData) = 0; +// typedef struct coeffs +// { +// ZZ_U32 coeffsCounter; +// double coeffs[100]; +// }coeffsFrame; + virtual void getNonlinearityCoeffs(coeffsFrame &coeffs) = 0; + + // ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number) = 0; DataFrame m_IntegratingSphereData; diff --git a/othersoft/calibration_console/Header_Files/ZZ_Types.h b/othersoft/calibration_console/Header_Files/ZZ_Types.h index c5e2210..8be8efa 100644 --- a/othersoft/calibration_console/Header_Files/ZZ_Types.h +++ b/othersoft/calibration_console/Header_Files/ZZ_Types.h @@ -30,6 +30,12 @@ namespace ZZ_MISCDEF double dTimes = 0; }DataFrame; + typedef struct coeffs//tcÌí¼Ó----------------------- + { + ZZ_U32 coeffsCounter; + double coeffs[100]; + }coeffsFrame; + typedef struct tagDeviceInfo { std::string strPN; diff --git a/othersoft/calibration_console/Header_Files/atpFiberImager.h b/othersoft/calibration_console/Header_Files/atpFiberImager.h index 41ff34e..5c3d337 100644 --- a/othersoft/calibration_console/Header_Files/atpFiberImager.h +++ b/othersoft/calibration_console/Header_Files/atpFiberImager.h @@ -31,6 +31,8 @@ public: void singleShot(DataFrame &dfData); + void getNonlinearityCoeffs(coeffsFrame &coeffs); + ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); // DataFrame m_IntegratingSphereData; diff --git a/othersoft/calibration_console/Header_Files/library.h b/othersoft/calibration_console/Header_Files/library.h index d9598ac..c1ca603 100644 --- a/othersoft/calibration_console/Header_Files/library.h +++ b/othersoft/calibration_console/Header_Files/library.h @@ -11,6 +11,7 @@ #include "IrisFiberSpectrometerBase.h" #include "api/seabreezeapi/SeaBreezeAPI.h" +#include "api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h" using namespace std; @@ -53,6 +54,7 @@ public: //tc static const char* get_error_string(int error); + void test_nonlinearity_coeffs_feature(); private: int m_iSpectralmeterHandle; DeviceInfo m_deviceInfo; diff --git a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h index ab5f1ff..135ce4a 100644 --- a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h +++ b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h @@ -31,6 +31,8 @@ public: void singleShot(DataFrame &dfData); + void getNonlinearityCoeffs(coeffsFrame &coeffs); + ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); // DataFrame m_IntegratingSphereData; diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 586339f..8fb5e8d 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -9,7 +9,7 @@ ZZ_ATPControl_Serial_Qt::ZZ_ATPControl_Serial_Qt(QObject* parent /*= nullptr*/) //emit SignalInit_Self(); } -ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt() +ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt()// { if (m_pSerialPort != NULL) { @@ -72,7 +72,7 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe GetDeviceInfo(m_diDeviceInfo); GetExposureTime_Init(); - + SetAvgTimes(1); std::string::size_type szPostion = m_diDeviceInfo.strSN.find(strDeviceName); if (szPostion == std::string::npos) @@ -196,15 +196,15 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) } m_daDeviceAttr.iMaxIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; - + /// int iTempExpTime = 0; GetExposureTime(iTempExpTime); - iRes = SetExposureTime(10); + iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SetExposureTime error.Exit Code:2"; - return 2; + //return 2; } iRes = SingleShot(m_daDeviceAttr.iPixels); if (iRes != 0) @@ -214,8 +214,7 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) } SetExposureTime(iTempExpTime); - - + /// qbSend.clear(); qbRecv.clear(); qbSend.append(GET_WAVELENGTH_CALIBRATION_COEF); @@ -257,6 +256,36 @@ int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature) return 0; } +int ZZ_ATPControl_Serial_Qt::SetAvgTimes(int iTimes /*= 1*/) +{ + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(SET_AVERAGE_NUMBER); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:3"; + return 3; + } + return 0; +} + int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init() { QByteArray qbSend, qbRecv; @@ -326,7 +355,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) int iCounter = 0; while (qbData.size() < 4) { - m_pSerialPort->waitForReadyRead(1000); + m_pSerialPort->waitForReadyRead(5000); QByteArray qbTemp = m_pSerialPort->readAll(); qbData.append(qbTemp); @@ -335,7 +364,6 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); return 1; } - iCounter++; } @@ -397,7 +425,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { - qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Not Enough Data.Exit Code:1" << qbData.size(); return 1; } iCounter++; @@ -405,7 +433,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if ((ZZ_U8)qbData[0] != (ZZ_U8)0xaa || (ZZ_U8)qbData[1] != (ZZ_U8)0x55) { - qDebug() << "Err:RecvData Failed,Wrong Header.Exit Code:2" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Wrong Header.Exit Code:2" << qbData.size(); return 2; } @@ -418,7 +446,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { - qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Incomplete Data.Exit Code:3" << qbData.size(); return 3; } iCounter++; @@ -438,7 +466,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) ZZ_U8 ucTemp = qbData[qbData.size() - 1]; if ((ZZ_U8)usCheckSum != ucTemp) { - qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; + qDebug() << "Err:RecvData_ShortLag Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; //qbData.clear(); //return 4; return 0; @@ -467,16 +495,9 @@ int ZZ_ATPControl_Serial_Qt::Init_Self() int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float &fPredictedExposureTime) { - int m_iThreadID=0; -// qDebug() << "--------------------------Starting PerformAutoExposure" << " Thread ID:" << m_iThreadID; using namespace ZZ_MATH; -// float fPredictedExposureTime; int iDeviceDepth = 65535; - - -// qDebug() << "MAX---Min" << fMaxScaleFactor << "---" << fMinScaleFactor << " Thread ID:" << m_iThreadID; - bool bFlagIsOverTrying = false; bool bFlagIsLowerMinExposureTime = false; bool bFlagIsOverMaxExposureTime = false; @@ -486,16 +507,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bool bIsValueOverflow = false; bool bIsLastValueOverflow = false; - int iExposureTime = 0; + float fExposureTime = 0; float fTempExposureTime = 0; double fLastExposureTime = 0.1; int iRepeatCount = 0; - //int iRes = m_pFSCtrl->SetExposureTime(1000);//need change to load from files - int iRes = 0; + int iRes = SetExposureTime(2000);//need change to load from files if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; return 1; } @@ -509,49 +529,42 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bFlagIsOverTrying = true; break; } - //m_pFSCtrl->SetExposureTime(5000); - GetExposureTime(iExposureTime); -// qDebug() << "Current ExpTime:" << iExposureTime << " Thread ID:" << m_iThreadID; - //m_pFSCtrl->SetExposureTime(2500); - //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; - fTempExposureTime = iExposureTime; + + fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + fTempExposureTime = fExposureTime; iRes = SingleShot(dfTemp); - //iRes = m_pFSCtrl->SingleShot(dfTemp); if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2"; return 2; } HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels); double dSum = 0; - int iCount = m_daDeviceAttr.iPixels / 200; + int iCount = m_daDeviceAttr.iPixels / 100; for (int i = 0; i < iCount; i++) { dSum += dfTemp.lData[i]; } double dTemp = dSum / iCount; -// qDebug() << "Avg " << dTemp << " Thread ID:" << m_iThreadID; - if (dTemp >= iDeviceDepth * 0.99) { bIsValueOverflow = true; if (!bIsLastValueOverflow) { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; } else { - iExposureTime = iExposureTime / 2; + fExposureTime = fExposureTime / 2; } } else if (iDeviceDepth * fMaxScaleFactor >= dTemp && dTemp >= iDeviceDepth * fMinScaleFactor) { -// qDebug() << "trace bFlagIsAutoExposureOK =1 " << iExposureTime << " Thread ID:" << m_iThreadID; bFlagIsAutoExposureOK = 1; } else if (dTemp > iDeviceDepth * fMaxScaleFactor) @@ -559,11 +572,11 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsValueOverflow = true; if (!bIsLastValueOverflow) { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; } else { - iExposureTime = iExposureTime * 3 / 4; + fExposureTime = fExposureTime * 3 / 4; } } else if (dTemp < iDeviceDepth * fMinScaleFactor) @@ -571,15 +584,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsValueOverflow = false; if (bIsLastValueOverflow) { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; } else { double dFactor; dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); - iExposureTime = (float)(iExposureTime / dFactor); + fExposureTime = (float)(fExposureTime / dFactor); } - if (/*fExposureTime > 100 || */iExposureTime < 10) + if (/*fExposureTime > 100 || */fExposureTime < 10) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; @@ -589,41 +602,29 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; - if (iExposureTime > 65000) + if (fExposureTime > 13000) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; - float fPredictedExposureTime = 65000; - iRes = SetExposureTime(65000); + fPredictedExposureTime = 13000; + iRes = SetExposureTime(13000); if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3"; return 3; } - else - { - //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; -// qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID; - } bFlagIsOverMaxExposureTime = true; break; } - iRes = SetExposureTime((int)iExposureTime); + iRes = SetExposureTime((int)fExposureTime); if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4"; return 3; } - else - { - qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; - } } - fPredictedExposureTime = iExposureTime; -// qDebug() << "--------------------------Stop PerformAutoExposure" << " Thread ID:" << m_iThreadID; - //emit SignalAcqFinished(m_iThreadID, 1); - + fPredictedExposureTime = fExposureTime; return 0; } @@ -717,9 +718,8 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) qbSend.resize(3); // qbSend[1] = 0x00; // qbSend[2] = 0x01; - int iTemp=m_iExposureTime; - qbSend[1] = iTemp >> 8;; - qbSend[2] = iTemp & 0xFF; + qbSend[1] = m_iExposureTime >> 8;; + qbSend[2] = m_iExposureTime & 0xFF; int iRes = SendCommand(qbSend); if (iRes != 0) { @@ -762,11 +762,9 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) // dfData.lData[i] = usData[i]; // } } - float fTemp; - GetDeviceTemperature(fTemp); dfData.usExposureTimeInMS = m_iExposureTime; - dfData.fTemperature = fTemp; + return 0; diff --git a/othersoft/calibration_console/Source_Files/atpFiberImager.cpp b/othersoft/calibration_console/Source_Files/atpFiberImager.cpp index dbcdb09..2089145 100644 --- a/othersoft/calibration_console/Source_Files/atpFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/atpFiberImager.cpp @@ -18,13 +18,13 @@ void ATPFiberImager::connectFiberSpectrometer(QString& SN, QString& pixelCount, m_FiberSpectrometer = new ZZ_ATPControl_Serial_Qt(); - m_FiberSpectrometer->Initialize(false, mUcPortNumber, "ocean_optics"); + m_FiberSpectrometer->Initialize(false, mUcPortNumber, "OPTOSKY"); DeviceInfo deviceInfo;// DeviceAttribute deviceAttribute; m_FiberSpectrometer->GetDeviceInfo(deviceInfo); - m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute); + m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute);//£¿£¿£¿£¿£¿ SN = QString::fromStdString(deviceInfo.strSN); pixelCount = QString::number(deviceAttribute.iPixels); @@ -86,6 +86,11 @@ void ATPFiberImager::singleShot(DataFrame &dfData) m_FiberSpectrometer->SingleShot(dfData); } +void ATPFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs) +{ + printf("This is ATPFiberImager.\n"); +} + void ATPFiberImager::recordDark(QString path) { //»ñÈ¡É豸ÐÅÏ¢ diff --git a/othersoft/calibration_console/Source_Files/library.cpp b/othersoft/calibration_console/Source_Files/library.cpp index 45173d6..b9ace14 100644 --- a/othersoft/calibration_console/Source_Files/library.cpp +++ b/othersoft/calibration_console/Source_Files/library.cpp @@ -516,6 +516,77 @@ const char* OceanOptics_lib::get_error_string(int error) return buffer; } +void OceanOptics_lib::test_nonlinearity_coeffs_feature() +{ + using namespace seabreeze; + using namespace seabreeze::api; + using namespace std; + + NonlinearityCoeffsFeatureAdapter tmp(); + + + + + + + + + + + +// int error = 0; +// int number_of_nonlinearity_coeff_features; +// long *nonlinearity_coeff_feature_ids = 0; +// double buffer[10]; +// int i; +// int length; +// +// printf("\n\tTesting nonlinearity coefficient features:\n"); +// +// printf("\t\tGetting number of nonlinearity coefficient features:\n"); +// number_of_nonlinearity_coeff_features = +// sbapi_get_number_of_nonlinearity_coeffs_features(m_iSpectralmeterHandle, &error); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); +// +// if(0 == number_of_nonlinearity_coeff_features) { +// printf("\tNo nonlinearity coefficient capabilities found.\n"); +//// tallyUnsupportedFeatures(unsupportedFeatureCount); +// +// return; +// } +// +// nonlinearity_coeff_feature_ids = +// (long *)calloc(number_of_nonlinearity_coeff_features, sizeof(long)); +// printf("\t\tGetting nonlinearity coefficient feature IDs...\n"); +// number_of_nonlinearity_coeff_features = sbapi_get_nonlinearity_coeffs_features( +// m_iSpectralmeterHandle, &error, nonlinearity_coeff_feature_ids, +// number_of_nonlinearity_coeff_features); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); +// +// for(i = 0; i < number_of_nonlinearity_coeff_features; i++) { +// printf("\t\t%d: Testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, m_iSpectralmeterHandle, nonlinearity_coeff_feature_ids[i]); +// +// printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); +// memset(buffer, (int)0, sizeof(buffer)); +// length = sbapi_nonlinearity_coeffs_get(m_iSpectralmeterHandle, +// nonlinearity_coeff_feature_ids[i], &error, buffer, 10); +// printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); +// +// if(0 == error && length > 0) { +// printf("\t\t\t\tFirst calibration term: %1.2e\n", buffer[0]); +// } +// +// printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, m_iSpectralmeterHandle, nonlinearity_coeff_feature_ids[i]); +// } +// free(nonlinearity_coeff_feature_ids); +// +// printf("\tFinished testing nonlinearity coefficient capabilities.\n"); +} + string OceanOptics_lib::GetDeviceType(int index) { char type[16]; diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index 843c75b..de43c24 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -47,6 +47,9 @@ void logout(QString str); void createDirectory(QString fullPath); bool isFileExist(QString fullFileName); +int getNonlinearityCoeffs2(long deviceID, double * coeffs); +int getNonlinearityCoeffs1(double * coeffs); + int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); @@ -88,16 +91,17 @@ int main(int argc, char *argv[]) switch (query.deviceType) { case OPTOSKY: - m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"ocean_optics"); + m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"OPTOSKY"); break; case OceanOptics: - m_FiberSpectrometer = new OceanOpticsFiberImager(); + m_FiberSpectrometer = new OceanOpticsFiberImager();// break; case UnknownDevice: parser.showHelp(); Q_UNREACHABLE(); } + //Á¬½Ó¹âÆ×ÒÇ QString message; QString SN; @@ -106,66 +110,115 @@ int main(int argc, char *argv[]) logout("
Connectting the fiber spectrometer!"); m_FiberSpectrometer->connectFiberSpectrometer(SN, pixelCount, wavelengthInfo); - //×Ô¶¯ÆØ¹â - logout("
AutoExpose!"); - m_FiberSpectrometer->autoExpose(); - - int iExposureTime; - m_FiberSpectrometer->getExposureTime(iExposureTime); - - message="
ExposureTime: " + QString::number(iExposureTime) + ""; - logout(message); - - //³ÌÐòsleep£ºµÈ´ý¹Ø±Õ¿ìÃÅ - message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; - logout(message); - QThread::sleep(query.sleepTimeinSecond); - - //²É¼¯°µÖ¡ - logout("
Record dark frame!"); - m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); - //³ÌÐòsleep£ºµÈ´ý´ò¿ª¿ìÃÅ - message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; - logout(message); - QThread::sleep(query.sleepTimeinSecond); - - //²É¼¯»ý·ÖÇò¹âÆ× - logout("
Record integrating sphere frame!"); - m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); - - //×¼±¸¶¨±êÎļþÊý¾Ý - logout("
readAndResample_StandardLightFile!"); +// //×Ô¶¯ÆØ¹â +// logout("
AutoExpose!"); +// m_FiberSpectrometer->autoExpose(); +// +// int iExposureTime; +// m_FiberSpectrometer->getExposureTime(iExposureTime); +// +// message="
ExposureTime: " + QString::number(iExposureTime) + ""; +// logout(message); +// +// //³ÌÐòsleep£ºµÈ´ý¹Ø±Õ¿ìÃÅ +// message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; +// logout(message); +// QThread::sleep(query.sleepTimeinSecond); +// +// //²É¼¯°µÖ¡ +// logout("
Record dark frame!"); +// m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); +// +// +// //³ÌÐòsleep£ºµÈ´ý´ò¿ª¿ìÃÅ +// message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; +// logout(message); +// QThread::sleep(query.sleepTimeinSecond); +// +// //²É¼¯»ý·ÖÇò¹âÆ× +// logout("
Record integrating sphere frame!"); +// m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); +// +// //×¼±¸¶¨±êÎļþÊý¾Ý +// logout("
readAndResample_StandardLightFile!"); DeviceAttribute deviceAttribute; DeviceInfo deviceInfo; m_FiberSpectrometer->getDeviceAttribute(deviceAttribute); m_FiberSpectrometer->getDeviceInfo(deviceInfo); +// +// CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); +// m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); +// +// //Éú³É·øÉ䶨±êÎļþ +// if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" +// { +// QDateTime curDateTime = QDateTime::currentDateTime(); +// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); +// QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); +// +// query.calFileOutputName=calFileName; +// } +// logout("
Produce calibration file!"); +// m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); +// +// //¸´ÖÆ·øÉ䶨±êÎļþ +// QDateTime curDateTime = QDateTime::currentDateTime(); +// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); +// QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); +// copyFileToPath(query.calFileOutputName,destName,true); - CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); - m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); - - //Éú³É·øÉ䶨±êÎļþ - if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" + //ÅжÏÒÇÆ÷ÀàÐÍÊÇ·ñΪº£Ñó¹âѧ£¬½«½á¹û´æ´¢ÔÚ±äÁ¿isOceanÖÐ + auto * p_C = dynamic_cast(m_FiberSpectrometer); + bool isOcean = false;// + if (p_C != nullptr) { - QDateTime curDateTime = QDateTime::currentDateTime(); - QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); - QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); +// cout << "Match!!" << endl; + isOcean=true; - query.calFileOutputName=calFileName; +// coeffsFrame tmp; +// m_FiberSpectrometer->getNonlinearityCoeffs(tmp); + } + else + { + cout << "not OceanOpticsFiberImager!!" << endl; } - logout("
Produce calibration file!"); - m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); - - //¸´ÖÆ·øÉ䶨±êÎļþ - QDateTime curDateTime = QDateTime::currentDateTime(); - QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); - QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); - copyFileToPath(query.calFileOutputName,destName,true); //¶Ï¿ª¹âÆ×ÒÇ m_FiberSpectrometer->disconnectFiberSpectrometer(); //return a.exec(); + + //ʹÓÃsbapi¶ÁÈ¡º£Ñó¹âѧÒÇÆ÷µÄ·ÇÏßÐÔ¶¨±ê²ÎÊý + if (isOcean) + { + double * coeffs = new double[100]; + int numberOfCoeffs = getNonlinearityCoeffs1(coeffs); + + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString nonlinearityCoeffsName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".nonLinear"); + +// for (int i = 0; i < numberOfCoeffs; ++i) +// { +// printf("\n"); +// +// printf("nonlinearityCoeffs(µÚ%d¸ö): %1.2e\n",i , coeffs[i]); +// +// printf("\n"); +// } + + std::ofstream outfile(nonlinearityCoeffsName.toStdString().c_str()); + + for (int i = 0; i < numberOfCoeffs; i++) + { + outfile << coeffs[i] << std::endl; + } + outfile.close(); + + free(coeffs); + } + } CommandLineParseResult parseCommandLine2(QCommandLineParser &parser, TcQuery *query, QString *errorMessage) @@ -485,3 +538,149 @@ bool isFileExist(QString fullFileName) } return false; } + +int getNonlinearityCoeffs1(double * coeffs) +{ + int number_of_devices; + long *device_ids; + int i; + int test_index; + int flag; + int error = 0; + char nameBuffer[80]; + + + /* Give the driver a chance to initialize itself */ + sbapi_initialize(); + +// printf("Probing for devices...\n"); fflush(stdout); + sbapi_probe_devices(); + +//#define RS232_TEST +#ifdef RS232_TEST + printf("Adding an STS at 9600 baud...\n"); + /* Uncomment for Linux */ + //sbapi_add_RS232_device_location("STS", "/dev/ttyS0", 9600); + //sbapi_add_RS232_device_location("STS", "/dev/ttyUSB0", 9600); + + /* Uncomment for Windows */ + //sbapi_add_RS232_device_location("STS", "COM1", 9600); + + /* Uncomment for e.g. USB-RS232 adapter under OSX */ + //sbapi_add_RS232_device_location("STS", "/dev/tty.KeySerial1", 9600); + //sbapi_add_RS232_device_location("STS", "/dev/tty.usbserial", 9600); +#endif + + /* This shows how to add network devices (note that most use TCP/IP) */ + //sbapi_add_TCPIPv4_device_location("Jaz", "192.168.1.150", 7654); + //sbapi_add_TCPIPv4_device_location("Blaze", "192.168.1.151", 57357); + +// printf("Getting device count...\n"); fflush(stdout); + number_of_devices = sbapi_get_number_of_device_ids(); + +// printf("Device count is %d\n", number_of_devices); + if(0 == number_of_devices) { + return 0; + } + +// printf("Getting device IDs...\n"); + device_ids = (long *)calloc(number_of_devices, sizeof(long)); + number_of_devices = sbapi_get_device_ids(device_ids, number_of_devices); +// printf("Got %d device ID%s.\n", number_of_devices, number_of_devices == 1 ? "" : "s"); + + int number; + for(i = 0; i < number_of_devices; i++) { +// printf("%d: Device 0x%02lX:\n", i, device_ids[i]); +// printf("\tGetting device type...\n"); + flag = sbapi_get_device_type(device_ids[i], &error, nameBuffer, 79); +// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error)); + if(flag > 0) { +// printf("\tDevice type: [%s]\n", nameBuffer); + } + + /* Open the device */ +// printf("\tAttempting to open:\n"); + flag = sbapi_open_device(device_ids[i], &error); +// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error)); + + // jump to the next iteration if there was a problem + if(flag != 0) { + continue; + } + + number = getNonlinearityCoeffs2(device_ids[i],coeffs); + + /* Close the device */ +// printf("\tAttempting to close:\n"); + sbapi_close_device(device_ids[i], &error); +// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error)); + } + free(device_ids); + +// printf("Finished testing.\n"); + + /* Clean up memory allocated by the driver */ + sbapi_shutdown(); + + return number; +} + +//·µ»ØÖµÊÇ·ÇÏßÐÔУÕýϵÊýµÄ¸öÊý +int getNonlinearityCoeffs2(long deviceID, double * coeffs) +{ + int error = 0; + int number_of_nonlinearity_coeff_features; + long *nonlinearity_coeff_feature_ids = 0; + double buffer[10]; + int i; + int length = 0; + +// printf("\n\tTesting nonlinearity coefficient features:\n"); + +// printf("\t\tGetting number of nonlinearity coefficient features:\n"); + number_of_nonlinearity_coeff_features = + sbapi_get_number_of_nonlinearity_coeffs_features(deviceID, &error); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); + + if(0 == number_of_nonlinearity_coeff_features) { + printf("\tNo nonlinearity coefficient capabilities found.\n"); + + return 0; + } + + nonlinearity_coeff_feature_ids = + (long *)calloc(number_of_nonlinearity_coeff_features, sizeof(long)); +// printf("\t\tGetting nonlinearity coefficient feature IDs...\n"); + number_of_nonlinearity_coeff_features = sbapi_get_nonlinearity_coeffs_features( + deviceID, &error, nonlinearity_coeff_feature_ids, + number_of_nonlinearity_coeff_features); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); + + for(i = 0; i < number_of_nonlinearity_coeff_features; i++) + { +// printf("\t\t%d: Testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, deviceID, nonlinearity_coeff_feature_ids[i]); + +// printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); + memset(coeffs, (int)0, 20);//---------------------------------------------------------------------------- + length = sbapi_nonlinearity_coeffs_get(deviceID, + nonlinearity_coeff_feature_ids[i], &error, coeffs, 20); +// printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); + + if(0 == error && length > 0) { +// printf("\t\t\t\tFirst calibration term: %1.2e\n", coeffs[0]); + } + +// printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, deviceID, nonlinearity_coeff_feature_ids[i]); + } + free(nonlinearity_coeff_feature_ids); + + + +// printf("\tFinished testing nonlinearity coefficient capabilities.\n"); + + return length; +} \ No newline at end of file diff --git a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp index 578b519..53b56ba 100644 --- a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp @@ -83,6 +83,13 @@ void OceanOpticsFiberImager::singleShot(DataFrame &dfData) m_FiberSpectrometer->SingleShot(dfData); } +void OceanOpticsFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs) +{ + printf("This is OceanOpticsFiberImager.\n"); + + m_FiberSpectrometer->test_nonlinearity_coeffs_feature(); +} + void OceanOpticsFiberImager::recordDark(QString path) { //»ñÈ¡É豸ÐÅÏ¢ From d929c7f0e45c968e4d895112a76a69874fda38f7 Mon Sep 17 00:00:00 2001 From: tangchao Date: Thu, 21 Apr 2022 14:06:48 +0800 Subject: [PATCH 29/53] =?UTF-8?q?=EF=BC=881=EF=BC=89=E5=B0=86atp=E5=85=89?= =?UTF-8?q?=E8=B0=B1=E4=BB=AA=E7=9A=84=E6=8E=A7=E5=88=B6=E7=B1=BB=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=88=B0=E5=8D=93=E5=93=A5=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E8=BF=9E=E6=8E=A5atp=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20=EF=BC=882=EF=BC=89=E5=B0=86?= =?UTF-8?q?=E8=AF=BB=E5=8F=96OceanOptics=E7=9A=84=E9=9D=9E=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E6=AD=A3=E6=96=87=E4=BB=B6=20=20=E9=9B=86?= =?UTF-8?q?=E6=88=90=E5=88=B0=E5=AE=9A=E6=A0=87=E7=A8=8B=E5=BA=8F=E4=B8=AD?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calibration_console/Source_Files/main.cpp | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index de43c24..f772b67 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -112,62 +112,62 @@ int main(int argc, char *argv[]) -// //×Ô¶¯ÆØ¹â -// logout("
AutoExpose!"); -// m_FiberSpectrometer->autoExpose(); -// -// int iExposureTime; -// m_FiberSpectrometer->getExposureTime(iExposureTime); -// -// message="
ExposureTime: " + QString::number(iExposureTime) + ""; -// logout(message); -// -// //³ÌÐòsleep£ºµÈ´ý¹Ø±Õ¿ìÃÅ -// message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; -// logout(message); -// QThread::sleep(query.sleepTimeinSecond); -// -// //²É¼¯°µÖ¡ -// logout("
Record dark frame!"); -// m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); -// -// -// //³ÌÐòsleep£ºµÈ´ý´ò¿ª¿ìÃÅ -// message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; -// logout(message); -// QThread::sleep(query.sleepTimeinSecond); -// -// //²É¼¯»ý·ÖÇò¹âÆ× -// logout("
Record integrating sphere frame!"); -// m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); -// -// //×¼±¸¶¨±êÎļþÊý¾Ý -// logout("
readAndResample_StandardLightFile!"); + //×Ô¶¯ÆØ¹â + logout("
AutoExpose!"); + m_FiberSpectrometer->autoExpose(); + + int iExposureTime; + m_FiberSpectrometer->getExposureTime(iExposureTime); + + message="
ExposureTime: " + QString::number(iExposureTime) + ""; + logout(message); + + //³ÌÐòsleep£ºµÈ´ý¹Ø±Õ¿ìÃÅ + message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; + logout(message); + QThread::sleep(query.sleepTimeinSecond); + + //²É¼¯°µÖ¡ + logout("
Record dark frame!"); + m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); + + + //³ÌÐòsleep£ºµÈ´ý´ò¿ª¿ìÃÅ + message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; + logout(message); + QThread::sleep(query.sleepTimeinSecond); + + //²É¼¯»ý·ÖÇò¹âÆ× + logout("
Record integrating sphere frame!"); + m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); + + //×¼±¸¶¨±êÎļþÊý¾Ý + logout("
readAndResample_StandardLightFile!"); DeviceAttribute deviceAttribute; DeviceInfo deviceInfo; m_FiberSpectrometer->getDeviceAttribute(deviceAttribute); m_FiberSpectrometer->getDeviceInfo(deviceInfo); -// -// CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); -// m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); -// -// //Éú³É·øÉ䶨±êÎļþ -// if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" -// { -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); -// -// query.calFileOutputName=calFileName; -// } -// logout("
Produce calibration file!"); -// m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); -// -// //¸´ÖÆ·øÉ䶨±êÎļþ -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); -// copyFileToPath(query.calFileOutputName,destName,true); + + CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); + m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); + + //Éú³É·øÉ䶨±êÎļþ + if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" + { + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); + + query.calFileOutputName=calFileName; + } + logout("
Produce calibration file!"); + m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); + + //¸´ÖÆ·øÉ䶨±êÎļþ + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); + copyFileToPath(query.calFileOutputName,destName,true); //ÅжÏÒÇÆ÷ÀàÐÍÊÇ·ñΪº£Ñó¹âѧ£¬½«½á¹û´æ´¢ÔÚ±äÁ¿isOceanÖÐ auto * p_C = dynamic_cast(m_FiberSpectrometer); @@ -623,7 +623,7 @@ int getNonlinearityCoeffs1(double * coeffs) sbapi_shutdown(); return number; -} +}// //·µ»ØÖµÊÇ·ÇÏßÐÔУÕýϵÊýµÄ¸öÊý int getNonlinearityCoeffs2(long deviceID, double * coeffs) From d466c1a53cd67b928e7b155bd3d8f96e9b52801e Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 29 Apr 2022 15:37:54 +0800 Subject: [PATCH 30/53] =?UTF-8?q?=E9=87=8D=E5=A4=A7=E6=9B=B4=E6=96=B0=201.?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=AF=B9=E5=8F=8C=E9=80=9A=E9=81=93?= =?UTF-8?q?=E5=85=89=E9=97=B8=E7=B3=BB=E7=BB=9F=E7=9A=84=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E3=80=82=202.=E9=92=88=E5=AF=B9QEPro=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E7=A1=AC=E4=BB=B6=E6=B7=BB=E5=8A=A0=E4=BA=86=E9=9D=9E=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E7=9F=AB=E6=AD=A3=203.=E8=BF=9B=E8=A1=8C=E4=BA=86?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E7=9A=84=E5=AE=9E=E9=99=85=E9=87=87=E9=9B=86?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=8C=E9=80=9A=E8=BF=87=E3=80=82=204.?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=9F=E4=B8=80=E4=BA=86ATP=E5=9F=BA?= =?UTF-8?q?=E7=B1=BB=E5=86=85=E7=BD=AE=E8=87=AA=E5=8A=A8=E6=9B=9D=E5=85=89?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeSettings.json | 5 +- config/config.json | 2 +- main.cpp | 33 +++- othersoft/shuttercali/source/FS/ZZ_Types.h | 2 +- source/CaptureThread/AbstractFSController.cpp | 87 ++++++++- source/CaptureThread/AbstractFSController.h | 6 + source/CaptureThread/MainDataGrabber.cpp | 175 +++++++++++++++--- source/CaptureThread/MainDataGrabber.h | 3 + source/FS/ATPControl_Serial_QT.cpp | 14 +- source/FS/ZZ_Types.h | 12 +- source/Settings/SystemConfigger.cpp | 2 +- source/Uploader/DataFileTransfer.cpp | 9 +- source/Uploader/MainDataUploader.cpp | 2 +- source/Uploader/RadianceConverter.cpp | 11 +- source/Uploader/RadianceConverter.h | 1 + 15 files changed, 305 insertions(+), 59 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index f8ea439..398f788 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -10,7 +10,7 @@ "ctestCommandArgs": "", "inheritEnvironments": [ "linux_arm" ], "intelliSenseMode": "linux-gcc-x64", - "remoteMachineName": "948173717;172.16.0.232 (username=root, port=22, authentication=Password)", + "remoteMachineName": "243120617;172.16.0.232 (username=root, port=22, authentication=Password)", "remoteCMakeListsRoot": "/home/pi/SIF0/src", "remoteBuildRoot": "/home/pi/SIF0/out/build_d/${name}", "remoteInstallRoot": "/home/pi/SIF0/out/install/${name}", @@ -28,8 +28,7 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] + "inheritEnvironments": [ "msvc_x64_x64" ] } ] } \ No newline at end of file diff --git a/config/config.json b/config/config.json index 55592fb..3b5aeef 100644 --- a/config/config.json +++ b/config/config.json @@ -1 +1 @@ -{"BeginTime":"8:00","IntervalTime":"10","EndTime":"18:00","Location":"beijing","GPS_Longtitude":"117","GPS_Latitude":"118","GPS_Altitude":"50","GPS_North":"on","InstallationTime":"2021-11-18","ISIFCalibrationTime":"2021-11-26","IS1CalibrationTime":"2021-11-19","NameOfMaintenanceStaff":"renlixin","PhoneNumberOfMaintenanceStaff":"110110110","DownloadUserID":"newuser","DownlaodAddress":"http:\/\/www.iris-rs.cn","SIFUpCalFile":"dat1","SIFDownCalFile1":"dat2","SIFDownCalFile2":"dat2","SIFDownCalFile3":"dat3","IS1UpCalFile":"dat1","IS1DownCalFile1":"sdaf","IS1DownCalFile2":"dat2","IS1DownCalFile3":"asdf","HTTPServer":"192.168.2.1"} \ No newline at end of file +{"BeginTime":"08:00","IntervalTime":"02","EndTime":"23:00","Dev_SN":"0000001","Location":"beijing","GPS_North":"on","GPS_Longtitude":"117","GPS_Latitude":"41","GPS_Altitude":"100","InstallationTime":"2021-12-24","ISIFCalibrationTime":"2021-12-24","IS1CalibrationTime":"2021-12-24","NameOfMaintenanceStaff":"renlixin","PhoneNumberOfMaintenanceStaff":"1110010010","DownloadUserID":"xin","DownlaodAddress":"http:\/\/www.iris-rs.cn","HTTPServer":"http:\/\/82.156.1.111","OSIFAlpha_CaliFileMainName":""} \ No newline at end of file diff --git a/main.cpp b/main.cpp index f02ae9f..629df79 100644 --- a/main.cpp +++ b/main.cpp @@ -19,8 +19,8 @@ int main(int argc, char *argv[]) QCoreApplication a(argc, argv); - system("gpio mode 1 output");//������ų�ʼ�� - qDebug() << "gpio mode 1 output......" << endl; + //system("gpio mode 1 output");//������ų�ʼ�� + //qDebug() << "gpio mode 1 output......" << endl; ////////////////////////////////////////////////////////////////////////// //// GY39Controller m_ctrlHumitureDetector; @@ -46,12 +46,33 @@ int main(int argc, char *argv[]) HumitureDeviceInfo m_struHumitureDI; //////////////////////////////////////////////////////////////////////////logger ///create main system logger - QT_LOG::ZZ_InitLogger("/home/data/Log/"); + //QT_LOG::ZZ_InitLogger("/home/data/Log/"); //////////////////////////////////////////////////////////////////////////config ///turn on power supply - system("gpio mode 1 out"); + + //////add support to dual channel + system("gpio mode 1 out"); + system("gpio mode 4 out"); + system("gpio mode 5 out"); + qDebug() << "gpio 1;4;5; ready" << endl; + system("gpio write 1 1");//�豸�ϵ� qDebug() << "gpio write 1 1......" << endl; + +// QString qstrCMD_A, qstrCMD_B, qstrCMD_Temp; +// qstrCMD_Temp = QString::fromStdString("4"); +// qDebug() << qstrCMD_Temp << endl; +// qstrCMD_A = "gpio write " + qstrCMD_Temp + " 0"; +// +// qstrCMD_Temp = QString::fromStdString("5"); +// qDebug() << qstrCMD_Temp << endl; +// qstrCMD_B = "gpio write " + qstrCMD_Temp + " 0"; +// +// qDebug() << qstrCMD_A << endl; +// qDebug() << qstrCMD_B << endl; +// system(qstrCMD_A.toLatin1()); +// system(qstrCMD_B.toLatin1()); + QThread::msleep(5000); bRes = m_scConfiggerLoader.Initialize(); if (bRes) @@ -66,10 +87,10 @@ int main(int argc, char *argv[]) m_dfpSaver.SetManmadeEnviromentalContext(m_struMEC); m_mduUploader.SetContext(m_struEC, m_struMEC); - m_mduUploader.Initialize(); + //m_mduUploader.Initialize(); //m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //////////////////////////////////////////////////////////////////////////prepare - m_sTimer.Preheating(); + //m_sTimer.Preheating(); //m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); m_struEC.qstrCaseTemperature= QString("%1").arg(m_fChassisTemp); diff --git a/othersoft/shuttercali/source/FS/ZZ_Types.h b/othersoft/shuttercali/source/FS/ZZ_Types.h index 7ad1c54..c5b2e15 100644 --- a/othersoft/shuttercali/source/FS/ZZ_Types.h +++ b/othersoft/shuttercali/source/FS/ZZ_Types.h @@ -179,7 +179,7 @@ namespace ZZ_MISCDEF { ZZ_U8 ucPort; ZZ_U8 ucProtocolType; - ZZ_U8 ucCmdID; + ZZ_U16 usCmdID; }LSContext; typedef struct tagAcquisitionTimeSettings diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index 78453f8..4921351 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -1,12 +1,18 @@ #include "AbstractFSController.h" #include "ZZ_Math_HDRONLY.h" +#include CAbstractFSController::CAbstractFSController(QObject* parent /*= nullptr*/) { iFlagInit = 0; m_pFSCtrl = NULL; m_iThreadID = -1; + m_vecDataFrameDark.clear(); m_vecDataFrameSignal.clear(); + + m_qstrCalFilePath = "/home/data/Cal"; + + m_vecNonLinearCalP.clear(); } CAbstractFSController::~CAbstractFSController() @@ -30,6 +36,9 @@ int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo) int CAbstractFSController::InitializeFSControl() { using namespace ZZ_MISCDEF::IRIS; + + int iRes = 0; + if (m_iThreadID == -1/*|| m_iDeviceType == -1*/) { qDebug() << "Params Err. Call SetRunParas first"; @@ -44,7 +53,12 @@ int CAbstractFSController::InitializeFSControl() qDebug() << "OSIFAlpha Not Opened"; return 2; } - + iRes = LoadQEProLinearCalibrationFile(); + if (iRes != 0) + { + qDebug() << "LoadQEProLinearCalibrationFile Failed" << iRes; + //return 5; + } break; case DeviceModel::OSIFBeta: m_pFSCtrl = new OceanOptics_lib; @@ -53,6 +67,12 @@ int CAbstractFSController::InitializeFSControl() qDebug() << "OSIFBeta Not Opened"; return 2; } + iRes = LoadQEProLinearCalibrationFile(); + if (iRes != 0) + { + qDebug() << "LoadQEProLinearCalibrationFile Failed" << iRes; + //return 5; + } break; case DeviceModel::ISIF: m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; @@ -85,7 +105,7 @@ int CAbstractFSController::InitializeFSControl() break; } - int iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr); + iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr); if (iRes != 0) { qDebug() << "GetDeviceAttribute Failed" << iRes; @@ -364,6 +384,28 @@ DataFrame CAbstractFSController::TakeOneFrame() qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID; } + if (m_fsInfo.ucDeviceModel == DeviceModel::OSIFAlpha|| m_fsInfo.ucDeviceModel == DeviceModel::OSIFBeta) + { + if (m_vecNonLinearCalP.size() != 8) + { + qDebug() << "Err.Non Linear calibration parameters not fit.Skip..." << " Thread ID:" << m_iThreadID; + return dfTemp; + } + for (int i=0;iSingleShot(dfTemp); @@ -380,18 +422,55 @@ int CAbstractFSController::SaveDataFile() return 0; } +int CAbstractFSController::LoadQEProLinearCalibrationFile() +{ + m_vecNonLinearCalP.clear(); + + QDir qdirPath(m_qstrCalFilePath); + if (!qdirPath.exists()) + { + qDebug() << "Non-Linear Calibration Folder not exist" << " Thread ID:" << m_iThreadID; + return 1; + } + QString qstrFilePath; + + qstrFilePath = m_qstrCalFilePath + QString("/")+QString::fromStdString(m_fsInfo.strSN)+ QString(".NLC"); + + QFile qfCalFile(qstrFilePath); + bool bRes = qfCalFile.open(QFile::ReadOnly); + if (!bRes) + { + qDebug() << "Non-Linear Calibration File open Failed" << " Thread ID:" << m_iThreadID; + return 2; + } + + while (!qfCalFile.atEnd()) + { + QByteArray qbData = qfCalFile.readLine(); + qbData.remove(qbData.size()-1, 1); + m_vecNonLinearCalP.push_back(qbData.toDouble()); + //qDebug() << qbData; + } + qfCalFile.close(); + + qDebug() <<"Non-Linear Calibration Params:"<< m_vecNonLinearCalP.size() << " Thread ID:" << m_iThreadID; + + + + return 0; +} + int CAbstractFSController::StartAcquisitionSignal() { // qDebug() << "Starting acq Signal" << " Thread ID:" << m_iThreadID; + // DataFrame struDF; // int iii; // m_pFSCtrl->SetExposureTime(10000000); // m_pFSCtrl->GetExposureTime(iii); // m_pFSCtrl->SingleShot(struDF); - - PerformAutoExposure(); TakeSignalFrame(); diff --git a/source/CaptureThread/AbstractFSController.h b/source/CaptureThread/AbstractFSController.h index 0171179..eab21b6 100644 --- a/source/CaptureThread/AbstractFSController.h +++ b/source/CaptureThread/AbstractFSController.h @@ -43,6 +43,10 @@ private: std::vector m_vecDataFrameDark, m_vecDataFrameSignal; DeviceAttribute m_daDeviceAttr; + + //QE NLC + QString m_qstrCalFilePath; + std::vector m_vecNonLinearCalP; private: int PerformAutoExposure(); int TakeDarkFrame(); @@ -50,6 +54,8 @@ private: DataFrame TakeOneFrame(); int SaveDataFile(); + //QE NLC + int LoadQEProLinearCalibrationFile(); public slots: virtual int StartAcquisitionSignal(); virtual int StartAcquisitionDark(); diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index 8b3f7a9..a65f71c 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -122,14 +122,45 @@ int CMainDataGrabber::InitLS() //SetupMsgPipelines_RunTime(); //StartWorkers(); + if (m_struLinearShutterContext.strInterface=="GPIO") + { + qDebug() << "Debugging GPIO Init Started"; - PortInfo piTemp; - piTemp.qstrFullPortName = QString::fromStdString(m_struLinearShutterContext.strInterface); - m_ctrlLS.ILMES_InitializeComm(piTemp, m_struLinearShutterContext.ucProtocolType, m_struLinearShutterContext.ucCmdID); - ControllerParams cpTemp; - bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp); + m_vecDSS.clear(); - m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition); + if (m_struLinearShutterContext.ucProtocolType == 100) + { + DSStatus DSSOne; + + QString qstrChannel = QString::number(m_struLinearShutterContext.usCmdID, 10); + if (qstrChannel.size() != 2) + { + qDebug() << "Dual Shutter Channel Parse Err."; + return -1; + } + else + { + DSSOne.strChannelA = qstrChannel.toStdString()[0]; + DSSOne.strChannelB = qstrChannel.toStdString()[1]; + DSSOne.iChannelA = 1; + DSSOne.iChannelB = 1; + } + + m_vecDSS.push_back(DSSOne); + + + } + } + else + { + PortInfo piTemp; + piTemp.qstrFullPortName = QString::fromStdString(m_struLinearShutterContext.strInterface); + m_ctrlLS.ILMES_InitializeComm(piTemp, m_struLinearShutterContext.ucProtocolType, m_struLinearShutterContext.usCmdID); + ControllerParams cpTemp; + bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp); + m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition); + } + //m_ctrlLS.ILMES_MoveToPos(2); return 0; @@ -428,6 +459,9 @@ int CMainDataGrabber::GrabOnceFinished() int CMainDataGrabber::OnTimeCounter() { + bool bRes; + QString qstrCMD_A,qstrCMD_B,qstrCMD_Temp; + if (m_iFlagIsCapturing) { qDebug() << "Fatal Warning.Last capture not finished.New acquisition will not start"; @@ -445,30 +479,84 @@ int CMainDataGrabber::GrabOnceFinished() } - ////hold current - bool bRes = m_ctrlLS.SetHoldCurrent(0.4f); - if (!bRes) + + if (m_struLinearShutterContext.strInterface == "GPIO") { - qDebug() << "SetHoldCurrent 0.4 Failed"; } - Delay_MSec(1000); - //// + else + { + ////hold current + bRes = m_ctrlLS.SetHoldCurrent(0.4f); + if (!bRes) + { + qDebug() << "SetHoldCurrent 0.4 Failed"; + } + Delay_MSec(1000); + //// + } + for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++) { ResetThreadStatus(); - ////move to - qDebug()<<"Start ILMES_MoveToPos:"<> vecData; for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) diff --git a/source/CaptureThread/MainDataGrabber.h b/source/CaptureThread/MainDataGrabber.h index 0fd2df4..856f7be 100644 --- a/source/CaptureThread/MainDataGrabber.h +++ b/source/CaptureThread/MainDataGrabber.h @@ -43,6 +43,9 @@ private: AcqPosSettings m_struAcqPosSetting; AcqTimeSettings m_struAcqTime; RunTimeGrabberParams m_struRTGP; + + //20220422 added for dual-shutter system + vector m_vecDSS; //QTimer *m_GrabTimer; private: diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index ce9bb17..12bb950 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -512,7 +512,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM double fLastExposureTime = 0.1; int iRepeatCount = 0; - int iRes = SetExposureTime(2000);//need change to load from files + int iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS);//need change to load from files if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; @@ -527,10 +527,14 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM { bFlagIsAutoExposureFailed = true; bFlagIsOverTrying = true; + qDebug() << "over 30 Times" << endl; break; } - fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + int fTemp; + GetExposureTime(fTemp); + fExposureTime = fTemp; fTempExposureTime = fExposureTime; iRes = SingleShot(dfTemp); @@ -592,11 +596,13 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); fExposureTime = (float)(fExposureTime / dFactor); } - if (/*fExposureTime > 100 || */fExposureTime < 10) + if (fExposureTime < m_daDeviceAttr.iMinIntegrationTimeInMS) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; bFlagIsLowerMinExposureTime = true; + qDebug() << "lower than minimum" << endl; + } } bIsLastValueOverflow = bIsValueOverflow; @@ -669,7 +675,7 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:1"; - return 1; + //return 1; } return 0; diff --git a/source/FS/ZZ_Types.h b/source/FS/ZZ_Types.h index eba700c..9e4ef1f 100644 --- a/source/FS/ZZ_Types.h +++ b/source/FS/ZZ_Types.h @@ -200,11 +200,21 @@ namespace ZZ_MISCDEF float fWavelength[MAX_DEVICENUMBER_FS][4096]; }FSContext; + + typedef struct tagDualShutterStatus + { + std::string strChannelA; + std::string strChannelB; + int iChannelA = 0; + int iChannelB = 0; + }DSStatus; + + typedef struct tagLinearShutterContext { std::string strInterface; ZZ_U8 ucProtocolType; - ZZ_U8 ucCmdID; + ZZ_U16 usCmdID; }LSContext; typedef struct tagAcquisitionTimeSettings diff --git a/source/Settings/SystemConfigger.cpp b/source/Settings/SystemConfigger.cpp index f99c994..a40d3af 100644 --- a/source/Settings/SystemConfigger.cpp +++ b/source/Settings/SystemConfigger.cpp @@ -78,7 +78,7 @@ } - m_struLSContext.ucCmdID = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/DCID")).toInt(); + m_struLSContext.usCmdID = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/DCID")).toInt(); m_struLSContext.ucProtocolType = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/Type")).toInt(); m_struLSContext.strInterface = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/Port")).toString().toStdString(); diff --git a/source/Uploader/DataFileTransfer.cpp b/source/Uploader/DataFileTransfer.cpp index 5998ab5..a279c1a 100644 --- a/source/Uploader/DataFileTransfer.cpp +++ b/source/Uploader/DataFileTransfer.cpp @@ -101,7 +101,7 @@ int ZZ_HttpTransfer::SendInfo() m_iFlagIsReplied = false; for (int i = 0; i < m_struGrabberRTParams.fscParams.ucDeviceNumber; i++) { - qstrSend = "Location:" + QString("%1").arg(m_struEC.qstrLocation) + "####"; + qstrSend = "Location:" + QString("%1").arg(m_struEC.qstrLocation) + "####"; qstrSend += "DEV_SN:" + QString("%1").arg(m_struEC.qstrDEV_SN) + "####"; qstrSend += "FS_SN:" + QString::fromLocal8Bit(m_struGrabberRTParams.fscParams.strSN[i].c_str()) + "####"; qstrSend += "GPS_Longtitude:" + QString("%1").arg(m_struEC.qstrGPS_Longtitude) + "####"; @@ -114,6 +114,9 @@ int ZZ_HttpTransfer::SendInfo() qstrSend += "Bands:" + QString("%1").arg(m_struGrabberRTParams.fscParams.usPixels[i]) + "####"; qstrSend += "Positions:" + QString("%1").arg(m_struGrabberRTParams.apsParams.iTotalPosition-1) + "####"; qstrSend += "WaveLength:"; + + qDebug() << m_struEC.qstrDEV_SN; + for (int j=0;j< m_struGrabberRTParams.fscParams.usPixels[i];j++) { qstrWaveLength = QString("%1").arg(m_struGrabberRTParams.fscParams.fWavelength[i][j]); @@ -253,8 +256,8 @@ void ZZ_HttpTransfer::Delay_MSec(ZZ_U16 usMS) int ZZ_HttpTransfer::SlotReplyFinished(QNetworkReply* qnReply) { - QString qstrURL = qnReply->url().toString(); - QByteArray qbData = qnReply->readAll(); + QString qstrURL = qnReply->url().toString(); + QByteArray qbData = qnReply->readAll(); if (qnReply->error()== QNetworkReply::NoError) { qDebug() << "Reply NoError:" << "Server:" << qstrURL; diff --git a/source/Uploader/MainDataUploader.cpp b/source/Uploader/MainDataUploader.cpp index 27509fd..a1a20ba 100644 --- a/source/Uploader/MainDataUploader.cpp +++ b/source/Uploader/MainDataUploader.cpp @@ -52,7 +52,6 @@ void CMainDataUploader::Calibration() { int iScanPoints = m_struGrabberRTParams.apsParams.iTotalPosition - 1; int iDevices = m_struGrabberRTParams.fscParams.ucDeviceNumber; - m_vecCalcedData.clear(); m_vecCalcedData.resize(iDevices); for (int i=0;i< iDevices;i++) @@ -72,6 +71,7 @@ void CMainDataUploader::Calibration() { m_vecCalcedData[j][i].fData[k] = (float)(m_vecData[j][i].lData[k]* m_vecCalData[j][i].dCal_Gain[k]* m_vecCalData[j][i].uiExposureTimeInMS/m_vecData[j][i].usExposureTimeInMS); } + } } } diff --git a/source/Uploader/RadianceConverter.cpp b/source/Uploader/RadianceConverter.cpp index 5468819..e500375 100644 --- a/source/Uploader/RadianceConverter.cpp +++ b/source/Uploader/RadianceConverter.cpp @@ -58,11 +58,6 @@ int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams qfCalFile.read((char*)OneFile.dCal_Gain, sizeof(double)*OneFile.iPixels); qfCalFile.read((char*)OneFile.dCal_Offset, sizeof(double)*OneFile.iPixels); - /////check attribute -// if () -// { -// } - vecOneDev.push_back(OneFile); } struAllCalFrame.push_back(vecOneDev); @@ -72,3 +67,9 @@ int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams return 0; } + +// int RadConverter::LoadQEProLinearParams(RunTimeGrabberParams struGrabberRTParams, vector>& vecQEPLP) +// { +// int iQEPDevices = 0; +// return 0; +// } diff --git a/source/Uploader/RadianceConverter.h b/source/Uploader/RadianceConverter.h index 9ea9f02..3574b4e 100644 --- a/source/Uploader/RadianceConverter.h +++ b/source/Uploader/RadianceConverter.h @@ -15,6 +15,7 @@ public: public: public: int LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams, vector> &struAllCalFrame); + //int LoadQEProLinearParams(RunTimeGrabberParams struGrabberRTParams, vector>& vecQEPLP); private: QString m_qstrCalFilePath; private: From 5947968c1bbdd01104c31032e9f2ad606dfb212e Mon Sep 17 00:00:00 2001 From: tangchao Date: Fri, 29 Apr 2022 17:10:40 +0800 Subject: [PATCH 31/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=20=EF=BC=881?= =?UTF-8?q?=EF=BC=89=E5=9F=BA=E4=BA=8E=E9=9D=9E=E7=BA=BF=E6=80=A7=E6=A0=A1?= =?UTF-8?q?=E6=AD=A3=E7=9A=84=E6=95=B0=E6=8D=AE=20=20=E7=94=9F=E6=88=90=20?= =?UTF-8?q?=20=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=EF=BC=9B=20=EF=BC=882?= =?UTF-8?q?=EF=BC=89=E5=B0=86=E9=9D=9E=E7=BA=BF=E6=80=A7=E5=AE=9A=E6=A0=87?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=86=99=E5=88=B0=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E7=BB=99=E5=8D=93=E5=93=A5=E7=94=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header_Files/oceanOpticsFiberImager.h | 10 ++- .../Source_Files/ATPControl_Serial_QT.cpp | 23 ++++-- .../Source_Files/atpFiberImager.cpp | 2 +- .../calibration_console/Source_Files/main.cpp | 73 +++++++++---------- .../Source_Files/oceanOpticsFiberImager.cpp | 42 ++++++++--- 5 files changed, 94 insertions(+), 56 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h index 135ce4a..786e0f5 100644 --- a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h +++ b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h @@ -14,7 +14,7 @@ class OceanOpticsFiberImager :public QObject,public FiberSpectrometerOperationBa Q_OBJECT public: - OceanOpticsFiberImager(); + OceanOpticsFiberImager(double * nonlinearityCoeffs, int numberOfCoeffs); ~OceanOpticsFiberImager(); OceanOptics_lib * m_FiberSpectrometer; @@ -35,11 +35,17 @@ public: ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); + //±£´æ»ñÈ¡µÄÒÇÆ÷ÐÅÏ¢£¬²»ÓÃÿ´Î¶¼»ñÈ¡£¬ÕâÑù³ÌÐò¸ü¿ì + DeviceInfo m_deviceInfo; + DeviceAttribute m_deviceAttribute; + // DataFrame m_IntegratingSphereData; // DataFrame m_DarkData; protected: private: - + double * m_nonlinearityCoeffs; + int m_iNumberOfNonlinearityCoeffs; + // ZZ_U32 m_MaxValueOfFiberSpectrometer; public slots: diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 8fb5e8d..9fbda54 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -512,7 +512,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM double fLastExposureTime = 0.1; int iRepeatCount = 0; - int iRes = SetExposureTime(2000);//need change to load from files + int iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS);//need change to load from files if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; @@ -527,16 +527,20 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM { bFlagIsAutoExposureFailed = true; bFlagIsOverTrying = true; + qDebug() << "´óÓÚ30´Î"<= iDeviceDepth * 0.99) { @@ -566,6 +572,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM else if (iDeviceDepth * fMaxScaleFactor >= dTemp && dTemp >= iDeviceDepth * fMinScaleFactor) { bFlagIsAutoExposureOK = 1; + continue; } else if (dTemp > iDeviceDepth * fMaxScaleFactor) { @@ -592,12 +599,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); fExposureTime = (float)(fExposureTime / dFactor); } - if (/*fExposureTime > 100 || */fExposureTime < 10) + if (fExposureTime < m_daDeviceAttr.iMinIntegrationTimeInMS) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; bFlagIsLowerMinExposureTime = true; + + qDebug() << "lower-----------------------"<> 8;; qbSend[2] = m_iExposureTime & 0xFF; + + qDebug() << "-------------"<PerformAutoExposure(0.7,0.8,fPredictedExposureTime); + m_FiberSpectrometer->PerformAutoExposure(0.6,0.9,fPredictedExposureTime); } ZZ_S32 ATPFiberImager::GetMaxValue(ZZ_S32 * dark, int number) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index f772b67..09b87bd 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -47,8 +47,8 @@ void logout(QString str); void createDirectory(QString fullPath); bool isFileExist(QString fullFileName); -int getNonlinearityCoeffs2(long deviceID, double * coeffs); -int getNonlinearityCoeffs1(double * coeffs); +int getNonlinearityCoeffs2(long deviceID, double * nonlinearityCoeffs); +int getNonlinearityCoeffs1(double * nonlinearityCoeffs); int main(int argc, char *argv[]) { @@ -88,14 +88,24 @@ int main(int argc, char *argv[]) //´´½¨¹âÆ×ÒǶÔÏó FiberSpectrometerOperationBase * m_FiberSpectrometer; + bool isOcean = false; + double * nonlinearityCoeffs; + int numberOfNonlinearityCoeffs; switch (query.deviceType) { case OPTOSKY: m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"OPTOSKY"); break; case OceanOptics: - m_FiberSpectrometer = new OceanOpticsFiberImager();// + { + //ʹÓÃsbapi¶ÁÈ¡º£Ñó¹âѧÒÇÆ÷µÄ·ÇÏßÐÔ¶¨±ê²ÎÊý + nonlinearityCoeffs = new double[100]; + numberOfNonlinearityCoeffs = getNonlinearityCoeffs1(nonlinearityCoeffs); + + m_FiberSpectrometer = new OceanOpticsFiberImager(nonlinearityCoeffs, numberOfNonlinearityCoeffs); + isOcean = true; break; + } case UnknownDevice: parser.showHelp(); Q_UNREACHABLE(); @@ -114,7 +124,7 @@ int main(int argc, char *argv[]) //×Ô¶¯ÆØ¹â logout("
AutoExpose!"); - m_FiberSpectrometer->autoExpose(); +// m_FiberSpectrometer->autoExpose(); int iExposureTime; m_FiberSpectrometer->getExposureTime(iExposureTime); @@ -169,56 +179,37 @@ int main(int argc, char *argv[]) QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); copyFileToPath(query.calFileOutputName,destName,true); - //ÅжÏÒÇÆ÷ÀàÐÍÊÇ·ñΪº£Ñó¹âѧ£¬½«½á¹û´æ´¢ÔÚ±äÁ¿isOceanÖÐ - auto * p_C = dynamic_cast(m_FiberSpectrometer); - bool isOcean = false;// - if (p_C != nullptr) - { -// cout << "Match!!" << endl; - isOcean=true; -// coeffsFrame tmp; -// m_FiberSpectrometer->getNonlinearityCoeffs(tmp); - } - else - { - cout << "not OceanOpticsFiberImager!!" << endl; - } - - //¶Ï¿ª¹âÆ×ÒÇ - m_FiberSpectrometer->disconnectFiberSpectrometer(); - //return a.exec(); - - //ʹÓÃsbapi¶ÁÈ¡º£Ñó¹âѧÒÇÆ÷µÄ·ÇÏßÐÔ¶¨±ê²ÎÊý + //½«º£Ñó¹âѧÒÇÆ÷µÄ·ÇÏßÐÔ¶¨±ê²ÎÊýдµ½ÎļþÖÐ if (isOcean) { - double * coeffs = new double[100]; - int numberOfCoeffs = getNonlinearityCoeffs1(coeffs); - QDateTime curDateTime = QDateTime::currentDateTime(); QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); QString nonlinearityCoeffsName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".nonLinear"); -// for (int i = 0; i < numberOfCoeffs; ++i) +// for (int i = 0; i < numberOfNonlinearityCoeffs; ++i) // { // printf("\n"); // -// printf("nonlinearityCoeffs(µÚ%d¸ö): %1.2e\n",i , coeffs[i]); +// printf("nonlinearityCoeffs(µÚ%d¸ö): %1.2e\n",i , nonlinearityCoeffs[i]); // // printf("\n"); // } std::ofstream outfile(nonlinearityCoeffsName.toStdString().c_str()); - for (int i = 0; i < numberOfCoeffs; i++) + for (int i = 0; i < numberOfNonlinearityCoeffs; i++) { - outfile << coeffs[i] << std::endl; + outfile << nonlinearityCoeffs[i] << std::endl; } outfile.close(); - free(coeffs); + free(nonlinearityCoeffs); } + //¶Ï¿ª¹âÆ×ÒÇ + m_FiberSpectrometer->disconnectFiberSpectrometer();//Òª·ÅÔÚÕâ¾ä´úÂëÖ®ºó£ºfree(nonlinearityCoeffs); + //return a.exec(); } CommandLineParseResult parseCommandLine2(QCommandLineParser &parser, TcQuery *query, QString *errorMessage) @@ -539,7 +530,7 @@ bool isFileExist(QString fullFileName) return false; } -int getNonlinearityCoeffs1(double * coeffs) +int getNonlinearityCoeffs1(double * nonlinearityCoeffs) { int number_of_devices; long *device_ids; @@ -608,7 +599,7 @@ int getNonlinearityCoeffs1(double * coeffs) continue; } - number = getNonlinearityCoeffs2(device_ids[i],coeffs); + number = getNonlinearityCoeffs2(device_ids[i],nonlinearityCoeffs); /* Close the device */ // printf("\tAttempting to close:\n"); @@ -626,7 +617,7 @@ int getNonlinearityCoeffs1(double * coeffs) }// //·µ»ØÖµÊÇ·ÇÏßÐÔУÕýϵÊýµÄ¸öÊý -int getNonlinearityCoeffs2(long deviceID, double * coeffs) +int getNonlinearityCoeffs2(long deviceID, double * nonlinearityCoeffs) { int error = 0; int number_of_nonlinearity_coeff_features; @@ -664,13 +655,19 @@ int getNonlinearityCoeffs2(long deviceID, double * coeffs) // i, deviceID, nonlinearity_coeff_feature_ids[i]); // printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); - memset(coeffs, (int)0, 20);//---------------------------------------------------------------------------- + memset(nonlinearityCoeffs, (int)0, 20);//---------------------------------------------------------------------------- length = sbapi_nonlinearity_coeffs_get(deviceID, - nonlinearity_coeff_feature_ids[i], &error, coeffs, 20); + nonlinearity_coeff_feature_ids[i], &error, nonlinearityCoeffs, 20); // printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); if(0 == error && length > 0) { -// printf("\t\t\t\tFirst calibration term: %1.2e\n", coeffs[0]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[0]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[1]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[2]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[3]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[4]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[5]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[6]); } // printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", diff --git a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp index 53b56ba..3c13aaf 100644 --- a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp @@ -1,8 +1,11 @@ #include "Header_Files/oceanOpticsFiberImager.h" -OceanOpticsFiberImager::OceanOpticsFiberImager() +OceanOpticsFiberImager::OceanOpticsFiberImager(double * nonlinearityCoeffs, int numberOfCoeffs) { m_FiberSpectrometer = NULL; + + m_nonlinearityCoeffs = nonlinearityCoeffs; + m_iNumberOfNonlinearityCoeffs = numberOfCoeffs; } OceanOpticsFiberImager::~OceanOpticsFiberImager() @@ -18,15 +21,15 @@ void OceanOpticsFiberImager::connectFiberSpectrometer(QString& SN, QString& pixe m_FiberSpectrometer->Initialize(); - DeviceInfo deviceInfo; - DeviceAttribute deviceAttribute; + getDeviceInfo(m_deviceInfo); +// m_FiberSpectrometer->GetDeviceInfo(m_deviceInfo); - m_FiberSpectrometer->GetDeviceInfo(deviceInfo); - m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute); + getDeviceAttribute(m_deviceAttribute); +// m_FiberSpectrometer->GetDeviceAttribute(m_deviceAttribute); - SN = QString::fromStdString(deviceInfo.strSN); - pixelCount = QString::number(deviceAttribute.iPixels); - wavelengthInfo = QString::number(deviceAttribute.fWaveLengthInNM[0]) + "--" + QString::number(deviceAttribute.fWaveLengthInNM[deviceAttribute.iPixels - 1]); + SN = QString::fromStdString(m_deviceInfo.strSN); + pixelCount = QString::number(m_deviceAttribute.iPixels); + wavelengthInfo = QString::number(m_deviceAttribute.fWaveLengthInNM[0]) + "--" + QString::number(m_deviceAttribute.fWaveLengthInNM[m_deviceAttribute.iPixels - 1]); m_FiberSpectrometer->SetDeviceTemperature(-10); @@ -34,11 +37,11 @@ void OceanOpticsFiberImager::connectFiberSpectrometer(QString& SN, QString& pixe //ÉèÖÃdnÖµµÄ×î´óÖµ£¨ºÍλÉîÏà¹Ø£© string qepro = "QEP"; string flame = "FLMS"; - if (deviceInfo.strSN.find(qepro) != string::npos) + if (m_deviceInfo.strSN.find(qepro) != string::npos) { m_MaxValueOfFiberSpectrometer = 200000; } - else if (deviceInfo.strSN.find(flame) != string::npos) + else if (m_deviceInfo.strSN.find(flame) != string::npos) { m_MaxValueOfFiberSpectrometer = 65535; } @@ -81,6 +84,25 @@ void OceanOpticsFiberImager::getDeviceTemperature(float &fTemperature) void OceanOpticsFiberImager::singleShot(DataFrame &dfData) { m_FiberSpectrometer->SingleShot(dfData); + + if(m_iNumberOfNonlinearityCoeffs==0)//Èç¹û·ÇÏßÐÔУÕý²ÎÊýΪ0¸ö£¬ÄÇô¾Í²»×ö·ÇÏßÐÔУÕý + { + return; + } + + //×ö·ÇÏßÐÔУÕý + for (int i = 0; i < m_deviceAttribute.iPixels; i++) + { + dfData.lData[i] = dfData.lData[i] / (m_nonlinearityCoeffs[0] + + m_nonlinearityCoeffs[1] * dfData.lData[i] + + m_nonlinearityCoeffs[2] * pow(dfData.lData[i], 2) + + m_nonlinearityCoeffs[3] * pow(dfData.lData[i], 3) + + m_nonlinearityCoeffs[4] * pow(dfData.lData[i], 4) + + m_nonlinearityCoeffs[5] * pow(dfData.lData[i], 5) + + m_nonlinearityCoeffs[6] * pow(dfData.lData[i], 6) + + m_nonlinearityCoeffs[7] * pow(dfData.lData[i], 7) + ); + } } void OceanOpticsFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs) From a0b93df2f7bf65e9dedd6df41bd4cd9c6c84fc42 Mon Sep 17 00:00:00 2001 From: xin Date: Fri, 6 May 2022 10:15:59 +0800 Subject: [PATCH 32/53] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86shutter?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=A8=A1=E5=9D=97=E5=AF=B9=E5=8F=8C=E9=80=9A?= =?UTF-8?q?=E9=81=93=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/movingliner/main.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/othersoft/movingliner/main.cpp b/othersoft/movingliner/main.cpp index 279f59b..4f4e4fb 100644 --- a/othersoft/movingliner/main.cpp +++ b/othersoft/movingliner/main.cpp @@ -33,6 +33,35 @@ int main(int argc, char *argv[]) { cout1<<"Position Find Value is "<value("LINEAR SHUTTER/Position"+str).toLongLong()<<"
"<"<value("LINEAR SHUTTER/Port").toString() + if( m_qsDeviceConfig->value("LINEAR SHUTTER/Port").toString()=="GPIO") + { + int positionnumber=m_qsDeviceConfig->value("LINEAR SHUTTER/TotalPosition").toInt(); + if (str>=positionnumber) + { + cout1<<"ERROR number position"<value("LINEAR SHUTTER/Position"+str).toLongLong(); + + for (int ii = 0; ii < positionnumber; ++ii) { + int tempgpio=m_qsDeviceConfig->value("LINEAR SHUTTER/Position"+QString::number(ii)).toInt(); + QString com="gpio mode "+QString::number(tempgpio)+" out"; + system(com.toStdString().c_str()); + com="gpio write "+QString::number(tempgpio)+" 0"; + system(com.toStdString().c_str()); + + } + QThread::sleep(500); + QString com="gpio write "+QString::number(targetpos)+" 1"; + system(com.toStdString().c_str()); + QThread::sleep(500); + cout1<<"FINISH Change Shutter
"<value("LINEAR SHUTTER/Port").toString()); ControllerParams cpTest; Motercontrol.ILMES_InitializeParams(cpTest); From 37e998dcce95554fb643d6184c1e2ea2c56449b2 Mon Sep 17 00:00:00 2001 From: xin Date: Fri, 6 May 2022 10:40:17 +0800 Subject: [PATCH 33/53] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86shutter?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=A8=A1=E5=9D=97=E5=AF=B9=E5=8F=8C=E9=80=9A?= =?UTF-8?q?=E9=81=93=E7=9A=84=E6=94=AF=E6=8C=81=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ othersoft/movingliner/main.cpp | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8dc4e25..0dac025 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ /othersoft/calibration_console/build/ /othersoft/shuttercali/project/LocationCali/cmake-build-debug /othersoft/calibration_console/cmake-build-debug/ +/othersoft/movingliner/cmake-build-debug/ +/othersoft/movingliner/cmake-build-debug-toweris2/ +/othersoft/movingliner/cmake-build-release/ diff --git a/othersoft/movingliner/main.cpp b/othersoft/movingliner/main.cpp index 4f4e4fb..aa813f8 100644 --- a/othersoft/movingliner/main.cpp +++ b/othersoft/movingliner/main.cpp @@ -35,10 +35,12 @@ int main(int argc, char *argv[]) { // m_qsDeviceConfig->value("LINEAR SHUTTER/Port").toString() if( m_qsDeviceConfig->value("LINEAR SHUTTER/Port").toString()=="GPIO") { + //cout1<<"ERROR number position"<value("LINEAR SHUTTER/TotalPosition").toInt(); - if (str>=positionnumber) + if (str.toInt()>=positionnumber) { cout1<<"ERROR number position"<value("LINEAR SHUTTER/Position"+str).toLongLong(); @@ -51,10 +53,10 @@ int main(int argc, char *argv[]) { system(com.toStdString().c_str()); } - QThread::sleep(500); + QThread::msleep(500); QString com="gpio write "+QString::number(targetpos)+" 1"; system(com.toStdString().c_str()); - QThread::sleep(500); + QThread::msleep(500); cout1<<"FINISH Change Shutter
"< Date: Mon, 9 May 2022 14:08:57 +0800 Subject: [PATCH 34/53] =?UTF-8?q?=E6=97=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/calibration_console/Source_Files/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index 09b87bd..c865617 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -124,7 +124,7 @@ int main(int argc, char *argv[]) //×Ô¶¯ÆØ¹â logout("
AutoExpose!"); -// m_FiberSpectrometer->autoExpose(); + m_FiberSpectrometer->autoExpose();// int iExposureTime; m_FiberSpectrometer->getExposureTime(iExposureTime); From a388377ea3690b5e2b3b2c1a2b66f79fb58ce75c Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 10 May 2022 13:56:28 +0800 Subject: [PATCH 35/53] =?UTF-8?q?1.=E4=B8=8A=E6=AC=A1=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=8E=E6=9C=AA=E5=90=AF=E7=94=A8=E9=A2=84?= =?UTF-8?q?=E7=83=AD=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=B7=B2=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/config/calibrate.php | 98 --------------------------------------- main.cpp | 2 +- 2 files changed, 1 insertion(+), 99 deletions(-) delete mode 100644 html/config/calibrate.php diff --git a/html/config/calibrate.php b/html/config/calibrate.php deleted file mode 100644 index 0bc60cb..0000000 --- a/html/config/calibrate.php +++ /dev/null @@ -1,98 +0,0 @@ -"; -//$cmd = 'ping 127.0.0.1'; -$ini=parse_ini_file("/home/data/Setting/DeviceSettings.ini",true); - -$numberofsensor=intval($ini['DEVICE INFO']['TotalSpectrometer']); -$numberofFS=0; - for($i=0;$i<$numberofsensor;$i++){ - $tempsens=$ini['FS'.($i+1)]['Model']; - if ($sensorType==$tempsens) - { - $numberofFS=$i+1; - break; - } - if ($i==$numberofsensor-1) - { - echo "cannot find the sensor"; - return; - } - } - - - -system("sudo killall Mywathdog.sh"); -system("sudo killall TowerOptoSifAndSpectral"); -system("sudo pkill ocean_optics_calibration_console"); -system("sudo gpio write 1 1"); -$cmd=""; - - - - -if ($position==1) -{ - if($sensorType=="OSIFAlpha"||$sensorType=="OSIFBeta") - { - $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OceanOptics -t 30 -slfs IrrLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; - } - else{ - $port=$ini['FS'.($i+1)]['Port']; - getonestring($port,'/'); - getonestring($port,'/'); - $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OPTOSKY --serialPort '.$port.' -t 30 -slfs IrrLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; - - } - - -} -else -{ - if($sensorType=="OSIFAlpha"||$sensorType=="OSIFBeta") - { - $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OceanOptics -t 30 -slfs RadLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; - }else{ - $port=$ini['FS'.($i+1)]['Port']; - getonestring($port,'/'); - getonestring($port,'/'); - $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OPTOSKY --serialPort '.$port.' -t 30 -slfs RadLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; - - } -} - - -echo $cmd; - -while(@ ob_end_flush()); - -$proc = popen($cmd, 'r'); - - -while(!feof($proc)){ - echo fread($proc, 4096); - @ flush(); -} -echo 'FINISH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '; -echo '回到首页'; - -function getonestring(&$bytes,$fenge) -{ - $pattern = '{^.*?'.$fenge.'}'; - $lenth=strlen($fenge); - preg_match($pattern, $bytes, $aa, PREG_OFFSET_CAPTURE); - $bytes = substr($bytes, strlen($aa[0][0])); - $bb = substr($aa[0][0], 0, -$lenth); - return $bb; -} \ No newline at end of file diff --git a/main.cpp b/main.cpp index 629df79..5f41a81 100644 --- a/main.cpp +++ b/main.cpp @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) //m_mduUploader.Initialize(); //m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //////////////////////////////////////////////////////////////////////////prepare - //m_sTimer.Preheating(); + m_sTimer.Preheating(); //m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); m_struEC.qstrCaseTemperature= QString("%1").arg(m_fChassisTemp); From ce8857811b08dc18ba3698c9675de37a9223d79a Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 10 May 2022 13:57:55 +0800 Subject: [PATCH 36/53] =?UTF-8?q?1.=E6=9C=AA=E5=90=AF=E7=94=A8logger?= =?UTF-8?q?=EF=BC=8C=E5=B7=B2=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 5f41a81..0a15c4b 100644 --- a/main.cpp +++ b/main.cpp @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) HumitureDeviceInfo m_struHumitureDI; //////////////////////////////////////////////////////////////////////////logger ///create main system logger - //QT_LOG::ZZ_InitLogger("/home/data/Log/"); + QT_LOG::ZZ_InitLogger("/home/data/Log/"); //////////////////////////////////////////////////////////////////////////config ///turn on power supply From 084edcac5336680c7d1b321a88284d4ff3768a0d Mon Sep 17 00:00:00 2001 From: xin Date: Tue, 2 Aug 2022 11:05:17 +0800 Subject: [PATCH 37/53] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86shutter?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=A8=A1=E5=9D=97=E5=AF=B9=E5=8F=8C=E9=80=9A?= =?UTF-8?q?=E9=81=93=E7=9A=84=E6=94=AF=E6=8C=81=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 install.sh diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..e69de29 From 181ff9e9c60d88f921b480ab6573b5d083b4f6c9 Mon Sep 17 00:00:00 2001 From: xin Date: Tue, 2 Aug 2022 11:07:34 +0800 Subject: [PATCH 38/53] =?UTF-8?q?=E8=BF=98=E5=8E=9Fcalibrate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/config/calibrate.php | 98 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 html/config/calibrate.php diff --git a/html/config/calibrate.php b/html/config/calibrate.php new file mode 100644 index 0000000..0bc60cb --- /dev/null +++ b/html/config/calibrate.php @@ -0,0 +1,98 @@ +"; +//$cmd = 'ping 127.0.0.1'; +$ini=parse_ini_file("/home/data/Setting/DeviceSettings.ini",true); + +$numberofsensor=intval($ini['DEVICE INFO']['TotalSpectrometer']); +$numberofFS=0; + for($i=0;$i<$numberofsensor;$i++){ + $tempsens=$ini['FS'.($i+1)]['Model']; + if ($sensorType==$tempsens) + { + $numberofFS=$i+1; + break; + } + if ($i==$numberofsensor-1) + { + echo "cannot find the sensor"; + return; + } + } + + + +system("sudo killall Mywathdog.sh"); +system("sudo killall TowerOptoSifAndSpectral"); +system("sudo pkill ocean_optics_calibration_console"); +system("sudo gpio write 1 1"); +$cmd=""; + + + + +if ($position==1) +{ + if($sensorType=="OSIFAlpha"||$sensorType=="OSIFBeta") + { + $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OceanOptics -t 30 -slfs IrrLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; + } + else{ + $port=$ini['FS'.($i+1)]['Port']; + getonestring($port,'/'); + getonestring($port,'/'); + $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OPTOSKY --serialPort '.$port.' -t 30 -slfs IrrLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; + + } + + +} +else +{ + if($sensorType=="OSIFAlpha"||$sensorType=="OSIFBeta") + { + $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OceanOptics -t 30 -slfs RadLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; + }else{ + $port=$ini['FS'.($i+1)]['Port']; + getonestring($port,'/'); + getonestring($port,'/'); + $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console --deviceType OPTOSKY --serialPort '.$port.' -t 30 -slfs RadLamp.txt --cfon FSN'.$sensorType.$position.'.data --position '.$position.' --integratingSphereDetectorValue '.$nite; + + } +} + + +echo $cmd; + +while(@ ob_end_flush()); + +$proc = popen($cmd, 'r'); + + +while(!feof($proc)){ + echo fread($proc, 4096); + @ flush(); +} +echo 'FINISH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '; +echo '回到首页'; + +function getonestring(&$bytes,$fenge) +{ + $pattern = '{^.*?'.$fenge.'}'; + $lenth=strlen($fenge); + preg_match($pattern, $bytes, $aa, PREG_OFFSET_CAPTURE); + $bytes = substr($bytes, strlen($aa[0][0])); + $bb = substr($aa[0][0], 0, -$lenth); + return $bb; +} \ No newline at end of file From bd467593954323145a153c7bf189325e1456496a Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Wed, 3 Aug 2022 10:59:27 +0800 Subject: [PATCH 39/53] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=EF=BC=9A=E5=B0=86?= =?UTF-8?q?=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=E9=80=9A=E8=BF=87=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=93=E5=86=99=E5=85=A5=E6=96=87=E4=BB=B6=EF=BC=9B?= =?UTF-8?q?=202=E3=80=81=E4=BF=AE=E6=94=B9atp=E7=9A=84=E6=9C=80=E9=AB=98?= =?UTF-8?q?=E5=AE=9A=E6=A0=87=E6=97=B6=E9=97=B4=EF=BC=9A13s=20=E2=86=92=20?= =?UTF-8?q?65s=EF=BC=8C=E6=AD=A4=E9=97=AE=E9=A2=98=E6=98=AF=E7=94=B1?= =?UTF-8?q?=E4=BA=8E2022-4-21-14:00=E6=9B=B4=E6=96=B0=E5=8D=93=E5=93=A5atp?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=88=B0=E6=9C=80=E6=96=B0=E7=89=88=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header_Files/calibration.h | 1 + .../Source_Files/ATPControl_Serial_QT.cpp | 6 ++--- .../Source_Files/calibration.cpp | 25 +++++++++++++++++++ .../calibration_console/Source_Files/main.cpp | 4 +-- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/calibration.h b/othersoft/calibration_console/Header_Files/calibration.h index f667515..2f65a7b 100644 --- a/othersoft/calibration_console/Header_Files/calibration.h +++ b/othersoft/calibration_console/Header_Files/calibration.h @@ -1,4 +1,5 @@ #pragma once +#pragma pack(1)//结构体按照1字节对é½å­˜å‚¨ #include //#include #include diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 9fbda54..31291d1 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -612,12 +612,12 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; - if (fExposureTime > 13000) + if (fExposureTime > 65000) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; - fPredictedExposureTime = 13000; - iRes = SetExposureTime(13000); + fPredictedExposureTime = 65000; + iRes = SetExposureTime(65000); if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3"; diff --git a/othersoft/calibration_console/Source_Files/calibration.cpp b/othersoft/calibration_console/Source_Files/calibration.cpp index fe4a7b4..9ec260d 100644 --- a/othersoft/calibration_console/Source_Files/calibration.cpp +++ b/othersoft/calibration_console/Source_Files/calibration.cpp @@ -242,5 +242,30 @@ void CalibrationAlgorithm::produceCalfile(QString calFilePath, DeviceAttribute d } outfile.close(); + //Êä³ö¶¨±êÎļþʱ£¬Ö±½Óд½á¹¹Ìå + using namespace ZZ_MISCDEF::ZZ_DATAFILE;//tagCalibrationFrame + tagCalibrationFrame calibrationFrame; + + calibrationFrame.uiExposureTimeInMS = integratingSphereData.usExposureTimeInMS; + calibrationFrame.fTemperature = integratingSphereData.fTemperature; + calibrationFrame.iPixels = deviceAttribute.iPixels; + + for (size_t i = 0; i < deviceAttribute.iPixels; i++) + { + calibrationFrame.fWaveLength[i] = deviceAttribute.fWaveLengthInNM[i]; + calibrationFrame.dCal_Gain[i] = m_gain[i]; + } + + QStringList tmp = calFilePath.split('.'); + QString calFilePath2 = tmp[0] + "_structure." + tmp[1]; + + FILE * calFileHandle2 = fopen(calFilePath2.toStdString().c_str(), "wb"); + + writeCounter = fwrite(&calibrationFrame,sizeof(tagCalibrationFrame), 1, calFileHandle2); + + fclose(calFileHandle2); + + delete[] m_gain; + delete[] m_offset; } diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index c865617..ee84323 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -124,7 +124,7 @@ int main(int argc, char *argv[]) //×Ô¶¯ÆØ¹â logout("
AutoExpose!"); - m_FiberSpectrometer->autoExpose();// + m_FiberSpectrometer->autoExpose(); int iExposureTime; m_FiberSpectrometer->getExposureTime(iExposureTime); @@ -166,7 +166,7 @@ int main(int argc, char *argv[]) { QDateTime curDateTime = QDateTime::currentDateTime(); QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); - QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); + QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".cal"); query.calFileOutputName=calFileName; } From f04f058b9cf7c30e523bd617dbef0f47ab218e1d Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Wed, 3 Aug 2022 19:10:50 +0800 Subject: [PATCH 40/53] =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=93=E6=8C=891?= =?UTF-8?q?=E5=AD=97=E8=8A=82=E5=AF=B9=E9=BD=90=E7=9A=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?#pragma=20pack(1)=E4=BD=BF=E7=94=A8=E9=94=99=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4CalibrationAlgorithm::produceCalfile=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=9C=A8=E7=BB=93=E6=9E=84=E4=BD=93=E4=BC=A0=E5=8F=82?= =?UTF-8?q?=E6=97=B6=E5=87=BA=E7=8E=B0=E9=94=99=E8=AF=AF=EF=BC=88DataFrame?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=90=91=E5=90=8E=E6=BC=82=E7=A7=BB?= =?UTF-8?q?=E4=B8=80=E4=B8=AAZZ=5FU32=EF=BC=8C=E6=9B=9D=E5=85=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA0=EF=BC=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- othersoft/calibration_console/Header_Files/ZZ_Types.h | 5 ++++- othersoft/calibration_console/Header_Files/calibration.h | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/ZZ_Types.h b/othersoft/calibration_console/Header_Files/ZZ_Types.h index 8be8efa..a9e6177 100644 --- a/othersoft/calibration_console/Header_Files/ZZ_Types.h +++ b/othersoft/calibration_console/Header_Files/ZZ_Types.h @@ -2,6 +2,8 @@ //ÀàÐÍ˵Ã÷Îļþ ////////////////////////////////////////////////////////////////////////// #pragma once +#pragma pack(1)//½á¹¹Ìå°´ÕÕ1×Ö½Ú¶ÔÆë´æ´¢ + #include #include @@ -351,4 +353,5 @@ namespace ZZ_MISCDEF QString qstrInterfaceName; }HumitureDeviceInfo; } -}; \ No newline at end of file +}; +#pragma pack()//»Ö¸´Ä¬ÈÏÄÚ´æ¶ÔÆë£¨°´ÕÕ8×Ö½Ú£© diff --git a/othersoft/calibration_console/Header_Files/calibration.h b/othersoft/calibration_console/Header_Files/calibration.h index 2f65a7b..f667515 100644 --- a/othersoft/calibration_console/Header_Files/calibration.h +++ b/othersoft/calibration_console/Header_Files/calibration.h @@ -1,5 +1,4 @@ #pragma once -#pragma pack(1)//结构体按照1字节对é½å­˜å‚¨ #include //#include #include From 08b44aec8df56eff6dbf778a071660f6ea9581a6 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 11 Aug 2022 13:29:47 +0800 Subject: [PATCH 41/53] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E8=AE=A1=E6=97=B6=E5=90=8E=20=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E9=87=87=E9=9B=86=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 9 +++++--- .../Source_Files/ATPControl_Serial_QT.cpp | 2 ++ source/CaptureThread/Scheduler.cpp | 4 ++++ source/FS/ATPControl_Serial_QT.cpp | 5 +++++ source/LinearShutter/VSMD12XMovementTest.cpp | 21 +++++++++++++++++++ source/LinearShutter/VSMD12XMovementTest.h | 11 ++++++++++ 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 source/LinearShutter/VSMD12XMovementTest.cpp create mode 100644 source/LinearShutter/VSMD12XMovementTest.h diff --git a/main.cpp b/main.cpp index 0a15c4b..feba0c7 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,7 @@ #include "Scheduler.h" #include "GY39Controller.h" #include "MainDataUploader.h" +#include "VSMD12XMovementTest.h" using namespace std; #pragma once @@ -18,7 +19,9 @@ int main(int argc, char *argv[]) QCoreApplication a(argc, argv); - + //////////////////////////////////////////////////////////////////////////for test + MovementTest m_testVSMD12X; + //////////////////////////////////////////////////////////////////////////// //system("gpio mode 1 output");//������ų�ʼ�� //qDebug() << "gpio mode 1 output......" << endl; ////////////////////////////////////////////////////////////////////////// @@ -88,10 +91,10 @@ int main(int argc, char *argv[]) m_mduUploader.SetContext(m_struEC, m_struMEC); //m_mduUploader.Initialize(); - //m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); + m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //////////////////////////////////////////////////////////////////////////prepare m_sTimer.Preheating(); - //m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); + m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); m_struEC.qstrCaseTemperature= QString("%1").arg(m_fChassisTemp); m_struEC.qstrCaseHumidity = QString("%1").arg(m_fChassisHum); diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 9fbda54..918a38b 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -679,9 +679,11 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:1"; + //return 1; } + return 0; } diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index 3f91008..668e52b 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -55,6 +55,10 @@ void Scheduler::StartAsPlanned() int iIntervalInMS = m_struAcqTime.qtInterval.hour() * 3600 * 1000 + m_struAcqTime.qtInterval.minute() * 60 * 1000 + m_struAcqTime.qtInterval.second() * 1000; m_GrabTimer->start(iIntervalInMS); + + QThread::msleep(5000); + qDebug() << "it's time to start work."; + emit SignalGrabOnce(); //this->OnTimeCounter(); //emit &QTimer::timeout; } diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index 12bb950..4ca227a 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -320,6 +320,8 @@ int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init() int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand) { + m_pSerialPort->clear(); + int iSize = qbCommand.size() + 3; QByteArray qbSend; qbSend.resize(4); @@ -349,6 +351,7 @@ int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand) int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) { + qbData.clear(); qbData = m_pSerialPort->readAll(); @@ -675,6 +678,8 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:1"; + /*m_pSerialPort->waitForReadyRead(5000); + m_pSerialPort->clear();*/ //return 1; } diff --git a/source/LinearShutter/VSMD12XMovementTest.cpp b/source/LinearShutter/VSMD12XMovementTest.cpp new file mode 100644 index 0000000..7631742 --- /dev/null +++ b/source/LinearShutter/VSMD12XMovementTest.cpp @@ -0,0 +1,21 @@ +#include "VSMD12XMovementTest.h" + +MovementTest::MovementTest() +{ + +} + +MovementTest::~MovementTest() +{ +} + +void MovementTest::TestAsLinearShutter() +{ + PortInfo piTemp; + piTemp.qstrFullPortName = QString::fromStdString(""); + m_ctrlLS.ILMES_InitializeComm(piTemp, 1, 1); + ControllerParams cpTemp; + bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp); + //m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition); +} + diff --git a/source/LinearShutter/VSMD12XMovementTest.h b/source/LinearShutter/VSMD12XMovementTest.h new file mode 100644 index 0000000..54b173e --- /dev/null +++ b/source/LinearShutter/VSMD12XMovementTest.h @@ -0,0 +1,11 @@ +#include "VSMD12XControl.h" +class MovementTest +{ +public: + MovementTest(); + ~MovementTest(); +private: + CVSMD12XControl m_ctrlLS; +public: + void TestAsLinearShutter(); +}; \ No newline at end of file From ae65847576b103a408b3ac39d925b7378a419296 Mon Sep 17 00:00:00 2001 From: xin Date: Fri, 12 Aug 2022 09:35:31 +0800 Subject: [PATCH 42/53] =?UTF-8?q?=E7=BB=8F=E5=BA=A6=E7=BB=99=E6=94=B9?= =?UTF-8?q?=E4=BD=8D=E7=BB=B4=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/index.html b/html/index.html index 4015d47..faef173 100644 --- a/html/index.html +++ b/html/index.html @@ -58,7 +58,7 @@ GPSç»åº¦ - GPSç»åº¦ + GPS维度 GPS高程 From 0b250c89705ee3819a190a6746dbad7e044a0f3e Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 12 Aug 2022 11:06:46 +0800 Subject: [PATCH 43/53] =?UTF-8?q?Data=E7=9B=AE=E5=BD=95=E9=87=8C=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=97=A5=E6=9C=9F=E6=96=87=E4=BB=B6=E5=A4=B9=E6=97=B6?= =?UTF-8?q?=E7=94=B1=E4=BA=8E=E4=BD=BF=E7=94=A8=E7=9A=84=E6=98=AFmkdir?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=20=E4=B8=8D=E8=83=BD=E5=9C=A8=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E7=88=B6=E7=9B=AE=E5=BD=95=E7=9A=84=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8B=E6=AD=A3=E7=A1=AE=E5=88=9B=E5=BB=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E3=80=82=E5=B7=B2=E7=BB=8F=E5=B0=86mkdir=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E4=B8=BAmkpath=E6=8C=87=E4=BB=A4=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=AD=A4=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/FS/DataFileProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/FS/DataFileProcessor.cpp b/source/FS/DataFileProcessor.cpp index fe5e6b7..f635483 100644 --- a/source/FS/DataFileProcessor.cpp +++ b/source/FS/DataFileProcessor.cpp @@ -63,7 +63,7 @@ void DataFileProcessor::GenerateFilePath() QDir qdirPath(qstrTemp); if (!qdirPath.exists()) { - bool bRes = qdirPath.mkdir(qstrTemp); + bool bRes = qdirPath.mkpath(qstrTemp);//20220812 mkdir change to mkpath if (!bRes) { qDebug() << "DataFileProcessor mkdir Failed."; From 4ebbea7bc9656c0ea4a48c3d560c8c0bbf8cd139 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Wed, 12 Oct 2022 13:13:13 +0800 Subject: [PATCH 44/53] =?UTF-8?q?=E5=BC=A0=E6=AC=A3=E6=AC=A3=E8=A6=81?= =?UTF-8?q?=E6=B1=82=EF=BC=9A=E5=AE=9A=E6=A0=87=E6=97=B6=EF=BC=8C=E5=B0=86?= =?UTF-8?q?=E5=8E=9F=E5=A7=8B=E7=9A=84dn=E5=80=BC=E5=92=8C=E9=87=8D?= =?UTF-8?q?=E9=87=87=E6=A0=B7=E5=90=8E=E7=9A=84=E7=A7=AF=E5=88=86=E7=90=83?= =?UTF-8?q?=E6=A0=87=E5=87=86=E6=9B=B2=E7=BA=BF=E8=BE=93=E5=87=BA=E5=88=B0?= =?UTF-8?q?csv=EF=BC=8C=E4=BB=A5=E4=BE=BF=E5=AE=9A=E6=A0=87=E6=97=B6?= =?UTF-8?q?=E6=8E=92=E9=94=99=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source_Files/atpFiberImager.cpp | 64 ++++++++--------- .../Source_Files/calibration.cpp | 26 +++---- .../Source_Files/oceanOpticsFiberImager.cpp | 68 +++++++++---------- 3 files changed, 79 insertions(+), 79 deletions(-) diff --git a/othersoft/calibration_console/Source_Files/atpFiberImager.cpp b/othersoft/calibration_console/Source_Files/atpFiberImager.cpp index 6270d3d..d9c8448 100644 --- a/othersoft/calibration_console/Source_Files/atpFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/atpFiberImager.cpp @@ -102,22 +102,22 @@ void ATPFiberImager::recordDark(QString path) //²É¼¯°µÖ¡ singleShot(m_DarkData); -// //Êä³öµ½csv -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_darkSpectral.csv"; -// std::ofstream outfile(fileName.toStdString().c_str()); -// -// for (int i = 0; i < attribute.iPixels; i++) -// { -// if (i==0) -// { -// outfile << m_DarkData.usExposureTimeInMS << std::endl; -// } -// outfile << attribute.fWaveLengthInNM[i] << "," << m_DarkData.lData[i] << std::endl; -// } -// -// outfile.close(); + //Êä³öµ½csv + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_darkSpectral_dn.csv"; + std::ofstream outfile(fileName.toStdString().c_str()); + + for (int i = 0; i < attribute.iPixels; i++) + { + if (i==0) + { + outfile << m_DarkData.usExposureTimeInMS << std::endl; + } + outfile << attribute.fWaveLengthInNM[i] << "," << m_DarkData.lData[i] << std::endl; + } + + outfile.close(); } void ATPFiberImager::recordTarget(int recordTimes, QString path) @@ -155,22 +155,22 @@ void ATPFiberImager::recordTarget(int recordTimes, QString path) } -// //Êä³öµ½csv -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_integratingSphereSpectral.csv"; -// std::ofstream outfile(fileName.toStdString().c_str()); -// -// for (int i = 0; i < attribute.iPixels; i++) -// { -// if (i==0) -// { -// outfile << m_IntegratingSphereData.usExposureTimeInMS << std::endl; -// } -// outfile << attribute.fWaveLengthInNM[i] << "," << m_IntegratingSphereData.lData[i] << std::endl; -// } -// -// outfile.close(); + //Êä³öµ½csv + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_integratingSphereSpectral_dn.csv"; + std::ofstream outfile(fileName.toStdString().c_str()); + + for (int i = 0; i < attribute.iPixels; i++) + { + if (i==0) + { + outfile << m_IntegratingSphereData.usExposureTimeInMS << std::endl; + } + outfile << attribute.fWaveLengthInNM[i] << "," << m_IntegratingSphereData.lData[i] << std::endl; + } + + outfile.close(); } void ATPFiberImager::autoExpose() diff --git a/othersoft/calibration_console/Source_Files/calibration.cpp b/othersoft/calibration_console/Source_Files/calibration.cpp index 9ec260d..64fc9aa 100644 --- a/othersoft/calibration_console/Source_Files/calibration.cpp +++ b/othersoft/calibration_console/Source_Files/calibration.cpp @@ -176,19 +176,19 @@ void CalibrationAlgorithm::readAndResample_StandardLightFile(QString filePath, i } -// //½«ÖزÉÑùµÄ±ê×¼µÆÊý¾ÝÊä³öµ½csv -// QString outputName = standardLightFileFolder + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" + standardLightFileName + "_resample.csv"; -// std::ofstream outfile2(outputName.toStdString().c_str()); -// for (size_t i = 0; i < deviceAttribute.iPixels; i++) -// { -// if (i == 0) -// { -// outfile2 << m_dStandardLightDataBase << std::endl; -// } -// -// outfile2 << deviceAttribute.fWaveLengthInNM[i] << "," << m_dStandardLightDataResampled[i] << std::endl; -// } -// outfile2.close(); + //½«ÖزÉÑùµÄ±ê×¼µÆÊý¾ÝÊä³öµ½csv + QString outputName = standardLightFileFolder + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" + standardLightFileName + "_resample.csv"; + std::ofstream outfile2(outputName.toStdString().c_str()); + for (size_t i = 0; i < deviceAttribute.iPixels; i++) + { + if (i == 0) + { + outfile2 << m_dStandardLightDataBase << std::endl; + } + + outfile2 << deviceAttribute.fWaveLengthInNM[i] << "," << m_dStandardLightDataResampled[i] << std::endl; + } + outfile2.close(); } void CalibrationAlgorithm::produceCalfile(QString calFilePath, DeviceAttribute deviceAttribute, DataFrame integratingSphereData, DataFrame darkData) diff --git a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp index 3c13aaf..9e7e632 100644 --- a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp @@ -123,23 +123,23 @@ void OceanOpticsFiberImager::recordDark(QString path) //²É¼¯°µÖ¡ singleShot(m_DarkData); -// //Êä³öµ½csv -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// -// QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_darkSpectral.csv"; -// std::ofstream outfile(fileName.toStdString().c_str()); -// -// for (int i = 0; i < attribute.iPixels; i++) -// { -// if (i==0) -// { -// outfile << m_DarkData.usExposureTimeInMS << std::endl;// -// } -// outfile << attribute.fWaveLengthInNM[i] << "," << m_DarkData.lData[i] << std::endl; -// } -// -// outfile.close(); + //Êä³öµ½csv + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + + QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_darkSpectral_dn.csv"; + std::ofstream outfile(fileName.toStdString().c_str()); + + for (int i = 0; i < attribute.iPixels; i++) + { + if (i==0) + { + outfile << m_DarkData.usExposureTimeInMS << std::endl;// + } + outfile << attribute.fWaveLengthInNM[i] << "," << m_DarkData.lData[i] << std::endl; + } + + outfile.close(); } void OceanOpticsFiberImager::recordTarget(int recordTimes, QString path) @@ -177,23 +177,23 @@ void OceanOpticsFiberImager::recordTarget(int recordTimes, QString path) } -// //Êä³öµ½csv -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// -// QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_integratingSphereSpectral.csv"; -// std::ofstream outfile(fileName.toStdString().c_str()); -// -// for (int i = 0; i < attribute.iPixels; i++)// -// { -// if (i==0) -// { -// outfile << m_IntegratingSphereData.usExposureTimeInMS << std::endl; -// } -// outfile << attribute.fWaveLengthInNM[i] << "," << m_IntegratingSphereData.lData[i] << std::endl; -// } -// -// outfile.close(); + //Êä³öµ½csv + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + + QString fileName = path + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_integratingSphereSpectral_dn.csv"; + std::ofstream outfile(fileName.toStdString().c_str()); + + for (int i = 0; i < attribute.iPixels; i++)// + { + if (i==0) + { + outfile << m_IntegratingSphereData.usExposureTimeInMS << std::endl; + } + outfile << attribute.fWaveLengthInNM[i] << "," << m_IntegratingSphereData.lData[i] << std::endl; + } + + outfile.close(); } void OceanOpticsFiberImager::autoExpose() From 527c23e30e5268a859a61dc19d30e0b35493113b Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Wed, 12 Oct 2022 14:15:14 +0800 Subject: [PATCH 45/53] =?UTF-8?q?=E6=8E=A5=E4=B8=8A=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=EF=BC=9A=E9=81=97=E6=BC=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source_Files/calibration.cpp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/othersoft/calibration_console/Source_Files/calibration.cpp b/othersoft/calibration_console/Source_Files/calibration.cpp index 64fc9aa..8f24ba4 100644 --- a/othersoft/calibration_console/Source_Files/calibration.cpp +++ b/othersoft/calibration_console/Source_Files/calibration.cpp @@ -113,28 +113,28 @@ void CalibrationAlgorithm::readAndResample_StandardLightFile(QString filePath, i -// //½«½Ø¶Ï±ê×¼µÆÊý¾ÝÊä³öµ½csv -// QFileInfo fileInfo(filePath); -// QString standardLightFileFolder = fileInfo.path(); -// QString standardLightFileName = fileInfo.fileName(); -// -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// -// QString tmp = standardLightFileFolder + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) +"_"+ standardLightFileName + "_truncation.csv"; -// -// std::ofstream outfile1(tmp.toStdString().c_str()); -// -// for (size_t i = 0; i < endPos - startPos; i++) -// { -// if (i == 0) -// { -// outfile1 << m_dStandardLightDataBase << std::endl; -// } -// -// outfile1 << m_dStandardLightWavelength[i] << "," << m_dStandardLightData[i] << std::endl; -// } -// outfile1.close(); + //½«½Ø¶Ï±ê×¼µÆÊý¾ÝÊä³öµ½csv + QFileInfo fileInfo(filePath); + QString standardLightFileFolder = fileInfo.path(); + QString standardLightFileName = fileInfo.fileName(); + + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + + QString tmp = standardLightFileFolder + "/" + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) +"_"+ standardLightFileName + "_truncation.csv"; + + std::ofstream outfile1(tmp.toStdString().c_str()); + + for (size_t i = 0; i < endPos - startPos; i++) + { + if (i == 0) + { + outfile1 << m_dStandardLightDataBase << std::endl; + } + + outfile1 << m_dStandardLightWavelength[i] << "," << m_dStandardLightData[i] << std::endl; + } + outfile1.close(); From a7a2e559ef25c933b6ded1fb144589e47d515601 Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 7 Mar 2022 11:21:29 +0800 Subject: [PATCH 46/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=87=8D=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 6cac8bde4ff1ae44a9732930cf1197d4e91d4d2d) --- othersoft/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/othersoft/install.sh b/othersoft/install.sh index 1c2cf20..dffe938 100644 --- a/othersoft/install.sh +++ b/othersoft/install.sh @@ -47,5 +47,5 @@ sudo apt-get install -y timedatectl timedatectl set-timezone Asia/Shanghai date -R sudo hwclock -w -f /dev/rtc0 - +sudo reboot #tc From ad0c4149e6da97d8d2cbf5e029b408365f688a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=20=E5=BC=A0?= <1033584732@qq.com> Date: Tue, 19 Dec 2023 10:52:21 +0800 Subject: [PATCH 47/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E7=94=B5?= =?UTF-8?q?=E6=9C=BA=E9=83=A8=E5=88=86=E6=8E=A7=E5=88=B6=E4=BB=A3=E7=A0=81?= =?UTF-8?q?&=E9=94=99=E8=AF=AF=E6=89=93=E5=8D=B0=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BA=86=E7=94=B5=E6=9C=BA=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=BE=93=E5=87=BA=E3=80=82=E6=B8=A9=E6=B9=BF?= =?UTF-8?q?=E5=BA=A6=E4=BC=A0=E6=84=9F=E5=99=A8=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeSettings.json | 23 ++++++++++++++++-- main.cpp | 30 +++++++++++------------- source/CaptureThread/MainDataGrabber.cpp | 6 +++-- source/CaptureThread/Scheduler.cpp | 1 + source/FS/DataFileProcessor.cpp | 7 ++++++ source/LinearShutter/VSMD12XControl.cpp | 16 +++++++++---- 6 files changed, 58 insertions(+), 25 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index 398f788..95624be 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -3,14 +3,14 @@ { "name": "Linux-GCC-Debug", "generator": "Unix Makefiles", - "configurationType": "Debug", + "configurationType": "Release", "cmakeExecutable": "/opt/cmake/bin/cmake", "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ], "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "linux_arm" ], "intelliSenseMode": "linux-gcc-x64", - "remoteMachineName": "243120617;172.16.0.232 (username=root, port=22, authentication=Password)", + "remoteMachineName": "437198504;172.16.0.96 (username=root, port=22, authentication=Password)", "remoteCMakeListsRoot": "/home/pi/SIF0/src", "remoteBuildRoot": "/home/pi/SIF0/out/build_d/${name}", "remoteInstallRoot": "/home/pi/SIF0/out/install/${name}", @@ -29,6 +29,25 @@ "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "msvc_x64_x64" ] + }, + { + "name": "Linux-GCC-R", + "generator": "Unix Makefiles", + "configurationType": "Release", + "cmakeExecutable": "/opt/cmake/bin/cmake", + "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ], + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "linux_arm" ], + "intelliSenseMode": "linux-gcc-x64", + "remoteMachineName": "-1784524891;172.16.0.71 (username=root, port=22, authentication=Password)", + "remoteCMakeListsRoot": "/home/pi/SIF0/src_r", + "remoteBuildRoot": "/home/pi/SIF0/out/build_r/${name}", + "remoteInstallRoot": "/home/pi/SIF0/out/install_r/${name}", + "remoteCopySources": true, + "rsyncCommandArgs": "-t --delete --delete-excluded", + "remoteCopyBuildOutput": true, + "remoteCopySourcesMethod": "rsync" } ] } \ No newline at end of file diff --git a/main.cpp b/main.cpp index feba0c7..226dee1 100644 --- a/main.cpp +++ b/main.cpp @@ -9,7 +9,6 @@ #include "MainDataUploader.h" #include "VSMD12XMovementTest.h" using namespace std; -#pragma once int main(int argc, char *argv[]) @@ -20,7 +19,7 @@ int main(int argc, char *argv[]) QCoreApplication a(argc, argv); //////////////////////////////////////////////////////////////////////////for test - MovementTest m_testVSMD12X; + //MovementTest m_testVSMD12X; //////////////////////////////////////////////////////////////////////////// //system("gpio mode 1 output");//������ų�ʼ�� //qDebug() << "gpio mode 1 output......" << endl; @@ -54,13 +53,14 @@ int main(int argc, char *argv[]) ///turn on power supply //////add support to dual channel - system("gpio mode 1 out"); - system("gpio mode 4 out"); - system("gpio mode 5 out"); - qDebug() << "gpio 1;4;5; ready" << endl; + int iRet0 = 0,iRet1 = 0,iRet2 = 0,iRet3 = 0; + iRet0 = system("gpio mode 1 out"); + iRet1 = system("gpio mode 4 out"); + iRet2 = system("gpio mode 5 out"); + iRet3 = system("gpio write 1 1");//上电 - system("gpio write 1 1");//�豸�ϵ� - qDebug() << "gpio write 1 1......" << endl; + qDebug() << "gpio 1;4;5; ready"<<" Ret:"<< iRet0<< iRet1<< iRet2<< endl; + qDebug() << "gpio write 1 1......" <<" Ret:"<< iRet3<< endl; // QString qstrCMD_A, qstrCMD_B, qstrCMD_Temp; // qstrCMD_Temp = QString::fromStdString("4"); @@ -86,18 +86,21 @@ int main(int argc, char *argv[]) m_scConfiggerLoader.GetParams(m_struRuntimeParams, m_struEC, m_struMEC, m_struHumitureDI); m_sTimer.SetAcqTimeParams(m_struRuntimeParams.atsParams); - m_dfpSaver.SetEnvironmentContex(m_struEC); - m_dfpSaver.SetManmadeEnviromentalContext(m_struMEC); - m_mduUploader.SetContext(m_struEC, m_struMEC); + //m_mduUploader.SetContext(m_struEC, m_struMEC); //m_mduUploader.Initialize(); m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //////////////////////////////////////////////////////////////////////////prepare m_sTimer.Preheating(); m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); + m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); m_struEC.qstrCaseTemperature= QString("%1").arg(m_fChassisTemp); m_struEC.qstrCaseHumidity = QString("%1").arg(m_fChassisHum); + + m_dfpSaver.SetEnvironmentContex(m_struEC); + m_dfpSaver.SetManmadeEnviromentalContext(m_struMEC); + m_mduUploader.SetContext(m_struEC, m_struMEC); ////////////////////////////////////////////////////////////////////////// QThread* m_pqDataGrabberThreadHolder = new QThread(); QThread* m_pqTimerThreadHolder = new QThread(); @@ -123,9 +126,6 @@ int main(int argc, char *argv[]) m_mdgGrabber.Init_Self(); m_sTimer.SelfStart(); - - - //////////////////////////////////////////////////////////////////////////test // DataFileProcessor testdp; // ZZ_SysConfigger test; @@ -210,8 +210,6 @@ int main(int argc, char *argv[]) // qfCalFile.read((char*)OneFile.fWaveLength, sizeof(double)*OneFile.iPixels); // qfCalFile.read((char*)OneFile.dCal_Gain, sizeof(double)*OneFile.iPixels); // qfCalFile.read((char*)OneFile.dCal_Offset, sizeof(double)*OneFile.iPixels); - - ////////////////////////////////////////////////////////////////////////// return a.exec(); diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index a65f71c..f451e66 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -504,7 +504,7 @@ int CMainDataGrabber::GrabOnceFinished() { if (m_struLinearShutterContext.ucProtocolType == 100) { - if (i==0) + if (/*i==0*/i%2==0) { qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelA); qstrCMD_A = "gpio write " + qstrCMD_Temp + " 1"; @@ -520,7 +520,7 @@ int CMainDataGrabber::GrabOnceFinished() Delay_MSec(500); } - if (i==1) + else if (/*i==1*/i%2==1) { qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelA); qstrCMD_A = "gpio write " + qstrCMD_Temp + " 0"; @@ -634,6 +634,8 @@ int CMainDataGrabber::GrabOnceFinished() m_pmduUploader->SetData(vecData); emit SignalPushOneDataFrame(); m_pdfpSaver->SetData(vecData); + + qDebug() << "Thread Data Server: WriteDataFile Called"; m_pdfpSaver->WriteDataFile(); m_iFlagIsCapturing = 0; diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index 668e52b..41e17a7 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -25,6 +25,7 @@ void Scheduler::SetAcqTimeParams(AcqTimeSettings struAcqTime) void Scheduler::Preheating() { qDebug() << "Start Preheating"; + //QThread::msleep(5000); #ifdef _DEBUG QThread::msleep(5000); #else diff --git a/source/FS/DataFileProcessor.cpp b/source/FS/DataFileProcessor.cpp index f635483..b759bcb 100644 --- a/source/FS/DataFileProcessor.cpp +++ b/source/FS/DataFileProcessor.cpp @@ -37,9 +37,16 @@ void DataFileProcessor::SetData(std::vector> vecData) bool DataFileProcessor::WriteDataFile() { + //qDebug() << "start Thread Data Server GenerateFilePath"; GenerateFilePath(); + + //qDebug() << "start Thread Data Server WriteEnvironmentInfo"; WriteEnvironmentInfo(); + + //qDebug() << "start Thread Data Server WriteDeviceInfo"; WriteDeviceInfo(); + + //qDebug() << "start Thread Data Server WriteData"; WriteData(); return 1; } diff --git a/source/LinearShutter/VSMD12XControl.cpp b/source/LinearShutter/VSMD12XControl.cpp index 9b6f1ea..b53f9f7 100644 --- a/source/LinearShutter/VSMD12XControl.cpp +++ b/source/LinearShutter/VSMD12XControl.cpp @@ -222,7 +222,7 @@ bool CVSMD12XControl::InitController() bool CVSMD12XControl::GetStatus(MSInfo &stuMotorParam) { - std::string strCMD = "cts\n"; + std::string strCMD = "sts\n"; if (m_iProtocolType) { @@ -1432,7 +1432,7 @@ bool CVSMD12XControl::IsMotionFinished() QThread::msleep(200); //Delay_MSec(200); GetStatus(m_stuMSInfo); - ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x00FFFFFF; ucFlag = ucFlag & 0x10; if (m_stuMSInfo.fVelocity == 0) { @@ -1445,15 +1445,21 @@ bool CVSMD12XControl::IsMotionFinished() } if (iCountStopped>=50) { + QString str = QString("%1").arg(m_stuMSInfo.uiFlags, 30, 2, QChar('0')); qDebug() <<"Warning.Motion Err,should be stopped already.checking register and retry..."; - qDebug() <<"motion status:"<1000) { - qDebug() << "Err.Motor Hardware Err,should be stopped already"; - qDebug() << "motion status:" << ucFlag << "all status:" << QString::number(m_stuMSInfo.uiFlags, 2); + QString str = QString("%1").arg(m_stuMSInfo.uiFlags, 30, 2, QChar('0')); + qDebug() << "Warning.Motion Err,should be stopped already.checking register and retry..."; + qDebug() << "velocity:" << m_stuMSInfo.fVelocity; + qDebug() << "position:" << m_stuMSInfo.iPosition; + qDebug() << "motion status:" << ucFlag << "all status:" << str; bFlagIsStopped = true; return false; } From 29b40826a04aa73934c3e9883788dce5631057cf Mon Sep 17 00:00:00 2001 From: xin Date: Wed, 21 Aug 2024 16:59:41 +0800 Subject: [PATCH 48/53] =?UTF-8?q?=E7=BB=8F=E5=BA=A6=E7=BB=99=E6=94=B9?= =?UTF-8?q?=E4=BD=8D=E7=BB=B4=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- root/Mywathdog.sh | 7 ++++--- root/start.sh | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/root/Mywathdog.sh b/root/Mywathdog.sh index e4a269e..fa13e97 100644 --- a/root/Mywathdog.sh +++ b/root/Mywathdog.sh @@ -15,13 +15,14 @@ do sleep 60 fi else - ps -ef | grep "TowerOptoSifAndSpectral" | grep -v "grep" - if [ "$?" -eq 1 ] + pid=$(ps -ef | grep "TowerOptoSifAndSpectral" | grep -v "grep" | awk '{print $2}') + if [ -z "$pid" ] then sleep 60 else + echo "$?" echo "time to kill the task" > /home/data/log.txt - pkill TowerOptoSifAndSpectral + kill "$pid" fi fi sleep 30 diff --git a/root/start.sh b/root/start.sh index d8d05db..edec3bb 100644 --- a/root/start.sh +++ b/root/start.sh @@ -3,6 +3,7 @@ chmod +x /root/filebrew/filebrowser chmod +x /root/frp_0.34.3_linux_arm/frpc chmod +x /root/ffwatch.sh /root/ffwatch.sh & +mount /dev/mmcblk1p1 /home/data/ chmod +x /root/Mywathdog.sh bash /root/Mywathdog.sh & From c99ba84638e61b98ba8238848f7f7a65de4fe868 Mon Sep 17 00:00:00 2001 From: "DESKTOP-4HD0KC3\\ZhangZhuo" <735056338@qq.com> Date: Wed, 30 Oct 2024 17:00:12 +0800 Subject: [PATCH 49/53] =?UTF-8?q?=E5=BC=A0=E5=8D=93=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=B2=A1=E6=8F=90=E4=BA=A4=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeSettings.json | 12 ++--- CmakeLists.txt | 3 +- main.cpp | 5 +- source/CaptureThread/MainDataGrabber.cpp | 21 +++++--- source/CaptureThread/MainDataGrabber.h | 1 + source/CaptureThread/Scheduler.cpp | 2 +- source/FS/ATPControl_Serial_QT.cpp | 64 ++++++++++++++++++++++-- source/FS/ATPControl_Serial_QT.h | 2 + 8 files changed, 90 insertions(+), 20 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index 95624be..19e498b 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -2,22 +2,22 @@ "configurations": [ { "name": "Linux-GCC-Debug", - "generator": "Unix Makefiles", - "configurationType": "Release", - "cmakeExecutable": "/opt/cmake/bin/cmake", + "generator": "Ninja", + "configurationType": "Debug", + "cmakeExecutable": "/zz/cmake-3.29.3/bin/cmake", "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ], "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "linux_arm" ], - "intelliSenseMode": "linux-gcc-x64", - "remoteMachineName": "437198504;172.16.0.96 (username=root, port=22, authentication=Password)", + "remoteMachineName": "-1273990714;172.16.0.61 (username=root, port=22, authentication=Password)", "remoteCMakeListsRoot": "/home/pi/SIF0/src", "remoteBuildRoot": "/home/pi/SIF0/out/build_d/${name}", "remoteInstallRoot": "/home/pi/SIF0/out/install/${name}", "remoteCopySources": true, "rsyncCommandArgs": "-t --delete --delete-excluded", "remoteCopyBuildOutput": true, - "remoteCopySourcesMethod": "rsync" + "remoteCopySourcesMethod": "rsync", + "remoteCopyUseCompilerDefaults": false }, { "name": "x64-Debug", diff --git a/CmakeLists.txt b/CmakeLists.txt index 222618c..d7dbd03 100644 --- a/CmakeLists.txt +++ b/CmakeLists.txt @@ -1,5 +1,4 @@ -cmake_minimum_required(VERSION 3.3) - +cmake_minimum_required(VERSION 3.5) project(TowerOptoSifAndSpectral) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/main.cpp b/main.cpp index 226dee1..1e23023 100644 --- a/main.cpp +++ b/main.cpp @@ -23,6 +23,9 @@ int main(int argc, char *argv[]) //////////////////////////////////////////////////////////////////////////// //system("gpio mode 1 output");//������ų�ʼ�� //qDebug() << "gpio mode 1 output......" << endl; + // + //ZZ_ATPControl_Serial_Qt test; + //test.Initialize(0, "/dev/ttyS1", "2223344"); ////////////////////////////////////////////////////////////////////////// //// GY39Controller m_ctrlHumitureDetector; @@ -91,7 +94,7 @@ int main(int argc, char *argv[]) //m_mduUploader.Initialize(); m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //////////////////////////////////////////////////////////////////////////prepare - m_sTimer.Preheating(); + //m_sTimer.Preheating(); m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index f451e66..4c4d653 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -7,6 +7,7 @@ CMainDataGrabber::CMainDataGrabber(QObject* parent /*= nullptr*/) //m_GrabTimer = new QTimer(this); + m_iFlagIsWorkingTime = 1; m_iFlagIsCapturing = false; m_iFlagIsCapturing_Signal = false; m_iFlagIsCapturing_Dark = false; @@ -459,6 +460,8 @@ int CMainDataGrabber::GrabOnceFinished() int CMainDataGrabber::OnTimeCounter() { + m_iFlagIsWorkingTime = 1; + bool bRes; QString qstrCMD_A,qstrCMD_B,qstrCMD_Temp; @@ -630,13 +633,16 @@ int CMainDataGrabber::GrabOnceFinished() //vecData[i].push_back(); } - //emit SignalPushOneDataFrame(vecData); - m_pmduUploader->SetData(vecData); - emit SignalPushOneDataFrame(); - m_pdfpSaver->SetData(vecData); + if (m_iFlagIsWorkingTime) + { + //emit SignalPushOneDataFrame(vecData); + m_pmduUploader->SetData(vecData); + emit SignalPushOneDataFrame(); + m_pdfpSaver->SetData(vecData); + qDebug() << "Thread Data Server: WriteDataFile Called"; + m_pdfpSaver->WriteDataFile(); + } - qDebug() << "Thread Data Server: WriteDataFile Called"; - m_pdfpSaver->WriteDataFile(); m_iFlagIsCapturing = 0; // qDebug() << "-------------------------------------------busy" << QTime::currentTime().toString(); @@ -681,6 +687,9 @@ int CMainDataGrabber::GrabOnceFinished() int CMainDataGrabber::OnZeroHoldCurrent() { + /// + m_iFlagIsWorkingTime = 0; + /// bool bRes = m_ctrlLS.SetHoldCurrent(0); if (!bRes) { diff --git a/source/CaptureThread/MainDataGrabber.h b/source/CaptureThread/MainDataGrabber.h index 856f7be..ee4f316 100644 --- a/source/CaptureThread/MainDataGrabber.h +++ b/source/CaptureThread/MainDataGrabber.h @@ -28,6 +28,7 @@ private: int m_iTotalThreads; + int m_iFlagIsWorkingTime; int m_iFlagIsCapturing; int m_iFlagIsCapturing_Signal; int m_iFlagIsCapturing_Dark; diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index 41e17a7..ddfc68a 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -29,7 +29,7 @@ void Scheduler::Preheating() #ifdef _DEBUG QThread::msleep(5000); #else - QThread::msleep(900000);//NEED TO CHANGE BEFOR HAND TO CUSTOM + QThread::msleep(900000);//NEED TO CHANGE BEFOR HAND TO CUSTOMER #endif qDebug() << "Preheating Finished"; } diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index 4ca227a..6fc07fe 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -43,14 +43,16 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe //connect(this, &ZZ_ATPControl_Serial_Qt::SignalInit_Self, this, &ZZ_ATPControl_Serial_Qt::Init_Self); //emit SignalInit_Self(); - QString qstrPortName = QString::fromStdString(ucPortNumber); + qstrInitPortName = QString::fromStdString(ucPortNumber); + qstrInitDeviceSN = QString::fromStdString(strDeviceName); - m_pSerialPort->setPortName(qstrPortName); + m_pSerialPort->setPortName(qstrInitPortName); m_pSerialPort->setReadBufferSize(512); bool bRes = m_pSerialPort->setBaudRate(m_iBaudRate); if (!bRes) { - qDebug() << "Err:setBaudRate Failed.Exit Code:1"; + qDebug() << "FS Err:setBaudRate Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; //std::cout << "Err.setBaudRate Failed" << std::endl; return 1; } @@ -58,7 +60,8 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe bRes = m_pSerialPort->open(QIODevice::ReadWrite); if (!bRes) { - qDebug() << "Err:open Failed.Exit Code:2"; + qDebug() << "FS Err:open Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; //std::cout << "Err.open Failed" << std::endl; return 2; } @@ -78,6 +81,7 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe if (szPostion == std::string::npos) { qDebug() << "Err:FS serial number not match.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } else @@ -102,18 +106,21 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceInfo(DeviceInfo &Info) if (iRes != 0) { qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } m_diDeviceInfo.strPN = qbRecv.data(); @@ -125,18 +132,21 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceInfo(DeviceInfo &Info) if (iRes != 0) { qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } m_diDeviceInfo.strSN = qbRecv.data(); @@ -157,18 +167,21 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } m_daDeviceAttr.iMinIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; @@ -180,18 +193,21 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } m_daDeviceAttr.iMaxIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; @@ -204,12 +220,14 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SetExposureTime error.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; //return 2; } iRes = SingleShot(m_daDeviceAttr.iPixels); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SingleShot error.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } @@ -225,18 +243,21 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } float fWaveLengthCoef[4]; @@ -269,18 +290,21 @@ int ZZ_ATPControl_Serial_Qt::SetAvgTimes(int iTimes /*= 1*/) if (iRes != 0) { qDebug() << "Err:SetAvgTimes Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:SetAvgTimes Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:SetAvgTimes Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } return 0; @@ -299,18 +323,21 @@ int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init() if (iRes != 0) { qDebug() << "Err:GetExposureTime Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetExposureTime Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetExposureTime Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } @@ -343,6 +370,7 @@ int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand) if (qi64Write != qbSend.size()) { qDebug() << "Err:write Failed.Exit Code:1" << qi64Write; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } @@ -365,6 +393,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) if (iCounter > 150) { qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iCounter++; @@ -373,6 +402,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) if ((ZZ_U8)qbData[0] != (ZZ_U8)0xaa || (ZZ_U8)qbData[1] != (ZZ_U8)0x55) { qDebug() << "Err:RecvData Failed,Wrong Header.Exit Code:2" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } @@ -386,6 +416,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) if (iCounter > 200) { qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } iCounter++; @@ -406,6 +437,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) if ((ZZ_U8)usCheckSum != ucTemp) { qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; //qbData.clear(); //return 4; return 0; @@ -429,6 +461,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { qDebug() << "Err:RecvData_ShortLag Failed,Not Enough Data.Exit Code:1" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iCounter++; @@ -437,6 +470,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if ((ZZ_U8)qbData[0] != (ZZ_U8)0xaa || (ZZ_U8)qbData[1] != (ZZ_U8)0x55) { qDebug() << "Err:RecvData_ShortLag Failed,Wrong Header.Exit Code:2" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } @@ -450,6 +484,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { qDebug() << "Err:RecvData_ShortLag Failed,Incomplete Data.Exit Code:3" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } iCounter++; @@ -470,6 +505,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if ((ZZ_U8)usCheckSum != ucTemp) { qDebug() << "Err:RecvData_ShortLag Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; //qbData.clear(); //return 4; return 0; @@ -483,6 +519,7 @@ int ZZ_ATPControl_Serial_Qt::ParseData(QByteArray &qbData) if (qbData.size() < 6) { qDebug() << "Err:ParseData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } qbData.remove(0, 5); @@ -519,6 +556,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } @@ -544,6 +582,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } @@ -620,6 +659,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } bFlagIsOverMaxExposureTime = true; @@ -630,6 +670,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } } @@ -660,24 +701,28 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) if (iRes != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:4"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 4; } if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; /*m_pSerialPort->waitForReadyRead(5000); m_pSerialPort->clear();*/ //return 1; @@ -735,18 +780,21 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) if (iRes != 0) { qDebug() << "Err:SingleShot Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:SingleShot Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:SingleShot Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } @@ -755,6 +803,7 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SingleShot Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } else @@ -794,24 +843,28 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(int &iPixels) if (iRes != 0) { qDebug() << "Err:SingleShotP Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData(qbRecv); if (iRes != 0) { qDebug() << "Err:SingleShotP Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:SingleShot Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SingleShotP Failed.Exit Code:4"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 4; } else @@ -844,18 +897,21 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature) if (iRes != 0) { qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:1"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 1; } iRes = RecvData_ShortLag(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:2"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 2; } iRes = ParseData(qbRecv); if (iRes != 0) { qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:3"; + qDebug() << "FS Init Port:" << qstrInitPortName << "FS Init Dev SN :" << qstrInitDeviceSN; return 3; } diff --git a/source/FS/ATPControl_Serial_QT.h b/source/FS/ATPControl_Serial_QT.h index c6d91c8..32a7a15 100644 --- a/source/FS/ATPControl_Serial_QT.h +++ b/source/FS/ATPControl_Serial_QT.h @@ -70,6 +70,8 @@ public: #else // private: #endif + //init + QString qstrInitPortName,qstrInitDeviceSN; //port int m_iBaudRate; QSerialPort *m_pSerialPort; From 799a025529f1e654632e174483bafdc09e15c9db Mon Sep 17 00:00:00 2001 From: xin Date: Mon, 10 Mar 2025 09:55:18 +0800 Subject: [PATCH 50/53] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=B8=A9?= =?UTF-8?q?=E5=BA=A6=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + CmakeLists.txt | 4 +- .../project/CMakeLists.txt | 23 + .../TemperatureControler/project/tempmain.cpp | 17 + .../src/Temperature/TemperaTureWoker.cpp | 115 + .../src/Temperature/TemperaTureWoker.h | 31 + .../src/TimeWorker/TimeWorker.cpp | 137 + .../src/TimeWorker/TimeWorker.h | 54 + .../src/controler/controler.cpp | 5 + .../src/controler/controler.h | 16 + .../src/json/CommanSetting.h | 95 + .../TemperatureControler/src/json/logout.cpp | 117 + .../TemperatureControler/src/json/logout.h | 60 + .../TemperatureControler/src/json/logtext.h | 91 + .../src/json/nlohmann/adl_serializer.hpp | 55 + .../nlohmann/byte_container_with_subtype.hpp | 103 + .../src/json/nlohmann/detail/abi_macros.hpp | 100 + .../nlohmann/detail/conversions/from_json.hpp | 497 ++ .../nlohmann/detail/conversions/to_chars.hpp | 1118 ++++ .../nlohmann/detail/conversions/to_json.hpp | 446 ++ .../src/json/nlohmann/detail/exceptions.hpp | 258 + .../src/json/nlohmann/detail/hash.hpp | 129 + .../nlohmann/detail/input/binary_reader.hpp | 3010 ++++++++++ .../nlohmann/detail/input/input_adapters.hpp | 494 ++ .../json/nlohmann/detail/input/json_sax.hpp | 728 +++ .../src/json/nlohmann/detail/input/lexer.hpp | 1632 ++++++ .../src/json/nlohmann/detail/input/parser.hpp | 507 ++ .../json/nlohmann/detail/input/position_t.hpp | 37 + .../detail/iterators/internal_iterator.hpp | 35 + .../nlohmann/detail/iterators/iter_impl.hpp | 751 +++ .../detail/iterators/iteration_proxy.hpp | 242 + .../detail/iterators/iterator_traits.hpp | 61 + .../iterators/json_reverse_iterator.hpp | 130 + .../detail/iterators/primitive_iterator.hpp | 132 + .../detail/json_custom_base_class.hpp | 31 + .../src/json/nlohmann/detail/json_pointer.hpp | 988 ++++ .../src/json/nlohmann/detail/json_ref.hpp | 78 + .../src/json/nlohmann/detail/macro_scope.hpp | 469 ++ .../json/nlohmann/detail/macro_unscope.hpp | 44 + .../nlohmann/detail/meta/call_std/begin.hpp | 17 + .../nlohmann/detail/meta/call_std/end.hpp | 17 + .../json/nlohmann/detail/meta/cpp_future.hpp | 171 + .../json/nlohmann/detail/meta/detected.hpp | 70 + .../nlohmann/detail/meta/identity_tag.hpp | 21 + .../src/json/nlohmann/detail/meta/is_sax.hpp | 159 + .../src/json/nlohmann/detail/meta/std_fs.hpp | 29 + .../json/nlohmann/detail/meta/type_traits.hpp | 740 +++ .../src/json/nlohmann/detail/meta/void_t.hpp | 24 + .../nlohmann/detail/output/binary_writer.hpp | 1838 ++++++ .../detail/output/output_adapters.hpp | 147 + .../nlohmann/detail/output/serializer.hpp | 988 ++++ .../json/nlohmann/detail/string_concat.hpp | 146 + .../json/nlohmann/detail/string_escape.hpp | 72 + .../src/json/nlohmann/detail/value_t.hpp | 118 + .../src/json/nlohmann/json.hpp | 5220 +++++++++++++++++ .../src/json/nlohmann/json_fwd.hpp | 75 + .../src/json/nlohmann/ordered_map.hpp | 359 ++ .../nlohmann/thirdparty/hedley/hedley.hpp | 2045 +++++++ .../thirdparty/hedley/hedley_undef.hpp | 158 + .../TemperatureControler/tempreature.json | 25 + .../cmake-build-debug/CMakeCache.txt | 414 -- .../CMakeFiles/CMakeOutput.log | 472 -- .../CMakeFiles/TargetDirectories.txt | 4 - .../CMakeFiles/clion-environment.txt | 4 - .../CMakeFiles/cmake.check_cache | 1 - .../cmake-build-debug/Makefile | 402 -- .../cmake-build-debug/cmake_install.cmake | 49 - .../ocean_optics_calibration_console.cbp | 208 - 68 files changed, 25280 insertions(+), 1555 deletions(-) create mode 100644 othersoft/TemperatureControler/project/CMakeLists.txt create mode 100644 othersoft/TemperatureControler/project/tempmain.cpp create mode 100644 othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.cpp create mode 100644 othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.h create mode 100644 othersoft/TemperatureControler/src/TimeWorker/TimeWorker.cpp create mode 100644 othersoft/TemperatureControler/src/TimeWorker/TimeWorker.h create mode 100644 othersoft/TemperatureControler/src/controler/controler.cpp create mode 100644 othersoft/TemperatureControler/src/controler/controler.h create mode 100644 othersoft/TemperatureControler/src/json/CommanSetting.h create mode 100644 othersoft/TemperatureControler/src/json/logout.cpp create mode 100644 othersoft/TemperatureControler/src/json/logout.h create mode 100644 othersoft/TemperatureControler/src/json/logtext.h create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/adl_serializer.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/byte_container_with_subtype.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/abi_macros.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/from_json.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_chars.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_json.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/exceptions.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/hash.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/input/binary_reader.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/input/input_adapters.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/input/json_sax.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/input/lexer.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/input/parser.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/input/position_t.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/internal_iterator.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iter_impl.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iteration_proxy.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iterator_traits.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/json_reverse_iterator.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/primitive_iterator.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/json_custom_base_class.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/json_pointer.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/json_ref.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/macro_scope.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/macro_unscope.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/begin.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/end.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/cpp_future.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/detected.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/identity_tag.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/is_sax.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/std_fs.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/type_traits.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/meta/void_t.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/output/binary_writer.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/output/output_adapters.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/output/serializer.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/string_concat.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/string_escape.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/detail/value_t.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/json.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/json_fwd.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/ordered_map.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/thirdparty/hedley/hedley.hpp create mode 100644 othersoft/TemperatureControler/src/json/nlohmann/thirdparty/hedley/hedley_undef.hpp create mode 100644 othersoft/TemperatureControler/tempreature.json delete mode 100644 othersoft/calibration_console/cmake-build-debug/CMakeCache.txt delete mode 100644 othersoft/calibration_console/cmake-build-debug/CMakeFiles/CMakeOutput.log delete mode 100644 othersoft/calibration_console/cmake-build-debug/CMakeFiles/TargetDirectories.txt delete mode 100644 othersoft/calibration_console/cmake-build-debug/CMakeFiles/clion-environment.txt delete mode 100644 othersoft/calibration_console/cmake-build-debug/CMakeFiles/cmake.check_cache delete mode 100644 othersoft/calibration_console/cmake-build-debug/Makefile delete mode 100644 othersoft/calibration_console/cmake-build-debug/cmake_install.cmake delete mode 100644 othersoft/calibration_console/cmake-build-debug/ocean_optics_calibration_console.cbp diff --git a/.gitignore b/.gitignore index 0dac025..2c853fa 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ /othersoft/movingliner/cmake-build-debug/ /othersoft/movingliner/cmake-build-debug-toweris2/ /othersoft/movingliner/cmake-build-release/ +/othersoft/TemperatureControler/project/cmake-build-debug/ +/othersoft/calibration_console/cmake-build-debug/ diff --git a/CmakeLists.txt b/CmakeLists.txt index d7dbd03..9d93aed 100644 --- a/CmakeLists.txt +++ b/CmakeLists.txt @@ -5,7 +5,9 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(QT Core Network WebSockets SerialPort Widgets) set(CMAKE_CXX_STANDARD 14) - +IF (WIN32) +set(CMAKE_PREFIX_PATH "C:\\Qt\\Qt5.12.7\\5.12.7\\mingw73_64") +ENDIF () find_package(Qt5 REQUIRED ${QT}) diff --git a/othersoft/TemperatureControler/project/CMakeLists.txt b/othersoft/TemperatureControler/project/CMakeLists.txt new file mode 100644 index 0000000..1c70b4c --- /dev/null +++ b/othersoft/TemperatureControler/project/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.0) +project(TemperatureControler) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) +set(QT Core Gui Network WebSockets SerialPort Widgets) +set(CMAKE_CXX_STANDARD 14) +find_package(Qt5 REQUIRED ${QT}) +include_directories("../src/json") +include_directories("../src/TimeWorker") +include_directories("../src/Temperature") +include_directories("../src/controler") + +add_executable(TemperatureControler + tempmain.cpp + ../src/TimeWorker/TimeWorker.cpp + ../src/json/logout.cpp + ../src/Temperature/TemperaTureWoker.cpp + ../src/controler/controler.cpp + + ) + +qt5_use_modules(TemperatureControler ${QT}) \ No newline at end of file diff --git a/othersoft/TemperatureControler/project/tempmain.cpp b/othersoft/TemperatureControler/project/tempmain.cpp new file mode 100644 index 0000000..13c226f --- /dev/null +++ b/othersoft/TemperatureControler/project/tempmain.cpp @@ -0,0 +1,17 @@ +// +// Created by xin on 24-12-11. +// +#include +#include +#include +#include +int main(int argc, char* argv[]) +{ + QCoreApplication aaaaa(argc, argv); + std::cout<<"Hello World"; + TemperaTureWoker *pTemperaTureWoker = new TemperaTureWoker(); + + + + return aaaaa.exec(); +} \ No newline at end of file diff --git a/othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.cpp b/othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.cpp new file mode 100644 index 0000000..54367a2 --- /dev/null +++ b/othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.cpp @@ -0,0 +1,115 @@ +// +// Created by xin on 24-12-12. +// + +#include "TemperaTureWoker.h" +#include "fstream" +#include +#include +TemperaTureWoker::TemperaTureWoker() { + m_SerialPort = new QSerialPort(); + json jsonconfig; + std::ifstream i("/home/data/Setting/tempreature.json"); + //ÅжÏÎļþÊÇ·ñ´ò¿ª + if (!i.is_open()) + { + std::cout << "Error open file" << std::endl; + jsonconfig["portname"] = "ttyS2"; + jsonconfig["baudrate"] = 115200; + + + }else { + i >> jsonconfig; + if(jsonconfig.contains("portname")&&jsonconfig["portname"].is_string()) + { + + }else { + jsonconfig["portname"] = "ttyS2"; + } + if(jsonconfig.contains("baudrate")&&jsonconfig["baudrate"].is_number()) { + } + else { + jsonconfig["baudrate"] = 115200; + } + } + m_SerialPort->setPortName(jsonconfig["portname"].get().c_str()); + m_SerialPort->setBaudRate(jsonconfig["baudrate"].get()); + if (!m_SerialPort->open(QIODevice::ReadWrite)) + { + std::cout << "Error open serial port" << std::endl; + m_isInit = false; + return; + } + else { + std::cout << "Open serial port success" << std::endl; + m_isInit = true; + } + tempera_group temp1; + tempera_group temp2; + tempera_group temp3; + tempera_group temp4; + m_Tempreaturegroups.append(temp1); + m_Tempreaturegroups.append(temp2); + m_Tempreaturegroups.append(temp3); + m_Tempreaturegroups.append(temp4); + + + ReadTempreature(); + + + +} + +void TemperaTureWoker::ReadTempreature() { + if (m_isInit) { + m_SerialPort->write("{\"command\":\"get_temp\"}"); + m_SerialPort->waitForReadyRead(1000); + //QThread::msleep(100); + QByteArray data = m_SerialPort->read(1000); + int lenth = data.size(); + //QThread::msleep(100); + int lenthofnow=0; + while (lenthofnow != lenth) + { + lenthofnow = lenth; + m_SerialPort->waitForReadyRead(200); + data.append(m_SerialPort->readAll()); + lenth = data.size(); + //QThread::msleep(100); + } + + if (lenth==0) { + std::cout << "No data" << std::endl; + return; + } + std::cout << data.toStdString() << std::endl; + json jsondata = json::parse(data.toStdString()); + for (int j = 0; j < 4; ++j) { + if(jsondata.contains("Temperature"+std::to_string(j+1))) { + int number = jsondata["Temperature"+std::to_string(j+1)]["number"].get(); + for (int i = 1; i < number+1; ++i) { + QString index = "A"+QString::number(i); + float temp=jsondata["Temperature"+std::to_string(j+1)][index.toStdString()].get(); + m_Tempreaturegroups[j].tempera[i-1]=temp; + + } + + } + } + //´òÓ¡m_Tempreaturegroups + for (int i = 0; i < 4; ++i) { + std::cout << "Group " << i << ":\t|"; + for (int j = 0; j < 8; ++j) { + // ÉèÖÿí¶ÈΪ 10£¬Ê¹ÓÿոñÌî³ä£¬²¢Í¨¹ý std::internal ʵÏÖÊý×Ö¾ÓÖÐ + std::cout << std::setw(10) << std::setfill(' ') << std::internal + << m_Tempreaturegroups[i].tempera[j] << "\t|"; + } + std::cout << std::endl; + } + std::cout << std::endl; + + } else { + std::cout << "Serial port is not init" << std::endl; + + } +} diff --git a/othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.h b/othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.h new file mode 100644 index 0000000..abad97e --- /dev/null +++ b/othersoft/TemperatureControler/src/Temperature/TemperaTureWoker.h @@ -0,0 +1,31 @@ +// +// Created by xin on 24-12-12. +// + +#ifndef TEMPERATUREWOKER_H +#define TEMPERATUREWOKER_H +#include "QObject" +#include +#include +#include "nlohmann/json.hpp" +struct tempera_group +{ + float tempera[8]={0}; + +}; +using json = nlohmann::json; +class TemperaTureWoker:public QObject { + Q_OBJECT +public: + TemperaTureWoker(); + QList m_Tempreaturegroups; + void ReadTempreature(); + private: + QSerialPort *m_SerialPort; + bool m_isInit=false; + +}; + + + +#endif //TEMPERATUREWOKER_H diff --git a/othersoft/TemperatureControler/src/TimeWorker/TimeWorker.cpp b/othersoft/TemperatureControler/src/TimeWorker/TimeWorker.cpp new file mode 100644 index 0000000..6b4d20d --- /dev/null +++ b/othersoft/TemperatureControler/src/TimeWorker/TimeWorker.cpp @@ -0,0 +1,137 @@ +/** + ****************************************************************************** + * @file : TimeWorker.cpp + * @author : xin + * @brief : None + * @attention : None + * @date : 2023/4/11 + ****************************************************************************** + */ + +// +// Created by xin on 2023/4/11. +// + +#include "TimeWorker.h" +#include "logout.h" +#include "fstream" +#include "CommanSetting.h" +TimeWorker::TimeWorker() { + m_Timer=new QTimer(); + m_StartTime=QTime(8,0,0); + m_EndTime=QTime(20,0,0); + connect(m_Timer,SIGNAL(timeout()),this,SLOT(onTimerTrigger())); + + + +} + +void TimeWorker::SetTask(TaskToExec task) { + //m_Task=task; + m_TaskList.append(task); + isinit=true; + +} + +void TimeWorker::SetIntervalTime(long time) { + if (time>0) + m_IntervalTime=time; + else + m_IntervalTime=60000; + + + +} + +void TimeWorker::Start() { + + m_Timer->setInterval(m_IntervalTime); + m_Timer->start(); + onTimerTrigger(); +} + +void TimeWorker::Stop() { + + m_Timer->stop(); +} + +void TimeWorker::onTimerTrigger() { + + if (isinit) + { + QTime now=QTime::currentTime(); + + if (nowm_EndTime) + { + + logout("TimeWorker",ERRORSTR+"Time is not in work time"+COLORRESET,6); + logout("TimeWorker",ERRORSTR+"now is"+now.toString("hh:mm:ss")+ " StartTime is"+m_StartTime.toString("hh:mm:ss")+" EndTime is"+m_EndTime.toString("hh:mm:ss")+COLORRESET); + return; + } + if (m_isWork) + { + logout("TimeWorker","Task is working please waite",6); + return; + } + m_isWork=true; + logout("TimeWorker","Task is working"); + int taskid=0; + foreach (auto task, m_TaskList) { + task(); + logout("TimeWorker","Task "+QString::number(taskid)+" is finished",6); + taskid++; + } + + // logout("TimeWorker","Task is finished"); + m_isWork=false; + } + else + { + logout("TimeWorker","Task is not init",6); + } + +} + +void TimeWorker::SetWorkTime(QTime start, QTime end) { + m_StartTime=start; + m_EndTime=end; + + +} + +void TimeWorker::SetWorkTime(QString start, QString end) { + try + { + m_StartTime=QTime::fromString(start,"hh:mm:ss"); + m_EndTime=QTime::fromString(end,"hh:mm:ss"); + } + catch (...) + { + logout("TimeWorker","SetWorkTime error",6); + } + + + +} + +void TimeWorker::ReadjsonConfig(QString path) { +try + { + json j; + std::ifstream i(path.toStdString()); + i >> j; + if (j.contains("StartTime")&&j["StartTime"].is_string()) + m_StartTime=QTime::fromString(QString::fromStdString(j["StartTime"]),"hh:mm:ss"); + if(j.contains("EndTime")&&j["EndTime"].is_string()) + m_EndTime=QTime::fromString(QString::fromStdString(j["EndTime"]),"hh:mm:ss"); + if (j.contains("IntervalTime")&&j["IntervalTime"].is_number()) + SetIntervalTime(j["IntervalTime"].get()*1000); + logout("TimeWorker","ReadjsonConfig success: StartTime:"+m_StartTime.toString("hh:mm:ss")+" EndTime:"+m_EndTime.toString("hh:mm:ss")+" IntervalTime:"+QString::number(m_IntervalTime)+"ms",6); + + } + catch (...) + { + logout("TimeWorker","ReadjsonConfig error",6); + } + +} diff --git a/othersoft/TemperatureControler/src/TimeWorker/TimeWorker.h b/othersoft/TemperatureControler/src/TimeWorker/TimeWorker.h new file mode 100644 index 0000000..f05afad --- /dev/null +++ b/othersoft/TemperatureControler/src/TimeWorker/TimeWorker.h @@ -0,0 +1,54 @@ +/** + ****************************************************************************** + * @file : TimeWorker.h + * @author : xin + * @brief : None + * @attention : None + * @date : 2023/4/11 + ****************************************************************************** + */ + +// +// Created by xin on 2023/4/11. +// + +#ifndef ASDRADSTATION_TIMEWORKER_H +#define ASDRADSTATION_TIMEWORKER_H +#include "QObject" +#include "QTimer" +#include "QTime" +#include + +using json = nlohmann::json; +typedef bool (*TaskToExec)(); + +class TimeWorker : public QObject { + Q_OBJECT +public: + TimeWorker(); + void SetTask(TaskToExec task); + void SetIntervalTime(long time); + void Start(); + void Stop(); + void SetWorkTime(QTime start,QTime end); + void SetWorkTime(QString start,QString end); + void ReadjsonConfig(QString path); + +private: + + QList m_TaskList; + TaskToExec m_Task; + bool isinit=false; + bool m_isWork=false; + long m_IntervalTime=60000; //ms + QTimer *m_Timer; + QTime m_StartTime; + QTime m_EndTime; +public slots: + void onTimerTrigger(); + + +}; + + +#endif //ASDRADSTATION_TIMEWORKER_H diff --git a/othersoft/TemperatureControler/src/controler/controler.cpp b/othersoft/TemperatureControler/src/controler/controler.cpp new file mode 100644 index 0000000..2dc3c85 --- /dev/null +++ b/othersoft/TemperatureControler/src/controler/controler.cpp @@ -0,0 +1,5 @@ +// +// Created by xin on 24-12-19. +// + +#include "controler.h" diff --git a/othersoft/TemperatureControler/src/controler/controler.h b/othersoft/TemperatureControler/src/controler/controler.h new file mode 100644 index 0000000..0a63bdf --- /dev/null +++ b/othersoft/TemperatureControler/src/controler/controler.h @@ -0,0 +1,16 @@ +// +// Created by xin on 24-12-19. +// + +#ifndef CONTROLER_H +#define CONTROLER_H + + + +class controler { + +}; + + + +#endif //CONTROLER_H diff --git a/othersoft/TemperatureControler/src/json/CommanSetting.h b/othersoft/TemperatureControler/src/json/CommanSetting.h new file mode 100644 index 0000000..1fa5f4a --- /dev/null +++ b/othersoft/TemperatureControler/src/json/CommanSetting.h @@ -0,0 +1,95 @@ +// +// Created by xin on 2023/4/6. +// + +#ifndef ASDRADSTATION_COMMANSETTING_H +#define ASDRADSTATION_COMMANSETTING_H + +#include "QString" + +typedef bool(*SwitchShutterFptr)(int point); +typedef bool (*SetTheStrechOutFptr)(bool isout,QString &tag); +typedef bool (*ActionWhenShutterMoveFptr)(bool param,QString &tag); +typedef bool (*ISgoodToDoSomething)(); +typedef void (*UpLoadDataFptr)(QString path); + + +enum ShutterPostion{ + DarkNoisePoint =0, + SKYPoint=1, + WhiteFlatPoint=2, + SunDrectRadiancePoint=3, + SunDrectIRRadiancePoint=4, + GroundObjectPoint=5, + + + +}; + + +; +const QString ERRORSTR("\033[0;31m"); +const QString COLORRESET("\033[0m"); + +struct SHUTTERPOSTIONStruct{ + int PiontNumber=0; + QString PointName; + QString ActionName="None"; + ActionWhenShutterMoveFptr ActionWhenShutterMoveFptrinit=nullptr; + long Position=0; +}; + + + + +struct StrLampheraData +{ + double *Plot; + double Value; + bool isinit; + int bandnumber; + StrLampheraData(){ + Plot = nullptr; + isinit = false; + bandnumber = 0; + } + ~StrLampheraData(){ + if (Plot!=nullptr) + { + delete[] Plot; + } + } +}; +//json å® è½¬ä¸ºjson +struct AirConditionerStat{ + float Tempreture=-10000; + float ZFTempreture=0; + float LNTempreture=0; + float TempretureOutSite=0; + float AlternatingVoltage=0; + float DirectVoltage=0; + float SpeedOfInsideFan=0; + float SpeedOfOutsideFan=0; + float Humidity=0; + + +}; +struct MultiWeatherStat{ + float Humidity=0; + float Temperature=0; + //噪声值 + float Noise=0; + //PM2.5 + float PM25=0; + //PM10 + float PM10=0; + //大气压值 KPA + float AirPressure=-10000; + //lux值32ä½ + uint32_t Lux=0; + +}; + +typedef AirConditionerStat (*GetStatofAirConditionFptr)(); +typedef MultiWeatherStat (*GetStatofMultiWeatherFptr)(); +#endif //ASDRADSTATION_COMMANSETTING_H diff --git a/othersoft/TemperatureControler/src/json/logout.cpp b/othersoft/TemperatureControler/src/json/logout.cpp new file mode 100644 index 0000000..9ca3b41 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/logout.cpp @@ -0,0 +1,117 @@ +#include "logout.h" +#include "iostream" +extern FILE *file=NULL; +#define _DEBUG +void (*pFunction)(QString message)= nullptr; +QString colorcode = "\033["; +QString lastdatestr=""; +int outputlevel = 2; +// +//void logout(QString str) +//{ +//#ifdef _DEBUG +// qDebug()<5) + { + if (pFunction!= nullptr) + { + pFunction(str); + } + + } + //return; + if (level > outputlevel) + { + return; + } + //QTextCodec *codec = QTextCodec::codecForName("GBK");//�޸������� + int colorint; + switch (level) + { + case 0: + { + + // return; + break; + } + case 1: + { + + qDebug() << "\033[32m";//��ɫ + break; + } + case 2: + { + + qDebug() << "\033[35m";//��ɫ + break; + } + case 3: + { + + qDebug() << "\033[31m";//��ɫ + break; + } + case 5: + { + qDebug() << "\033[36m"; + break; + } + default: + { + break; + } + } + //str=codec->toUnicode(str.toStdString().c_str()); + //qDebug() << str; + //qDebug() << "\033[0m"; + //std::cout<"; + std::fflush(stdout); + +} + +void setoutlevel(int level /*= 4*/) +{ + outputlevel = level; + +} + +void setfunc(void (*sendmassage1)(QString)) { + pFunction=sendmassage1; +} + +void writelogtofile(QString sender,QString qstr) +{ + QDateTime currentTime = QDateTime::currentDateTime(); + QString datestr=currentTime.toString("yyyy_MM_dd"); + if (lastdatestr!=datestr) + { + if (file!=NULL) + { + fclose(file); + file=NULL; + } + lastdatestr=datestr; + } + if (file==NULL) + { + QString path="/home/iris/log/"+currentTime.toString("yyyy_MM_dd")+".log"; + system("mkdir -p /home/iris/log"); + file=fopen(path.toStdString().c_str(),"a+"); + fprintf(file,"\n\n\n\nstart---------------------------------------------------------------------------------\n"); + } + + + fprintf(file,"%s %s: %s\n",currentTime.toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString().c_str(),sender.toStdString().c_str(),qstr.toStdString().c_str()); + fflush(file); +} \ No newline at end of file diff --git a/othersoft/TemperatureControler/src/json/logout.h b/othersoft/TemperatureControler/src/json/logout.h new file mode 100644 index 0000000..86bebd4 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/logout.h @@ -0,0 +1,60 @@ +#ifndef LOGOUT_H +#define LOGOUT_H +#include"qstring.h" +#include"qdebug.h" +#include "iostream" +#include +#include + + void Log(QString str, int level = 0); +void setoutlevel(int level = 4); +void setfunc(void (*sendmassage1)(QString message)); +void writelogtofile(QString sender,QString str); +template +void logout(T str) +{ +#ifdef DEBUG + QString qstr=QString(str); +// Log(qstr,3); + std::cout< +void logout(QString sender,T str,int level = 5) +{ + + + + const std::string red("\033[0;31m"); + const std::string green("\033[0;32m"); + const std::string yellow("\033[0;33m"); + const std::string blue("\033[0;34m"); + const std::string magenta("\033[0;35m"); + const std::string cyan("\033[0;36m"); + const std::string reset("\033[0m"); + + + QString qstr11=QString(str); +// Log(qstr,3); + QDateTime currentTime = QDateTime::currentDateTime(); + + std::cout< +#include +#include +#include "qmutex.h" +#include "QtMsgHandler" +//默认调试级别为warning,å³å°äºŽwarning级别的都ä¸ä¼šå†™å…¥æ—¥å¿—文件 +//åªæœ‰release版本的时候,æ‰ä¼šè¾“出到日志,debug版本正常输出到终端。 +namespace QT_LOG +{//默认文件åä¸ºå½“å‰æ—¶é—´å‘½åçš„log文件 + static int m_LogLevel = 1; + static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")); + QMutex m_LogMutex; + + void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) + { + if (type < m_LogLevel)//设置输出日志级别,å°äºŽè¯¥çº§åˆ«ï¼Œå°†ä¸ä¼šå†™å…¥æ—¥å¿—文件,默认是warning级别,å³debugä¿¡æ¯ä¸ä¼šå†™å…¥æ—¥å¿—文件 + { + return; + } + + QString log_info; + switch (type) + { + case QtDebugMsg: + log_info = QString("%1:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + break; + + case QtWarningMsg: + log_info = QString("%1[Warning]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + break; + + case QtCriticalMsg: + log_info = QString("%1[Critical]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + break; + + case QtFatalMsg: + log_info = QString("%1[Fatal]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + abort(); + } + + + + + + //为了线程安全 + m_LogMutex.lock(); + + QFile outFile(m_LogFile); + outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text); + QTextStream ts(&outFile); + ts << log_info << endl; + outFile.close(); + + m_LogMutex.unlock(); + } +//默认调试级别为warningåŠä»¥ä¸Šæ‰ä¼šå†™å…¥æ—¥å¿—文件,默认log文件å为程åºå¯åŠ¨æ—¶é—´å‘½åçš„log文件 + void logInit(QString logFile = "",int logLevel = 0) + { + +#ifndef DEBUG //实现debug版本的时候,输出到终端;release版本的时候输出到日志文件 + if ((logLevel < 0) || (logLevel > 3)) + { + m_LogLevel = 1; + } + else + { + m_LogLevel = logLevel; + } + + if (!logFile.isEmpty()) + { + m_LogFile = logFile+"/"+m_LogFile; + } + + qInstallMessageHandler(customMessageHandler); + //qInstallMsgHandler(customMessageHandler); +#endif + } +}; + + + +#endif //TOWERASD_LOGTEXT_H diff --git a/othersoft/TemperatureControler/src/json/nlohmann/adl_serializer.hpp b/othersoft/TemperatureControler/src/json/nlohmann/adl_serializer.hpp new file mode 100644 index 0000000..f77f944 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/adl_serializer.hpp @@ -0,0 +1,55 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// @sa https://json.nlohmann.me/api/adl_serializer/ +template +struct adl_serializer +{ + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j, TargetType& val) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), val))) + -> decltype(::nlohmann::from_json(std::forward(j), val), void()) + { + ::nlohmann::from_json(std::forward(j), val); + } + + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) + -> decltype(::nlohmann::from_json(std::forward(j), detail::identity_tag {})) + { + return ::nlohmann::from_json(std::forward(j), detail::identity_tag {}); + } + + /// @brief convert any value type to a JSON value + /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/ + template + static auto to_json(BasicJsonType& j, TargetType && val) noexcept( + noexcept(::nlohmann::to_json(j, std::forward(val)))) + -> decltype(::nlohmann::to_json(j, std::forward(val)), void()) + { + ::nlohmann::to_json(j, std::forward(val)); + } +}; + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/byte_container_with_subtype.hpp b/othersoft/TemperatureControler/src/json/nlohmann/byte_container_with_subtype.hpp new file mode 100644 index 0000000..1031cdc --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/byte_container_with_subtype.hpp @@ -0,0 +1,103 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // uint8_t, uint64_t +#include // tie +#include // move + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// @brief an internal type for a backed binary type +/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ +template +class byte_container_with_subtype : public BinaryType +{ + public: + using container_type = BinaryType; + using subtype_type = std::uint64_t; + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype() noexcept(noexcept(container_type())) + : container_type() + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) + : container_type(b) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b))) + : container_type(b) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + bool operator==(const byte_container_with_subtype& rhs) const + { + return std::tie(static_cast(*this), m_subtype, m_has_subtype) == + std::tie(static_cast(rhs), rhs.m_subtype, rhs.m_has_subtype); + } + + bool operator!=(const byte_container_with_subtype& rhs) const + { + return !(rhs == *this); + } + + /// @brief sets the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/ + void set_subtype(subtype_type subtype_) noexcept + { + m_subtype = subtype_; + m_has_subtype = true; + } + + /// @brief return the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/ + constexpr subtype_type subtype() const noexcept + { + return m_has_subtype ? m_subtype : static_cast(-1); + } + + /// @brief return whether the value has a subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/ + constexpr bool has_subtype() const noexcept + { + return m_has_subtype; + } + + /// @brief clears the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/ + void clear_subtype() noexcept + { + m_subtype = 0; + m_has_subtype = false; + } + + private: + subtype_type m_subtype = 0; + bool m_has_subtype = false; +}; + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/abi_macros.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/abi_macros.hpp new file mode 100644 index 0000000..0d3108d --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/abi_macros.hpp @@ -0,0 +1,100 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 2 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/from_json.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/from_json.hpp new file mode 100644 index 0000000..c6299aa --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/from_json.hpp @@ -0,0 +1,497 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +#include +#include +#include +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_null())) + { + JSON_THROW(type_error::create(302, concat("type must be null, but is ", j.type_name()), &j)); + } + n = nullptr; +} + +// overloads for basic_json template parameters +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < std::is_arithmetic::value&& + !std::is_same::value, + int > = 0 > +void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j)); + } +} + +template +inline void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) + { + JSON_THROW(type_error::create(302, concat("type must be boolean, but is ", j.type_name()), &j)); + } + b = *j.template get_ptr(); +} + +template +inline void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + s = *j.template get_ptr(); +} + +template < + typename BasicJsonType, typename StringType, + enable_if_t < + std::is_assignable::value + && is_detected_exact::value + && !std::is_same::value + && !is_json_ref::value, int > = 0 > +inline void from_json(const BasicJsonType& j, StringType& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + + s = *j.template get_ptr(); +} + +template +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +{ + get_arithmetic_value(j, val); +} + +template +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +{ + get_arithmetic_value(j, val); +} + +template +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +{ + get_arithmetic_value(j, val); +} + +#if !JSON_DISABLE_ENUM_SERIALIZATION +template::value, int> = 0> +inline void from_json(const BasicJsonType& j, EnumType& e) +{ + typename std::underlying_type::type val; + get_arithmetic_value(j, val); + e = static_cast(val); +} +#endif // JSON_DISABLE_ENUM_SERIALIZATION + +// forward_list doesn't have an insert method +template::value, int> = 0> +inline void from_json(const BasicJsonType& j, std::forward_list& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + l.clear(); + std::transform(j.rbegin(), j.rend(), + std::front_inserter(l), [](const BasicJsonType & i) + { + return i.template get(); + }); +} + +// valarray doesn't have an insert method +template::value, int> = 0> +inline void from_json(const BasicJsonType& j, std::valarray& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + l.resize(j.size()); + std::transform(j.begin(), j.end(), std::begin(l), + [](const BasicJsonType & elem) + { + return elem.template get(); + }); +} + +template +auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template +inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +{ + arr = *j.template get_ptr(); +} + +template +auto from_json_array_impl(const BasicJsonType& j, std::array& arr, + priority_tag<2> /*unused*/) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template::value, + int> = 0> +auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) +-> decltype( + arr.reserve(std::declval()), + j.template get(), + void()) +{ + using std::end; + + ConstructibleArrayType ret; + ret.reserve(j.size()); + std::transform(j.begin(), j.end(), + std::inserter(ret, end(ret)), [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template::value, + int> = 0> +inline void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) +{ + using std::end; + + ConstructibleArrayType ret; + std::transform( + j.begin(), j.end(), std::inserter(ret, end(ret)), + [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template < typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t < + is_constructible_array_type::value&& + !is_constructible_object_type::value&& + !is_constructible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) +-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), +j.template get(), +void()) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + + from_json_array_impl(j, arr, priority_tag<3> {}); +} + +template < typename BasicJsonType, typename T, std::size_t... Idx > +std::array from_json_inplace_array_impl(BasicJsonType&& j, + identity_tag> /*unused*/, index_sequence /*unused*/) +{ + return { { std::forward(j).at(Idx).template get()... } }; +} + +template < typename BasicJsonType, typename T, std::size_t N > +auto from_json(BasicJsonType&& j, identity_tag> tag) +-> decltype(from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + + return from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {}); +} + +template +inline void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) + { + JSON_THROW(type_error::create(302, concat("type must be binary, but is ", j.type_name()), &j)); + } + + bin = *j.template get_ptr(); +} + +template::value, int> = 0> +inline void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_object())) + { + JSON_THROW(type_error::create(302, concat("type must be object, but is ", j.type_name()), &j)); + } + + ConstructibleObjectType ret; + const auto* inner_object = j.template get_ptr(); + using value_type = typename ConstructibleObjectType::value_type; + std::transform( + inner_object->begin(), inner_object->end(), + std::inserter(ret, ret.begin()), + [](typename BasicJsonType::object_t::value_type const & p) + { + return value_type(p.first, p.second.template get()); + }); + obj = std::move(ret); +} + +// overload for arithmetic types, not chosen for basic_json template arguments +// (BooleanType, etc..); note: Is it really necessary to provide explicit +// overloads for boolean_t etc. in case of a custom BooleanType which is not +// an arithmetic type? +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < + std::is_arithmetic::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value, + int > = 0 > +inline void from_json(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::boolean: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j)); + } +} + +template +std::tuple from_json_tuple_impl_base(BasicJsonType&& j, index_sequence /*unused*/) +{ + return std::make_tuple(std::forward(j).at(Idx).template get()...); +} + +template < typename BasicJsonType, class A1, class A2 > +std::pair from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<0> /*unused*/) +{ + return {std::forward(j).at(0).template get(), + std::forward(j).at(1).template get()}; +} + +template +inline void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) +{ + p = from_json_tuple_impl(std::forward(j), identity_tag> {}, priority_tag<0> {}); +} + +template +std::tuple from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<2> /*unused*/) +{ + return from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +inline void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) +{ + t = from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +auto from_json(BasicJsonType&& j, TupleRelated&& t) +-> decltype(from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + + return from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {}); +} + +template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +inline void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +inline void from_json(const BasicJsonType& j, std::unordered_map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +inline void from_json(const BasicJsonType& j, std_fs::path& p) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + p = *j.template get_ptr(); +} +#endif + +struct from_json_fn +{ + template + auto operator()(const BasicJsonType& j, T&& val) const + noexcept(noexcept(from_json(j, std::forward(val)))) + -> decltype(from_json(j, std::forward(val))) + { + return from_json(j, std::forward(val)); + } +}; + +} // namespace detail + +#ifndef JSON_HAS_CPP_17 +/// namespace to hold default `from_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +#endif +JSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definitions-in-headers) + detail::static_const::value; +#ifndef JSON_HAS_CPP_17 +} // namespace +#endif + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_chars.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_chars.hpp new file mode 100644 index 0000000..febef93 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_chars.hpp @@ -0,0 +1,1118 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2009 Florian Loitsch +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // array +#include // signbit, isfinite +#include // intN_t, uintN_t +#include // memcpy, memmove +#include // numeric_limits +#include // conditional + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief implements the Grisu2 algorithm for binary to decimal floating-point +conversion. + +This implementation is a slightly modified version of the reference +implementation which may be obtained from +http://florian.loitsch.com/publications (bench.tar.gz). + +The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. + +For a detailed description of the algorithm see: + +[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with + Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming + Language Design and Implementation, PLDI 2010 +[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", + Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language + Design and Implementation, PLDI 1996 +*/ +namespace dtoa_impl +{ + +template +Target reinterpret_bits(const Source source) +{ + static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); + + Target target; + std::memcpy(&target, &source, sizeof(Source)); + return target; +} + +struct diyfp // f * 2^e +{ + static constexpr int kPrecision = 64; // = q + + std::uint64_t f = 0; + int e = 0; + + constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} + + /*! + @brief returns x - y + @pre x.e == y.e and x.f >= y.f + */ + static diyfp sub(const diyfp& x, const diyfp& y) noexcept + { + JSON_ASSERT(x.e == y.e); + JSON_ASSERT(x.f >= y.f); + + return {x.f - y.f, x.e}; + } + + /*! + @brief returns x * y + @note The result is rounded. (Only the upper q bits are returned.) + */ + static diyfp mul(const diyfp& x, const diyfp& y) noexcept + { + static_assert(kPrecision == 64, "internal error"); + + // Computes: + // f = round((x.f * y.f) / 2^q) + // e = x.e + y.e + q + + // Emulate the 64-bit * 64-bit multiplication: + // + // p = u * v + // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) + // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) + // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) + // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) + // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) + // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) + // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) + // + // (Since Q might be larger than 2^32 - 1) + // + // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) + // + // (Q_hi + H does not overflow a 64-bit int) + // + // = p_lo + 2^64 p_hi + + const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; + const std::uint64_t u_hi = x.f >> 32u; + const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; + const std::uint64_t v_hi = y.f >> 32u; + + const std::uint64_t p0 = u_lo * v_lo; + const std::uint64_t p1 = u_lo * v_hi; + const std::uint64_t p2 = u_hi * v_lo; + const std::uint64_t p3 = u_hi * v_hi; + + const std::uint64_t p0_hi = p0 >> 32u; + const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; + const std::uint64_t p1_hi = p1 >> 32u; + const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; + const std::uint64_t p2_hi = p2 >> 32u; + + std::uint64_t Q = p0_hi + p1_lo + p2_lo; + + // The full product might now be computed as + // + // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) + // p_lo = p0_lo + (Q << 32) + // + // But in this particular case here, the full p_lo is not required. + // Effectively we only need to add the highest bit in p_lo to p_hi (and + // Q_hi + 1 does not overflow). + + Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up + + const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); + + return {h, x.e + y.e + 64}; + } + + /*! + @brief normalize x such that the significand is >= 2^(q-1) + @pre x.f != 0 + */ + static diyfp normalize(diyfp x) noexcept + { + JSON_ASSERT(x.f != 0); + + while ((x.f >> 63u) == 0) + { + x.f <<= 1u; + x.e--; + } + + return x; + } + + /*! + @brief normalize x such that the result has the exponent E + @pre e >= x.e and the upper e - x.e bits of x.f must be zero. + */ + static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept + { + const int delta = x.e - target_exponent; + + JSON_ASSERT(delta >= 0); + JSON_ASSERT(((x.f << delta) >> delta) == x.f); + + return {x.f << delta, target_exponent}; + } +}; + +struct boundaries +{ + diyfp w; + diyfp minus; + diyfp plus; +}; + +/*! +Compute the (normalized) diyfp representing the input number 'value' and its +boundaries. + +@pre value must be finite and positive +*/ +template +boundaries compute_boundaries(FloatType value) +{ + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // Convert the IEEE representation into a diyfp. + // + // If v is denormal: + // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) + // If v is normalized: + // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) + + static_assert(std::numeric_limits::is_iec559, + "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); + + constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) + constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); + constexpr int kMinExp = 1 - kBias; + constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) + + using bits_type = typename std::conditional::type; + + const auto bits = static_cast(reinterpret_bits(value)); + const std::uint64_t E = bits >> (kPrecision - 1); + const std::uint64_t F = bits & (kHiddenBit - 1); + + const bool is_denormal = E == 0; + const diyfp v = is_denormal + ? diyfp(F, kMinExp) + : diyfp(F + kHiddenBit, static_cast(E) - kBias); + + // Compute the boundaries m- and m+ of the floating-point value + // v = f * 2^e. + // + // Determine v- and v+, the floating-point predecessor and successor if v, + // respectively. + // + // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) + // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) + // + // v+ = v + 2^e + // + // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ + // between m- and m+ round to v, regardless of how the input rounding + // algorithm breaks ties. + // + // ---+-------------+-------------+-------------+-------------+--- (A) + // v- m- v m+ v+ + // + // -----------------+------+------+-------------+-------------+--- (B) + // v- m- v m+ v+ + + const bool lower_boundary_is_closer = F == 0 && E > 1; + const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); + const diyfp m_minus = lower_boundary_is_closer + ? diyfp(4 * v.f - 1, v.e - 2) // (B) + : diyfp(2 * v.f - 1, v.e - 1); // (A) + + // Determine the normalized w+ = m+. + const diyfp w_plus = diyfp::normalize(m_plus); + + // Determine w- = m- such that e_(w-) = e_(w+). + const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); + + return {diyfp::normalize(v), w_minus, w_plus}; +} + +// Given normalized diyfp w, Grisu needs to find a (normalized) cached +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies +// within a certain range [alpha, gamma] (Definition 3.2 from [1]) +// +// alpha <= e = e_c + e_w + q <= gamma +// +// or +// +// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q +// <= f_c * f_w * 2^gamma +// +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies +// +// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma +// +// or +// +// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) +// +// The choice of (alpha,gamma) determines the size of the table and the form of +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well +// in practice: +// +// The idea is to cut the number c * w = f * 2^e into two parts, which can be +// processed independently: An integral part p1, and a fractional part p2: +// +// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e +// = (f div 2^-e) + (f mod 2^-e) * 2^e +// = p1 + p2 * 2^e +// +// The conversion of p1 into decimal form requires a series of divisions and +// modulos by (a power of) 10. These operations are faster for 32-bit than for +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be +// achieved by choosing +// +// -e >= 32 or e <= -32 := gamma +// +// In order to convert the fractional part +// +// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... +// +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits +// d[-i] are extracted in order: +// +// (10 * p2) div 2^-e = d[-1] +// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... +// +// The multiplication by 10 must not overflow. It is sufficient to choose +// +// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. +// +// Since p2 = f mod 2^-e < 2^-e, +// +// -e <= 60 or e >= -60 := alpha + +constexpr int kAlpha = -60; +constexpr int kGamma = -32; + +struct cached_power // c = f * 2^e ~= 10^k +{ + std::uint64_t f; + int e; + int k; +}; + +/*! +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c +satisfies (Definition 3.2 from [1]) + + alpha <= e_c + e + q <= gamma. +*/ +inline cached_power get_cached_power_for_binary_exponent(int e) +{ + // Now + // + // alpha <= e_c + e + q <= gamma (1) + // ==> f_c * 2^alpha <= c * 2^e * 2^q + // + // and since the c's are normalized, 2^(q-1) <= f_c, + // + // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) + // ==> 2^(alpha - e - 1) <= c + // + // If c were an exact power of ten, i.e. c = 10^k, one may determine k as + // + // k = ceil( log_10( 2^(alpha - e - 1) ) ) + // = ceil( (alpha - e - 1) * log_10(2) ) + // + // From the paper: + // "In theory the result of the procedure could be wrong since c is rounded, + // and the computation itself is approximated [...]. In practice, however, + // this simple function is sufficient." + // + // For IEEE double precision floating-point numbers converted into + // normalized diyfp's w = f * 2^e, with q = 64, + // + // e >= -1022 (min IEEE exponent) + // -52 (p - 1) + // -52 (p - 1, possibly normalize denormal IEEE numbers) + // -11 (normalize the diyfp) + // = -1137 + // + // and + // + // e <= +1023 (max IEEE exponent) + // -52 (p - 1) + // -11 (normalize the diyfp) + // = 960 + // + // This binary exponent range [-1137,960] results in a decimal exponent + // range [-307,324]. One does not need to store a cached power for each + // k in this range. For each such k it suffices to find a cached power + // such that the exponent of the product lies in [alpha,gamma]. + // This implies that the difference of the decimal exponents of adjacent + // table entries must be less than or equal to + // + // floor( (gamma - alpha) * log_10(2) ) = 8. + // + // (A smaller distance gamma-alpha would require a larger table.) + + // NB: + // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. + + constexpr int kCachedPowersMinDecExp = -300; + constexpr int kCachedPowersDecStep = 8; + + static constexpr std::array kCachedPowers = + { + { + { 0xAB70FE17C79AC6CA, -1060, -300 }, + { 0xFF77B1FCBEBCDC4F, -1034, -292 }, + { 0xBE5691EF416BD60C, -1007, -284 }, + { 0x8DD01FAD907FFC3C, -980, -276 }, + { 0xD3515C2831559A83, -954, -268 }, + { 0x9D71AC8FADA6C9B5, -927, -260 }, + { 0xEA9C227723EE8BCB, -901, -252 }, + { 0xAECC49914078536D, -874, -244 }, + { 0x823C12795DB6CE57, -847, -236 }, + { 0xC21094364DFB5637, -821, -228 }, + { 0x9096EA6F3848984F, -794, -220 }, + { 0xD77485CB25823AC7, -768, -212 }, + { 0xA086CFCD97BF97F4, -741, -204 }, + { 0xEF340A98172AACE5, -715, -196 }, + { 0xB23867FB2A35B28E, -688, -188 }, + { 0x84C8D4DFD2C63F3B, -661, -180 }, + { 0xC5DD44271AD3CDBA, -635, -172 }, + { 0x936B9FCEBB25C996, -608, -164 }, + { 0xDBAC6C247D62A584, -582, -156 }, + { 0xA3AB66580D5FDAF6, -555, -148 }, + { 0xF3E2F893DEC3F126, -529, -140 }, + { 0xB5B5ADA8AAFF80B8, -502, -132 }, + { 0x87625F056C7C4A8B, -475, -124 }, + { 0xC9BCFF6034C13053, -449, -116 }, + { 0x964E858C91BA2655, -422, -108 }, + { 0xDFF9772470297EBD, -396, -100 }, + { 0xA6DFBD9FB8E5B88F, -369, -92 }, + { 0xF8A95FCF88747D94, -343, -84 }, + { 0xB94470938FA89BCF, -316, -76 }, + { 0x8A08F0F8BF0F156B, -289, -68 }, + { 0xCDB02555653131B6, -263, -60 }, + { 0x993FE2C6D07B7FAC, -236, -52 }, + { 0xE45C10C42A2B3B06, -210, -44 }, + { 0xAA242499697392D3, -183, -36 }, + { 0xFD87B5F28300CA0E, -157, -28 }, + { 0xBCE5086492111AEB, -130, -20 }, + { 0x8CBCCC096F5088CC, -103, -12 }, + { 0xD1B71758E219652C, -77, -4 }, + { 0x9C40000000000000, -50, 4 }, + { 0xE8D4A51000000000, -24, 12 }, + { 0xAD78EBC5AC620000, 3, 20 }, + { 0x813F3978F8940984, 30, 28 }, + { 0xC097CE7BC90715B3, 56, 36 }, + { 0x8F7E32CE7BEA5C70, 83, 44 }, + { 0xD5D238A4ABE98068, 109, 52 }, + { 0x9F4F2726179A2245, 136, 60 }, + { 0xED63A231D4C4FB27, 162, 68 }, + { 0xB0DE65388CC8ADA8, 189, 76 }, + { 0x83C7088E1AAB65DB, 216, 84 }, + { 0xC45D1DF942711D9A, 242, 92 }, + { 0x924D692CA61BE758, 269, 100 }, + { 0xDA01EE641A708DEA, 295, 108 }, + { 0xA26DA3999AEF774A, 322, 116 }, + { 0xF209787BB47D6B85, 348, 124 }, + { 0xB454E4A179DD1877, 375, 132 }, + { 0x865B86925B9BC5C2, 402, 140 }, + { 0xC83553C5C8965D3D, 428, 148 }, + { 0x952AB45CFA97A0B3, 455, 156 }, + { 0xDE469FBD99A05FE3, 481, 164 }, + { 0xA59BC234DB398C25, 508, 172 }, + { 0xF6C69A72A3989F5C, 534, 180 }, + { 0xB7DCBF5354E9BECE, 561, 188 }, + { 0x88FCF317F22241E2, 588, 196 }, + { 0xCC20CE9BD35C78A5, 614, 204 }, + { 0x98165AF37B2153DF, 641, 212 }, + { 0xE2A0B5DC971F303A, 667, 220 }, + { 0xA8D9D1535CE3B396, 694, 228 }, + { 0xFB9B7CD9A4A7443C, 720, 236 }, + { 0xBB764C4CA7A44410, 747, 244 }, + { 0x8BAB8EEFB6409C1A, 774, 252 }, + { 0xD01FEF10A657842C, 800, 260 }, + { 0x9B10A4E5E9913129, 827, 268 }, + { 0xE7109BFBA19C0C9D, 853, 276 }, + { 0xAC2820D9623BF429, 880, 284 }, + { 0x80444B5E7AA7CF85, 907, 292 }, + { 0xBF21E44003ACDD2D, 933, 300 }, + { 0x8E679C2F5E44FF8F, 960, 308 }, + { 0xD433179D9C8CB841, 986, 316 }, + { 0x9E19DB92B4E31BA9, 1013, 324 }, + } + }; + + // This computation gives exactly the same results for k as + // k = ceil((kAlpha - e - 1) * 0.30102999566398114) + // for |e| <= 1500, but doesn't require floating-point operations. + // NB: log_10(2) ~= 78913 / 2^18 + JSON_ASSERT(e >= -1500); + JSON_ASSERT(e <= 1500); + const int f = kAlpha - e - 1; + const int k = (f * 78913) / (1 << 18) + static_cast(f > 0); + + const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; + JSON_ASSERT(index >= 0); + JSON_ASSERT(static_cast(index) < kCachedPowers.size()); + + const cached_power cached = kCachedPowers[static_cast(index)]; + JSON_ASSERT(kAlpha <= cached.e + e + 64); + JSON_ASSERT(kGamma >= cached.e + e + 64); + + return cached; +} + +/*! +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. +For n == 0, returns 1 and sets pow10 := 1. +*/ +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) +{ + // LCOV_EXCL_START + if (n >= 1000000000) + { + pow10 = 1000000000; + return 10; + } + // LCOV_EXCL_STOP + if (n >= 100000000) + { + pow10 = 100000000; + return 9; + } + if (n >= 10000000) + { + pow10 = 10000000; + return 8; + } + if (n >= 1000000) + { + pow10 = 1000000; + return 7; + } + if (n >= 100000) + { + pow10 = 100000; + return 6; + } + if (n >= 10000) + { + pow10 = 10000; + return 5; + } + if (n >= 1000) + { + pow10 = 1000; + return 4; + } + if (n >= 100) + { + pow10 = 100; + return 3; + } + if (n >= 10) + { + pow10 = 10; + return 2; + } + + pow10 = 1; + return 1; +} + +inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, + std::uint64_t rest, std::uint64_t ten_k) +{ + JSON_ASSERT(len >= 1); + JSON_ASSERT(dist <= delta); + JSON_ASSERT(rest <= delta); + JSON_ASSERT(ten_k > 0); + + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // ten_k + // <------> + // <---- rest ----> + // --------------[------------------+----+--------------]-------------- + // w V + // = buf * 10^k + // + // ten_k represents a unit-in-the-last-place in the decimal representation + // stored in buf. + // Decrement buf by ten_k while this takes buf closer to w. + + // The tests are written in this order to avoid overflow in unsigned + // integer arithmetic. + + while (rest < dist + && delta - rest >= ten_k + && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) + { + JSON_ASSERT(buf[len - 1] != '0'); + buf[len - 1]--; + rest += ten_k; + } +} + +/*! +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. +M- and M+ must be normalized and share the same exponent -60 <= e <= -32. +*/ +inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, + diyfp M_minus, diyfp w, diyfp M_plus) +{ + static_assert(kAlpha >= -60, "internal error"); + static_assert(kGamma <= -32, "internal error"); + + // Generates the digits (and the exponent) of a decimal floating-point + // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's + // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. + // + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // Grisu2 generates the digits of M+ from left to right and stops as soon as + // V is in [M-,M+]. + + JSON_ASSERT(M_plus.e >= kAlpha); + JSON_ASSERT(M_plus.e <= kGamma); + + std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) + std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) + + // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): + // + // M+ = f * 2^e + // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e + // = ((p1 ) * 2^-e + (p2 )) * 2^e + // = p1 + p2 * 2^e + + const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); + + auto p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) + std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e + + // 1) + // + // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] + + JSON_ASSERT(p1 > 0); + + std::uint32_t pow10{}; + const int k = find_largest_pow10(p1, pow10); + + // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) + // + // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) + // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) + // + // M+ = p1 + p2 * 2^e + // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e + // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e + // = d[k-1] * 10^(k-1) + ( rest) * 2^e + // + // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) + // + // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] + // + // but stop as soon as + // + // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e + + int n = k; + while (n > 0) + { + // Invariants: + // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) + // pow10 = 10^(n-1) <= p1 < 10^n + // + const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) + const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) + // + // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e + // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) + // + p1 = r; + n--; + // + // M+ = buffer * 10^n + (p1 + p2 * 2^e) + // pow10 = 10^n + // + + // Now check if enough digits have been generated. + // Compute + // + // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e + // + // Note: + // Since rest and delta share the same exponent e, it suffices to + // compare the significands. + const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; + if (rest <= delta) + { + // V = buffer * 10^n, with M- <= V <= M+. + + decimal_exponent += n; + + // We may now just stop. But instead look if the buffer could be + // decremented to bring V closer to w. + // + // pow10 = 10^n is now 1 ulp in the decimal representation V. + // The rounding procedure works with diyfp's with an implicit + // exponent of e. + // + // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e + // + const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; + grisu2_round(buffer, length, dist, delta, rest, ten_n); + + return; + } + + pow10 /= 10; + // + // pow10 = 10^(n-1) <= p1 < 10^n + // Invariants restored. + } + + // 2) + // + // The digits of the integral part have been generated: + // + // M+ = d[k-1]...d[1]d[0] + p2 * 2^e + // = buffer + p2 * 2^e + // + // Now generate the digits of the fractional part p2 * 2^e. + // + // Note: + // No decimal point is generated: the exponent is adjusted instead. + // + // p2 actually represents the fraction + // + // p2 * 2^e + // = p2 / 2^-e + // = d[-1] / 10^1 + d[-2] / 10^2 + ... + // + // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) + // + // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m + // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) + // + // using + // + // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) + // = ( d) * 2^-e + ( r) + // + // or + // 10^m * p2 * 2^e = d + r * 2^e + // + // i.e. + // + // M+ = buffer + p2 * 2^e + // = buffer + 10^-m * (d + r * 2^e) + // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e + // + // and stop as soon as 10^-m * r * 2^e <= delta * 2^e + + JSON_ASSERT(p2 > delta); + + int m = 0; + for (;;) + { + // Invariant: + // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e + // = buffer * 10^-m + 10^-m * (p2 ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e + // + JSON_ASSERT(p2 <= (std::numeric_limits::max)() / 10); + p2 *= 10; + const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e + const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e + // + // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) + // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + p2 = r; + m++; + // + // M+ = buffer * 10^-m + 10^-m * p2 * 2^e + // Invariant restored. + + // Check if enough digits have been generated. + // + // 10^-m * p2 * 2^e <= delta * 2^e + // p2 * 2^e <= 10^m * delta * 2^e + // p2 <= 10^m * delta + delta *= 10; + dist *= 10; + if (p2 <= delta) + { + break; + } + } + + // V = buffer * 10^-m, with M- <= V <= M+. + + decimal_exponent -= m; + + // 1 ulp in the decimal representation is now 10^-m. + // Since delta and dist are now scaled by 10^m, we need to do the + // same with ulp in order to keep the units in sync. + // + // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e + // + const std::uint64_t ten_m = one.f; + grisu2_round(buffer, length, dist, delta, p2, ten_m); + + // By construction this algorithm generates the shortest possible decimal + // number (Loitsch, Theorem 6.2) which rounds back to w. + // For an input number of precision p, at least + // + // N = 1 + ceil(p * log_10(2)) + // + // decimal digits are sufficient to identify all binary floating-point + // numbers (Matula, "In-and-Out conversions"). + // This implies that the algorithm does not produce more than N decimal + // digits. + // + // N = 17 for p = 53 (IEEE double precision) + // N = 9 for p = 24 (IEEE single precision) +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +JSON_HEDLEY_NON_NULL(1) +inline void grisu2(char* buf, int& len, int& decimal_exponent, + diyfp m_minus, diyfp v, diyfp m_plus) +{ + JSON_ASSERT(m_plus.e == m_minus.e); + JSON_ASSERT(m_plus.e == v.e); + + // --------(-----------------------+-----------------------)-------- (A) + // m- v m+ + // + // --------------------(-----------+-----------------------)-------- (B) + // m- v m+ + // + // First scale v (and m- and m+) such that the exponent is in the range + // [alpha, gamma]. + + const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); + + const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k + + // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] + const diyfp w = diyfp::mul(v, c_minus_k); + const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); + const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); + + // ----(---+---)---------------(---+---)---------------(---+---)---- + // w- w w+ + // = c*m- = c*v = c*m+ + // + // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and + // w+ are now off by a small amount. + // In fact: + // + // w - v * 10^k < 1 ulp + // + // To account for this inaccuracy, add resp. subtract 1 ulp. + // + // --------+---[---------------(---+---)---------------]---+-------- + // w- M- w M+ w+ + // + // Now any number in [M-, M+] (bounds included) will round to w when input, + // regardless of how the input rounding algorithm breaks ties. + // + // And digit_gen generates the shortest possible such number in [M-, M+]. + // Note that this does not mean that Grisu2 always generates the shortest + // possible number in the interval (m-, m+). + const diyfp M_minus(w_minus.f + 1, w_minus.e); + const diyfp M_plus (w_plus.f - 1, w_plus.e ); + + decimal_exponent = -cached.k; // = -(-k) = k + + grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +template +JSON_HEDLEY_NON_NULL(1) +void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) +{ + static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, + "internal error: not enough precision"); + + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // If the neighbors (and boundaries) of 'value' are always computed for double-precision + // numbers, all float's can be recovered using strtod (and strtof). However, the resulting + // decimal representations are not exactly "short". + // + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) + // says "value is converted to a string as if by std::sprintf in the default ("C") locale" + // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars' + // does. + // On the other hand, the documentation for 'std::to_chars' requires that "parsing the + // representation using the corresponding std::from_chars function recovers value exactly". That + // indicates that single precision floating-point numbers should be recovered using + // 'std::strtof'. + // + // NB: If the neighbors are computed for single-precision numbers, there is a single float + // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision + // value is off by 1 ulp. +#if 0 + const boundaries w = compute_boundaries(static_cast(value)); +#else + const boundaries w = compute_boundaries(value); +#endif + + grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); +} + +/*! +@brief appends a decimal representation of e to buf +@return a pointer to the element following the exponent. +@pre -1000 < e < 1000 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* append_exponent(char* buf, int e) +{ + JSON_ASSERT(e > -1000); + JSON_ASSERT(e < 1000); + + if (e < 0) + { + e = -e; + *buf++ = '-'; + } + else + { + *buf++ = '+'; + } + + auto k = static_cast(e); + if (k < 10) + { + // Always print at least two digits in the exponent. + // This is for compatibility with printf("%g"). + *buf++ = '0'; + *buf++ = static_cast('0' + k); + } + else if (k < 100) + { + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + else + { + *buf++ = static_cast('0' + k / 100); + k %= 100; + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + + return buf; +} + +/*! +@brief prettify v = buf * 10^decimal_exponent + +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point +notation. Otherwise it will be printed in exponential notation. + +@pre min_exp < 0 +@pre max_exp > 0 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* format_buffer(char* buf, int len, int decimal_exponent, + int min_exp, int max_exp) +{ + JSON_ASSERT(min_exp < 0); + JSON_ASSERT(max_exp > 0); + + const int k = len; + const int n = len + decimal_exponent; + + // v = buf * 10^(n-k) + // k is the length of the buffer (number of decimal digits) + // n is the position of the decimal point relative to the start of the buffer. + + if (k <= n && n <= max_exp) + { + // digits[000] + // len <= max_exp + 2 + + std::memset(buf + k, '0', static_cast(n) - static_cast(k)); + // Make it look like a floating-point number (#362, #378) + buf[n + 0] = '.'; + buf[n + 1] = '0'; + return buf + (static_cast(n) + 2); + } + + if (0 < n && n <= max_exp) + { + // dig.its + // len <= max_digits10 + 1 + + JSON_ASSERT(k > n); + + std::memmove(buf + (static_cast(n) + 1), buf + n, static_cast(k) - static_cast(n)); + buf[n] = '.'; + return buf + (static_cast(k) + 1U); + } + + if (min_exp < n && n <= 0) + { + // 0.[000]digits + // len <= 2 + (-min_exp - 1) + max_digits10 + + std::memmove(buf + (2 + static_cast(-n)), buf, static_cast(k)); + buf[0] = '0'; + buf[1] = '.'; + std::memset(buf + 2, '0', static_cast(-n)); + return buf + (2U + static_cast(-n) + static_cast(k)); + } + + if (k == 1) + { + // dE+123 + // len <= 1 + 5 + + buf += 1; + } + else + { + // d.igitsE+123 + // len <= max_digits10 + 1 + 5 + + std::memmove(buf + 2, buf + 1, static_cast(k) - 1); + buf[1] = '.'; + buf += 1 + static_cast(k); + } + + *buf++ = 'e'; + return append_exponent(buf, n - 1); +} + +} // namespace dtoa_impl + +/*! +@brief generates a decimal representation of the floating-point number value in [first, last). + +The format of the resulting decimal representation is similar to printf's %g +format. Returns an iterator pointing past-the-end of the decimal representation. + +@note The input number must be finite, i.e. NaN's and Inf's are not supported. +@note The buffer must be large enough. +@note The result is NOT null-terminated. +*/ +template +JSON_HEDLEY_NON_NULL(1, 2) +JSON_HEDLEY_RETURNS_NON_NULL +char* to_chars(char* first, const char* last, FloatType value) +{ + static_cast(last); // maybe unused - fix warning + JSON_ASSERT(std::isfinite(value)); + + // Use signbit(value) instead of (value < 0) since signbit works for -0. + if (std::signbit(value)) + { + value = -value; + *first++ = '-'; + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (value == 0) // +-0 + { + *first++ = '0'; + // Make it look like a floating-point number (#362, #378) + *first++ = '.'; + *first++ = '0'; + return first; + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10); + + // Compute v = buffer * 10^decimal_exponent. + // The decimal digits are stored in the buffer, which needs to be interpreted + // as an unsigned decimal integer. + // len is the length of the buffer, i.e. the number of decimal digits. + int len = 0; + int decimal_exponent = 0; + dtoa_impl::grisu2(first, len, decimal_exponent, value); + + JSON_ASSERT(len <= std::numeric_limits::max_digits10); + + // Format the buffer like printf("%.*g", prec, value) + constexpr int kMinExp = -4; + // Use digits10 here to increase compatibility with version 2. + constexpr int kMaxExp = std::numeric_limits::digits10; + + JSON_ASSERT(last - first >= kMaxExp + 2); + JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10 + 6); + + return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_json.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_json.hpp new file mode 100644 index 0000000..b33d726 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/conversions/to_json.hpp @@ -0,0 +1,446 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // copy +#include // begin, end +#include // string +#include // tuple, get +#include // is_same, is_constructible, is_floating_point, is_enum, underlying_type +#include // move, forward, declval, pair +#include // valarray +#include // vector + +#include +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +////////////////// +// constructors // +////////////////// + +/* + * Note all external_constructor<>::construct functions need to call + * j.m_value.destroy(j.m_type) to avoid a memory leak in case j contains an + * allocated value (e.g., a string). See bug issue + * https://github.com/nlohmann/json/issues/2865 for more information. + */ + +template struct external_constructor; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::boolean; + j.m_value = b; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = s; + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = std::move(s); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleStringType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(b); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(std::move(b)); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_float; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_unsigned; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_integer; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = arr; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = std::move(arr); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleArrayType& arr) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value.array = j.template create(begin(arr), end(arr)); + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, const std::vector& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->reserve(arr.size()); + for (const bool x : arr) + { + j.m_value.array->push_back(x); + j.set_parent(j.m_value.array->back()); + } + j.assert_invariant(); + } + + template::value, int> = 0> + static void construct(BasicJsonType& j, const std::valarray& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->resize(arr.size()); + if (arr.size() > 0) + { + std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); + } + j.set_parents(); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = obj; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = std::move(obj); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < !std::is_same::value, int > = 0 > + static void construct(BasicJsonType& j, const CompatibleObjectType& obj) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value.object = j.template create(begin(obj), end(obj)); + j.set_parents(); + j.assert_invariant(); + } +}; + +///////////// +// to_json // +///////////// + +template::value, int> = 0> +inline void to_json(BasicJsonType& j, T b) noexcept +{ + external_constructor::construct(j, b); +} + +template < typename BasicJsonType, typename BoolRef, + enable_if_t < + ((std::is_same::reference, BoolRef>::value + && !std::is_same ::reference, typename BasicJsonType::boolean_t&>::value) + || (std::is_same::const_reference, BoolRef>::value + && !std::is_same ::const_reference>, + typename BasicJsonType::boolean_t >::value)) + && std::is_convertible::value, int > = 0 > +inline void to_json(BasicJsonType& j, const BoolRef& b) noexcept +{ + external_constructor::construct(j, static_cast(b)); +} + +template::value, int> = 0> +inline void to_json(BasicJsonType& j, const CompatibleString& s) +{ + external_constructor::construct(j, s); +} + +template +inline void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +{ + external_constructor::construct(j, std::move(s)); +} + +template::value, int> = 0> +inline void to_json(BasicJsonType& j, FloatType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +#if !JSON_DISABLE_ENUM_SERIALIZATION +template::value, int> = 0> +inline void to_json(BasicJsonType& j, EnumType e) noexcept +{ + using underlying_type = typename std::underlying_type::type; + external_constructor::construct(j, static_cast(e)); +} +#endif // JSON_DISABLE_ENUM_SERIALIZATION + +template +inline void to_json(BasicJsonType& j, const std::vector& e) +{ + external_constructor::construct(j, e); +} + +template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < is_compatible_array_type::value&& + !is_compatible_object_type::value&& + !is_compatible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +inline void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +{ + external_constructor::construct(j, arr); +} + +template +inline void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +{ + external_constructor::construct(j, bin); +} + +template::value, int> = 0> +inline void to_json(BasicJsonType& j, const std::valarray& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template +inline void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > +inline void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +{ + external_constructor::construct(j, obj); +} + +template +inline void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +{ + external_constructor::construct(j, std::move(obj)); +} + +template < + typename BasicJsonType, typename T, std::size_t N, + enable_if_t < !std::is_constructible::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + int > = 0 > +inline void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + external_constructor::construct(j, arr); +} + +template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > +inline void to_json(BasicJsonType& j, const std::pair& p) +{ + j = { p.first, p.second }; +} + +// for https://github.com/nlohmann/json/pull/1134 +template>::value, int> = 0> +inline void to_json(BasicJsonType& j, const T& b) +{ + j = { {b.key(), b.value()} }; +} + +template +inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) +{ + j = { std::get(t)... }; +} + +template::value, int > = 0> +inline void to_json(BasicJsonType& j, const T& t) +{ + to_json_tuple_impl(j, t, make_index_sequence::value> {}); +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +inline void to_json(BasicJsonType& j, const std_fs::path& p) +{ + j = p.string(); +} +#endif + +struct to_json_fn +{ + template + auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward(val)))) + -> decltype(to_json(j, std::forward(val)), void()) + { + return to_json(j, std::forward(val)); + } +}; +} // namespace detail + +#ifndef JSON_HAS_CPP_17 +/// namespace to hold default `to_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +#endif +JSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-in-headers) + detail::static_const::value; +#ifndef JSON_HAS_CPP_17 +} // namespace +#endif + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/exceptions.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/exceptions.hpp new file mode 100644 index 0000000..09ce541 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/exceptions.hpp @@ -0,0 +1,258 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +#include +#include +#include +#include +#include +#include +#include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +//////////////// +// exceptions // +//////////////// + +/// @brief general exception of the @ref basic_json class +/// @sa https://json.nlohmann.me/api/basic_json/exception/ +class exception : public std::exception +{ + public: + /// returns the explanatory string + const char* what() const noexcept override + { + return m.what(); + } + + /// the id of the exception + const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes) + + protected: + JSON_HEDLEY_NON_NULL(3) + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing) + + static std::string name(const std::string& ename, int id_) + { + return concat("[json.exception.", ename, '.', std::to_string(id_), "] "); + } + + static std::string diagnostics(std::nullptr_t /*leaf_element*/) + { + return ""; + } + + template + static std::string diagnostics(const BasicJsonType* leaf_element) + { +#if JSON_DIAGNOSTICS + std::vector tokens; + for (const auto* current = leaf_element; current != nullptr && current->m_parent != nullptr; current = current->m_parent) + { + switch (current->m_parent->type()) + { + case value_t::array: + { + for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) + { + if (¤t->m_parent->m_value.array->operator[](i) == current) + { + tokens.emplace_back(std::to_string(i)); + break; + } + } + break; + } + + case value_t::object: + { + for (const auto& element : *current->m_parent->m_value.object) + { + if (&element.second == current) + { + tokens.emplace_back(element.first.c_str()); + break; + } + } + break; + } + + case value_t::null: // LCOV_EXCL_LINE + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + break; // LCOV_EXCL_LINE + } + } + + if (tokens.empty()) + { + return ""; + } + + auto str = std::accumulate(tokens.rbegin(), tokens.rend(), std::string{}, + [](const std::string & a, const std::string & b) + { + return concat(a, '/', detail::escape(b)); + }); + return concat('(', str, ") "); +#else + static_cast(leaf_element); + return ""; +#endif + } + + private: + /// an exception object as storage for error messages + std::runtime_error m; +}; + +/// @brief exception indicating a parse error +/// @sa https://json.nlohmann.me/api/basic_json/parse_error/ +class parse_error : public exception +{ + public: + /*! + @brief create a parse error exception + @param[in] id_ the id of the exception + @param[in] pos the position where the error occurred (or with + chars_read_total=0 if the position cannot be + determined) + @param[in] what_arg the explanatory string + @return parse_error object + */ + template::value, int> = 0> + static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("parse_error", id_), "parse error", + position_string(pos), ": ", exception::diagnostics(context), what_arg); + return {id_, pos.chars_read_total, w.c_str()}; + } + + template::value, int> = 0> + static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("parse_error", id_), "parse error", + (byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""), + ": ", exception::diagnostics(context), what_arg); + return {id_, byte_, w.c_str()}; + } + + /*! + @brief byte index of the parse error + + The byte index of the last read character in the input file. + + @note For an input with n bytes, 1 is the index of the first character and + n+1 is the index of the terminating null byte or the end of file. + This also holds true when reading a byte vector (CBOR or MessagePack). + */ + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return concat(" at line ", std::to_string(pos.lines_read + 1), + ", column ", std::to_string(pos.chars_read_current_line)); + } +}; + +/// @brief exception indicating errors with iterators +/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/ +class invalid_iterator : public exception +{ + public: + template::value, int> = 0> + static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + invalid_iterator(int id_, const char* what_arg) + : exception(id_, what_arg) {} +}; + +/// @brief exception indicating executing a member function with a wrong type +/// @sa https://json.nlohmann.me/api/basic_json/type_error/ +class type_error : public exception +{ + public: + template::value, int> = 0> + static type_error create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating access out of the defined range +/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/ +class out_of_range : public exception +{ + public: + template::value, int> = 0> + static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating other library errors +/// @sa https://json.nlohmann.me/api/basic_json/other_error/ +class other_error : public exception +{ + public: + template::value, int> = 0> + static other_error create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/hash.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/hash.hpp new file mode 100644 index 0000000..3f05af8 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/hash.hpp @@ -0,0 +1,129 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // uint8_t +#include // size_t +#include // hash + +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// boost::hash_combine +inline std::size_t combine(std::size_t seed, std::size_t h) noexcept +{ + seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); + return seed; +} + +/*! +@brief hash a JSON value + +The hash function tries to rely on std::hash where possible. Furthermore, the +type of the JSON value is taken into account to have different hash values for +null, 0, 0U, and false, etc. + +@tparam BasicJsonType basic_json specialization +@param j JSON value to hash +@return hash value of j +*/ +template +std::size_t hash(const BasicJsonType& j) +{ + using string_t = typename BasicJsonType::string_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + const auto type = static_cast(j.type()); + switch (j.type()) + { + case BasicJsonType::value_t::null: + case BasicJsonType::value_t::discarded: + { + return combine(type, 0); + } + + case BasicJsonType::value_t::object: + { + auto seed = combine(type, j.size()); + for (const auto& element : j.items()) + { + const auto h = std::hash {}(element.key()); + seed = combine(seed, h); + seed = combine(seed, hash(element.value())); + } + return seed; + } + + case BasicJsonType::value_t::array: + { + auto seed = combine(type, j.size()); + for (const auto& element : j) + { + seed = combine(seed, hash(element)); + } + return seed; + } + + case BasicJsonType::value_t::string: + { + const auto h = std::hash {}(j.template get_ref()); + return combine(type, h); + } + + case BasicJsonType::value_t::boolean: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_integer: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_unsigned: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_float: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::binary: + { + auto seed = combine(type, j.get_binary().size()); + const auto h = std::hash {}(j.get_binary().has_subtype()); + seed = combine(seed, h); + seed = combine(seed, static_cast(j.get_binary().subtype())); + for (const auto byte : j.get_binary()) + { + seed = combine(seed, std::hash {}(byte)); + } + return seed; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE + } +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/input/binary_reader.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/binary_reader.hpp new file mode 100644 index 0000000..832c36d --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/binary_reader.hpp @@ -0,0 +1,3010 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // generate_n +#include // array +#include // ldexp +#include // size_t +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprintf +#include // memcpy +#include // back_inserter +#include // numeric_limits +#include // char_traits, string +#include // make_pair, move +#include // vector + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// how to treat CBOR tags +enum class cbor_tag_handler_t +{ + error, ///< throw a parse_error exception in case of a tag + ignore, ///< ignore tags + store ///< store tags as binary type +}; + +/*! +@brief determine system byte order + +@return true if and only if system's byte order is little endian + +@note from https://stackoverflow.com/a/1001328/266378 +*/ +static inline bool little_endianness(int num = 1) noexcept +{ + return *reinterpret_cast(&num) == 1; +} + + +/////////////////// +// binary reader // +/////////////////// + +/*! +@brief deserialization of CBOR, MessagePack, and UBJSON values +*/ +template> +class binary_reader +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using json_sax_t = SAX; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + /*! + @brief create a binary reader + + @param[in] adapter input adapter to read from + */ + explicit binary_reader(InputAdapterType&& adapter, const input_format_t format = input_format_t::json) noexcept : ia(std::move(adapter)), input_format(format) + { + (void)detail::is_sax_static_asserts {}; + } + + // make class move-only + binary_reader(const binary_reader&) = delete; + binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + binary_reader& operator=(const binary_reader&) = delete; + binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~binary_reader() = default; + + /*! + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor + @param[in] strict whether to expect the input to be consumed completed + @param[in] tag_handler how to treat CBOR tags + + @return whether parsing was successful + */ + JSON_HEDLEY_NON_NULL(3) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + sax = sax_; + bool result = false; + + switch (format) + { + case input_format_t::bson: + result = parse_bson_internal(); + break; + + case input_format_t::cbor: + result = parse_cbor_internal(true, tag_handler); + break; + + case input_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case input_format_t::ubjson: + case input_format_t::bjdata: + result = parse_ubjson_internal(); + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + // strict mode: next byte must be EOF + if (result && strict) + { + if (input_format == input_format_t::ubjson || input_format == input_format_t::bjdata) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_HEDLEY_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, + exception_message(input_format, concat("expected end of input; last byte: 0x", get_token_string()), "value"), nullptr)); + } + } + + return result; + } + + private: + ////////// + // BSON // + ////////// + + /*! + @brief Reads in a BSON-object and passes it to the SAX-parser. + @return whether a valid BSON-value was passed to the SAX parser + */ + bool parse_bson_internal() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) + { + return false; + } + + return sax->end_object(); + } + + /*! + @brief Parses a C-style string from the BSON input. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @return `true` if the \x00-byte indicating the end of the string was + encountered before the EOF; false` indicates an unexpected EOF. + */ + bool get_bson_cstr(string_t& result) + { + auto out = std::back_inserter(result); + while (true) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) + { + return false; + } + if (current == 0x00) + { + return true; + } + *out++ = static_cast(current); + } + } + + /*! + @brief Parses a zero-terminated string of length @a len from the BSON + input. + @param[in] len The length (including the zero-byte at the end) of the + string to be read. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 1 + @return `true` if the string was successfully parsed + */ + template + bool get_bson_string(const NumberType len, string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 1)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::bson, concat("string length must be at least 1, is ", std::to_string(len)), "string"), nullptr)); + } + + return get_string(input_format_t::bson, len - static_cast(1), result) && get() != std::char_traits::eof(); + } + + /*! + @brief Parses a byte array input of length @a len from the BSON input. + @param[in] len The length of the byte array to be read. + @param[in,out] result A reference to the binary variable where the read + array is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 0 + @return `true` if the byte array was successfully parsed + */ + template + bool get_bson_binary(const NumberType len, binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 0)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::bson, concat("byte array length cannot be negative, is ", std::to_string(len)), "binary"), nullptr)); + } + + // All BSON binary values have a subtype + std::uint8_t subtype{}; + get_number(input_format_t::bson, subtype); + result.set_subtype(subtype); + + return get_binary(input_format_t::bson, len, result); + } + + /*! + @brief Read a BSON document element of the given @a element_type. + @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html + @param[in] element_type_parse_position The position in the input stream, + where the `element_type` was read. + @warning Not all BSON element types are supported yet. An unsupported + @a element_type will give rise to a parse_error.114: + Unsupported BSON record type 0x... + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_internal(const char_int_type element_type, + const std::size_t element_type_parse_position) + { + switch (element_type) + { + case 0x01: // double + { + double number{}; + return get_number(input_format_t::bson, number) && sax->number_float(static_cast(number), ""); + } + + case 0x02: // string + { + std::int32_t len{}; + string_t value; + return get_number(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); + } + + case 0x03: // object + { + return parse_bson_internal(); + } + + case 0x04: // array + { + return parse_bson_array(); + } + + case 0x05: // binary + { + std::int32_t len{}; + binary_t value; + return get_number(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); + } + + case 0x08: // boolean + { + return sax->boolean(get() != 0); + } + + case 0x0A: // null + { + return sax->null(); + } + + case 0x10: // int32 + { + std::int32_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + case 0x12: // int64 + { + std::int64_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + default: // anything else not supported (yet) + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + const std::string cr_str{cr.data()}; + return sax->parse_error(element_type_parse_position, cr_str, + parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr)); + } + } + } + + /*! + @brief Read a BSON element list (as specified in the BSON-spec) + + The same binary layout is used for objects and arrays, hence it must be + indicated with the argument @a is_array which one is expected + (true --> array, false --> object). + + @param[in] is_array Determines if the element list being read is to be + treated as an object (@a is_array == false), or as an + array (@a is_array == true). + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_list(const bool is_array) + { + string_t key; + + while (auto element_type = get()) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) + { + return false; + } + + const std::size_t element_type_parse_position = chars_read; + if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) + { + return false; + } + + if (!is_array && !sax->key(key)) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) + { + return false; + } + + // get_bson_cstr only appends + key.clear(); + } + + return true; + } + + /*! + @brief Reads an array from the BSON input and passes it to the SAX-parser. + @return whether a valid BSON-array was passed to the SAX parser + */ + bool parse_bson_array() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) + { + return false; + } + + return sax->end_array(); + } + + ////////// + // CBOR // + ////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true) or whether the last read character should + be considered instead (false) + @param[in] tag_handler how CBOR tags should be treated + + @return whether a valid CBOR value was passed to the SAX parser + */ + bool parse_cbor_internal(const bool get_char, + const cbor_tag_handler_t tag_handler) + { + switch (get_char ? get() : current) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::cbor, "value"); + + // Integer 0x00..0x17 (0..23) + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return sax->number_unsigned(static_cast(current)); + + case 0x18: // Unsigned integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x19: // Unsigned integer (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1A: // Unsigned integer (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1B: // Unsigned integer (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + // Negative integer -1-0x00..-1-0x17 (-1..-24) + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + return sax->number_integer(static_cast(0x20 - 1 - current)); + + case 0x38: // Negative integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x39: // Negative integer -1-n (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) + - static_cast(number)); + } + + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: // Binary data (one-byte uint8_t for n follows) + case 0x59: // Binary data (two-byte uint16_t for n follow) + case 0x5A: // Binary data (four-byte uint32_t for n follow) + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + case 0x5F: // Binary data (indefinite length) + { + binary_t b; + return get_cbor_binary(b) && sax->binary(b); + } + + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + case 0x7F: // UTF-8 string (indefinite length) + { + string_t s; + return get_cbor_string(s) && sax->string(s); + } + + // array (0x00..0x17 data items follow) + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + return get_cbor_array( + conditional_static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0x98: // array (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x99: // array (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9A: // array (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast(len), tag_handler); + } + + case 0x9B: // array (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast(len), tag_handler); + } + + case 0x9F: // array (indefinite length) + return get_cbor_array(static_cast(-1), tag_handler); + + // map (0x00..0x17 pairs of data items follow) + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + return get_cbor_object(conditional_static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0xB8: // map (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xB9: // map (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBA: // map (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast(len), tag_handler); + } + + case 0xBB: // map (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast(len), tag_handler); + } + + case 0xBF: // map (indefinite length) + return get_cbor_object(static_cast(-1), tag_handler); + + case 0xC6: // tagged item + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD8: // tagged item (1 bytes follow) + case 0xD9: // tagged item (2 bytes follow) + case 0xDA: // tagged item (4 bytes follow) + case 0xDB: // tagged item (8 bytes follow) + { + switch (tag_handler) + { + case cbor_tag_handler_t::error: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::cbor, concat("invalid byte: 0x", last_token), "value"), nullptr)); + } + + case cbor_tag_handler_t::ignore: + { + // ignore binary subtype + switch (current) + { + case 0xD8: + { + std::uint8_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xD9: + { + std::uint16_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDA: + { + std::uint32_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDB: + { + std::uint64_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + default: + break; + } + return parse_cbor_internal(true, tag_handler); + } + + case cbor_tag_handler_t::store: + { + binary_t b; + // use binary subtype and store in binary container + switch (current) + { + case 0xD8: + { + std::uint8_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xD9: + { + std::uint16_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDA: + { + std::uint32_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDB: + { + std::uint64_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + default: + return parse_cbor_internal(true, tag_handler); + } + get(); + return get_cbor_binary(b) && sax->binary(b); + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + case 0xF4: // false + return sax->boolean(false); + + case 0xF5: // true + return sax->boolean(true); + + case 0xF6: // null + return sax->null(); + + case 0xF9: // Half-Precision Float (two-byte IEEE 754) + { + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + + const auto byte1 = static_cast(byte1_raw); + const auto byte2 = static_cast(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast((byte1 << 8u) + byte2); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast(-val) + : static_cast(val), ""); + } + + case 0xFA: // Single-Precision Float (four-byte IEEE 754) + { + float number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + case 0xFB: // Double-Precision Float (eight-byte IEEE 754) + { + double number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + default: // anything else (0xFF is handled inside the other types) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::cbor, concat("invalid byte: 0x", last_token), "value"), nullptr)); + } + } + } + + /*! + @brief reads a CBOR string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + Additionally, CBOR's strings with indefinite lengths are supported. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_cbor_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) + { + return false; + } + + switch (current) + { + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + return get_string(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7F: // UTF-8 string (indefinite length) + { + while (get() != 0xFF) + { + string_t chunk; + if (!get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format_t::cbor, concat("expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x", last_token), "string"), nullptr)); + } + } + } + + /*! + @brief reads a CBOR byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into the byte array. + Additionally, CBOR's byte arrays with indefinite lengths are supported. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_cbor_binary(binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) + { + return false; + } + + switch (current) + { + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + { + return get_binary(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x58: // Binary data (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x59: // Binary data (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5A: // Binary data (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5F: // Binary data (indefinite length) + { + while (get() != 0xFF) + { + binary_t chunk; + if (!get_cbor_binary(chunk)) + { + return false; + } + result.insert(result.end(), chunk.begin(), chunk.end()); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format_t::cbor, concat("expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x", last_token), "binary"), nullptr)); + } + } + } + + /*! + @param[in] len the length of the array or static_cast(-1) for an + array of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) + { + return false; + } + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object or static_cast(-1) for an + object of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + if (len != 0) + { + string_t key; + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + } + + return sax->end_object(); + } + + ///////////// + // MsgPack // + ///////////// + + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() + { + switch (get()) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::msgpack, "value"); + + // positive fixint + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + return sax->number_unsigned(static_cast(current)); + + // fixmap + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + return get_msgpack_object(conditional_static_cast(static_cast(current) & 0x0Fu)); + + // fixarray + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + return get_msgpack_array(conditional_static_cast(static_cast(current) & 0x0Fu)); + + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + case 0xD9: // str 8 + case 0xDA: // str 16 + case 0xDB: // str 32 + { + string_t s; + return get_msgpack_string(s) && sax->string(s); + } + + case 0xC0: // nil + return sax->null(); + + case 0xC2: // false + return sax->boolean(false); + + case 0xC3: // true + return sax->boolean(true); + + case 0xC4: // bin 8 + case 0xC5: // bin 16 + case 0xC6: // bin 32 + case 0xC7: // ext 8 + case 0xC8: // ext 16 + case 0xC9: // ext 32 + case 0xD4: // fixext 1 + case 0xD5: // fixext 2 + case 0xD6: // fixext 4 + case 0xD7: // fixext 8 + case 0xD8: // fixext 16 + { + binary_t b; + return get_msgpack_binary(b) && sax->binary(b); + } + + case 0xCA: // float 32 + { + float number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCB: // float 64 + { + double number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCC: // uint 8 + { + std::uint8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCD: // uint 16 + { + std::uint16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCE: // uint 32 + { + std::uint32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCF: // uint 64 + { + std::uint64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xD0: // int 8 + { + std::int8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD1: // int 16 + { + std::int16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD2: // int 32 + { + std::int32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD3: // int 64 + { + std::int64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xDC: // array 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDD: // array 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(conditional_static_cast(len)); + } + + case 0xDE: // map 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + case 0xDF: // map 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(conditional_static_cast(len)); + } + + // negative fixint + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return sax->number_integer(static_cast(current)); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::msgpack, concat("invalid byte: 0x", last_token), "value"), nullptr)); + } + } + } + + /*! + @brief reads a MessagePack string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_msgpack_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) + { + return false; + } + + switch (current) + { + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + { + return get_string(input_format_t::msgpack, static_cast(current) & 0x1Fu, result); + } + + case 0xD9: // str 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDA: // str 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDB: // str 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format_t::msgpack, concat("expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x", last_token), "string"), nullptr)); + } + } + } + + /*! + @brief reads a MessagePack byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into a byte array. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_msgpack_binary(binary_t& result) + { + // helper function to set the subtype + auto assign_and_return_true = [&result](std::int8_t subtype) + { + result.set_subtype(static_cast(subtype)); + return true; + }; + + switch (current) + { + case 0xC4: // bin 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC5: // bin 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC6: // bin 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC7: // ext 8 + { + std::uint8_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC8: // ext 16 + { + std::uint16_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC9: // ext 32 + { + std::uint32_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xD4: // fixext 1 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 1, result) && + assign_and_return_true(subtype); + } + + case 0xD5: // fixext 2 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 2, result) && + assign_and_return_true(subtype); + } + + case 0xD6: // fixext 4 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 4, result) && + assign_and_return_true(subtype); + } + + case 0xD7: // fixext 8 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 8, result) && + assign_and_return_true(subtype); + } + + case 0xD8: // fixext 16 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 16, result) && + assign_and_return_true(subtype); + } + + default: // LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + string_t key; + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + key.clear(); + } + + return sax->end_object(); + } + + //////////// + // UBJSON // + //////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser + */ + bool parse_ubjson_internal(const bool get_char = true) + { + return get_ubjson_value(get_char ? get_ignore_noop() : current); + } + + /*! + @brief reads a UBJSON string + + This function is either called after reading the 'S' byte explicitly + indicating a string, or in case of an object key where the 'S' byte can be + left out. + + @param[out] result created string + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether string creation completed + */ + bool get_ubjson_string(string_t& result, const bool get_char = true) + { + if (get_char) + { + get(); // TODO(niels): may we ignore N here? + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "value"))) + { + return false; + } + + switch (current) + { + case 'U': + { + std::uint8_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'i': + { + std::int8_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'I': + { + std::int16_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'l': + { + std::int32_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'L': + { + std::int64_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'u': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint16_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'm': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint32_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'M': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint64_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + default: + break; + } + auto last_token = get_token_string(); + std::string message; + + if (input_format != input_format_t::bjdata) + { + message = "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token; + } + else + { + message = "expected length type specification (U, i, u, I, m, l, M, L); last byte: 0x" + last_token; + } + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, "string"), nullptr)); + } + + /*! + @param[out] dim an integer vector storing the ND array dimensions + @return whether reading ND array size vector is successful + */ + bool get_ubjson_ndarray_size(std::vector& dim) + { + std::pair size_and_type; + size_t dimlen = 0; + bool no_ndarray = true; + + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type, no_ndarray))) + { + return false; + } + + if (size_and_type.first != npos) + { + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, size_and_type.second))) + { + return false; + } + dim.push_back(dimlen); + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray))) + { + return false; + } + dim.push_back(dimlen); + } + } + } + else + { + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, current))) + { + return false; + } + dim.push_back(dimlen); + get_ignore_noop(); + } + } + return true; + } + + /*! + @param[out] result determined size + @param[in,out] is_ndarray for input, `true` means already inside an ndarray vector + or ndarray dimension is not allowed; `false` means ndarray + is allowed; for output, `true` means an ndarray is found; + is_ndarray can only return `true` when its initial value + is `false` + @param[in] prefix type marker if already read, otherwise set to 0 + + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result, bool& is_ndarray, char_int_type prefix = 0) + { + if (prefix == 0) + { + prefix = get_ignore_noop(); + } + + switch (prefix) + { + case 'U': + { + std::uint8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'i': + { + std::int8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + result = static_cast(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char + return true; + } + + case 'I': + { + std::int16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + result = static_cast(number); + return true; + } + + case 'l': + { + std::int32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + result = static_cast(number); + return true; + } + + case 'L': + { + std::int64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + if (!value_in_range_of(number)) + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, + exception_message(input_format, "integer value overflow", "size"), nullptr)); + } + result = static_cast(number); + return true; + } + + case 'u': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'm': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + result = conditional_static_cast(number); + return true; + } + + case 'M': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (!value_in_range_of(number)) + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, + exception_message(input_format, "integer value overflow", "size"), nullptr)); + } + result = detail::conditional_static_cast(number); + return true; + } + + case '[': + { + if (input_format != input_format_t::bjdata) + { + break; + } + if (is_ndarray) // ndarray dimensional vector can only contain integers, and can not embed another array + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimensional vector is not allowed", "size"), nullptr)); + } + std::vector dim; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_ndarray_size(dim))) + { + return false; + } + if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1)) // return normal array size if 1D row vector + { + result = dim.at(dim.size() - 1); + return true; + } + if (!dim.empty()) // if ndarray, convert to an object in JData annotated array format + { + for (auto i : dim) // test if any dimension in an ndarray is 0, if so, return a 1D empty container + { + if ( i == 0 ) + { + result = 0; + return true; + } + } + + string_t key = "_ArraySize_"; + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(3) || !sax->key(key) || !sax->start_array(dim.size()))) + { + return false; + } + result = 1; + for (auto i : dim) + { + result *= i; + if (result == 0 || result == npos) // because dim elements shall not have zeros, result = 0 means overflow happened; it also can't be npos as it is used to initialize size in get_ubjson_size_type() + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, exception_message(input_format, "excessive ndarray size caused overflow", "size"), nullptr)); + } + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(static_cast(i)))) + { + return false; + } + } + is_ndarray = true; + return sax->end_array(); + } + result = 0; + return true; + } + + default: + break; + } + auto last_token = get_token_string(); + std::string message; + + if (input_format != input_format_t::bjdata) + { + message = "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token; + } + else + { + message = "expected length type specification (U, i, u, I, m, l, M, L) after '#'; last byte: 0x" + last_token; + } + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, "size"), nullptr)); + } + + /*! + @brief determine the type and size for a container + + In the optimized UBJSON format, a type and a size can be provided to allow + for a more compact representation. + + @param[out] result pair of the size and the type + @param[in] inside_ndarray whether the parser is parsing an ND array dimensional vector + + @return whether pair creation completed + */ + bool get_ubjson_size_type(std::pair& result, bool inside_ndarray = false) + { + result.first = npos; // size + result.second = 0; // type + bool is_ndarray = false; + + get_ignore_noop(); + + if (current == '$') + { + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (input_format == input_format_t::bjdata + && JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second))) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, concat("marker 0x", last_token, " is not a permitted optimized array type"), "type"), nullptr)); + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "type"))) + { + return false; + } + + get_ignore_noop(); + if (JSON_HEDLEY_UNLIKELY(current != '#')) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "value"))) + { + return false; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr)); + } + + const bool is_error = get_ubjson_size_value(result.first, is_ndarray); + if (input_format == input_format_t::bjdata && is_ndarray) + { + if (inside_ndarray) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read, + exception_message(input_format, "ndarray can not be recursive", "size"), nullptr)); + } + result.second |= (1 << 8); // use bit 8 to indicate ndarray, all UBJSON and BJData markers should be ASCII letters + } + return is_error; + } + + if (current == '#') + { + const bool is_error = get_ubjson_size_value(result.first, is_ndarray); + if (input_format == input_format_t::bjdata && is_ndarray) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read, + exception_message(input_format, "ndarray requires both type and size", "size"), nullptr)); + } + return is_error; + } + + return true; + } + + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const char_int_type prefix) + { + switch (prefix) + { + case std::char_traits::eof(): // EOF + return unexpect_eof(input_format, "value"); + + case 'T': // true + return sax->boolean(true); + case 'F': // false + return sax->boolean(false); + + case 'Z': // null + return sax->null(); + + case 'U': + { + std::uint8_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'i': + { + std::int8_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'I': + { + std::int16_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'l': + { + std::int32_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'L': + { + std::int64_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'u': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint16_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'm': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint32_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'M': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint64_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'h': + { + if (input_format != input_format_t::bjdata) + { + break; + } + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) + { + return false; + } + + const auto byte1 = static_cast(byte1_raw); + const auto byte2 = static_cast(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast((byte2 << 8u) + byte1); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast(-val) + : static_cast(val), ""); + } + + case 'd': + { + float number{}; + return get_number(input_format, number) && sax->number_float(static_cast(number), ""); + } + + case 'D': + { + double number{}; + return get_number(input_format, number) && sax->number_float(static_cast(number), ""); + } + + case 'H': + { + return get_ubjson_high_precision_number(); + } + + case 'C': // char + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "char"))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(current > 127)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format, concat("byte after 'C' must be in range 0x00..0x7F; last byte: 0x", last_token), "char"), nullptr)); + } + string_t s(1, static_cast(current)); + return sax->string(s); + } + + case 'S': // string + { + string_t s; + return get_ubjson_string(s) && sax->string(s); + } + + case '[': // array + return get_ubjson_array(); + + case '{': // object + return get_ubjson_object(); + + default: // anything else + break; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format, "invalid byte: 0x" + last_token, "value"), nullptr)); + } + + /*! + @return whether array creation completed + */ + bool get_ubjson_array() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + // if bit-8 of size_and_type.second is set to 1, encode bjdata ndarray as an object in JData annotated array format (https://github.com/NeuroJSON/jdata): + // {"_ArrayType_" : "typeid", "_ArraySize_" : [n1, n2, ...], "_ArrayData_" : [v1, v2, ...]} + + if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) + { + size_and_type.second &= ~(static_cast(1) << 8); // use bit 8 to indicate ndarray, here we remove the bit to restore the type marker + auto it = std::lower_bound(bjd_types_map.begin(), bjd_types_map.end(), size_and_type.second, [](const bjd_type & p, char_int_type t) + { + return p.first < t; + }); + string_t key = "_ArrayType_"; + if (JSON_HEDLEY_UNLIKELY(it == bjd_types_map.end() || it->first != size_and_type.second)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, "invalid byte: 0x" + last_token, "type"), nullptr)); + } + + string_t type = it->second; // sax->string() takes a reference + if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->string(type))) + { + return false; + } + + if (size_and_type.second == 'C') + { + size_and_type.second = 'U'; + } + + key = "_ArrayData_"; + if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->start_array(size_and_type.first) )) + { + return false; + } + + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + + return (sax->end_array() && sax->end_object()); + } + + if (size_and_type.first != npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) + { + return false; + } + get_ignore_noop(); + } + } + + return sax->end_array(); + } + + /*! + @return whether object creation completed + */ + bool get_ubjson_object() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + // do not accept ND-array size in objects in BJData + if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, "BJData object does not support ND-array size in optimized format", "object"), nullptr)); + } + + string_t key; + if (size_and_type.first != npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + key.clear(); + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + key.clear(); + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + while (current != '}') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + get_ignore_noop(); + key.clear(); + } + } + + return sax->end_object(); + } + + // Note, no reader for UBJSON binary types is implemented because they do + // not exist + + bool get_ubjson_high_precision_number() + { + // get size of following number string + std::size_t size{}; + bool no_ndarray = true; + auto res = get_ubjson_size_value(size, no_ndarray); + if (JSON_HEDLEY_UNLIKELY(!res)) + { + return res; + } + + // get number string + std::vector number_vector; + for (std::size_t i = 0; i < size; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) + { + return false; + } + number_vector.push_back(static_cast(current)); + } + + // parse number string + using ia_type = decltype(detail::input_adapter(number_vector)); + auto number_lexer = detail::lexer(detail::input_adapter(number_vector), false); + const auto result_number = number_lexer.scan(); + const auto number_string = number_lexer.get_token_string(); + const auto result_remainder = number_lexer.scan(); + + using token_type = typename detail::lexer_base::token_type; + + if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) + { + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, + exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr)); + } + + switch (result_number) + { + case token_type::value_integer: + return sax->number_integer(number_lexer.get_number_integer()); + case token_type::value_unsigned: + return sax->number_unsigned(number_lexer.get_number_unsigned()); + case token_type::value_float: + return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); + case token_type::uninitialized: + case token_type::literal_true: + case token_type::literal_false: + case token_type::literal_null: + case token_type::value_string: + case token_type::begin_array: + case token_type::begin_object: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::parse_error: + case token_type::end_of_input: + case token_type::literal_or_value: + default: + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, + exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr)); + } + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /*! + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a -'ve valued + `std::char_traits::eof()` in that case. + + @return character read from the input + */ + char_int_type get() + { + ++chars_read; + return current = ia.get_character(); + } + + /*! + @return character read from the input after ignoring all 'N' entries + */ + char_int_type get_ignore_noop() + { + do + { + get(); + } + while (current == 'N'); + + return current; + } + + /* + @brief read a number from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[out] result number of type @a NumberType + + @return whether conversion completed + + @note This function needs to respect the system's endianness, because + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. + On the other hand, BSON and BJData use little endian and should reorder + on big endian systems. + */ + template + bool get_number(const input_format_t format, NumberType& result) + { + // step 1: read input into array with system's byte order + std::array vec{}; + for (std::size_t i = 0; i < sizeof(NumberType); ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) + { + return false; + } + + // reverse byte order prior to conversion if necessary + if (is_little_endian != (InputIsLittleEndian || format == input_format_t::bjdata)) + { + vec[sizeof(NumberType) - i - 1] = static_cast(current); + } + else + { + vec[i] = static_cast(current); // LCOV_EXCL_LINE + } + } + + // step 2: convert array into number of type T and return + std::memcpy(&result, vec.data(), sizeof(NumberType)); + return true; + } + + /*! + @brief create a string by reading characters from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of characters to read + @param[out] result string created by reading @a len bytes + + @return whether string creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of string memory. + */ + template + bool get_string(const input_format_t format, + const NumberType len, + string_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @brief create a byte array by reading bytes from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of bytes to read + @param[out] result byte array created by reading @a len bytes + + @return whether byte array creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of memory. + */ + template + bool get_binary(const input_format_t format, + const NumberType len, + binary_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @param[in] format the current format (for diagnostics) + @param[in] context further context information (for diagnostics) + @return whether the last read character is not EOF + */ + JSON_HEDLEY_NON_NULL(3) + bool unexpect_eof(const input_format_t format, const char* context) const + { + if (JSON_HEDLEY_UNLIKELY(current == std::char_traits::eof())) + { + return sax->parse_error(chars_read, "", + parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), nullptr)); + } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return std::string{cr.data()}; + } + + /*! + @param[in] format the current format + @param[in] detail a detailed error message + @param[in] context further context information + @return a message string to use in the parse_error exceptions + */ + std::string exception_message(const input_format_t format, + const std::string& detail, + const std::string& context) const + { + std::string error_msg = "syntax error while parsing "; + + switch (format) + { + case input_format_t::cbor: + error_msg += "CBOR"; + break; + + case input_format_t::msgpack: + error_msg += "MessagePack"; + break; + + case input_format_t::ubjson: + error_msg += "UBJSON"; + break; + + case input_format_t::bson: + error_msg += "BSON"; + break; + + case input_format_t::bjdata: + error_msg += "BJData"; + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + return concat(error_msg, ' ', context, ": ", detail); + } + + private: + static JSON_INLINE_VARIABLE constexpr std::size_t npos = static_cast(-1); + + /// input adapter + InputAdapterType ia; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// the number of characters read + std::size_t chars_read = 0; + + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// input format + const input_format_t input_format = input_format_t::json; + + /// the SAX parser + json_sax_t* sax = nullptr; + + // excluded markers in bjdata optimized type +#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \ + make_array('F', 'H', 'N', 'S', 'T', 'Z', '[', '{') + +#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \ + make_array( \ + bjd_type{'C', "char"}, \ + bjd_type{'D', "double"}, \ + bjd_type{'I', "int16"}, \ + bjd_type{'L', "int64"}, \ + bjd_type{'M', "uint64"}, \ + bjd_type{'U', "uint8"}, \ + bjd_type{'d', "single"}, \ + bjd_type{'i', "int8"}, \ + bjd_type{'l', "int32"}, \ + bjd_type{'m', "uint32"}, \ + bjd_type{'u', "uint16"}) + + JSON_PRIVATE_UNLESS_TESTED: + // lookup tables + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + const decltype(JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_) bjd_optimized_type_markers = + JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_; + + using bjd_type = std::pair; + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + const decltype(JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_) bjd_types_map = + JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_; + +#undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ +#undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr std::size_t binary_reader::npos; +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/input/input_adapters.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/input_adapters.hpp new file mode 100644 index 0000000..cf53b1d --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/input_adapters.hpp @@ -0,0 +1,494 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // array +#include // size_t +#include // strlen +#include // begin, end, iterator_traits, random_access_iterator_tag, distance, next +#include // shared_ptr, make_shared, addressof +#include // accumulate +#include // string, char_traits +#include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer +#include // pair, declval + +#ifndef JSON_NO_IO + #include // FILE * + #include // istream +#endif // JSON_NO_IO + +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata }; + +//////////////////// +// input adapters // +//////////////////// + +#ifndef JSON_NO_IO +/*! +Input adapter for stdio file access. This adapter read only 1 byte and do not use any + buffer. This adapter is a very low level adapter. +*/ +class file_input_adapter +{ + public: + using char_type = char; + + JSON_HEDLEY_NON_NULL(2) + explicit file_input_adapter(std::FILE* f) noexcept + : m_file(f) + { + JSON_ASSERT(m_file != nullptr); + } + + // make class move-only + file_input_adapter(const file_input_adapter&) = delete; + file_input_adapter(file_input_adapter&&) noexcept = default; + file_input_adapter& operator=(const file_input_adapter&) = delete; + file_input_adapter& operator=(file_input_adapter&&) = delete; + ~file_input_adapter() = default; + + std::char_traits::int_type get_character() noexcept + { + return std::fgetc(m_file); + } + + private: + /// the file pointer to read from + std::FILE* m_file; +}; + + +/*! +Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at +beginning of input. Does not support changing the underlying std::streambuf +in mid-input. Maintains underlying std::istream and std::streambuf to support +subsequent use of standard std::istream operations to process any input +characters following those used in parsing the JSON input. Clears the +std::istream flags; any input errors (e.g., EOF) will be detected by the first +subsequent call for input from the std::istream. +*/ +class input_stream_adapter +{ + public: + using char_type = char; + + ~input_stream_adapter() + { + // clear stream flags; we use underlying streambuf I/O, do not + // maintain ifstream flags, except eof + if (is != nullptr) + { + is->clear(is->rdstate() & std::ios::eofbit); + } + } + + explicit input_stream_adapter(std::istream& i) + : is(&i), sb(i.rdbuf()) + {} + + // delete because of pointer members + input_stream_adapter(const input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&&) = delete; + + input_stream_adapter(input_stream_adapter&& rhs) noexcept + : is(rhs.is), sb(rhs.sb) + { + rhs.is = nullptr; + rhs.sb = nullptr; + } + + // std::istream/std::streambuf use std::char_traits::to_int_type, to + // ensure that std::char_traits::eof() and the character 0xFF do not + // end up as the same value, e.g. 0xFFFFFFFF. + std::char_traits::int_type get_character() + { + auto res = sb->sbumpc(); + // set eof manually, as we don't use the istream interface. + if (JSON_HEDLEY_UNLIKELY(res == std::char_traits::eof())) + { + is->clear(is->rdstate() | std::ios::eofbit); + } + return res; + } + + private: + /// the associated input stream + std::istream* is = nullptr; + std::streambuf* sb = nullptr; +}; +#endif // JSON_NO_IO + +// General-purpose iterator-based adapter. It might not be as fast as +// theoretically possible for some containers, but it is extremely versatile. +template +class iterator_input_adapter +{ + public: + using char_type = typename std::iterator_traits::value_type; + + iterator_input_adapter(IteratorType first, IteratorType last) + : current(std::move(first)), end(std::move(last)) + {} + + typename std::char_traits::int_type get_character() + { + if (JSON_HEDLEY_LIKELY(current != end)) + { + auto result = std::char_traits::to_int_type(*current); + std::advance(current, 1); + return result; + } + + return std::char_traits::eof(); + } + + private: + IteratorType current; + IteratorType end; + + template + friend struct wide_string_input_helper; + + bool empty() const + { + return current == end; + } +}; + + +template +struct wide_string_input_helper; + +template +struct wide_string_input_helper +{ + // UTF-32 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u) & 0x1Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u) & 0x0Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xF0u | ((static_cast(wc) >> 18u) & 0x07u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } +}; + +template +struct wide_string_input_helper +{ + // UTF-16 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc || wc >= 0xE000) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else + { + if (JSON_HEDLEY_UNLIKELY(!input.empty())) + { + const auto wc2 = static_cast(input.get_character()); + const auto charcode = 0x10000u + (((static_cast(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + utf8_bytes[0] = static_cast::int_type>(0xF0u | (charcode >> 18u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (charcode & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } + } +}; + +// Wraps another input apdater to convert wide character types into individual bytes. +template +class wide_string_input_adapter +{ + public: + using char_type = char; + + wide_string_input_adapter(BaseInputAdapter base) + : base_adapter(base) {} + + typename std::char_traits::int_type get_character() noexcept + { + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + fill_buffer(); + + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index == 0); + } + + // use buffer + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); + return utf8_bytes[utf8_bytes_index++]; + } + + private: + BaseInputAdapter base_adapter; + + template + void fill_buffer() + { + wide_string_input_helper::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); + } + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; +}; + + +template +struct iterator_input_adapter_factory +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using adapter_type = iterator_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(std::move(first), std::move(last)); + } +}; + +template +struct is_iterator_of_multibyte +{ + using value_type = typename std::iterator_traits::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; + +template +struct iterator_input_adapter_factory::value>> +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using base_adapter_type = iterator_input_adapter; + using adapter_type = wide_string_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(base_adapter_type(std::move(first), std::move(last))); + } +}; + +// General purpose iterator-based input +template +typename iterator_input_adapter_factory::adapter_type input_adapter(IteratorType first, IteratorType last) +{ + using factory_type = iterator_input_adapter_factory; + return factory_type::create(first, last); +} + +// Convenience shorthand from container to iterator +// Enables ADL on begin(container) and end(container) +// Encloses the using declarations in namespace for not to leak them to outside scope + +namespace container_input_adapter_factory_impl +{ + +using std::begin; +using std::end; + +template +struct container_input_adapter_factory {}; + +template +struct container_input_adapter_factory< ContainerType, + void_t()), end(std::declval()))>> + { + using adapter_type = decltype(input_adapter(begin(std::declval()), end(std::declval()))); + + static adapter_type create(const ContainerType& container) +{ + return input_adapter(begin(container), end(container)); +} + }; + +} // namespace container_input_adapter_factory_impl + +template +typename container_input_adapter_factory_impl::container_input_adapter_factory::adapter_type input_adapter(const ContainerType& container) +{ + return container_input_adapter_factory_impl::container_input_adapter_factory::create(container); +} + +#ifndef JSON_NO_IO +// Special cases with fast paths +inline file_input_adapter input_adapter(std::FILE* file) +{ + return file_input_adapter(file); +} + +inline input_stream_adapter input_adapter(std::istream& stream) +{ + return input_stream_adapter(stream); +} + +inline input_stream_adapter input_adapter(std::istream&& stream) +{ + return input_stream_adapter(stream); +} +#endif // JSON_NO_IO + +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval(), std::declval())); + +// Null-delimited strings, and the like. +template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + !std::is_array::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > +contiguous_bytes_input_adapter input_adapter(CharT b) +{ + auto length = std::strlen(reinterpret_cast(b)); + const auto* ptr = reinterpret_cast(b); + return input_adapter(ptr, ptr + length); +} + +template +auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + return input_adapter(array, array + N); +} + +// This class only handles inputs of input_buffer_adapter type. +// It's required so that expressions like {ptr, len} can be implicitly cast +// to the correct adapter. +class span_input_adapter +{ + public: + template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > + span_input_adapter(CharT b, std::size_t l) + : ia(reinterpret_cast(b), reinterpret_cast(b) + l) {} + + template::iterator_category, std::random_access_iterator_tag>::value, + int>::type = 0> + span_input_adapter(IteratorType first, IteratorType last) + : ia(input_adapter(first, last)) {} + + contiguous_bytes_input_adapter&& get() + { + return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg) + } + + private: + contiguous_bytes_input_adapter ia; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/input/json_sax.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/json_sax.hpp new file mode 100644 index 0000000..5bd5c51 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/json_sax.hpp @@ -0,0 +1,728 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include // string +#include // move +#include // vector + +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/*! +@brief SAX interface + +This class describes the SAX interface used by @ref nlohmann::json::sax_parse. +Each function is called in different situations while the input is parsed. The +boolean return value informs the parser whether to continue processing the +input. +*/ +template +struct json_sax +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief a floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const string_t& s) = 0; + + /*! + @brief a string value was read + @param[in] val string value + @return whether parsing should proceed + @note It is safe to move the passed string value. + */ + virtual bool string(string_t& val) = 0; + + /*! + @brief a binary value was read + @param[in] val binary value + @return whether parsing should proceed + @note It is safe to move the passed binary value. + */ + virtual bool binary(binary_t& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + @note It is safe to move the passed string. + */ + virtual bool key(string_t& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @param[in] ex an exception object describing the error + @return whether parsing should proceed (must return false) + */ + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const detail::exception& ex) = 0; + + json_sax() = default; + json_sax(const json_sax&) = default; + json_sax(json_sax&&) noexcept = default; + json_sax& operator=(const json_sax&) = default; + json_sax& operator=(json_sax&&) noexcept = default; + virtual ~json_sax() = default; +}; + + +namespace detail +{ +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ +template +class json_sax_dom_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @param[in,out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ + explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + + // make class move-only + json_sax_dom_parser(const json_sax_dom_parser&) = delete; + json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; + json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(ref_stack.back()->is_object()); + + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() + { + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(ref_stack.back()->is_object()); + + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool end_array() + { + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(ref_stack.back()->is_array()); + + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + JSON_HEDLEY_RETURNS_NON_NULL + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + + JSON_ASSERT(ref_stack.back()->is_object()); + JSON_ASSERT(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +template +class json_sax_dom_callback_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + // make class move-only + json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_callback_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::object, true); + ref_stack.push_back(val.second); + + // check object limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + BasicJsonType k = BasicJsonType(val); + + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep && ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + + return true; + } + + bool end_object() + { + if (ref_stack.back()) + { + if (!callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) + { + // discard object + *ref_stack.back() = discarded; + } + else + { + ref_stack.back()->set_parents(); + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) + { + // remove discarded value + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + + return true; + } + + bool start_array(std::size_t len) + { + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::array, true); + ref_stack.push_back(val.second); + + // check array limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool end_array() + { + bool keep = true; + + if (ref_stack.back()) + { + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (keep) + { + ref_stack.back()->set_parents(); + } + else + { + // discard array + *ref_stack.back() = discarded; + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + // remove discarded value + if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) + */ + template + std::pair handle_value(Value&& v, const bool skip_callback = false) + { + JSON_ASSERT(!keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (!keep_stack.back()) + { + return {false, nullptr}; + } + + // create value + auto value = BasicJsonType(std::forward(v)); + + // check callback + const bool keep = skip_callback || callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (!keep) + { + return {false, nullptr}; + } + + if (ref_stack.empty()) + { + root = std::move(value); + return {true, &root}; + } + + // skip this value if we already decided to skip the parent + // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) + if (!ref_stack.back()) + { + return {false, nullptr}; + } + + // we now only expect arrays and objects + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + // array + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; + } + + // object + JSON_ASSERT(ref_stack.back()->is_object()); + // check if we should store an element for the current key + JSON_ASSERT(!key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (!store_element) + { + return {false, nullptr}; + } + + JSON_ASSERT(object_element); + *object_element = std::move(value); + return {true, object_element}; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// stack to manage which values to keep + std::vector keep_stack {}; + /// stack to manage which object keys to keep + std::vector key_keep_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + +template +class json_sax_acceptor +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + bool null() + { + return true; + } + + bool boolean(bool /*unused*/) + { + return true; + } + + bool number_integer(number_integer_t /*unused*/) + { + return true; + } + + bool number_unsigned(number_unsigned_t /*unused*/) + { + return true; + } + + bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) + { + return true; + } + + bool string(string_t& /*unused*/) + { + return true; + } + + bool binary(binary_t& /*unused*/) + { + return true; + } + + bool start_object(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool key(string_t& /*unused*/) + { + return true; + } + + bool end_object() + { + return true; + } + + bool start_array(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool end_array() + { + return true; + } + + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) + { + return false; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/input/lexer.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/lexer.hpp new file mode 100644 index 0000000..72e9951 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/lexer.hpp @@ -0,0 +1,1632 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // array +#include // localeconv +#include // size_t +#include // snprintf +#include // strtof, strtod, strtold, strtoll, strtoull +#include // initializer_list +#include // char_traits, string +#include // move +#include // vector + +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////// +// lexer // +/////////// + +template +class lexer_base +{ + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value + value_integer, ///< a signed integer -- use get_number_integer() for actual value + value_float, ///< an floating point number -- use get_number_float() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input, ///< indicating the end of the input buffer + literal_or_value ///< a literal or the begin of a value (only for diagnostics) + }; + + /// return name of values of type token_type (only used for errors) + JSON_HEDLEY_RETURNS_NON_NULL + JSON_HEDLEY_CONST + static const char* token_type_name(const token_type t) noexcept + { + switch (t) + { + case token_type::uninitialized: + return ""; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_unsigned: + case token_type::value_integer: + case token_type::value_float: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return ""; + case token_type::end_of_input: + return "end of input"; + case token_type::literal_or_value: + return "'[', '{', or a literal"; + // LCOV_EXCL_START + default: // catch non-enum values + return "unknown token"; + // LCOV_EXCL_STOP + } + } +}; +/*! +@brief lexical analysis + +This class organizes the lexical analysis during JSON deserialization. +*/ +template +class lexer : public lexer_base +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + using token_type = typename lexer_base::token_type; + + explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept + : ia(std::move(adapter)) + , ignore_comments(ignore_comments_) + , decimal_point_char(static_cast(get_decimal_point())) + {} + + // delete because of pointer members + lexer(const lexer&) = delete; + lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + lexer& operator=(lexer&) = delete; + lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~lexer() = default; + + private: + ///////////////////// + // locales + ///////////////////// + + /// return the locale-dependent decimal point + JSON_HEDLEY_PURE + static char get_decimal_point() noexcept + { + const auto* loc = localeconv(); + JSON_ASSERT(loc != nullptr); + return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); + } + + ///////////////////// + // scan functions + ///////////////////// + + /*! + @brief get codepoint from 4 hex characters following `\u` + + For input "\u c1 c2 c3 c4" the codepoint is: + (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 + = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) + + Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' + must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The + conversion is done by subtracting the offset (0x30, 0x37, and 0x57) + between the ASCII value of the character and the desired integer value. + + @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or + non-hex character) + */ + int get_codepoint() + { + // this function only makes sense after reading `\u` + JSON_ASSERT(current == 'u'); + int codepoint = 0; + + const auto factors = { 12u, 8u, 4u, 0u }; + for (const auto factor : factors) + { + get(); + + if (current >= '0' && current <= '9') + { + codepoint += static_cast((static_cast(current) - 0x30u) << factor); + } + else if (current >= 'A' && current <= 'F') + { + codepoint += static_cast((static_cast(current) - 0x37u) << factor); + } + else if (current >= 'a' && current <= 'f') + { + codepoint += static_cast((static_cast(current) - 0x57u) << factor); + } + else + { + return -1; + } + } + + JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); + return codepoint; + } + + /*! + @brief check if the next byte(s) are inside a given range + + Adds the current byte and, for each passed range, reads a new byte and + checks if it is inside the range. If a violation was detected, set up an + error message and return false. Otherwise, return true. + + @param[in] ranges list of integers; interpreted as list of pairs of + inclusive lower and upper bound, respectively + + @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, + 1, 2, or 3 pairs. This precondition is enforced by an assertion. + + @return true if and only if no range violation was detected + */ + bool next_byte_in_range(std::initializer_list ranges) + { + JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); + add(current); + + for (auto range = ranges.begin(); range != ranges.end(); ++range) + { + get(); + if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) + { + add(current); + } + else + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return false; + } + } + + return true; + } + + /*! + @brief scan a string literal + + This function scans a string according to Sect. 7 of RFC 8259. While + scanning, bytes are escaped and copied into buffer token_buffer. Then the + function returns successfully, token_buffer is *not* null-terminated (as it + may contain \0 bytes), and token_buffer.size() is the number of bytes in the + string. + + @return token_type::value_string if string could be successfully scanned, + token_type::parse_error otherwise + + @note In case of errors, variable error_message contains a textual + description. + */ + token_type scan_string() + { + // reset token_buffer (ignore opening quote) + reset(); + + // we entered the function by reading an open quote + JSON_ASSERT(current == '\"'); + + while (true) + { + // get next character + switch (get()) + { + // end of file while parsing string + case std::char_traits::eof(): + { + error_message = "invalid string: missing closing quote"; + return token_type::parse_error; + } + + // closing quote + case '\"': + { + return token_type::value_string; + } + + // escapes + case '\\': + { + switch (get()) + { + // quotation mark + case '\"': + add('\"'); + break; + // reverse solidus + case '\\': + add('\\'); + break; + // solidus + case '/': + add('/'); + break; + // backspace + case 'b': + add('\b'); + break; + // form feed + case 'f': + add('\f'); + break; + // line feed + case 'n': + add('\n'); + break; + // carriage return + case 'r': + add('\r'); + break; + // tab + case 't': + add('\t'); + break; + + // unicode escapes + case 'u': + { + const int codepoint1 = get_codepoint(); + int codepoint = codepoint1; // start with codepoint1 + + if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if code point is a high surrogate + if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) + { + // expect next \uxxxx entry + if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) + { + const int codepoint2 = get_codepoint(); + + if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if codepoint2 is a low surrogate + if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) + { + // overwrite codepoint + codepoint = static_cast( + // high surrogate occupies the most significant 22 bits + (static_cast(codepoint1) << 10u) + // low surrogate occupies the least significant 15 bits + + static_cast(codepoint2) + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result, so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00u); + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) + { + error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; + return token_type::parse_error; + } + } + + // result of the above calculation yields a proper codepoint + JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); + + // translate codepoint into bytes + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + add(static_cast(codepoint)); + } + else if (codepoint <= 0x7FF) + { + // 2-byte characters: 110xxxxx 10xxxxxx + add(static_cast(0xC0u | (static_cast(codepoint) >> 6u))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else if (codepoint <= 0xFFFF) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + add(static_cast(0xE0u | (static_cast(codepoint) >> 12u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + add(static_cast(0xF0u | (static_cast(codepoint) >> 18u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 12u) & 0x3Fu))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + + break; + } + + // other characters after escape + default: + error_message = "invalid string: forbidden character after backslash"; + return token_type::parse_error; + } + + break; + } + + // invalid control characters + case 0x00: + { + error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; + return token_type::parse_error; + } + + case 0x01: + { + error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; + return token_type::parse_error; + } + + case 0x02: + { + error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; + return token_type::parse_error; + } + + case 0x03: + { + error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; + return token_type::parse_error; + } + + case 0x04: + { + error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; + return token_type::parse_error; + } + + case 0x05: + { + error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; + return token_type::parse_error; + } + + case 0x06: + { + error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; + return token_type::parse_error; + } + + case 0x07: + { + error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; + return token_type::parse_error; + } + + case 0x08: + { + error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; + return token_type::parse_error; + } + + case 0x09: + { + error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; + return token_type::parse_error; + } + + case 0x0A: + { + error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; + return token_type::parse_error; + } + + case 0x0B: + { + error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; + return token_type::parse_error; + } + + case 0x0C: + { + error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; + return token_type::parse_error; + } + + case 0x0D: + { + error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; + return token_type::parse_error; + } + + case 0x0E: + { + error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; + return token_type::parse_error; + } + + case 0x0F: + { + error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; + return token_type::parse_error; + } + + case 0x10: + { + error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; + return token_type::parse_error; + } + + case 0x11: + { + error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; + return token_type::parse_error; + } + + case 0x12: + { + error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; + return token_type::parse_error; + } + + case 0x13: + { + error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; + return token_type::parse_error; + } + + case 0x14: + { + error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; + return token_type::parse_error; + } + + case 0x15: + { + error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; + return token_type::parse_error; + } + + case 0x16: + { + error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; + return token_type::parse_error; + } + + case 0x17: + { + error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; + return token_type::parse_error; + } + + case 0x18: + { + error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; + return token_type::parse_error; + } + + case 0x19: + { + error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; + return token_type::parse_error; + } + + case 0x1A: + { + error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; + return token_type::parse_error; + } + + case 0x1B: + { + error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; + return token_type::parse_error; + } + + case 0x1C: + { + error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; + return token_type::parse_error; + } + + case 0x1D: + { + error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; + return token_type::parse_error; + } + + case 0x1E: + { + error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; + return token_type::parse_error; + } + + case 0x1F: + { + error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; + return token_type::parse_error; + } + + // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) + case 0x20: + case 0x21: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + { + add(current); + break; + } + + // U+0080..U+07FF: bytes C2..DF 80..BF + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + { + if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) + { + return token_type::parse_error; + } + break; + } + + // U+0800..U+0FFF: bytes E0 A0..BF 80..BF + case 0xE0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF + // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xEE: + case 0xEF: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+D000..U+D7FF: bytes ED 80..9F 80..BF + case 0xED: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF + case 0xF0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF + case 0xF1: + case 0xF2: + case 0xF3: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF + case 0xF4: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // remaining bytes (80..C1 and F5..FF) are ill-formed + default: + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return token_type::parse_error; + } + } + } + } + + /*! + * @brief scan a comment + * @return whether comment could be scanned successfully + */ + bool scan_comment() + { + switch (get()) + { + // single-line comments skip input until a newline or EOF is read + case '/': + { + while (true) + { + switch (get()) + { + case '\n': + case '\r': + case std::char_traits::eof(): + case '\0': + return true; + + default: + break; + } + } + } + + // multi-line comments skip input until */ is read + case '*': + { + while (true) + { + switch (get()) + { + case std::char_traits::eof(): + case '\0': + { + error_message = "invalid comment; missing closing '*/'"; + return false; + } + + case '*': + { + switch (get()) + { + case '/': + return true; + + default: + { + unget(); + continue; + } + } + } + + default: + continue; + } + } + } + + // unexpected character after reading '/' + default: + { + error_message = "invalid comment; expecting '/' or '*' after '/'"; + return false; + } + } + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(float& f, const char* str, char** endptr) noexcept + { + f = std::strtof(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(double& f, const char* str, char** endptr) noexcept + { + f = std::strtod(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(long double& f, const char* str, char** endptr) noexcept + { + f = std::strtold(str, endptr); + } + + /*! + @brief scan a number literal + + This function scans a string according to Sect. 6 of RFC 8259. + + The function is realized with a deterministic finite state machine derived + from the grammar described in RFC 8259. Starting in state "init", the + input is read and used to determined the next state. Only state "done" + accepts the number. State "error" is a trap state to model errors. In the + table below, "anything" means any character but the ones listed before. + + state | 0 | 1-9 | e E | + | - | . | anything + ---------|----------|----------|----------|---------|---------|----------|----------- + init | zero | any1 | [error] | [error] | minus | [error] | [error] + minus | zero | any1 | [error] | [error] | [error] | [error] | [error] + zero | done | done | exponent | done | done | decimal1 | done + any1 | any1 | any1 | exponent | done | done | decimal1 | done + decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] + decimal2 | decimal2 | decimal2 | exponent | done | done | done | done + exponent | any2 | any2 | [error] | sign | sign | [error] | [error] + sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] + any2 | any2 | any2 | done | done | done | done | done + + The state machine is realized with one label per state (prefixed with + "scan_number_") and `goto` statements between them. The state machine + contains cycles, but any cycle can be left when EOF is read. Therefore, + the function is guaranteed to terminate. + + During scanning, the read bytes are stored in token_buffer. This string is + then converted to a signed integer, an unsigned integer, or a + floating-point number. + + @return token_type::value_unsigned, token_type::value_integer, or + token_type::value_float if number could be successfully scanned, + token_type::parse_error otherwise + + @note The scanner is independent of the current locale. Internally, the + locale's decimal point is used instead of `.` to work with the + locale-dependent converters. + */ + token_type scan_number() // lgtm [cpp/use-of-goto] + { + // reset token_buffer to store the number's bytes + reset(); + + // the type of the parsed number; initially set to unsigned; will be + // changed if minus sign, decimal point or exponent is read + token_type number_type = token_type::value_unsigned; + + // state (init): we just found out we need to scan a number + switch (current) + { + case '-': + { + add(current); + goto scan_number_minus; + } + + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + // all other characters are rejected outside scan_number() + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + +scan_number_minus: + // state: we just parsed a leading minus sign + number_type = token_type::value_integer; + switch (get()) + { + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + default: + { + error_message = "invalid number; expected digit after '-'"; + return token_type::parse_error; + } + } + +scan_number_zero: + // state: we just parse a zero (maybe with a leading minus sign) + switch (get()) + { + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_any1: + // state: we just parsed a number 0-9 (maybe with a leading minus sign) + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_decimal1: + // state: we just parsed a decimal point + number_type = token_type::value_float; + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + default: + { + error_message = "invalid number; expected digit after '.'"; + return token_type::parse_error; + } + } + +scan_number_decimal2: + // we just parsed at least one number after a decimal point + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_exponent: + // we just parsed an exponent + number_type = token_type::value_float; + switch (get()) + { + case '+': + case '-': + { + add(current); + goto scan_number_sign; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = + "invalid number; expected '+', '-', or digit after exponent"; + return token_type::parse_error; + } + } + +scan_number_sign: + // we just parsed an exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = "invalid number; expected digit after exponent sign"; + return token_type::parse_error; + } + } + +scan_number_any2: + // we just parsed a number after the exponent or exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + goto scan_number_done; + } + +scan_number_done: + // unget the character after the number (we only read it to know that + // we are done scanning a number) + unget(); + + char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + errno = 0; + + // try to parse integers first and fall back to floats + if (number_type == token_type::value_unsigned) + { + const auto x = std::strtoull(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_unsigned = static_cast(x); + if (value_unsigned == x) + { + return token_type::value_unsigned; + } + } + } + else if (number_type == token_type::value_integer) + { + const auto x = std::strtoll(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_integer = static_cast(x); + if (value_integer == x) + { + return token_type::value_integer; + } + } + } + + // this code is reached if we parse a floating-point number or if an + // integer conversion above failed + strtof(value_float, token_buffer.data(), &endptr); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + return token_type::value_float; + } + + /*! + @param[in] literal_text the literal text to expect + @param[in] length the length of the passed literal text + @param[in] return_type the token type to return on success + */ + JSON_HEDLEY_NON_NULL(2) + token_type scan_literal(const char_type* literal_text, const std::size_t length, + token_type return_type) + { + JSON_ASSERT(std::char_traits::to_char_type(current) == literal_text[0]); + for (std::size_t i = 1; i < length; ++i) + { + if (JSON_HEDLEY_UNLIKELY(std::char_traits::to_char_type(get()) != literal_text[i])) + { + error_message = "invalid literal"; + return token_type::parse_error; + } + } + return return_type; + } + + ///////////////////// + // input management + ///////////////////// + + /// reset token_buffer; current character is beginning of token + void reset() noexcept + { + token_buffer.clear(); + token_string.clear(); + token_string.push_back(std::char_traits::to_char_type(current)); + } + + /* + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a + `std::char_traits::eof()` in that case. Stores the scanned characters + for use in error messages. + + @return character read from the input + */ + char_int_type get() + { + ++position.chars_read_total; + ++position.chars_read_current_line; + + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia.get_character(); + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + token_string.push_back(std::char_traits::to_char_type(current)); + } + + if (current == '\n') + { + ++position.lines_read; + position.chars_read_current_line = 0; + } + + return current; + } + + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read_total, + chars_read_current_line, and token_string. The next call to get() will + behave as if the unget character is read again. + */ + void unget() + { + next_unget = true; + + --position.chars_read_total; + + // in case we "unget" a newline, we have to also decrement the lines_read + if (position.chars_read_current_line == 0) + { + if (position.lines_read > 0) + { + --position.lines_read; + } + } + else + { + --position.chars_read_current_line; + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + JSON_ASSERT(!token_string.empty()); + token_string.pop_back(); + } + } + + /// add a character to token_buffer + void add(char_int_type c) + { + token_buffer.push_back(static_cast(c)); + } + + public: + ///////////////////// + // value getters + ///////////////////// + + /// return integer value + constexpr number_integer_t get_number_integer() const noexcept + { + return value_integer; + } + + /// return unsigned integer value + constexpr number_unsigned_t get_number_unsigned() const noexcept + { + return value_unsigned; + } + + /// return floating-point value + constexpr number_float_t get_number_float() const noexcept + { + return value_float; + } + + /// return current string value (implicitly resets the token; useful only once) + string_t& get_string() + { + return token_buffer; + } + + ///////////////////// + // diagnostics + ///////////////////// + + /// return position of last read token + constexpr position_t get_position() const noexcept + { + return position; + } + + /// return the last read token (for errors only). Will never contain EOF + /// (an arbitrary value that is not a valid char value, often -1), because + /// 255 may legitimately occur. May contain NUL, which should be escaped. + std::string get_token_string() const + { + // escape control characters + std::string result; + for (const auto c : token_string) + { + if (static_cast(c) <= '\x1F') + { + // escape control characters + std::array cs{{}}; + static_cast((std::snprintf)(cs.data(), cs.size(), "", static_cast(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + result += cs.data(); + } + else + { + // add character as is + result.push_back(static_cast(c)); + } + } + + return result; + } + + /// return syntax error message + JSON_HEDLEY_RETURNS_NON_NULL + constexpr const char* get_error_message() const noexcept + { + return error_message; + } + + ///////////////////// + // actual scanner + ///////////////////// + + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + // check if we completely parse the BOM + return get() == 0xBB && get() == 0xBF; + } + + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); + } + + token_type scan() + { + // initially, skip the BOM + if (position.chars_read_total == 0 && !skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + + // read next character and ignore whitespace + skip_whitespace(); + + // ignore comments + while (ignore_comments && current == '/') + { + if (!scan_comment()) + { + return token_type::parse_error; + } + + // skip following whitespace + skip_whitespace(); + } + + switch (current) + { + // structural characters + case '[': + return token_type::begin_array; + case ']': + return token_type::end_array; + case '{': + return token_type::begin_object; + case '}': + return token_type::end_object; + case ':': + return token_type::name_separator; + case ',': + return token_type::value_separator; + + // literals + case 't': + { + std::array true_literal = {{static_cast('t'), static_cast('r'), static_cast('u'), static_cast('e')}}; + return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); + } + case 'f': + { + std::array false_literal = {{static_cast('f'), static_cast('a'), static_cast('l'), static_cast('s'), static_cast('e')}}; + return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); + } + case 'n': + { + std::array null_literal = {{static_cast('n'), static_cast('u'), static_cast('l'), static_cast('l')}}; + return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); + } + + // string + case '\"': + return scan_string(); + + // number + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return scan_number(); + + // end of input (the null byte is needed when parsing from + // string literals) + case '\0': + case std::char_traits::eof(): + return token_type::end_of_input; + + // error + default: + error_message = "invalid literal"; + return token_type::parse_error; + } + } + + private: + /// input adapter + InputAdapterType ia; + + /// whether comments should be ignored (true) or signaled as errors (false) + const bool ignore_comments = false; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// whether the next get() call should just return current + bool next_unget = false; + + /// the start position of the current token + position_t position {}; + + /// raw input token string (for error messages) + std::vector token_string {}; + + /// buffer for variable-length tokens (numbers, strings) + string_t token_buffer {}; + + /// a description of occurred lexer errors + const char* error_message = ""; + + // number values + number_integer_t value_integer = 0; + number_unsigned_t value_unsigned = 0; + number_float_t value_float = 0; + + /// the decimal point + const char_int_type decimal_point_char = '.'; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/input/parser.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/parser.hpp new file mode 100644 index 0000000..8acbd4f --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/parser.hpp @@ -0,0 +1,507 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // isfinite +#include // uint8_t +#include // function +#include // string +#include // move +#include // vector + +#include +#include +#include +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +//////////// +// parser // +//////////// + +enum class parse_event_t : std::uint8_t +{ + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value +}; + +template +using parser_callback_t = + std::function; + +/*! +@brief syntax analysis + +This class implements a recursive descent parser. +*/ +template +class parser +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using lexer_t = lexer; + using token_type = typename lexer_t::token_type; + + public: + /// a parser reading from an input adapter + explicit parser(InputAdapterType&& adapter, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true, + const bool skip_comments = false) + : callback(cb) + , m_lexer(std::move(adapter), skip_comments) + , allow_exceptions(allow_exceptions_) + { + // read first token + get_token(); + } + + /*! + @brief public parser interface + + @param[in] strict whether to expect the last token to be EOF + @param[in,out] result parsed JSON value + + @throw parse_error.101 in case of an unexpected token + @throw parse_error.102 if to_unicode fails or surrogate error + @throw parse_error.103 if to_unicode fails + */ + void parse(const bool strict, BasicJsonType& result) + { + if (callback) + { + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + exception_message(token_type::end_of_input, "value"), nullptr)); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } + } + else + { + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr)); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + } + + result.assert_invariant(); + } + + /*! + @brief public accept interface + + @param[in] strict whether to expect the last token to be EOF + @return whether the input is a proper JSON text + */ + bool accept(const bool strict = true) + { + json_sax_acceptor sax_acceptor; + return sax_parse(&sax_acceptor, strict); + } + + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse(SAX* sax, const bool strict = true) + { + (void)detail::is_sax_static_asserts {}; + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result && strict && (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr)); + } + + return result; + } + + private: + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse_internal(SAX* sax) + { + // stack to remember the hierarchy of structured values we are parsing + // true = array; false = object + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) + { + if (!skip_to_state_evaluation) + { + // invariant: get_token() was called before each iteration + switch (last_token) + { + case token_type::begin_object: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + // closing } -> we are done + if (get_token() == token_type::end_object) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + break; + } + + // parse key + if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr)); + } + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr)); + } + + // remember we are now inside an object + states.push_back(false); + + // parse values + get_token(); + continue; + } + + case token_type::begin_array: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + // closing ] -> we are done + if (get_token() == token_type::end_array) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(true); + + // parse values (no need to call get_token) + continue; + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, concat("number overflow parsing '", m_lexer.get_token_string(), '\''), nullptr)); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) + { + return false; + } + + break; + } + + case token_type::literal_false: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (JSON_HEDLEY_UNLIKELY(!sax->null())) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), nullptr)); + } + + case token_type::uninitialized: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::end_of_input: + case token_type::literal_or_value: + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr)); + } + } + } + else + { + skip_to_state_evaluation = false; + } + + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hierarchy: done + return true; + } + + if (states.back()) // array + { + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), nullptr)); + } + + // states.back() is false -> object + + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse key + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr)); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr)); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), nullptr)); + } + } + + /// get next token from lexer + token_type get_token() + { + return last_token = m_lexer.scan(); + } + + std::string exception_message(const token_type expected, const std::string& context) + { + std::string error_msg = "syntax error "; + + if (!context.empty()) + { + error_msg += concat("while parsing ", context, ' '); + } + + error_msg += "- "; + + if (last_token == token_type::parse_error) + { + error_msg += concat(m_lexer.get_error_message(), "; last read: '", + m_lexer.get_token_string(), '\''); + } + else + { + error_msg += concat("unexpected ", lexer_t::token_type_name(last_token)); + } + + if (expected != token_type::uninitialized) + { + error_msg += concat("; expected ", lexer_t::token_type_name(expected)); + } + + return error_msg; + } + + private: + /// callback function + const parser_callback_t callback = nullptr; + /// the type of the last read token + token_type last_token = token_type::uninitialized; + /// the lexer + lexer_t m_lexer; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/input/position_t.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/position_t.hpp new file mode 100644 index 0000000..396db0e --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/input/position_t.hpp @@ -0,0 +1,37 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // size_t + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/internal_iterator.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/internal_iterator.hpp new file mode 100644 index 0000000..13a212c --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/internal_iterator.hpp @@ -0,0 +1,35 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief an iterator value + +@note This structure could easily be a union, but MSVC currently does not allow +unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. +*/ +template struct internal_iterator +{ + /// iterator for JSON objects + typename BasicJsonType::object_t::iterator object_iterator {}; + /// iterator for JSON arrays + typename BasicJsonType::array_t::iterator array_iterator {}; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator {}; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iter_impl.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iter_impl.hpp new file mode 100644 index 0000000..3f5a990 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iter_impl.hpp @@ -0,0 +1,751 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next +#include // conditional, is_const, remove_const + +#include +#include +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// forward declare, to be able to friend it later on +template class iteration_proxy; +template class iteration_proxy_value; + +/*! +@brief a template for a bidirectional iterator for the @ref basic_json class +This class implements a both iterators (iterator and const_iterator) for the +@ref basic_json class. +@note An iterator is called *initialized* when a pointer to a JSON value has + been set (e.g., by a constructor or a copy assignment). If the iterator is + default-constructed, it is *uninitialized* and most methods are undefined. + **The library uses assertions to detect calls on uninitialized iterators.** +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +@since version 1.0.0, simplified in version 2.0.9, change to bidirectional + iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) +*/ +template +class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + /// the iterator with BasicJsonType of different const-ness + using other_iter_impl = iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; + /// allow basic_json to access private members + friend other_iter_impl; + friend BasicJsonType; + friend iteration_proxy; + friend iteration_proxy_value; + + using object_t = typename BasicJsonType::object_t; + using array_t = typename BasicJsonType::array_t; + // make sure BasicJsonType is basic_json or const basic_json + static_assert(is_basic_json::type>::value, + "iter_impl only accepts (const) basic_json"); + // superficial check for the LegacyBidirectionalIterator named requirement + static_assert(std::is_base_of::value + && std::is_base_of::iterator_category>::value, + "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement."); + + public: + /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. + /// The C++ Standard has never required user-defined iterators to derive from std::iterator. + /// A user-defined iterator should provide publicly accessible typedefs named + /// iterator_category, value_type, difference_type, pointer, and reference. + /// Note that value_type is required to be non-const, even for constant iterators. + using iterator_category = std::bidirectional_iterator_tag; + + /// the type of the values when the iterator is dereferenced + using value_type = typename BasicJsonType::value_type; + /// a type to represent differences between iterators + using difference_type = typename BasicJsonType::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename std::conditional::value, + typename BasicJsonType::const_pointer, + typename BasicJsonType::pointer>::type; + /// defines a reference to the type iterated over (value_type) + using reference = + typename std::conditional::value, + typename BasicJsonType::const_reference, + typename BasicJsonType::reference>::type; + + iter_impl() = default; + ~iter_impl() = default; + iter_impl(iter_impl&&) noexcept = default; + iter_impl& operator=(iter_impl&&) noexcept = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit iter_impl(pointer object) noexcept : m_object(object) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } + + case value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } + } + } + + /*! + @note The conventional copy constructor and copy assignment are implicitly + defined. Combined with the following converting constructor and + assignment, they support: (1) copy from iterator to iterator, (2) + copy from const iterator to const iterator, and (3) conversion from + iterator to const iterator. However conversion from const iterator + to iterator is not defined. + */ + + /*! + @brief const copy constructor + @param[in] other const iterator to copy from + @note This copy constructor had to be defined explicitly to circumvent a bug + occurring on msvc v19.0 compiler (VS 2015) debug build. For more + information refer to: https://github.com/nlohmann/json/issues/1608 + */ + iter_impl(const iter_impl& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl& other) noexcept + { + if (&other != this) + { + m_object = other.m_object; + m_it = other.m_it; + } + return *this; + } + + /*! + @brief converting constructor + @param[in] other non-const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl::type>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other non-const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl::type>& other) noexcept // NOLINT(cert-oop54-cpp) + { + m_object = other.m_object; + m_it = other.m_it; + return *this; + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->begin(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->begin(); + break; + } + + case value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_begin(); + break; + } + } + } + + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->end(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->end(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_end(); + break; + } + } + } + + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return m_it.object_iterator->second; + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return *m_it.array_iterator; + } + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + } + } + } + + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return &(m_it.object_iterator->second); + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return &*m_it.array_iterator; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + } + } + } + + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator++(int)& // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + ++(*this); + return result; + } + + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator++() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + ++m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator--(int)& // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + --(*this); + return result; + } + + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator--() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + --m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator==(const IterImpl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + return (m_it.object_iterator == other.m_it.object_iterator); + + case value_t::array: + return (m_it.array_iterator == other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator!=(const IterImpl& other) const + { + return !operator==(other); + } + + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const iter_impl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", m_object)); + + case value_t::array: + return (m_it.array_iterator < other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const iter_impl& other) const + { + return !other.operator < (*this); + } + + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const iter_impl& other) const + { + return !operator<=(other); + } + + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const iter_impl& other) const + { + return !operator<(other); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator+=(difference_type i) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object)); + + case value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator += i; + break; + } + } + + return *this; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator-=(difference_type i) + { + return operator+=(-i); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } + + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } + + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const iter_impl& other) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object)); + + case value_t::array: + return m_it.array_iterator - other.m_it.array_iterator; + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } + } + + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", m_object)); + + case value_t::array: + return *std::next(m_it.array_iterator, n); + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + } + } + } + + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const typename object_t::key_type& key() const + { + JSON_ASSERT(m_object != nullptr); + + if (JSON_HEDLEY_LIKELY(m_object->is_object())) + { + return m_it.object_iterator->first; + } + + JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", m_object)); + } + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const + { + return operator*(); + } + + JSON_PRIVATE_UNLESS_TESTED: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator::type> m_it {}; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iteration_proxy.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iteration_proxy.hpp new file mode 100644 index 0000000..61b9420 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iteration_proxy.hpp @@ -0,0 +1,242 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // size_t +#include // input_iterator_tag +#include // string, to_string +#include // tuple_size, get, tuple_element +#include // move + +#if JSON_HAS_RANGES + #include // enable_borrowed_range +#endif + +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +void int_to_string( string_type& target, std::size_t value ) +{ + // For ADL + using std::to_string; + target = to_string(value); +} +template class iteration_proxy_value +{ + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_value; + using pointer = value_type *; + using reference = value_type &; + using iterator_category = std::input_iterator_tag; + using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; + + private: + /// the iterator + IteratorType anchor{}; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable string_type array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + string_type empty_str{}; + + public: + explicit iteration_proxy_value() = default; + explicit iteration_proxy_value(IteratorType it, std::size_t array_index_ = 0) + noexcept(std::is_nothrow_move_constructible::value + && std::is_nothrow_default_constructible::value) + : anchor(std::move(it)) + , array_index(array_index_) + {} + + iteration_proxy_value(iteration_proxy_value const&) = default; + iteration_proxy_value& operator=(iteration_proxy_value const&) = default; + // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions + iteration_proxy_value(iteration_proxy_value&&) + noexcept(std::is_nothrow_move_constructible::value + && std::is_nothrow_move_constructible::value) = default; + iteration_proxy_value& operator=(iteration_proxy_value&&) + noexcept(std::is_nothrow_move_assignable::value + && std::is_nothrow_move_assignable::value) = default; + ~iteration_proxy_value() = default; + + /// dereference operator (needed for range-based for) + const iteration_proxy_value& operator*() const + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_value& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + iteration_proxy_value operator++(int)& // NOLINT(cert-dcl21-cpp) + { + auto tmp = iteration_proxy_value(anchor, array_index); + ++anchor; + ++array_index; + return tmp; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_value& o) const + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_value& o) const + { + return anchor != o.anchor; + } + + /// return key of the iterator + const string_type& key() const + { + JSON_ASSERT(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + int_to_string( array_index_str, array_index ); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } +}; + +/// proxy class for the items() function +template class iteration_proxy +{ + private: + /// the container to iterate + typename IteratorType::pointer container = nullptr; + + public: + explicit iteration_proxy() = default; + + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(&cont) {} + + iteration_proxy(iteration_proxy const&) = default; + iteration_proxy& operator=(iteration_proxy const&) = default; + iteration_proxy(iteration_proxy&&) noexcept = default; + iteration_proxy& operator=(iteration_proxy&&) noexcept = default; + ~iteration_proxy() = default; + + /// return iterator begin (needed for range-based for) + iteration_proxy_value begin() const noexcept + { + return iteration_proxy_value(container->begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_value end() const noexcept + { + return iteration_proxy_value(container->end()); + } +}; + +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.key()) +{ + return i.key(); +} +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.value()) +{ + return i.value(); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// The Addition to the STD Namespace is required to add +// Structured Bindings Support to the iteration_proxy_value class +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +namespace std +{ + +#if defined(__clang__) + // Fix: https://github.com/nlohmann/json/issues/1401 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template +class tuple_size<::nlohmann::detail::iteration_proxy_value> // NOLINT(cert-dcl58-cpp) + : public std::integral_constant {}; + +template +class tuple_element> // NOLINT(cert-dcl58-cpp) +{ + public: + using type = decltype( + get(std::declval < + ::nlohmann::detail::iteration_proxy_value> ())); +}; +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +} // namespace std + +#if JSON_HAS_RANGES + template + inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy> = true; +#endif diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iterator_traits.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iterator_traits.hpp new file mode 100644 index 0000000..34a20ee --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/iterator_traits.hpp @@ -0,0 +1,61 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // random_access_iterator_tag + +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/json_reverse_iterator.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/json_reverse_iterator.hpp new file mode 100644 index 0000000..eb450e9 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/json_reverse_iterator.hpp @@ -0,0 +1,130 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // ptrdiff_t +#include // reverse_iterator +#include // declval + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +////////////////////// +// reverse_iterator // +////////////////////// + +/*! +@brief a template for a reverse iterator class + +@tparam Base the base iterator type to reverse. Valid types are @ref +iterator (to create @ref reverse_iterator) and @ref const_iterator (to +create @ref const_reverse_iterator). + +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): + It is possible to write to the pointed-to element (only if @a Base is + @ref iterator). + +@since version 1.0.0 +*/ +template +class json_reverse_iterator : public std::reverse_iterator +{ + public: + using difference_type = std::ptrdiff_t; + /// shortcut to the reverse iterator adapter + using base_iterator = std::reverse_iterator; + /// the reference type for the pointed-to element + using reference = typename Base::reference; + + /// create reverse iterator from iterator + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) {} + + /// create reverse iterator from base class + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + + /// post-increment (it++) + json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp) + { + return static_cast(base_iterator::operator++(1)); + } + + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + return static_cast(base_iterator::operator++()); + } + + /// post-decrement (it--) + json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp) + { + return static_cast(base_iterator::operator--(1)); + } + + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + return static_cast(base_iterator::operator--()); + } + + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + return static_cast(base_iterator::operator+=(i)); + } + + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + return static_cast(base_iterator::operator+(i)); + } + + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + return static_cast(base_iterator::operator-(i)); + } + + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return base_iterator(*this) - base_iterator(other); + } + + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } + + /// return the key of an object iterator + auto key() const -> decltype(std::declval().key()) + { + auto it = --this->base(); + return it.key(); + } + + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/primitive_iterator.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/primitive_iterator.hpp new file mode 100644 index 0000000..0bc3ca8 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/iterators/primitive_iterator.hpp @@ -0,0 +1,132 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // ptrdiff_t +#include // numeric_limits + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/* +@brief an iterator for primitive JSON types + +This class models an iterator for primitive JSON types (boolean, number, +string). It's only purpose is to allow the iterator/const_iterator classes +to "iterate" over primitive values. Internally, the iterator is modeled by +a `difference_type` variable. Value begin_value (`0`) models the begin, +end_value (`1`) models past the end. +*/ +class primitive_iterator_t +{ + private: + using difference_type = std::ptrdiff_t; + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; + + JSON_PRIVATE_UNLESS_TESTED: + /// iterator as signed integer type + difference_type m_it = (std::numeric_limits::min)(); + + public: + constexpr difference_type get_value() const noexcept + { + return m_it; + } + + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } + + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } + + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return m_it == begin_value; + } + + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return m_it == end_value; + } + + friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it == rhs.m_it; + } + + friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it < rhs.m_it; + } + + primitive_iterator_t operator+(difference_type n) noexcept + { + auto result = *this; + result += n; + return result; + } + + friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it - rhs.m_it; + } + + primitive_iterator_t& operator++() noexcept + { + ++m_it; + return *this; + } + + primitive_iterator_t operator++(int)& noexcept // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + ++m_it; + return result; + } + + primitive_iterator_t& operator--() noexcept + { + --m_it; + return *this; + } + + primitive_iterator_t operator--(int)& noexcept // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + --m_it; + return result; + } + + primitive_iterator_t& operator+=(difference_type n) noexcept + { + m_it += n; + return *this; + } + + primitive_iterator_t& operator-=(difference_type n) noexcept + { + m_it -= n; + return *this; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/json_custom_base_class.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/json_custom_base_class.hpp new file mode 100644 index 0000000..ff06653 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/json_custom_base_class.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include // conditional, is_same + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief Default base class of the @ref basic_json class. + +So that the correct implementations of the copy / move ctors / assign operators +of @ref basic_json do not require complex case distinctions +(no base class / custom base class used as customization point), +@ref basic_json always has a base class. +By default, this class is used because it is empty and thus has no effect +on the behavior of @ref basic_json. +*/ +struct json_default_base {}; + +template +using json_base_class = typename std::conditional < + std::is_same::value, + json_default_base, + T + >::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/json_pointer.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/json_pointer.hpp new file mode 100644 index 0000000..84d92c1 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/json_pointer.hpp @@ -0,0 +1,988 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // all_of +#include // isdigit +#include // errno, ERANGE +#include // strtoull +#ifndef JSON_NO_IO + #include // ostream +#endif // JSON_NO_IO +#include // max +#include // accumulate +#include // string +#include // move +#include // vector + +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer +{ + // allow basic_json to access private members + NLOHMANN_BASIC_JSON_TPL_DECLARATION + friend class basic_json; + + template + friend class json_pointer; + + template + struct string_t_helper + { + using type = T; + }; + + NLOHMANN_BASIC_JSON_TPL_DECLARATION + struct string_t_helper + { + using type = StringType; + }; + + public: + // for backwards compatibility accept BasicJsonType + using string_t = typename string_t_helper::type; + + /// @brief create JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/ + explicit json_pointer(const string_t& s = "") + : reference_tokens(split(s)) + {} + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/to_string/ + string_t to_string() const + { + return std::accumulate(reference_tokens.begin(), reference_tokens.end(), + string_t{}, + [](const string_t& a, const string_t& b) + { + return detail::concat(a, '/', detail::escape(b)); + }); + } + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string()) + operator string_t() const + { + return to_string(); + } + +#ifndef JSON_NO_IO + /// @brief write string representation of the JSON pointer to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr) + { + o << ptr.to_string(); + return o; + } +#endif + + /// @brief append another JSON pointer at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(const json_pointer& ptr) + { + reference_tokens.insert(reference_tokens.end(), + ptr.reference_tokens.begin(), + ptr.reference_tokens.end()); + return *this; + } + + /// @brief append an unescaped reference token at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(string_t token) + { + push_back(std::move(token)); + return *this; + } + + /// @brief append an array index at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::size_t array_idx) + { + return *this /= std::to_string(array_idx); + } + + /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, + const json_pointer& rhs) + { + return json_pointer(lhs) /= rhs; + } + + /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, string_t token) // NOLINT(performance-unnecessary-value-param) + { + return json_pointer(lhs) /= std::move(token); + } + + /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) + { + return json_pointer(lhs) /= array_idx; + } + + /// @brief returns the parent of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/ + json_pointer parent_pointer() const + { + if (empty()) + { + return *this; + } + + json_pointer res = *this; + res.pop_back(); + return res; + } + + /// @brief remove last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/ + void pop_back() + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr)); + } + + reference_tokens.pop_back(); + } + + /// @brief return last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/back/ + const string_t& back() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr)); + } + + return reference_tokens.back(); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(const string_t& token) + { + reference_tokens.push_back(token); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(string_t&& token) + { + reference_tokens.push_back(std::move(token)); + } + + /// @brief return whether pointer points to the root document + /// @sa https://json.nlohmann.me/api/json_pointer/empty/ + bool empty() const noexcept + { + return reference_tokens.empty(); + } + + private: + /*! + @param[in] s reference token to be converted into an array index + + @return integer representation of @a s + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index begins not with a digit + @throw out_of_range.404 if string @a s could not be converted to an integer + @throw out_of_range.410 if an array index exceeds size_type + */ + template + static typename BasicJsonType::size_type array_index(const string_t& s) + { + using size_type = typename BasicJsonType::size_type; + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) + { + JSON_THROW(detail::parse_error::create(106, 0, detail::concat("array index '", s, "' must not begin with '0'"), nullptr)); + } + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) + { + JSON_THROW(detail::parse_error::create(109, 0, detail::concat("array index '", s, "' is not a number"), nullptr)); + } + + const char* p = s.c_str(); + char* p_end = nullptr; + errno = 0; // strtoull doesn't reset errno + const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int) + if (p == p_end // invalid input or empty string + || errno == ERANGE // out of range + || JSON_HEDLEY_UNLIKELY(static_cast(p_end - p) != s.size())) // incomplete read + { + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", s, "'"), nullptr)); + } + + // only triggered on special platforms (like 32bit), see also + // https://github.com/nlohmann/json/pull/2203 + if (res >= static_cast((std::numeric_limits::max)())) // NOLINT(runtime/int) + { + JSON_THROW(detail::out_of_range::create(410, detail::concat("array index ", s, " exceeds size_type"), nullptr)); // LCOV_EXCL_LINE + } + + return static_cast(res); + } + + JSON_PRIVATE_UNLESS_TESTED: + json_pointer top() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr)); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + private: + /*! + @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. + + @throw parse_error.109 if array index is not a number + @throw type_error.313 if value cannot be unflattened + */ + template + BasicJsonType& get_and_create(BasicJsonType& j) const + { + auto* result = &j; + + // in case no reference tokens exist, return a reference to the JSON value + // j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) + { + switch (result->type()) + { + case detail::value_t::null: + { + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; + } + + case detail::value_t::object: + { + // create an entry in the object + result = &result->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + // create an entry in the array + result = &result->operator[](array_index(reference_token)); + break; + } + + /* + The following code is only reached if there exists a reference + token _and_ the current value is primitive. In this case, we have + an error situation, because primitive values may only occur as + single value; that is, with an empty list of reference tokens. + */ + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", &j)); + } + } + + return *result; + } + + /*! + @brief return a reference to the pointed to value + + @note This version does not throw if a value is not present, but tries to + create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template + BasicJsonType& get_unchecked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + // convert null values to arrays or objects before continuing + if (ptr->is_null()) + { + // check if reference token is a number + const bool nums = + std::all_of(reference_token.begin(), reference_token.end(), + [](const unsigned char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object otherwise + *ptr = (nums || reference_token == "-") + ? detail::value_t::array + : detail::value_t::object; + } + + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (reference_token == "-") + { + // explicitly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](array_index(reference_token)); + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template + BasicJsonType& get_checked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, detail::concat( + "array index '-' (", std::to_string(ptr->m_value.array->size()), + ") is out of range"), ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template + const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" cannot be used for const access + JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_value.array->size()), ") is out of range"), ptr)); + } + + // use unchecked array access + ptr = &ptr->operator[](array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template + const BasicJsonType& get_checked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, detail::concat( + "array index '-' (", std::to_string(ptr->m_value.array->size()), + ") is out of range"), ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + */ + template + bool contains(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + if (!ptr->contains(reference_token)) + { + // we did not find the key in the object + return false; + } + + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) + { + // invalid char + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) + { + if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) + { + // first char should be between '1' and '9' + return false; + } + for (std::size_t i = 1; i < reference_token.size(); i++) + { + if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) + { + // other char should be between '0' and '9' + return false; + } + } + } + + const auto idx = array_index(reference_token); + if (idx >= ptr->size()) + { + // index out of range + return false; + } + + ptr = &ptr->operator[](idx); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // we do not expect primitive values if there is still a + // reference token to process + return false; + } + } + } + + // no reference token left means we found a primitive value + return true; + } + + /*! + @brief split the string input to reference tokens + + @note This function is only called by the json_pointer constructor. + All exceptions below are documented there. + + @throw parse_error.107 if the pointer is not empty or begins with '/' + @throw parse_error.108 if character '~' is not followed by '0' or '1' + */ + static std::vector split(const string_t& reference_string) + { + std::vector result; + + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return result; + } + + // check if nonempty reference string begins with slash + if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) + { + JSON_THROW(detail::parse_error::create(107, 1, detail::concat("JSON pointer must be empty or begin with '/' - was: '", reference_string, "'"), nullptr)); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + std::size_t slash = reference_string.find_first_of('/', 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == 0 (if slash == string_t::npos) + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == string_t::npos) + start = (slash == string_t::npos) ? 0 : slash + 1, + // find next slash + slash = reference_string.find_first_of('/', start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (std::size_t pos = reference_token.find_first_of('~'); + pos != string_t::npos; + pos = reference_token.find_first_of('~', pos + 1)) + { + JSON_ASSERT(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || + (reference_token[pos + 1] != '0' && + reference_token[pos + 1] != '1'))) + { + JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", nullptr)); + } + } + + // finally, store the reference token + detail::unescape(reference_token); + result.push_back(reference_token); + } + + return result; + } + + private: + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. + */ + template + static void flatten(const string_t& reference_string, + const BasicJsonType& value, + BasicJsonType& result) + { + switch (value.type()) + { + case detail::value_t::array: + { + if (value.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (std::size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(detail::concat(reference_string, '/', std::to_string(i)), + value.m_value.array->operator[](i), result); + } + } + break; + } + + case detail::value_t::object: + { + if (value.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + flatten(detail::concat(reference_string, '/', detail::escape(element.first)), element.second, result); + } + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } + + /*! + @param[in] value flattened JSON + + @return unflattened JSON + + @throw parse_error.109 if array index is not a number + @throw type_error.314 if value is not an object + @throw type_error.315 if object values are not primitive + @throw type_error.313 if value cannot be unflattened + */ + template + static BasicJsonType + unflatten(const BasicJsonType& value) + { + if (JSON_HEDLEY_UNLIKELY(!value.is_object())) + { + JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", &value)); + } + + BasicJsonType result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) + { + JSON_THROW(detail::type_error::create(315, "values in object must be primitive", &element.second)); + } + + // assign value to reference pointed to by JSON pointer; Note that if + // the JSON pointer is "" (i.e., points to the whole value), function + // get_and_create returns a reference to result itself. An assignment + // will then create a primitive value. + json_pointer(element.first).get_and_create(result) = element.second; + } + + return result; + } + + // can't use conversion operator because of ambiguity + json_pointer convert() const& + { + json_pointer result; + result.reference_tokens = reference_tokens; + return result; + } + + json_pointer convert()&& + { + json_pointer result; + result.reference_tokens = std::move(reference_tokens); + return result; + } + + public: +#if JSON_HAS_THREE_WAY_COMPARISON + /// @brief compares two JSON pointers for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + bool operator==(const json_pointer& rhs) const noexcept + { + return reference_tokens == rhs.reference_tokens; + } + + /// @brief compares JSON pointer and string for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer)) + bool operator==(const string_t& rhs) const + { + return *this == json_pointer(rhs); + } + + /// @brief 3-way compares two JSON pointers + template + std::strong_ordering operator<=>(const json_pointer& rhs) const noexcept // *NOPAD* + { + return reference_tokens <=> rhs.reference_tokens; // *NOPAD* + } +#else + /// @brief compares two JSON pointers for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const json_pointer& lhs, + const json_pointer& rhs) noexcept; + + /// @brief compares JSON pointer and string for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const json_pointer& lhs, + const StringType& rhs); + + /// @brief compares string and JSON pointer for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const StringType& lhs, + const json_pointer& rhs); + + /// @brief compares two JSON pointers for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const json_pointer& lhs, + const json_pointer& rhs) noexcept; + + /// @brief compares JSON pointer and string for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const json_pointer& lhs, + const StringType& rhs); + + /// @brief compares string and JSON pointer for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const StringType& lhs, + const json_pointer& rhs); + + /// @brief compares two JSON pointer for less-than + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator<(const json_pointer& lhs, + const json_pointer& rhs) noexcept; +#endif + + private: + /// the reference tokens + std::vector reference_tokens; +}; + +#if !JSON_HAS_THREE_WAY_COMPARISON +// functions cannot be defined inside class due to ODR violations +template +inline bool operator==(const json_pointer& lhs, + const json_pointer& rhs) noexcept +{ + return lhs.reference_tokens == rhs.reference_tokens; +} + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer)) +inline bool operator==(const json_pointer& lhs, + const StringType& rhs) +{ + return lhs == json_pointer(rhs); +} + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer)) +inline bool operator==(const StringType& lhs, + const json_pointer& rhs) +{ + return json_pointer(lhs) == rhs; +} + +template +inline bool operator!=(const json_pointer& lhs, + const json_pointer& rhs) noexcept +{ + return !(lhs == rhs); +} + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer)) +inline bool operator!=(const json_pointer& lhs, + const StringType& rhs) +{ + return !(lhs == rhs); +} + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer)) +inline bool operator!=(const StringType& lhs, + const json_pointer& rhs) +{ + return !(lhs == rhs); +} + +template +inline bool operator<(const json_pointer& lhs, + const json_pointer& rhs) noexcept +{ + return lhs.reference_tokens < rhs.reference_tokens; +} +#endif + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/json_ref.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/json_ref.hpp new file mode 100644 index 0000000..47911fb --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/json_ref.hpp @@ -0,0 +1,78 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +class json_ref +{ + public: + using value_type = BasicJsonType; + + json_ref(value_type&& value) + : owned_value(std::move(value)) + {} + + json_ref(const value_type& value) + : value_ref(&value) + {} + + json_ref(std::initializer_list init) + : owned_value(init) + {} + + template < + class... Args, + enable_if_t::value, int> = 0 > + json_ref(Args && ... args) + : owned_value(std::forward(args)...) + {} + + // class should be movable only + json_ref(json_ref&&) noexcept = default; + json_ref(const json_ref&) = delete; + json_ref& operator=(const json_ref&) = delete; + json_ref& operator=(json_ref&&) = delete; + ~json_ref() = default; + + value_type moved_or_copied() const + { + if (value_ref == nullptr) + { + return std::move(owned_value); + } + return *value_ref; + } + + value_type const& operator*() const + { + return value_ref ? *value_ref : owned_value; + } + + value_type const* operator->() const + { + return &** this; + } + + private: + mutable value_type owned_value = nullptr; + value_type const* value_ref = nullptr; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/macro_scope.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/macro_scope.hpp new file mode 100644 index 0000000..2870a4f --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/macro_scope.hpp @@ -0,0 +1,469 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // declval, pair +#include +#include + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +#include + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/macro_unscope.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/macro_unscope.hpp new file mode 100644 index 0000000..4a871f0 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/macro_unscope.hpp @@ -0,0 +1,44 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +// restore clang diagnostic settings +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +// clean up +#undef JSON_ASSERT +#undef JSON_INTERNAL_CATCH +#undef JSON_THROW +#undef JSON_PRIVATE_UNLESS_TESTED +#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION +#undef NLOHMANN_BASIC_JSON_TPL +#undef JSON_EXPLICIT +#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL +#undef JSON_INLINE_VARIABLE +#undef JSON_NO_UNIQUE_ADDRESS +#undef JSON_DISABLE_ENUM_SERIALIZATION +#undef JSON_USE_GLOBAL_UDLS + +#ifndef JSON_TEST_KEEP_MACROS + #undef JSON_CATCH + #undef JSON_TRY + #undef JSON_HAS_CPP_11 + #undef JSON_HAS_CPP_14 + #undef JSON_HAS_CPP_17 + #undef JSON_HAS_CPP_20 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #undef JSON_HAS_THREE_WAY_COMPARISON + #undef JSON_HAS_RANGES + #undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#include diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/begin.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/begin.hpp new file mode 100644 index 0000000..27d36c6 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/begin.hpp @@ -0,0 +1,17 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/end.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/end.hpp new file mode 100644 index 0000000..d10bf83 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/call_std/end.hpp @@ -0,0 +1,17 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/cpp_future.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/cpp_future.hpp new file mode 100644 index 0000000..22f2514 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/cpp_future.hpp @@ -0,0 +1,171 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + +#pragma once + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +inline constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/detected.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/detected.hpp new file mode 100644 index 0000000..b2f6db9 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/detected.hpp @@ -0,0 +1,70 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/identity_tag.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/identity_tag.hpp new file mode 100644 index 0000000..71164f2 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/identity_tag.hpp @@ -0,0 +1,21 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// dispatching helper struct +template struct identity_tag {}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/is_sax.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/is_sax.hpp new file mode 100644 index 0000000..2150089 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/is_sax.hpp @@ -0,0 +1,159 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // size_t +#include // declval +#include // string + +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using null_function_t = decltype(std::declval().null()); + +template +using boolean_function_t = + decltype(std::declval().boolean(std::declval())); + +template +using number_integer_function_t = + decltype(std::declval().number_integer(std::declval())); + +template +using number_unsigned_function_t = + decltype(std::declval().number_unsigned(std::declval())); + +template +using number_float_function_t = decltype(std::declval().number_float( + std::declval(), std::declval())); + +template +using string_function_t = + decltype(std::declval().string(std::declval())); + +template +using binary_function_t = + decltype(std::declval().binary(std::declval())); + +template +using start_object_function_t = + decltype(std::declval().start_object(std::declval())); + +template +using key_function_t = + decltype(std::declval().key(std::declval())); + +template +using end_object_function_t = decltype(std::declval().end_object()); + +template +using start_array_function_t = + decltype(std::declval().start_array(std::declval())); + +template +using end_array_function_t = decltype(std::declval().end_array()); + +template +using parse_error_function_t = decltype(std::declval().parse_error( + std::declval(), std::declval(), + std::declval())); + +template +struct is_sax +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static constexpr bool value = + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value; +}; + +template +struct is_sax_static_asserts +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static_assert(is_detected_exact::value, + "Missing/invalid function: bool null()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_integer(number_integer_t)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool string(string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool binary(binary_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_object(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool key(string_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_object()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_array(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_array()"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool parse_error(std::size_t, const " + "std::string&, const exception&)"); +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/std_fs.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/std_fs.hpp new file mode 100644 index 0000000..c096158 --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/std_fs.hpp @@ -0,0 +1,29 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END +#elif JSON_HAS_FILESYSTEM +#include +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +namespace std_fs = std::filesystem; +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END +#endif diff --git a/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/type_traits.hpp b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/type_traits.hpp new file mode 100644 index 0000000..cfc7e5a --- /dev/null +++ b/othersoft/TemperatureControler/src/json/nlohmann/detail/meta/type_traits.hpp @@ -0,0 +1,740 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +#pragma once + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple + +#include +#include +#include +#include +#include +#include +#include + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template