Skip to content

Commit

Permalink
Merge ea47893 into 51ef67d
Browse files Browse the repository at this point in the history
  • Loading branch information
matze committed Aug 16, 2013
2 parents 51ef67d + ea47893 commit 7a6bf67
Show file tree
Hide file tree
Showing 12 changed files with 82 additions and 54 deletions.
36 changes: 36 additions & 0 deletions concert/devices/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import threading
from logbook import Logger
from concert.base import Parameterizable, Parameter
from concert.quantities import q


LOG = Logger(__name__)
Expand Down Expand Up @@ -70,3 +71,38 @@ def _set_state(self, state):
self['state'].notify()
else:
LOG.warn("State {0} unknown.".format(state))


class Calibration(object):

"""Interface to convert between user and device units."""

def to_user(self, value):
"""Return *value* in user units."""
raise NotImplementedError

def to_steps(self, value):
"""Return *value* in device units."""
raise NotImplementedError


class LinearCalibration(Calibration):

"""A linear calibration maps a number of steps to a real-world unit.
*steps_per_unit* tells how many steps correspond to some unit,
*offset_in_steps* by how many steps the device is away from some zero
point.
"""

def __init__(self, steps_per_unit, offset_in_steps):
super(LinearCalibration, self).__init__()
self._steps_per_unit = steps_per_unit
self._offset = offset_in_steps

def to_user(self, value_in_steps):
return value_in_steps * q.count / self._steps_per_unit - self._offset

def to_steps(self, value):
res = (value + self._offset) * self._steps_per_unit
return res.to_base_units().magnitude
38 changes: 0 additions & 38 deletions concert/devices/calibration.py

This file was deleted.

4 changes: 2 additions & 2 deletions concert/devices/motors/aerotech.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"""Aerotech"""
import time
from concert.quantities import q
from concert.devices.motors.base import ContinuousMotor, Motor
from concert.connections.inet import Aerotech
from concert.devices.calibration import LinearCalibration
from concert.devices.base import LinearCalibration
from concert.devices.motors.base import ContinuousMotor, Motor


class Aerorot(ContinuousMotor):
Expand Down
17 changes: 12 additions & 5 deletions concert/devices/motors/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import logbook
from concert.quantities import q
from concert.base import HardlimitError
from concert.devices.base import Device, Parameter
from concert.devices.base import Device, Parameter, LinearCalibration
from concert.asynchronous import async


Expand All @@ -29,8 +29,10 @@ class Motor(Device):

"""Base class for everything that moves.
An motor is used with a *calibration* that conforms to the
:class:`Calibration` interface to convert between user and device units.
A motor is used with a *calibration* that conforms to the
:class:`Calibration` interface to convert between user and device units. If
*calibration* is not given, a default :py:class:`LinearCalibration` mapping
one step to one millimeter with zero offset is assumed.
.. py:attribute:: position
Expand All @@ -41,15 +43,20 @@ class Motor(Device):
MOVING = 'moving'
LIMIT = 'limit'

def __init__(self, calibration, limiter=None):
def __init__(self, calibration=None, limiter=None):
params = [Parameter('position',
self._get_calibrated_position,
self._set_calibrated_position,
q.m, limiter,
"Position of the motor")]

super(Motor, self).__init__(params)
self._calibration = calibration

if not calibration:
self._calibration = LinearCalibration(1 * q.count / q.mm, 0 * q.mm)
else:
self._calibration = calibration

self._states = \
self._states.union(set([self.STANDBY, self.MOVING, self.LIMIT]))

Expand Down
2 changes: 1 addition & 1 deletion concert/devices/motors/crio.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"""
import readline
from concert.quantities import q
from concert.devices.base import LinearCalibration
from concert.devices.motors.base import Motor
from concert.devices.calibration import LinearCalibration
from concert.connections.inet import Connection


Expand Down
4 changes: 2 additions & 2 deletions concert/devices/motors/dummy.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import random
from concert.quantities import q
from concert.devices.motors import base
from concert.devices.calibration import LinearCalibration
from concert.devices.base import LinearCalibration


class DummyLimiter(object):
Expand All @@ -21,7 +21,7 @@ class Motor(base.Motor):

"""Dummy Motor class implementation."""

def __init__(self, calibration=LinearCalibration(q.count / q.mm, 0 * q.mm),
def __init__(self, calibration=None,
limiter=None, position=None, hard_limits=None):
super(Motor, self).__init__(calibration, limiter)
if hard_limits is None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from testfixtures import ShouldRaise
from concert.quantities import q
from concert.devices.motors.dummy import Motor
from concert.devices.calibration import LinearCalibration
from concert.devices.base import LinearCalibration
from concert.asynchronous import dispatcher
from concert.tests import slow
from concert.processes.tomoalignment import Aligner
Expand Down
1 change: 0 additions & 1 deletion concert/tests/integration/processes/test_scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from concert.quantities import q
from testfixtures import compare
from concert.tests import assert_almost_equal
from concert.devices.calibration import LinearCalibration
from concert.devices.motors.dummy import Motor as DummyMotor
from concert.devices.cameras.dummy import Camera
from concert.processes.scan import Scanner, StepTomoScanner, ascan, dscan
Expand Down
2 changes: 1 addition & 1 deletion concert/tests/unit/devices/test_monochromator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from testfixtures import ShouldRaise
from concert.tests import assert_almost_equal
from concert.quantities import q
from concert.devices.calibration import LinearCalibration
from concert.devices.base import LinearCalibration
from concert.devices.monochromators.dummy import\
Monochromator as DummyMonochromator
from concert.devices.monochromators import base
Expand Down
26 changes: 25 additions & 1 deletion concert/tests/unit/devices/test_motor.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,36 @@
import unittest
import logbook
from concert.quantities import q
from concert.devices.base import LinearCalibration
from concert.devices.motors.base import Motor
from concert.devices.calibration import LinearCalibration
from concert.devices.motors.dummy import Motor as DummyMotor,\
ContinuousMotor as DummyContinuousMotor


def test_default_motor_has_default_calibration():
class MockMotor(Motor):
def __init__(self):
self._position = 0
super(MockMotor, self).__init__()

def _set_position(self, position):
self._position = position

def _get_position(self):
return self._position

handler = logbook.TestHandler()
handler.push_application()

motor = MockMotor()
motor.move(-1 * q.mm).wait()
assert motor.position == -1 * q.mm
motor.position = 2.3 * q.mm
assert motor.position == 2.3 * q.mm

handler.pop_application()


class TestDummyMotor(unittest.TestCase):

def setUp(self):
Expand Down
2 changes: 1 addition & 1 deletion concert/tests/unit/measures/test_rotationaxismeasure.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from concert.quantities import q
from concert.measures.rotationaxis import Ellipse
from concert.tests.util.rotationaxis import SimulationCamera
from concert.devices.calibration import LinearCalibration
from concert.devices.base import LinearCalibration
from concert.devices.motors.dummy import Motor
from concert.tests import slow
from concert.processes.scan import Scanner
Expand Down
2 changes: 1 addition & 1 deletion concert/tests/unit/test_calibration.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import unittest
from concert.quantities import q
from concert.devices.calibration import LinearCalibration
from concert.devices.base import LinearCalibration


class TestLinearCalibration(unittest.TestCase):
Expand Down

0 comments on commit 7a6bf67

Please sign in to comment.