#pragma once

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

/**
 * Indication to the application that a sub-module is requested by the
 * controller in a specific sub-slot.
 *
 * This application call-back function is called by the Profinet stack to
 * indicate that the controller has requested the presence of a specific
 * sub-module with ident number \a submodule_ident, in the sub-slot number
 * \a subslot, with module ident number \a module_ident in slot \a slot.
 *
 * If a module has not been plugged in the slot \a slot then an automatic plug
 * request is issued internally by the stack.
 *
 * The application must react to this by configuring itself accordingly (if
 * possible) and call function \a pnet_plug_submodule() to configure the stack
 * with the correct input/output data sizes.
 *
 * If the wrong sub-module ident number is plugged then the stack will accept
 * this, but signal to the controller that a substitute sub-module is fitted.
 *
 * This function should return 0 (zero) if a valid sub-module was plugged,
 * or return -1 if the application cannot handle this request.
 * 
 * Индикация приложению о том, что субмодуль запрошен контроллером в определенном субслоте. 
 * 
 * Эта функция обратного вызова приложения вызывается стеком Profinet, чтобы указать, что контроллер 
 * запросил наличие определенного подмодуля с идентификационным номером \a идентификатор_подмодуля, 
 * в подслоте с номером подслота \a, с идентификационным номером модуля \a module_ident в слоте \a slot. 
 * 
 * Если модуль не был вставлен в слот \a slot, то внутри стека выдается автоматический запрос на вставку. 
 * 
 * Приложение должно отреагировать на это, настроив себя соответствующим образом (если это возможно) и 
 * вызвать функцию \a pnet_plug_submodule() для настройки стека с правильными размерами входных/выходных данных. 
 * 
 * Если установлен неправильный идентификационный номер субмодуля, стек примет это, но сигнализирует контроллеру, 
 * что установлен замещающий субмодуль. 
 * 
 * Эта функция должна возвращать 0 (ноль), если был подключен допустимый подмодуль, или возвращать -1, 
 * если приложение не может обработать этот запрос.
 *
 * @param net              InOut: The p-net stack instance
 * @param arg              InOut: User-defined data (not used by p-net)
 * @param api              In:    The AP identifier.
 * @param slot             In:    The slot number.
 * @param subslot          In:    The sub-slot number.
 * @param module_ident     In:    The module ident number.
 * @param submodule_ident  In:    The sub-module ident number.
 * @param p_exp_data       In:    The expected data configuration (sizes and
 *                                direction)
 * @return  0  on success.
 *          -1 if an error occurred.
 */
int profinet_cb_exp_submodule_ind (
    pnet_t * net,
    void * arg,
    uint32_t api,
    uint16_t slot,
    uint16_t subslot,
    uint32_t module_id,
    uint32_t submodule_id,
    const pnet_data_cfg_t * p_exp_data);