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