Compare commits

..

No commits in common. "760ab981d064769b2eb1273933317adee9f8363f" and "e2efc6120822a41b0dce11aff3999b0bb484986f" have entirely different histories.

12 changed files with 429 additions and 325 deletions

View File

@ -59,7 +59,6 @@ class AX25():
class AX25KISSInterface(Interface): class AX25KISSInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
BITRATE_GUESS = 1200 BITRATE_GUESS = 1200
DEFAULT_IFAC_SIZE = 8
owner = None owner = None
port = None port = None
@ -69,7 +68,7 @@ class AX25KISSInterface(Interface):
stopbits = None stopbits = None
serial = None serial = None
def __init__(self, owner, configuration): def __init__(self, owner, name, callsign, ssid, port, speed, databits, parity, stopbits, preamble, txtail, persistence, slottime, flow_control):
import importlib import importlib
if importlib.util.find_spec('serial') != None: if importlib.util.find_spec('serial') != None:
import serial import serial
@ -80,25 +79,6 @@ class AX25KISSInterface(Interface):
super().__init__() super().__init__()
c = configuration
name = c["name"]
preamble = int(c["preamble"]) if "preamble" in c else None
txtail = int(c["txtail"]) if "txtail" in c else None
persistence = int(c["persistence"]) if "persistence" in c else None
slottime = int(c["slottime"]) if "slottime" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
callsign = c["callsign"] if "callsign" in c else ""
ssid = int(c["ssid"]) if "ssid" in c else -1
if port == None:
raise ValueError("No port specified for serial interface")
self.HW_MTU = 564 self.HW_MTU = 564
self.pyserial = serial self.pyserial = serial

View File

@ -52,7 +52,6 @@ class KISS():
class KISSInterface(Interface): class KISSInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
BITRATE_GUESS = 1200 BITRATE_GUESS = 1200
DEFAULT_IFAC_SIZE = 8
owner = None owner = None
port = None port = None
@ -62,7 +61,7 @@ class KISSInterface(Interface):
stopbits = None stopbits = None
serial = None serial = None
def __init__(self, owner, configuration): def __init__(self, owner, name, port, speed, databits, parity, stopbits, preamble, txtail, persistence, slottime, flow_control, beacon_interval, beacon_data):
import importlib import importlib
if RNS.vendor.platformutils.is_android(): if RNS.vendor.platformutils.is_android():
self.on_android = True self.on_android = True
@ -84,21 +83,6 @@ class KISSInterface(Interface):
raise SystemError("Android-specific interface was used on non-Android OS") raise SystemError("Android-specific interface was used on non-Android OS")
super().__init__() super().__init__()
c = configuration
name = c["name"]
preamble = int(c["preamble"]) if "preamble" in c else None
txtail = int(c["txtail"]) if "txtail" in c else None
persistence = int(c["persistence"]) if "persistence" in c else None
slottime = int(c["slottime"]) if "slottime" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
beacon_interval = int(c["beacon_interval"]) if "beacon_interval" in c else None
beacon_data = c["beacon_data"] if "beacon_data" in c else None
self.HW_MTU = 564 self.HW_MTU = 564

View File

@ -238,7 +238,6 @@ class AndroidBluetoothManager():
class RNodeInterface(Interface): class RNodeInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
DEFAULT_IFAC_SIZE = 8
FREQ_MIN = 137000000 FREQ_MIN = 137000000
FREQ_MAX = 1020000000 FREQ_MAX = 1020000000
@ -342,27 +341,12 @@ class RNodeInterface(Interface):
serial.close() serial.close()
def __init__(self, owner, configuration): def __init__(
c = configuration self, owner, name, port, frequency = None, bandwidth = None, txpower = None,
name = c["name"] sf = None, cr = None, flow_control = False, id_interval = None,
allow_bluetooth = c["allow_bluetooth"] allow_bluetooth = False, target_device_name = None,
target_device_name = c["target_device_name"] target_device_address = None, id_callsign = None, st_alock = None, lt_alock = None,
target_device_address = c["target_device_address"] ble_addr = None, ble_name = None, force_ble=False):
ble_name = c["ble_name"]
ble_addr = c["ble_addr"]
force_ble = c["force_ble"]
frequency = int(c["frequency"]) if "frequency" in c else None
bandwidth = int(c["bandwidth"]) if "bandwidth" in c else None
txpower = int(c["txpower"]) if "txpower" in c else None
sf = int(c["spreadingfactor"]) if "spreadingfactor" in c else None
cr = int(c["codingrate"]) if "codingrate" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
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
st_alock = float(c["airtime_limit_short"]) if "airtime_limit_short" in c else None
lt_alock = float(c["airtime_limit_long"]) if "airtime_limit_long" in c else None
port = c["port"] if "port" in c else None
import importlib import importlib
if RNS.vendor.platformutils.is_android(): if RNS.vendor.platformutils.is_android():
self.on_android = True self.on_android = True

