Index: sources/storage/TreatmentLog.cpp =================================================================== diff -u -rb3eb8bc9696c4db9867ad1cf13b47c455a94e0fe -r6816b783f50e08267aa016d64350bc020080d901 --- sources/storage/TreatmentLog.cpp (.../TreatmentLog.cpp) (revision b3eb8bc9696c4db9867ad1cf13b47c455a94e0fe) +++ sources/storage/TreatmentLog.cpp (.../TreatmentLog.cpp) (revision 6816b783f50e08267aa016d64350bc020080d901) @@ -25,6 +25,8 @@ using namespace Storage; +#define NONE "N/A" +#define FLOAT3 0,'f',3 #define ADDTITLE(vTITLE) logContent += QString("[%1]\n").arg(vTITLE) #define ADDALINE(vTEXT ) logContent += QString("%1\n" ).arg(vTEXT ) #define ADDTOLOG(vINDEX) index = vINDEX; logContent += _titles[index] + sep + _values[index] + sep + _units[index] + "\n"; @@ -36,20 +38,21 @@ */ TreatmentLog::TreatmentLog(QObject *parent) : QObject(parent) { initConnections(); - _treatmentLogPath = QString("%1%2") - .arg(Storage::SDCard_Base_Path_Name) - .arg(Storage::Treatment_Log_Folder ); + logPath(Logger::eLogTrtmt, _Logger.logPath(Logger::eLogTrtmt)); } /*! \brief Connection Initializer \details All the class signal/slot connections are defined here. */ void TreatmentLog::initConnections() { - connect(&_exportWatcher, SIGNAL(finished()), - this , SLOT(onExport())); + connect(&_Logger , SIGNAL(didLogPathSet(Logger::LogType, const QString &)), + this , SLOT( onLogPathSet(Logger::LogType, const QString &))); - connect(&_saveWatcher , SIGNAL(finished()), - this , SLOT(onSave ())); + connect(&_exportWatcher , SIGNAL(finished()), + this , SLOT(onExport())); + + connect(&_saveWatcher , SIGNAL(finished()), + this , SLOT(onSave ())); } /*! @@ -96,27 +99,27 @@ _values[eCalciumConcentration ] = mStrText.arg(vData.mCalciumConcentration ); _values[eBicarbonateConcentration ] = mStrText.arg(vData.mBicarbonateConcentration ); _values[eSodiumConcentration ] = mStrText.arg(vData.mSodiumConcentration ); - _values[eDialysateTemperature ] = mStrText.arg(vData.mDialysateTemperature ,0,'f',3); + _values[eDialysateTemperature ] = mStrText.arg(vData.mDialysateTemperature ,FLOAT3 ); _values[eDialyzerType ] = mDialyzerType ; _values[eHeparinType ] = mHeparinType ; _values[eHeparinConcentration ] = mStrText.arg(mHeparinConcentration ); // Decided to be removed, but has to be here until it is actually removed from the message - _values[eHeparinBolusVolume ] = mStrText.arg(vData.mHeparinBolusVolume ,0,'f',3); - _values[eHeparinDispenseRate ] = mStrText.arg(vData.mHeparinDispenseRate ,0,'f',3); + _values[eHeparinBolusVolume ] = mStrText.arg(vData.mHeparinBolusVolume ,FLOAT3 ); + _values[eHeparinDispenseRate ] = mStrText.arg(vData.mHeparinDispenseRate ,FLOAT3 ); _values[eHeparinStop ] = mStrText.arg(vData.mHeparinStop ); - _values[eHeparinDeliveredVolume ] = mStrText.arg(vData.mHeparinDeliveredVolume ,0,'f',3); + _values[eHeparinDeliveredVolume ] = mStrText.arg(vData.mHeparinDeliveredVolume ,FLOAT3 ); _values[eTreatmentDateTime ] = mTreatmentDateTime ; _values[eWaterSampleTestResult ] = mWaterSampleTestResult ; - _values[eDialysateVolumeUsed ] = mStrText.arg(vData.mDialysateVolumeUsed ,0,'f',3); - _values[eTargetUFVolume ] = mStrText.arg(vData.mTargetUFVolume ,0,'f',3); - _values[eActualUFVolume ] = mStrText.arg(vData.mActualUFVolume ,0,'f',3); - _values[eTargetUFRate ] = mStrText.arg(vData.mTargetUFRate ,0,'f',3); - _values[eActualUFRate ] = mStrText.arg(vData.mActualUFRate ,0,'f',3); + _values[eDialysateVolumeUsed ] = mStrText.arg(vData.mDialysateVolumeUsed ,FLOAT3 ); + _values[eTargetUFVolume ] = mStrText.arg(vData.mTargetUFVolume ,FLOAT3 ); + _values[eActualUFVolume ] = mStrText.arg(vData.mActualUFVolume ,FLOAT3 ); + _values[eTargetUFRate ] = mStrText.arg(vData.mTargetUFRate ,FLOAT3 ); + _values[eActualUFRate ] = mStrText.arg(vData.mActualUFRate ,FLOAT3 ); _values[eSalineBolusVolume ] = mStrText.arg(vData.mSalineBolusVolume ); - _values[eAverageBloodFlow ] = mStrText.arg(vData.mAverageBloodFlow ,0,'f',3); - _values[eAverageDialysateFlow ] = mStrText.arg(vData.mAverageDialysateFlow ,0,'f',3); - _values[eAverageDialysateTemp ] = mStrText.arg(vData.mAverageDialysateTemp ,0,'f',3); - _values[eAverageArterialPressure ] = mStrText.arg(vData.mAverageArterialPressure ,0,'f',3); - _values[eAverageVenousPressure ] = mStrText.arg(vData.mAverageVenousPressure ,0,'f',3); + _values[eAverageBloodFlow ] = mStrText.arg(vData.mAverageBloodFlow ,FLOAT3 ); + _values[eAverageDialysateFlow ] = mStrText.arg(vData.mAverageDialysateFlow ,FLOAT3 ); + _values[eAverageDialysateTemp ] = mStrText.arg(vData.mAverageDialysateTemp ,FLOAT3 ); + _values[eAverageArterialPressure ] = mStrText.arg(vData.mAverageArterialPressure ,FLOAT3 ); + _values[eAverageVenousPressure ] = mStrText.arg(vData.mAverageVenousPressure ,FLOAT3 ); _values[eEndTreatmentEarlyAlarm ] = mStrText.arg(vData.mEndTreatmentEarlyAlarm ); } @@ -128,6 +131,41 @@ void TreatmentLog::append(const TreatmentLogAlarmData &vData) { _treatmentLogAlarmData.append(vData); } void TreatmentLog::append(const TreatmentLogEventData &vData) { _treatmentLogEventData.append(vData); } +/*! + * \brief TreatmentLog::onLogPathSet + * \details sets the logging path + * \param vLogType - The log type which in this should be eLogTrtmt + * \param vLogPath - The full treatment log path + */ +void TreatmentLog::onLogPathSet(Logger::LogType vLogType, const QString &vLogPath) +{ + logPath(vLogType, vLogPath); +} + +/*! + * \brief TreatmentLog::logPath + * \details sets the treatment log path if the given type is treatment log, with the path, vLogPath. + * If the given vLogPath is empty, the defaults in Storage will be used. + * \sa Storage::SDCard_Base_Path_Name + * \sa Storage::Treatment_Log_Folder + * \param vLogType - The Log type of type Logger::LogType + * \param vLogPath - the path to be set and used. + */ +void TreatmentLog::logPath(Logger::LogType vLogType, QString vLogPath) +{ + if (vLogType == Logger::eLogTrtmt) { + if ( vLogPath.trimmed().isEmpty() ) { + _treatmentLogPath = QString("%1%2") + .arg(Storage::SDCard_Base_Path_Name) + .arg(Storage::Treatment_Log_Folder ); + } + else { + _treatmentLogPath = vLogPath; + } + LOG_DEBUG(QString("Treatment log folder has been set to %1.").arg(_treatmentLogPath)); + } +} + // ----- Save /*! * \brief TreatmentLog::doSave @@ -146,7 +184,7 @@ */ void TreatmentLog::saveLogConcurrent() { - LOG_EVENT("Save Treatment Log Started"); + LOG_DEBUG("Save Treatment Log Started"); QFuture mFuture = QtConcurrent::run(this, &TreatmentLog::saveLog); _saveWatcher.setFuture(mFuture); } @@ -162,14 +200,15 @@ if (!ok) return false; - QString logContent; - QString sep = ","; - QString csv = "%1" + sep; - uint index = 0; - const char *NONE = "N/A"; + QString logContent ; + QString sep = "," ; + QString csv = "%1" + sep; + QString end = "%1" ; + uint index = 0 ; + ADDTITLE("Title"); - ADDALINE(csv.arg(tr("Patient Name")) + NONE ); - ADDALINE(csv.arg(tr("Patient ID" )) + NONE ); + ADDALINE(csv.arg(tr("Patient Name")) + NONE); + ADDALINE(csv.arg(tr("Patient ID" )) + NONE); ADDTOLOG( eTreatmentDateTime ); ADDTOLOG( eDeviceID ); @@ -192,8 +231,8 @@ ADDTOLOG( eHeparinStop ); ADDTITLE("Treatment Parameters" ); - ADDTITLE(csv.arg(tr("Start Time")) + NONE ); - ADDTITLE(csv.arg(tr("End Time" )) + NONE ); + ADDALINE(csv.arg(tr("Start Time")) + NONE); + ADDALINE(csv.arg(tr("End Time" )) + NONE); ADDTOLOG( eTreatmentDuration ); ADDTITLE("Post-Treatment Data" ); @@ -217,37 +256,39 @@ ADDTITLE("Treatment Data" ); for ( const TreatmentLogAvrgeData &item : _treatmentLogAvrgeData ) { QString line; - line += csv.arg(item.mTimeStamp); - line += csv.arg(NONE); - line += csv.arg(item.mBloodFlowRate); - line += csv.arg(item.mDialysateFlowRate); - line += csv.arg(item.mUFRate); - line += csv.arg(item.mArterialPressure); - line += csv.arg(item.mVenousPressure); - line += csv.arg(item.mSystolic); - line += csv.arg(item.mDiastolic); - line += csv.arg(item.mHeartRate); + line += csv.arg(item.mTimeStamp ); + line += csv.arg(NONE ); + line += csv.arg(item.mBloodFlowRate ); + line += csv.arg(item.mDialysateFlowRate ); + line += csv.arg(item.mUFRate ,FLOAT3 ); + line += csv.arg(item.mArterialPressure ,FLOAT3 ); + line += csv.arg(item.mVenousPressure ,FLOAT3 ); + line += csv.arg(item.mSystolic ); + line += csv.arg(item.mDiastolic ); + line += end.arg(item.mHeartRate ); ADDALINE(line); } ADDTITLE("Treatment Alarms" ); for ( const TreatmentLogAlarmData &item : _treatmentLogAlarmData ) { QString line; - line += csv.arg(item.mTimeStamp); - line += csv.arg(item.mAlarmID); - line += csv.arg(item.mParam1); + line += csv.arg(item.mTimeStamp ); + line += csv.arg(item.mAlarmID ); + line += csv.arg(item.mParam1 ); + line += end.arg(item.mParam2 ); ADDALINE(line); } ADDTITLE("Treatment Events" ); for ( const TreatmentLogEventData &item : _treatmentLogEventData ) { QString line; - line += csv.arg(item.mTimeStamp); - line += csv.arg(item.mEventID); - line += csv.arg(item.mOldValue); - line += csv.arg(item.mNewValue); + line += csv.arg(item.mTimeStamp ); + line += csv.arg(item.mEventID ); + line += csv.arg(item.mOldValue ,FLOAT3 ); + line += end.arg(item.mNewValue ,FLOAT3 ); ADDALINE(line); } + ADDALINE(""); QString mDateTime = _values[eTreatmentDateTime]; mDateTime.replace("/", "" ); // remove date separator @@ -258,9 +299,14 @@ QString mFileName = QString("%1_%2.log") .arg(mDateTime) .arg(mDeviceID); - Storage::FileHandler::makeFolder(_treatmentLogPath); - ok = Storage::FileHandler::write(_treatmentLogPath + mFileName, logContent, false); + ok = Storage::FileHandler::makeFolder(_treatmentLogPath); + if ( ! ok ) { LOG_DEBUG(QString("Cannot create folder %1").arg(_treatmentLogPath)); return ok; } + ok = Storage::FileHandler::write(mFileName.prepend(_treatmentLogPath), logContent, false); + if ( ! ok ) { LOG_DEBUG(QString("Cannot write to file %1").arg(mFileName )); return ok; } + _treatmentLogAvrgeData.clear(); + _treatmentLogAlarmData.clear(); + _treatmentLogEventData.clear(); return ok; } @@ -270,7 +316,7 @@ */ void TreatmentLog::onSave() { - LOG_EVENT(QString("Save Treatment Log Ended: %1").arg(_saveWatcher.result())); + LOG_DEBUG(QString("Save Treatment Log Ended: %1").arg(_saveWatcher.result())); isIdle(true); } @@ -292,7 +338,7 @@ */ void TreatmentLog::exportLogConcurrent() { - LOG_EVENT("Export Treatment Log Started"); + LOG_DEBUG("Export Treatment Log Started"); QFuture mFuture = QtConcurrent::run(this, &TreatmentLog::exportLog); _exportWatcher.setFuture(mFuture); } @@ -317,6 +363,6 @@ */ void TreatmentLog::onExport() { - LOG_EVENT(QString("Export Treatment Log Ended: %1").arg(_exportWatcher.result())); + LOG_DEBUG(QString("Export Treatment Log Ended: %1").arg(_exportWatcher.result())); isIdle(true); }