/**
 * BLE 链路异步收发缓冲
 * NimBLE 与 UHCI 共用 HCI 硬件，无法用 UART DMA；此处用环形队列模拟 DMA 双缓冲，防止 GATT 回调阻塞导致溢出。
 */
#ifndef LINK_DMA_BLE_H
#define LINK_DMA_BLE_H

#include "esp_err.h"
#include <stddef.h>
#include <stdint.h>

typedef enum {
    LINK_DMA_BLE_CH_JSON = 0,
    LINK_DMA_BLE_CH_OTA  = 1,
} link_dma_ble_ch_t;

typedef void (*link_dma_ble_rx_cb_t)(link_dma_ble_ch_t ch, const uint8_t *data, uint16_t len, void *ctx);

/** payload 由队列持有，发送完成后自动释放 */
typedef int (*link_dma_ble_tx_fn_t)(uint16_t attr_handle, const uint8_t *data, uint16_t len, void *ctx);

esp_err_t link_dma_ble_start(link_dma_ble_rx_cb_t rx_cb, void *rx_ctx,
                              link_dma_ble_tx_fn_t tx_fn, void *tx_ctx);

void link_dma_ble_stop(void);

/** GATT 写回调中调用：拷贝入队后立即返回 */
bool link_dma_ble_post_rx(link_dma_ble_ch_t ch, const uint8_t *data, uint16_t len);

/** 排队 Notify/Write；conn 与 handle 由 tx_fn 使用 */
bool link_dma_ble_post_tx(uint16_t attr_handle, const uint8_t *data, uint16_t len);

void link_dma_ble_set_conn_handle(uint16_t conn_handle);

#endif /* LINK_DMA_BLE_H */
