Exemplo n.º 1
0
class Triangulation:
    """
    A service for determining the relative location of a device with respect to
    nearby Wifi access points.
    """
    def __init__(self, wifi: Wifi, mqtt: MqttConnection,
                 messaging: MessagingService, oled):
        self.table = RssiTable()
        self.wifi = wifi
        self.mqtt = mqtt
        self.messaging = messaging
        self.thread = Thread(self.__run, "LocationThread")
        self.oled = oled

        self.previous_snapshot = []

    def start(self):
        self.thread.start()

    def __unique_sets(self, a, b):
        for (a_elem, _, _) in a:
            for (b_elem, _, _) in b:
                if a_elem == b_elem:
                    return False
        return True

    def __run(self, thread: Thread):
        while thread.active:
            if self.messaging.package_id:
                # We cannot scan if we are connected to an access point
                self.wifi.disconnect()
                self.wifi.acquire()

                try:
                    stations = self.wifi.scan()
                    print("Got {}".format(stations))
                finally:
                    self.wifi.release()
                    self.wifi.deactivate(False)

                for station in stations:
                    # Filter out mobile network used while testing
                    if station[0] != b"AndroidAP":
                        self.table.add(ubinascii.hexlify(station[1]),
                                       station[3])
                self.table.clean_table()

                new_snapshot = self.table.snapshot(2)

                if len(stations) >= 2 and self.__unique_sets(
                        new_snapshot, self.previous_snapshot):
                    self.previous_snapshot = new_snapshot
                    payload = ujson.dumps(self.previous_snapshot)
                    self.mqtt.publish(
                        TOPIC_MACLOCATION_PUBLISH.format(
                            self.messaging.package_id), payload)
                    self.messaging.notify()
                    self.oled.push_line("Got location")

            utime.sleep(27)
Exemplo n.º 2
0
def now(bot, update, args):
    if str(update.message.chat_id) in allowed_id:
        try:
            usernames = [ a['username'].lower() for a in users ]
            if not args[1].lower() in usernames:
                update.message.reply_text("Sorry, username <b>{}</b> is not saved.".format(args[1]), parse_mode='HTML')
                return

            if not args[0] in scripts:
                update.message.reply_text("Sorry, script named <b>{}</b> is not in your scripts file.".format(args[0]), parse_mode='HTML')
                return

            job_name = "{}_temp_{}".format(args[0], time.time())
            for user in users:
                if user['username'].lower() == args[1].lower():
                    break
            temp_thread = Thread(
                job_name,
                args[0],
                update.message.chat_id,
                bot,
                user['username'],
                user['password'],
                user['proxy']
            )
            temp_thread.start()       
        except (IndexError, ValueError):
            update.message.reply_text('Usage: /now <script_name> <username>')     
    else:
        message = 'You have not the permission to use this bot.\nFor more details visit [Telegram-InstaPy-Scheduling](https://github.com/Tkd-Alex/Telegram-InstaPy-Scheduling)'
        update.message.reply_text(message, parse_mode='Markdown')
Exemplo n.º 3
0
async def on_ready():
    print(f"Ready in {time.time() - start} seconds.")
    # used for uptime
    client.start_time = datetime.now()

    await client.change_presence(status=discord.Status.online, activity=discord.Game(auth.game))
    print('Successfully logged in.')
    Thread.start(block=False)
Exemplo n.º 4
0
    def __init__(self, com):
        #self.repl = pyb.USB_VCP()

        self.uart = pyb.UART(com, 9600,bits=8, parity=None, stop=1,read_buf_len=15024,timeout=10)  # ,bits=8, parity=None, stop=1,read_buf_len=64
        #self.pin = pyb.Pin('X18', pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
        #self.pin.low()
        self.data=None
        self.read_n='DATA'
        self.msgss=None
        #self.word=''
        tr1 = Thread(target=self.download)#, args=(self.data)
        tr1.start()
Exemplo n.º 5
0
class ThreadingTutorial(QMainWindow, ui.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)
        # self._diawidth = 1500
        # self._diaheight = 800
        #

    def show_text(self):
        self.textEdit.setText("我是自定义线程")
        imagefilename = QFileDialog.getOpenFileName(self, "OpenFile",
                                                    "/Users/huan/code/PycharmProjects/Unsupervised-Person-Re-identification-Clustering-and-Fine-tuning-master/mydata/imageQuery",

                                                    "Image Files(*.MTS *.jpg *.png)")

        print("imagefilename1")

        print(imagefilename)

        imagefilename1 = "".join(tuple(imagefilename))
        imagefilename = imagefilename1[0:-30]
        print("imagefilename")

        print(imagefilename)
        image = QImage()
        if imagefilename != "":
            image = QImage(imagefilename)

            scene = QGraphicsScene()
            pixmap = QPixmap.fromImage(image)

            #默认加载比例
            scene.addPixmap(pixmap).setScale(0.5)
            self.graphicsView.setScene(scene)
            self.graphicsView.resize(150, 200)
            self.graphicsView.show()


    def done(self):
        self.textEdit.setText("内置线程:我是系统线程完成后的done函数")
    def test(self):
        self.textEdit.setText("我是按钮点击事件,设置文本值")
        self.thread = Thread()
        self.thread.start()

        #使用自定义信号
        self.thread.show_text.connect(self.show_text)
        #使用系统信号
        self.thread.finished.connect(self.done)

    def on_pushButton_released(self):
        self.test()
Exemplo n.º 6
0
def MainLoop(gui, sim):
    # Create a simulation thread, and start it at the highest priority
    simthread = Thread(sim)
    simthread.start(Thread.HighestPriority)

    # Set sim.screenio as an event target for the gui, so that the gui can send events to the sim object
    gui.setSimEventTarget(sim.screenio)

    # Start the gui
    gui.start()

    # Stopping simulation thread
    print 'Stopping Threads'
    sim.stop()
    simthread.quit()
    simthread.wait()
Exemplo n.º 7
0
class PackageMonitor:
    def __init__(self, mqtt: MqttConnection, messaging: MessagingService,
                 budget_manager: BudgetManager):
        self.mqtt = mqtt
        self.messaging = messaging
        self.budget_manager = budget_manager

        self.environment_thread = Thread(self.__run_environment,
                                         "EnvironmentThread")
        self.motion_thread = Thread(self.__run_motion, "MotionThread")

        self.temperature_setpoint = config.get_float("temperature_setpoint")
        self.humidity_setpoint = config.get_float("humidity_setpoint")
        self.motion_setpoint = config.get_float("motion_setpoint")

        self.last_z = 0
        self.last_y = 0
        self.last_x = 0

        self.environment_sensor = HTS221(
            I2C(-1, Pin(26, Pin.IN), Pin(25, Pin.OUT)))
        self.motion_sensor = MPU6050(I2C(-1, Pin(26, Pin.IN), Pin(25,
                                                                  Pin.OUT)))

    def __subscribe_package_id(self):
        self.mqtt.subscribe(TOPIC_DEVICE_PACKAGE.format(self.mqtt.device_id),
                            self._on_package_id, 1)
        self.messaging.notify()

    def _on_package_id(self, topic, package_id):
        # We should unsubscribe from the old id, but umqttsimple does not support this!
        self.mqtt.subscribe(TOPIC_TEMPERATURE_SETPOINT.format(package_id),
                            self._on_temperature_setpoint, 1)
        self.mqtt.subscribe(TOPIC_HUMIDITY_SETPOINT.format(package_id),
                            self._on_humidity_setpoint, 1)
        self.mqtt.subscribe(TOPIC_MOTION_SETPOINT.format(package_id),
                            self._on_motion_setpoint, 1)
        self.messaging.notify()

    def start(self):
        self.__subscribe_package_id()
        self.environment_thread.start()
        self.motion_thread.start()

    def __run_environment(self, thread: Thread):
        while thread.active:
            did_transmit = False

            if self.temperature_setpoint:
                if self.__check_temperature():
                    did_transmit = True

            if self.humidity_setpoint:
                if self.__check_humidity():
                    did_transmit = True

            if did_transmit:
                print("Notified messaging service of pending data")
                self.messaging.notify()

            utime.sleep(10)

    def __run_motion(self, thread: Thread):
        while thread.active:
            did_transmit = False

            if self.motion_setpoint:
                if self.__check_motion():
                    did_transmit = True

            if did_transmit:
                print("Notified messaging service of pending data")
                self.messaging.notify()

            utime.sleep_ms(100)

    def __check_temperature(self) -> bool:
        temperature = self.environment_sensor.read_temp()
        print("Read temperature: {}".format(temperature))

        if temperature > self.temperature_setpoint:
            time = utime.localtime()
            self.budget_manager.enqueue(
                TOPIC_TEMPERATURE_PUBLISH.format(self.messaging.package_id),
                time, temperature, self.temperature_setpoint)
            return True
        return False

    def __check_humidity(self) -> bool:
        humidity = self.environment_sensor.read_humi()
        print("Read humidity: {}".format(humidity))

        if humidity > self.humidity_setpoint:
            time = utime.localtime()
            self.budget_manager.enqueue(
                TOPIC_HUMIDITY_PUBLISH.format(self.messaging.package_id), time,
                humidity, self.humidity_setpoint)
            return True
        return False

    def __check_motion(self) -> bool:
        values = self.motion_sensor.get_values()

        z = values['AcZ']
        y = values['AcY']
        x = values['AcX']

        motion = math.fabs(z + y + x - self.last_z - self.last_y - self.last_x)

        self.last_z = z
        self.last_y = y
        self.last_x = x

        if motion > self.motion_setpoint:  #20000
            time = utime.time()
            self.budget_manager.enqueue(
                TOPIC_MOTION_PUBLISH.format(self.messaging.package_id), time,
                motion, self.motion_setpoint)
            return True

        return False

    def _on_temperature_setpoint(self, topic, msg):
        self.temperature_setpoint = float(msg)
        # We can't do this, because of the stupid recursion depth
        # config.set_value("temperature_setpoint", self.temperature_setpoint)
        print('Received temperature setpoint {}'.format(msg))

    def _on_humidity_setpoint(self, topic, msg):
        self.humidity_setpoint = float(msg)
        # We can't do this, because of the stupid recursion depth
        # config.set_value("humidity_setpoint", self.humidity_setpoint)
        print('Received humidity setpoint {}'.format(msg))

    def _on_motion_setpoint(self, topic, msg):
        self.motion_setpoint = float(msg)
        # We can't do this, because of the stupid recursion depth
        # config.set_value("motion_setpoint", self.motion_setpoint)
        print('Received motion setpoint {}'.format(msg))
