#pragma once

#include <cstdint>
#include <string>
#include <map>
#include <memory>
#include "profinet_parameter.hpp"

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


class ProfinetSubmodule {
public:
    ProfinetSubmodule(uint32_t submodule_id, 
                      std::string submodule_name, 
                      pnet_data_cfg_t& submodule_data_cfg, 
                      void * const inp_data_ptr,
                      void * const out_data_ptr);
    
    bool addParameter(std::shared_ptr<ProfinetParameter>& param);

    std::shared_ptr<ProfinetParameter> getParameterPtr(uint32_t index);



public:
    const uint32_t        m_id;               /// Идентификатор подмодуля
    const std::string     m_name;             /// Имя подмодуля
    const pnet_data_cfg_t m_data_cfg;         /// Конфигурация циклических данных подмодуля
    
    /// iocs = I/O consumer status data (формат данных из pnet_ioxs_values_t)
    uint8_t m_indata_iocs; 

    /// iops = I/O provider status data (формат данных из pnet_ioxs_values_t)
    uint8_t m_outdata_iops;

    void * const          m_inp_data_ptr;     /// Входные циклические данные (DEV->PLC)
    void * const          m_out_data_ptr;     /// Выходные циклические данные (PLC->DEV)
    
private:
    /// Набор параметров подмодуля
    std::map<uint32_t, std::shared_ptr<ProfinetParameter>> m_params;
};