Пример #1
0
class Mainloop(QObject):
    ready = pyqtSignal(bool, dict)
    stopped = pyqtSignal()
    report = pyqtSignal(int, str)
    state = pyqtSignal(int, str)
    notify = pyqtSignal(str, str)

    def __init__(self, parent=None):
        super(Mainloop, self).__init__(parent)
        self.queue = None
        self.thread = None
        self.db = None

    def spawn_device_greenlets(self, terminal, devices):
        return [spawn(device_loop, terminal, self, addr) for addr in devices]

    def _mainloop(self):

        terminal = Terminal()
        if not terminal.is_open():
            self.notify.emit(u'Ошибка', u'Нет связи с концентратором')
            self.ready.emit(False, {})
            return

        if self.db is None:
            self.db = DB(notify=lambda title, msg: self.notify.emit(title, msg))
        titles = self.db.get_terminals()
        devices = titles.keys()

        if not devices:
            self.notify.emit(u'Ошибка', u'Нет информации о терминалах')
            self.ready.emit(False, {})
            return

        self.queue = Queue()
        self.ready.emit(True, titles)

        greenlets = self.spawn_device_greenlets(terminal, devices)

        while True:
            command = self.queue.get()

            if callable(command):
                command(terminal)
            else:
                [greenlet.kill() for greenlet in greenlets]
                break

        terminal.close()
        self.queue = None
        self.stopped.emit()

    def start(self):
        self.thread = Thread(target=self._mainloop)
        self.thread.start()

    def stop(self, block=False):
        if self.queue:
            self.queue.put(None)
            if block:
                self.thread.join()

    def test_display(self):
        test_message = u'Тестовое сообщение'
        self.queue.put(lambda terminal: TerminalMessage(test_message).set(terminal, 0xFF, 5))

    def update_config(self, addr=0xFF):
        self.queue.put(lambda terminal: TerminalTime().set(terminal, addr))
        self.queue.put(lambda terminal: TerminalStrings(self.db).set(terminal, addr))
        self.queue.put(lambda terminal: TerminalCounters(self.db).set(terminal, addr))

    def terminal_open(self, addr):
        self.queue.put(lambda terminal: TerminalState('man', 'open').set(terminal, addr, self.db))

    def terminal_close(self, addr):
        self.queue.put(lambda terminal: TerminalState('man', 'close').set(terminal, addr, self.db))