~aleteoryx/muditaos

0b75c6299dd3a877dc8fa9d11dbed95e1429f155 — Mateusz Grzegorzek 5 years ago dc00afa
[EGD-4873] Add colors to rt1051 logs

Bring back possibility to get colorful logs from rt1051.
Colored logs can be now turned on in runtime using
Logger::enableColors method.
M config/ProjectConfig.cmake => config/ProjectConfig.cmake +7 -2
@@ 1,13 1,18 @@
# set LOG_USE_COLOR
if((${PROJECT_TARGET} STREQUAL "TARGET_RT1051"))
    set (LOG_USE_COLOR 0 CACHE INTERNAL "")
else()
    set (LOG_USE_COLOR 1 CACHE INTERNAL "")
endif()

# add SystemView enable option
option(SYSTEMVIEW "SYSTEMVIEW" OFF)
if((${PROJECT_TARGET} STREQUAL "TARGET_RT1051") AND (${SYSTEMVIEW} STREQUAL "ON"))
    set (SYSTEM_VIEW_ENABLED 1 CACHE INTERNAL "")
    set (LOG_USE_COLOR 0 CACHE INTERNAL "")
    set (LOG_REDIRECT "RTT_SYSTEMVIEW" CACHE INTERNAL "")
else()
    set (SYSTEMVIEW 0FF CACHE INTERNAL "")
    set (SYSTEM_VIEW_ENABLED 0 CACHE INTERNAL "")
    set (LOG_USE_COLOR 1 CACHE INTERNAL "")
    set (LOG_REDIRECT "RTT_JLINK" CACHE INTERNAL "")
endif()


M module-utils/board/cross/log_rt1051.cpp => module-utils/board/cross/log_rt1051.cpp +6 -2
@@ 32,12 32,16 @@ namespace Log

        loggerBufferCurrentPos += snprintf(&loggerBuffer[loggerBufferCurrentPos],
                                           loggerBufferSizeLeft(),
                                           "%-5s [%s] %s:%s:%d: ",
                                           "%s%-5s %s[%s] %s%s:%s:%d:%s ",
                                           logColors->levelColors[level].data(),
                                           level_names[level],
                                           logColors->serviceNameColor.data(),
                                           getTaskDesc(),
                                           logColors->callerInfoColor.data(),
                                           file,
                                           function,
                                           line);
                                           line,
                                           logColors->resetColor.data());
    }

    bool Logger::filterLogs(logger_level level)

M module-utils/board/linux/log_linux.cpp => module-utils/board/linux/log_linux.cpp +6 -16
@@ 7,10 7,6 @@
#include <string_view>
#include <ticks.hpp>

#if LOG_USE_COLOR == 1
static const char *level_colors[] = {"\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"};
#endif

namespace Log
{
    void Logger::addLogHeader(logger_level level, const char *file, int line, const char *function)


@@ 19,23 15,17 @@ namespace Log
                                           LOGGER_BUFFER_SIZE - loggerBufferCurrentPos,
                                           "%d ms ",
                                           cpp_freertos::Ticks::TicksToMs(cpp_freertos::Ticks::GetTicks()));
#if LOG_USE_COLOR == 1
        loggerBufferCurrentPos += snprintf(&loggerBuffer[loggerBufferCurrentPos],
                                           LOGGER_BUFFER_SIZE - loggerBufferCurrentPos,
                                           "%s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",
                                           level_colors[level],
                                           level_names[level],
                                           file,
                                           line);
#else

        loggerBufferCurrentPos += snprintf(&loggerBuffer[loggerBufferCurrentPos],
                                           LOGGER_BUFFER_SIZE - loggerBufferCurrentPos,
                                           "%-5s %s:%s:%d: ",
                                           "%s%-5s %s%s:%s:%d:%s ",
                                           logColors->levelColors[level].data(),
                                           level_names[level],
                                           logColors->callerInfoColor.data(),
                                           file,
                                           function,
                                           line);
#endif
                                           line,
                                           logColors->resetColor.data());
    }

    bool Logger::filterLogs(logger_level _level)