Exemplo n.º 8
0
class MainWindow(QMainWindow, FormMain):
    srv = 'server'
    cli = 'client'

    clients = {}
    servers = {}

    downloaded_color = QColor(0xe2, 0xf5, 0xff)

    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)

        if not os.path.exists("DOWNLOADS_PATH"):
            os.makedirs("DOWNLOADS_PATH")
        if not os.path.exists("TORRENTS_PATH"):
            os.makedirs("TORRENTS_PATH")

        r = self.geometry()
        r.moveCenter(QApplication.desktop().availableGeometry().center())
        self.setGeometry(r)

        if ("DO_LOGIN"):
            self.show_login_form()

        self.actions = {
            PACKAGE_SENT_ACT: self.on_package_sent_act,
            PACKAGE_RECEIVED_ACT: self.on_package_received_act,
            SERVER_ADDED_ACT: self.on_server_added_act,
            CLIENT_ADDED_ACT: self.on_client_added_act,
            SERVER_REMOVED_ACT: self.on_server_removed_act,
            CLIENT_REMOVED_ACT: self.on_client_removed_act,
            ANSWER_ACT: self.on_answer_act,
            FILE_RECEIVED_ACT: self.on_file_received_act,
        }

        self.cli_thread = Thread(CLI_SOCK_PATH)
        self.srv_thread = Thread(SRV_SOCK_PATH)

        self.cli_thread.msg_came.connect(self.handle_cli_backend_message)
        self.srv_thread.msg_came.connect(self.handle_srv_backend_message)
        
        self.cli_thread.error_came.connect(self.handle_cli_error)
        self.srv_thread.error_came.connect(self.handle_srv_error)

        self.cli_thread.start()
        self.srv_thread.start()

        self.tableView_main.rowSelected.connect(self.on_main_table_row_changed)
        self.tableView_main.rowDoubleClicked.connect(self.on_row_double_clicked)

        self.timer = QTimer(self)
        self.connect(self.timer, SIGNAL("timeout()"), self.on_timer)
        self.timer.start(100)

        self.timer_iteration = 0

        self.transmissions = {}
        self.expected_response = 0

        Logger.log("Старт приложения")

        if ("DAEMONIZE"):
            self.run_daemons()

        self.load_torrents()

    def show_login_form(self):
        form = LoginWindow(self)
        form.show()

    def closeEvent(self, e):
        Logger.log("Завершение приложения")
        self.hide()
        self.cli_thread.stop_thread()
        self.srv_thread.stop_thread()

    def run_daemons(self):
        cli = subprocess.Popen("CLI", stdout=subprocess.PIPE,
            stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        Logger.log("Клиент запущен")
        srv = subprocess.Popen("SRV", stdout=subprocess.PIPE,
            stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        Logger.log("Сервер запущен")

    # Actions
    def on_package_sent_act(self, data):
        cli = self.clients[data['id']]
        Logger.log("Часть #{n} файла '{fname}' была отправлена на адрес '{ip}'" \
                .format(ip = cli['ip'], n = data['piece_id'], fname = data['file_name']))
        key = "{0}-{1}".format(data['id'], data['file_name'])
        if key in cli['items']:
            cli['items'][key]['sent'] += 1
            self.tableView_server.set_packs_sent(cli['items'][key]['sent'], key)
        else:
            cli['items'][key] = {
                'sent': 1,
                'last_index': 0,
                'name': data['file_name'],
            }
            self.tableView_server.add_row(key, data['file_name'], cli['ip'], 1)


    def on_package_received_act(self, data):
        Logger.log("С адреса '{ip}' была получена часть #{n} файла '{fname}'" \
                .format(ip = self.servers[data['id']]['ip'], n = data['piece_id'],
                        fname = self.transmissions[data['hsum']]['filename']))
        self.transmissions[data['hsum']]['sent'] += 1
        self.tableView_main.set_packs_sent(packs = self.transmissions[data['hsum']]['sent'], key = data['hsum'])
        prc = self.transmissions[data['hsum']]['filesize']
        prc = self.transmissions[data['hsum']]['sent'] * PIECE_LEN / prc
        self.tableView_main.set_perc_sent(prc * 100 if prc < 1 else 100.0, data['hsum'])
        self.statusWidget.add_line(data['hsum'], data['piece_id'],
                self.servers[data['id']]['color'])

        s = self.servers[data['id']]
        s['sent'] += 1
        self.tableView_client.set_packs_sent(s['sent'], s['ip'])

    def on_server_added_act(self, data):
        Logger.log("Подключен сервер '{ip}'".format(ip = data['ip']))
        self.servers[data['id']] = {
            'ip': data['ip'],
            'sent': 0,
            'last_index': 0,
            'color': QColor.fromHsv(random.randint(0, 359), 220, 190),
        }
        self.tableView_client.add_row(data['ip'])

    def on_client_added_act(self, data):
        Logger.log("Подключен клиент '{ip}'".format(ip = data['ip']))
        self.clients[data['id']] = {
            'ip': data['ip'],
            'items': {},
        }

    def on_server_removed_act(self, data):
        Logger.log("Сервер '{ip}' отключился".format(ip = self.servers[data['id']]['ip']))
        self.tableView_client.remove_row(self.servers[data['id']]['ip'])
        del self.servers[data['id']]

    def on_client_removed_act(self, data):
        Logger.log("Клиент '{ip}' отключился".format(ip = self.clients[data['id']]['ip']))
        for key in self.clients[data['id']]['items']:
            self.tableView_server.remove_row(key)
        del self.clients[data['id']]

    def on_answer_act(self, data):
        r = int(data['result'])
        text = ''
        if r != 0:
            text = ": возникла ошибка {e}".format(e = data['error'])
            if data['error'] == FILE_RECEIVING_FAILURE:
                self.on_actionStop_transmission_triggered(data['hsum'])
        Logger.log("Результат выполнения операции: {r}{text}".format(r = r, text = text))
        if r == -1:
            QMessageBox.information(self, "Ошибка",
                "Торрент файл не может быть загружен -- нет активных серверов")

        if 'act' in data and 'hsum' in data and data['hsum'] in self.transmissions:
            trm = self.transmissions[data['hsum']]
            if (data['act'] == STOP_TRM_ACT and r == 0) or (data['act'] == START_TRM_ACT and r != 0):
                trm['sent'] = trm['active'] = trm['finished'] = 0
            elif data['act'] == START_TRM_ACT:
                trm['trmid'] = data['trmid']
                trm['active'] = 1
            self.on_main_table_row_changed(data['hsum'])

    def on_file_received_act(self, data):
        s = data['hsum']
        struct = self.transmissions[s]
        Logger.log("Файл '{name}' был полностью получен".format(name = struct['filename']))
        self.create_torrent_file(struct['filename'], struct['filesize'],
            data['hsum'], "DOWNLOADS_PATH/" + struct['filename'])
        self.load_torrent(fname = "TORRENTS_PATH/" + s, add_row = False)
        struct['sent'] = -1
        struct['active'] = 0
        struct['finished'] = 1
        self.on_main_table_row_changed(s)

    def handle_srv_error(self, class_name, msg = None):
        Logger.log("Возникла ошибка в потоке сервера{msg}" \
                .format(msg = ": " + msg if msg else ""))
        return self.handle_error(class_name, msg, self.srv)

    def handle_cli_error(self, class_name, msg = None):
        Logger.log("Возникла ошибка в потоке клиента{msg}" \
                .format(msg = ": " + msg if msg else ""))
        return self.handle_error(class_name, msg, self.cli)

    def handle_srv_backend_message(self, msg):
        return self.handle_backend_message(msg, self.srv)

    def handle_cli_backend_message(self, msg):
        return self.handle_backend_message(msg, self.cli)

    def handle_error(self, class_name, msg = None, sender = None):
        QMessageBox.information(self, 'Ошибка', \
                'Возникла ошибка в потоке "{thread}": {msg}'.format( \
                thread = (sender == self.srv and 'Сервер') or \
                         (sender == self.cli and 'Клиент') or \
                         'Неизвестно', \
                msg = msg), QMessageBox.Ok)

    def handle_backend_message(self, msg, sender = None):
        try:
            self.__handle_backend_message(msg, sender)
        except MainError as e:
            self.handle_error(type(e).__name__, e.args[0])

    def __handle_backend_message(self, msg, sender = None):
        data = json.loads(msg, encoding='utf-8')
        return self.actions[data['action']](data)

    def load_torrent(self, fname = None, sent = -1, hsum = None, filename = None,
            filesize = None, add_row = True):
        if fname:
            with open(fname, "rb") as f:
                struct = pickle.load(f)
                if 'default_path' in struct:
                    sent = -1
                else:
                    sent = 0
                return self.load_torrent(sent = sent, hsum = struct['hsum'],
                        filename = struct['filename'], filesize = struct['filesize'],
                        add_row = add_row)

        if not os.path.isfile("TORRENTS_PATH/" + hsum):
            self.create_torrent_file(filename, filesize, hsum)

        if type(filesize) != int:
            filesize = int(filesize)
        pieces_count = math.ceil(filesize / PIECE_LEN)

        Logger.log("Был загружен торрент файл для файла '{name}'{status}" \
                .format(name = filename, status = ", статус: загружен" if sent == -1 else ""))

        save = {
            'filename': filename,
            'filesize': filesize,
            'active': 0,
            'sent': sent,
            'last_index': sent,
        }
        if (sent == -1):
            save['finished'] = 1
        else:
            save['finished'] = 0
        self.transmissions[hsum] = save

        if add_row:
            self.tableView_main.add_row(hsum = hsum, name = filename, packs = pieces_count, sent = sent)
            self.statusWidget.init_elem(hsum, pieces_count)
            if sent == -1:
                self.statusWidget.add_rect(hsum, 0, pieces_count - 1, self.downloaded_color)

    def load_torrents(self):
        for fname in glob.glob("TORRENTS_PATH/*"):
            self.load_torrent(fname = fname)

    def create_torrent_file(self, filename, filesize, hsum, fname = None):
        if type(filesize) != str:
            filesize = str(filesize)
        struct = {'filesize': filesize, 'hsum': hsum, 'filename': filename}
        if fname:
            struct['default_path'] = fname
        fname = "TORRENTS_PATH/" + hsum
        Logger.log("Был создан торрент файл для файла '{name}'" \
                .format(name = filename))
        with open(fname, 'wb') as f:
            pickle.dump(struct, f, 0)

    def update_speed(self):
        count_speed = lambda delta: delta * PIECE_LEN / 1024.0
        for key, e in self.transmissions.items():
            delta = e['sent'] - e['last_index']
            self.tableView_main.set_speed(count_speed(delta), key)
            e['last_index'] = e['sent']
        for e in self.servers.values():
            delta = e['sent'] - e['last_index']
            self.tableView_client.set_speed(count_speed(delta), e['ip'])
            e['last_index'] = e['sent']
        for e in self.clients.values():
            for key, value in e['items'].items():
                delta = value['sent'] - value['last_index']
                self.tableView_server.set_speed(count_speed(delta), key)
                value['last_index'] = value['sent']

    @pyqtSlot()
    def on_actionStart_transmission_triggered(self):
        key = self.tableView_main.current_row
        if not key:
            return
        s = self.transmissions[key]
        if not s['finished']:
            Logger.log("Отправлен запрос на получение файла '{name}'" \
                .format(name = s['filename']))
            self.cli_thread.send_message({'action': START_TRM_ACT,
                'hsum': key, 'filename': s['filename'], 'filesize': str(s['filesize'])})

    @pyqtSlot()
    def on_actionCreate_transmission_triggered(self):
        fname = QFileDialog.getOpenFileName(self, 'Open file to create a torrent', '~')
        if fname:
            hsum = hashlib.md5(open(fname, "rb").read()).hexdigest()
            if not os.path.exists("TORRENTS_PATH/" + hsum):
                self.create_torrent_file(ntpath.basename(fname), os.path.getsize(fname), hsum, fname)
                self.load_torrent(fname = "TORRENTS_PATH/" + hsum)
            else:
                Logger.log("Торрент файл {0} уже существует".format(fname))
                QMessageBox.information(self, 'Ошибка',
                    'Торрент файл уже существует', QMessageBox.Ok)

    @pyqtSlot()
    def on_actionRemove_transmission_triggered(self):
        key = self.tableView_main.current_row
        if not key:
            return
        if self.transmissions[key]['active']:
            self.on_actionStop_transmission_triggered()
        self.tableView_main.remove_row(key)
        try:
            os.remove("TORRENTS_PATH/" + key)
        except OSError:
            pass
        Logger.log("Торрен файл для файла '{name}' был удален" \
                .format(name = self.transmissions[key]['filename']))
        del self.transmissions[key]

    @pyqtSlot()
    def on_actionStop_transmission_triggered(self, key = None):
        if not key:
            key = self.tableView_main.current_row
        s = self.transmissions[key]
        if s['active']:
            Logger.log("Отправлен запрос на остановку получения файла '{name}'" \
                .format(name = s['filename']))
            self.cli_thread.send_message({'action': STOP_TRM_ACT, 'filename': s['filename'],
                'hsum': key, 'filesize': str(s['filesize']), 'trmid': s['trmid']})
            self.transmissions[key]['active'] = 0
            self.statusWidget.remove_lines(key)
            self.on_main_table_row_changed(key)
            s['active'] = s['finished'] = s['sent'] = 0

    @pyqtSlot('QString')
    def on_main_table_row_changed(self, key):
        if self.transmissions[key]['active']:
            self.actionStop_transmission.setEnabled(True)
            self.actionStart_transmission.setEnabled(False)
        else:
            self.actionStop_transmission.setEnabled(False)
            self.actionStart_transmission.setEnabled(self.transmissions[key]['sent'] != -1)
        self.actionRemove_transmission.setEnabled(True)
        self.statusWidget.current_elem = key

    @pyqtSlot('QString')
    def on_row_double_clicked(self, key):
        form = TorrentWindow(self)
        s = self.transmissions[key]
        form.size_edit.setText(str(s['filesize']))
        form.sum_edit.setText(key)
        form.name_edit.setText(s['filename'])
        form.save_btn.setVisible(False)
        form.show()

    @pyqtSlot()
    def on_actionAdd_torrent_triggered(self):
        form = TorrentWindow(self)
        form.size_edit.setReadOnly(False)
        form.sum_edit.setReadOnly(False)
        form.name_edit.setReadOnly(False)
        form.save_btn.clicked.connect(self.add_remote_torrent)
        self.current_torrent_form = form
        form.show()

    @pyqtSlot()
    def on_action_showLogs_triggered(self):
        form = LogsWindow(self)
        form.set_logs(Logger.get_log())
        form.show()

    @pyqtSlot()
    def on_actionAbout_triggered(self):
        form = AboutWindow(self)
        form.show()

    @pyqtSlot()
    def on_timer(self):
        speed_time = 10
        status_w_time = 3
        table_w_time = 5
        if self.timer_iteration % speed_time == 0:
            self.update_speed()
        if self.timer_iteration % status_w_time == 0:
            self.statusWidget.repaint()
        if self.timer_iteration % table_w_time == 0:
            self.tableView_main.update_values()
            self.tableView_client.update_values()
            self.tableView_server.update_values()
        if self.timer_iteration > 100 * speed_time * status_w_time * table_w_time:
            self.timer_iteration = 0
        self.timer_iteration += 1

    @pyqtSlot(QEvent)
    def add_remote_torrent(self):
        form = self.current_torrent_form
        if (len(form.sum_edit.text()) != 32):
            QMessageBox.information(self, 'Ошибка',
                'Необходимо указать корректную MD5 сумму файла', QMessageBox.Ok)
        else:
            form.close()
            self.load_torrent(filename = form.name_edit.text(),
                    filesize = form.size_edit.text(), sent = 0,
                    hsum = form.sum_edit.text())
    def __init__(self, params_pipe, number_pipe, data_pipe, mads_pipe, peaks_pipe,
                 probe_path=None, screen_resolution=None):

        QMainWindow.__init__(self)

        # Receive parameters.
        params = params_pipe[0].recv()
        self.probe = load_probe(probe_path)
        self._nb_samples = params['nb_samples']
        self._sampling_rate = params['sampling_rate']
        self._display_list = list(range(self.probe.nb_channels))

        self._params = {
            'nb_samples': self._nb_samples,
            'sampling_rate': self._sampling_rate,
            'time': {
                'min': 10.0,  # ms
                'max': 1000.0,  # ms
                'init': 100.0,  # ms
            },
            'voltage': {
                'min': 10.0,  # µV
                'max': 10e+3,  # µV
                'init': 20.0,  # µV
            },
            'mads': {
                'min': 0.0,  # µV
                'max': 100,  # µV
                'init': 3,  # µV
            },
            'channels': self._display_list
        }

        self._canvas = TraceCanvas(probe_path=probe_path, params=self._params)

        central_widget = self._canvas.native

        # Create controls widgets.
        label_time = QLabel()
        label_time.setText(u"time")
        label_time_unit = QLabel()
        label_time_unit.setText(u"ms")

        self._dsp_time = QDoubleSpinBox()
        self._dsp_time.setMinimum(self._params['time']['min'])
        self._dsp_time.setMaximum(self._params['time']['max'])
        self._dsp_time.setValue(self._params['time']['init'])
        self._dsp_time.valueChanged.connect(self._on_time_changed)

        label_display_mads = QLabel()
        label_display_mads.setText(u"Display Mads")
        self._display_mads = QCheckBox()
        self._display_mads.stateChanged.connect(self._on_mads_display)

        label_display_peaks = QLabel()
        label_display_peaks.setText(u"Display Peaks")
        self._display_peaks = QCheckBox()
        self._display_peaks.stateChanged.connect(self._on_peaks_display)

        label_mads = QLabel()
        label_mads.setText(u"Mads")
        label_mads_unit = QLabel()
        label_mads_unit.setText(u"unit")
        self._dsp_mads = QDoubleSpinBox()
        self._dsp_mads.setMinimum(self._params['mads']['min'])
        self._dsp_mads.setMaximum(self._params['mads']['max'])
        self._dsp_mads.setValue(self._params['mads']['init'])
        self._dsp_mads.valueChanged.connect(self._on_mads_changed)

        label_voltage = QLabel()
        label_voltage.setText(u"voltage")
        label_voltage_unit = QLabel()
        label_voltage_unit.setText(u"µV")
        self._dsp_voltage = QDoubleSpinBox()
        self._dsp_voltage.setMinimum(self._params['voltage']['min'])
        self._dsp_voltage.setMaximum(self._params['voltage']['max'])
        self._dsp_voltage.setValue(self._params['voltage']['init'])
        self._dsp_voltage.valueChanged.connect(self._on_voltage_changed)

        # Color spikes
        self._color_spikes = QCheckBox()
        self._color_spikes.setText('See Spikes color')
        self._color_spikes.setCheckState(Qt.Checked)
        self._color_spikes.stateChanged.connect(self.display_spikes_color)



        # self._selection_channels.setGeometry(QtCore.QRect(10, 10, 211, 291))

        spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        # Create controls grid.
        grid = QGridLayout()
        # # Add time row.
        grid.addWidget(label_time, 0, 0)
        grid.addWidget(self._dsp_time, 0, 1)
        grid.addWidget(label_time_unit, 0, 2)
        # # Add voltage row.
        grid.addWidget(label_voltage, 1, 0)
        grid.addWidget(self._dsp_voltage, 1, 1)
        grid.addWidget(label_voltage_unit, 1, 2)
        # # Add Mads widgets

        grid.addWidget(label_display_mads, 3, 0)
        grid.addWidget(self._display_mads, 3, 1)

        grid.addWidget(label_mads, 4, 0)
        grid.addWidget(self._dsp_mads, 4, 1)
        grid.addWidget(label_mads_unit, 4, 2)

        grid.addWidget(self._color_spikes, 5, 0)

        # # Add spacer.
        grid.addItem(spacer)

        # # Create info group.
        controls_group = QGroupBox()
        controls_group.setLayout(grid)


        self._selection_channels = QListWidget()
        self._selection_channels.setSelectionMode(
            QAbstractItemView.ExtendedSelection
        )

        for i in range(self.probe.nb_channels):
            item = QListWidgetItem("Channel %i" % i)
            self._selection_channels.addItem(item)
            self._selection_channels.item(i).setSelected(True)

        def add_channel():
            items = self._selection_channels.selectedItems()
            self._display_list = []
            for i in range(len(items)):
                self._display_list.append(i)
            self._on_channels_changed()

        # self._selection_channels.itemClicked.connect(add_channel)

        nb_channel = self.probe.nb_channels
        self._selection_channels.itemSelectionChanged.connect(lambda: self.selected_channels(nb_channel))

        # Create info grid.
        channels_grid = QGridLayout()
        # # Add Channel selection
        # grid.addWidget(label_selection, 3, 0)
        channels_grid.addWidget(self._selection_channels, 0, 1)

        # # Add spacer.
        channels_grid.addItem(spacer)

        # Create controls group.
        channels_group = QGroupBox()
        channels_group.setLayout(channels_grid)

        # # Create controls dock.
        channels_dock = QDockWidget()
        channels_dock.setWidget(channels_group)
        channels_dock.setWindowTitle("Channels selection")

        # # Create controls dock.
        control_dock = QDockWidget()
        control_dock.setWidget(controls_group)
        control_dock.setWindowTitle("Controls")

        # Create info widgets.
        label_time = QLabel()
        label_time.setText(u"time")
        self._label_time_value = QLineEdit()
        self._label_time_value.setText(u"0")
        self._label_time_value.setReadOnly(True)
        self._label_time_value.setAlignment(Qt.AlignRight)
        label_time_unit = QLabel()
        label_time_unit.setText(u"s")
        info_buffer_label = QLabel()
        info_buffer_label.setText(u"buffer")
        self._info_buffer_value_label = QLineEdit()
        self._info_buffer_value_label.setText(u"0")
        self._info_buffer_value_label.setReadOnly(True)
        self._info_buffer_value_label.setAlignment(Qt.AlignRight)
        info_buffer_unit_label = QLabel()
        info_buffer_unit_label.setText(u"")
        info_probe_label = QLabel()
        info_probe_label.setText(u"probe")
        info_probe_value_label = QLineEdit()
        info_probe_value_label.setText(u"{}".format(probe_path))
        info_probe_value_label.setReadOnly(True)
        # TODO place the following info in another grid?
        info_probe_unit_label = QLabel()
        info_probe_unit_label.setText(u"")

        info_spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        # Create info grid.
        info_grid = QGridLayout()
        # # Time row.
        info_grid.addWidget(label_time, 0, 0)
        info_grid.addWidget(self._label_time_value, 0, 1)
        info_grid.addWidget(label_time_unit, 0, 2)
        # # Buffer row.
        info_grid.addWidget(info_buffer_label, 1, 0)
        info_grid.addWidget(self._info_buffer_value_label, 1, 1)
        info_grid.addWidget(info_buffer_unit_label, 1, 2)
        # # Probe row.
        info_grid.addWidget(info_probe_label, 2, 0)
        info_grid.addWidget(info_probe_value_label, 2, 1)
        info_grid.addWidget(info_probe_unit_label, 2, 2)
        # # Spacer.
        info_grid.addItem(info_spacer)

        # Create info group.
        info_group = QGroupBox()
        info_group.setLayout(info_grid)

        # Create info dock.
        info_dock = QDockWidget()
        info_dock.setWidget(info_group)
        info_dock.setWindowTitle("Info")

        # Create thread.
        thread = Thread(number_pipe, data_pipe, mads_pipe, peaks_pipe)
        thread.number_signal.connect(self._number_callback)
        thread.reception_signal.connect(self._reception_callback)
        thread.start()

        # Add dockable windows.
        self.addDockWidget(Qt.LeftDockWidgetArea, control_dock)
        self.addDockWidget(Qt.LeftDockWidgetArea, info_dock)
        self.addDockWidget(Qt.LeftDockWidgetArea, channels_dock)
        # Set central widget.
        self.setCentralWidget(central_widget)
        # Set window size.
        if screen_resolution is not None:
            screen_width = screen_resolution.width()
            screen_height = screen_resolution.height()
            self.resize(screen_width, screen_height)
        # Set window title.
        self.setWindowTitle("SpyKING Circus ORT - Read 'n' Qt display")

        print(" ")  # TODO remove?
Exemplo n.º 10
0
    def __init__(self, params_pipe, number_pipe, templates_pipe, spikes_pipe,
                 probe_path=None, screen_resolution=None):

        QMainWindow.__init__(self)

        # Receive parameters.
        params = params_pipe[0].recv()
        self.probe = load_probe(probe_path)
        self._nb_samples = params['nb_samples']
        self._sampling_rate = params['sampling_rate']
        self._display_list = []

        self._params = {
            'nb_samples': self._nb_samples,
            'sampling_rate': self._sampling_rate,
            'time': {
                'min': 10.0,  # ms
                'max': 100.0,  # ms
                'init': 100.0,  # ms
            },
            'voltage': {
                'min': -200,  # µV
                'max': 20e+1,  # µV
                'init': 50.0,  # µV
            },
            'templates': self._display_list
        }

        self._canvas_mea = MEACanvas(probe_path=probe_path, params=self._params)
        self._canvas_template = TemplateCanvas(probe_path=probe_path, params=self._params)
        self._canvas_rate = RateCanvas(probe_path=probe_path, params=self._params)
        self._canvas_isi = ISICanvas(probe_path=probe_path, params=self._params)

        self.cells = Cells({})
        self._nb_buffer = 0

        # TODO ISI
        self.isi_bin_width, self.isi_x_max = 2, 25.0

        canvas_template_widget = self._canvas_template.native
        canvas_mea = self._canvas_mea.native
        canvas_rate = self._canvas_rate.native
        canvas_isi = self._canvas_isi.native

        # Create controls widgets.
        label_time = QLabel()
        label_time.setText(u"time")
        label_time_unit = QLabel()
        label_time_unit.setText(u"ms")

        self._dsp_time = QDoubleSpinBox()
        self._dsp_time.setMinimum(self._params['time']['min'])
        self._dsp_time.setMaximum(self._params['time']['max'])
        self._dsp_time.setValue(self._params['time']['init'])
        self._dsp_time.valueChanged.connect(self._on_time_changed)

        label_voltage = QLabel()
        label_voltage.setText(u"voltage")
        label_voltage_unit = QLabel()
        label_voltage_unit.setText(u"µV")
        self._dsp_voltage = QDoubleSpinBox()
        self._dsp_voltage.setMinimum(self._params['voltage']['min'])
        self._dsp_voltage.setMaximum(self._params['voltage']['max'])
        self._dsp_voltage.setValue(self._params['voltage']['init'])
        self._dsp_voltage.valueChanged.connect(self._on_voltage_changed)

        label_binsize = QLabel()
        label_binsize.setText(u"Bin size")
        label_binsize_unit = QLabel()
        label_binsize_unit.setText(u"second")
        self._dsp_binsize = QDoubleSpinBox()
        self._dsp_binsize.setRange(0.1, 10)
        self._dsp_binsize.setSingleStep(0.1)
        self.bin_size = 1
        self._dsp_binsize.setValue(self.bin_size)
        self._dsp_binsize.valueChanged.connect(self._on_binsize_changed)

        label_zoomrates = QLabel()
        label_zoomrates.setText(u'Zoom rates')
        self._zoom_rates = QDoubleSpinBox()
        self._zoom_rates.setRange(1, 50)
        self._zoom_rates.setSingleStep(0.1)
        self._zoom_rates.setValue(1)
        self._zoom_rates.valueChanged.connect(self._on_zoomrates_changed)

        label_time_window = QLabel()
        label_time_window.setText(u'Time window rates')
        label_time_window_unit = QLabel()
        label_time_window_unit.setText(u'second')
        self._dsp_tw_rate = QDoubleSpinBox()
        self._dsp_tw_rate.setRange(1, 50)
        self._dsp_tw_rate.setSingleStep(self.bin_size)
        self._dsp_tw_rate.setValue(50 * self.bin_size)
        self._dsp_tw_rate.valueChanged.connect(self._on_time_window_changed)

        label_tw_from_start = QLabel()
        label_tw_from_start.setText('Time scale from start')
        self._tw_from_start = QCheckBox()
        self._tw_from_start.setChecked(True)

        self._selection_templates = QTableWidget()
        self._selection_templates.setSelectionMode(
            QAbstractItemView.ExtendedSelection
        )
        self._selection_templates.setColumnCount(3)
        self._selection_templates.setVerticalHeaderLabels(['Nb template', 'Channel', 'Amplitude'])
        self._selection_templates.insertRow(0)
        self._selection_templates.setItem(0, 0, QTableWidgetItem('Nb template'))
        self._selection_templates.setItem(0, 1, QTableWidgetItem('Channel'))
        self._selection_templates.setItem(0, 2, QTableWidgetItem('Amplitude'))

        # self._selection_channels.setGeometry(QtCore.QRect(10, 10, 211, 291))
        # for i in range(self.nb_templates):
        #     numRows = self.tableWidget.rowCount()
        #     self.tableWidget.insertRow(numRows)

        #     item = QTableWidgetItem("Template %i" % i)
        #     self._selection_templates.addItem(item)
        #     self._selection_templates.item(i).setSelected(False)

        spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        # Create controls grid.
        grid = QGridLayout()
        # # Add time row.
        grid.addWidget(label_time, 0, 0)
        grid.addWidget(self._dsp_time, 0, 1)
        grid.addWidget(label_time_unit, 0, 2)
        # # Add voltage row.
        grid.addWidget(label_voltage, 1, 0)
        grid.addWidget(self._dsp_voltage, 1, 1)
        grid.addWidget(label_voltage_unit, 1, 2)

        # # Add binsize row.
        grid.addWidget(label_binsize, 2, 0)
        grid.addWidget(self._dsp_binsize, 2, 1)
        grid.addWidget(label_binsize_unit, 2, 2)

        # # Add zoom rate
        grid.addWidget(label_zoomrates, 3, 0)
        grid.addWidget(self._zoom_rates, 3, 1)

        # Add a double checkbox for time window
        grid.addWidget(label_time_window, 4, 0)
        grid.addWidget(self._dsp_tw_rate, 4, 1)
        grid.addWidget(label_time_window_unit, 4, 2)

        ## Add checkbox to display the rates from start
        grid.addWidget(label_tw_from_start, 5, 0)
        grid.addWidget(self._tw_from_start, 5, 1)

        # # Add spacer.
        grid.addItem(spacer)

        # # Create info group.
        controls_group = QGroupBox()
        controls_group.setLayout(grid)

        # Create info grid.
        templates_grid = QGridLayout()
        # # Add Channel selection
        # grid.addWidget(label_selection, 3, 0)
        templates_grid.addWidget(self._selection_templates, 0, 1)

        def add_template():
            items = self._selection_templates.selectedItems()
            self._display_list = []
            for i in range(len(items)):
                self._display_list.append(i)
            self._on_templates_changed()

        # self._selection_templates.itemClicked.connect(add_template)

        # Template selection signals
        self._selection_templates.itemSelectionChanged.connect(lambda: self.selected_templates(
            self.nb_templates))

        # Checkbox to display all the rates
        self._tw_from_start.stateChanged.connect(self.time_window_rate_full)
        # self._selection_templates.itemPressed(0, 1).connect(self.sort_template())

        # # Add spacer.
        templates_grid.addItem(spacer)

        # Create controls group.
        templates_group = QGroupBox()
        templates_group.setLayout(templates_grid)

        # # Create controls dock.
        templates_dock = QDockWidget()
        templates_dock.setWidget(templates_group)
        templates_dock.setWindowTitle("Channels selection")

        # # Create controls dock.
        control_dock = QDockWidget()
        control_dock.setWidget(controls_group)
        control_dock.setWindowTitle("Controls")

        # Create info widgets.
        label_time = QLabel()
        label_time.setText(u"time")
        self._label_time_value = QLineEdit()
        self._label_time_value.setText(u"0")
        self._label_time_value.setReadOnly(True)
        self._label_time_value.setAlignment(Qt.AlignRight)
        label_time_unit = QLabel()
        label_time_unit.setText(u"s")
        info_buffer_label = QLabel()
        info_buffer_label.setText(u"buffer")
        self._info_buffer_value_label = QLineEdit()
        self._info_buffer_value_label.setText(u"0")
        self._info_buffer_value_label.setReadOnly(True)
        self._info_buffer_value_label.setAlignment(Qt.AlignRight)
        info_buffer_unit_label = QLabel()
        info_buffer_unit_label.setText(u"")
        info_probe_label = QLabel()
        info_probe_label.setText(u"probe")
        info_probe_value_label = QLineEdit()
        info_probe_value_label.setText(u"{}".format(probe_path))
        info_probe_value_label.setReadOnly(True)
        # TODO place the following info in another grid?
        info_probe_unit_label = QLabel()
        info_probe_unit_label.setText(u"")

        info_spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        # Create info grid.
        info_grid = QGridLayout()
        # # Time row.
        info_grid.addWidget(label_time, 0, 0)
        info_grid.addWidget(self._label_time_value, 0, 1)
        info_grid.addWidget(label_time_unit, 0, 2)
        # # Buffer row.
        info_grid.addWidget(info_buffer_label, 1, 0)
        info_grid.addWidget(self._info_buffer_value_label, 1, 1)
        info_grid.addWidget(info_buffer_unit_label, 1, 2)
        # # Probe row.
        info_grid.addWidget(info_probe_label, 2, 0)
        info_grid.addWidget(info_probe_value_label, 2, 1)
        info_grid.addWidget(info_probe_unit_label, 2, 2)
        # # Spacer.
        info_grid.addItem(info_spacer)

        # Create info group.
        info_group = QGroupBox()
        info_group.setLayout(info_grid)

        # Create info dock.
        info_dock = QDockWidget()
        info_dock.setWidget(info_group)
        info_dock.setWindowTitle("Info")

        # Create thread.
        thread = Thread(number_pipe, templates_pipe, spikes_pipe)
        thread.number_signal.connect(self._number_callback)
        thread.reception_signal.connect(self._reception_callback)
        thread.start()

        # Add dockable windows.
        self.addDockWidget(Qt.LeftDockWidgetArea, control_dock)
        self.addDockWidget(Qt.LeftDockWidgetArea, info_dock)
        self.addDockWidget(Qt.LeftDockWidgetArea, templates_dock)

        # Add Grid Layout for canvas
        canvas_grid = QGridLayout()

        group_canv_temp = QDockWidget()
        group_canv_temp.setWidget(canvas_template_widget)
        group_canv_mea = QDockWidget()
        group_canv_mea.setWidget(canvas_mea)
        group_canv_rate = QDockWidget()
        group_canv_rate.setWidget(canvas_rate)
        group_canv_isi = QDockWidget()
        group_canv_isi.setWidget(canvas_isi)

        canvas_grid.addWidget(group_canv_temp, 0, 0)
        canvas_grid.addWidget(group_canv_mea, 0, 1)
        canvas_grid.addWidget(group_canv_rate, 1, 1)
        canvas_grid.addWidget(group_canv_isi, 1, 0)
        canvas_group = QGroupBox()
        canvas_group.setLayout(canvas_grid)

        # Set central widget.
        self.setCentralWidget(canvas_group)
        # Set window size.
        if screen_resolution is not None:
            screen_width = screen_resolution.width()
            screen_height = screen_resolution.height()
            self.resize(screen_width, screen_height)
        # Set window title.
        self.setWindowTitle("SpyKING Circus ORT - Read 'n' Qt display")

        print(" ")  # TODO remove?
class MessagingService:
    """
    For transmitting messages out of the device, and buffering them locally in
    case a transmission channel is unavailable - such as missing Wifi.

    The messaging service can be in one of two possible states:
    - Waiting: The service is dormant, waiting for new messages or a channel to
    become available.
    - Transmitting: The service is currently transmitting messages.

    When the local message buffer is empty, the messaging service will enter
    the waiting state until explicitly notified of new messages. If any
    messages are available, the service will attempt to transmit them every ten
    minutes, or sooner if explicitly notified.

    Channels are themselves reponsible for ensuring thread safety. For
    instance, a channel might disallow buffering new messages during an active
    transmission.
    """
    def __init__(self, wifi: Wifi, oled):
        self.wifi = wifi
        self.channels = []
        self.oled = oled
        self.package_id = config.get_string("package_id")
        self.thread = Thread(self.__messaging_loop, "MessageThread")

        # Semaphore for signaling the messaging service
        self._message_semaphore = _thread.allocate_lock()

        # Lock for protecting critical regions
        self._sync_lock = ReentrantLock()

    def start(self):
        self.thread.start()

    def notify(self):
        """
        Notify the messaging service to begin transmitting messages again. If
        the messaging service is currently in a waiting state, calling this
        method will restart it. The messaging service will return to a waiting
        state as soon as all pending messages have been transmitted, or
        channels become unavailable.
        """
        if self._message_semaphore.locked():
            self._message_semaphore.release()

    def __messaging_loop(self, thread: Thread):
        # This exception handling is necessary in order for background threads
        # to be affected by keyboard interrupts and to print stack traces in
        # case of exceptions.
        while thread.active:
            # There is no concept of a thread holding a lock with the _thread
            # library. A lock is either locked or unlocked, and if the same
            # thread attempts to acquire the same lock twice, it will block
            # itself until someone else calls release on the lock.

            if self.__has_pending_messages():
                # While there are pending messages, retry every thirty seconds
                self._message_semaphore.acquire(1, 30)
            else:
                # Otherwise wait for an explicit signal
                self._message_semaphore.acquire()
            self._sync_lock.acquire()
            try:
                if not self.__has_pending_messages():
                    continue

                for channel in self.channels:
                    channel.transmit()
            finally:
                # In case Wifi was enabled, deactivate it now to save energy
                self.wifi.deactivate()
                self._sync_lock.release()

    def __has_pending_messages(self) -> bool:
        """Check if any channels have pending messages. Not thread safe."""
        for channel in self.channels:
            if channel.has_pending_messages:
                return True
        return False

    def add_channel(self, channel):
        """
        Add a new object to be used for transmitting messages out of the
        device.
        """
        self._sync_lock.acquire()
        try:
            self.channels.append(channel)
        finally:
            self._sync_lock.release()
Exemplo n.º 12
0
class MainWindow(QMainWindow):
    send_control_init = QtCore.pyqtSignal(list, float)
    send_data_result = QtCore.pyqtSignal(list, float, list)
    send_construct_save = QtCore.pyqtSignal(int, list)
    send_plotConst = QtCore.pyqtSignal(list)
    send_plotXYZtheta = QtCore.pyqtSignal(list, list)
    send_thread = QtCore.pyqtSignal(float, list)
    send_thread2 = QtCore.pyqtSignal(float, list, list)
    send_sequenceActual = QtCore.pyqtSignal(list)
    send_sequenceSim = QtCore.pyqtSignal(int)
    send_sequenceSetAct = QtCore.pyqtSignal(int)
    send_thread2Reset = QtCore.pyqtSignal(int)

    def __init__(self):
        super().__init__()

        self.kardan_min = -150
        self.kardan_max = -60

        self.online = False
        self.torqueState = False
        self.select = 0
        self.dataList = [[], [], [], [], [], []]
        self.xyz = [0.0, 0.0, -100]
        self.alpha = 0.0
        self.theta = [0.0, 0.0, 0.0]
        self.sym = 0
        self.presAngle = []
        self.sequenceList = [0.0, 0.0, 0.0, 0.0, 0.0]
        self.speed = 10.0
        self.sequenceStatus = 0
        self.sequenceCount = 0
        self.kardanStatus = 0

        self.initWindow()

        self.dockWidget()
        self.show()

        settings = QSettings('construct')
        select_getSave = settings.value('select1', type=int)

        for i in range(len(self.dataList)):
            self.dataList[i] = settings.value('list' + str(i), 1024)

        if self.dataList[0] != 1024:
            self.send_construct_save.emit(select_getSave, self.dataList)

        try:
            sequenceListSave = QSettings('SequenceList')
            self.sequenceData = sequenceListSave.value('select2', list)

            if self.sequenceData != None:
                for i in range(len(self.sequenceData)):
                    self.send_sequenceActual.emit(self.sequenceData[i])
        except:
            print("error")

        self.git_thread = Thread(self)
        self.git_thread.send_actualPoseT.connect(self.dataFromThread)
        self.git_thread.send_visialisation.connect(self.Visual)
        self.git_thread.send_finish.connect(self.dynamixelFinish)
        self.git_thread.start()

    def dataFromThread(self, presAngleT):
        self.xyz = forward(presAngleT, self.dataListActual)
        self.presAngle = presAngleT
        self.send_data_result.emit(self.xyz, self.presAngle[3], self.presAngle)

    def Visual(self, xyz, theta):
        self.send_plotXYZtheta.emit(xyz, theta)
        if self.sequenceStatus == 1:
            self.send_data_result.emit(self.xyz, self.alpha, self.theta)

    def initWindow(self):
        self.setWindowTitle("Delta Robot Studio")
        self.setGeometry(0, 0, 790, 470)
        #self.setMaximumSize(790, 470)
        #self.showMaximized()
        mainMenu = self.menuBar()
        windowMenu = mainMenu.addMenu('Window')
        motorMenu = mainMenu.addMenu('Connect motors')
        kardanMenu = mainMenu.addMenu('Cardan Joint')

        self.mainLayout = QHBoxLayout()

        constructWindow = QAction('Construct', self, checkable=True)
        constructWindow.setChecked(True)
        constructWindow.triggered.connect(self.constructWindow)
        windowMenu.addAction(constructWindow)

        controlWindow = QAction('Control', self, checkable=True)
        controlWindow.setChecked(True)
        controlWindow.triggered.connect(self.controlWindow)
        windowMenu.addAction(controlWindow)

        resultWindow = QAction('Result', self, checkable=True)
        resultWindow.setChecked(True)
        resultWindow.triggered.connect(self.resultWindow)
        windowMenu.addAction(resultWindow)
        sequToolWindow = QAction('Sequence tool', self, checkable=True)
        sequToolWindow.setChecked(True)
        sequToolWindow.triggered.connect(self.sequToolWindow)
        windowMenu.addAction(sequToolWindow)

        sequWindow = QAction('Sequence', self, checkable=True)
        sequWindow.setChecked(True)
        sequWindow.triggered.connect(self.sequWindow)
        windowMenu.addAction(sequWindow)

        self.onlineWindow = QAction('Online', self, checkable=True)
        self.onlineWindow.setChecked(False)
        self.onlineWindow.triggered.connect(self.onlineWindowDef)
        motorMenu.addAction(self.onlineWindow)

        self.torqueWindow = QAction('Motor torque', self, checkable=True)
        self.torqueWindow.setChecked(False)
        self.torqueWindow.triggered.connect(self.torqueWindowDef)
        motorMenu.addAction(self.torqueWindow)

        kardanEnable = QAction('Cardan Joint', self, checkable=True)
        kardanEnable.setChecked(False)
        kardanEnable.triggered.connect(self.kardanEnable)
        kardanMenu.addAction(kardanEnable)
        self.kardan_set = QAction('Cardan settings', self, checkable=False)
        self.kardan_set.triggered.connect(self.kardanSettings)
        kardanMenu.addAction(self.kardan_set)

    def kardanSettings(self, state):
        min, okPressed = QInputDialog.getDouble(self, "Cardan settings",
                                                "minimal position:",
                                                self.kardan_min, -1000, 0, 2)
        if okPressed:
            self.kardan_min = min
        max, okPressed = QInputDialog.getDouble(self, "Cardan settings",
                                                "maximal position:",
                                                self.kardan_max, -1000, 0, 2)
        if okPressed:
            self.kardan_max = max

    def kardanEnable(self, state):
        if state: self.kardanStatus = 1
        else: self.kardanStatus = 0

    def constructWindow(self, state):
        if state: self.dockConstruct.show()
        else: self.dockConstruct.hide()

    def controlWindow(self, state):
        if state: self.dockControl.show()
        else: self.dockControl.hide()

    def resultWindow(self, state):
        if state: self.dockDataResult.show()
        else: self.dockDataResult.hide()

    def sequToolWindow(self, state):
        if state: self.dockSequenceTool.show()
        else: self.dockSequenceTool.hide()

    def sequWindow(self, state):
        if state: self.dockSequence.show()
        else: self.dockSequence.hide()

    def onlineWindowDef(self, state):
        if state:
            try:
                init()
                self.online = True
                self.central_widget.addWidget(self.dockSequenceItem)
                self.central_widget.setCurrentWidget(self.dockSequenceItem)
                self.dockSequence.hide()
                self.send_sequenceSim.emit(0)
                QMessageBox.about(self, "Succes", "Online mode enable")
            except:
                QMessageBox.about(self, "Warning", "Connect converter to port")
                self.onlineWindow.setChecked(False)
        else:
            try:
                close()
                self.online = False
                self.torqueState = False
                self.torqueWindow.setChecked(False)
                self.central_widget.setCurrentWidget(self.Visualization)
                self.send_sequenceSim.emit(1)
                self.central_widget.removeWidget(self.dockSequenceItem)
                self.dockSequence.setWidget(self.dockSequenceItem)
                self.dockSequence.show()
                QMessageBox.about(self, "Succes", "Online mode disable")
            except:
                QMessageBox.about(self, "Warning", "Somethong it's wrong")

    def torqueWindowDef(self, state):
        if state:
            if (self.online == True):
                try:
                    torque(True)
                    self.torqueState = True
                    self.presAngle = getPoseInit()
                    self.xyz = forward(self.presAngle, self.dataListActual)
                    self.send_control_init.emit(self.xyz, self.presAngle[3])
                    self.send_data_result.emit(self.xyz, self.presAngle[3],
                                               self.presAngle)
                    self.send_plotXYZtheta.emit(self.xyz, self.presAngle)
                    QMessageBox.about(self, "Succes", "Motor torque enable")

                except:
                    QMessageBox.about(self, "Warning", "Connect motors")
                    self.torqueWindow.setChecked(False)
            else:
                self.torqueWindow.setChecked(False)
                QMessageBox.about(self, "Warning", "Go online first")
        else:
            try:
                torque(False)
                self.torqueState = False
                QMessageBox.about(self, "Succes", "Motor torque disable")
            except:
                QMessageBox.about(self, "Warning", "Somethong it's wrong")
                self.torqueWindow.setChecked(False)

    def dockWidget(self):
        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)

        self.infoText = QLabel("Value out of range")
        self.infoText.setStyleSheet(
            'color: black; background-color: rgb(255, 255, 255);')
        self.infoText.setAlignment(QtCore.Qt.AlignCenter
                                   | QtCore.Qt.AlignVCenter)
        self.central_widget.addWidget(self.infoText)

        self.Visualization = Plot(self)
        self.central_widget.addWidget(self.Visualization)
        self.central_widget.setCurrentWidget(self.Visualization)

        self.dockConstruct = QDockWidget("Construct", self)
        self.dockControl = QDockWidget("Control", self)
        self.dockDataResult = QDockWidget("Result", self)
        self.dockSequenceTool = QDockWidget("Tool", self)
        self.dockSequence = QDockWidget("Sequence", self)

        self.dockDataResult.setMaximumHeight(35)
        self.dockSequence.setMaximumHeight(62)
        self.dockConstruct.setFeatures(QDockWidget.DockWidgetMovable)
        self.dockControl.setFeatures(QDockWidget.DockWidgetMovable)
        self.dockDataResult.setFeatures(QDockWidget.DockWidgetMovable)
        self.dockSequenceTool.setFeatures(QDockWidget.DockWidgetMovable)
        self.dockSequence.setFeatures(QDockWidget.DockWidgetMovable)

        self.dockConstructItem = construct_class(self)
        self.dockControlItem = controll_class(self)
        self.dockDataResultItem = dataResult_class(self)
        self.dockSequenceToolItem = sequenceTool_class(self)
        self.dockSequenceItem = sequence_class(self)

        self.dockConstruct.setWidget(self.dockConstructItem)
        self.dockControl.setWidget(self.dockControlItem)
        self.dockDataResult.setWidget(self.dockDataResultItem)
        self.dockSequenceTool.setWidget(self.dockSequenceToolItem)
        self.dockSequence.setWidget(self.dockSequenceItem)
        self.dockDataResult.setTitleBarWidget(QWidget(None))
        self.dockSequence.setTitleBarWidget(QWidget(None))

        self.addDockWidget(Qt.RightDockWidgetArea, self.dockConstruct)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockControl)
        self.addDockWidget(Qt.BottomDockWidgetArea, self.dockDataResult)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockSequenceTool)
        self.addDockWidget(Qt.TopDockWidgetArea, self.dockSequence)
        self.tabifyDockWidget(self.dockConstruct, self.dockControl)

        self.dockControlItem.dataControl.connect(self.send_xyz_return)
        self.dockConstructItem.send_construct.connect(
            self.send_construct_return)
        self.dockSequenceToolItem.send_sequenceTool.connect(
            self.sequenceTool_return)
        self.dockSequenceToolItem.send_sequenceToolStart.connect(
            self.sequenceToolStart)
        self.dockSequenceToolItem.send_sequenceToolStop.connect(
            self.sequenceToolStop)
        self.dockSequenceToolItem.send_sequenceToolSave.connect(
            self.sequenceToolSave)
        self.dockSequenceItem.send_sequence.connect(self.sequence)

        self.setLayout(self.mainLayout)

    def sequenceToolSave(self, data):
        self.sequenceData = data

    def sequenceTool_return(self, delay):
        self.sequenceList[0] = self.xyz[0]
        self.sequenceList[1] = self.xyz[1]
        self.sequenceList[2] = self.xyz[2]
        self.sequenceList[3] = self.alpha
        self.sequenceList[4] = delay
        self.send_sequenceActual.emit(self.sequenceList)

    def dynamixelFinish(self, finish):
        if self.sequenceStatus == 1 and self.online == True and self.torqueState == True:
            if self.sequenceCount < len(self.sequenceData):
                self.xyz[0] = self.sequenceData[self.sequenceCount][0]
                self.xyz[1] = self.sequenceData[self.sequenceCount][1]
                self.xyz[2] = self.sequenceData[self.sequenceCount][2]
                self.alpha = self.sequenceData[self.sequenceCount][3]
                self.send_xyz_return(self.xyz, self.alpha, self.speed)
                self.send_sequenceSetAct.emit(self.sequenceCount)
                self.sequenceCount += 1
        elif self.sequenceStatus == 1 and (self.online == False
                                           or self.torqueState == False):
            self.send_sequenceSetAct.emit(self.sequenceCount - 1)
            if self.sequenceCount < len(self.sequenceData):
                self.xyz[0] = self.sequenceData[self.sequenceCount][0]
                self.xyz[1] = self.sequenceData[self.sequenceCount][1]
                self.xyz[2] = self.sequenceData[self.sequenceCount][2]
                self.alpha = self.sequenceData[self.sequenceCount][3]
                self.send_xyz_return(self.xyz, self.alpha, self.speed)
                self.sequenceCount += 1

    def sequenceToolStop(self, stop):
        self.sequenceStatus = 0
        self.sequenceCount = 0

    def sequenceToolStart(self, speed, data):
        try:
            self.speed = speed
            self.sequenceData = data
            self.send_sequenceSetAct.emit(0)
            self.sequenceStatus = 1
            self.sequenceCount = 1
            self.xyz[0] = self.sequenceData[0][0]
            self.xyz[1] = self.sequenceData[0][1]
            self.xyz[2] = self.sequenceData[0][2]
            self.alpha = self.sequenceData[0][3]
            self.send_xyz_return(self.xyz, self.alpha, self.speed)
        except:
            QMessageBox.about(self, "Error", "Add points")

    def sequence(self, data):
        self.xyz[0] = data[0]
        self.xyz[1] = data[1]
        self.xyz[2] = data[2]
        self.alpha = data[3]
        self.send_xyz_return(self.xyz, self.alpha, self.speed)

    def send_construct_return(self, select_ret, dataListRet):
        self.select, self.dataList, self.dataListActual = select_ret, dataListRet, []

        for i in range(len(self.dataList)):
            self.dataListActual.append(i)
            self.dataListActual[i] = self.dataList[i][self.select]
        inverse(self.xyz, self.dataListActual)
        self.send_data_result.emit(self.xyz, self.alpha, self.theta)
        self.send_plotConst.emit(self.dataListActual)
        self.send_plotXYZtheta.emit(self.xyz, self.theta)

    def send_xyz_return(self, xyz_ret, alpha, speed):
        self.xyz = xyz_ret
        self.speed = speed
        self.alpha = alpha

        self.status, self.theta = inverse(self.xyz, self.dataListActual)
        p1 = np.array([0, 0, 0])
        p2 = np.array([self.xyz[0], self.xyz[1], self.xyz[2]])
        squared_dist = np.sum(p1**2 + p2**2, axis=0)
        dist = np.sqrt(squared_dist)

        if self.status == 1 or self.alpha < -150 or self.alpha > 150 or (
                self.kardanStatus == 1 and
            (dist < -self.kardan_max or dist > -self.kardan_min)):
            self.central_widget.setCurrentWidget(self.infoText)
        else:
            dataDynamixel = [
                self.theta[0], self.theta[1], self.theta[2], self.alpha
            ]
            if (self.online == True and self.torqueState == True):
                self.central_widget.setCurrentWidget(self.dockSequenceItem)
                self.send_thread.emit(speed, dataDynamixel)
                self.sym = 0
            elif (self.sym == 0):
                QMessageBox.about(
                    self, "Warning",
                    "Simulation mode, to exit enable online mode and motor torque"
                )
                self.central_widget.setCurrentWidget(self.Visualization)
                self.sym = 1
            else:
                self.send_thread2.emit(speed, self.xyz, self.theta)
                self.central_widget.setCurrentWidget(self.Visualization)
                if self.sequenceStatus == 0:
                    self.send_data_result.emit(self.xyz, self.alpha,
                                               self.theta)

    def closeEvent(self, event):
        settings = QSettings('construct')
        settings.setValue('select1', self.select)

        for i in range(len(self.dataList)):
            settings.setValue('list' + str(i), self.dataList[i])

        sequenceListSave = QSettings('SequenceList')
        sequenceListSave.setValue('select2', self.sequenceData)
        QMainWindow.closeEvent(self, event)

        if (self.torqueState == True):
            torque(0)
