kirr has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/40070?usp=email )
Change subject: trx_toolkit/_fake_trx: Switch FakeTRX to cdef class ......................................................................
trx_toolkit/_fake_trx: Switch FakeTRX to cdef class
- Put fields into the object struct; fields are now accessed directly via that C-level struct instead of via __dict__ lookup - switch to invoke several internal FakeTRX functions via C-level where appropriate. - switch Transceiver.handle_data_msg from cpdef to cdef as now the only was-py implementation of that function (FakeTRX) was switched to C. - leave generating random data via C as TODO
Change-Id: I12a7cff29dd86d199d77827f448eaaad537ce594 --- M src/target/trx_toolkit/_fake_trx.pyx M src/target/trx_toolkit/transceiver.pxd M src/target/trx_toolkit/transceiver.pyx 3 files changed, 46 insertions(+), 26 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/70/40070/1
diff --git a/src/target/trx_toolkit/_fake_trx.pyx b/src/target/trx_toolkit/_fake_trx.pyx index c14895b..5881cd1 100644 --- a/src/target/trx_toolkit/_fake_trx.pyx +++ b/src/target/trx_toolkit/_fake_trx.pyx @@ -26,7 +26,10 @@ from transceiver cimport Transceiver from data_msg import Modulation from udp_link cimport _raise_oserr -from gsm_shared import * +import gsm_shared +cdef object TrainingSeqGMSK = gsm_shared.TrainingSeqGMSK + +from cython cimport final
cdef int NOMINAL_TX_POWER_DEFAULT = 50 # dBm @@ -41,7 +44,8 @@ cdef int RSSI_NOISE_DEFAULT = -110 cdef int CI_NOISE_DEFAULT = -30
-class FakeTRX(Transceiver): +@final +cdef class FakeTRX(Transceiver): """ Fake transceiver with RF path (burst loss, RSSI, TA, ToA) simulation.
== ToA / RSSI measurement simulation @@ -106,6 +110,22 @@
"""
+ cdef public: + bint fake_rssi_enabled + int tx_power_base + int tx_att_base + int toa256_base + int rssi_base + int ci_base + int ta + + int toa256_rand_threshold + int rssi_rand_threshold + int ci_rand_threshold + + int burst_drop_amount + int burst_drop_period + def __init__(self, *trx_args, **trx_kwargs): Transceiver.__init__(self, *trx_args, **trx_kwargs)
@@ -130,8 +150,7 @@ self.burst_drop_amount = 0 self.burst_drop_period = 1
- @property - def toa256(self): + cdef int toa256(self) except -1: # Check if randomization is required if self.toa256_rand_threshold == 0: return self.toa256_base @@ -139,10 +158,9 @@ # Generate a random ToA value in required range toa256_min = self.toa256_base - self.toa256_rand_threshold toa256_max = self.toa256_base + self.toa256_rand_threshold - return random.randint(toa256_min, toa256_max) + return random.randint(toa256_min, toa256_max) # TODO -> C
- @property - def rssi(self): + cdef int rssi(self) except *: # Check if randomization is required if self.rssi_rand_threshold == 0: return self.rssi_base @@ -150,14 +168,12 @@ # Generate a random RSSI value in required range rssi_min = self.rssi_base - self.rssi_rand_threshold rssi_max = self.rssi_base + self.rssi_rand_threshold - return random.randint(rssi_min, rssi_max) + return random.randint(rssi_min, rssi_max) # TODO -> C
- @property - def tx_power(self): + cdef int tx_power(self) noexcept: return self.tx_power_base - self.tx_att_base
- @property - def ci(self): + cdef int ci(self) except *: # Check if randomization is required if self.ci_rand_threshold == 0: return self.ci_base @@ -165,11 +181,11 @@ # Generate a random C/I value in required range ci_min = self.ci_base - self.ci_rand_threshold ci_max = self.ci_base + self.ci_rand_threshold - return random.randint(ci_min, ci_max) + return random.randint(ci_min, ci_max) # TODO -> C
# Path loss simulation: burst dropping # Returns: True - drop, False - keep - def sim_burst_drop(self, msg): + cdef bint sim_burst_drop(self, msg) except *: # Check if dropping is required if self.burst_drop_amount == 0: return False @@ -182,9 +198,9 @@
return False
- def _handle_data_msg_v1(self, src_msg, msg): + cdef _handle_data_msg_v1(self, src_msg, msg): # C/I (Carrier-to-Interference ratio) - msg.ci = self.ci + msg.ci = self.ci()
# Pick modulation type by burst length bl = len(src_msg.burst) @@ -192,7 +208,7 @@
# Pick TSC (Training Sequence Code) and TSC set if msg.mod_type is Modulation.ModGMSK: - ss = TrainingSeqGMSK.pick(src_msg.burst) + ss = TrainingSeqGMSK.pick(src_msg.burst) # TODO -> pyx msg.tsc = ss.tsc if ss is not None else 0 msg.tsc_set = ss.tsc_set if ss is not None else 0 else: # TODO: other modulation types (at least 8-PSK) @@ -202,7 +218,7 @@ # Takes (partially initialized) TRXD Rx message, # simulates RF path parameters (such as RSSI), # and sends towards the L1 - def handle_data_msg(self, Transceiver src_trx, src_msg, msg): + cdef handle_data_msg(self, Transceiver src_trx, src_msg, msg): if self.rf_muted: msg.nope_ind = True elif not msg.nope_ind: @@ -226,21 +242,25 @@ return
# Complete message header - msg.toa256 = self.toa256 + msg.toa256 = self.toa256() + + cdef FakeTRX src_faketrx = None + if isinstance(src_trx, FakeTRX): + src_faketrx = src_trx
# Apply RSSI based on transmitter: - if not self.fake_rssi_enabled: - msg.rssi = src_trx.tx_power - src_msg.pwr - PATH_LOSS_DEFAULT + if not self.fake_rssi_enabled and src_faketrx is not None: + msg.rssi = src_faketrx.tx_power() - src_msg.pwr - PATH_LOSS_DEFAULT else: # Apply fake RSSI - msg.rssi = self.rssi + msg.rssi = self.rssi()
# Version specific fields if msg.ver >= 0x01: self._handle_data_msg_v1(src_msg, msg)
# Apply optional Timing Advance - if src_trx.ta != 0: - msg.toa256 -= src_trx.ta * 256 + if src_faketrx is not None and src_faketrx.ta != 0: + msg.toa256 -= src_faketrx.ta * 256
Transceiver.send_data_msg(self, msg)
diff --git a/src/target/trx_toolkit/transceiver.pxd b/src/target/trx_toolkit/transceiver.pxd index b76fa24..74ee982 100644 --- a/src/target/trx_toolkit/transceiver.pxd +++ b/src/target/trx_toolkit/transceiver.pxd @@ -49,5 +49,5 @@
cdef recv_data_msg(self) cdef send_data_msg(self, msg) - cpdef handle_data_msg(self, Transceiver src_trx, src_msg, msg) + cdef handle_data_msg(self, Transceiver src_trx, src_msg, msg) cdef clck_tick(self, BurstForwarder fwd, fn) diff --git a/src/target/trx_toolkit/transceiver.pyx b/src/target/trx_toolkit/transceiver.pyx index 8f8c9c6..19bdd09 100644 --- a/src/target/trx_toolkit/transceiver.pyx +++ b/src/target/trx_toolkit/transceiver.pyx @@ -294,7 +294,7 @@ # TODO: make legacy mode configurable (via argv?) self.data_if.send_msg(msg, legacy = True)
- cpdef handle_data_msg(self, Transceiver src_trx, src_msg, msg): + cdef handle_data_msg(self, Transceiver src_trx, src_msg, msg): self.send_data_msg(msg)
cdef clck_tick(self, BurstForwarder fwd, fn):