start building device forms
This commit is contained in:
		@@ -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())
 | 
					 | 
				
			||||||
@@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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"),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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")',
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user