Module pyspecan.controller.tkGUI.dispatch

Classes

class CMD (*args, **kwds)
Expand source code
class CMD(Enum):
    NEXT = auto()
    PREV = auto()

    START = auto()
    STOP = auto()
    RESET = auto()

    PLOT = auto()

    UPDATE_F = auto()
    UPDATE_NFFT = auto()
    UPDATE_FS = auto()

    UPDATE_MODE = auto()
    UPDATE_SINK = auto()

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

Color.RED

  • value lookup:

Color(1)

  • name lookup:

Color['RED']

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes – see the documentation for details.

Ancestors

  • enum.Enum

Class variables

var NEXT
var PLOT
var PREV
var RESET
var START
var STOP
var UPDATE_F
var UPDATE_FS
var UPDATE_MODE
var UPDATE_NFFT
var UPDATE_SINK
class Dispatch (controller)
Expand source code
class Dispatch:
    def __init__(self, controller):
        self.log = logger.new("tkGUI.dispatch")
        self.ctrl = controller
        self.queue = queue.Queue()

        self.state = STATE.WAITING
        self.running = True
        self.thread = threading.Thread(target=self._run, name="dispatcher")

        self._last_f = self._get_f()

    def start(self):
        self.running = True
        self.thread.start()

    def stop(self):
        self.send(CMD.STOP)
        self.running = False
        self.thread.join(timeout=1)

    def send(self, cmd: CMD, val=None):
        self.queue.put((cmd, val))

    def _run(self):
        while self.running:
            if self.state is not STATE.RUNNING:
                if self.queue.qsize() == 0:
                    time.sleep(0.2)
                    continue
            else:
                self._loop()
            if not self.queue.qsize() == 0:
                cmd, val = self.queue.get()
                if cmd is CMD.NEXT:
                    self.log.trace("executing CMD.NEXT")
                    if self.state is STATE.RUNNING:
                        self.send(CMD.STOP)
                    self._next()
                elif cmd is CMD.PREV:
                    self.log.trace("executing CMD.PREV")
                    if self.state is STATE.RUNNING:
                        self.send(CMD.STOP)
                    self._prev()
                elif cmd is CMD.START:
                    self.log.trace("executing CMD.START")
                    self.state = STATE.RUNNING
                elif cmd is CMD.STOP:
                    self.log.trace("executing CMD.STOP")
                    self.state = STATE.WAITING
                elif cmd is CMD.PLOT:
                    self.log.trace("executing CMD.PLOT")
                    pass
                elif cmd is CMD.RESET:
                    self.log.trace("executing CMD.RESET")
                    if self.state is STATE.RUNNING:
                        self.state = STATE.WAITING
                    self.ctrl.mode.panel.on_reset()
                    self.ctrl.model.reset()
                    self.ctrl.draw_tb()
                elif cmd is CMD.UPDATE_F:
                    self.log.trace("executing CMD.UPDATE_F")
                    self._last_f = None
                    self._update_f()
                elif cmd is CMD.UPDATE_NFFT:
                    self.log.trace("executing CMD.UPDATE_NFFT")
                    self.ctrl.mode.panel.on_update_nfft(self.ctrl.model.get_nfft())
                elif cmd is CMD.UPDATE_FS:
                    self.log.trace("executing CMD.UPDATE_FS")
                    self.ctrl.mode.panel.on_update_fs(self.ctrl.model.get_fs())

    def on_plot(self):
        ptime = time.perf_counter()
        # self._update_f()
        self.ctrl.mode.panel.on_plot(self.ctrl.model)

        ptime = (time.perf_counter() - ptime)
        self.ctrl.view.tb_var_draw_time.set(f"{ptime:06.3f}s")
        self.ctrl.draw_tb()

        # print(f"Plotted in {ptime*1000:.1f}ms / {self.time_show}")
        return ptime

    def _loop(self):
        time_show = self.ctrl.time_show/1000 # convert ms to s
        valid, ptime = self._next()
        if not valid or ptime is None:
            self.send(CMD.STOP)
            return
        wait = time_show-ptime
        if wait > 0:
            self.ctrl.view.tb_lbl_msg.configure(text="")
            time.sleep(wait)
        else:
            if not self.ctrl.model.mode.get_sweep_time() == 0.0:
                if config.MODE == Mode.SWEPT:
                    self.ctrl.model.skip_time(-wait)
                self.ctrl.view.tb_lbl_msg.configure(text="OVERFLOW")

    def _prev(self): # fails on Sink.LIVE
        valid = self.ctrl.model.sink.prev(self.ctrl.model.mode.get_block_size())
        tplot = None
        if valid:
            tplot = self.on_plot()
        return (valid, tplot)

    def _next(self):
        valid = self.ctrl.model.sink.next(self.ctrl.model.mode.get_block_size())
        tplot = None
        if valid:
            tplot = self.on_plot()
        return (valid, tplot)

    def _get_f(self):
        return (self.ctrl.model.f[0], self.ctrl.model.f[-1]+(self.ctrl.model.f[-1]-self.ctrl.model.f[-2]), len(self.ctrl.model.f))
    def _update_f(self):
        if self._last_f is None:
            self._last_f = self._get_f()
            self.ctrl.mode.panel.on_update_f(self._last_f)
        elif not self.ctrl.model.f[0] == self._last_f[0] and not len(self.ctrl.model.f) == self._last_f[2]:
            self._last_f = self._get_f()
            self.ctrl.mode.panel.on_update_f(self._last_f)

    @property
    def last_f(self):
        return self._last_f

Instance variables

prop last_f
Expand source code
@property
def last_f(self):
    return self._last_f

Methods

def on_plot(self)
Expand source code
def on_plot(self):
    ptime = time.perf_counter()
    # self._update_f()
    self.ctrl.mode.panel.on_plot(self.ctrl.model)

    ptime = (time.perf_counter() - ptime)
    self.ctrl.view.tb_var_draw_time.set(f"{ptime:06.3f}s")
    self.ctrl.draw_tb()

    # print(f"Plotted in {ptime*1000:.1f}ms / {self.time_show}")
    return ptime
def send(self,
cmd: CMD,
val=None)
Expand source code
def send(self, cmd: CMD, val=None):
    self.queue.put((cmd, val))
def start(self)
Expand source code
def start(self):
    self.running = True
    self.thread.start()
def stop(self)
Expand source code
def stop(self):
    self.send(CMD.STOP)
    self.running = False
    self.thread.join(timeout=1)
class STATE (*args, **kwds)
Expand source code
class STATE(Enum):
    WAITING = auto()
    RUNNING = auto()

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

Color.RED

  • value lookup:

Color(1)

  • name lookup:

Color['RED']

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes – see the documentation for details.

Ancestors

  • enum.Enum

Class variables

var RUNNING
var WAITING