diff options
Diffstat (limited to 'dpd/src/Adapt.py')
-rw-r--r-- | dpd/src/Adapt.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/dpd/src/Adapt.py b/dpd/src/Adapt.py new file mode 100644 index 0000000..b86f604 --- /dev/null +++ b/dpd/src/Adapt.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- +""" +This module is used to change settings of ODR-DabMod using +the ZMQ remote control socket. +""" + +import zmq +import exceptions +import logging +import numpy as np + +port = 9400 + +class Adapt: + """Uses the ZMQ remote control to change parameters + of the DabMod + + Parameters + ---------- + port : int + Port at which the ODR-DabMod is listening to connect the + ZMQ remote control. + """ + + def __init__(self, port, coef_path): + logging.info("Instantiate Adapt object") + self.port = port + self.coef_path = coef_path + self.host = "localhost" + self._connect() + + def _connect(self): + """Establish the connection to ODR-DabMod using + a ZMQ socket that is in request mode (Client)""" + context = zmq.Context() + sock = context.socket(zmq.REQ) + sock.connect("tcp://%s:%d" % (self.host, self.port)) + + sock.send(b"ping") + data = sock.recv_multipart() + + if data != ['ok']: + raise exceptions.RuntimeError( + "Could not connect to server %s %d." % + (self.host, self.port)) + + self.sock = sock + + def send_receive(self, message): + """Used to send a message to the ODR-DabMod. It always + returns a answer it also receives the next message + from ODR-DabMod over the ZMQ remote control socket. + + Parameter + --------- + message : str + The message string that will be sent to + the receiver. + """ + logging.info("Send message: %s" % message) + msg_parts = message.split(" ") + for i, part in enumerate(msg_parts): + if i == len(msg_parts) - 1: + f = 0 + else: + f = zmq.SNDMORE + + self.sock.send(part.encode(), flags=f) + + data = self.sock.recv_multipart() + logging.info("Received message: %s" % message) + return data + + def set_txgain(self, gain): + """Set a new txgain for the ORD-DabMod. + + Parameters + ---------- + gain : int + Value that will be set to be txgain + """ + if gain < 0 or gain > 89: + raise exceptions.ValueError("Gain has to be in [0,89]") + return self.send_receive("set uhd txgain %d" % gain) + + def get_txgain(self): + """Get the txgain value in dB for the ORD-DabMod.""" + return self.send_receive("get uhd txgain") + + def set_rxgain(self, gain): + """Set a new rxgain for the ORD-DabMod. + + Parameters + ---------- + gain : int + Value that will be set to be rxgain + """ + if gain < 0 or gain > 89: + raise exceptions.ValueError("Gain has to be in [0,89]") + return self.send_receive("set uhd rxgain %d" % gain) + + def get_rxgain(self): + """Get the rxgain value in dB for the ORD-DabMod.""" + return self.send_receive("get uhd rxgain") + + def _read_coef_file(self): + coefs_complex = [] + f = open(self.coef_path, 'r') + lines = f.readlines() + n_coefs = lines[0] + coefs = [float(l) for l in lines[1:]] + for r, c in zip(coefs[0::2], coefs[1::2]): + coefs_complex.append(np.complex64(r + 1j * c)) + f.close() + return coefs_complex + + def get_coefs(self): + return self._read_coef_file() + + def _write_coef_file(self, coefs_complex): + coef_path = "/home/andreas/dab/ODR-DabMod/polyCoefsCustom" + f = open(coef_path, 'w') + f.write(str(len(coefs_complex)) + "\n") + for coef in coefs_complex: + f.write(str(coef.real) + "\n") + f.write(str(coef.imag) + "\n") + f.close() + + def set_coefs(self, coefs_complex): + self._write_coef_file(coefs_complex) + self.send_receive("set memlesspoly coeffile polyCoefsCustom") + + # The MIT License (MIT) + # + # Copyright (c) 2017 Andreas Steger + # + # Permission is hereby granted, free of charge, to any person obtaining a copy + # of this software and associated documentation files (the "Software"), to deal + # in the Software without restriction, including without limitation the rights + # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + # copies of the Software, and to permit persons to whom the Software is + # furnished to do so, subject to the following conditions: + # + # The above copyright notice and this permission notice shall be included in all + # copies or substantial portions of the Software. + # + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + # SOFTWARE. |