Index: AlarmMapping.csv =================================================================== diff -u -reaf21ffe52c818b4c8abdb2084582ada9dc78ceb -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- AlarmMapping.csv (.../AlarmMapping.csv) (revision eaf21ffe52c818b4c8abdb2084582ada9dc78ceb) +++ AlarmMapping.csv (.../AlarmMapping.csv) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -90,7 +90,7 @@ 89,"HD BP occlusion sensor error." 90,"This alarm ID is available for use." 91,"HD No dialysate flow data receive in the last 3 seconds." - 92,"This alarm ID is available for use." + 92,"DG conductivity sensor bad status." 93,"This alarm ID is available for use." 94,"This alarm ID is available for use." 95,"This alarm ID is available for use." @@ -155,7 +155,7 @@ 154,"EEPROM operations (read, write, erase) failure." 155,"DG software configuration record invalid CRC." 156,"HW usage data (treatment time in HD and total consumed water in DG) failure." - 157,"This alarm ID is available for use." + 157,"DG chemical disinfect prime acid line timeout." 158,"This alarm ID is available for use." 159,"Dialysate inlet pump failed flow vs motor speed check." 160,"Blood pump rotor speed too high." Index: denali.pro.user =================================================================== diff -u -r79e076cece4ba503be6c3834eb68d1e5cb1b882f -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- denali.pro.user (.../denali.pro.user) (revision 79e076cece4ba503be6c3834eb68d1e5cb1b882f) +++ denali.pro.user (.../denali.pro.user) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -1,6 +1,6 @@ - + EnvironmentId @@ -172,7 +172,7 @@ true - develop + staging /home/denali/Projects/application/alarmMapping.sh %{sourceDir} Custom Process Step Index: sources/cloudsync/CloudSyncController.cpp =================================================================== diff -u -r79e076cece4ba503be6c3834eb68d1e5cb1b882f -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 79e076cece4ba503be6c3834eb68d1e5cb1b882f) +++ sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -312,6 +312,7 @@ case eError_ParamMismatch : text = tr( "CS Mismatch parameter count" ) ; break; case eError_ParamMissing : text = tr( "CS Missing parameter" ) ; break; case eError_NoHistory : text = tr( "CS No history available" ) ; break; + case eError_Duplicate : text = tr( "CS Duplicate data" ) ; break; case eError_LogFolder : text = tr( "CS The log folder cannot be created." ) ; break; case eError_LogFileInp : text = tr( "CS Error writing to the input file." ) ; break; case eError_CredentialFile : text = tr( "CS The credentials file does not exist." ) ; break; @@ -350,6 +351,7 @@ case eError_ParamMismatch : info = QString( "[%1:%2/%3]" ).arg( vErrorID ).arg( item(0) ).arg( item(1) ) ; break; case eError_ParamMissing : info = QString( "[%1:%2/%3]" ).arg( vErrorID ).arg( item(0) ).arg( item(1) ) ; break; case eError_NoHistory : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; + case eError_Duplicate : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_LogFolder : ; break; case eError_LogFileInp : ; break; case eError_CredentialFile : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; @@ -431,10 +433,21 @@ .arg( msg ) .arg( len ) .arg( prm ) - ; + ; } /*! + * \brief CloudSyncController::isDuplicate + * \param vMessage - current action/messageID received. + * \param vData - current data to compare with the history + * \return true if duplicate + */ +bool CloudSyncController::isDuplicate(const qint32 vMessageID, const QStringList &vData) +{ + return _uiHistory.contains(vMessageID) && _uiHistory[vMessageID] == vData; +} + +/*! * \brief CloudSyncController::writeInpFile * \details Writes to the CS Input buffer * \param vBuffer - the string out buffer. @@ -497,12 +510,12 @@ qint32 messageID = UI2CS(static_cast(vAction)); QStringList data; - if ( vData.isEmpty() ) { error = eError_NoHistory; args = { messageID }; ok = false; goto lErr; } + if ( vData.isEmpty() ) { error = eError_NoHistory; args = { messageID }; ok = false; goto lErr; } - // convert the data to string list - for (auto datum : vData) { - data += datum.toString(); - } + data = Format::fromVariantList(vData); + + if ( isDuplicate(messageID, data) ) { error = eError_Duplicate; args = { messageID }; ok = false; return ok; } // goto lErr; } don't log it just ignore and return false. + // store the last message data _uiHistory[messageID] = data; @@ -556,8 +569,8 @@ // case GuiActionType::ID_PostTreatmentStates : // has not been discussed how to be sent out. // case GuiActionType::ID_DisinfectStates : // has not been discussed how to be sent out. case GuiActionType::ID_HDOperationModeData : - saveUIHistory(eMessageID_DeviceState , vData ); - sendUIHistory(eMessageID_DeviceState ); // can be removed if CS doesn't need it. + if (saveUIHistory(eMessageID_DeviceState , vData )) // if not empty, nor duplicate, and saved + sendUIHistory(eMessageID_DeviceState ); break; case GuiActionType::ID_AdjustSerialHDRsp : Index: sources/cloudsync/CloudSyncController.h =================================================================== diff -u -r301c0a2101eb9374145ae274c8d91460fc9a6a62 -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- sources/cloudsync/CloudSyncController.h (.../CloudSyncController.h) (revision 301c0a2101eb9374145ae274c8d91460fc9a6a62) +++ sources/cloudsync/CloudSyncController.h (.../CloudSyncController.h) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -89,6 +89,7 @@ eError_ParamMissing , eError_NoHistory , + eError_Duplicate , eError_LogFolder , eError_LogFileInp , @@ -201,9 +202,11 @@ QString makeUIBuff (const qint32 vMessageID ); + bool isDuplicate (const qint32 vMessageID , const QStringList &vData); + bool sendUIResponse (const QString &vContent ); bool sendUIBuff (const QString &vData ); - bool saveUIHistory (const qint32 vAction, const QVariantList &vData); + bool saveUIHistory (const qint32 vAction , const QVariantList &vData); bool sendUIHistory (const qint32 vAction ); bool sendMessage (const Message &vMessage ); Index: sources/model/hd/alarm/MAlarmMapping.cpp =================================================================== diff -u -reaf21ffe52c818b4c8abdb2084582ada9dc78ceb -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision eaf21ffe52c818b4c8abdb2084582ada9dc78ceb) +++ sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -7,7 +7,7 @@ * * \file MAlarmMapping.cpp * \author (last) Behrouz NematiPour - * \date (last) 18-Mar-2022 + * \date (last) 23-Mar-2022 * \author (original) Behrouz NematiPour * \date (original) 03-May-2021 * @@ -125,7 +125,7 @@ /*0089*/case GuiAlarmID::ALARM_ID_HD_BP_OCCLUSION_SENSOR_ERROR : { result = QObject::tr("HD BP occlusion sensor error." ); break; } /* 89*/ /*0090*/case GuiAlarmID::ALARM_ID____AVAILABLE_25 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 90*/ /*0091*/case GuiAlarmID::ALARM_ID_HD_DIALYSATE_FLOW_DATA_NOT_RECEIVE : { result = QObject::tr("HD No dialysate flow data receive in the last 3 seconds." ); break; } /* 91*/ -/*0092*/case GuiAlarmID::ALARM_ID____AVAILABLE_14 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 92*/ +/*0092*/case GuiAlarmID::ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS : { result = QObject::tr("DG conductivity sensor bad status." ); break; } /* 92*/ /*0093*/case GuiAlarmID::ALARM_ID____AVAILABLE_15 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 93*/ /*0094*/case GuiAlarmID::ALARM_ID____AVAILABLE_16 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 94*/ /*0095*/case GuiAlarmID::ALARM_ID____AVAILABLE_17 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 95*/ @@ -190,7 +190,7 @@ /*0154*/case GuiAlarmID::ALARM_ID_NVDATA_EEPROM_OPS_FAILURE : { result = QObject::tr("EEPROM operations (read, write, erase) failure." ); break; } /* 154*/ /*0155*/case GuiAlarmID::ALARM_ID_HD_SW_CONFIG_RECORD_INVALID_CRC : { result = QObject::tr("DG software configuration record invalid CRC." ); break; } /* 155*/ /*0156*/case GuiAlarmID::ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR : { result = QObject::tr("HW usage data (treatment time in HD and total consumed water in DG) failure." ); break; } /* 156*/ -/*0157*/case GuiAlarmID::ALARM_ID____AVAILABLE_23 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 157*/ +/*0157*/case GuiAlarmID::ALARM_ID_DG_CHEM_DISINFECT_PRIME_ACID_LINE_TIME_OUT : { result = QObject::tr("DG chemical disinfect prime acid line timeout." ); break; } /* 157*/ /*0158*/case GuiAlarmID::ALARM_ID____AVAILABLE_24 : { result = QObject::tr("This alarm ID is available for use." ); break; } /* 158*/ /*0159*/case GuiAlarmID::ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK : { result = QObject::tr("Dialysate inlet pump failed flow vs motor speed check." ); break; } /* 159*/ /*0160*/case GuiAlarmID::ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH : { result = QObject::tr("Blood pump rotor speed too high." ); break; } /* 160*/ Index: sources/utility/format.cpp =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- sources/utility/format.cpp (.../format.cpp) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/utility/format.cpp (.../format.cpp) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -206,3 +206,19 @@ QDateTime dateTime = QDateTime::fromSecsSinceEpoch(vEpoch); return dateTime.toString(vFormat); } + +/*! + * \brief Format::fromVariantList + * \param vData - QVariantList data to be converted to the QSteingList + * \return the QStringList conversion of the vData + */ +QStringList Format::fromVariantList(const QVariantList &vData) +{ + QStringList data; + + // convert the data to string list + for (auto datum : vData) { + data += datum.toString(); + } + return data; +} Index: sources/utility/format.h =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- sources/utility/format.h (.../format.h) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/utility/format.h (.../format.h) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -27,11 +27,11 @@ Format(); public: - static QString toHexString ( quint16 vValue, bool vWith0x = true, quint8 vLen = 4); - static QByteArray toHexByteArray(const QByteArray &vData , char separator = '.'); - static QString toHexString (const QByteArray &vData , char separator = '.'); - static QByteArray fromVariant (const QVariant &vData ); - static QStringList toStringList (const QList vList, bool vRemoveDuplicate = false, QString vPrefix = ""); - static QString fromEpoch ( qint64 vEpoch, QString vFormat = "yyyy/MM/dd HH:mm"); - + static QString toHexString ( quint16 vValue, bool vWith0x = true, quint8 vLen = 4); + static QByteArray toHexByteArray (const QByteArray &vData , char separator = '.'); + static QString toHexString (const QByteArray &vData , char separator = '.'); + static QByteArray fromVariant (const QVariant &vData ); + static QStringList toStringList (const QList vList, bool vRemoveDuplicate = false, QString vPrefix = ""); + static QString fromEpoch ( qint64 vEpoch, QString vFormat = "yyyy/MM/dd HH:mm"); + static QStringList fromVariantList (const QVariantList &vData ); }; Index: sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp =================================================================== diff -u -r0c983aea7de7480e86739469f5a64ad18b244634 -r75219a6e89b20f405aad0c12c5aed5937118b2ad --- sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp (.../VCommonAdjustmentVitals.cpp) (revision 0c983aea7de7480e86739469f5a64ad18b244634) +++ sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp (.../VCommonAdjustmentVitals.cpp) (revision 75219a6e89b20f405aad0c12c5aed5937118b2ad) @@ -64,7 +64,7 @@ } /*! - * \brief View::VPostTreatmentAdjustmentTreatmentLog::doVitalReceive + * \brief View::VTreatmentVitals::doConfirm * \details Append the user measured BP/HR in to the list of the Treatment Log Average data * \param vSystolic - Blood Pressure Systolic * \param vDiastolic - Blood Pressure Diastolic