From a227cd15c94a2df0a4251718b5af649be706e867 Mon Sep 17 00:00:00 2001 From: mrosanes Date: Thu, 28 Feb 2019 12:29:32 +0100 Subject: [PATCH 1/4] clear the event set, before macro commnads Clear the event set before running execution and before macro stop/abort. This is solving bugs found in Windows, where the spock prompt was returned before expected, as events arrived with the same timestamp, cause of poor time resolution of python on windows. --- src/sardana/taurus/core/tango/sardana/macroserver.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sardana/taurus/core/tango/sardana/macroserver.py b/src/sardana/taurus/core/tango/sardana/macroserver.py index 795cbc73a7..a24f37f106 100644 --- a/src/sardana/taurus/core/tango/sardana/macroserver.py +++ b/src/sardana/taurus/core/tango/sardana/macroserver.py @@ -458,6 +458,7 @@ def abort(self, synch=True): evt_wait.lock() try: time_stamp = time.time() + evt_wait.clearEventSet() self.command_inout("AbortMacro") evt_wait.waitEvent(self.Running, equal=False, after=time_stamp, timeout=self.InteractiveTimeout) @@ -474,6 +475,7 @@ def stop(self, synch=True): evt_wait.lock() try: time_stamp = time.time() + evt_wait.clearEventSet() self.command_inout("StopMacro") evt_wait.waitEvent(self.Running, equal=False, after=time_stamp, timeout=self.InteractiveTimeout) @@ -556,6 +558,7 @@ def _runMacro(self, xml, synch=False): try: evt_wait.waitEvent(self.Running, equal=False, timeout=timeout) ts = time.time() + evt_wait.clearEventSet() result = self.command_inout("RunMacro", [etree.tostring(xml)]) evt_wait.waitEvent(self.Running, after=ts, timeout=timeout) if synch: From bf671b415b25c4cd3389d69382f4249a87b975c5 Mon Sep 17 00:00:00 2001 From: mrosanes Date: Thu, 28 Feb 2019 14:37:41 +0100 Subject: [PATCH 2/4] Get the time_stamp just before the macro commands Get the time_stamp just before execution of macro commands used for run, stop and abort a macro. --- src/sardana/taurus/core/tango/sardana/macroserver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sardana/taurus/core/tango/sardana/macroserver.py b/src/sardana/taurus/core/tango/sardana/macroserver.py index a24f37f106..04381163bd 100644 --- a/src/sardana/taurus/core/tango/sardana/macroserver.py +++ b/src/sardana/taurus/core/tango/sardana/macroserver.py @@ -457,8 +457,8 @@ def abort(self, synch=True): evt_wait = AttributeEventWait(self.getAttribute("state")) evt_wait.lock() try: - time_stamp = time.time() evt_wait.clearEventSet() + time_stamp = time.time() self.command_inout("AbortMacro") evt_wait.waitEvent(self.Running, equal=False, after=time_stamp, timeout=self.InteractiveTimeout) @@ -474,8 +474,8 @@ def stop(self, synch=True): evt_wait = AttributeEventWait(self.getAttribute("state")) evt_wait.lock() try: - time_stamp = time.time() evt_wait.clearEventSet() + time_stamp = time.time() self.command_inout("StopMacro") evt_wait.waitEvent(self.Running, equal=False, after=time_stamp, timeout=self.InteractiveTimeout) @@ -557,8 +557,8 @@ def _runMacro(self, xml, synch=False): evt_wait.lock() try: evt_wait.waitEvent(self.Running, equal=False, timeout=timeout) - ts = time.time() evt_wait.clearEventSet() + ts = time.time() result = self.command_inout("RunMacro", [etree.tostring(xml)]) evt_wait.waitEvent(self.Running, after=ts, timeout=timeout) if synch: From 5f004c190d36ba8f80ddbe643b2bd99d346bff20 Mon Sep 17 00:00:00 2001 From: zreszela Date: Tue, 5 Mar 2019 13:14:43 +0100 Subject: [PATCH 3/4] Remove clear event set in case of Abort and Stop It is not clear how this would react in case a macro ends right after calling stop/abort but before clearing the event set. Just in case, to not break anything new it is better to wait with this change. --- src/sardana/taurus/core/tango/sardana/macroserver.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sardana/taurus/core/tango/sardana/macroserver.py b/src/sardana/taurus/core/tango/sardana/macroserver.py index 04381163bd..8a14d846f9 100644 --- a/src/sardana/taurus/core/tango/sardana/macroserver.py +++ b/src/sardana/taurus/core/tango/sardana/macroserver.py @@ -457,7 +457,6 @@ def abort(self, synch=True): evt_wait = AttributeEventWait(self.getAttribute("state")) evt_wait.lock() try: - evt_wait.clearEventSet() time_stamp = time.time() self.command_inout("AbortMacro") evt_wait.waitEvent(self.Running, equal=False, after=time_stamp, @@ -474,7 +473,6 @@ def stop(self, synch=True): evt_wait = AttributeEventWait(self.getAttribute("state")) evt_wait.lock() try: - evt_wait.clearEventSet() time_stamp = time.time() self.command_inout("StopMacro") evt_wait.waitEvent(self.Running, equal=False, after=time_stamp, From 0f8e57563b6b614b33e2ca095c6c6845fe7e7f4f Mon Sep 17 00:00:00 2001 From: zreszela Date: Tue, 5 Mar 2019 13:18:55 +0100 Subject: [PATCH 4/4] Add comment in the code --- src/sardana/taurus/core/tango/sardana/macroserver.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sardana/taurus/core/tango/sardana/macroserver.py b/src/sardana/taurus/core/tango/sardana/macroserver.py index 8a14d846f9..ae400c53a4 100644 --- a/src/sardana/taurus/core/tango/sardana/macroserver.py +++ b/src/sardana/taurus/core/tango/sardana/macroserver.py @@ -555,6 +555,10 @@ def _runMacro(self, xml, synch=False): evt_wait.lock() try: evt_wait.waitEvent(self.Running, equal=False, timeout=timeout) + # Clear event set to not confuse the value coming from the + # connection with the event of of end of the macro execution + # in the next wait event. This was observed on Windows where + # the time stamp resolution is not better than 1 ms. evt_wait.clearEventSet() ts = time.time() result = self.command_inout("RunMacro", [etree.tostring(xml)])