146 lines
4.1 KiB
Python
146 lines
4.1 KiB
Python
|
#!/usr/bin/python3
|
||
|
|
||
|
import argparse
|
||
|
import logging
|
||
|
import sys
|
||
|
from xmlrpc.server import SimpleXMLRPCServer
|
||
|
import attenuator
|
||
|
|
||
|
DEFAULT_PORT = "8231"
|
||
|
|
||
|
logging.basicConfig(level=logging.INFO, format='%(levelname)s %(message)s')
|
||
|
LOG = logging.getLogger("att_ctrl_srv")
|
||
|
|
||
|
# Array of attenuator devices and their i2c bus and gpio pin numbers.
|
||
|
attenuators = [
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x20, 1),
|
||
|
attenuator.Pin(0x20, 2),
|
||
|
attenuator.Pin(0x20, 3),
|
||
|
attenuator.Pin(0x20, 4),
|
||
|
attenuator.Pin(0x20, 5),
|
||
|
attenuator.Pin(0x20, 6)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x20, 7),
|
||
|
attenuator.Pin(0x20, 8),
|
||
|
attenuator.Pin(0x20, 9),
|
||
|
attenuator.Pin(0x20, 10),
|
||
|
attenuator.Pin(0x20, 11),
|
||
|
attenuator.Pin(0x20, 12)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x20, 13),
|
||
|
attenuator.Pin(0x20, 14),
|
||
|
attenuator.Pin(0x20, 15),
|
||
|
attenuator.Pin(0x20, 16),
|
||
|
attenuator.Pin(0x21, 1),
|
||
|
attenuator.Pin(0x21, 2)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x21, 3),
|
||
|
attenuator.Pin(0x21, 4),
|
||
|
attenuator.Pin(0x21, 5),
|
||
|
attenuator.Pin(0x21, 6),
|
||
|
attenuator.Pin(0x21, 7),
|
||
|
attenuator.Pin(0x21, 8)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x21, 9),
|
||
|
attenuator.Pin(0x21, 10),
|
||
|
attenuator.Pin(0x21, 11),
|
||
|
attenuator.Pin(0x21, 12),
|
||
|
attenuator.Pin(0x21, 13),
|
||
|
attenuator.Pin(0x21, 14)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x21, 15),
|
||
|
attenuator.Pin(0x21, 16),
|
||
|
attenuator.Pin(0x22, 1),
|
||
|
attenuator.Pin(0x22, 2),
|
||
|
attenuator.Pin(0x22, 3),
|
||
|
attenuator.Pin(0x22, 4)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x22, 5),
|
||
|
attenuator.Pin(0x22, 6),
|
||
|
attenuator.Pin(0x22, 7),
|
||
|
attenuator.Pin(0x22, 8),
|
||
|
attenuator.Pin(0x22, 9),
|
||
|
attenuator.Pin(0x22, 10)
|
||
|
),
|
||
|
attenuator.Attenuator(
|
||
|
attenuator.Pin(0x22, 11),
|
||
|
attenuator.Pin(0x22, 12),
|
||
|
attenuator.Pin(0x22, 13),
|
||
|
attenuator.Pin(0x22, 14),
|
||
|
attenuator.Pin(0x22, 15),
|
||
|
attenuator.Pin(0x22, 16)
|
||
|
),
|
||
|
]
|
||
|
|
||
|
def parse_args():
|
||
|
"""Command line argument parser"""
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument("host", help="Hostname or ip address the server is \
|
||
|
serving on. (e.g. 'attctrl:8231 or 192.168.1.16'")
|
||
|
|
||
|
return parser.parse_args()
|
||
|
|
||
|
def host_port(data):
|
||
|
'''Determine hostname/address and port.
|
||
|
|
||
|
Args:
|
||
|
data (str): Hostname/address with optional port (e.g. 'localhost:1234'
|
||
|
or '192.168.0.1').
|
||
|
|
||
|
Returns:
|
||
|
str: Hostname/address
|
||
|
str: Port
|
||
|
'''
|
||
|
tmp = data.split(":")
|
||
|
port = DEFAULT_PORT
|
||
|
host = tmp[0]
|
||
|
|
||
|
if len(tmp) > 1:
|
||
|
port = tmp[1]
|
||
|
return host, port
|
||
|
|
||
|
def set_attenuation(attenuator, attenuation):
|
||
|
"""Set the attenuation of the choosen attenuator
|
||
|
|
||
|
Args:
|
||
|
attenuator (int): Index of the attenuator device [0..8]
|
||
|
attenuation (float): Value of attenuation to be set [0.0..31.5]
|
||
|
"""
|
||
|
try:
|
||
|
dev = int(attenuator)
|
||
|
except ValueError:
|
||
|
LOG.error("attenuator needs to be convertible into int.")
|
||
|
return 1
|
||
|
try:
|
||
|
val = float(attenuation)
|
||
|
except ValueError:
|
||
|
LOG.error("attenuation needs to be convertible into float.")
|
||
|
return 1
|
||
|
|
||
|
attenuators[dev].set_attenuation(val)
|
||
|
LOG.info("xmlrpcserver: set attenuation of attenuator {} to {}".format(attenuator, attenuation))
|
||
|
return 0
|
||
|
|
||
|
def main():
|
||
|
args = parse_args()
|
||
|
host, port = host_port(args.host)
|
||
|
server = SimpleXMLRPCServer((host, int(port)))
|
||
|
server.register_function(set_attenuation)
|
||
|
LOG.info("xmlrpcserver: registering 'set_attenuation'.")
|
||
|
try:
|
||
|
LOG.info("xmlrpcserver: start serving on %s:%s.", str(host), str(port))
|
||
|
server.serve_forever()
|
||
|
except KeyboardInterrupt:
|
||
|
LOG.info("xmlrpcserver: Keyboard interrupt catched - shutting down.")
|
||
|
return 0
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
sys.exit(main())
|