Skip to content

Commit

Permalink
Add ScanPointTickerController
Browse files Browse the repository at this point in the history
  • Loading branch information
c-mita committed Jun 23, 2016
1 parent 96eee36 commit 57f3694
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 0 deletions.
58 changes: 58 additions & 0 deletions malcolm/controllers/scanpointtickercontroller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import numpy
import time

from malcolm.core.attribute import Attribute
from malcolm.core.controller import Controller
from malcolm.core.mapmeta import REQUIRED
from malcolm.core.method import takes, Method
from malcolm.core.pointgeneratormeta import PointGeneratorMeta
from malcolm.core.stringmeta import StringMeta
from malcolm.core.numbermeta import NumberMeta


class ScanPointTickerController(Controller):

def __init__(self, block):
super(ScanPointTickerController, self).__init__(block)
self.stateMachine = None
self.value = Attribute(NumberMeta("value", "value", numpy.float64))

def create_attributes(self):
self.generator = Attribute(
PointGeneratorMeta("generator", "Scan Point Generator"))
yield self.generator
self.axis_name = Attribute(StringMeta("axis_name", "Name of the axis"))
yield self.axis_name
self.exposure = Attribute(
NumberMeta("exposure", "Exposure time", numpy.float64))
yield self.exposure

@takes(PointGeneratorMeta("generator", "Generator instance"), REQUIRED,
StringMeta("axis_name", "Specifier for axis"), REQUIRED,
NumberMeta("exposure", "Detector exposure time", numpy.float64), REQUIRED)
def configure(self, generator, axis_name, exposure):
"""
Configure the controller
Args:
generator(PointGenerator): Generator to create points
axis_name(String): Specifier for axis
exposure(Double): Exposure time for detector
"""

self.generator.set_value(generator)
self.axis_name.set_value(axis_name)
self.exposure.set_value(exposure)

@Method.wrap_method
def run(self):
"""
Start the ticker process
Yields:
Point: Scan points from PointGenerator
"""

for point in self.generator.iterator():
self.value.set_value(point)
time.sleep(self.exposure.value)
60 changes: 60 additions & 0 deletions tests/test_controllers/test_scanpointtickercontroller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import unittest

from . import util
from mock import MagicMock, patch

from malcolm.core.attribute import Attribute
from malcolm.controllers.scanpointtickercontroller import \
ScanPointTickerController


class TestScanPointTickerController(unittest.TestCase):

@patch("malcolm.core.stringmeta.StringMeta.to_dict")
@patch("malcolm.core.numbermeta.NumberMeta.to_dict")
@patch("malcolm.core.pointgeneratormeta.PointGeneratorMeta.to_dict")
def test_init(self, pgmd_mock, nmd_mock, smd_mock):
block = MagicMock()
sptc = ScanPointTickerController(block)
self.assertEqual(block, sptc.block)
self.assertIsNone(sptc.stateMachine)

self.assertEquals(
{"value":None, "meta":nmd_mock.return_value},
sptc.value.to_dict())
self.assertEquals(
{"value":None, "meta":pgmd_mock.return_value},
sptc.generator.to_dict())
self.assertEquals(
{"value":None, "meta":smd_mock.return_value},
sptc.axis_name.to_dict())
self.assertEquals(
{"value":None, "meta":nmd_mock.return_value},
sptc.exposure.to_dict())

def test_configure(self):
g = MagicMock()
an = MagicMock()
e = MagicMock()
sptc = ScanPointTickerController(MagicMock())

sptc.configure(g, an, e)

self.assertEqual(g, sptc.generator.value)
self.assertEqual(an, sptc.axis_name.value)
self.assertEqual(e, sptc.exposure.value)

def test_run(self):
g = MagicMock()
an = MagicMock()
e = MagicMock()
sptc = ScanPointTickerController(MagicMock())

sptc.configure(g, an, e)

self.assertEqual(g, sptc.generator.value)
self.assertEqual(an, sptc.axis_name.value)
self.assertEqual(e, sptc.exposure.value)

if __name__ == "__main__":
unittest.main()

0 comments on commit 57f3694

Please sign in to comment.