summaryrefslogtreecommitdiffstats
path: root/dpd/src/Adapt.py
diff options
context:
space:
mode:
authorandreas128 <Andreas>2017-08-05 22:29:04 +0100
committerandreas128 <Andreas>2017-08-05 22:29:04 +0100
commitfaa144c050972d518b8e953b4396e6b566cd2b03 (patch)
treeeae754d5177c61cfbaf8b7131d538c68947693cd /dpd/src/Adapt.py
parent74846d047d1dfdc397222e7f1e8ab0c8e86a0af4 (diff)
downloaddabmod-faa144c050972d518b8e953b4396e6b566cd2b03.tar.gz
dabmod-faa144c050972d518b8e953b4396e6b566cd2b03.tar.bz2
dabmod-faa144c050972d518b8e953b4396e6b566cd2b03.zip
Add Adapt and Model, Update for minimum working pipeline
Diffstat (limited to 'dpd/src/Adapt.py')
-rw-r--r--dpd/src/Adapt.py153
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.