Skip to content

Commit

Permalink
core: frontend: update bridges to allow specifying client listen port
Browse files Browse the repository at this point in the history
  • Loading branch information
Williangalvani committed Jan 19, 2024
1 parent d2ae539 commit addca32
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 23 deletions.
11 changes: 9 additions & 2 deletions core/frontend/src/components/bridges/BridgeCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,15 @@
{{ get_display_name(bridgeSerialInfo) }}:{{ bridgeSerialInfo.bridge.baud }}
</span>
<v-icon>mdi-link</v-icon>
<span class="text-subtitle-1 ml-2">
{{ bridgeSerialInfo.bridge.ip }}:{{ bridgeSerialInfo.bridge.udp_port }}
<span v-if="is_server" class="text-subtitle-1 ml-2">
Server listening at {{ bridgeSerialInfo.bridge.udp_listen_port }}
</span>
<span v-else class="text-subtitle-1 ml-2">
Sending to {{ bridgeSerialInfo.bridge.ip }}:{{ bridgeSerialInfo.bridge.udp_target_port }}<br>
{{ bridgeSerialInfo.bridge.udp_listen_port
? 'Receiving at ' + bridgeSerialInfo.bridge.udp_listen_port
: ''
}}
</span>
</v-card-text>
</v-card>
Expand Down
3 changes: 0 additions & 3 deletions core/frontend/src/components/bridges/BridgeCreationDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -283,9 +283,6 @@ export default Vue.extend({
return isFilepath(input) ? true : 'Invalid path.'
},
is_socket_port(input: string): (true | string) {
if (!isIntegerString(input)) {
return 'Please use an integer value.'
}
const int_input = parseInt(input, 10)
return isSocketPort(int_input) ? true : 'Invalid port.'
},
Expand Down
2 changes: 1 addition & 1 deletion core/frontend/src/components/bridges/Bridget.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<v-card
width="500"
width="700"
elevation="0"
class="mb-12 pa-6 bridges-list"
>
Expand Down
29 changes: 17 additions & 12 deletions core/services/bridget/bridget.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from pydantic import BaseModel, conint
from serial.tools.list_ports_linux import SysFS

from settings import BridgeSettingsSpecV1, SettingsV1
from settings import BridgeSettingsSpecV2, SettingsV2


class BridgeFrontendSpec(BaseModel):
Expand All @@ -17,21 +17,25 @@ class BridgeFrontendSpec(BaseModel):
serial_path: str
baud: Baudrate
ip: str
udp_port: conint(gt=1023, lt=65536) # type: ignore
udp_target_port: conint(ge=0, lt=65536) # type: ignore
udp_listen_port: conint(ge=0, lt=65536) # type: ignore

def __str__(self) -> str:
return f"{self.serial_path}:{self.baud}//{self.ip}:{self.udp_port}"
if self.ip == "0.0.0.0":
return f"{self.serial_path}:{self.baud}//{self.ip}:{self.udp_listen_port}"
return f"{self.serial_path}:{self.baud}//{self.ip}:{self.udp_target_port}:{self.udp_listen_port}"

def __hash__(self) -> int:
return hash(str(self))

@staticmethod
def from_settings_spec(settings_spec: BridgeSettingsSpecV1) -> "BridgeFrontendSpec":
def from_settings_spec(settings_spec: BridgeSettingsSpecV2) -> "BridgeFrontendSpec":
return BridgeFrontendSpec(
serial_path=settings_spec.serial_path,
baud=settings_spec.baudrate,
ip=settings_spec.ip,
udp_port=settings_spec.udp_port,
udp_target_port=settings_spec.udp_target_port,
udp_listen_port=settings_spec.udp_listen_port,
)


Expand All @@ -40,9 +44,9 @@ class Bridget:

def __init__(self) -> None:
self._bridges: Dict[BridgeFrontendSpec, Bridge] = {}
self._settings_manager = Manager("bridget", SettingsV1)
self._settings_manager = Manager("bridget", SettingsV2)
self._settings_manager.load()
for bridge_settings_spec in self._settings_manager.settings.specs:
for bridge_settings_spec in self._settings_manager.settings.specsv2:
try:
logging.debug(f"Adding following bridge from persistency '{bridge_settings_spec}'.")
self.add_bridge(BridgeFrontendSpec.from_settings_spec(bridge_settings_spec))
Expand All @@ -68,18 +72,19 @@ def add_bridge(self, bridge_spec: BridgeFrontendSpec) -> None:
SysFS(bridge_spec.serial_path),
bridge_spec.baud,
bridge_spec.ip,
bridge_spec.udp_port,
bridge_spec.udp_target_port,
bridge_spec.udp_listen_port,
automatic_disconnect=False,
)
self._bridges[bridge_spec] = new_bridge
settings_spec = BridgeSettingsSpecV1.from_spec(bridge_spec)
if settings_spec not in self._settings_manager.settings.specs:
self._settings_manager.settings.specs.append(settings_spec)
settings_spec = BridgeSettingsSpecV2.from_spec(bridge_spec)
if settings_spec not in self._settings_manager.settings.specsv2:
self._settings_manager.settings.specsv2.append(settings_spec)
self._settings_manager.save()

