#pragma once

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

/**
 * Indication to the application that an IODWrite request was received from the
 * controller.
 *
 * This application call-back function is called by the Profinet stack on every
 * IODWrite 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 values of \a idx and \a write_length and save
 * (copy) the binary value in \a p_write_data. A future IODRead must return the
 * latest written value.
 *
 * 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.
 * 
 * Индикация приложению о том, что от контроллера получен запрос IODWrite. 
 * 
 * Эта функция обратного вызова приложения вызывается стеком Profinet при каждом запросе IODWrite от контроллера Profinet, 
 * в котором указывается специфичное для приложения значение \a idx (0x0000 - 0x7fff). Все остальные значения \a idx 
 * обрабатываются внутри стека Profinet. 
 * 
 * Приложение должно проверить значения \a idx и \a write_length и сохранить (скопировать) двоичное значение в \a p_write_data. 
 * Будущий IODRead должен возвращать самое последнее записанное значение. 
 * 
 * Стек 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 API 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 write_length     In:    The length in bytes of the binary value.
 * @param p_write_data     In:    A pointer to 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_write_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,
        uint16_t write_length,
        const uint8_t * p_write_data,
        pnet_result_t * p_result);