dev(UML-981): Добавил настройку отключения изменения порядка байт

This commit is contained in:
Vadim Sychev 2022-09-01 15:38:55 +03:00
parent d752ef5b44
commit f6bbef1af9
5 changed files with 40 additions and 17 deletions

View File

@ -160,7 +160,7 @@ int main(int argc, char * argv[])
{
answer_str.clear();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::string request{j_get_flags.dump()};
///Запрос:
*p_output_stream_ << request << std::endl;
@ -409,13 +409,22 @@ int main(int argc, char * argv[])
j_set_data["submodule_id"] = submodule_id;
auto& data = j_set_data["data"]["I808InpBits"];
for (int i = 0; i < 8; ++i)
static bool init = true;
if (init)
{
bits[i] = (~bits[i]) & 0x01;
std::string bit_name = "in_bit_" + std::to_string(i);
data[bit_name] = bits[i];
for (int i = 0; i < 8; ++i)
{
//bits[i] = (~bits[i]) & 0x01;
std::string bit_name = "in_bit_" + std::to_string(i);
data[bit_name] = value_bits[i];
}
init = false;
}
else
{
data["in_bit_1"] = 1;
}
j_set_echo_data["params"].push_back(j_set_data);
}
break;

View File

@ -234,7 +234,7 @@ static bool programconf_getCyclycDataDir(json& j_cyclic_data, uint8_t& dir)
return true;
}
static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<std::string, UserData>& user_data, uint16_t& cyc_data_len)
static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<std::string, UserData>& user_data, uint16_t& cyc_data_len, bool swap)
{
uint16_t data_lengh = 0;
@ -256,7 +256,7 @@ static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<s
auto name = j.at("name").get<std::string>();
auto Type = j.at("DataType").get<std::string>();
user_data.emplace(std::make_pair(std::string(name), UserData{name, Type, data_lengh}));
user_data.emplace(std::make_pair(std::string(name), UserData{name, Type, data_lengh, swap}));
data_lengh+= user_data.at(name).size;
@ -285,7 +285,7 @@ static bool programconf_getCyclicDataSettings(const json& j_cyc_data, std::map<s
static bool programconf_getParamsSettings(const json& j_sett,
ProfinetData_Submodule& submod,
ProfinetSharedData& shared_data,
std::map<std::uint32_t, UserData>& user_data)
std::map<std::uint32_t, UserData>& user_data, bool swap)
{
if (!j_sett.contains("parameters"))
return false;
@ -319,7 +319,7 @@ static bool programconf_getParamsSettings(const json& j_sett,
param.index = static_cast<uint32_t>(parm_sett.at("index").get<int>());
param.name = parm_sett.at("name").get<string>();
user_data.emplace(std::make_pair(param.index, UserData{param.name, data_type, 0}));
user_data.emplace(std::make_pair(param.index, UserData{param.name, data_type, 0, swap}));
param.length = static_cast<uint16_t>(user_data.at(param.index).size);
@ -378,6 +378,14 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
uint32_t module_index = 0;
/// Необходимость изменять порядок байт в датаграмме(мастер - bigendian)
bool swap = true;
if (j.contains("SwapData"))
{
swap = j.at("SwapData").get<bool>();
}
for (auto& mod_set : modules_sett)
{
uint32_t mod_id = hexstring_to_int(mod_set["id"].get<string>());
@ -434,7 +442,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
if (j_cycdata_sett.contains("Inputs"))
{
/// Конструируем поля пользовательских данных в датаграмме циклических данных
if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Inputs"), submod_user_data.inp_data_map, submod.cyc_indata_len))
if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Inputs"), submod_user_data.inp_data_map, submod.cyc_indata_len, swap))
{
return false;
}
@ -447,7 +455,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
if (j_cycdata_sett.contains("Outputs"))
{
if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Outputs"), submod_user_data.out_data_map, submod.cyc_outdata_len))
if (!programconf_getCyclicDataSettings(j_cycdata_sett.at("Outputs"), submod_user_data.out_data_map, submod.cyc_outdata_len, swap))
{
return false;
}
@ -481,7 +489,7 @@ static bool programconf_getProfinetModulesSettings(json& j, ProfinetData_Map * p
}
/// Читаем конфигурацию параметров
programconf_getParamsSettings(submod_sett, submod, shared_data, submod_user_data.params_map);
programconf_getParamsSettings(submod_sett, submod, shared_data, submod_user_data.params_map, swap);
}
}

View File

@ -1,4 +1,5 @@
{
"SwapData": false,
"ProfinetDeviceSettings":
{
"product_name": "P-Net Sample Application",

View File

@ -255,7 +255,10 @@ void UserData::extractData(std::vector<uint8_t>& vect)
std::copy(&data_.uint8[0], &data_.uint8[size], buf);
/// Данные в профинет передаются в формате BigEndian
/// преобразуем из Little в Big
endian_swapbytes(&buf[0], size);
if (swap_)
{
endian_swapbytes(&buf[0], size);
}
/// Вставляем данные в вектор по офсету
std::copy(buf, &buf[size], vect.begin() + data_offset_);
}
@ -266,7 +269,7 @@ void UserData::insertData(const std::vector<uint8_t>& vect)
std::copy(&vect[data_offset_], &vect[data_offset_ + size], data_.uint8);
/// Конвертим
if ((type >= UserDataTypes::UINT16) &&
(type <= UserDataTypes::FLOAT64))
(type <= UserDataTypes::FLOAT64) && swap_)
{
/// Данные в профинет передаются в формате BigEndian
/// преобразуем из Big в Little

View File

@ -36,11 +36,12 @@ public:
FLOAT64,
};
UserData(std::string& Name, std::string& DataType, uint16_t offset) :
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}
data_offset_{offset},
swap_{swap}
{
data_.uint64 = 0;
};
@ -115,6 +116,7 @@ private:
AnyData data_; /// Данные
std::vector<UserDataBit> bits_; ///
const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные
const bool swap_; /// Перобразование порядка байт
};
struct SubmoduleUserData