def remove_bridge(self, bridge_spec: BridgeFrontendSpec) -> None:
bridge = self._bridges.pop(bridge_spec, None)
self._settings_manager.settings.specs.remove(BridgeSettingsSpecV1.from_spec(bridge_spec))
self._settings_manager.settings.specsv2.remove(BridgeSettingsSpecV2.from_spec(bridge_spec))
self._settings_manager.save()
if bridge is None:
raise RuntimeError("Bridge doesn't exist.")
Expand Down
8 changes: 4 additions & 4 deletions core/services/bridget/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from fastapi_versioning import VersionedFastAPI, version
from loguru import logger

from bridget import BridgeSpec, Bridget
from bridget import BridgeFrontendSpec, Bridget

SERVICE_NAME = "bridget"

Expand Down Expand Up @@ -39,7 +39,7 @@ def get_serial_ports() -> Any:
return ports


@app.get("/bridges", response_model=List[BridgeSpec])
@app.get("/bridges", response_model=List[BridgeFrontendSpec])
@version(1, 0)
def get_bridges() -> Any:
bridges = controller.get_bridges()
Expand All @@ -49,15 +49,15 @@ def get_bridges() -> Any:

@app.post("/bridges", status_code=status.HTTP_201_CREATED)
@version(1, 0)
def add_bridge(bridge: BridgeSpec) -> Any:
def add_bridge(bridge: BridgeFrontendSpec) -> Any:
logger.debug(f"Adding bridge '{bridge}'.")
controller.add_bridge(bridge)
logger.debug(f"Bridge '{bridge}' added.")


@app.delete("/bridges", status_code=status.HTTP_200_OK)
@version(1, 0)
def remove_bridge(bridge: BridgeSpec) -> Any:
def remove_bridge(bridge: BridgeFrontendSpec) -> Any:
logger.debug(f"Removing bridge '{bridge}'.")
controller.remove_bridge(bridge)
logger.debug(f"Bridge '{bridge}' removed.")
Expand Down
57 changes: 56 additions & 1 deletion core/services/bridget/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class BridgeSettingsSpecV1(pykson.JsonObject):
udp_port = pykson.IntegerField()

@staticmethod
def from_spec(spec: "BridgeSpec") -> "BridgeSettingsSpecV1": # type: ignore
def from_spec(spec: "BridgeFrontendSpec") -> "BridgeSettingsSpecV1": # type: ignore
return BridgeSettingsSpecV1(
serial_path=spec.serial_path,
baudrate=spec.baud,
Expand Down Expand Up @@ -42,3 +42,58 @@ def migrate(self, data: Dict[str, Any]) -> None:
super().migrate(data)

data["VERSION"] = SettingsV1.VERSION


class BridgeSettingsSpecV2(pykson.JsonObject):
udp_target_port = pykson.IntegerField()
udp_listen_port = pykson.IntegerField()
serial_path = pykson.StringField()
baudrate = pykson.IntegerField()
ip = pykson.StringField()

@staticmethod
def from_spec(spec: "BridgeFrontendSpec") -> "BridgeSettingsSpecV2": # type: ignore
return BridgeSettingsSpecV2(
serial_path=spec.serial_path,
baudrate=spec.baud,
ip=spec.ip,
udp_target_port=spec.udp_target_port,
udp_listen_port=spec.udp_listen_port,
)

def __eq__(self, other: object) -> Any:
if isinstance(other, BridgeSettingsSpecV2):
return self.serial_path == other.serial_path
return False


class SettingsV2(SettingsV1):
VERSION = 2
specsv2 = pykson.ObjectListField(BridgeSettingsSpecV2)

def __init__(self, *args: str, **kwargs: int) -> None:
super().__init__(*args, **kwargs)

self.VERSION = SettingsV2.VERSION

def migrate(self, data: Dict[str, Any]) -> None:
if data["VERSION"] == SettingsV2.VERSION:
return

if data["VERSION"] < SettingsV2.VERSION:
super().migrate(data)

data["VERSION"] = SettingsV2.VERSION
new_specs = []
for spec in data["specs"]:
server = spec["ip"] == "0.0.0.0"
new_specs.append(
{
"serial_path": spec["serial_path"],
"baudrate": spec["baudrate"],
"ip": spec["ip"],
"udp_target_port": 0 if server else spec["udp_port"],
"udp_listen_port": spec["udp_port"] if server else 0,
}
)
data["specsv2"] = new_specs

0 comments on commit addca32

Please sign in to comment.