Index: sources/storage/Logger.h =================================================================== diff -u -r500c7850040d66c4829d95c366095e222f834489 -r6c6f1f5d466badd9b4fd67be7c907234c342b2a2 --- sources/storage/Logger.h (.../Logger.h) (revision 500c7850040d66c4829d95c366095e222f834489) +++ sources/storage/Logger.h (.../Logger.h) (revision 6c6f1f5d466badd9b4fd67be7c907234c342b2a2) @@ -1,15 +1,15 @@ /*! * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. + * Copyright (c) 2020-2023 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 Logger.h - * \author (last) Behrouz NematiPour - * \date (last) 12-Sep-2020 - * \author (original) Behrouz NematiPour - * \date (original) 26-Aug-2020 + * \file Logger.h + * \author (last) Behrouz NematiPour + * \date (last) 10-Feb-2023 + * \author (original) Behrouz NematiPour + * \date (original) 26-Aug-2020 * */ #pragma once @@ -20,24 +20,24 @@ #include // Project -#include "main.h" // Doxygen : don't remove +#include "main.h" // Doxygen : do not remove #include "StorageGlobals.h" +#include "GuiGlobals.h" // Define #define _Logger Storage::Logger::I() -#define LOG_EXPORT _Logger.concurrentExportLogs() +#define LOG_EXPORTLOG(vExportName) _Logger.concurrentExportLogs(vExportName) +#define LOG_EXPORTERR(vExportName) _Logger.concurrentExportErrs(vExportName) +#define LOG_EXPORTTRT(vExportName) _Logger.concurrentExportTrts(vExportName) +#define ADD_APPED_HEADER emit Storage::Logger::I().didLog(_headerA, Storage::Logger::LogType::eLogAppED, false) +#define ADD_DEBUG_HEADER emit Storage::Logger::I().didLog(_headerD, Storage::Logger::LogType::eLogDebug, false) +#define LOG_APPED(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogAppED, true ) #define LOG_DEBUG(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogDebug, true ) -#define ADD_EVENT_HEADER emit Storage::Logger::I().didLog(_headerE, Storage::Logger::LogType::eLogEvent, false) -#define LOG_EVENT(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogEvent, true ) -#define LOG_DATUM(vCONTENT) emit Storage::Logger::I().didLog(vCONTENT, Storage::Logger::LogType::eLogDatum, true ) +#define LOG_APPED_UI(vCONTENT) emit Storage::Logger::I().didLog(" ,UI," + vCONTENT, Storage::Logger::LogType::eLogAppED, true ) -#define MIXED_EVENT_DATUM - -#undef DISABLE_ACKNOW_CHECKIN_MESSAGE_LOG - // forward declarations class tst_logging; @@ -46,7 +46,7 @@ /*! * \brief The Logger class * \details Main logger class that has all the required implementation for logging. - * The provided interface is the LOG_DATUM, LOG_EVENT, LOG_DEBUG, LOG_EXPORT defines + * The provided interface is the LOG_EVENT, LOG_DEBUG, LOG_EXPORT defines * and no other methods. * * This object is logging all the registered Denali Messages transactions over the CANBus in CSV format text file. @@ -65,7 +65,7 @@ * PLEASE BE CAREFUL THIS CLASS IS USING QtConcurrent::run FOR THE EXPORT LOG FILES. * AND ONLY PRIVATE VOID LOG (,) IS CALLING IN POOLED THREAD * PLEASE BE VERY CAREFUL. - * ALL THE OTHER CLASSES TO USE THIS CLASS SHOULD ONLY USE LOG_DATUM, LOG_EVENT, LOG_DEBUG + * ALL THE OTHER CLASSES TO USE THIS CLASS SHOULD ONLY USE LOG_EVENT, LOG_DEBUG * TO DO THE LOGGING */ class Logger : public QObject @@ -80,62 +80,50 @@ public : enum LogType { - eLogDebug, ///< Application Error : CANBus messages doesn't have error it's Event/Data only + eLogNone = -1, - eLogEvent, ///< Massages on the CANBus : Error is an event type - eLogDatum, ///< Massages on the CANBus : Broadcast data type - + eLogAppED, ///< Application Events and Data : Massages on the CANBus + eLogDebug, ///< Application Error : Service logs eLogTrtmt, ///< Treatment Log Files eLogType_Count, }; Q_ENUM(LogType) private: - const char *_headerE = "TimeStamp,Type,SubSys,Name,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40"; + + bool _logStorageReady = true; + + const char *_headerA = "TimeStamp,ID,SubSys,Name,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40"; + const char *_headerD = "TimeStamp,Description"; QDir _dir; QString _logFileNamePrefix; QHash _logPathNames; const QHash _logBasePathNames { - { LogType::eLogEvent, "log/" }, - { LogType::eLogDatum, "log/" }, - { LogType::eLogDebug, "service/" }, - { LogType::eLogTrtmt, Storage::Treatment_Log_Folder }, + { LogType::eLogAppED, Storage::Log_Folder_Application}, + { LogType::eLogDebug, Storage::Log_Folder_Service }, + { LogType::eLogTrtmt, Storage::Log_Folder_Treatment }, }; - const QHash _logPrefix { // Will be used for the logging in the file - { LogType::eLogEvent, "E" }, - { LogType::eLogDatum, "D" }, - { LogType::eLogDebug, "" }, // it has its own file and all the content is Error + const QHash _logNames { // Will be used for the logging in the file + { LogType::eLogAppED, "Log" }, + { LogType::eLogDebug, "Service" }, + { LogType::eLogTrtmt, "Treatment" }, }; const QHash _logFileNameExt { - { LogType::eLogEvent, ".log" }, -#ifdef MIXED_EVENT_DATUM - { LogType::eLogDatum, ".log" }, -#else - { LogType::eLogDatum, ".dat" }, -#endif - { LogType::eLogDebug, ".err" }, - { LogType::eLogTrtmt, ".log" }, + { LogType::eLogAppED, ".log" }, // Application log + { LogType::eLogDebug, ".err" }, // Application error + { LogType::eLogTrtmt, ".txr" }, // Treatment report }; - // be careful when defining these percentages - // 1 - Since now both the Log and Datum are in the same place and file they have same percentage. - // if separated then the percentage has to be separated - // 2 - the total in _logTypeExpiryDay is not 100 and it has to be summed up with Storage::Available_Space_Percent. - // so it is 70% for Event/Datum + 15% Service + 15% free = 100% total + // !!!!!!!!!! IMPORTANT !!!!!!!!!! + // be careful with these percentages + // please refer to the Storage namespace. const QHash _logTypeMaxUsageLimit { -#ifdef MIXED_EVENT_DATUM - { LogType::eLogEvent, 70 }, // in percent - { LogType::eLogDatum, 70 }, // in percent -#else - { LogType::eLogEvent, 35 }, // in percent - { LogType::eLogDatum, 35 }, // in percent -#endif - { LogType::eLogDebug, 15 }, // in percent - // Not Sure yet so commented out in the remove. - { LogType::eLogTrtmt, 100}, // in percent // No Remove for now + { LogType::eLogAppED, Storage::Log_Max_Allowable_AppED_Space_Percent }, + { LogType::eLogDebug, Storage::Log_Max_Allowable_Debug_Space_Percent }, + { LogType::eLogTrtmt, Storage::Log_Max_Allowable_Trtmt_Space_Percent }, }; const char *_dateFormat = "yyyy_MM_dd" ; // date used in the file name @@ -149,6 +137,7 @@ QString _logFileName = ""; QMutex _logRemoveRunning; + LogType _exportLogsType = eLogNone; QFutureWatcher _exportLogsWatcher; QFutureWatcher _removeLogsWatcher; @@ -157,16 +146,14 @@ public: void enableConsoleOut(bool vEnabled); + void postInit(); signals: void didLogPathSet(Logger::LogType vLogType, const QString &vLogPath); public slots: bool init(); bool init(QThread &vThread); - - -private slots: void quit(); private: @@ -175,42 +162,54 @@ void initThread(QThread &vThread); void quitThread(); + bool checkThread(); + private: // ----- setting up void checkLogPath (); - void setLogBasePath (bool vUseApplicationDirPath = false); + void setLogBasePath (bool vUseTempPath = false); bool setLogPath (); bool setLogPath (LogType vLogType); public: const QString &logPath(Logger::LogType vLogType); // ----- Export structure private : - bool exportLogs(); + bool exportList(const Gui::GuiStringIndexMap &vExportList, LogType vLogType); + bool exportLogs(const Gui::GuiStringIndexMap &vExportList); + bool exportErrs(const Gui::GuiStringIndexMap &vExportList); + bool exportTrts(const Gui::GuiStringIndexMap &vExportList); public slots: // this slot is thread safe and can be called from outside by LOG_EXPORT. - bool concurrentExportLogs(); - void onExportLogs(); + bool concurrentExportIsOk (); + bool concurrentExportLogs (const Gui::GuiStringIndexMap &vExportList); + bool concurrentExportErrs (const Gui::GuiStringIndexMap &vExportList); + bool concurrentExportTrts (const Gui::GuiStringIndexMap &vExportList); + void onExportLogs (); signals: void didExportLogs(); + void didExportStat(quint32 vIndex, const QString &vFileName, quint8 vPercent); // ----- Remove Old Logs structure private: int removeLogs(); private slots: // this slot is thread safe and can be called from outside but preferred not to. bool concurrentRemoveLogs(); void onRemoveLogs(); + void onCryptSetupMount (bool vPass); + signals: /*! * \brief didRemoveLogs - * \details This signal will be emitted mainly for DriveWatcher to not to emit the signal that Logger is connected to + * \details This signal will be emitted mainly for DeviceController to not to emit the signal that Logger is connected to * , while the logging cleanup is in progress, otherwise if the log cleanup takes more that 1sec (current interval) - * in the DriveWatcher then the cleanup will be called again for no good reason. + * in the DeviceController then the cleanup will be called again for no good reason. * \param vInProgress - true if the log cleanup is in progress, false otherwise. */ void didRemoveLogs(bool vInProgress); // ----- Available space is low private slots: + void onSDCardStateChange(bool vReady, bool vReadonly); void onSDCardSpaceChange(bool vReady, qint64 vTotal, qint64 vAvailable, quint8 vPercent); // ----- logging structure