sitara_depot/components/free_rtos/ethernet_industry/eth_ecat_packer.hpp

96 lines
2.0 KiB
C++

/*
* eth_ecat_packer.hpp
*
* Created on: Jun 5, 2023
* Author: algin
*/
#ifndef FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_PACKER_HPP_
#define FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_PACKER_HPP_
#include <cstddef>
namespace free_rtos {
struct Padding {
size_t size;
};
struct PackFunctorBase {
uint8_t *raw;
template<typename DataT>
void operator()(DataT& data) {
DataT *data_p = new(raw) DataT{data};
(void)data_p;
raw += sizeof(DataT);
//DebugP_log((char*)"Data packed: %d\r\n", sizeof(DataT));
}
};
// Функтор для обхода и упаковки элементов custom_tuple
struct PackFunctor : public PackFunctorBase {
PackFunctor(uint8_t *raw)
: PackFunctorBase{raw} { }
using PackFunctorBase::operator ();
template<typename DataT>
void operator()(std::vector<DataT>& data) {
size_t size = data.size() * sizeof(DataT);
memcpy(raw, data.data(), size);
raw += size;
}
void operator()(Padding& padding) {
raw += padding.size;
}
};
struct UnpackFunctorBase {
uint8_t *raw;
template<typename DataT>
void operator()(DataT& data) {
DataT *p_data = reinterpret_cast<DataT*>(raw);
data = *p_data;
raw += sizeof(DataT);
//DebugP_log((char*)"Data unpacked: %d\r\n", sizeof(DataT));
}
void operator()() { }
};
// Функтор для обхода и распаковки элементов custom_tuple
struct UnpackFunctor : public UnpackFunctorBase {
UnpackFunctor(uint8_t *raw)
: UnpackFunctorBase{raw} { }
using UnpackFunctorBase::operator ();
template<typename DataT>
void operator()(std::vector<DataT>& data) {
size_t size = data.size() * sizeof(DataT);
memcpy(data.data(), raw, size);
raw += size;
}
void operator()(Padding& padding) {
raw += padding.size;
}
};
}
#endif /* FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_PACKER_HPP_ */