39 adapter = std::make_shared<ua_uaadapter>(std::move(configFile));
40 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Start the mapping of %s", configFile.c_str());
41 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Create the adapter");
44 vector<string> mappedPvSources = adapter->getAllMappedPvSourceNames();
45 if(mappedPvSources.size() > 0) {
47 for(
const auto& f : mappedPvSources) {
48 ss <<
"\n\t\t - " << f;
50 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
51 "Mapped %zu process variables. To list them use logging level debug.", mappedPvSources.size());
53 this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"List of mapped process variables: %s", ss.str().c_str());
56 vector<ProcessVariable::SharedPtr> allProcessVariables = this->csManager->getAllProcessVariables();
59 bool skip_var =
false;
60 for(
const ProcessVariable::SharedPtr& oneProcessVariable : allProcessVariables) {
61 std::type_info
const& valueType = oneProcessVariable->getValueType();
62 if(valueType ==
typeid(Void)) {
64 UA_LOG_DEBUG(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Skip Variable: Variable: %s has a void type",
65 oneProcessVariable->getName().c_str());
68 for(
auto e : this->adapter->exclude) {
69 string suffix_1 =
"/*", suffix_2 =
"*";
70 if(e.rfind(suffix_1) == e.size() - suffix_1.size()) {
71 if(oneProcessVariable->getName().rfind(e.substr(0, e.size() - 1)) == 0) {
73 for(
const auto& ele : mappedPvSources) {
74 if(ele == oneProcessVariable->getName().substr(1, oneProcessVariable->getName().size() - 1)) {
75 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
76 "Skip exclude node - Used in pv-mapping (directory match) PV: %s",
77 oneProcessVariable->getName().c_str());
83 for(
auto folder : this->adapter->folder_with_history) {
84 if(oneProcessVariable->getName().substr(0, folder.size()) == folder) {
85 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
86 "Skip exclude node - Used in folder history setting: %s", oneProcessVariable->getName().c_str());
93 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Directory var exclude (/*) from mapping %s",
94 oneProcessVariable->getName().c_str());
99 else if(e.rfind(suffix_2) == e.size() - suffix_2.size()) {
100 if(oneProcessVariable->getName().rfind(e.substr(0, e.size() - 1), 0) == 0) {
101 bool pv_used =
false;
102 for(
const auto& ele : mappedPvSources) {
103 if(ele == oneProcessVariable->getName().substr(1, oneProcessVariable->getName().size() - 1)) {
104 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
105 "Skip exclude node - Used in pv-mapping (greedy match) PV: %s",
106 oneProcessVariable->getName().c_str());
111 for(
auto folder : this->adapter->folder_with_history) {
112 if(oneProcessVariable->getName().substr(1, folder.size() - 1) == folder) {
113 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
114 "Skip exclude node - Used in folder history setting: %s", oneProcessVariable->getName().c_str());
120 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Greedy var exclude (*) from mapping %s",
121 oneProcessVariable->getName().c_str());
126 else if(oneProcessVariable->getName() == e) {
128 if(std::find(mappedPvSources.begin(), mappedPvSources.end(), e.substr(1, e.size() - 1)) !=
129 mappedPvSources.end()) {
130 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
131 "Skip exclude node - Used in pv-mapping (direct match) PV: %s", oneProcessVariable->getName().c_str());
134 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Direct exclude var (direct match) from mapping %s",
135 oneProcessVariable->getName().c_str());
138 for(
auto folder : this->adapter->folder_with_history) {
139 if(oneProcessVariable->getName().substr(1, folder.size() - 1) == folder) {
140 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
141 "Skip exclude node - Used in folder history setting: %s", oneProcessVariable->getName().c_str());
149 adapter->implicitVarMapping(oneProcessVariable->getName(), this->csManager);
153 this->unusedVariables.insert(oneProcessVariable->getName());
158 adapter->applyMapping(this->csManager);
159 vector<string> allNotMappedVariables = adapter->getAllNotMappableVariablesNames();
160 if(!allNotMappedVariables.empty()) {
161 std::stringstream ss;
162 for(
const string& var : allNotMappedVariables) {
163 ss <<
"\t" << var << endl;
165 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
166 "The following VariableNodes cant be mapped, because they are not member in PV-Manager: \n%s",
184 if(!this->adapter_thread.joinable()) {
189 vector<ProcessVariable::SharedPtr> allProcessVariables = csManager->getAllProcessVariables();
190 for(
const ProcessVariable::SharedPtr& oneProcessVariable : allProcessVariables) {
191 std::type_info
const& valueType = oneProcessVariable->getValueType();
192 if(valueType ==
typeid(Void)) {
194 if(!oneProcessVariable->isWriteable()) {
195 data->
pvs.insert(data->
pvs.end(), oneProcessVariable->getName());
196 UA_LOG_INFO(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
"Adding variable %s to void thread.",
197 oneProcessVariable->getName().c_str());
200 UA_LOG_WARNING(this->
getLogger(), UA_LOGCATEGORY_USERLAND,
201 "Ignoring Void input %s. Void inputs are not yet supported.", oneProcessVariable->getName().c_str());
205 if(!data->
pvs.empty()) {
207 auto conf = adapter->get_server_config();
213 this->observer_thread.detach();