34 template class ::IceInternal::Handle<::armarx::ConditionCheck>;
38 ConditionCheck::ConditionCheck()
45 ConditionCheck::createInstance(
const CheckConfiguration& configuration,
50 ChannelRegistry::const_iterator iterChannels =
51 channelRegistry.find(dataFieldIdentifier->channelName);
53 if (iterChannels == channelRegistry.end())
55 throw InvalidConditionException(
"Invalid channel \"" +
56 dataFieldIdentifier->channelName +
"\" in check " +
57 configuration.checkName);
61 const DataFieldRegistry& dataFieldRegistry = iterChannels->second.dataFields;
62 DataFieldRegistry::const_iterator iterData =
63 dataFieldRegistry.find(dataFieldIdentifier->datafieldName);
65 if (iterData == dataFieldRegistry.end())
67 throw InvalidConditionException(
68 "Invalid datafield \"" + dataFieldIdentifier->channelName +
"." +
69 dataFieldIdentifier->datafieldName +
"\" in check " + configuration.checkName);
73 VariantPtr dataField = VariantPtr::dynamicCast(iterData->second.value);
74 assureTypeSupported(configuration, dataField->getType());
78 check->configuration = configuration;
84 ConditionCheck::reset()
92 ConditionCheck::evaluateCondition(
const DataFieldRegistry& dataFields)
113 auto iter = dataFields.find(configuration.dataFieldIdentifier->datafieldName);
114 if (iter != dataFields.end())
116 checkDataFields[iter->second.identifier->datafieldName] =
117 *VariantPtr::dynamicCast(iter->second.value);
119 if (checkDataFields.size() == 0)
125 bool oldFulFilled = fulFilled;
126 fulFilled = evaluate(checkDataFields);
129 if (configuration.reportAlways || oldFulFilled != fulFilled || firstEval ||
130 configuration.reportDatafieldValues)
132 if (oldFulFilled != fulFilled)
134 ARMARX_DEBUG_S <<
"Evaluating check: '" << configuration.checkName
135 <<
"' - status changed (" << oldFulFilled <<
" -> " << fulFilled
140 ARMARX_DEBUG_S <<
"First evaluating of check: '" << configuration.checkName
141 <<
"' is " << fulFilled;
145 ARMARX_DEBUG_S <<
"Unchanged value of check: '" << configuration.checkName
146 <<
"' is " << fulFilled;
151 if (configuration.reportDatafieldValues)
153 configuration.listener->setValueAndData(
154 fulFilled, configuration.dataFieldIdentifier, iter->second.value);
158 configuration.listener->setValue(fulFilled);
164 ConditionCheck::getFulFilled()
170 ConditionCheck::getParameter(
int index)
172 if (
index >= numberParameters)
174 throw LocalException(
"Illegal parameter requested\n");
177 VariantPtr var = VariantPtr::dynamicCast(configuration.checkParameters.at(
index));
183 var = dfr->getDataField();
190 ConditionCheck::assureTypeSupported(
const CheckConfiguration& configuration,
194 SupportedTypeList::iterator iter = supportedTypes.begin();
196 bool bValidType =
false;
198 while (iter != supportedTypes.end())
203 if (supportedType == 0)
208 else if (supportedType == dataFieldType)
210 if (configuration.checkParameters.size() != iter->parameterTypes.size())
212 throw InvalidConditionException(
213 "Wrong number of parameters for condition in check " +
214 configuration.checkName);
217 ParameterTypeList::iterator iter_param = iter->parameterTypes.begin();
218 bool bParameterValid =
true;
221 while (iter_param != iter->parameterTypes.end())
225 VariantTypeId paramType = configuration.checkParameters.at(p)->getType();
232 VariantPtr::dynamicCast(configuration.checkParameters.at(p));
235 if (!dfr->validate())
237 bParameterValid =
false;
242 paramType = dfr->getDataField()->getType();
245 if (*iter_param != paramType)
247 bParameterValid =
false;
267 throw InvalidConditionException(
"Invalid types for check " + configuration.checkName +
268 " Type: " + Variant::typeToString(dataFieldType));
273 ConditionCheck::setNumberParameters(
int numberParameters)
275 this->numberParameters = numberParameters;
279 ConditionCheck::addSupportedType(
VariantTypeId dataFieldType, ParameterTypeList parameterTypes)
282 type.dataFieldType = dataFieldType;
283 type.parameterTypes = parameterTypes;
285 supportedTypes.push_back(type);
289 ConditionCheck::createParameterTypeList(
int numberTypes, ...)
292 va_start(ap, numberTypes);
294 ParameterTypeList params;
296 for (
int p = 0; p < numberTypes; p++)