ProfinetConnector/src/user_data/user_data.hpp

140 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <string>
#include <cstdint>
#include <vector>
#include <map>
#include <memory>
#include "../nlohmann_json/json.hpp"
struct UserDataBit {
const std::string Name;
const uint32_t Pos;
};
/**
* @brief Класс представления данных внутри датаграммы циклического обмена профинет в виде
* пользовательского набора стандартных типов. Нужен для выполнения RpcJson запросов оканчивающихся на
* Named.
*
*/
class UserData {
public:
enum class UserDataTypes
{
BOOL,
UINT8,
UINT16,
UINT32,
UINT64,
INT8,
INT16,
INT32,
INT64,
FLOAT32,
FLOAT64,
};
UserData(std::string& Name, std::string& DataType, uint16_t offset, bool swap) :
name{Name},
type{data_corr.at(DataType)},
size{data_size.at(type)},
data_offset_{offset},
swap_{swap}
{
data_.uint64 = 0;
};
union AnyData {
bool boolean;
uint8_t uint8[8];
uint16_t uint16[4];
uint32_t uint32[2];
uint64_t uint64;
uint8_t int8[8];
uint16_t int16[4];
uint32_t int32[2];
uint64_t int64;
float float32;
double float64;
};
//void init(std::string& Name, std::string& DataType, uint16_t offset);
bool convertBinaryToJson(const std::vector<uint8_t>& vect_inp, nlohmann::json& j_out);
bool convertJsonToBinary(const nlohmann::json& j_inp, std::vector<uint8_t>& vect_out);
bool putBit(std::string& bit_name, uint32_t bit_pos);
static int getDataSize(const std::string& type_name);
private:
/**
* @brief Извлекает данные в вектор с учетом оффсета и эндиана
*
* @param vect
*/
void extractData(std::vector<uint8_t>& vect);
/**
* @brief Берет данные из вектора с учетом оффсета и эндиана
*
* @param vect
*/
void insertData(const std::vector<uint8_t>& vect);
/**
* @brief Кладет внутренние бинарные данные в rpc json
*
* @param j
* @return true
* @return false
*/
bool toRpcJson(nlohmann::json& j) const;
/**
* @brief Преобразовывает данные их rpc json в бинарные данные
*
* @param j
* @return true
* @return false
*/
bool fromRpcJson(const nlohmann::json& j);
private:
static const std::map<UserDataTypes, uint32_t> data_size;
static const std::map<std::string, UserDataTypes> data_corr;
public:
const std::string name; /// Имя данных
const UserDataTypes type; /// Тип данных
const uint32_t size; /// Размер данных
private:
AnyData data_; /// Данные
std::vector<UserDataBit> bits_; ///
const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные
const bool swap_; /// Перобразование порядка байт
};
struct SubmoduleUserData
{
std::map<std::string, UserData> inp_data_map; /// Ключ - имя данных внутри датаграммы
std::map<std::string, UserData> out_data_map; /// Ключ - имя данных внутри датаграммы
std::map<uint32_t, UserData> params_map; /// Ключ - индекс параметра подмодуля
};
enum
{
USER_DATA_ID_SUBMOD,
USER_DATA_ID_MOD,
USER_DATA_ID_TOTAL
};
using UserDataMap = std::map<uint64_t, SubmoduleUserData>; /// Ключ - битовое поле, где стартшие 32-бита - module_id, а младшие - submodule_id
SubmoduleUserData& UserData_addNewSubmod(uint32_t mod_id, uint32_t submod_id, UserDataMap& user_data_map);
SubmoduleUserData& UserData_getSubmod(uint32_t mod_id, uint32_t submod_id, UserDataMap& user_data_map);