/** * @file * @brief Debug output via UART. * * Configuration: * STA_DEBUG_SERIAL_ENABLE: Enable module * STA_DEBUG_SERIAL_FORCE: Ignore debug defines and always enable output * DEBUG: Enables output when defined * NDEBUG: Disables output when defined (overrides DEBUG) * * The `sta::DebugSerial` instance must be provided. * NOTE: Include this header before the definition because * the default internal linkage of const namespace variables * will cause undefined reference errors otherwise. */ #ifndef STA_DEBUG_SERIAL_HPP #define STA_DEBUG_SERIAL_HPP /** * @defgroup staCoreDebug Debug Serial * @ingroup staCore * @brief Debug serial output. */ #ifdef DOXYGEN /** * @def STA_DEBUG_SERIAL_ENABLE * @brief Enable module. * * Automatically defined if DEBUG is defined. * Automatically disabled if NDEBUG is defined. * * @ingroup staCoreBuildConfig */ # define STA_DEBUG_SERIAL_ENABLE /** * @def STA_DEBUG_SERIAL_DISABLE * @brief Force disable module. * * Overrides STA_DEBUG_SERIAL_ENABLE option. * * @ingroup staCoreBuildConfig */ # define STA_DEBUG_SERIAL_DISABLE #endif // DOXYGEN #include #ifdef DEBUG # ifndef STA_DEBUG_SERIAL_ENABLE # define STA_DEBUG_SERIAL_ENABLE # endif // !STA_DEBUG_SERIAL_ENABLE #endif // DEBUG #if defined(NDEBUG) || defined(STA_DEBUG_SERIAL_DISABLE) # ifdef STA_DEBUG_SERIAL_ENABLE # undef STA_DEBUG_SERIAL_ENABLE # endif // STA_DEBUG_SERIAL_ENABLE #endif // NDEBUG || STA_DEBUG_SERIAL_DISABLE // Show enabled module in doxygen output #ifdef DOXYGEN # define STA_DEBUG_SERIAL_ENABLE #endif // DOXYGEN #ifdef STA_DEBUG_SERIAL_ENABLE #include namespace sta { /** * @brief %UART print object for debug serial output. * * @ingroup staCoreDebug */ extern PrintableUART DebugSerial; } // namespace sta /** * @brief Print debug output to UART. * * @param ... See @ref sta::PrintableUART::print * * @ingroup staCoreDebug */ # define STA_DEBUG_PRINT(...) sta::DebugSerial.print(__VA_ARGS__) /** * @brief Print debug output followed by new-line to UART. * * @param ... See @ref sta::PrintableUART::println * * @ingroup staCoreDebug */ # define STA_DEBUG_PRINTLN(...) sta::DebugSerial.println(__VA_ARGS__) #else // !STA_DEBUG_SERIAL_ENABLE # define STA_DEBUG_PRINT(...) ((void)0) # define STA_DEBUG_PRINTLN(...) ((void)0) #endif // !STA_DEBUG_SERIAL_ENABLE #endif // STA_DEBUG_SERIAL_HPP