#include "app.hpp"
#include "program_config.hpp"

bool App::Init(std::string profinet_config_file)
{
    ProfinetSettings profinet_settings;
    ProfinetDeviceSettings profinet_dev_settings;
    ProfinetPipesSettings profinet_pipe_settings;

    /// Читаем настройки из файла
    if (!programconf_getProfinetSettings("program_configure.json", profinet_settings, profinet_pipe_settings))
    {
        return false;
    }

    ///Создаем структуру в разделяемой памяти
    ProfinetData_Map * p_profinetMap = shared_data_.Create("profinet_shared_data");

    /// Читаем настройки из файла, выделяем память под структуру модулей и подмодулей
    if (!programconf_getProfinetDeviceSettings(profinet_settings.profinet_device_config, profinet_dev_settings, p_profinetMap, shared_data_))
    {
        return false;
    }

     /// Настройка  Profinet: Инициализация pnet, добавление DAP слотов и подслотов и подключение к ним модулей и подмодулей,
    if (!profinet_.Config(profinet_settings, profinet_dev_settings, p_profinetMap))
    {
        return false;
    }

    /// Создаем именованые каналы
    pipes_.Init(profinet_pipe_settings);

    /**
     * Циклические данные устройства передаются с определенным периодом, сообщения от контроллера при этом не требуются.
     */
    /// Запуск потока Profinet
    profinet_.Start();
    /// Запуск потока чтения запросов по pipe
    pipes_.Start(&profinet_);

    return true;
}

void App::Run()
{
    for (;;)
    {   
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
}