#include "profinet_subslot.hpp"

ProfinetSubslot::ProfinetSubslot(uint16_t subslot_nbr, uint16_t slot_nbr, uint32_t module_id) :
                                     m_subslot_nbr(subslot_nbr), 
                                     m_slot_nbr(slot_nbr),
                                     m_module_id(module_id),
                                     m_submodule_ptr(nullptr)
{

}

bool ProfinetSubslot::pullSubmodule(ProfinetServiceData& pnet_data)
{
    int result = pnet_pull_submodule (pnet_data.pnet_ptr, pnet_data.api, m_slot_nbr, m_subslot_nbr);
    
    /// Очищаем указатель на подмодуль
    m_submodule_ptr = nullptr;

    return (result == 0);
}

bool ProfinetSubslot::plugSubmodule(ProfinetServiceData& pnet_data, std::shared_ptr<ProfinetSubmodule>& submodule_ptr)
{   
    /// Сначала отключаем подмодуль
    pullSubmodule(pnet_data);

    /// Подключаем подмодуль
    int result = pnet_plug_submodule (
      pnet_data.pnet_ptr,
      pnet_data.api,
      m_slot_nbr,
      m_subslot_nbr,
      m_module_id,
      submodule_ptr->m_id,
      submodule_ptr->m_data_cfg.data_dir,
      submodule_ptr->m_data_cfg.insize,
      submodule_ptr->m_data_cfg.outsize);

    if (result == 0)
    {
        m_submodule_ptr = submodule_ptr;
    }

    return (m_submodule_ptr != nullptr);
}