Internal interface config handling for RNodeMultiInterface
This commit is contained in:
parent
bf633bba5d
commit
996161e2f4
|
@ -163,6 +163,7 @@ class KISS():
|
||||||
|
|
||||||
class RNodeMultiInterface(Interface):
|
class RNodeMultiInterface(Interface):
|
||||||
MAX_CHUNK = 32768
|
MAX_CHUNK = 32768
|
||||||
|
DEFAULT_IFAC_SIZE = 8
|
||||||
|
|
||||||
CALLSIGN_MAX_LEN = 32
|
CALLSIGN_MAX_LEN = 32
|
||||||
|
|
||||||
|
@ -173,7 +174,7 @@ class RNodeMultiInterface(Interface):
|
||||||
|
|
||||||
MAX_SUBINTERFACES = 11
|
MAX_SUBINTERFACES = 11
|
||||||
|
|
||||||
def __init__(self, owner, name, port, subint_config, id_interval = None, id_callsign = None):
|
def __init__(self, owner, configuration):
|
||||||
if RNS.vendor.platformutils.is_android():
|
if RNS.vendor.platformutils.is_android():
|
||||||
raise SystemError("Invalid interface type. The Android-specific RNode interface must be used on Android")
|
raise SystemError("Invalid interface type. The Android-specific RNode interface must be used on Android")
|
||||||
|
|
||||||
|
@ -187,6 +188,77 @@ class RNodeMultiInterface(Interface):
|
||||||
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
c = configuration
|
||||||
|
name = c["name"]
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
enabled_count = 0
|
||||||
|
|
||||||
|
# Count how many interfaces are in the file
|
||||||
|
for subinterface in c:
|
||||||
|
# if the retrieved entry is not a string, it must be a dictionary, which is what we want
|
||||||
|
if not isinstance(c[subinterface], str):
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
# Count how many interfaces are enabled to allow for appropriate matrix sizing
|
||||||
|
for subinterface in c:
|
||||||
|
# if the retrieved entry is not a string, it must be a dictionary, which is what we want
|
||||||
|
if not isinstance(c[subinterface], str):
|
||||||
|
subinterface_config = self.config["interfaces"][name][subinterface]
|
||||||
|
if (("interface_enabled" in subinterface_config) and subinterface_config.as_bool("interface_enabled") == True) or (("enabled" in c) and c.as_bool("enabled") == True):
|
||||||
|
enabled_count += 1
|
||||||
|
|
||||||
|
# Create an array with a row for each subinterface
|
||||||
|
subint_config = [[0 for x in range(11)] for y in range(enabled_count)]
|
||||||
|
subint_index = 0
|
||||||
|
|
||||||
|
for subinterface in c:
|
||||||
|
# If the retrieved entry is not a string, it must be a dictionary, which is what we want
|
||||||
|
if not isinstance(c[subinterface], str):
|
||||||
|
subinterface_config = self.config["interfaces"][name][subinterface]
|
||||||
|
if (("interface_enabled" in subinterface_config) and subinterface_config.as_bool("interface_enabled") == True) or (("enabled" in c) and c.as_bool("enabled") == True):
|
||||||
|
subint_config[subint_index][0] = subinterface
|
||||||
|
|
||||||
|
subint_vport = subinterface_config["vport"] if "vport" in subinterface_config else None
|
||||||
|
subint_config[subint_index][1] = subint_vport
|
||||||
|
|
||||||
|
frequency = int(subinterface_config["frequency"]) if "frequency" in subinterface_config else None
|
||||||
|
subint_config[subint_index][2] = frequency
|
||||||
|
bandwidth = int(subinterface_config["bandwidth"]) if "bandwidth" in subinterface_config else None
|
||||||
|
subint_config[subint_index][3] = bandwidth
|
||||||
|
txpower = int(subinterface_config["txpower"]) if "txpower" in subinterface_config else None
|
||||||
|
subint_config[subint_index][4] = txpower
|
||||||
|
spreadingfactor = int(subinterface_config["spreadingfactor"]) if "spreadingfactor" in subinterface_config else None
|
||||||
|
subint_config[subint_index][5] = spreadingfactor
|
||||||
|
codingrate = int(subinterface_config["codingrate"]) if "codingrate" in subinterface_config else None
|
||||||
|
subint_config[subint_index][6] = codingrate
|
||||||
|
flow_control = subinterface_config.as_bool("flow_control") if "flow_control" in subinterface_config else False
|
||||||
|
subint_config[subint_index][7] = flow_control
|
||||||
|
st_alock = float(subinterface_config["airtime_limit_short"]) if "airtime_limit_short" in subinterface_config else None
|
||||||
|
subint_config[subint_index][8] = st_alock
|
||||||
|
lt_alock = float(subinterface_config["airtime_limit_long"]) if "airtime_limit_long" in subinterface_config else None
|
||||||
|
subint_config[subint_index][9] = lt_alock
|
||||||
|
|
||||||
|
if "outgoing" in subinterface_config and subinterface_config.as_bool("outgoing") == False:
|
||||||
|
subint_config[subint_index][10] = False
|
||||||
|
else:
|
||||||
|
subint_config[subint_index][10] = True
|
||||||
|
subint_index += 1
|
||||||
|
|
||||||
|
# if no subinterfaces are defined
|
||||||
|
if count == 0:
|
||||||
|
raise ValueError("No subinterfaces configured for "+name)
|
||||||
|
# if no subinterfaces are enabled
|
||||||
|
elif enabled_count == 0:
|
||||||
|
raise ValueError("No subinterfaces enabled for "+name)
|
||||||
|
|
||||||
|
id_interval = int(c["id_interval"]) if "id_interval" in c else None
|
||||||
|
id_callsign = c["id_callsign"] if "id_callsign" in c else None
|
||||||
|
port = c["port"] if "port" in c else None
|
||||||
|
|
||||||
|
if port == None:
|
||||||
|
raise ValueError("No port specified for "+name)
|
||||||
|
|
||||||
self.HW_MTU = 508
|
self.HW_MTU = 508
|
||||||
|
|
||||||
self.clients = 0
|
self.clients = 0
|
||||||
|
|
|
@ -635,96 +635,8 @@ class Reticulum:
|
||||||
interface_post_init(interface)
|
interface_post_init(interface)
|
||||||
|
|
||||||
if c["type"] == "RNodeMultiInterface":
|
if c["type"] == "RNodeMultiInterface":
|
||||||
count = 0
|
interface = RNodeMultiInterface.RNodeMultiInterface(RNS.Transport, interface_config)
|
||||||
enabled_count = 0
|
interface_post_init(interface)
|
||||||
|
|
||||||
# Count how many interfaces are in the file
|
|
||||||
for subinterface in c:
|
|
||||||
# if the retrieved entry is not a string, it must be a dictionary, which is what we want
|
|
||||||
if not isinstance(c[subinterface], str):
|
|
||||||
count += 1
|
|
||||||
|
|
||||||
# Count how many interfaces are enabled to allow for appropriate matrix sizing
|
|
||||||
for subinterface in c:
|
|
||||||
# if the retrieved entry is not a string, it must be a dictionary, which is what we want
|
|
||||||
if not isinstance(c[subinterface], str):
|
|
||||||
subinterface_config = self.config["interfaces"][name][subinterface]
|
|
||||||
if (("interface_enabled" in subinterface_config) and subinterface_config.as_bool("interface_enabled") == True) or (("enabled" in c) and c.as_bool("enabled") == True):
|
|
||||||
enabled_count += 1
|
|
||||||
|
|
||||||
# Create an array with a row for each subinterface
|
|
||||||
subint_config = [[0 for x in range(11)] for y in range(enabled_count)]
|
|
||||||
subint_index = 0
|
|
||||||
|
|
||||||
for subinterface in c:
|
|
||||||
# If the retrieved entry is not a string, it must be a dictionary, which is what we want
|
|
||||||
if not isinstance(c[subinterface], str):
|
|
||||||
subinterface_config = self.config["interfaces"][name][subinterface]
|
|
||||||
if (("interface_enabled" in subinterface_config) and subinterface_config.as_bool("interface_enabled") == True) or (("enabled" in c) and c.as_bool("enabled") == True):
|
|
||||||
subint_config[subint_index][0] = subinterface
|
|
||||||
|
|
||||||
subint_vport = subinterface_config["vport"] if "vport" in subinterface_config else None
|
|
||||||
subint_config[subint_index][1] = subint_vport
|
|
||||||
|
|
||||||
frequency = int(subinterface_config["frequency"]) if "frequency" in subinterface_config else None
|
|
||||||
subint_config[subint_index][2] = frequency
|
|
||||||
bandwidth = int(subinterface_config["bandwidth"]) if "bandwidth" in subinterface_config else None
|
|
||||||
subint_config[subint_index][3] = bandwidth
|
|
||||||
txpower = int(subinterface_config["txpower"]) if "txpower" in subinterface_config else None
|
|
||||||
subint_config[subint_index][4] = txpower
|
|
||||||
spreadingfactor = int(subinterface_config["spreadingfactor"]) if "spreadingfactor" in subinterface_config else None
|
|
||||||
subint_config[subint_index][5] = spreadingfactor
|
|
||||||
codingrate = int(subinterface_config["codingrate"]) if "codingrate" in subinterface_config else None
|
|
||||||
subint_config[subint_index][6] = codingrate
|
|
||||||
flow_control = subinterface_config.as_bool("flow_control") if "flow_control" in subinterface_config else False
|
|
||||||
subint_config[subint_index][7] = flow_control
|
|
||||||
st_alock = float(subinterface_config["airtime_limit_short"]) if "airtime_limit_short" in subinterface_config else None
|
|
||||||
subint_config[subint_index][8] = st_alock
|
|
||||||
lt_alock = float(subinterface_config["airtime_limit_long"]) if "airtime_limit_long" in subinterface_config else None
|
|
||||||
subint_config[subint_index][9] = lt_alock
|
|
||||||
|
|
||||||
if "outgoing" in subinterface_config and subinterface_config.as_bool("outgoing") == False:
|
|
||||||
subint_config[subint_index][10] = False
|
|
||||||
else:
|
|
||||||
subint_config[subint_index][10] = True
|
|
||||||
subint_index += 1
|
|
||||||
|
|
||||||
# if no subinterfaces are defined
|
|
||||||
if count == 0:
|
|
||||||
raise ValueError("No subinterfaces configured for "+name)
|
|
||||||
# if no subinterfaces are enabled
|
|
||||||
elif enabled_count == 0:
|
|
||||||
raise ValueError("No subinterfaces enabled for "+name)
|
|
||||||
|
|
||||||
id_interval = int(c["id_interval"]) if "id_interval" in c else None
|
|
||||||
id_callsign = c["id_callsign"] if "id_callsign" in c else None
|
|
||||||
port = c["port"] if "port" in c else None
|
|
||||||
|
|
||||||
if port == None:
|
|
||||||
raise ValueError("No port specified for "+name)
|
|
||||||
|
|
||||||
interface = RNodeMultiInterface.RNodeMultiInterface(
|
|
||||||
RNS.Transport,
|
|
||||||
name,
|
|
||||||
port,
|
|
||||||
subint_config,
|
|
||||||
id_interval = id_interval,
|
|
||||||
id_callsign = id_callsign
|
|
||||||
)
|
|
||||||
|
|
||||||
interface.IN = False
|
|
||||||
interface.OUT = False
|
|
||||||
|
|
||||||
interface.mode = interface_mode
|
|
||||||
|
|
||||||
interface.announce_cap = announce_cap
|
|
||||||
if configured_bitrate:
|
|
||||||
interface.bitrate = configured_bitrate
|
|
||||||
if ifac_size != None:
|
|
||||||
interface.ifac_size = ifac_size
|
|
||||||
else:
|
|
||||||
interface.ifac_size = 8
|
|
||||||
|
|
||||||
|
|
||||||
if interface != None:
|
if interface != None:
|
||||||
interface.announce_rate_target = announce_rate_target
|
interface.announce_rate_target = announce_rate_target
|
||||||
|
|
|
@ -493,89 +493,89 @@ Multi interface can be used to configure sub-interfaces individually.
|
||||||
# id_interval = 600
|
# id_interval = 600
|
||||||
|
|
||||||
# A subinterface
|
# A subinterface
|
||||||
[[[HIGHDATARATE]]]
|
[[[High Datarate]]]
|
||||||
# Subinterfaces can be enabled and disabled in of themselves
|
# Subinterfaces can be enabled and disabled in of themselves
|
||||||
interface_enabled = True
|
interface_enabled = True
|
||||||
|
|
||||||
# Set frequency to 2.4GHz
|
# Set frequency to 2.4GHz
|
||||||
frequency = 2400000000
|
frequency = 2400000000
|
||||||
|
|
||||||
# Set LoRa bandwidth to 1625 KHz
|
# Set LoRa bandwidth to 1625 KHz
|
||||||
bandwidth = 1625000
|
bandwidth = 1625000
|
||||||
|
|
||||||
# Set TX power to 0 dBm (0.12 mW)
|
# Set TX power to 0 dBm (0.12 mW)
|
||||||
txpower = 0
|
txpower = 0
|
||||||
|
|
||||||
# The virtual port, only the manufacturer
|
# The virtual port, only the manufacturer
|
||||||
# or the person who wrote the board config
|
# or the person who wrote the board config
|
||||||
# can tell you what it will be for which
|
# can tell you what it will be for which
|
||||||
# physical hardware interface
|
# physical hardware interface
|
||||||
vport = 1
|
vport = 1
|
||||||
|
|
||||||
# Select spreading factor 5. Valid
|
# Select spreading factor 5. Valid
|
||||||
# range is 5 through 12, with 5
|
# range is 5 through 12, with 5
|
||||||
# being the fastest and 12 having
|
# being the fastest and 12 having
|
||||||
# the longest range.
|
# the longest range.
|
||||||
spreadingfactor = 5
|
spreadingfactor = 5
|
||||||
|
|
||||||
# Select coding rate 5. Valid range
|
# Select coding rate 5. Valid range
|
||||||
# is 5 throough 8, with 5 being the
|
# is 5 throough 8, with 5 being the
|
||||||
# fastest, and 8 the longest range.
|
# fastest, and 8 the longest range.
|
||||||
codingrate = 5
|
codingrate = 5
|
||||||
|
|
||||||
# It is possible to limit the airtime
|
# It is possible to limit the airtime
|
||||||
# utilisation of an RNode by using the
|
# utilisation of an RNode by using the
|
||||||
# following two configuration options.
|
# following two configuration options.
|
||||||
# The short-term limit is applied in a
|
# The short-term limit is applied in a
|
||||||
# window of approximately 15 seconds,
|
# window of approximately 15 seconds,
|
||||||
# and the long-term limit is enforced
|
# and the long-term limit is enforced
|
||||||
# over a rolling 60 minute window. Both
|
# over a rolling 60 minute window. Both
|
||||||
# options are specified in percent.
|
# options are specified in percent.
|
||||||
|
|
||||||
# airtime_limit_long = 100
|
# airtime_limit_long = 100
|
||||||
# airtime_limit_short = 100
|
# airtime_limit_short = 100
|
||||||
|
|
||||||
[[[LOWDATARATE]]]
|
[[[Low Datarate]]]
|
||||||
# Subinterfaces can be enabled and disabled in of themselves
|
# Subinterfaces can be enabled and disabled in of themselves
|
||||||
interface_enabled = True
|
interface_enabled = True
|
||||||
|
|
||||||
# Set frequency to 865.6 MHz
|
# Set frequency to 865.6 MHz
|
||||||
frequency = 865600000
|
frequency = 865600000
|
||||||
|
|
||||||
# The virtual port, only the manufacturer
|
# The virtual port, only the manufacturer
|
||||||
# or the person who wrote the board config
|
# or the person who wrote the board config
|
||||||
# can tell you what it will be for which
|
# can tell you what it will be for which
|
||||||
# physical hardware interface
|
# physical hardware interface
|
||||||
vport = 0
|
vport = 0
|
||||||
|
|
||||||
# Set LoRa bandwidth to 125 KHz
|
# Set LoRa bandwidth to 125 KHz
|
||||||
bandwidth = 125000
|
bandwidth = 125000
|
||||||
|
|
||||||
# Set TX power to 0 dBm (0.12 mW)
|
# Set TX power to 0 dBm (0.12 mW)
|
||||||
txpower = 0
|
txpower = 0
|
||||||
|
|
||||||
# Select spreading factor 7. Valid
|
# Select spreading factor 7. Valid
|
||||||
# range is 5 through 12, with 5
|
# range is 5 through 12, with 5
|
||||||
# being the fastest and 12 having
|
# being the fastest and 12 having
|
||||||
# the longest range.
|
# the longest range.
|
||||||
spreadingfactor = 7
|
spreadingfactor = 7
|
||||||
|
|
||||||
# Select coding rate 5. Valid range
|
# Select coding rate 5. Valid range
|
||||||
# is 5 throough 8, with 5 being the
|
# is 5 throough 8, with 5 being the
|
||||||
# fastest, and 8 the longest range.
|
# fastest, and 8 the longest range.
|
||||||
codingrate = 5
|
codingrate = 5
|
||||||
|
|
||||||
# It is possible to limit the airtime
|
# It is possible to limit the airtime
|
||||||
# utilisation of an RNode by using the
|
# utilisation of an RNode by using the
|
||||||
# following two configuration options.
|
# following two configuration options.
|
||||||
# The short-term limit is applied in a
|
# The short-term limit is applied in a
|
||||||
# window of approximately 15 seconds,
|
# window of approximately 15 seconds,
|
||||||
# and the long-term limit is enforced
|
# and the long-term limit is enforced
|
||||||
# over a rolling 60 minute window. Both
|
# over a rolling 60 minute window. Both
|
||||||
# options are specified in percent.
|
# options are specified in percent.
|
||||||
|
|
||||||
# airtime_limit_long = 100
|
# airtime_limit_long = 100
|
||||||
# airtime_limit_short = 100
|
# airtime_limit_short = 100
|
||||||
|
|
||||||
.. _interfaces-serial:
|
.. _interfaces-serial:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue