#pragma once

#include <cstdint>
#include <string>

#include "../flags/shared_flags.hpp"
#include "../shared_data/shared_data.hpp"


enum ProfinetSubmoduleDir
{
   PROFINET_SUBMOD_DIR_NO_IO  = 0x00,
   PROFINET_SUBMOD_DIR_INPUT  = 0x01,
   PROFINET_SUBMOD_DIR_OUTPUT = 0x02,
   PROFINET_SUBMOD_DIR_IO     = 0x03
};

enum ProfinetEvent
{
    EVENT_CONNECTION_ESTABLISHED = 0x00000001, /// Установлено соединение с ПЛК
    EVENT_NEW_CYCLIC_DATA        = 0x00000002, /// Получение новых циклических данных от ПЛК
    EVENT_NEW_PARAM_DATA         = 0x00000004, /// Новая запись параметра от ПЛК
    EVENT_CONNECTION_ABORT       = 0x00000008 /// Разрыв соединения
};

struct ProfinetData_Parameter {
    uint32_t        index;              /// Идентфикатор параметра
    std::string     name;               /// Наименование
    uint16_t        length;             /// длина параметра в байтах
    SharedData      data;               /// Указатель на данные параметра
};

struct ProfinetData_Submodule{
    uint32_t    id;                  /// Идентификатор подмодуля
    std::string name;                /// Наименование
    uint8_t     cyc_data_dir;        /// Направление данных
    uint16_t    cyc_indata_len;      /// Длина входных для ПЛК данных
    uint16_t    cyc_outdata_len;     /// Длина выходных для ПЛК данных
    SharedData  inp_data;            /// Входные данные(данные от контроллера к устройству)
    SharedData  out_data;            /// Выходные данные(данные от устройства к контроллеру)

    ProfinetData_Parameter *  p_params; /// Параметры подмодуля
    uint32_t params_nbr;                /// Количество параметров
};

struct ProfinetData_Module {
    uint32_t    id;
    std::string name;
    ProfinetData_Submodule * p_submods; /// Подмодули
    uint32_t submods_nbr;             /// Количество подмодулей
};

struct ProfinetData_Map {
    SharedFlags Events;           /// События profinet                    
    ProfinetData_Module * p_mods; /// Модули
    uint32_t mods_nbr;            /// Количество модулей
};

