#pragma once

#include "../../libs/include/pnet_api.h"

/**
 * Indication to the application that an IODRead request was received from the
 * controller.
 *
 * This application call-back function is called by the Profinet stack on every
 * IODRead request from the Profinet controller which specify an
 * application-specific value of \a idx (0x0000 - 0x7fff). All other values of
 * \a idx are handled internally by the Profinet stack.
 *
 * The application must verify the value of \a idx, and that \a p_read_length is
 * large enough. Further, the application must provide a
 * pointer to the binary value in \a pp_read_data and the size, in bytes, of the
 * binary value in \a p_read_length.
 *
 * The Profinet stack does not perform any endianness conversion on the binary
 * value.
 *
 * In case of error the application should provide error information in \a
 * p_result.
 * 
 * Индикация приложению о том, что от контроллера получен запрос IODRead. 
 * 
 * Эта функция обратного вызова приложения вызывается стеком Profinet при каждом запросе IODRead от контроллера Profinet, 
 * в котором указывается специфичное для приложения значение \a idx (0x0000 - 0x7fff). Все остальные значения \a idx 
 * обрабатываются внутри стека Profinet. 
 * 
 * Приложение должно проверить значение \a idx и достаточно ли велико значение \a p_read_length. 
 * Кроме того, приложение должно предоставить указатель на двоичное значение в \a pp_read_data и размер в байтах 
 * двоичного значения в \a p_read_length. 
 * 
 * Стек Profinet не выполняет никакого преобразования порядка байтов в двоичном значении. 
 * 
 * В случае ошибки приложение должно предоставить информацию об ошибке в \a p_result.
 *
 * @param net              InOut: The p-net stack instance
 * @param arg              InOut: User-defined data (not used by p-net)
 * @param arep             In:    The AREP.
 * @param api              In:    The AP identifier.
 * @param slot             In:    The slot number.
 * @param subslot          In:    The sub-slot number.
 * @param idx              In:    The data record index.
 * @param sequence_number  In:    The sequence number.
 * @param pp_read_data     Out:   A pointer to the binary value.
 * @param p_read_length    InOut: The maximum (in) and actual (out) length in
 *                                bytes of the binary value.
 * @param p_result         Out:   Detailed error information if returning != 0
 * @return  0  on success.
 *          -1 if an error occurred.
 */
int profinet_cb_read_ind (
    pnet_t * net,
    void * arg,
    uint32_t arep,
    uint32_t api,
    uint16_t slot_nbr,
    uint16_t subslot_nbr,
    uint16_t idx,
    uint16_t sequence_number,
    uint8_t ** pp_read_data,
    uint16_t * p_read_length,
    pnet_result_t * p_result);