Commit a61443ac authored by olivier R-D's avatar olivier R-D

split create_monitored_item method as an attemp tp simplify it...

parent 5ef58768
...@@ -42,7 +42,12 @@ class MonitoredItemService(object): ...@@ -42,7 +42,12 @@ class MonitoredItemService(object):
def create_monitored_items(self, params): def create_monitored_items(self, params):
results = [] results = []
for item in params.ItemsToCreate: for item in params.ItemsToCreate:
results.append(self._create_monitored_item(item)) with self._lock:
if item.ItemToMonitor.AttributeId == ua.AttributeIds.EventNotifier:
result = self._create_events_monitored_item(item)
else:
result = self._create_data_change_monitored_item(item)
results.append(result)
return results return results
def modify_monitored_items(self, params): def modify_monitored_items(self, params):
...@@ -71,8 +76,12 @@ class MonitoredItemService(object): ...@@ -71,8 +76,12 @@ class MonitoredItemService(object):
result.StatusCode(ua.StatusCodes.BadMonitoredItemIdInvalid) result.StatusCode(ua.StatusCodes.BadMonitoredItemIdInvalid)
return result return result
def _create_monitored_item(self, params): def _commit_monitored_item(self, result, mdata):
with self._lock: if result.StatusCode.is_good():
self._monitored_items[result.MonitoredItemId] = mdata
self._monitored_item_counter += 1
def _make_monitored_item_common(self, params):
result = ua.MonitoredItemCreateResult() result = ua.MonitoredItemCreateResult()
result.RevisedSamplingInterval = self.isub.data.RevisedPublishingInterval result.RevisedSamplingInterval = self.isub.data.RevisedPublishingInterval
result.RevisedQueueSize = params.RequestedParameters.QueueSize result.RevisedQueueSize = params.RequestedParameters.QueueSize
...@@ -87,36 +96,37 @@ class MonitoredItemService(object): ...@@ -87,36 +96,37 @@ class MonitoredItemService(object):
mdata.mfilter = params.RequestedParameters.Filter mdata.mfilter = params.RequestedParameters.Filter
mdata.monitored_item_id = result.MonitoredItemId mdata.monitored_item_id = result.MonitoredItemId
self._monitored_items[result.MonitoredItemId] = mdata return result, mdata
if params.ItemToMonitor.AttributeId == ua.AttributeIds.EventNotifier: def _create_events_monitored_item(self, params):
self.logger.info("request to subscribe to events for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) self.logger.info("request to subscribe to events for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId)
result, mdata = self._make_monitored_item_common(params)
ev_notify_byte = self.aspace.get_attribute_value(params.ItemToMonitor.NodeId, ua.AttributeIds.EventNotifier).Value.Value ev_notify_byte = self.aspace.get_attribute_value(params.ItemToMonitor.NodeId, ua.AttributeIds.EventNotifier).Value.Value
if ev_notify_byte is not None: if ev_notify_byte is None or ev_notify_byte & 1 == 0:
if ev_notify_byte & 1 == 0:
result.StatusCode = ua.StatusCode(ua.StatusCodes.BadServiceUnsupported)
else:
result.StatusCode = ua.StatusCode(ua.StatusCodes.BadServiceUnsupported) result.StatusCode = ua.StatusCode(ua.StatusCodes.BadServiceUnsupported)
return result
result.FilterResult = ua.EventFilterResult() result.FilterResult = ua.EventFilterResult()
for _ in params.RequestedParameters.Filter.SelectClauses: for _ in params.RequestedParameters.Filter.SelectClauses:
result.FilterResult.SelectClauseResults.append(ua.StatusCode()) result.FilterResult.SelectClauseResults.append(ua.StatusCode())
# FIXME: where clause result # FIXME: where clause result
self._commit_monitored_item(result, mdata)
self._monitored_events[params.ItemToMonitor.NodeId] = result.MonitoredItemId self._monitored_events[params.ItemToMonitor.NodeId] = result.MonitoredItemId
else: return result
def _create_data_change_monitored_item(self, params):
self.logger.info("request to subscribe to datachange for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) self.logger.info("request to subscribe to datachange for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId)
result, mdata = self._make_monitored_item_common(params)
result.FilterResult = params.RequestedParameters.Filter result.FilterResult = params.RequestedParameters.Filter
result.StatusCode, handle = self.aspace.add_datachange_callback(params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId, self.datachange_callback) result.StatusCode, handle = self.aspace.add_datachange_callback(params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId, self.datachange_callback)
self.logger.debug("adding callback return status %s and handle %s", result.StatusCode, handle) self.logger.debug("adding callback return status %s and handle %s", result.StatusCode, handle)
mdata.callback_handle = handle mdata.callback_handle = handle
self._monitored_datachange[handle] = result.MonitoredItemId self._commit_monitored_item(result, mdata)
if result.StatusCode.is_good(): if result.StatusCode.is_good():
self._monitored_datachange[handle] = result.MonitoredItemId
# force data change event generation # force data change event generation
self.trigger_datachange(handle, params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) self.trigger_datachange(handle, params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId)
if not result.StatusCode.is_good():
del(self._monitored_items[result.MonitoredItemId])
self._monitored_item_counter -= 1
return result return result
def delete_monitored_items(self, ids): def delete_monitored_items(self, ids):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment