#pragma once #include "link_protocol.hpp" #include #include namespace microbu::ble { using Receiver = std::function; /// @brief A set of counters for tracking BLE message traffic. struct Counters { std::uint32_t rx_messages = 0; std::uint32_t tx_messages = 0; std::uint32_t tx_failed = 0; std::uint32_t malformed = 0; }; /** * @brief Starts a simple, bonded BLE GATT peripheral on the NimBLE host. * Uses structured ETSI C-ITS Station Service & Characteristics: * Service: 0000C175-BA5E-4C17-8000-00805F9B34FB * BTP-DATA.request: 0000C176-BA5E-4C17-8000-00805F9B34FB (Write, Authenticated/Encrypted) * BTP-DATA.indication: 0000C177-BA5E-4C17-8000-00805F9B34FB (Notify, Authenticated/Encrypted) * PoTi Fix Update: 0000C178-BA5E-4C17-8000-00805F9B34FB (Write, Authenticated/Encrypted) * Station Status: 0000C179-BA5E-4C17-8000-00805F9B34FB (Read / Notify, Authenticated/Encrypted) * SF-SAP Identity: 0000C17A-BA5E-4C17-8000-00805F9B34FB (Notify, Authenticated/Encrypted) * Station Configure: 0000C17B-BA5E-4C17-8000-00805F9B34FB (Write, Authenticated/Encrypted) * Result: 0000C17C-BA5E-4C17-8000-00805F9B34FB (Notify, Authenticated/Encrypted) * * Fixed passkey bonding: 123456. * Single ATT message transmission/reception up to 512 bytes without fragmentation chunk delays. * @param receiver Invoked with each decoded station-link message written by the phone. * @return false if the NimBLE host or GATT service failed to start. */ bool start(Receiver receiver); /** * @brief Sends one complete station-link message via GATT notification. * Dispatches immediately without queuing delay. * @param message Encoded station-link message to notify. * @return false if not connected/subscribed or the notification could not be sent. */ bool write(const link::Bytes& message); /// @return true if a phone is connected. bool connected(); /// @brief MicrOBU: allows or stops advertising (an existing connection is never dropped). Called /// with false while the phone uses the USB link, so BLE takes no airtime from ITS-G5. void set_advertising_allowed(bool allowed); /// @return true while advertising is allowed (see set_advertising_allowed). bool advertising_allowed(); /// @return true if the phone has subscribed to notifications. bool is_subscribed(); /// @return Current message/error counters. Counters counters(); } // namespace microbu::ble