Index: denali.pro.user =================================================================== diff -u -r4e035c96c971fb8ec19fb030d9120046697b6e71 -r0552e825eebff72cbfd7f4f2fbb74b46c80f1e21 --- denali.pro.user (.../denali.pro.user) (revision 4e035c96c971fb8ec19fb030d9120046697b6e71) +++ denali.pro.user (.../denali.pro.user) (revision 0552e825eebff72cbfd7f4f2fbb74b46c80f1e21) @@ -1,6 +1,6 @@ - + EnvironmentId Index: en_US.udic =================================================================== diff -u -rec36df2f94c93e62095f49c7f65a30c2d508a579 -r0552e825eebff72cbfd7f4f2fbb74b46c80f1e21 --- en_US.udic (.../en_US.udic) (revision ec36df2f94c93e62095f49c7f65a30c2d508a579) +++ en_US.udic (.../en_US.udic) (revision 0552e825eebff72cbfd7f4f2fbb74b46c80f1e21) @@ -202,3 +202,4 @@ deviceID reconnection FALLTHROUGH +UIHistory Index: sources/Threads.cpp =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r0552e825eebff72cbfd7f4f2fbb74b46c80f1e21 --- sources/Threads.cpp (.../Threads.cpp) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/Threads.cpp (.../Threads.cpp) (revision 0552e825eebff72cbfd7f4f2fbb74b46c80f1e21) @@ -87,6 +87,7 @@ { // coco begin validated: Application termination is not correctly done in coco!!! // it has been tested and works perfectly fine in normal run. + quitThread(_CloudSync_Thread ); quitThread(_CanFrame_Thread ); quitThread(_CanAcknow_Thread ); quitThread(_CanMessage_Thread ); Index: sources/cloudsync/CloudSyncController.cpp =================================================================== diff -u -r39a9d9b3930ab483df75da6c2e7bf8838fa8ff5e -r0552e825eebff72cbfd7f4f2fbb74b46c80f1e21 --- sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 39a9d9b3930ab483df75da6c2e7bf8838fa8ff5e) +++ sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 0552e825eebff72cbfd7f4f2fbb74b46c80f1e21) @@ -33,8 +33,7 @@ * Qt handles the children destruction by their parent objects life-cycle. */ CloudSyncController::CloudSyncController(QObject *parent) : QObject(parent) { - checkDate(); - sendUIBuff("Ready"); + testWatchBuffDate(); startTimer(_interval); } @@ -140,7 +139,8 @@ { // TODO: touch the inp file to as a check-in for CloudSync to know we are up // a simple touch or a check-in message? - checkDate(); + testWatchBuffDate(); + testDeviceInfoWait(); } /*! @@ -205,7 +205,7 @@ lines = vContent.split('\n',QString::SkipEmptyParts); buffer = lines.last(); - LOG_DEBUG(QString("CloudSync Message received [%1]").arg(buffer)); + // DEBUG: LOG_DEBUG(QString("CS [%1]").arg(buffer)); items = buffer.split(_separator); @@ -220,14 +220,19 @@ index = eMessage_ParamCount; message.paramCount = items[index].toUInt(&ok); if (!ok) { error = eError_ParamCount ; ok = false; goto lErr; } // check the parameters count - if ( count - eMessage_Count < message.paramCount ) { error = eError_Parameter ; ok = false; goto lErr; } + if ( count - eMessage_Count < message.paramCount ) { error = eError_Parameter ; ok = false; goto lErr; } + // convert the message id and check its validity + message.id = CS2UI(static_cast(message.id)); + if ( eMessageID_Start > message.id || message.id > eMessageID_Count ) { error = eError_InvalidID ; ok = false; goto lErr; } + // getting the parameters for ( quint32 index = eMessage_Count; index < message.paramCount; index++ ) { message.params.append( items[index] ); } - message.id = CS2UI(static_cast(message.id)); + + vMessage = message; return true; @@ -241,13 +246,14 @@ case eError_Sequence : args = { items[index].trimmed() }; break; case eError_CRC : args = { items[index].trimmed() }; break; case eError_MessageID : args = { items[index].trimmed() }; break; + case eError_InvalidID : args = { items[index].trimmed() }; break; case eError_ParamCount : args = { items[index].trimmed() }; break; case eError_Parameter : args = { count - eMessage_Count , message.paramCount }; break; case eError_NoHistory : args = { }; break; case eError_LogFolder : args = { }; break; case eError_LogFileInp : args = { }; break; } - LOG_DEBUG(toText(error) + " " + toInfo(error, args)); + toLog(error, args); return false; } @@ -260,21 +266,22 @@ */ QString CloudSyncController::toText(CloudSyncController::Errors_Enum vErrorID) { - QString text = tr( "E,CS,Unknown Error" ) ; + QString text = tr( "CS Unknown Error" ) ; if ( vErrorID == 0 ) return text; switch (vErrorID) { - case eError_Unknown : ; break; - case eError_OutFileEmpty: text = tr( "E,CS,Out buffer empty" ) ; break; - case eError_HeaderCount : text = tr( "E,CS,Incorrect header" ) ; break; - case eError_Timestamp : text = tr( "E,CS,Incorrect timestamp" ) ; break; - case eError_Sequence : text = tr( "E,CS,Incorrect sequence" ) ; break; - case eError_CRC : text = tr( "E,CS,Incorrect CRC" ) ; break; - case eError_MessageID : text = tr( "E,CS,Incorrect ID" ) ; break; - case eError_ParamCount : text = tr( "E,CS,Incorrect parameter length" ) ; break; - case eError_Parameter : text = tr( "E,CS,Incorrect parameter count" ) ; break; - case eError_NoHistory : text = tr( "E,CS,No history available for the request" ) ; break; - case eError_LogFolder : text = tr( "E,CS,The log folder cannot be created." ) ; break; - case eError_LogFileInp : text = tr( "E,CS,Error writing to the input file." ) ; break; + case eError_Unknown : ; break; + case eError_OutFileEmpty: text = tr( "CS Out buffer empty" ) ; break; + case eError_HeaderCount : text = tr( "CS Incorrect header" ) ; break; + case eError_Timestamp : text = tr( "CS Incorrect timestamp" ) ; break; + case eError_Sequence : text = tr( "CS Incorrect sequence" ) ; break; + case eError_CRC : text = tr( "CS Incorrect CRC" ) ; break; + case eError_MessageID : text = tr( "CS Incorrect ID" ) ; break; + case eError_InvalidID : text = tr( "CS Invalid ID" ) ; break; + case eError_ParamCount : text = tr( "CS Incorrect parameter length" ) ; break; + case eError_Parameter : text = tr( "CS Incorrect parameter count" ) ; break; + case eError_NoHistory : text = tr( "CS No history available" ) ; 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; } return text; } @@ -301,6 +308,7 @@ case eError_Sequence : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_CRC : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_MessageID : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; + case eError_InvalidID : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_ParamCount : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_Parameter : 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; @@ -343,18 +351,16 @@ bool ok = true; Message message; if ( ! interpret(vContent, message) ) return false; // The error handling internal to interpret method. - switch (message.id) { - case eMessageID_DeviceState : ok = sendUIHistory(message.id); break; // The device state is stored in history but the other might be different so the switch is used. - default : break; - } + ok = sendMessage(message.id); + return ok; } /*! - * \brief CloudSyncController::checkDate + * \brief CloudSyncController::testWatchBuffDate * \details Checks the date and updated the watched file in case the date changed. */ -void CloudSyncController::checkDate() +void CloudSyncController::testWatchBuffDate() { _datetime = QDateTime::currentDateTime(); _secSinceEpoch = _datetime.toSecsSinceEpoch(); @@ -368,31 +374,42 @@ } /*! - * \brief CloudSyncController::sendUIBuff - * \details Sends the UI Buffer to the UI input file. - * \param vData - the data to be sent out. - * \return true on successful writing to the file buffer. - * \sa _inp_File + * \brief CloudSyncController::makeUIBuff + * \details make formatted UI buffer to send out. + * \param vMessage - The message id with destination added. 2k, 1K + * \return the formatted buffer */ -bool CloudSyncController::sendUIBuff(const QString &vData) +QString CloudSyncController::makeUIBuff(const qint32 vMessageID) { + QString msg = QString::number(vMessageID); + QString len = QString::number(_uiHistory[ vMessageID ].count()); + QString prm = _uiHistory[ vMessageID ].join(_separator); + return QString("%1,%2,%3") + .arg( msg ) + .arg( len ) + .arg( prm ) + ; +} + +/*! + * \brief CloudSyncController::writeInpFile + * \details Writes to the CS Input buffer + * \param vBuffer - the string out buffer. + * \return true if successful + */ +bool CloudSyncController::writeInpFile(const QString &vInpBuff) +{ bool ok = true; QVariantList args ; Errors_Enum error = eError_Unknown; - QString inpBuff; _date_inp_File = _location + // The location _dateFormatted + _dateSeparator + _inp_File; // The file name - inpBuff = QString::number(_secSinceEpoch); - inpBuff += _separator + QString::number(_seq++); - inpBuff += _separator + QString::number(generateCRC()); - inpBuff += _separator + vData; - inpBuff += '\n'; // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // writing the message into the buffer. - LOG_EVENT(inpBuff);// FixMe : logs empty - if ( ! Storage::FileHandler::write(_date_inp_File, inpBuff) ) { error = eError_LogFileInp; args = { _date_inp_File }; ok = false; goto lErr; } + LOG_EVENT( "CS," + vInpBuff ); + if ( ! Storage::FileHandler::write(_date_inp_File, vInpBuff + "\n") ) { error = eError_LogFileInp; args = { _date_inp_File }; ok = false; goto lErr; } return ok; lErr: @@ -401,13 +418,34 @@ } /*! - * \brief CloudSyncController::sendUIHistory - * \details stores the action data in history, if vData is provided, and sends a response to the cloud sync upon request from the stored history. + * \brief CloudSyncController::sendUIBuff + * \details Sends the UI Buffer to the UI input file. + * \param vData - the data to be sent out. + * \return true on successful writing to the file buffer. + * \sa _inp_File + */ +bool CloudSyncController::sendUIBuff(const QString &vData) +{ + bool ok = true; + QString inpBuff = "%1,%2,%3,%4"; + inpBuff = inpBuff + .arg( _secSinceEpoch ) + .arg( _seq++ ) + .arg( generateCRC() ) + .arg( vData ); + + ok = writeInpFile(inpBuff); + return ok; +} + +/*! + * \brief CloudSyncController::saveUIHistory + * \details stores the action data in history, if vData is provided. * \param vAction - the request id, which in current design is same as the Message comes to the UI. * \param vData - The message data * \return true if a message history is available, false otherwise. */ -bool CloudSyncController::sendUIHistory(const qint32 vAction, const QVariantList &vData) +bool CloudSyncController::saveUIHistory(const qint32 vAction, const QVariantList &vData) { bool ok = true; QVariantList args ; @@ -416,21 +454,39 @@ qint32 messageID = UI2CS(static_cast(vAction)); QStringList data; - if ( ! vData.empty() ) { - // convert the data to string list - for (auto datum : vData) { data += datum.toString(); } - // store the last message data - _lastReceivedData[messageID] = data; + 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(); } + // store the last message data + _uiHistory[messageID] = data; - if ( ! _lastReceivedData.contains( messageID ) ) { error = eError_NoHistory; args = { messageID }; ok = false; goto lErr; } + return ok; - sendUIBuff(QString("%1,%2,%3") - .arg( messageID ) - .arg( _lastReceivedData[ messageID ].count()) - .arg( _lastReceivedData[ messageID ].join(_separator)) - ); +lErr: + toLog(error, args); + return ok; +} +/*! + * \brief CloudSyncController::sendUIHistory + * \details sends the saved history of the message as a response to the cloud sync upon request. + * \param vAction - the request id, which in current design is same as the Message comes to the UI. + * \return true if a message history is available, false otherwise. + */ +bool CloudSyncController::sendUIHistory(const qint32 vAction) +{ + bool ok = true; + QVariantList args ; + Errors_Enum error = eError_Unknown; + + qint32 messageID = UI2CS(static_cast(vAction)); + if ( ! _uiHistory.contains( messageID ) ) { error = eError_NoHistory; args = { messageID }; ok = false; goto lErr; } + + sendUIBuff(makeUIBuff(messageID)); + return ok; lErr: @@ -446,19 +502,27 @@ */ void CloudSyncController::onActionReceive(GuiActionType vAction, const QVariantList &vData) { + // TODO: This section is the translation/mapping section + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + // preparing the message + // Same parameters will be sent for these messages for now, so data is not changed. + switch (vAction) { - case GuiActionType::ID_HDOperationModeData: - case GuiActionType::ID_PreTreatmentStates : - case GuiActionType::ID_TreatmentStates : - case GuiActionType::ID_PostTreatmentStates: - case GuiActionType::ID_DisinfectStates : - // TODO: This section is the translation/mapping section - // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - // preparing the message - // Same parameters will be sent for these messages for now, so data is not changed. - sendUIHistory(eMessageID_DeviceState, vData); + case GuiActionType::ID_HDOperationModeData : + case GuiActionType::ID_PreTreatmentStates : + case GuiActionType::ID_TreatmentStates : + case GuiActionType::ID_PostTreatmentStates : + case GuiActionType::ID_DisinfectStates : + saveUIHistory(eMessageID_DeviceState , vData ); + sendUIHistory(eMessageID_DeviceState ); // can be removed if CS doesn't need it. break; + case GuiActionType::ID_AdjustSerialHDRsp : + case GuiActionType::ID_AdjustSerialDGRsp : + // this message is not complete in one step and saves only the received info and waits for the other if complete will send. + saveDeviceInfo(vAction, vData); + break; + default: break; } @@ -474,6 +538,145 @@ void CloudSyncController::onTreatmentLogSave(const QString &vPatientID, const QString &vDeviceID, const QString &vFileName) { QStringList data { vPatientID, vDeviceID, vFileName }; - _lastReceivedData[eMessageID_TxReport] = data; - sendUIHistory (eMessageID_TxReport); + _uiHistory [eMessageID_TxReport] = data; + sendUIHistory (eMessageID_TxReport); } + +/*! + * \brief CloudSyncController::sendMessage + * \details Makes and Sends the appropriate message for the vAction. + * Some messages are sent out upon request form the last received on the history and will not be asked from FW. + * \return true if there is a history for that message and no error happened. + */ +bool CloudSyncController::sendMessage(const qint32 vAction) { + bool ok = false; + + switch (vAction) { + case eMessageID_DeviceRegister : break; + + case eMessageID_DeviceInfo : ok = sendDeviceInfo(); break; + case eMessageID_SaveCredentials : break; + case eMessageID_SendCredentials : break; + case eMessageID_ResetFactory : break; + case eMessageID_DeviceState : ok = sendDeviceState(); break; + + case eMessageID_TxReport : break; + + } + return ok; +} + +/*! + * \brief CloudSyncController::sendDeviceState + * \return + */ +bool CloudSyncController::sendDeviceState() +{ + bool ok = false; + ok = sendUIHistory(eMessageID_DeviceState); + return ok; +} + +/*! + * \brief CloudSyncController::saveDeviceInfo + * \details keeps the received device information and set a flag to wait for the next message. + * \param vAction - the action enum which identifies information source of HD or DG. + * \param vData - the device information + * \param vTimedOut - if true the missing device information will be filled by zero and will be sent anyway. + * \return + */ +bool CloudSyncController::saveDeviceInfo(GuiActionType vAction, const QVariantList &vData) +{ + bool ok = false; + + // the messages are coming from different sources and the order of receiving could not be guessed. + // so for each of these two we check and fill the designated variable + // if both values received + initDeviceInfoWait(); + + if ( vAction == GuiActionType::ID_AdjustSerialHDRsp ) { + if ( vData.count() ) { + _deviceInfoHD = vData[eDeviceInfo_Ix].toString(); + } else { + _deviceInfoHD = ""; + } + } + if ( vAction == GuiActionType::ID_AdjustSerialDGRsp ) { + if ( vData.count() ) { + _deviceInfoDG = vData[eDeviceInfo_Ix].toString(); + } else { + _deviceInfoDG = ""; + } + } + + if ( !_deviceInfoHD.isEmpty() && !_deviceInfoDG.isEmpty() ) { + saveDeviceInfoTimeOut(); + ok = true; + } + return ok; +} + +/*! + * \brief CloudSyncController::saveDeviceInfoTimeOut + * \details send the Device information regardless of the information filled or not. + * \return true on successful save and send. + */ +bool CloudSyncController::saveDeviceInfoTimeOut() +{ + bool ok = false; + if ( _deviceInfoUI.isEmpty() ) { _deviceInfoUI = qApp->applicationVersion(); } + ok = saveUIHistory(eMessageID_DeviceInfo , { _deviceInfoHD, _deviceInfoDG, _deviceInfoUI } ) && + sendDeviceInfo(); + if ( ok ) stopDeviceInfoWait(); + return ok; +} + +/*! + * \brief CloudSyncController::sendDeviceInfo + * \details sends the devices information if both the HD and DG information are ready otherwise will fill the missing with 0 if the vTimeout is set to true. + * \return + */ +bool CloudSyncController::sendDeviceInfo() +{ + bool ok = false; + ok = sendUIHistory(eMessageID_DeviceInfo); + return ok; +} + +/*! + * \brief CloudSyncController::testDeviceInfoWait + * \details tests the wait conditions if there is a wait, decrements until times out and sends the device info. + */ +void CloudSyncController::testDeviceInfoWait() +{ + if (_deviceInfoWait == _deviceInfoStop ) return; + if (_deviceInfoWait ){ + _deviceInfoWait -- ; + } + else { + saveDeviceInfoTimeOut(); + } +} + +/*! + * \brief CloudSyncController::stopDeviceInfoWait + * \details stops waiting for the device info. + */ +void CloudSyncController::stopDeviceInfoWait() { + _deviceInfoWait = _deviceInfoStop; + // NOTE: if it is accepted to use the last received info just comment these 3 cleanup lines. + // so the last message will update the history only and it will be sent out. + _deviceInfoHD = ""; + _deviceInfoDG = ""; + _deviceInfoUI = ""; +} + +/*! + * \brief CloudSyncController::initDeviceInfoWait + * \details if currently not not in wait, then set the wait to the secs of wait. + */ +void CloudSyncController::initDeviceInfoWait() { + if ( _deviceInfoWait == _deviceInfoStop ) { // if timer is stopped + _deviceInfoWait = _deviceInfoSecs; // enable the timer. + } +} Index: sources/cloudsync/CloudSyncController.h =================================================================== diff -u -r39a9d9b3930ab483df75da6c2e7bf8838fa8ff5e -r0552e825eebff72cbfd7f4f2fbb74b46c80f1e21 --- sources/cloudsync/CloudSyncController.h (.../CloudSyncController.h) (revision 39a9d9b3930ab483df75da6c2e7bf8838fa8ff5e) +++ sources/cloudsync/CloudSyncController.h (.../CloudSyncController.h) (revision 0552e825eebff72cbfd7f4f2fbb74b46c80f1e21) @@ -68,6 +68,13 @@ quint64 _seq = 0; + const qint8 _deviceInfoStop = -1; // -1 is don't wait. + const qint8 _deviceInfoSecs = 1; // in seconds is used for the DG serial response message, if DG is detached UI will timeout after a second and will send the message regardless. + qint8 _deviceInfoWait = _deviceInfoStop; + QString _deviceInfoHD = ""; + QString _deviceInfoDG = ""; + QString _deviceInfoUI = ""; + enum Errors_Enum { eError_Unknown = 500, // Unknown error, initial error before error check @@ -76,6 +83,7 @@ eError_Sequence , eError_CRC , eError_MessageID , + eError_InvalidID , eError_ParamCount , eError_Parameter , @@ -88,7 +96,7 @@ }; typedef QHash MessageList; - MessageList _lastReceivedData ; // sent message history for later send upon request. + MessageList _uiHistory ; // sent message history for later send upon request. enum Message_Enum { eMessage_Timestamp , @@ -115,6 +123,7 @@ }; enum MessageID_Enum { + eMessageID_Start = 0, // [ #1( ID ) <-> #2( ID ) ] Description ( #1 Requests and #2 responses ) // Manufacturing eMessageID_Error = 0, // [ CS(2000) <-> UI(1000) ] Error Report @@ -135,8 +144,17 @@ // eMessageID_PatientID = 202, // [No CS req defined] UI sends the patient ID // eMessageID_DeviceReport = 204, // [No CS req defined] UI sends the device report // eMessageID_HeartBeat = 900, // CS sends the periodic Hb and UI can set the interval + + eMessageID_Count }; + enum DeviceInfo_Enum { + eDeviceInfo_Ix = 0, // received message data index of each HD, DG. Data index 0 is always the info. + eDeviceInfo_HD = 0, // stored index in the UI history. + eDeviceInfo_DG = 1, // stored index in the UI history. + eDeviceInfo_UI = 2, // stored index in the UI history. + }; + protected: void timerEvent(QTimerEvent *event) override; @@ -162,17 +180,44 @@ quint8 generateCRC () { return 0; } // has not been implemented/decided yet bool validateCRC () { return true; } // has not been implemented/decided yet - void checkDate (); + void testWatchBuffDate (); + bool interpret (const QString &vContent, Message &vMessage); + bool addCSBuffWatch (); - bool sendUIResponse (const QString &vContent); - bool sendUIBuff (const QString &vData ); - bool sendUIHistory (const qint32 vAction, const QVariantList &vData = {}); - bool interpret(const QString &vContent, Message &vMessage); + QString makeUIBuff (const qint32 vMessageID ); + + bool sendUIResponse (const QString &vContent ); + bool sendUIBuff (const QString &vData ); + bool saveUIHistory (const qint32 vAction, const QVariantList &vData); + bool sendUIHistory (const qint32 vAction ); + bool sendMessage (const qint32 vAction ); + + bool writeInpFile (const QString &vInpBuff ); + QString toText (Errors_Enum vErrorID); QString toInfo (Errors_Enum vErrorID, const QVariantList &vInfoItems); void toLog (Errors_Enum vErrorID, const QVariantList &vInfoItems); qint32 UI2CS (MessageID_Enum vID) { return vID + eUI; } qint32 CS2UI (MessageID_Enum vID) { return vID - eCS; } + + bool sendError (); // eMessageID_Error + + bool saveDeviceInfo (GuiActionType vAction, const QVariantList &vData); // eMessageID_DeviceInfo + bool saveDeviceInfoTimeOut (); // eMessageID_DeviceInfo + bool sendDeviceInfo (); // eMessageID_DeviceInfo + void testDeviceInfoWait (); + void stopDeviceInfoWait (); + void initDeviceInfoWait (); + + + + bool sendDeviceState (); // eMessageID_DeviceState + bool sendDeviceRegister (); // eMessageID_DeviceRegister + bool sendSaveCredentials (); // eMessageID_SaveCredentials + bool sendSendCredentials (); // eMessageID_SendCredentials + bool sendResetFactory (); // eMessageID_ResetFactory + bool sendTxReport (); // eMessageID_TxReport + }; Index: sources/model/hd/alarm/MAlarmMapping.cpp =================================================================== diff -u -r4e035c96c971fb8ec19fb030d9120046697b6e71 -r0552e825eebff72cbfd7f4f2fbb74b46c80f1e21 --- sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision 4e035c96c971fb8ec19fb030d9120046697b6e71) +++ sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision 0552e825eebff72cbfd7f4f2fbb74b46c80f1e21) @@ -7,7 +7,7 @@ * * \file MAlarmMapping.cpp * \author (last) Behrouz NematiPour - * \date (last) 17-Feb-2022 + * \date (last) 21-Feb-2022 * \author (original) Behrouz NematiPour * \date (original) 03-May-2021 *