Index: sources/storage/storageglobals.cpp =================================================================== diff -u -rd1907168ef46faa6de1ada400cad789f8379041f -r9551959461d534dc624f0cbcca0e6f953844fb16 --- sources/storage/storageglobals.cpp (.../storageglobals.cpp) (revision d1907168ef46faa6de1ada400cad789f8379041f) +++ sources/storage/storageglobals.cpp (.../storageglobals.cpp) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -31,13 +31,15 @@ // Treatment #ifdef QT_DEBUG - const char *Treatment_Base_Path_Name = "/home/denali/Desktop/treatment/"; - const char *Treatment_Profiles_Dir = "/home/denali/Desktop/treatment/profiles/"; - const char *Treatment_Parameter_Ranges_Path = "/home/denali/Desktop/treatment/denali.conf"; + const char *Treatment_Base_Path_Name = "/home/denali/Desktop/treatment/"; + const char *Treatment_Profiles_Dir = "/home/denali/Desktop/treatment/profiles/"; + const char *Treatment_Parameter_Ranges_Path = "/home/denali/Desktop/treatment/denali.conf"; + const char *Treatment_Parameter_Ranges_Path_CSV = "/home/denali/Desktop/treatment/denali.csv"; #else - const char *Treatment_Base_Path_Name = "/media/sd-card/treatment/"; - const char *Treatment_Profiles_Dir = "/media/sd-card/treatment/profiles/"; - const char *Treatment_Parameter_Ranges_Path = "/media/sd-card/treatment/denali.conf"; + const char *Treatment_Base_Path_Name = "/media/sd-card/treatment/"; + const char *Treatment_Profiles_Dir = "/media/sd-card/treatment/profiles/"; + const char *Treatment_Parameter_Ranges_Path = "/media/sd-card/treatment/denali.conf"; + const char *Treatment_Parameter_Ranges_Path_CSV = "/media/sd-card/treatment/denali.csv"; #endif const char *SDCard_Base_Path_Name = "/media/sd-card/"; } Index: sources/storage/storageglobals.h =================================================================== diff -u -rd1907168ef46faa6de1ada400cad789f8379041f -r9551959461d534dc624f0cbcca0e6f953844fb16 --- sources/storage/storageglobals.h (.../storageglobals.h) (revision d1907168ef46faa6de1ada400cad789f8379041f) +++ sources/storage/storageglobals.h (.../storageglobals.h) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -29,8 +29,9 @@ extern const char *Log_File_Name ; // Treatment - extern const char *Treatment_Profiles_Dir ; - extern const char *Treatment_Parameter_Ranges_Path ; - extern const char *SDCard_Base_Path_Name; + extern const char *Treatment_Profiles_Dir ; + extern const char *Treatment_Parameter_Ranges_Path ; + extern const char *Treatment_Parameter_Ranges_Path_CSV ; + extern const char *SDCard_Base_Path_Name ; } Index: sources/view/VCreateTreatment.cpp =================================================================== diff -u -r9612f309f51323d5f89fa7acd64acb3e355380e2 -r9551959461d534dc624f0cbcca0e6f953844fb16 --- sources/view/VCreateTreatment.cpp (.../VCreateTreatment.cpp) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) +++ sources/view/VCreateTreatment.cpp (.../VCreateTreatment.cpp) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -410,6 +410,63 @@ } +/** + * @brief VCreateTreatment::getParameterRangesDataCSV + * Gets the parameter ranges data prepared for CSV file format + * @return QString - the data to write to CSV + */ +QString VCreateTreatment::getParameterRangesDataCSV() +{ + QString csvData; + QString sep = ","; + + csvData += QString("bloodFlowRateMin,%0\n").arg(bloodFlowRateMin()); + csvData += QString("bloodFlowRateMax,%0\n").arg(bloodFlowRateMax()); + csvData += QString("dialysateFlowRateMin,%0\n").arg(dialysateFlowRateMin()); + csvData += QString("dialysateFlowRateMax,%0\n").arg(dialysateFlowRateMax()); + csvData += QString("durationMin,%0\n").arg(durationMin()); + csvData += QString("durationMax,%0\n").arg(durationMax()); + csvData += QString("heparinDispensingRateMin,%0\n").arg(heparinDispensingRateMin()); + csvData += QString("heparinDispensingRateMax,%0\n").arg(heparinDispensingRateMax()); + csvData += QString("heparinBolusVolumeMin,%0\n").arg(heparinBolusVolumeMin()); + csvData += QString("heparinBolusVolumeMax,%0\n").arg(heparinBolusVolumeMax()); + csvData += QString("heparinStopTimeMin,%0\n").arg(heparinStopTimeMin()); + csvData += QString("heparinStopTimeMax,%0\n").arg(heparinStopTimeMax()); + csvData += QString("salineBolusOptions,%0\n").arg(salineBolusOptions().join(sep)); + csvData += QString("acidConcentrateOptions,%0\n").arg(acidConcentrateOptions().join(sep)); + csvData += QString("bicarbonateConcentrateOptions,%0\n").arg(bicarbonateConcentrateOptions().join(sep)); + csvData += QString("dialyzerTypeOptions,%0\n").arg(dialyzerTypeOptions().join(sep)); + csvData += QString("dialysateTempMin,%0\n").arg(dialysateTempMin()); + csvData += QString("dialysateTempMax,%0\n").arg(dialysateTempMax()); + csvData += QString("arterialPressureLimitLowMin,%0\n").arg(arterialPressureLimitLowMin()); + csvData += QString("arterialPressureLimitLowMax,%0\n").arg(arterialPressureLimitLowMax()); + csvData += QString("arterialPressureLimitHighMin,%0\n").arg(arterialPressureLimitHighMin()); + csvData += QString("arterialPressureLimitHighMax,%0\n").arg(arterialPressureLimitHighMax()); + csvData += QString("venousPressureLimitLowMin,%0\n").arg(venousPressureLimitLowMin()); + csvData += QString("venousPressureLimitLowMax,%0\n").arg(venousPressureLimitLowMax()); + csvData += QString("venousPressureLimitHighMin,%0\n").arg(venousPressureLimitHighMin()); + csvData += QString("venousPressureLimitHighMax,%0\n").arg(venousPressureLimitHighMax()); + csvData += QString("bloodPressureMeasureIntervalMin,%0\n").arg(bloodPressureMeasureIntervalMin()); + csvData += QString("bloodPressureMeasureIntervalMax,%0\n").arg(bloodPressureMeasureIntervalMax()); + csvData += QString("rinsebackFlowRateMin,%0\n").arg(rinsebackFlowRateMin()); + csvData += QString("rinsebackFlowRateMax,%0\n").arg(rinsebackFlowRateMax()); + + return csvData; +} + +/*! + * \brief VCreateTreatment::saveTreatmentRangesCSV + * Saves the treatment ranges to a CSV file + * \param filename - the csv file to save the ranges to + * \return bool - true if successful, false otherwise + */ +bool VCreateTreatment::saveTreatmentRangesCSV(const QString &filename) +{ + QString csvData = getParameterRangesDataCSV(); + + return FileHandler::write(filename, csvData); +} + void VCreateTreatment::onFinishedSaveNewTreatment(bool success) { if (success) { Index: sources/view/VCreateTreatment.h =================================================================== diff -u -r9612f309f51323d5f89fa7acd64acb3e355380e2 -r9551959461d534dc624f0cbcca0e6f953844fb16 --- sources/view/VCreateTreatment.h (.../VCreateTreatment.h) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) +++ sources/view/VCreateTreatment.h (.../VCreateTreatment.h) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -96,6 +96,8 @@ TreatmentData treatmentData; bool validate(const TreatmentData &vData); QString saveNewTreatment(QJsonObject obj); + QString getParameterRangesDataCSV(); + bool saveTreatmentRangesCSV(const QString &filename); QJsonObject loadTreatmentParameterRanges(const QString &path = Treatment_Parameter_Ranges_Path); QStringList jsonArrayToStringList(const QJsonArray &arr); bool indexInItems(quint32 idx, const QStringList &items); Index: unittests/tst_messaging.cpp =================================================================== diff -u -rbf645acccabb7b5a84801620c4f7fa0b0e6878e0 -r9551959461d534dc624f0cbcca0e6f953844fb16 --- unittests/tst_messaging.cpp (.../tst_messaging.cpp) (revision bf645acccabb7b5a84801620c4f7fa0b0e6878e0) +++ unittests/tst_messaging.cpp (.../tst_messaging.cpp) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -796,6 +796,23 @@ } /*! + * \brief tst_messaging::tst_MessageInterpreter_createTreatmentResp + * Tests that an invalid response message is detected properly + */ +void tst_messaging::tst_MessageInterpreter_createTreatmentResp() +{ + Can::MessageInterpreter interpreter; + Can::Message msg; + msg.actionId = Gui::GuiActionType::ID_CreateTreatmentRsp; + msg.data = {}; + QVariantList data; + QVERIFY(! interpreter.createTreatmentRespData(msg, data)); + + msg.actionId = Gui::GuiActionType::ID_CreateTreatmentReq; + QVERIFY(! interpreter.createTreatmentRespData(msg, data)); +} + +/*! * \brief tst_messaging::tst_MessageBuilder_addActionId * \details Tests addActionId() method usage of MessageBuilder */ @@ -934,4 +951,3 @@ dMsg.actionTransmit(Gui::GuiActionType::ID_KeepAlive, data, seq); } - Index: unittests/tst_messaging.h =================================================================== diff -u -rbf645acccabb7b5a84801620c4f7fa0b0e6878e0 -r9551959461d534dc624f0cbcca0e6f953844fb16 --- unittests/tst_messaging.h (.../tst_messaging.h) (revision bf645acccabb7b5a84801620c4f7fa0b0e6878e0) +++ unittests/tst_messaging.h (.../tst_messaging.h) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -98,6 +98,7 @@ void tst_MessageInterpreter_interpretMessage_DG_Unhandled(); void tst_MessageInterpreter_notify_fromByteArray(); + void tst_MessageInterpreter_createTreatmentResp(); void tst_MessageBuilder_addActionId(); void tst_MessageBuilder_addData_shorterLen(); @@ -109,7 +110,7 @@ void tst_MessageBuilder_buildFrames_eLenCanFrame(); void tst_MessageDispatcher_actionTransmit(); - void tst_MessageDispatcher_actionTransmit_Unknown(); + void tst_MessageDispatcher_actionTransmit_Unknown(); }; Index: unittests/tst_views.cpp =================================================================== diff -u -r9612f309f51323d5f89fa7acd64acb3e355380e2 -r9551959461d534dc624f0cbcca0e6f953844fb16 --- unittests/tst_views.cpp (.../tst_views.cpp) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) +++ unittests/tst_views.cpp (.../tst_views.cpp) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -320,6 +320,23 @@ } +void tst_views::VCreateTreatment_save_csv() +{ + View::VCreateTreatment view; + QString csvData = view.getParameterRangesDataCSV(); + QString filename = QString("/tmp/out_%0.csv").arg(QDateTime::currentDateTime().toString(datetimeFormat)); + + view.saveTreatmentRangesCSV(filename); + + QString readCsvData; + FileHandler::readCSV(filename, readCsvData); + + QCOMPARE(csvData, readCsvData); + + QVERIFY(!FileHandler::readCSV(filename + "invalid", readCsvData)); + +} + /*! * \brief tst_views::VCreateTreatment_save * Tests that VCreateTreatment saves treatment profiles properly. Index: unittests/tst_views.h =================================================================== diff -u -r9612f309f51323d5f89fa7acd64acb3e355380e2 -r9551959461d534dc624f0cbcca0e6f953844fb16 --- unittests/tst_views.h (.../tst_views.h) (revision 9612f309f51323d5f89fa7acd64acb3e355380e2) +++ unittests/tst_views.h (.../tst_views.h) (revision 9551959461d534dc624f0cbcca0e6f953844fb16) @@ -26,6 +26,8 @@ Q_OBJECT public: explicit tst_views(QObject *parent = nullptr); +private: + QString datetimeFormat = "MM.dd.yyyy_HH.mm.ss"; private slots: void VTreatmentAdjustmentsResponse_text_NoReason(); @@ -38,10 +40,10 @@ void VCreateTreatment_validation_ranges(); void VCreateTreatment_save(); void VCreateTreatment_json(); + void VCreateTreatment_save_csv(); void VCreateTreatment_enums(); void VCreateTreatment_fw_validation_response(); void VCreateTreatment_init_ranges(QJsonObject &obj); void VCreateTreatment_load_parameter_ranges(); - };