M module-utils/log/Logger.cpp => module-utils/log/Logger.cpp +24 -0
@@ 20,6 20,21 @@ namespace Log
                                                            {IRQ_STR, logger_level::LOGTRACE}};
    const char *Logger::level_names[]                    = {"TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"};

    void Logger::enableColors(bool enable)
    {
        if (!lock()) {
            return;
        }
        auto _ = gsl::finally([this] { unlock(); });

        if (enable) {
            logColors = &logColorsOn;
        }
        else {
            logColors = &logColorsOff;
        }
    }

    auto Logger::GetLogLevel(const std::string &name) -> logger_level
    {
        return filtered[name];


@@ 36,6 51,15 @@ namespace Log
        return true;
    }

    void Logger::init()
    {
#if LOG_USE_COLOR == 1
        enableColors(true);
#else
        enableColors(false);
#endif
    }

    auto Logger::log(Device device, const char *fmt, va_list args) -> int
    {
        if (!lock()) {

M module-utils/log/Logger.hpp => module-utils/log/Logger.hpp +4 -0
@@ 6,6 6,7 @@
#include <assert.h>
#include <board.h>
#include "log.hpp"
#include "log_colors.hpp"
#include <map>
#include <mutex.hpp>
#include <string>


@@ 21,11 22,13 @@ namespace Log
    class Logger
    {
      public:
        void enableColors(bool enable);
        [[nodiscard]] static Logger &get()
        {
            static Logger logger;
            return logger;
        }
        void init();
        auto log(Device device, const char *fmt, va_list args) -> int;
        void log(logger_level level, const char *file, int line, const char *function, const char *fmt, va_list args);
        auto logAssert(const char *fmt, va_list args) -> int;


@@ 61,6 64,7 @@ namespace Log
        BaseType_t bt;
        cpp_freertos::MutexStandard mutex;
        logger_level level{LOGTRACE};
        const LogColors *logColors            = &logColorsOff;
        char loggerBuffer[LOGGER_BUFFER_SIZE] = {0};
        size_t loggerBufferCurrentPos         = 0;


A module-utils/log/log_colors.hpp => module-utils/log/log_colors.hpp +51 -0
@@ 0,0 1,51 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <string_view>

namespace Log
{
    static constexpr std::string_view CONSOLE_ESCAPE_NO_COLOR         = "";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_RESET      = "\x1b[0m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_RED        = "\x1b[31m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_GREEN      = "\x1b[32m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_YELLOW     = "\x1b[33m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_MAGENTA    = "\x1b[35m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_CYAN       = "\x1b[36m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_LIGHT_GRAY = "\x1b[90m";
    static constexpr std::string_view CONSOLE_ESCAPE_COLOR_LIGHT_BLUE = "\x1b[94m";

    static constexpr std::string_view levelColorsOn[] = {CONSOLE_ESCAPE_COLOR_LIGHT_BLUE,
                                                         CONSOLE_ESCAPE_COLOR_CYAN,
                                                         CONSOLE_ESCAPE_COLOR_GREEN,
                                                         CONSOLE_ESCAPE_COLOR_YELLOW,
                                                         CONSOLE_ESCAPE_COLOR_RED,
                                                         CONSOLE_ESCAPE_COLOR_MAGENTA};

    static constexpr std::string_view levelColorsOff[] = {CONSOLE_ESCAPE_NO_COLOR,
                                                          CONSOLE_ESCAPE_NO_COLOR,
                                                          CONSOLE_ESCAPE_NO_COLOR,
                                                          CONSOLE_ESCAPE_NO_COLOR,
                                                          CONSOLE_ESCAPE_NO_COLOR,
                                                          CONSOLE_ESCAPE_NO_COLOR};

    struct LogColors
    {
        const std::string_view *levelColors;
        const std::string_view serviceNameColor;
        const std::string_view callerInfoColor;
        const std::string_view resetColor;
    };

    static constexpr LogColors logColorsOn = {
        levelColorsOn,
        CONSOLE_ESCAPE_COLOR_MAGENTA,
        CONSOLE_ESCAPE_COLOR_LIGHT_GRAY,
        CONSOLE_ESCAPE_COLOR_RESET,
    };

    static constexpr LogColors logColorsOff = {
        levelColorsOff, CONSOLE_ESCAPE_NO_COLOR, CONSOLE_ESCAPE_NO_COLOR, CONSOLE_ESCAPE_NO_COLOR};
} // namespace Log

M source/main.cpp => source/main.cpp +2 -0
@@ 46,6 46,7 @@
#include <Application.hpp>
#include <ApplicationLauncher.hpp>
#include <log/log.hpp>
#include <log/Logger.hpp>
#include <phonenumbers/phonenumberutil.h>
#include <source/version.hpp>
#include <SystemManager/SystemManager.hpp>


@@ 97,6 98,7 @@ int main()
    sysmgr->StartSystem(
        []() {
            vfs.Init();
            Log::Logger::get().init();
            return true;
        },
        [sysmgr]() {