Exemplo n.º 13
0
class MainPage(QMainWindow):
    engine = create_engine('sqlite:///database.db')
    session = sessionmaker()
    session.configure(bind=engine)
    database.Base.metadata.create_all(engine)
    s = session()

    def __init__(self):
        super(MainPage, self).__init__()

        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.drm = True

        self.ui.cmb_room.addItem("Seçiniz")
        self.ui.cmb_room.addItems([str(i) for i in range(1, 21)])

        self.ui.table_customer.setHorizontalHeaderLabels(('TC', 'Adı', 'Soyadı', 'Oda No'))
        self.ui.table_customer.setColumnCount(4)
        self.set_controller()
        self.ui.table_customer.insertRow(0)

        self.ui.btn_check_in.clicked.connect(self.check_in)
        self.ui.btn_check_out.clicked.connect(self.check_out)
        self.ui.btn_add_person.clicked.connect(self.add_person)
        self.ui.check_out_date.dateChanged.connect(self.calculate_fee)

        self.th = Thread()
        self.th.changePixmap.connect(self.set_image)
        self.th.start()

    def calculate_fee(self):
        start_date = self.ui.check_in_date.date()
        end_date = self.ui.check_out_date.date()
        days = start_date.daysTo(end_date)
        self.ui.txt_fee.setText(str(days * 100) + "TL")

    @pyqtSlot(QImage)
    def set_image(self, image):
        self.ui.lbl_camera.setPixmap(QPixmap.fromImage(image))

    def add_person(self):
        try:
            resized_image = cv2.resize(self.th.take_photo(), (640, 480))
            cv2.imwrite('id.jpg', resized_image)

            img = Image.open('id.jpg')
            text = pytesseract.image_to_string(img)
            big_data = text.split("<")
            name = ""
            surname = ""
            tc_no = ""
            for i in big_data:
                if i.isalnum() and len(i) == 11:
                    tc_no = i
                elif i.isalpha() and len(i) > 1:
                    if name == "":
                        name = i
                        surname = big_data[big_data.index(name) - 2]
                    else:
                        name += " " + i
            surname = surname[surname.index("\n") + 1:]
            msg = QMessageBox()
            msg.setWindowTitle('Kimlik Verileri')
            msg.setText('Kimlik Bilgileri\nTC :' + tc_no + '\nAdı Soyadı :' + name + " " + surname)
            msg.setIcon(QMessageBox.Question)
            msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            x = msg.exec_()
            if x == 1024:
                self.ui.table_customer.setItem(0, 0, QTableWidgetItem(tc_no))
                self.ui.table_customer.setItem(0, 1, QTableWidgetItem(name))
                self.ui.table_customer.setItem(0, 2, QTableWidgetItem(surname))
                self.ui.btn_add_person.setEnabled(False)

                data = self.s.query(MusteriListesi).filter(MusteriListesi.tc_no == tc_no).first()
                if data:
                    self.ui.table_customer.setItem(0, 3, QTableWidgetItem(data.oda_no.oda_no))
                    self.ui.btn_check_out.setEnabled(True)
                else:
                    self.ui.check_in_date.setEnabled(True)
                    self.ui.check_out_date.setEnabled(True)
                    self.ui.cmb_room.setEnabled(True)
                    self.ui.txt_fee.setEnabled(True)
                    self.ui.btn_check_in.setEnabled(True)

        except Exception:
            msg = QMessageBox()
            msg.setWindowTitle('Okuma Hatası')
            msg.setText('Kimlik bilgileri okunamadı!\nLütfen yeniden deneyin.')
            msg.setIcon(QMessageBox.Warning)
            msg.setStandardButtons(QMessageBox.Ok)
            msg.exec_()

    def check_in(self):
        check_detail = GirisCikis(giris_tarihi=self.ui.check_in_date.text(),
                                  cikis_tarihi=self.ui.check_out_date.text(),
                                  oda_no=self.ui.cmb_room.currentText(),
                                  fiyat=self.ui.txt_fee.text())

        customer = MusteriListesi(tc_no=self.ui.table_customer.item(0, 0).text(),
                                  adi=self.ui.table_customer.item(0, 1).text(),
                                  soyadi=self.ui.table_customer.item(0, 2).text(),
                                  oda_no=check_detail)

        self.s.add(check_detail)
        self.s.add(customer)
        self.s.commit()

        msg = QMessageBox()
        msg.setWindowTitle('Kaydetme İşlemi')
        msg.setText('Kayıt başarı ile tamamlandı.')
        msg.setIcon(QMessageBox.Warning)
        msg.setStandardButtons(QMessageBox.Ok)
        msg.exec_()
        self.set_controller()

    def check_out(self):
        tc_no = self.ui.table_customer.item(0, 0).text()
        data = self.s.query(MusteriListesi).filter(MusteriListesi.tc_no == tc_no).first()
        self.s.query(MusteriListesi).filter(MusteriListesi.tc_no == self.ui.table_customer.item(0, 0).text()).delete()
        self.s.query(GirisCikis).filter(GirisCikis.id == data.musteri_id).delete()
        self.s.commit()

        msg = QMessageBox()
        msg.setWindowTitle('Silme İşlemi')
        msg.setText('Kayıt başarı ile silindi.')
        msg.setIcon(QMessageBox.Warning)
        msg.setStandardButtons(QMessageBox.Ok)
        msg.exec_()
        self.set_controller()

    def set_controller(self):
        date = datetime.now()
        self.ui.check_in_date.setDate(QDate(date.year, date.month, date.day))
        self.ui.check_out_date.setDate(QDate(date.year, date.month, date.day))
        self.ui.cmb_room.setCurrentIndex(0)
        self.ui.txt_fee.setText("0TL")
        self.ui.table_customer.clear()
        self.ui.table_customer.setHorizontalHeaderLabels(('TC', 'Adı', 'Soyadı', 'Oda No'))

        self.ui.check_in_date.setEnabled(False)
        self.ui.check_out_date.setEnabled(False)
        self.ui.cmb_room.setEnabled(False)
        self.ui.txt_fee.setEnabled(False)
        self.ui.btn_check_in.setEnabled(False)
        self.ui.btn_check_out.setEnabled(False)
        self.ui.btn_add_person.setEnabled(True)
