dev(UML-981): Реализована возможность установки отдельных битов в одном запросе

This commit is contained in:
Vadim Sychev 2022-08-30 10:59:30 +03:00
parent 847102ee66
commit d752ef5b44
2 changed files with 24 additions and 13 deletions

View File

@ -43,7 +43,7 @@ bool UserData::putBit(std::string& bit_name, uint32_t bit_pos)
return true;
}
bool UserData::toRpcJson(nlohmann::json& j)
bool UserData::toRpcJson(nlohmann::json& j) const
{
if (bits_.empty())
{
@ -196,14 +196,24 @@ bool UserData::fromRpcJson(const nlohmann::json& j)
const json& j_bit = j[name];
data_.uint64 = 0;
for (auto bit : bits_)
{
/// Проверяем есть ли в принятой датаграмме бит
if (!j_bit.contains(bit.Name))
return false;
continue;
uint8_t value = j_bit[bit.Name].get<uint8_t>();
data_.uint64 |= static_cast<uint64_t>(value) << bit.Pos;
if (value == 0)
{
/// Очистка бита
data_.uint64&= ~(static_cast<uint64_t>(1) << bit.Pos);
}
else if (value == 1)
{
/// Установка бита
data_.uint64 |= (static_cast<uint64_t>(1) << bit.Pos);
}
}
}

View File

@ -42,6 +42,7 @@ public:
size{data_size.at(type)},
data_offset_{offset}
{
data_.uint64 = 0;
};
union AnyData {
@ -90,7 +91,7 @@ private:
* @return true
* @return false
*/
bool toRpcJson(nlohmann::json& j);
bool toRpcJson(nlohmann::json& j) const;
/**
* @brief Преобразовывает данные их rpc json в бинарные данные
@ -111,16 +112,16 @@ public:
const uint32_t size; /// Размер данных
private:
AnyData data_; /// Данные
std::vector<UserDataBit> bits_;
const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные
AnyData data_; /// Данные
std::vector<UserDataBit> bits_; ///
const uint16_t data_offset_; /// Офсет от начала датаграммы откуда начинаются данные
};
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;
std::map<std::string, UserData> inp_data_map; /// Ключ - имя данных внутри датаграммы
std::map<std::string, UserData> out_data_map; /// Ключ - имя данных внутри датаграммы
std::map<uint32_t, UserData> params_map; /// Ключ - индекс параметра подмодуля
};
enum
@ -130,7 +131,7 @@ enum
USER_DATA_ID_TOTAL
};
using UserDataMap = std::map<uint64_t, SubmoduleUserData>;
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);