View File

@ -42,7 +42,6 @@ class HDLC():
class SerialInterface(Interface): class SerialInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
DEFAULT_IFAC_SIZE = 8
owner = None owner = None
port = None port = None
@ -52,7 +51,7 @@ class SerialInterface(Interface):
stopbits = None stopbits = None
serial = None serial = None
def __init__(self, owner, configuration): def __init__(self, owner, name, port, speed, databits, parity, stopbits):
import importlib import importlib
if RNS.vendor.platformutils.is_android(): if RNS.vendor.platformutils.is_android():
self.on_android = True self.on_android = True
@ -75,17 +74,6 @@ class SerialInterface(Interface):
super().__init__() super().__init__()
c = configuration
name = c["name"]
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
if port == None:
raise ValueError("No port specified for serial interface")
self.HW_MTU = 564 self.HW_MTU = 564
self.pyserial = serial self.pyserial = serial

View File

@ -829,19 +829,9 @@ class I2PInterfacePeer(Interface):
class I2PInterface(Interface): class I2PInterface(Interface):
BITRATE_GUESS = 256*1000 BITRATE_GUESS = 256*1000
DEFAULT_IFAC_SIZE = 16
def __init__(self, owner, configuration): def __init__(self, owner, name, rns_storagepath, peers, connectable = False, ifac_size = 16, ifac_netname = None, ifac_netkey = None):
super().__init__() super().__init__()
c = configuration
name = c["name"]
rns_storagepath = c["storagepath"]
peers = c.as_list("peers") if "peers" in c else None
connectable = c.as_bool("connectable") if "connectable" in c else False
ifac_size = c["ifac_size"]
ifac_netname = c["ifac_netname"]
ifac_netkey = c["ifac_netkey"]
self.HW_MTU = 1064 self.HW_MTU = 1064

View File

@ -52,7 +52,6 @@ class KISS():
class KISSInterface(Interface): class KISSInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
BITRATE_GUESS = 1200 BITRATE_GUESS = 1200
DEFAULT_IFAC_SIZE = 8
owner = None owner = None
port = None port = None
@ -62,7 +61,7 @@ class KISSInterface(Interface):
stopbits = None stopbits = None
serial = None serial = None
def __init__(self, owner, configuration): def __init__(self, owner, name, port, speed, databits, parity, stopbits, preamble, txtail, persistence, slottime, flow_control, beacon_interval, beacon_data):
import importlib import importlib
if importlib.util.find_spec('serial') != None: if importlib.util.find_spec('serial') != None:
import serial import serial
@ -72,24 +71,6 @@ class KISSInterface(Interface):
RNS.panic() RNS.panic()
super().__init__() super().__init__()
c = configuration
name = c["name"]
preamble = int(c["preamble"]) if "preamble" in c else None
txtail = int(c["txtail"]) if "txtail" in c else None
persistence = int(c["persistence"]) if "persistence" in c else None
slottime = int(c["slottime"]) if "slottime" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
beacon_interval = int(c["id_interval"]) if "id_interval" in c else None
beacon_data = c["id_callsign"] if "id_callsign" in c else None
if port == None:
raise ValueError("No port specified for serial interface")
self.HW_MTU = 564 self.HW_MTU = 564

View File

