aboutsummaryrefslogtreecommitdiff
path: root/MotionControl
diff options
context:
space:
mode:
authorWolfgang Draxinger (root@gar-ex-erdastep) <Wolfgang.Draxinger@physik.uni-muenchen.de>2011-12-09 22:29:15 +0100
committerWolfgang Draxinger (root@gar-ex-erdastep) <Wolfgang.Draxinger@physik.uni-muenchen.de>2011-12-09 22:29:15 +0100
commit1fd3f21436a53375a59035486cf3d2e1a6035bbb (patch)
tree598acab8cfb2883571f875c29abc0bc197433d92 /MotionControl
parent4b19fc744937e53c8689733f25dedf80fa8fd396 (diff)
downloadPyMotionControl-1fd3f21436a53375a59035486cf3d2e1a6035bbb.tar.gz
PyMotionControl-1fd3f21436a53375a59035486cf3d2e1a6035bbb.tar.bz2
rpyc too laggy
Diffstat (limited to 'MotionControl')
-rw-r--r--MotionControl/Axis.py8
-rw-r--r--MotionControl/MotionStage.py36
-rw-r--r--MotionControl/PhytronAxis.py9
-rw-r--r--MotionControl/Service.py31
4 files changed, 67 insertions, 17 deletions
diff --git a/MotionControl/Axis.py b/MotionControl/Axis.py
index 4d669c5..d137d54 100644
--- a/MotionControl/Axis.py
+++ b/MotionControl/Axis.py
@@ -1,8 +1,9 @@
# -*- coding: utf8 -*-
class Axis(object):
- def __init__(self, inverted = False, scale={}):
+ def __init__(self, limits=None, inverted = False, scale={}):
from blinker import Signal
+ self.limits = limits
self.inverted = inverted
self.scale = scale
self.position = None
@@ -71,6 +72,11 @@ class Axis(object):
raise NotImplementedError()
def goto_absolute(self, target, speed = None):
+ if self.limits and (target < min(self.limits) or target > max(self.limits)):
+ raise ValueError()
+ self.do_goto_absolute(target, speed)
+
+ def do_goto_absolute(self, target, speed):
raise NotImplementedError()
def goto_relative(self, offset, speed = None):
diff --git a/MotionControl/MotionStage.py b/MotionControl/MotionStage.py
index 2e3583f..90f811a 100644
--- a/MotionControl/MotionStage.py
+++ b/MotionControl/MotionStage.py
@@ -20,10 +20,10 @@ class MotionStage(object):
self.onCycleAborted = Signal()
self.onDestinationChanged = Signal()
- self.onPositionChanged = Signal()
+ self.onPositionChanged = Signal()
for axis in self.axes:
- axis.onPosition.connect(self.forward_onPosition)
+ axis.onPosition.connect(self.onPosition_repeat)
self.worker_thread = None
self.active = False
@@ -48,15 +48,13 @@ class MotionStage(object):
def position(self):
return tuple([axis.position for axis in self.axes])
- def forward_onPosition(self, sender, position):
+ def onPosition_repeat(self, sender, position):
self.onPositionChanged.send(self, axis=self.axes_idx[sender], position=position)
def update(self):
old_position = self.position
for axis in self.axes:
axis.update()
- if old_position != self.position:
- self.onPositionChanged.send(self, position = self.position)
def set_destination(self, destination):
current_position = self.position
@@ -89,22 +87,23 @@ class MotionStage(object):
self.cycle_add_action(GotoAbsolute(self.axes, self.destination, speed))
def can_cycle_start(self):
- if self.active:
- return False
return True # FIXME: Add constraint tests here
def cycle_start(self):
import threading, weakref
- if not self.can_cycle_start():
+ if self.active:
return False
+# if not self.can_cycle_start():
+# return False
+
self.current_action = None
self.active = True
- self.worker_thread = threading.Thread(target = MotionStage.cycle_worker, name = "MotionControl.worker", args=(weakref.proxy(self),))
- self.worker_thread.daemon =True
+ self.worker_thread = threading.Thread(target = MotionStage.cycleWorker, name = "MotionControl.cycleWorker", args=(weakref.proxy(self),))
+ self.worker_thread.daemon = True
self.worker_thread.start()
- self.onCycleStarted.send()
+ self.onCycleStarted.send(self)
def abort(self):
import threading
@@ -112,7 +111,7 @@ class MotionStage(object):
if isinstance(self.worker_thread, threading.Thread):
self.worker_thread.join()
- def cycle_worker(ref):
+ def cycleWorker(ref):
abort_action = ref.abort_action
try:
import time
@@ -136,10 +135,10 @@ class MotionStage(object):
ref.action_queue.task_done()
- ref.onCycleFinished.send()
+ ref.onCycleFinished.send(ref)
except CycleAbort:
ref.abort_action.execute()
- ref.onCycleAborted.send()
+ ref.onCycleAborted.send(ref)
finally:
try:
@@ -149,3 +148,12 @@ class MotionStage(object):
except:
pass
ref.active = False
+
+ def reference(self):
+ from Action import Initiate, GotoAbsolute
+ self.destination = None
+ self.cycle_clear()
+ self.cycle_add_action(Initiate([self.axes[0]]))
+ self.cycle_add_action(GotoAbsolute([self.axes[0]], [0]))
+ self.cycle_start()
+
diff --git a/MotionControl/PhytronAxis.py b/MotionControl/PhytronAxis.py
index 80e1c47..986dad7 100644
--- a/MotionControl/PhytronAxis.py
+++ b/MotionControl/PhytronAxis.py
@@ -5,8 +5,8 @@ from Axis import Axis
class PhytronAxis(Axis):
INITIATOR_MINUS = 1
INITIATOR_PLUS = 2
- def __init__(self, ipcomm_axis, max_run_freq=None, initiator=INITIATOR_MINUS, initiator_position = 0, inverted = False, scale={}):
- super(PhytronAxis, self).__init__(inverted = inverted, scale = scale)
+ def __init__(self, ipcomm_axis, limits=None, max_run_freq=None, initiator=INITIATOR_MINUS, initiator_position = 0, inverted = False, limited = True, scale={}):
+ super(PhytronAxis, self).__init__(limits = limits, inverted = inverted, scale = scale)
self.ipcomm_axis = ipcomm_axis
if not max_run_freq:
@@ -16,6 +16,11 @@ class PhytronAxis(Axis):
self.initiator = initiator
self.initiator_position = initiator_position
self.onInitialized.connect(self.handle_initialized)
+
+ self.ipcomm_axis.limited = limited
+
+ def __del__(self):
+ self.ipcomm_axis.stop()
def handle_initialized(self, sender, initialized):
if self.initialisation and sender == self and initialized:
diff --git a/MotionControl/Service.py b/MotionControl/Service.py
new file mode 100644
index 0000000..241d141
--- /dev/null
+++ b/MotionControl/Service.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+
+import rpyc
+
+class Service(rpyc.Service):
+ stage = None
+ def on_connect(self):
+ Service.stage.onPositionChanged.connect(self.onPosition)
+
+ for i,p in enumerate(Service.stage.position):
+ self.onPosition(None, i, p)
+
+ def on_disconnect(self):
+ Service.stage.onPositionChanged.disconnect(self.onPosition)
+
+ def onPosition(self, sender, axis, position):
+ rpyc.async(self._conn.root.onPosition)(axis, position)
+
+ def exposed_set_destination(self, destination):
+ Service.stage.set_destination(destination)
+ def exposed_cycle_start(self):
+ Service.stage.cycle_start()
+ def exposed_abort(self):
+ Service.stage.abort()
+
+ def exposed_reference(self):
+ Service.stage.reference()
+
+ def exposed_getAxisLimits(self, axis):
+ return Service.stage.axes[axis].limits
+