# 2023-Webservices_And_Applications ## Used Libs, compiler and apps - lwip version 2.1.2 - CubeIDE version 1.12.1 - STM32CubeMX version 6.8.1 - Firmware Lib (stm32f7) 1.17.1 ## Tasks Make for each task a sperate c and h file. The name of the file is the name of the task. This way we can keep the code clean. [tasks_and_taskowners.md](tasks_and_taskowners.md) ## Style Guide To maintain a consistent and clean codebase, follow the [style guide](style_guide.md). This document provides detailed instructions on naming conventions, code structure, and commenting practices. Please read the [style_guide.md](style_guide.md) carefully before making contributions. ### Editor Configuration To help you adhere to the style guide, use the provided configuration files for the code formatters in your code editor. You can choose from the following options: - `.clang-format`: - For [Visual Studio Code](https://code.visualstudio.com/docs/cpp/cpp-ide#_code-formatting) and [CLion](https://www.jetbrains.com/help/clion/clangformat-as-alternative-formatter.html#clion-support) users - Or use the [clang-format](https://clang.llvm.org/docs/ClangFormat.html) tool directly - `eclipse_format.xml`: - For Eclipse-based editors, including STM32CubeIDE. - You can import it within eclipse settings, `Preferences -> LANGUAGE -> Code Style -> Formatter` tab. ## Logging and Debugging Messages The logging system is designed to make log messages clearer and improve their uniformity across the project. It makes it easier to see where a log message comes from and what its verbosity is. To use the logging system, include `log.h` in your source file, and use the following macros to print log messages: ```c LOG_DEBUG(TAG, fmt, ...) LOG_INFO(TAG, fmt, ...) LOG_WARN(TAG, fmt, ...) LOG_ERROR(TAG, fmt, ...) ``` The same format specifiers as in `printf` can be used. The `TAG` parameter is a string that identifies the source of the log message. It is recommended to use one tag for each source file / module, and to name the tag after the source file / module. See the example below. ### Global Log Level You can control the verbosity of the logging output by setting a global log level in `log.h`. This log level filters out messages with a lower priority. ### Custom Log Levels before you include `log.h`, you can define custom log levels by defining the following macros: ```c // All log messages will be printed #define LOGGER_LEVEL_ALL #include "log.h" ``` ```c // Info and higher priority messages will be printed #define LOGGER_LEVEL_INFO #include "log.h" ``` ```c // Only warnings and errors will be printed #define LOGGER_LEVEL_WARN #include "log.h" ``` ```c // Only log messages with level ERROR will be printed #define LOGGER_LEVEL_ERROR #include "log.h" ``` ### Colorful Log Messages For improved readability, log messages can be printed in color by configuring `LOGGER_USE_COLOR` to `1` in `log.h` or before you include `log.h`. \ Default is `0` ### Log Output Format Each log entry is formatted to include the following information: - Log level ([Debug], [Info], [Warn], [Error]) - Timestamp (in milliseconds since boot) - Tag - The log message For instance, a log entry may look like this: `[Info] (2009) [LTDC]: This is a log message` ### Example ```c #define LOGGER_LEVEL_INFO #include "log.h" // Don't use a define for the tag, as the pointer to the tag is used static const char *TAG = "main"; int main(void) { LOG_DEBUG(TAG, "This message will not be printed"); LOG_INFO(TAG, "This message will be printed"); LOG_WARN(TAG, "This message will be printed"); LOG_ERROR(TAG, "This message will be printed"); for (int i = 0; i < 3; i++) { LOG_INFO(TAG, "Iteration %d of %d", i, 3); } return 0; } ``` Result: ``` [Info] (2009) main: This message will be printed [Warning] (2026) main: This message will be printed [Error] (2033) main: This message will be printed [Info] (2040) main: Iteration 0 of 3 [Info] (2047) main: Iteration 1 of 3 [Info] (2054) main: Iteration 2 of 3 ```