@ -46,25 +46,16 @@ class HDLC():
class PipeInterface(Interface): class PipeInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
BITRATE_GUESS = 1*1000*1000 BITRATE_GUESS = 1*1000*1000
DEFAULT_IFAC_SIZE = 8
owner = None owner = None
command = None command = None
def __init__(self, owner, configuration): def __init__(self, owner, name, command, respawn_delay):
super().__init__()
c = configuration
name = c["name"]
command = c["command"] if "command" in c else None
respawn_delay = c.as_float("respawn_delay") if "respawn_delay" in c else None
if command == None:
raise ValueError("No command specified for PipeInterface")
if respawn_delay == None: if respawn_delay == None:
respawn_delay = 5 respawn_delay = 5
super().__init__()
self.HW_MTU = 1064 self.HW_MTU = 1064
self.owner = owner self.owner = owner

View File

@ -95,7 +95,6 @@ class KISS():
class RNodeInterface(Interface): class RNodeInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
DEFAULT_IFAC_SIZE = 8
FREQ_MIN = 137000000 FREQ_MIN = 137000000
FREQ_MAX = 3000000000 FREQ_MAX = 3000000000
@ -118,7 +117,7 @@ class RNodeInterface(Interface):
BATTERY_STATE_CHARGING = 0x02 BATTERY_STATE_CHARGING = 0x02
BATTERY_STATE_CHARGED = 0x03 BATTERY_STATE_CHARGED = 0x03
def __init__(self, owner, configuration): def __init__(self, owner, name, port, frequency = None, bandwidth = None, txpower = None, sf = None, cr = None, flow_control = False, id_interval = None, id_callsign = None, st_alock = None, lt_alock = None, ble_addr = None, ble_name = None, force_ble=False):
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")
@ -132,41 +131,6 @@ class RNodeInterface(Interface):
super().__init__() super().__init__()
c = configuration
name = c["name"]
frequency = int(c["frequency"]) if "frequency" in c else None
bandwidth = int(c["bandwidth"]) if "bandwidth" in c else None
txpower = int(c["txpower"]) if "txpower" in c else None
sf = int(c["spreadingfactor"]) if "spreadingfactor" in c else None
cr = int(c["codingrate"]) if "codingrate" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
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
st_alock = float(c["airtime_limit_short"]) if "airtime_limit_short" in c else None
lt_alock = float(c["airtime_limit_long"]) if "airtime_limit_long" in c else None
force_ble = False
ble_name = None
ble_addr = None
port = c["port"] if "port" in c else None
if port == None:
raise ValueError("No port specified for RNode interface")
if port != None:
ble_uri_scheme = "ble://"
if port.lower().startswith(ble_uri_scheme):
force_ble = True
ble_string = port[len(ble_uri_scheme):]
port = None
if len(ble_string) == 0:
pass
elif len(ble_string.split(":")) == 6 and len(ble_string) == 17:
ble_addr = ble_string
else:
ble_name = ble_string
self.HW_MTU = 508 self.HW_MTU = 508
self.pyserial = serial self.pyserial = serial

View File

@ -163,7 +163,6 @@ 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
@ -174,7 +173,7 @@ class RNodeMultiInterface(Interface):
MAX_SUBINTERFACES = 11 MAX_SUBINTERFACES = 11
def __init__(self, owner, configuration): def __init__(self, owner, name, port, subint_config, id_interval = None, id_callsign = None):
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")
@ -188,77 +187,6 @@ 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

View File

@ -42,7 +42,6 @@ class HDLC():
class SerialInterface(Interface): class SerialInterface(Interface):
MAX_CHUNK = 32768 MAX_CHUNK = 32768
DEFAULT_IFAC_SIZE = 8
owner = None owner = None
port = None port = None
@ -52,7 +51,7 @@ class SerialInterface(Interface):
stopbits = None stopbits = None
serial = None serial = None
def __init__(self, owner, configuration): def __init__(self, owner, name, port, speed, databits, parity, stopbits):
import importlib import importlib
if importlib.util.find_spec('serial') != None: if importlib.util.find_spec('serial') != None:
import serial import serial
@ -63,17 +62,6 @@ class SerialInterface(Interface):
super().__init__() super().__init__()
c = configuration
name = c["name"]
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
if port == None:
raise ValueError("No port specified for serial interface")
self.HW_MTU = 564 self.HW_MTU = 564
self.pyserial = serial self.pyserial = serial

View File

