Skip to content

Commit

Permalink
Merge 53c6976 into 8ef18e7
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeHart85 committed Aug 11, 2016
2 parents 8ef18e7 + 53c6976 commit bc4073f
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 29 deletions.
7 changes: 6 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
FROM dmscid/epics-pcaspy:latest

COPY . /plankton
# Copying these separately from the rest of plankton allows the
# pip install step to be cached until the requirements change.
# Rebuilding is faster and doesn't require an internet connection.
COPY requirements*.txt /plankton/

RUN pip install -r plankton/requirements.txt && \
pip install -r plankton/requirements-dev.txt

COPY . /plankton

ENTRYPOINT ["/init.sh", "/plankton/simulation.py"]

3 changes: 2 additions & 1 deletion adapters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
# *********************************************************************

import importlib
import argparse


class Adapter(object):
def run(cls, target, bindings, *args, **kwargs):
def run(self, target, bindings, arguments):
pass


Expand Down
12 changes: 10 additions & 2 deletions adapters/epics.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
# *********************************************************************

from datetime import datetime
from argparse import ArgumentParser

from pcaspy import Driver, SimpleServer

Expand Down Expand Up @@ -68,9 +69,16 @@ def doProcess(self, dt):


class EpicsAdapter(Adapter):
def run(self, target, bindings, *args, **kwargs):
def _parseArguments(self, arguments):
parser = ArgumentParser(description="Adapter to expose a device via EPICS")
parser.add_argument('-p', '--prefix', help='Prefix to use for all PVs', default='')
return parser.parse_args(arguments)

def run(self, target, bindings, arguments):
options = self._parseArguments(arguments)

server = SimpleServer()
server.createPV(prefix=kwargs['pv_prefix'], pvdb=bindings)
server.createPV(prefix=options.prefix, pvdb=bindings)
driver = PropertyExposingDriver(target=target, pv_dict=bindings)

delta = 0.0 # Delta between cycles
Expand Down
14 changes: 12 additions & 2 deletions adapters/stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import socket

from adapters import Adapter
from argparse import ArgumentParser
from datetime import datetime


Expand Down Expand Up @@ -76,8 +77,17 @@ def handle_accept(self):


class StreamAdapter(Adapter):
def run(self, target, bindings, *args, **kwargs):
StreamServer("0.0.0.0", 9999, target, bindings)
def _parseArguments(self, arguments):
parser = ArgumentParser(description='Adapter to expose a device via TCP Stream')
parser.add_argument('-b', '--bind-address', help='IP Address to bind and listen for connections on',
default='0.0.0.0')
parser.add_argument('-p', '--port', help='Port to listen for connections on', type=int, default=9999)
return parser.parse_args(arguments)

def run(self, target, bindings, arguments):
options = self._parseArguments(arguments)

StreamServer(options.bind_address, options.port, target, bindings)

delta = 0.0 # Delta between cycles
count = 0 # Cycles per second counter
Expand Down
25 changes: 2 additions & 23 deletions simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,6 @@
from setups import import_device, import_bindings


class StoreNameValuePairs(argparse.Action):
"""
This class is a slightly modified version of the solution presented in a stackoverflow answer:
http://stackoverflow.com/a/11762020
"""

def __init__(self, option_strings, dest, nargs=None, **kwargs):
super(StoreNameValuePairs, self).__init__(option_strings, dest, nargs=nargs, **kwargs)

self._param_name = dest

def __call__(self, parser, namespace, values, option_string=None):
option_dict = {}
for option in values.split(','):
n, v = option.split('=')
option_dict[n] = v

setattr(namespace, self._param_name, option_dict)


parser = argparse.ArgumentParser(
description='Run a simulated device and expose it via a specified communication protocol.')
parser.add_argument('-d', '--device', help='Name of the device to simulate.', default='chopper',
Expand All @@ -56,8 +36,7 @@ def __call__(self, parser, namespace, values, option_string=None):
parser.add_argument('-a', '--adapter',
help='Name of adapter class. If not specified, the loader will choose '
'the first adapter it discovers.')
parser.add_argument('--parameters', help='Additional parameters for the protocol, key=value pairs separated by comma.',
action=StoreNameValuePairs)
parser.add_argument('adapter_args', nargs='*', help='Arguments for the adapter.')

arguments = parser.parse_args()

Expand All @@ -67,4 +46,4 @@ def __call__(self, parser, namespace, values, option_string=None):
device = import_device(arguments.device, arguments.setup)

adapter = CommunicationAdapter()
adapter.run(device, bindings, **arguments.parameters)
adapter.run(device, bindings, arguments.adapter_args)

0 comments on commit bc4073f

Please sign in to comment.