fake_trx: Support SETPOWER and NOMTXPOWER TRXC cmds

By default RSSI on the Rx side is computed based on transmitter's
tx power and then substracting the the Rx path loss.
If FAKE_RSSI is used, then the values in there are used instead.

A default hardcoded value of tx nominal power = 50 dBm is set to keep
old behavior of RSSI=-60dB after calculations.

Change-Id: I3ee1a32ca22c3272e66b3ca78e4f67d283844c80
This commit is contained in:
Pau Espin 2020-06-03 15:28:11 +02:00
parent 0ed7c0ee5f
commit 3ca971eb2e
2 changed files with 40 additions and 3 deletions

View File

@ -239,6 +239,19 @@ class CTRLInterfaceTRX(CTRLInterface):
% (self.trx, ver_cur, ver_req))
return ver_req
# Set Power Attenuation
if self.verify_cmd(request, "SETPOWER", 1):
log.debug("(%s) Recv SETPOWER cmd" % self.trx)
# Parse the requested Tx Power Attenuation
att_req = int(request[1])
self.trx.tx_att_base = att_req
return 0
# Retrieve Nominal Tx power
if self.verify_cmd(request, "NOMTXPOWER", 0):
log.debug("(%s) Recv NOMTXPOWER cmd" % self.trx)
return (0, [str(self.trx.tx_power_base)])
# Wrong / unknown command
else:
# We don't care about other commands,

View File

@ -106,8 +106,11 @@ class FakeTRX(Transceiver):
"""
NOMINAL_TX_POWER_DEFAULT = 50 # dBm
TX_ATT_DEFAULT = 0 # dB
PATH_LOSS_DEFAULT = 110 # dB
TOA256_BASE_DEFAULT = 0
RSSI_BASE_DEFAULT = -60
CI_BASE_DEFAULT = 90
# Default values for NOPE / IDLE indications
@ -118,9 +121,15 @@ class FakeTRX(Transceiver):
def __init__(self, *trx_args, **trx_kwargs):
Transceiver.__init__(self, *trx_args, **trx_kwargs)
# fake RSSI is disabled by default, only enabled through TRXC FAKE_RSSI.
# When disabled, RSSI is calculated based on Tx power and Rx path loss
self.fake_rssi_enabled = False
# Actual ToA, RSSI, C/I, TA values
self.tx_power_base = self.NOMINAL_TX_POWER_DEFAULT
self.tx_att_base = self.TX_ATT_DEFAULT
self.toa256_base = self.TOA256_BASE_DEFAULT
self.rssi_base = self.RSSI_BASE_DEFAULT
self.rssi_base = self.NOMINAL_TX_POWER_DEFAULT - self.TX_ATT_DEFAULT - self.PATH_LOSS_DEFAULT
self.ci_base = self.CI_BASE_DEFAULT
self.ta = 0
@ -155,6 +164,10 @@ class FakeTRX(Transceiver):
rssi_max = self.rssi_base + self.rssi_rand_threshold
return random.randint(rssi_min, rssi_max)
@property
def tx_power(self):
return self.tx_power_base - self.tx_att_base
@property
def ci(self):
# Check if randomization is required
@ -224,7 +237,12 @@ class FakeTRX(Transceiver):
# Complete message header
msg.toa256 = self.toa256
msg.rssi = self.rssi
# Apply RSSI based on transmitter:
if not self.fake_rssi_enabled:
msg.rssi = src_trx.tx_power - src_msg.pwr - self.PATH_LOSS_DEFAULT
else: # Apply fake RSSI
msg.rssi = self.rssi
# Version specific fields
if msg.ver >= 0x01:
@ -272,9 +290,15 @@ class FakeTRX(Transceiver):
elif self.ctrl_if.verify_cmd(request, "FAKE_RSSI", 2):
log.debug("(%s) Recv FAKE_RSSI cmd" % self)
# Use negative threshold to disable fake_rssi if previously enabled:
if int(request[2]) < 0:
self.fake_rssi_enabled = False
return 0
# Parse and apply both base and threshold
self.rssi_base = int(request[1])
self.rssi_rand_threshold = int(request[2])
self.fake_rssi_enabled = True
return 0
# RSSI simulation