Commit f1676b2a authored by Olivier R-D's avatar Olivier R-D

server: add modify_monitored_items, div fixes

parent 7209b85d
...@@ -160,6 +160,9 @@ class InternalSession(object): ...@@ -160,6 +160,9 @@ class InternalSession(object):
def create_monitored_items(self, params): def create_monitored_items(self, params):
return self.submgr.create_monitored_items(params) return self.submgr.create_monitored_items(params)
def modify_monitored_items(self, params):
return self.submgr.modify_monitored_items(params)
def delete_subscriptions(self, ids): def delete_subscriptions(self, ids):
for i in ids: for i in ids:
if i in self.subscriptions: if i in self.subscriptions:
......
...@@ -104,7 +104,19 @@ class SubscriptionManager(Thread): ...@@ -104,7 +104,19 @@ class SubscriptionManager(Thread):
response.StatusCode = ua.StatusCode(ua.StatusCodes.BadSubscriptionIdInvalid) response.StatusCode = ua.StatusCode(ua.StatusCodes.BadSubscriptionIdInvalid)
res.append(response) res.append(response)
return res return res
return self.subscriptions[params.SubscriptionId].create_monitored_items(params) return self.subscriptions[params.SubscriptionId].create_monitored_items(params)
def modify_monitored_items(self, params):
self.logger.info("modify monitored items")
with self._lock:
if not params.SubscriptionId in self.subscriptions:
res = []
for _ in params.ItemsToModify:
result = ua.MonitoredItemModifyResult()
result.StatusCode = ua.StatusCode(ua.StatusCodes.BadSubscriptionIdInvalid)
res.append(result)
return res
return self.subscriptions[params.SubscriptionId].modify_monitored_items(params)
def delete_monitored_items(self, params): def delete_monitored_items(self, params):
self.logger.info("delete monitored items") self.logger.info("delete monitored items")
...@@ -114,7 +126,7 @@ class SubscriptionManager(Thread): ...@@ -114,7 +126,7 @@ class SubscriptionManager(Thread):
for _ in params.MonitoredItemIds: for _ in params.MonitoredItemIds:
res.append(ua.StatusCode(ua.StatusCodes.BadSubscriptionIdInvalid)) res.append(ua.StatusCode(ua.StatusCodes.BadSubscriptionIdInvalid))
return res return res
return self.subscriptions[params.SubscriptionId].delete_monitored_items(params) return self.subscriptions[params.SubscriptionId].delete_monitored_items(params.MonitoredItemIds)
...@@ -174,10 +186,7 @@ class InternalSubscription(object): ...@@ -174,10 +186,7 @@ class InternalSubscription(object):
except Exception as ex: #we catch everythin since it seems exceptions are lost in loop except Exception as ex: #we catch everythin since it seems exceptions are lost in loop
print("Exception in {} code:".format(self)) print("Exception in {} code:".format(self))
print('-'*60) print('-'*60)
try: traceback.print_exc(file=sys.stderr)
traceback.print_exc(file=sys.stderr)
except Exception as ex:
print("RRRRR", ex)
print('-'*60) print('-'*60)
#self.logger.warn("Exception in %s loop: %s", self, ex) #self.logger.warn("Exception in %s loop: %s", self, ex)
yield from asyncio.sleep(1) yield from asyncio.sleep(1)
...@@ -228,11 +237,33 @@ class InternalSubscription(object): ...@@ -228,11 +237,33 @@ class InternalSubscription(object):
results.append(self._create_monitored_item(item)) results.append(self._create_monitored_item(item))
return results return results
def modify_monitored_items(self, params):
results = []
for item in params.ItemsToModify:
results.append(self._modify_monitored_item(item))
return results
def trigger_datachange(self, handle, nodeid, attr): def trigger_datachange(self, handle, nodeid, attr):
self.logger.debug("triggering datachange for handle %s, nodeid %s, and attribute %s", handle, nodeid, attr) self.logger.debug("triggering datachange for handle %s, nodeid %s, and attribute %s", handle, nodeid, attr)
variant = self.aspace.get_attribute_value(nodeid, attr) variant = self.aspace.get_attribute_value(nodeid, attr)
self.datachange_callback(handle, variant) self.datachange_callback(handle, variant)
def _modify_monitored_item(self, params):
with self._lock:
for _, mdata in self._monitored_datachange.items():
result = ua.MonitoredItemCreateResult()
if mdata.monitored_item_id == params.MonitoredItemId:
result.RevisedSamplingInterval = self.data.RevisedPublishingInterval
result.RevisedQueueSize = params.RequestedParameters.QueueSize #FIXME check and use value
result.FilterResult = params.RequestedParameters.Filter
mdata.parameters = result
return result
#FIXME modify event subscriptions
result = ua.MonitoredItemCreateResult()
result.StatusCode(ua.StatusCodes.BadMonitoredItemIdInvalid)
return result
def _create_monitored_item(self, params): def _create_monitored_item(self, params):
with self._lock: with self._lock:
result = ua.MonitoredItemCreateResult() result = ua.MonitoredItemCreateResult()
......
...@@ -149,13 +149,17 @@ class UAProcessor(object): ...@@ -149,13 +149,17 @@ class UAProcessor(object):
params = ua.ActivateSessionParameters.from_binary(body) params = ua.ActivateSessionParameters.from_binary(body)
if not self.session: if not self.session:
result = ua.StatusCode(ua.StatusCodes.BadSessionIdInvalid) #result = ua.ActivateSessionResult()
#result.Results.append(ua.StatusCode(ua.StatusCodes.BadSessionIdInvalid))
response = ua.ServiceFault()
response.ResponseHeader.ServiceResult = ua.StatusCode(ua.StatusCodes.BadSessionIdInvalid)
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
else: else:
result = self.session.activate_session(params) result = self.session.activate_session(params)
response = ua.ActivateSessionResponse() response = ua.ActivateSessionResponse()
response.Parameters = result response.Parameters = result
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response) self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
elif typeid == ua.NodeId(ua.ObjectIds.ReadRequest_Encoding_DefaultBinary): elif typeid == ua.NodeId(ua.ObjectIds.ReadRequest_Encoding_DefaultBinary):
self.logger.info("Read request") self.logger.info("Read request")
...@@ -244,8 +248,7 @@ class UAProcessor(object): ...@@ -244,8 +248,7 @@ class UAProcessor(object):
elif typeid == ua.NodeId(ua.ObjectIds.CreateMonitoredItemsRequest_Encoding_DefaultBinary): elif typeid == ua.NodeId(ua.ObjectIds.CreateMonitoredItemsRequest_Encoding_DefaultBinary):
self.logger.info("create monitored items request") self.logger.info("create monitored items request")
params = ua.CreateMonitoredItemsParameters.from_binary(body) params = ua.CreateMonitoredItemsParameters.from_binary(body)
results = self.session.create_monitored_items(params) results = self.session.create_monitored_items(params)
response = ua.CreateMonitoredItemsResponse() response = ua.CreateMonitoredItemsResponse()
...@@ -253,6 +256,18 @@ class UAProcessor(object): ...@@ -253,6 +256,18 @@ class UAProcessor(object):
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response) self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
elif typeid == ua.NodeId(ua.ObjectIds.ModifyMonitoredItemsRequest_Encoding_DefaultBinary):
self.logger.info("modify monitored items request")
params = ua.ModifyMonitoredItemsParameters.from_binary(body)
results = self.session.modify_monitored_items(params)
response = ua.ModifyMonitoredItemsResponse()
response.Results = results
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
elif typeid == ua.NodeId(ua.ObjectIds.DeleteMonitoredItemsRequest_Encoding_DefaultBinary): elif typeid == ua.NodeId(ua.ObjectIds.DeleteMonitoredItemsRequest_Encoding_DefaultBinary):
self.logger.info("delete monitored items request") self.logger.info("delete monitored items request")
params = ua.DeleteMonitoredItemsParameters.from_binary(body) params = ua.DeleteMonitoredItemsParameters.from_binary(body)
...@@ -266,6 +281,9 @@ class UAProcessor(object): ...@@ -266,6 +281,9 @@ class UAProcessor(object):
elif typeid == ua.NodeId(ua.ObjectIds.PublishRequest_Encoding_DefaultBinary): elif typeid == ua.NodeId(ua.ObjectIds.PublishRequest_Encoding_DefaultBinary):
self.logger.info("publish request") self.logger.info("publish request")
if not self.session:
return
acks = ua.unpack_array("Int32", body) acks = ua.unpack_array("Int32", body)
......
...@@ -7306,14 +7306,12 @@ class MonitoredItemModifyRequest(FrozenClass): ...@@ -7306,14 +7306,12 @@ class MonitoredItemModifyRequest(FrozenClass):
''' '''
''' '''
def __init__(self): def __init__(self):
self.TypeId = FourByteNodeId(ObjectIds.MonitoredItemModifyRequest_Encoding_DefaultBinary)
self.MonitoredItemId = 0 self.MonitoredItemId = 0
self.RequestedParameters = MonitoringParameters() self.RequestedParameters = MonitoringParameters()
self._freeze() self._freeze()
def to_binary(self): def to_binary(self):
packet = [] packet = []
packet.append(self.TypeId.to_binary())
packet.append(pack_uatype('UInt32', self.MonitoredItemId)) packet.append(pack_uatype('UInt32', self.MonitoredItemId))
packet.append(self.RequestedParameters.to_binary()) packet.append(self.RequestedParameters.to_binary())
return b''.join(packet) return b''.join(packet)
...@@ -7321,14 +7319,12 @@ class MonitoredItemModifyRequest(FrozenClass): ...@@ -7321,14 +7319,12 @@ class MonitoredItemModifyRequest(FrozenClass):
@staticmethod @staticmethod
def from_binary(data): def from_binary(data):
obj = MonitoredItemModifyRequest() obj = MonitoredItemModifyRequest()
obj.TypeId = NodeId.from_binary(data)
obj.MonitoredItemId = unpack_uatype('UInt32', data) obj.MonitoredItemId = unpack_uatype('UInt32', data)
obj.RequestedParameters = MonitoringParameters.from_binary(data) obj.RequestedParameters = MonitoringParameters.from_binary(data)
return obj return obj
def __str__(self): def __str__(self):
return 'MonitoredItemModifyRequest(' + 'TypeId:' + str(self.TypeId) + ', ' + \ return 'MonitoredItemModifyRequest(' + 'MonitoredItemId:' + str(self.MonitoredItemId) + ', ' + \
'MonitoredItemId:' + str(self.MonitoredItemId) + ', ' + \
'RequestedParameters:' + str(self.RequestedParameters) + ')' 'RequestedParameters:' + str(self.RequestedParameters) + ')'
__repr__ = __str__ __repr__ = __str__
...@@ -7435,16 +7431,20 @@ class ModifyMonitoredItemsRequest(FrozenClass): ...@@ -7435,16 +7431,20 @@ class ModifyMonitoredItemsRequest(FrozenClass):
__repr__ = __str__ __repr__ = __str__
class ModifyMonitoredItemsResult(FrozenClass): class ModifyMonitoredItemsResponse(FrozenClass):
''' '''
''' '''
def __init__(self): def __init__(self):
self.TypeId = FourByteNodeId(ObjectIds.ModifyMonitoredItemsResponse_Encoding_DefaultBinary)
self.ResponseHeader = ResponseHeader()
self.Results = [] self.Results = []
self.DiagnosticInfos = [] self.DiagnosticInfos = []
self._freeze() self._freeze()
def to_binary(self): def to_binary(self):
packet = [] packet = []
packet.append(self.TypeId.to_binary())
packet.append(self.ResponseHeader.to_binary())
packet.append(struct.pack('<i', len(self.Results))) packet.append(struct.pack('<i', len(self.Results)))
for fieldname in self.Results: for fieldname in self.Results:
packet.append(fieldname.to_binary()) packet.append(fieldname.to_binary())
...@@ -7455,7 +7455,9 @@ class ModifyMonitoredItemsResult(FrozenClass): ...@@ -7455,7 +7455,9 @@ class ModifyMonitoredItemsResult(FrozenClass):
@staticmethod @staticmethod
def from_binary(data): def from_binary(data):
obj = ModifyMonitoredItemsResult() obj = ModifyMonitoredItemsResponse()
obj.TypeId = NodeId.from_binary(data)
obj.ResponseHeader = ResponseHeader.from_binary(data)
length = struct.unpack('<i', data.read(4))[0] length = struct.unpack('<i', data.read(4))[0]
if length != -1: if length != -1:
for _ in range(0, length): for _ in range(0, length):
...@@ -7466,40 +7468,11 @@ class ModifyMonitoredItemsResult(FrozenClass): ...@@ -7466,40 +7468,11 @@ class ModifyMonitoredItemsResult(FrozenClass):
obj.DiagnosticInfos.append(DiagnosticInfo.from_binary(data)) obj.DiagnosticInfos.append(DiagnosticInfo.from_binary(data))
return obj return obj
def __str__(self):
return 'ModifyMonitoredItemsResult(' + 'Results:' + str(self.Results) + ', ' + \
'DiagnosticInfos:' + str(self.DiagnosticInfos) + ')'
__repr__ = __str__
class ModifyMonitoredItemsResponse(FrozenClass):
'''
'''
def __init__(self):
self.TypeId = FourByteNodeId(ObjectIds.ModifyMonitoredItemsResponse_Encoding_DefaultBinary)
self.ResponseHeader = ResponseHeader()
self.Parameters = ModifyMonitoredItemsResult()
self._freeze()
def to_binary(self):
packet = []
packet.append(self.TypeId.to_binary())
packet.append(self.ResponseHeader.to_binary())
packet.append(self.Parameters.to_binary())
return b''.join(packet)
@staticmethod
def from_binary(data):
obj = ModifyMonitoredItemsResponse()
obj.TypeId = NodeId.from_binary(data)
obj.ResponseHeader = ResponseHeader.from_binary(data)
obj.Parameters = ModifyMonitoredItemsResult.from_binary(data)
return obj
def __str__(self): def __str__(self):
return 'ModifyMonitoredItemsResponse(' + 'TypeId:' + str(self.TypeId) + ', ' + \ return 'ModifyMonitoredItemsResponse(' + 'TypeId:' + str(self.TypeId) + ', ' + \
'ResponseHeader:' + str(self.ResponseHeader) + ', ' + \ 'ResponseHeader:' + str(self.ResponseHeader) + ', ' + \
'Parameters:' + str(self.Parameters) + ')' 'Results:' + str(self.Results) + ', ' + \
'DiagnosticInfos:' + str(self.DiagnosticInfos) + ')'
__repr__ = __str__ __repr__ = __str__
......
...@@ -14,7 +14,9 @@ IgnoredEnums = []#["IdType", "NodeIdType"] ...@@ -14,7 +14,9 @@ IgnoredEnums = []#["IdType", "NodeIdType"]
#we want to implement som struct by hand, to make better interface or simply because they are too complicated #we want to implement som struct by hand, to make better interface or simply because they are too complicated
IgnoredStructs = []#["NodeId", "ExpandedNodeId", "Variant", "QualifiedName", "DataValue", "LocalizedText"]#, "ExtensionObject"] IgnoredStructs = []#["NodeId", "ExpandedNodeId", "Variant", "QualifiedName", "DataValue", "LocalizedText"]#, "ExtensionObject"]
#by default we split requests and respons in header and parameters, but some are so simple we do not split them #by default we split requests and respons in header and parameters, but some are so simple we do not split them
NoSplitStruct = ["GetEndpointsResponse", "CloseSessionRequest", "AddNodesResponse", "BrowseResponse", "HistoryReadResponse", "HistoryUpdateResponse", "RegisterServerResponse", "CloseSecureChannelRequest", "CloseSecureChannelResponse", "CloseSessionRequest", "CloseSessionResponse", "UnregisterNodesResponse", "MonitoredItemModifyRequest", "MonitoredItemsCreateRequest", "ReadResponse", "WriteResponse", "TranslateBrowsePathsToNodeIdsResponse", "DeleteSubscriptionsResponse", "DeleteMonitoredItemsResponse", "PublishRequest", "CreateMonitoredItemsResponse", "ServiceFault", "AddReferencesRequest", "AddReferencesResponse"] NoSplitStruct = ["GetEndpointsResponse", "CloseSessionRequest", "AddNodesResponse", "BrowseResponse", "HistoryReadResponse", "HistoryUpdateResponse", "RegisterServerResponse", "CloseSecureChannelRequest", "CloseSecureChannelResponse", "CloseSessionRequest", "CloseSessionResponse", "UnregisterNodesResponse", "MonitoredItemModifyRequest", "MonitoredItemsCreateRequest", "ReadResponse", "WriteResponse", "TranslateBrowsePathsToNodeIdsResponse", "DeleteSubscriptionsResponse", "DeleteMonitoredItemsResponse", "PublishRequest", "CreateMonitoredItemsResponse", "ServiceFault", "AddReferencesRequest", "AddReferencesResponse", "ModifyMonitoredItemsResponse"]
#structs that end with Request or Response but are not
NotRequest = ["MonitoredItemCreateRequest", "MonitoredItemModifyRequest"]
OverrideTypes = {}#AttributeId": "AttributeID", "ResultMask": "BrowseResultMask", "NodeClassMask": "NodeClass", "AccessLevel": "VariableAccessLevel", "UserAccessLevel": "VariableAccessLevel", "NotificationData": "NotificationData"} OverrideTypes = {}#AttributeId": "AttributeID", "ResultMask": "BrowseResultMask", "NodeClassMask": "NodeClass", "AccessLevel": "VariableAccessLevel", "UserAccessLevel": "VariableAccessLevel", "NotificationData": "NotificationData"}
OverrideNames = {}#{"RequestHeader": "Header", "ResponseHeader": "Header", "StatusCode": "Status", "NodesToRead": "AttributesToRead"} # "MonitoringMode": "Mode",, "NotificationMessage": "Notification", "NodeIdType": "Type"} OverrideNames = {}#{"RequestHeader": "Header", "ResponseHeader": "Header", "StatusCode": "Status", "NodesToRead": "AttributesToRead"} # "MonitoringMode": "Mode",, "NotificationMessage": "Notification", "NodeIdType": "Type"}
...@@ -276,7 +278,7 @@ def split_requests(model): ...@@ -276,7 +278,7 @@ def split_requests(model):
structs = [] structs = []
for struct in model.structs: for struct in model.structs:
structtype = None structtype = None
if struct.name.endswith("Request") and not struct.name in ("MonitoredItemCreateRequest"): if struct.name.endswith("Request") and not struct.name in NotRequest:
structtype = "Request" structtype = "Request"
elif struct.name.endswith("Response") or struct.name == "ServiceFault": elif struct.name.endswith("Response") or struct.name == "ServiceFault":
structtype = "Response" structtype = "Response"
......
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