dev(UML-981): Удалил файлы старой структуры проекта.
This commit is contained in:
parent
d1ade982e6
commit
c6aabfe1a1
@ -1,65 +0,0 @@
|
|||||||
#include "../interprocess/profinet_shared_data.hpp"
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
using namespace boost::interprocess;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Расчет размера данных для выделения памяти
|
|
||||||
*
|
|
||||||
* @param data_settings
|
|
||||||
* @return uint32_t
|
|
||||||
*/
|
|
||||||
static uint32_t calc_mem_size(ProfinetData_Map& data_settings)
|
|
||||||
{
|
|
||||||
uint32_t size = 0;
|
|
||||||
for (int i = 0; i < data_settings.mods_nbr; ++i)
|
|
||||||
{
|
|
||||||
auto& submods = data_settings.p_mods[i].p_submods;
|
|
||||||
|
|
||||||
for (int j = 0; j < data_settings.p_mods[i].submods_nbr; ++j)
|
|
||||||
{
|
|
||||||
auto& submod = submods[j];
|
|
||||||
|
|
||||||
size+= submod.cyc_indata_len + submod.cyc_outdata_len;
|
|
||||||
|
|
||||||
auto& params = submod.p_params;
|
|
||||||
|
|
||||||
for (int k = 0; k < submod.params_nbr; ++k)
|
|
||||||
{
|
|
||||||
size+= params[i].length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return size + sizeof(ProfinetData_Map);
|
|
||||||
}
|
|
||||||
|
|
||||||
ProfinetData_Map * ProfinetSharedData::Create(std::string mem_name)
|
|
||||||
{
|
|
||||||
/// Если память уже выделена, удаляем
|
|
||||||
shared_memory_object::remove(mem_name.c_str());
|
|
||||||
/// Для начала выделяем 65к байт. Потом вызывается функция checkMemorySize и размер моджет быть увеличен
|
|
||||||
shmem_ = managed_shared_memory{create_only, mem_name.c_str(), 65536};
|
|
||||||
mem_name_ = mem_name;
|
|
||||||
///Создаем данные в разделяемой памяти
|
|
||||||
p_profinet_data_ = shmem_.construct<ProfinetData_Map>("ProfinetData_Map")();
|
|
||||||
return p_profinet_data_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProfinetSharedData::checkMemorySize(uint32_t required_mem_size)
|
|
||||||
{
|
|
||||||
uint32_t free_size = shmem_.get_size();
|
|
||||||
|
|
||||||
if (required_mem_size < free_size)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/// Увеличиваем память
|
|
||||||
managed_shared_memory::grow(mem_name_.c_str(), required_mem_size - free_size);
|
|
||||||
|
|
||||||
/// Заново открываем память(может измениться указатель)
|
|
||||||
shmem_ = managed_shared_memory{open_only, mem_name_.c_str()};
|
|
||||||
|
|
||||||
/// Заново находим или создаем структуру ProfinetData_Map
|
|
||||||
p_profinet_data_ = shmem_.find_or_construct<ProfinetData_Map>("ProfinetData_Map")();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
#include "../profinet/profinet_data_map.hpp"
|
|
||||||
#include <boost/interprocess/managed_shared_memory.hpp>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
class ProfinetSharedData {
|
|
||||||
public:
|
|
||||||
~ProfinetSharedData() {
|
|
||||||
///Удаляем память
|
|
||||||
boost::interprocess::shared_memory_object::remove(mem_name_.c_str());
|
|
||||||
//std::cout << "Destruct: ProfinetSharedData: Shared data deleted" << std::endl;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Выделяыет раздеяемую память под структуру ProfinetData_Map
|
|
||||||
*
|
|
||||||
* @param mem_name
|
|
||||||
* @return ProfinetData_Map*
|
|
||||||
*/
|
|
||||||
|
|
||||||
ProfinetData_Map * Create(std::string mem_name);
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T * allocateData(uint32_t nbr) {
|
|
||||||
return shmem_.construct<T>(boost::interprocess::anonymous_instance)[nbr]();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Проверяет, что размер свободной памяти не меньше чем значение required_mem_size
|
|
||||||
* Если меньше, то увеличиват память.
|
|
||||||
*
|
|
||||||
* @param required_mem_size
|
|
||||||
* @return uint32_t
|
|
||||||
*/
|
|
||||||
void checkMemorySize(uint32_t required_mem_size);
|
|
||||||
|
|
||||||
ProfinetData_Map * p_profinet_data_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
boost::interprocess::managed_shared_memory shmem_;
|
|
||||||
std::string mem_name_;
|
|
||||||
};
|
|
||||||
@ -1,113 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "../profinet/profinet_data_map.hpp"
|
|
||||||
#include <boost/interprocess/managed_shared_memory.hpp>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
class ProfinetSharedDataClient {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Подключается к выделенной разделяемой памяти
|
|
||||||
*
|
|
||||||
* @param mem_name
|
|
||||||
*/
|
|
||||||
ProfinetData_Map * Connect(std::string mem_name) {
|
|
||||||
ProfinetData_Map * out{nullptr};
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
shmem_ = boost::interprocess::managed_shared_memory{boost::interprocess::open_only, mem_name.c_str()};
|
|
||||||
try
|
|
||||||
{
|
|
||||||
auto mem = shmem_.find<ProfinetData_Map>("ProfinetData_Map");
|
|
||||||
out = mem.first;
|
|
||||||
///Упорядочиваем память для удобства обращения по индентификатору Profinet
|
|
||||||
collected_data = collect(out);
|
|
||||||
}
|
|
||||||
catch(const std::exception& e)
|
|
||||||
{
|
|
||||||
std::cerr << e.what() << '\n';
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(const std::exception& e)
|
|
||||||
{
|
|
||||||
std::cerr << e.what() << '\n';
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Возвращает указатель на данные подмодуля в разделяемой памяти
|
|
||||||
*
|
|
||||||
* @param module_id идентификатор модуля
|
|
||||||
* @param submodule_id идентификатор подмодуля
|
|
||||||
* @return ProfinetData_Submodule*
|
|
||||||
*/
|
|
||||||
ProfinetData_Submodule * getSubmodule(uint32_t module_id, uint32_t submodule_id)
|
|
||||||
{
|
|
||||||
return (*collected_data)[module_id].submods[submodule_id].p_submod;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Возвращает указатель на данные параметра подмодуля в разделяемой памяти
|
|
||||||
*
|
|
||||||
* @param module_id идентификатор модуля
|
|
||||||
* @param submodule_id идентификатор подмодуля
|
|
||||||
* @param param_index индекс параметра
|
|
||||||
* @return ProfinetData_Parameter*
|
|
||||||
*/
|
|
||||||
ProfinetData_Parameter * getSubmoduleParameter(uint32_t module_id, uint32_t submodule_id, uint32_t param_index)
|
|
||||||
{
|
|
||||||
return (*collected_data)[module_id].submods[submodule_id].params[param_index];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
struct ProfinetSharedDataSubmodule {
|
|
||||||
ProfinetData_Submodule* p_submod;
|
|
||||||
std::map<uint32_t, ProfinetData_Parameter*> params;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ProfinetSharedDataModule {
|
|
||||||
ProfinetData_Module* p_mod;
|
|
||||||
std::map<uint32_t, ProfinetSharedDataSubmodule> submods;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Собирает данные в словарь, можно использовать для удобства обращения к данным по идентификатору
|
|
||||||
*
|
|
||||||
* @param p_data_map
|
|
||||||
* @return std::shared_ptr<std::map<uint32_t, ProfinetSharedDataModule>>
|
|
||||||
*/
|
|
||||||
static std::shared_ptr<std::map<uint32_t, ProfinetSharedDataModule>> collect(ProfinetData_Map * p_data_map) {
|
|
||||||
std::shared_ptr<std::map<uint32_t, ProfinetSharedDataModule>> p_map(new std::map<uint32_t, ProfinetSharedDataModule>);
|
|
||||||
|
|
||||||
for (int i = 0; i < p_data_map->mods_nbr; ++i)
|
|
||||||
{
|
|
||||||
auto& mod = (*p_map)[p_data_map->p_mods[i].id];
|
|
||||||
|
|
||||||
mod.p_mod = &p_data_map->p_mods[i];
|
|
||||||
|
|
||||||
for (int j = 0; j < p_data_map->p_mods[i].submods_nbr; ++j)
|
|
||||||
{
|
|
||||||
auto& submod = mod.submods[p_data_map->p_mods[i].p_submods[j].id];
|
|
||||||
|
|
||||||
submod.p_submod = &p_data_map->p_mods[i].p_submods[j];
|
|
||||||
|
|
||||||
for (int k = 0; k < p_data_map->p_mods[i].p_submods[j].params_nbr; ++k)
|
|
||||||
{
|
|
||||||
submod.params[p_data_map->p_mods[i].p_submods[j].p_params[k].index] = &p_data_map->p_mods[i].p_submods[j].p_params[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return p_map;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
boost::interprocess::managed_shared_memory shmem_;
|
|
||||||
std::shared_ptr<std::map<uint32_t, ProfinetSharedDataModule>> collected_data; /// Упорядоченная структура указателей на разделяемую память
|
|
||||||
};
|
|
||||||
Loading…
Reference in New Issue
Block a user