Exemplo n.º 14
0
class MainWindow(QtWidgets.QMainWindow, design.Ui_MainWindow):
    """App main window"""
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.config = None
        self.config_file_path = os.path.join(
            os.path.split(os.path.abspath(__file__))[0], 'config.json')
        icon = QtGui.QIcon()
        cog_file_path = os.path.join(
            os.path.split(os.path.abspath(__file__))[0], 'cog.png')
        icon.addPixmap(QtGui.QPixmap(cog_file_path), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        self.setWindowIcon(icon)
        self.setupUi(self)
        self.report = None

        self.btn_start.disconnect()
        self.btn_start.clicked.connect(self.create_subtasks)
        self.actionCredenciais_JIRA.disconnect()
        self.actionCredenciais_JIRA.triggered.connect(self.show_configcred)
        self.actionLimpar_Log.disconnect()
        self.actionLimpar_Log.triggered.connect(self.log_entries.clear)
        self._load_configuration()
        self.thread = None
        self.config_window = ConfigWindow(self)
        self.project_key_text.textChanged.connect(self._update_config)
        self.project_key_text.setHtml(self.config['project_key'].strip())
        self._update_config()

    def _update_config(self):
        self.config['jira_user'] = str(
            self.config_window.jira_email_text.toPlainText()).strip()
        self.config['jira_token'] = str(
            self.config_window.jira_token_text.toPlainText()).strip()
        self.config['jira_base_url'] = str(
            self.config_window.jira_url_text.toPlainText()).strip()
        self.config['project_key'] = str(
            self.project_key_text.toPlainText()).strip()

        self.save_configuration()

    def _load_configuration(self):
        if os.path.isfile(self.config_file_path):
            with open(self.config_file_path) as config_file:
                self.config = json.load(config_file)
        else:
            self.save_configuration()

    def _check_config(self):
        return (self.config["jira_base_url"] and self.config["jira_token"]
                and self.config["jira_user"])

    def save_configuration(self):
        """saves/creates the configuration file"""
        if not os.path.isfile(self.config_file_path):
            if not os.path.isfile(
                    os.path.join(
                        os.path.split(os.path.abspath(__file__))[0],
                        'config.template.json')):
                self.config = {
                    "jira_base_url": "https://helpdeskmobly.atlassian.net",
                    "jira_token": "",
                    "jira_user": "",
                    "project_key": ""
                }
            else:
                with open(
                        os.path.join(
                            os.path.split(os.path.abspath(__file__))[0],
                            'config.template.json')) as template_config_file:
                    self.config = json.load(template_config_file)
                    with open(self.config_file_path, 'w') as config_file:
                        json.dump(self.config,
                                  config_file,
                                  sort_keys=True,
                                  indent=4)

        with open(self.config_file_path, 'w') as config_file:
            json.dump(self.config, config_file, sort_keys=True, indent=4)

    def show_configcred(self):
        """pops up the configuration window"""
        self.config_window.show()

    def add_log_post(self, log_data):
        """logs message to the board"""
        self.log_entries.append(log_data)
        self.log_entries.moveCursor(QtGui.QTextCursor.End)

    def set_progress_bar(self, value, total):
        """updates progress bar to value"""
        self.progress_bar.setValue(value)
        self.progress_bar.setMaximum(total)

    def create_subtasks(self):
        """Get the data from the table and create each subtask (DEV and QA)"""
        if not self._check_config():
            self.add_log_post("Verifique suas configurações (CTRL+J)")
            return
        self.progress_bar.setValue(0)
        self.log_entries.clear()
        if self.thread is not None and self.thread.isRunning():
            self.thread.stop()
            self.thread = None
            return
        task_list = list()
        raw_html = self.stories_data.toHtml()
        html_data = BeautifulSoup(raw_html, features='lxml')
        for line_break in html_data.find_all("br"):
            line_break.replace_with("\n")

        for row in html_data.findAll('tr'):
            cell = row.findAll('td')
            if len(cell) == 5:
                task = {
                    "parent":
                    cell[0].text.strip('\n'),
                    "title":
                    cell[1].text.strip('\n').replace("\n", " "),
                    "desc":
                    cell[2].text.strip('\n'),
                    "devpts":
                    float(cell[3].text.strip('\n') or 0),
                    "qapts":
                    float(cell[4].text.strip('\n'))
                    if cell[4].text.strip('\n') else ""
                }
                task_list.append(task)
            else:
                self.add_log_post(
                    "dá uma olhada na sua tabela, todas as linhas tem que ter 5 colunas: \
                    \n| Parent Story | Title | Description | DEV Points | QA Points |"
                )

        self.thread = Thread(task_list, self.config)
        self.thread.add_log_post.connect(self.add_log_post)
        self.thread.set_progress_bar.connect(self.set_progress_bar)
        self.thread.finished.connect(self.done)
        self.btn_stop.setEnabled(True)
        self.btn_stop.disconnect()
        self.btn_stop.clicked.connect(self.done)
        self.btn_start.setEnabled(False)
        self.thread.start()

    def done(self):
        """Controls UI when thread is done and kills eventual remaining threads"""
        if self.thread is not None and self.thread.isRunning():
            self.thread.stop()
            self.thread = None
        self.btn_stop.setEnabled(False)
        self.btn_start.setEnabled(True)
        self.progress_bar.setValue(0)
        self.add_log_post("Processos e conexões terminadas.")
Exemplo n.º 15
0
class Ntp:
    """
    A service for synchronizing the local clock with an NTP service once a day.
    If the NTP service is unavailable, this service will retry synchronization
    every hour.
    """

    def __init__(self, wifi: Wifi, oled):
        self.wifi = wifi
        self.oled = oled
        self.thread = Thread(self.__run, "NtpThread")

    def start(self):
        self.thread.start()
    
    def __run(self, thread: Thread):
        while thread.active:
            self.wifi.acquire()
            try:
                if self.wifi.connect():
                    utime.sleep(5)  # Sometimes it fails if we are too fast
                    self.__settime()
                    print("Updated clock with NTP")
                    self.oled.push_line("Updated clock")
                    continue
            except IndexError:
                print("Failed to update clock")
                pass
            finally:
                self.wifi.release()
                self.wifi.deactivate(False)
                utime.sleep(60 * 60 * 24)
            
            # Retry in an hour
            utime.sleep(60 * 60)
    
    def __time(self):
        ntp_query = bytearray(48)
        ntp_query[0] = 0x1B
        addr = socket.getaddrinfo(HOST, 123)[0][-1]
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        try:
            for _ in range(5):
                try:
                    s.settimeout(1)
                    _ = s.sendto(ntp_query, addr)
                    msg = s.recv(48)
                    break
                except OSError:
                    pass
        finally:
            s.close()

        val = struct.unpack("!I", msg[40:44])[0]
        return val - NTP_DELTA


    def __settime(self):
        t = utime.localtime(self.__time())
        machine.RTC().init((t[0], t[1], t[2], 0, t[3] + 1, t[4], t[5], t[6]))