96 lines
2.0 KiB
C++
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_ */
|