start building device forms

This commit is contained in:
Jakob Ketterl 2021-02-19 15:29:17 +01:00
parent 4316832b95
commit 3aa238727e
7 changed files with 65 additions and 39 deletions

View File

@ -1,30 +0,0 @@
from owrx.form import Input
from owrx.controllers.settings import Section
from typing import List
class SdrDeviceDescriptionMissing(Exception):
pass
class SdrDeviceDescription(object):
@staticmethod
def getByType(sdr_type: str) -> "SdrDeviceDescription":
try:
className = "".join(x for x in sdr_type.title() if x.isalnum()) + "DeviceDescription"
module = __import__("owrx.source.{0}".format(sdr_type), fromlist=[className])
cls = getattr(module, className)
return cls()
except (ModuleNotFoundError, AttributeError):
raise SdrDeviceDescriptionMissing("Device description for type {} not available".format(sdr_type))
def getInputs(self) -> List[Input]:
return []
def mergeInputs(self, *args):
# build a dictionary indexed by the input id to make sure every id only exists once
inputs = {input.id: input for input_list in args for input in input_list}
return inputs.values()
def getSection(self):
return Section("Device settings", *self.getInputs())

View File

@ -1,7 +1,7 @@
from owrx.controllers.admin import AuthorizationMixin from owrx.controllers.admin import AuthorizationMixin
from owrx.controllers.template import WebpageController from owrx.controllers.template import WebpageController
from owrx.controllers.settings import SettingsFormController from owrx.controllers.settings import SettingsFormController
from owrx.controllers.settings.device import SdrDeviceDescription, SdrDeviceDescriptionMissing from owrx.source import SdrDeviceDescription, SdrDeviceDescriptionMissing
from owrx.config import Config from owrx.config import Config
from urllib.parse import quote, unquote from urllib.parse import quote, unquote

View File

@ -10,6 +10,9 @@ from abc import ABC, abstractmethod
from owrx.command import CommandMapper from owrx.command import CommandMapper
from owrx.socket import getAvailablePort from owrx.socket import getAvailablePort
from owrx.property import PropertyStack, PropertyLayer from owrx.property import PropertyStack, PropertyLayer
from owrx.form import Input, TextInput, NumberInput
from owrx.controllers.settings import Section
from typing import List
import logging import logging
@ -352,3 +355,33 @@ class SdrSource(ABC):
self.busyState = state self.busyState = state
for c in self.clients: for c in self.clients:
c.onBusyStateChange(state) c.onBusyStateChange(state)
class SdrDeviceDescriptionMissing(Exception):
pass
class SdrDeviceDescription(object):
@staticmethod
def getByType(sdr_type: str) -> "SdrDeviceDescription":
try:
className = "".join(x for x in sdr_type.title() if x.isalnum()) + "DeviceDescription"
module = __import__("owrx.source.{0}".format(sdr_type), fromlist=[className])
cls = getattr(module, className)
return cls()
except (ModuleNotFoundError, AttributeError):
raise SdrDeviceDescriptionMissing("Device description for type {} not available".format(sdr_type))
def getInputs(self) -> List[Input]:
return [
TextInput("name", "Device name"),
NumberInput("ppm", "Frequency correction", append="ppm"),
]
def mergeInputs(self, *args):
# build a dictionary indexed by the input id to make sure every id only exists once
inputs = {input.id: input for input_list in args for input in input_list}
return inputs.values()
def getSection(self):
return Section("Device settings", *self.getInputs())

View File

@ -1,7 +1,7 @@
from . import SdrSource from owrx.source import SdrSource, SdrDeviceDescription
from owrx.socket import getAvailablePort from owrx.socket import getAvailablePort
import socket import socket
from owrx.command import CommandMapper, Flag, Option from owrx.command import Flag, Option
import logging import logging
@ -69,3 +69,7 @@ class ConnectorSource(SdrSource):
values["port"] = self.getPort() values["port"] = self.getPort()
values["controlPort"] = self.getControlPort() values["controlPort"] = self.getControlPort()
return values return values
class ConnectorDeviceDescription(SdrDeviceDescription):
pass

View File

@ -1,6 +1,5 @@
from .connector import ConnectorSource from owrx.source.connector import ConnectorSource, ConnectorDeviceDescription
from owrx.command import Flag, Option from owrx.command import Flag, Option
from owrx.controllers.settings.device import SdrDeviceDescription
from typing import List from typing import List
from owrx.form import Input, TextInput from owrx.form import Input, TextInput
@ -15,11 +14,11 @@ class RtlSdrSource(ConnectorSource):
) )
class RtlSdrDeviceDescription(SdrDeviceDescription): class RtlSdrDeviceDescription(ConnectorDeviceDescription):
def getInputs(self) -> List[Input]: def getInputs(self) -> List[Input]:
return self.mergeInputs( return self.mergeInputs(
super().getInputs(), super().getInputs(),
[ [
TextInput("test", "This is a drill"), TextInput("device", "Device identifier", infotext="Device serial number or index"),
], ],
) )

View File

@ -1,4 +1,4 @@
from .soapy import SoapyConnectorSource from owrx.source.soapy import SoapyConnectorSource, SoapyConnectorDeviceDescription
class SdrplaySource(SoapyConnectorSource): class SdrplaySource(SoapyConnectorSource):
@ -17,3 +17,7 @@ class SdrplaySource(SoapyConnectorSource):
def getDriver(self): def getDriver(self):
return "sdrplay" return "sdrplay"
class SdrplayDeviceDescription(SoapyConnectorDeviceDescription):
pass

View File

@ -1,6 +1,8 @@
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from owrx.command import Option from owrx.command import Option
from .connector import ConnectorSource from owrx.source.connector import ConnectorSource, ConnectorDeviceDescription
from typing import List
from owrx.form import Input, TextInput
class SoapyConnectorSource(ConnectorSource, metaclass=ABCMeta): class SoapyConnectorSource(ConnectorSource, metaclass=ABCMeta):
@ -94,3 +96,17 @@ class SoapyConnectorSource(ConnectorSource, metaclass=ABCMeta):
if settings: if settings:
changes["settings"] = ",".join("{0}={1}".format(k, v) for k, v in settings.items()) changes["settings"] = ",".join("{0}={1}".format(k, v) for k, v in settings.items())
super().onPropertyChange(changes) super().onPropertyChange(changes)
class SoapyConnectorDeviceDescription(ConnectorDeviceDescription):
def getInputs(self) -> List[Input]:
return self.mergeInputs(
super().getInputs(),
[
TextInput(
"device",
"Device Identifier",
infotext='SoapySDR device identifier string (example: "serial=123456789")',
),
],
)