# -*- coding: utf-8 -*-
"""
lantz.drivers.sutter.lambda103
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Implements the drivers to control a filter wheel.
Sources::
- Sutter Instruments manual.
:copyright: 2015 by Lantz Authors, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
from lantz import Feat, DictFeat, Action
from lantz.messagebased import MessageBasedDriver
def logged(func):
return func
[docs]class Lambda103(MessageBasedDriver):
"""High performance, microprocessor-controlled multi-filter wheel system
for imaging applications requiring up to 3 filter wheels.
"""
DEFAULTS = {'ASRL': {'write_termination': '',
'read_termination': '',
}}
[docs] def initialize(self):
super().initialize()
self.speed = 1
@Feat(None, values={True: chr(170), False: chr(172)})
def open_A(self, value):
"""Open shutter A.
"""
self.send(value)
@logged
[docs] def flush(self):
"""Flush.
"""
self.serial.flushInput()
self.serial.flushOutput()
self.serial.flush()
# TODO: WTF 2 values for the same wheel
@DictFeat(None, keys={'A': 0, 'B': 1})
def position(self, key, value):
"""Set filter wheel position and speed.
w = 0 -> Filter wheels A and C
w = 1 -> Fliter wheel B
"""
command = chr( key * 128 + self.speed * 14 + value)
self.send(command)
@Action()
def motorsON(self):
"""Power on all motors."""
self.send(chr(206))
return "Motors ON"
@Action()
def status(self):
return "Status {}".format(self.query(chr(204)))
@Feat(None, values={True: chr(238), False: chr(239)})
def remote(self, value):
"""Set Local-Mode."""
self.send(value)
@Action()
def reset(self):
"""Reset the controller."""
self.send(chr(251))
if __name__ == '__main__':
import argparse
import lantz.log
parser = argparse.ArgumentParser(description='Test PI E-662')
parser.add_argument('-i', '--interactive', action='store_true',
default=False, help='Show interactive GUI')
parser.add_argument('-p', '--port', type=str, default='17',
help='Serial port to connect to')
args = parser.parse_args()
lantz.log.log_to_socket(lantz.log.DEBUG)
with Lambda103(args.port) as inst:
if args.interactive:
from lantz.ui.app import start_test_app
start_test_app(inst)
else:
from time import sleep
inst.remote = True
inst.open_A = True
sleep(5)
inst.open_A = False
sleep(1)
for i in range(9):
fw.position['A']= i
sleep(1)
sleep(1)
inst.remote = False
fw.open_A = False