ProfinetConnector/src/profinet/profinet_subslot.hpp

81 lines
2.4 KiB
C++

#pragma once
#include <cstdint>
#include <string>
#include "profinet_serv_data.hpp"
#include "profinet_parameter.hpp"
#include "../../libs/include/pnet_api.h"
#include <map>
#include <memory>
/**
* Callback for updated cyclic data
*
* @param subslot InOut: Subslot structure
* @param tag InOut: Typically a handle to a submodule
*/
typedef void (*ProfinetSubslotCallback) (void * subslot, void * tag);
class ProfinetSubslot
{
public:
ProfinetSubslot(uint16_t subslot_nbr,
uint32_t submodule_id,
std::string submodule_name,
pnet_data_cfg_t data_cfg);
bool plugSubmodule(ProfinetServiceData& pnet_data);
bool pullSubmodule(ProfinetServiceData& pnet_data);
bool addParameter(std::shared_ptr<ProfinetParameter>& param);
ProfinetParameter * getParameterPtr(uint32_t Index);
void setSlotNumber(uint16_t slot_nbr) { m_slot_nbr = slot_nbr; };
void setModuleId(uint16_t module_id) { m_module_id = module_id; };
public:
/// Номер подслота
const uint16_t m_subslot_nbr;
/// Идентификатор подмодуля который вставлен в данный подслот
const uint32_t m_submodule_id;
/// Имя этого подмодуля
const std::string m_submodule_name;
/// Конфигурация данных подмодуля (направление данных, размер данных)
const pnet_data_cfg_t m_data_cfg;
private:
/// Флаг подключения подмодуля к подслоту
bool m_submodule_plugged;
/// Номер слота куда входит данный подслот
uint16_t m_slot_nbr;
/// Идентификатор модуля куда входит подключаемый подмодуль
uint16_t m_module_id;
/// 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;
std::map<uint32_t, std::shared_ptr<ProfinetParameter>> m_params;
/** Callback for cyclic input- or output data, or NULL if not implemented */
ProfinetSubslotCallback m_cyclic_callback;
/// данные передающиеся в cyclic_callback вторым параметром.
void * m_tag;
};