.. _module-pw_assert_basic:

===============
pw_assert_basic
===============
.. pigweed-module::
   :name: pw_assert_basic

--------
Overview
--------
This is a simple assert backend to implement the ``pw_assert`` facade which
relies on a single function ``pw_assert_basic_HandleFailure`` handler facade
which defaults to the ``basic_handler`` backend. Users may be interested in
overriding this default in case they need to do things like transition to
crash time logging or implementing application specific reset and/or hang
behavior.

.. attention::

  This log backend comes with a very large ROM and potentially RAM cost. It is
  intended mostly for ease of initial bringup. We encourage teams to use
  tokenized asserts since they are much smaller both in terms of ROM and RAM.

----------------------------
Module Configuration Options
----------------------------
The following configurations can be adjusted via compile-time configuration of
this module, see the
:ref:`module documentation <module-structure-compile-time-configuration>` for
more details.

.. c:macro:: PW_ASSERT_BASIC_ACTION

  Controls what happens after an assert failure. Should be set to one of the
  following options:

  - PW_ASSERT_BASIC_ACTION_ABORT: Call std::abort()
  - PW_ASSERT_BASIC_ACTION_EXIT: Call std::_Exit(-1)
  - PW_ASSERT_BASIC_ACTION_LOOP: Loop forever

  Defaults to abort.

.. c:macro:: PW_ASSERT_BASIC_SHOW_BANNER

  Controls whether ASCII art banner is printed on assert failure.

  This defaults to enabled.

.. c:macro:: PW_ASSERT_BASIC_USE_COLORS

  Controls whether colors are used in assert message printed to console.

  This defaults to enabled.

.. _module-pw_assert_basic-custom_handler:

Custom handler backend example
------------------------------
Here is a typical usage example implementing a simple handler backend which uses
a UART backed sys_io implementation to print during crash time and then reboots.
Note that this example uses CMSIS and a psuedo STM HAL, as a backend implementer
you are responsible for using whatever APIs make sense for your use case(s).

.. code-block:: cpp

   #include "cmsis.h"
   #include "hal.h"
   #include "pw_string/string_builder.h"

   using pw::sys_io::WriteLine;

   extern "C" void pw_assert_basic_HandleFailure(
       [[maybe_unused]] const char* file_name,
       [[maybe_unused]] int line_number,
       [[maybe_unused]] const char* function_name,
       const char* message,
       ...) {
     // Global interrupt disable for a single core microcontroller.
     __disable_irq();

     // Re-initialize the UART to ensure it's safe to use at crash time.
     HAL_UART_DeInit(sys_io_uart);
     HAL_UART_Init(sys_io_uart);

     WriteLine(
         "  Welp, that didn't go as planned. "
         "It seems we crashed. Terribly sorry! Assert reason:");
     {
       pw::StringBuffer<150> buffer;
       buffer << "     ";
       va_list args;
       va_start(args, format);
       buffer.FormatVaList(format, args);
       va_end(args);
       WriteLine(buffer.view());
     }

     // Reboot the microcontroller.
     HAL_NVIC_SystemReset();
   }
