UART Examples (Blocking API)
============================

Overview
~~~~~~~~

The blocking UART examples are available for both C and C++:

- C: ``examples/blocking_api/uart/c/``
- C++: ``examples/blocking_api/uart/cpp/``

These examples are intended for both **Supernova** and **Pulsar** USB host adapters.

Hardware Setup
~~~~~~~~~~~~~~

Required hardware:

1. One Binho **Supernova** or **Pulsar**
2. One Binho **Breakout Board**

Required wiring:

- Interconnect **TX** and **RX** on the breakout board to close the hardware loopback path.
- Otherwise, connect another UART device to the breakout board for a real-world test. In this case, the user is in charge of configuring the external device to match the UART settings used in the example.

What The UART Examples Do
~~~~~~~~~~~~~~~~~~~~~~~~~

1. Create the SDK instance/handle.
2. Register a UART receive notification callback at the beginning of the program.
3. Connect to the adapter and retrieve device information.
4. Initialize UART with ``115200-8N1`` and send ``Hello, world!``.
5. Receive loopback data through the registered callback.
6. Reconfigure UART to ``9600-8N1`` and send the same message again.
7. Receive loopback data again through the callback.

Notification Callback Requirement
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

UART receive data is delivered through asynchronous notifications.  
For this reason, the client application must register a callback before UART
traffic begins:

- C API: ``CosmicSDK_onNotification``, then parse UART notifications with
  ``CosmicSDK_notificationAsUartRx``.
- C++ API: ``CosmicSDK::onNotification`` and parse using
  ``notification.uartRx()``.

Synchronization Mechanism
~~~~~~~~~~~~~~~~~~~~~~~~~

The examples use callback-driven synchronization instead of fixed sleeps.
After each UART transmission, the main flow waits until the callback signals
that loopback data has been received (with a timeout to avoid blocking forever).

- C example: platform synchronization primitives (Windows condition variable or
  POSIX ``pthread`` condition variable) plus a notification counter.
- C++ example: ``std::mutex`` + ``std::condition_variable`` plus a notification
  counter.

Build and Run (UART C/C++)
~~~~~~~~~~~~~~~~~~~~~~~~~~

UART example directories build binaries with the following names:

- C (``examples/blocking_api/uart/c/``):
    - ``example_c_dynamic``
    - ``example_c_static``
- C++ (``examples/blocking_api/uart/cpp/``):
    - ``example_cpp_dynamic``
    - ``example_cpp_static``

See also:

- C API UART reference: :doc:`../../api/c/uart`
- C++ blocking UART reference: :doc:`../../api/cpp_blocking/uart`
