kirr has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmocom-bb/+/40066?usp=email )
Change subject: trx_toolkit/transceiver: Switch Transceiver to cdef class
......................................................................
trx_toolkit/transceiver: Switch Transceiver to cdef class
- Put fields into the object struct; fields are now accessed directly
via that C-level struct instead of via __dict__ lookup
- cimport instead of import Transceiver at the users
- switch to invoke several Transceiver function via C-level where
appropriate. Add type annotations to trx variables
correspondingly.
Change-Id: Ic7039451136b04dacfaf839b21f11b300f579603
---
M src/target/trx_toolkit/_fake_trx.pyx
M src/target/trx_toolkit/burst_fwd.pxd
M src/target/trx_toolkit/burst_fwd.pyx
A src/target/trx_toolkit/transceiver.pxd
M src/target/trx_toolkit/transceiver.pyx
5 files changed, 76 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/66/40066/1
diff --git a/src/target/trx_toolkit/_fake_trx.pyx b/src/target/trx_toolkit/_fake_trx.pyx
index 102a8d1..8135913 100644
--- a/src/target/trx_toolkit/_fake_trx.pyx
+++ b/src/target/trx_toolkit/_fake_trx.pyx
@@ -23,7 +23,7 @@
from burst_fwd cimport BurstForwarder
from _clck_gen cimport CLCKGen
-from transceiver import Transceiver
+from transceiver cimport Transceiver
from data_msg import Modulation
from udp_link cimport _raise_oserr
from gsm_shared import *
@@ -204,7 +204,7 @@
# Takes (partially initialized) TRXD Rx message,
# simulates RF path parameters (such as RSSI),
# and sends towards the L1
- def handle_data_msg(self, src_trx, src_msg, msg):
+ def handle_data_msg(self, Transceiver src_trx, src_msg, msg):
if self.rf_muted:
msg.nope_ind = True
elif not msg.nope_ind:
@@ -415,6 +415,7 @@
# This method will be called by the clock generator
def clck_handler(self, fn):
+ cdef Transceiver trx
# We assume that this list is immutable at run-time
for trx in self.trx_list:
trx.clck_tick(self.burst_fwd, fn)
@@ -428,6 +429,7 @@
ee = _heventdef(_Handler(_RxTimer, None))
xepoll_ctl(epoll_fd, EPOLL_CTL_ADD, self.clck_gen._timerfd, &ee)
+ cdef Transceiver trx
for trx in self.trx_list:
ee = _heventdef(_Handler(_RxTRXCtrl, trx))
xepoll_ctl(epoll_fd, EPOLL_CTL_ADD, trx.ctrl_if.sock.fileno(), &ee)
@@ -482,9 +484,9 @@
# _Handler represents how POLLIN event on an fd should be handled.
cdef class _Handler:
cdef _HandlerKind kind
- cdef object trx # Tranceiver | None
+ cdef Transceiver trx # | None
- def __cinit__(self, _HandlerKind kind, trx):
+ def __cinit__(self, _HandlerKind kind, Transceiver trx):
self.kind = kind
self.trx = trx
_hkeepalive.append(self) # so that _heventdef works without special care
diff --git a/src/target/trx_toolkit/burst_fwd.pxd b/src/target/trx_toolkit/burst_fwd.pxd
index eb3d60b..43b788c 100644
--- a/src/target/trx_toolkit/burst_fwd.pxd
+++ b/src/target/trx_toolkit/burst_fwd.pxd
@@ -1,6 +1,8 @@
# cython: language_level=3
-cdef class BurstForwarder:
- cdef list trx_list # [] of Transceiver
+from transceiver cimport Transceiver
- cdef forward_msg(self, src_trx, rx_msg)
+cdef class BurstForwarder:
+ cdef list[Transceiver] trx_list
+
+ cdef forward_msg(self, Transceiver src_trx, rx_msg)
diff --git a/src/target/trx_toolkit/burst_fwd.pyx b/src/target/trx_toolkit/burst_fwd.pyx
index 2c63187..4c8a0ef 100644
--- a/src/target/trx_toolkit/burst_fwd.pyx
+++ b/src/target/trx_toolkit/burst_fwd.pyx
@@ -43,7 +43,7 @@
def __cinit__(self, list trx_list):
self.trx_list = trx_list
- cdef forward_msg(self, src_trx, rx_msg):
+ cdef forward_msg(self, Transceiver src_trx, rx_msg):
# Originating Transceiver may use frequency hopping,
# so let's precalculate its Tx frequency in advance
tx_freq = src_trx.get_tx_freq(rx_msg.fn)
@@ -52,6 +52,7 @@
rx_msg.burst = None # burst bits are omited
# Iterate over all known transceivers
+ cdef Transceiver trx
for trx in self.trx_list:
if trx is src_trx:
continue
diff --git a/src/target/trx_toolkit/transceiver.pxd
b/src/target/trx_toolkit/transceiver.pxd
new file mode 100644
index 0000000..5fd6bc6
--- /dev/null
+++ b/src/target/trx_toolkit/transceiver.pxd
@@ -0,0 +1,51 @@
+# cython: language_level=3
+
+from data_if cimport DATAInterface
+from burst_fwd cimport BurstForwarder
+from _clck_gen cimport CLCKGen
+
+
+cdef class Transceiver:
+ cdef public:
+ # Connection info
+ str remote_addr
+ str bind_addr
+ int base_port
+ int child_idx
+ bint child_mgt
+
+ object name # str | None
+
+ # CLCKGen we are running under
+ CLCKGen clck_gen # | None
+
+ # List of child transceivers
+ object child_trx_list # TRXList
+
+ # Actual RX / TX frequencies
+ object _rx_freq # None if unset
+ object _tx_freq # None if unset
+
+ bint rf_muted
+
+ # Optional Power Measurement interface
+ object pwr_meas # FakePM | None
+
+ # Frequency hopping parameters (set by CTRL)
+ object fh # HoppingParams | None
+
+ # Internal state
+ bint running
+
+ DATAInterface data_if
+ object ctrl_if # CTRLInterfaceTRX
+ object clck_if # UDPLink
+
+ list _tx_queue # [] of TxMsg
+
+
+ cdef get_rx_freq(self, fn)
+ cpdef get_tx_freq(self, fn)
+
+ cdef recv_data_msg(self)
+ cdef clck_tick(self, BurstForwarder fwd, fn)
diff --git a/src/target/trx_toolkit/transceiver.pyx
b/src/target/trx_toolkit/transceiver.pyx
index 2918d54..cf67879 100644
--- a/src/target/trx_toolkit/transceiver.pyx
+++ b/src/target/trx_toolkit/transceiver.pyx
@@ -22,14 +22,12 @@
import logging as log
from ctrl_if_trx import CTRLInterfaceTRX
-from data_if cimport DATAInterface
-from burst_fwd cimport BurstForwarder
from udp_link cimport UDPLink
from trx_list import TRXList
from gsm_shared import HoppingParams
-class Transceiver:
+cdef class Transceiver:
""" Base transceiver implementation.
Represents a single transceiver, that can be used as for the BTS side,
@@ -144,6 +142,12 @@
"""
+ def __cinit__(self):
+ self._rx_freq = None
+ self._tx_freq = None
+ self.rf_muted = False
+ self.running = False
+
def __init__(self, bind_addr, remote_addr, base_port, **kwargs):
# Connection info
self.remote_addr = remote_addr
@@ -181,13 +185,6 @@
# Optional Power Measurement interface
self.pwr_meas = kwargs.get("pwr_meas", None)
- # Internal state
- self.running = False
-
- # Actual RX / TX frequencies
- self._rx_freq = None
- self._tx_freq = None
-
# Frequency hopping parameters (set by CTRL)
self.fh = None
@@ -216,7 +213,7 @@
return True
- def get_rx_freq(self, fn):
+ cdef get_rx_freq(self, fn):
if self.fh is None:
return self._rx_freq
@@ -224,7 +221,7 @@
(rx_freq, _) = self.fh.resolve(fn)
return rx_freq
- def get_tx_freq(self, fn):
+ cpdef get_tx_freq(self, fn):
if self.fh is None:
return self._tx_freq
@@ -253,6 +250,7 @@
else:
trx_list = [self]
# Update self and optionally child transceivers
+ cdef Transceiver trx
for trx in trx_list:
trx.running = poweron
if not poweron:
@@ -276,7 +274,7 @@
log.info("Stopping clock generator")
self.clck_gen.stop()
- def recv_data_msg(self):
+ cdef recv_data_msg(self):
# Read and parse data from socket
msg = self.data_if.recv_tx_msg()
if not msg:
@@ -296,7 +294,7 @@
# TODO: make legacy mode configurable (via argv?)
self.data_if.send_msg(msg, legacy = True)
- def clck_tick(self, BurstForwarder fwd, fn):
+ cdef clck_tick(self, BurstForwarder fwd, fn):
if not self.running:
return
--
To view, visit
https://gerrit.osmocom.org/c/osmocom-bb/+/40066?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: Ic7039451136b04dacfaf839b21f11b300f579603
Gerrit-Change-Number: 40066
Gerrit-PatchSet: 1
Gerrit-Owner: kirr <kirr(a)nexedi.com>
Gerrit-CC: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-CC: osmith <osmith(a)sysmocom.de>
Gerrit-CC: pespin <pespin(a)sysmocom.de>