#ifndef LIP_MAC_TX_H
#define LIP_MAC_TX_H

#include "lip/ll/lip_ll.h"
#include <stdbool.h>

/***************************************************************************//**
 @addtogroup lip_mac
 @{
 @file lip_mac_tx.h
 @brief Файл содержит определения функций для посылки пакетов

 В данном файле содержатся функции для передачи подготовленный пакетов.

 Данные функции являются связующим звеном между логикой формирования запросов
 на передачу пакетов стеком и логикой посылки пакетов портом конретного MAC
 контроллера.

 В зависимости от конфигурации стека, может использоваться либо промежуточный
 общий буфер для формирования пакетов на передачу, либо набор из нескольких
 очередей.

 При необходимости передать кадр необходимо вызвать lip_mac_tx_frame_prepare()
 с указателем на заполненную информацию о кадре.
 При разрешении очередей на передачу, эта информация может влиять на выбор
 очереди (приоритит, номер портов).
 В случае наличия места будет возвращена структура с описанием кадра,
 включая указатели на выделенный основной буфер данных.
 После заполнения дальнейшей информации и данных необходимо вызвать
 lip_mac_tx_frame_flush() для завершения формирования кадра, после чего
 изменять данные уже нельзя и кадр может быть поставлен на передачу в порядке
 приоритита с помощью lip_ll_tx_frame().

 По завершению передачи самим MAC-контроллером, портом будет вызывана функция
 lip_mac_tx_frame_done_cb() для оповещения, что информация об этом кадре может
 быть отброшена и буфер освобожден для формировани новых кадров. Может вызываться
 из контекста прерывания, если порт поддерживает передачу пакетов по прерываниям.

 Если верхнему уровню требуется оповещение о завершении передачи кадра, то в информации
 о кадре может быть заполнен указатель на соответсвующую функцию обратного вызова,
 которая будет вызыана после lip_mac_tx_frame_done_cb(), но уже из контекста
 фоновой задачи, из которой вызывается lip_mac_tx_pull().

 Функция lip_mac_tx_pull() должна вызываться периодически стеком из основного обработчика
 фоновых задач, таких как обработка информации о завершенных пакетах.


 @author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/


/** @brief Инициализация модуля передачи пакетов */
void lip_max_tx_init(void);
/** @brief Завершение работы модуля передачи пакетов */
void lip_max_tx_close(void);
/** @brief Выделение буфера для формирования пакета на передачу */
t_lip_tx_frame *lip_mac_tx_frame_prepare(const t_lip_tx_frame_info *info);
/** @brief Завершение формирования пакета на передачу */
t_lip_errs lip_mac_tx_frame_flush(t_lip_tx_frame *frame);
/** @brief Проверка, что есть место хотя бы на один пакет на передачу */
bool lip_mac_tx_rdy(void);
/** @brief Выполнение фоновых задач по обслуживанию очередей */
void lip_mac_tx_pull(void);
/** @brief Оповещение о завершении передача кадра от порта */
void lip_mac_tx_frame_done_cb(t_lip_tx_frame *frame);
/** @brief Финальная обрбаботка завершения кадра (вне контекста прерываний) */
void lip_max_tx_frame_finish(t_lip_tx_frame *frame);


#endif // LIP_MAC_TX_H
