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):
--
To view, visit
https://gerrit.osmocom.org/c/osmocom-bb/+/40070?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: I12a7cff29dd86d199d77827f448eaaad537ce594
Gerrit-Change-Number: 40070
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>