@ -446,7 +446,14 @@ class Reticulum:
if "interfaces" in self.config: if "interfaces" in self.config:
for name in self.config["interfaces"]: for name in self.config["interfaces"]:
if not name in interface_names: if not name in interface_names:
# TODO: We really need to generalise this way of instantiating
# and configuring interfaces. Ideally, interfaces should just
# have a conrfig dict passed to their init method, and return
# a ready interface, onto which this routine can configure any
# generic or extra parameters.
c = self.config["interfaces"][name] c = self.config["interfaces"][name]
interface_mode = Interface.Interface.MODE_FULL interface_mode = Interface.Interface.MODE_FULL
if "interface_mode" in c: if "interface_mode" in c:
@ -595,41 +602,360 @@ class Reticulum:
interface_post_init(interface) interface_post_init(interface)
if c["type"] == "I2PInterface": if c["type"] == "I2PInterface":
i2p_peers = c.as_list("peers") if "peers" in c else None
connectable = c.as_bool("connectable") if "connectable" in c else False
if ifac_size == None:
ifac_size = 16
interface = I2PInterface.I2PInterface(
RNS.Transport,
name,
Reticulum.storagepath,
i2p_peers,
connectable = connectable,
ifac_size = ifac_size,
ifac_netname = ifac_netname,
ifac_netkey = ifac_netkey,
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
if interface_mode == Interface.Interface.MODE_ACCESS_POINT: if interface_mode == Interface.Interface.MODE_ACCESS_POINT:
RNS.log(str(interface)+" does not support Access Point mode, reverting to default mode: Full", RNS.LOG_WARNING) RNS.log(str(interface)+" does not support Access Point mode, reverting to default mode: Full", RNS.LOG_WARNING)
interface_mode = Interface.Interface.MODE_FULL interface_mode = Interface.Interface.MODE_FULL
interface.mode = interface_mode
interface_config["storagepath"] = Reticulum.storagepath interface.announce_cap = announce_cap
interface_config["ifac_netname"] = ifac_netname if configured_bitrate:
interface_config["ifac_netkey"] = ifac_netkey interface.bitrate = configured_bitrate
interface_config["ifac_size"] = ifac_size
interface = I2PInterface.I2PInterface(RNS.Transport, interface_config)
interface_post_init(interface)
if c["type"] == "SerialInterface": if c["type"] == "SerialInterface":
interface = SerialInterface.SerialInterface(RNS.Transport, interface_config) port = c["port"] if "port" in c else None
interface_post_init(interface) speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
if port == None:
raise ValueError("No port specified for serial interface")
interface = SerialInterface.SerialInterface(
RNS.Transport,
name,
port,
speed,
databits,
parity,
stopbits
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
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 c["type"] == "PipeInterface": if c["type"] == "PipeInterface":
interface = PipeInterface.PipeInterface(RNS.Transport, interface_config) command = c["command"] if "command" in c else None
interface_post_init(interface) respawn_delay = c.as_float("respawn_delay") if "respawn_delay" in c else None
if command == None:
raise ValueError("No command specified for PipeInterface")
interface = PipeInterface.PipeInterface(
RNS.Transport,
name,
command,
respawn_delay,
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
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 c["type"] == "KISSInterface": if c["type"] == "KISSInterface":
interface = KISSInterface.KISSInterface(RNS.Transport, interface_config) preamble = int(c["preamble"]) if "preamble" in c else None
interface_post_init(interface) txtail = int(c["txtail"]) if "txtail" in c else None
persistence = int(c["persistence"]) if "persistence" in c else None
slottime = int(c["slottime"]) if "slottime" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
beacon_interval = int(c["id_interval"]) if "id_interval" in c else None
beacon_data = c["id_callsign"] if "id_callsign" in c else None
if port == None:
raise ValueError("No port specified for serial interface")
interface = KISSInterface.KISSInterface(
RNS.Transport,
name,
port,
speed,
databits,
parity,
stopbits,
preamble,
txtail,
persistence,
slottime,
flow_control,
beacon_interval,
beacon_data
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
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 c["type"] == "AX25KISSInterface": if c["type"] == "AX25KISSInterface":
interface = AX25KISSInterface.AX25KISSInterface(RNS.Transport, interface_config) preamble = int(c["preamble"]) if "preamble" in c else None
interface_post_init(interface) txtail = int(c["txtail"]) if "txtail" in c else None
persistence = int(c["persistence"]) if "persistence" in c else None
slottime = int(c["slottime"]) if "slottime" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
port = c["port"] if "port" in c else None
speed = int(c["speed"]) if "speed" in c else 9600
databits = int(c["databits"]) if "databits" in c else 8
parity = c["parity"] if "parity" in c else "N"
stopbits = int(c["stopbits"]) if "stopbits" in c else 1
callsign = c["callsign"] if "callsign" in c else ""
ssid = int(c["ssid"]) if "ssid" in c else -1
if port == None:
raise ValueError("No port specified for serial interface")
interface = AX25KISSInterface.AX25KISSInterface(
RNS.Transport,
name,
callsign,
ssid,
port,
speed,
databits,
parity,
stopbits,
preamble,
txtail,
persistence,
slottime,
flow_control
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
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 c["type"] == "RNodeInterface": if c["type"] == "RNodeInterface":
interface = RNodeInterface.RNodeInterface(RNS.Transport, interface_config) frequency = int(c["frequency"]) if "frequency" in c else None
interface_post_init(interface) bandwidth = int(c["bandwidth"]) if "bandwidth" in c else None
txpower = int(c["txpower"]) if "txpower" in c else None
spreadingfactor = int(c["spreadingfactor"]) if "spreadingfactor" in c else None
codingrate = int(c["codingrate"]) if "codingrate" in c else None
flow_control = c.as_bool("flow_control") if "flow_control" in c else False
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
st_alock = float(c["airtime_limit_short"]) if "airtime_limit_short" in c else None
lt_alock = float(c["airtime_limit_long"]) if "airtime_limit_long" in c else None
force_ble = False
ble_name = None
ble_addr = None
port = c["port"] if "port" in c else None
if port == None:
raise ValueError("No port specified for RNode interface")
if port != None:
ble_uri_scheme = "ble://"
if port.lower().startswith(ble_uri_scheme):
force_ble = True
ble_string = port[len(ble_uri_scheme):]
port = None
if len(ble_string) == 0:
pass
elif len(ble_string.split(":")) == 6 and len(ble_string) == 17:
ble_addr = ble_string
else:
ble_name = ble_string
interface = RNodeInterface.RNodeInterface(
RNS.Transport,
name,
port,
frequency = frequency,
bandwidth = bandwidth,
txpower = txpower,
sf = spreadingfactor,
cr = codingrate,
flow_control = flow_control,
id_interval = id_interval,
id_callsign = id_callsign,
st_alock = st_alock,
lt_alock = lt_alock,
ble_addr = ble_addr,
ble_name = ble_name,
force_ble = force_ble,
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
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 c["type"] == "RNodeMultiInterface": if c["type"] == "RNodeMultiInterface":
interface = RNodeMultiInterface.RNodeMultiInterface(RNS.Transport, interface_config) count = 0
interface_post_init(interface) 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)
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
@ -685,7 +1011,7 @@ class Reticulum:
RNS.log("System interfaces are ready", RNS.LOG_VERBOSE) RNS.log("System interfaces are ready", RNS.LOG_VERBOSE)
def _add_interface(self, interface, mode = None, configured_bitrate=None, ifac_size=None, ifac_netname=None, ifac_netkey=None, announce_cap=None, announce_rate_target=None, announce_rate_grace=None, announce_rate_penalty=None): def _add_interface(self,interface, mode = None, configured_bitrate=None, ifac_size=None, ifac_netname=None, ifac_netkey=None, announce_cap=None, announce_rate_target=None, announce_rate_grace=None, announce_rate_penalty=None):
if not self.is_connected_to_shared_instance: if not self.is_connected_to_shared_instance:
if interface != None and issubclass(type(interface), RNS.Interfaces.Interface.Interface): if interface != None and issubclass(type(interface), RNS.Interfaces.Interface.Interface):

View File

@ -493,89 +493,89 @@ Multi interface can be used to configure sub-interfaces individually.
# id_interval = 600 # id_interval = 600
# A subinterface # A subinterface
[[[High Datarate]]] [[[HIGHDATARATE]]]
# 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
[[[Low Datarate]]] [[[LOWDATARATE]]]
# 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: