29 #include <SimoxUtility/algorithm/string/string_tools.h>
40 defineOptionalProperty<std::string>(
"Observers",
"",
"Comma seperated observer list");
41 defineOptionalProperty<int>(
42 "HistoryLength", 1000,
"Length of condition history kept by the conditionhandler");
50 const TermImplBasePtr& expression,
51 const EventBasePtr& e,
53 bool reportDatafields,
54 const DatafieldRefList& refs,
55 const Ice::Current&
c)
58 listener, expression, e,
"", onlyFireOnce, reportDatafields, refs,
c);
63 const TermImplBasePtr& expression,
64 const EventBasePtr& e,
65 const std::string& desc,
67 bool reportDatafields,
68 const DatafieldRefList& refs,
69 const Ice::Current&
c)
73 ARMARX_DEBUG <<
"Installing condition: " << root << std::endl;
74 root->addChild(expression);
82 literal->checkConfig.reportAlways = !onlyFireOnce;
83 literal->checkConfig.reportDatafieldValues = reportDatafields;
86 std::unique_lock lock(conditionRegistryMutex);
89 installChecks(literals,
c);
92 std::pair<int, ConditionRootBasePtr> entry;
93 entry.first = generateId();
96 conditionRegistry.insert(entry);
98 ConditionIdentifier id;
99 id.uniqueId = entry.first;
101 ARMARX_DEBUG <<
"Installed condition: " << root << std::endl;
109 ARMARX_DEBUG <<
"Removing condition " <<
id.uniqueId << std::endl;
111 std::unique_lock lock(conditionRegistryMutex);
112 ConditionRegistry::iterator iter = conditionRegistry.find(
id.uniqueId);
114 if (iter == conditionRegistry.end())
125 removeChecks(literals,
c);
128 std::pair<int, ConditionRootBasePtr> tmp = *iter;
129 conditionRegistry.erase(iter);
132 std::unique_lock lockHistory(conditionHistoryMutex);
133 conditionHistory.insert(tmp);
135 if (
int(conditionHistory.size()) > historyLength)
137 conditionHistory.erase(conditionHistory.begin());
146 ConditionRegistry::iterator iter;
147 std::vector<int> conditionIds;
150 std::unique_lock lock(conditionRegistryMutex);
152 if (!conditionRegistry.empty())
154 for (iter = conditionRegistry.begin(); iter != conditionRegistry.end(); iter++)
156 conditionIds.push_back(iter->first);
161 if (!conditionIds.empty())
163 for (
int id : conditionIds)
169 std::unique_lock lockHistory(conditionHistoryMutex);
170 conditionHistory.clear();
178 std::unique_lock lock(conditionRegistryMutex);
180 return conditionRegistry;
186 std::unique_lock lock(conditionHistoryMutex);
188 return conditionHistory;
195 std::unique_lock lock(conditionRegistryMutex);
196 auto it = conditionRegistry.find(
id);
198 if (it != conditionRegistry.end())
204 std::unique_lock lock(conditionHistoryMutex);
205 auto it = conditionHistory.find(
id);
207 if (it != conditionHistory.end())
218 return "ConditionHandler";
224 return observerNames;
236 std::string observers = getProperty<std::string>(
"Observers");
237 simox::alg::trim(observers);
239 if (!observers.empty())
244 useObservers(observerNames);
247 historyLength = getProperty<int>(
"HistoryLength").getValue();
257 preCacheObservers(observerNames);
267 ConditionHandler::generateId()
269 std::unique_lock lock(idMutex);
274 ConditionHandler::useObservers(std::vector<std::string>&
names)
276 std::unique_lock lock(iceManagerMutex);
278 std::vector<std::string>::iterator iter =
names.begin();
280 while (iter !=
names.end())
288 ConditionHandler::preCacheObservers(std::vector<std::string>&
names)
290 std::unique_lock lock(iceManagerMutex);
292 std::vector<std::string>::iterator iter =
names.begin();
294 while (iter !=
names.end())
296 getProxy<ObserverInterfacePrx>(*iter);
302 ConditionHandler::getObserver(std::string observerName)
304 std::unique_lock lock(iceManagerMutex);
305 ObserverInterfacePrx proxy;
309 proxy = getProxy<ObserverInterfacePrx>(observerName);
310 ObserverInterfacePrx::checkedCast(proxy);
314 throw InvalidConditionException(
"Observer \"" + observerName +
"\" does not exist.");
321 ConditionHandler::installChecks(std::vector<LiteralImplPtr>& literals,
const Ice::Current&
c)
323 std::vector<LiteralImplPtr>::iterator iter = literals.begin();
325 while (iter != literals.end())
327 ObserverInterfacePrx proxy =
328 getObserver((*iter)->checkConfig.dataFieldIdentifier->observerName);
329 (*iter)->installCheck(
c.adapter, proxy);
336 ConditionHandler::removeChecks(std::vector<LiteralImplPtr>& literals,
const Ice::Current&
c)
338 std::vector<LiteralImplPtr>::iterator iter = literals.begin();
340 while (iter != literals.end())
342 ObserverInterfacePrx proxy =
343 getObserver((*iter)->checkConfig.dataFieldIdentifier->observerName);
344 (*iter)->removeCheck(
c.adapter, proxy);