#include "profinet_parameter.hpp"

ProfinetParameter::ProfinetParameter(uint32_t Index, std::string Name, SharedDataIface * p_data) :
                      index(Index), 
                      name(Name), 
                      length(p_data->Size()),
                      p_data_(p_data),
                      read_buf_(nullptr)                     
{
    if (length != 0)
    {
        read_buf_ = std::shared_ptr<uint8_t[]>(new uint8_t[length]);
    }
};

bool ProfinetParameter::readParameter(uint8_t * const data_ptr)
{
    if ((data_ptr == nullptr) || (p_data_ == nullptr))
    {
        return false;
    }

    p_data_->Read(0, (void*)data_ptr, length);

    return true;
}

bool ProfinetParameter::writeParameter(const uint8_t * data_ptr)
{
    if ((data_ptr == nullptr) || (p_data_ == nullptr))
    {
        return false;
    }

    p_data_->Write(0, (void*)data_ptr, length);

    return true;
}

uint8_t * ProfinetParameter::getReadBufPtr()
{
    /**
     * @brief Cитуации когда приложение записывает данные в параметр, а контроллер хочет этот параметр 
     * прочитать и вызвался коллбэк profinet_cb_read. В этом случае будем тут висеть пока приложение не запишет параметр.
     * 
     */

    if (p_data_ == nullptr)
        return nullptr;
    
    uint8_t * p_read_buf = read_buf_.get();

    /// Копируем данные в буфер
    p_data_->Read(0, p_read_buf, length);


    return p_read_buf;
}