apps/trx: separate CTRLInterface implementation
diff --git a/apps/trx/ctrl_if.py b/apps/trx/ctrl_if.py
index 58960c5..0129d7f 100644
--- a/apps/trx/ctrl_if.py
+++ b/apps/trx/ctrl_if.py
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# GR-GSM based transceiver
-# Transceiver UDP interface
+# CTRL interface implementation
#
# (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com>
#
@@ -22,25 +22,18 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-import socket
-import select
-
from udp_link import UDPLink
class CTRLInterface(UDPLink):
- def __init__(self, remote_addr, remote_port, bind_port, radio_if):
- print("[i] Init TRX CTRL interface")
- UDPLink.__init__(self, remote_addr, remote_port, bind_port)
- self.tb = radio_if
-
- def shutdown(self):
- print("[i] Shutdown TRX CTRL interface")
- UDPLink.shutdown(self)
-
def handle_rx(self, data):
if self.verify_req(data):
request = self.prepare_req(data)
- self.parse_cmd(request)
+ rc = self.parse_cmd(request)
+
+ if type(rc) is tuple:
+ self.send_response(request, rc[0], rc[1])
+ else:
+ self.send_response(request, rc)
else:
print("[!] Wrong data on CTRL interface")
@@ -72,61 +65,18 @@
return True
- def parse_cmd(self, request):
- response_code = "0"
-
- # Power control
- if self.verify_cmd(request, "POWERON", 0):
- print("[i] Recv POWERON cmd")
- if not self.tb.trx_started:
- if self.tb.check_available():
- print("[i] Starting transceiver...")
- self.tb.trx_started = True
- self.tb.start()
- else:
- print("[!] Transceiver isn't ready to start")
- response_code = "-1"
- else:
- print("[!] Transceiver already started!")
- response_code = "-1"
- elif self.verify_cmd(request, "POWEROFF", 0):
- print("[i] Recv POWEROFF cmd")
- print("[i] Stopping transceiver...")
- self.tb.trx_started = False
- # TODO: flush all buffers between blocks
- self.tb.stop()
- elif self.verify_cmd(request, "SETRXGAIN", 1):
- print("[i] Recv SETRXGAIN cmd")
- # TODO: check gain value
- gain = int(request[1])
- self.tb.set_gain(gain)
-
- # Tuning Control
- elif self.verify_cmd(request, "RXTUNE", 1):
- print("[i] Recv RXTUNE cmd")
- # TODO: check freq range
- freq = int(request[1]) * 1000
- self.tb.set_fc(freq)
- elif self.verify_cmd(request, "TXTUNE", 1):
- print("[i] Recv TXTUNE cmd")
- # TODO: is not implemented yet
-
- # Misc
- elif self.verify_cmd(request, "ECHO", 0):
- print("[i] Recv ECHO cmd")
-
- # Wrong / unknown command
- else:
- print("[!] Wrong request on CTRL interface")
- response_code = "-1"
-
- # Anyway, we need to respond
- self.send_response(request, response_code)
-
- def send_response(self, request, response_code):
+ def send_response(self, request, response_code, params = None):
# Include status code, for example ["TXTUNE", "0", "941600"]
- request.insert(1, response_code)
+ request.insert(1, str(response_code))
+
+ # Optionally append command specific parameters
+ if params is not None:
+ request += params
+
# Add the response signature, and join back to string
response = "RSP " + " ".join(request) + "\0"
# Now we have something like "RSP TXTUNE 0 941600"
self.send(response)
+
+ def parse_cmd(self, request):
+ raise NotImplementedError
diff --git a/apps/trx/ctrl_if_bb.py b/apps/trx/ctrl_if_bb.py
new file mode 100644
index 0000000..8f7b57a
--- /dev/null
+++ b/apps/trx/ctrl_if_bb.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+# GR-GSM based transceiver
+# CTRL interface for OsmocomBB
+#
+# (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com>
+#
+# All Rights Reserved
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from ctrl_if import CTRLInterface
+
+class CTRLInterfaceBB(CTRLInterface):
+ def __init__(self, remote_addr, remote_port, bind_port, tb):
+ print("[i] Init CTRL interface")
+ CTRLInterface.__init__(self, remote_addr, remote_port, bind_port)
+
+ # Set link to the follow graph (top block)
+ self.tb = tb
+
+ def shutdown(self):
+ print("[i] Shutdown CTRL interface")
+ CTRLInterface.shutdown(self)
+
+ def parse_cmd(self, request):
+ # Power control
+ if self.verify_cmd(request, "POWERON", 0):
+ print("[i] Recv POWERON CMD")
+
+ # Ensure transceiver isn't working
+ if self.tb.trx_started:
+ print("[!] Transceiver already started")
+ return -1
+
+ # Ensure transceiver is ready to start
+ if not self.tb.check_available():
+ print("[!] Transceiver isn't ready to start")
+ return -1
+
+ print("[i] Starting transceiver...")
+ self.tb.trx_started = True
+ self.tb.start()
+
+ return 0
+
+ elif self.verify_cmd(request, "POWEROFF", 0):
+ print("[i] Recv POWEROFF cmd")
+
+ # TODO: flush all buffers between blocks
+ if self.tb.trx_started:
+ print("[i] Stopping transceiver...")
+ self.tb.trx_started = False
+ self.tb.stop()
+
+ return 0
+
+ elif self.verify_cmd(request, "SETRXGAIN", 1):
+ print("[i] Recv SETRXGAIN cmd")
+
+ # TODO: check gain value
+ gain = int(request[1])
+ self.tb.set_gain(gain)
+
+ return 0
+
+ # Tuning Control
+ elif self.verify_cmd(request, "RXTUNE", 1):
+ print("[i] Recv RXTUNE cmd")
+
+ # TODO: check freq range
+ freq = int(request[1]) * 1000
+ self.tb.set_fc(freq)
+
+ return 0
+
+ elif self.verify_cmd(request, "TXTUNE", 1):
+ print("[i] Recv TXTUNE cmd")
+
+ # TODO: is not implemented yet
+ return 0
+
+ # Misc
+ elif self.verify_cmd(request, "ECHO", 0):
+ print("[i] Recv ECHO cmd")
+ return 0
+
+ # Wrong / unknown command
+ else:
+ print("[!] Wrong request on CTRL interface")
+ return -1
diff --git a/apps/trx/grgsm_trx.py b/apps/trx/grgsm_trx.py
index 7a1ece3..dbc1c9f 100755
--- a/apps/trx/grgsm_trx.py
+++ b/apps/trx/grgsm_trx.py
@@ -25,7 +25,7 @@
import getopt
import sys
-from ctrl_if import CTRLInterface
+from ctrl_if_bb import CTRLInterfaceBB
from radio_if import RadioInterface
COPYRIGHT = \
@@ -61,7 +61,7 @@
self.remote_addr, self.base_port)
# Init TRX CTRL interface
- self.server = CTRLInterface(self.remote_addr,
+ self.server = CTRLInterfaceBB(self.remote_addr,
self.base_port + 101, self.base_port + 1, self.radio)
print("[i] Init complete")