/*! * * Copyright (c) 2021-2022 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * \file CloudSyncController.h * \author (last) Behrouz NematiPour * \date (last) 13-Dec-2021 * \author (original) Behrouz NematiPour * \date (original) 14-Oct-2021 * */ #pragma once // Qt #include #include #include // Project #include "main.h" // Doxygen : do not remove #include "GuiController.h" // define #define _CloudSyncController CloudSyncController::I() // forward declarations class tst_initializations; // namespace /*! * \brief The CloudSyncController class * \details Singleton class which is the main gateway of CloudSync signal/slots. */ class CloudSyncController : public QObject { Q_OBJECT // Singleton SINGLETON(CloudSyncController) // friends friend class ::tst_initializations; QThread *_thread = nullptr; bool _init = false; const int _interval = 1000; // 1s const QString _location = QString(Storage::SDCard_Base_Path_Name) + "cloudsync/"; const char* _out_File = "out.buf"; // The base file name : CloudSync puts its output to this file const char* _inp_File = "inp.buf"; // The base file name : UI Software puts the input data for the CloudSync in this file QString _date_out_File = ""; // The dated/actual filename : CloudSync puts its output to this file QString _date_inp_File = ""; // The dated/actual filename : UI Software puts the input data for the CloudSync in this file QDateTime _datetime ; qint64 _secSinceEpoch ; QString _dateFormatted ; QString _timeFormatted ; const char* _dateFormat = "yyyy_MM_dd" ; // date used in the file name const char* _timeFormat = "HH:mm:ss.zzz"; // timestamp in the file const char _dateSeparator = '_'; // used in filename const char _separator = ','; quint64 _seq = 0; enum Errors_Enum { eError_Unknown = 500, // Unknown error, initial error before error check eError_HeaderCount , eError_Timestamp , eError_Sequence , eError_CRC , eError_MessageID , eError_ParamCount , eError_Parameter , eError_NoHistory , eError_LogFolder , eError_LogFileInp , eError_OutFileEmpty , // Out file has changed from CS2UI but the content is empty. }; typedef QHash MessageList; MessageList _lastReceivedData ; // sent message history for later send upon request. enum Message_Enum { eMessage_Timestamp , eMessage_Sequence , eMessage_CRC , eMessage_MessageID , eMessage_ParamCount , eMessage_Count , }; typedef QStringList Params; struct Message { quint64 timestamp = 0; quint32 sequence = 0; quint8 crc = 0; qint32 id = 0; quint32 paramCount = 0; Params params { }; }; enum Entity_Start_Index { eUI = 1000, eCS = 2000, }; enum MessageID_Enum { // [ #1( ID ) <-> #2( ID ) ] Description ( #1 Requests and #2 responses ) // Manufacturing eMessageID_Error = 0, // [ CS(2000) <-> UI(1000) ] Error Report eMessageID_DeviceRegister = 1, // [ UI(1001) -> CS( ) ] Device Registration Request eMessageID_DeviceInfo = 2, // [ CS(2002) <-> UI(1002) ] Device information Request eMessageID_SaveCredentials = 3, // [ CS(2003) -> UI(1003) ] Save Credentials Request eMessageID_SendCredentials = 4, // [ CS(2004) <-> UI(1004) ] Send Credentials Request eMessageID_ResetFactory = 5, // [ CS(2005) <-> UI(1005) ] Reset Factory Request // Deployment eMessageID_DeviceState = 6, // [ CS(2006) <-> UI(1006) ] Device State Request eMessageID_TxReport = 7, // [ UI(1007) -> CS(2007) ] TxReport Notify // // Subject to change so has been commented out for now // // 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 }; protected: void timerEvent(QTimerEvent *event) override; public slots: bool init(); bool init(QThread &vThread); private slots: void quit(); void onWatchFileChange (const QString &vFile); void onActionReceive (GuiActionType vAction, const QVariantList &vData); void onTreatmentLogSave (const QString &vPatientID , const QString &vDeviceID , const QString &vFileName ); private: void initConnections(); void initThread(QThread &vThread); void quitThread(); quint8 generateCRC () { return 0; } // has not been implemented/decided yet bool validateCRC () { return true; } // has not been implemented/decided yet void checkDate (); 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 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; } };