Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/env python3
- # -*- coding: utf-8 -*-
- import datetime
- import locale
- import sys
- import time
- import qdarkstyle
- import threading
- from PyQt5.QtCore import QElapsedTimer, QTimer
- from PyQt5.QtCore import Qt
- from PyQt5.QtCore import pyqtSlot
- from PyQt5.QtGui import QPixmap
- from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
- from auu_ui import Ui_MainWindow
- from checksums import AuuCheckSums
- from chooseins import AuuChooseIns
- from config import setup_logging
- from mkio_http_client import MkioClient
- import mkio_exch_structure as s
- locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
- logger = setup_logging(__name__)
- AUU_CHANNEL = 0
- AUU_ADDRESS = 8
- send_packet = [0] * 32
- get_packet = [0] * 32
- condition = threading.Condition()
- class StatusThread(threading.Thread):
- def __init__(self, mkio_d):
- super().__init__()
- threading.Thread.__init__(self)
- self.counter = 0
- self.mkio_d = mkio_d
- def run(self):
- global send_packet
- global get_packet
- while 1:
- # Отправка запроса в НСВ
- send_packet[0] = 0x1234 # Запрос
- send_packet[30] = self.counter # Счетчик запросов
- logger.info('Send request ' + str(self.counter))
- if self.mkio_d.send(8, 2, send_packet) == 0:
- logger.info('Waiting answer')
- time.sleep(0.2)
- while 1:
- # logger.info('Receiving answer')
- status, self.get_packet = self.mkio_d.receive(8, 1, 32)
- # print(self.get_packet)
- if self.get_packet[30] != self.counter:
- # logger.warning('Wrong counter receive: ' + str(self.get_packet[2]))
- time.sleep(0.2)
- else:
- logger.info('Answer received')
- break
- self.counter = self.counter + 1 # Увеличиваем счетчик запросов
- if self.counter > 0xFFFF: # Проверяем на переполнение
- self.counter = 1
- class AuuWidget(QMainWindow):
- def __init__(self):
- super().__init__()
- # Настройка окошка
- self.setWindow()
- # Настройка таймеров
- self.setTimers()
- # Настройка манчестера
- self.mkio_d = MkioClient()
- self.counter = 1 # Счетчик запросов в НСВ
- self.send_packet = [0] * 32 # Пакет данных отправляемый в НСВ
- self.get_packet = [0] * 32 # Пакет данных получаемый из НСВ
- self.isStarted = False # Флаг старта режима
- self.statusReceived = False # Флаг состояния ответа от НСВ
- # Статусы
- self.canStart = False
- self.canPowerOn = False
- self.canPrim = False
- self.canCaps = False
- self.canLaunch = False
- self.current_sgi = 0
- self.powerOn = False # Питание
- self.prim = False # Применение
- self.caps = False # Крышки
- self.launch = False # Пуск
- self.error = False
- self.ping = 1
- def setWindow(self):
- self.ui = Ui_MainWindow()
- self.ui.setupUi(self)
- qss_file = open('auu_style.qss').read()
- self.setStyleSheet(qss_file)
- self.setMaximumHeight(768)
- self.setMaximumWidth(1366)
- # self.showFullScreen()
- # self.showMaximized()
- self.ui.pushButton_connect.setProperty('active', True)
- self.ui.pushButton_connect.setStyle(self.ui.pushButton_power.style())
- self.ui.pushButton_connect.setEnabled(True)
- self.ui.pushButton_power.setEnabled(False)
- self.ui.pushButton_use.setEnabled(False)
- self.ui.pushButton_nsk.setEnabled(False)
- self.ui.pushButton_launch.setEnabled(False)
- # Время работы АПП
- self.ui.label_workTime.setVisible(False)
- self.ui.label_workTimeCaption.setVisible(False)
- self.ui.label_workModeCaption.setText("Основной")
- def setTimers(self):
- self.mainTimer = QElapsedTimer()
- self.mainTimer.start()
- # Таймер обновления UI
- self.timer = QTimer()
- self.timer.setInterval(100)
- self.timer.timeout.connect(self.updateTimer)
- self.timer.start()
- # Таймер запросов на подключение к ПЭВМ
- self.timer_ping = QTimer()
- self.timer_ping.setInterval(500)
- self.timer_ping.timeout.connect(self.pingTimer)
- # Таймер обновления статусов
- self.timer_status = QTimer()
- self.timer_status.setInterval(500)
- self.timer_status.timeout.connect(self.statusTimer)
- # АПП исправно
- self.appIsOk_timer = QElapsedTimer()
- self.openFrontCapTimer = QElapsedTimer()
- self.openBackCapTimer = QElapsedTimer()
- self.closeFrontCapTimer = QElapsedTimer()
- self.closeBackCapTimer = QElapsedTimer()
- self.powerTPKTimer = QElapsedTimer()
- self.powerItem27Timer = QElapsedTimer()
- self.powerItem115Timer = QElapsedTimer()
- self.itemSGITimer = QElapsedTimer()
- self.loadSNAUTimer = QElapsedTimer()
- self.loadKRTimer = QElapsedTimer()
- def getTimeStamp(self):
- return datetime.datetime.fromtimestamp(time.time()).strftime('[%d-%m-%Y %H:%M:%S] ')
- def addSysMessage(self, text):
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + text)
- @pyqtSlot()
- def on_pushButton_checkSums_clicked(self):
- logger.info('Show checksums window')
- checksums = AuuCheckSums()
- checksums.exec()
- @pyqtSlot()
- def on_pushButton_close_clicked(self):
- self.close()
- @pyqtSlot()
- def on_pushButton_connect_clicked(self):
- logger.info('Command to connect')
- self.ui.pushButton_connect.setProperty('pushed', True)
- self.ui.pushButton_connect.setProperty('active', False)
- self.ui.pushButton_connect.setStyle(self.ui.pushButton_connect.style())
- self.ui.pushButton_connect.setEnabled(False)
- self.isStarted = True
- self.timer_ping.start()
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Старт выполнен')
- @pyqtSlot()
- def on_pushButton_power_clicked(self):
- logger.info('Command to power on')
- self.ui.pushButton_power.setProperty('pushed', True)
- self.ui.pushButton_power.setStyle(self.ui.pushButton_power.style())
- self.ui.pushButton_power.setEnabled(False)
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Выдана команда Подать питание')
- self.send_packet[21] |= 1 << 1
- @pyqtSlot()
- def on_pushButton_use_clicked(self):
- logger.info('Command to use')
- self.ui.pushButton_use.setProperty('pushed', True)
- self.ui.pushButton_use.setStyle(self.ui.pushButton_use.style())
- self.ui.pushButton_use.setEnabled(False)
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Выдана команда Применение')
- self.send_packet[21] |= 1 << 2
- @pyqtSlot()
- def on_pushButton_nsk_clicked(self):
- logger.info('Command to nsk')
- self.ui.pushButton_nsk.setProperty('pushed', True)
- self.ui.pushButton_nsk.setStyle(self.ui.pushButton_nsk.style())
- self.ui.pushButton_nsk.setEnabled(False)
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Выдана команда Открыть крышки ТПК')
- self.send_packet[21] |= 1 << 3
- @pyqtSlot()
- def on_pushButton_launch_clicked(self):
- logger.info('Command to launch')
- self.ui.pushButton_launch.setProperty('pushed', True)
- self.ui.pushButton_launch.setStyle(self.ui.pushButton_launch.style())
- self.ui.pushButton_launch.setEnabled(False)
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Выдана команда Пуск')
- self.send_packet[21] |= 1 << 4
- @pyqtSlot()
- def on_pushButton_cancel_clicked(self):
- logger.info('Command to cancel')
- self.ui.pushButton_cancel.setProperty('pushed', True)
- self.ui.pushButton_cancel.setStyle(self.ui.pushButton_cancel.style())
- self.ui.pushButton_cancel.setEnabled(False)
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Выдана команда Отбой ЦГ')
- self.ui.label_stop.startBlink('red', 'gold')
- self.send_packet[21] |= 1 << 5
- self.ui.pushButton_connect.setDisabled(True)
- self.ui.pushButton_power.setDisabled(True)
- self.ui.pushButton_use.setDisabled(True)
- self.ui.pushButton_nsk.setDisabled(True)
- self.ui.pushButton_launch.setDisabled(True)
- def printElapsedTime(self, timer:QElapsedTimer, label:QLabel):
- if timer.isValid():
- seconds = (timer.elapsed() / 1000) % 60
- minutes = (timer.elapsed() / (1000 * 60)) % 60
- hours = (timer.elapsed() / (1000 * 60 * 60)) % 24
- if int(minutes) > 0:
- if int(hours) > 0:
- label.setText(" {0:2d}ч {1:2d}м {2:2d}с".format(int(hours), int(minutes), int(seconds)))
- else:
- label.setText(" {0:2d}м {1:2d}с".format(int(minutes), int(seconds)))
- else:
- label.setText(" {0:02d}с".format(int(seconds)))
- @pyqtSlot()
- def updateTimer(self):
- self.ui.label_currentTimeCaption.setText(time.asctime())
- self.printElapsedTime(self.openFrontCapTimer, self.ui.label_pkCommandTime)
- self.printElapsedTime(self.openBackCapTimer, self.ui.label_zkCommandTime)
- self.printElapsedTime(self.closeFrontCapTimer, self.ui.label_pkReportTime)
- self.printElapsedTime(self.closeBackCapTimer, self.ui.label_zkReportTime)
- self.printElapsedTime(self.itemSGITimer, self.ui.label_itemInSGITime)
- self.printElapsedTime(self.loadSNAUTimer, self.ui.label_7)
- self.printElapsedTime(self.loadKRTimer, self.ui.label_8)
- @pyqtSlot()
- def pingTimer(self):
- if self.mkio_d.ping() == 0:
- logger.info('Ping is ok')
- self.ui.label_connectionStateText.stopBlink('lightGreen')
- self.timer_ping.stop()
- status = self.mkio_d.open("OU", AUU_CHANNEL, AUU_ADDRESS)
- if status == 0:
- logger.info('Manchester open successfully')
- self.ui.label_connectionStateText.stopBlink('lime')
- self.ui.label_appIsOkText.setStyleSheet("background-color: lime;")
- self.appIsOk_timer.start()
- zero_pack = [0] * 32
- self.mkio_d.send(8, 1, zero_pack)
- logger.warning("Send start message to APP")
- packet = [0] * 32
- packet[0] = 0xC0C0
- packet[1] = 5
- packet[2] = 0xF
- packet[3] = 2
- packet[4] = 0xC0D4
- choose_ins = AuuChooseIns()
- choose_ins.exec()
- logger.warning('Ins mode: ' + str(choose_ins.result()))
- if choose_ins.result() == 1:
- packet[3] = 1
- self.ui.plainTextEdit.appendPlainText(
- self.getTimeStamp() + 'Выбран режим работы с одной инерциальной системой')
- elif choose_ins.result() == 2:
- packet[3] = 2
- self.ui.plainTextEdit.appendPlainText(
- self.getTimeStamp() + 'Выбран режим работы с двумя инерциальными системами')
- else:
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Ошибка при установке работы ИНС')
- packet[4] += packet[3]
- logger.warning(self.mkio_d.send(8, 2, packet))
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Старт ЦГ выполнен')
- time.sleep(2)
- self.timer_status.start()
- self.send_packet[21] |= 1 << 0
- self.ui.label_connectionState.setPixmap(QPixmap('./icons/connected.svg').scaled(32, 32, Qt.KeepAspectRatio))
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Связь с СПУ-Д установлена')
- else:
- logger.error('Error while opening manchester')
- self.ui.label_connectionStateText.stopBlink('red')
- else:
- # self.ui.label_appIsOkText.startBlink("red", "yellow")
- logger.info('Cant connect')
- if self.ping:
- self.ui.label_connectionState.setPixmap(QPixmap('./icons/disconnected.svg').scaled(32, 32, Qt.KeepAspectRatio))
- self.ping = 0
- else:
- self.ui.label_connectionState.setPixmap(QPixmap('./icons/offline.svg').scaled(32, 32, Qt.KeepAspectRatio))
- self.ping = 1
- @pyqtSlot()
- def statusTimer(self):
- # Отправка запроса в НСВ
- self.send_packet[0] = 0x1234 # Запрос
- self.send_packet[30] = self.counter # Счетчик запросов
- answer_timer = 0
- # if(self.statusReceived is True):
- logger.info('Send request')
- if self.mkio_d.send(8, 2, self.send_packet) == 0:
- logger.info('Request sanded. Waiting answer')
- # self.send_packet[0] = 0
- # self.mkio_d.send(8, 2, self.send_packet)
- logger.debug("sent counter = " + str(self.counter))
- # else:
- time.sleep(0.2)
- while (1):
- # logger.info('Receiving answer')
- status, self.get_packet = self.mkio_d.receive(8, 1, 32)
- # if status == 0:
- # print(self.get_packet)
- if self.get_packet[30] != self.counter:
- # logger.warning('Wrong counter receive: ' + str(self.get_packet[2]))
- pass
- else:
- logger.info('Answer received')
- # self.timer_manch.start()
- break
- '''
- time.sleep(0.1)
- answer_timer += 1
- if answer_timer >= 50:
- break
- '''
- self.parseStatus(self.get_packet) # Парсим полученный от НСВ статус
- self.counter = self.counter + 1 # Увеличиваем счетчик запросов
- if self.counter > 0xFFFF: # Проверяем на переполнение
- self.counter = 1
- def checkStatus(self, status, parameter):
- if self.get_packet[status] & 1 << parameter == 1 << parameter:
- return True
- else:
- return False
- def status_requester(self, condition: threading.Condition):
- counter = 0
- while 1:
- with condition:
- # Отправка запроса в НСВ
- self.send_packet[0] = 0x1234 # Запрос
- self.send_packet[30] = counter # Счетчик запросов
- logger.info('Send request ' + str(counter))
- if self.mkio_d.send(8, 2, send_packet) == 0:
- logger.info('Waiting answer')
- counter += 1 # Увеличиваем счетчик запросов
- if counter > 0xFFFF: # Проверяем на переполнение
- counter = 1
- while 1:
- # logger.info('Receiving answer')
- status, self.get_packet = self.mkio_d.receive(8, 1, 32)
- logger.debug(self.get_packet)
- if self.get_packet[30] != self.counter:
- # logger.warning('Wrong counter receive: ' + str(self.get_packet[2]))
- time.sleep(0.2)
- else:
- logger.info('Answer received')
- condition.notify()
- break
- def parseStatus(self, status):
- # Кнопки управления
- if self.checkStatus(s.BUT, s.but_start):
- self.canStart = True
- if self.checkStatus(s.BUT, s.but_power_on):
- if self.powerOn is False:
- logger.info("Press power")
- self.canPowerOn = True
- self.addSysMessage("Ожидание команды \"Подать питание\"")
- self.powerOn = True
- if self.checkStatus(s.BUT, s.but_prim):
- if self.prim is False:
- logger.info("Press prim")
- self.canPrim = True
- self.addSysMessage("Ожидание команды \"Применение\"")
- self.prim = True
- if self.checkStatus(s.BUT, s.but_caps):
- if self.caps is False:
- logger.info("Press caps")
- self.canCaps = True
- self.addSysMessage("Ожидание команды \"Открыть ТПК\"")
- self.caps = True
- if self.checkStatus(s.BUT, s.but_launch):
- if self.launch is False:
- logger.info("Press launch")
- self.canLaunch = True
- self.addSysMessage("Ожидание команды \"Пуск\"")
- self.launch = True
- # СГИ
- if status[s.SGI] > 0:
- if self.current_sgi != status[s.SGI]:
- self.itemSGITimer.restart()
- self.current_sgi = status[s.SGI]
- self.ui.label_itemInSGI.setText("Изделие в СГИ " + str(status[s.SGI]))
- self.ui.label_itemInSGI.setStyleSheet("background-color: deepskyblue;")
- # Загрузка СНАУ
- if self.get_packet[18] > 0:
- if self.get_packet[18] == 100:
- self.loadSNAUTimer = QElapsedTimer()
- self.ui.progressBar.setValue(100)
- else:
- self.ui.progressBar.setValue(self.get_packet[18])
- if not self.loadSNAUTimer.isValid() and self.get_packet[18] != 100:
- self.loadSNAUTimer.start()
- # Загрузка КР
- if self.get_packet[19] > 0:
- if self.get_packet[19] == 100:
- self.loadKRTimer = QElapsedTimer()
- self.ui.progressBar_2.setValue(100)
- else:
- self.ui.progressBar_2.setValue(self.get_packet[19])
- if not self.loadKRTimer.isValid() and self.get_packet[19] != 100:
- self.loadKRTimer.start()
- # Отбой
- if (self.get_packet[17] & 1 << 5) == 1 << 5:
- if self.error is False:
- self.error = True
- self.addSysMessage('Получена команда Отбой ЦГ')
- self.addSysMessage('Отбой ЦГ!')
- self.ui.label_stop.startBlink('red', 'yellow')
- self.send_packet[21] |= 1 << 5
- logger.info('Received close command')
- # Питание ТПК
- if (self.get_packet[12] & 1 << 6) == 1 << 6:
- self.ui.label_tpkPowerText.setStyleSheet('background-color: lime')
- if not self.powerTPKTimer.isValid():
- self.powerTPKTimer.start()
- # Питание Изделие 27
- if (self.get_packet[13] & 1 << 0) == 1 << 0:
- self.ui.label_itemPowerText.setStyleSheet('background-color: lime')
- if not self.powerItem27Timer.isValid():
- self.powerItem27Timer.start()
- # Питание 115
- if (self.get_packet[13] & 1 << 1) == 1 << 1:
- self.ui.label_itemPower115Text.setStyleSheet('background-color: lime')
- if not self.powerItem115Timer.isValid():
- self.powerItem115Timer.start()
- # Интегральная исправность
- # Стыковка ТПК
- if (self.get_packet[12] & 1 << 0) == 1 << 0:
- if (self.get_packet[12] & 1 << 1) == 1 << 1:
- self.ui.label_tpkDock.setStyleSheet('background-color: red')
- else:
- self.ui.label_tpkDock.setStyleSheet('background-color: lime')
- # Стыковка Изделия
- if (self.get_packet[12] & 1 << 2) == 1 << 2:
- if (self.get_packet[12] & 1 << 3) == 1 << 3:
- self.ui.label_dockItemInTpk.setStyleSheet('background-color: red')
- else:
- self.ui.label_dockItemInTpk.setStyleSheet('background-color: lime')
- # Исходное состояние
- if (self.get_packet[12] & 1 << 4) == 1 << 4:
- if (self.get_packet[12] & 1 << 5) == 1 << 5:
- self.ui.label_itemDefault.setStyleSheet('background-color: red')
- else:
- self.ui.label_itemDefault.setStyleSheet('background-color: lime')
- # Обмен по МКИО
- # Передняя крышка
- if self.checkStatus(s.TPK, s.tpk_front_opening):
- if self.checkStatus(s.TPK, s.tpk_front_opened):
- if self.openFrontCapTimer.isValid():
- self.openFrontCapTimer = QElapsedTimer()
- self.ui.label_pkOpened.setStyleSheet('background-color: lime')
- self.ui.label_pkCommandText.stopBlink('deepskyblue')
- else:
- self.ui.label_pkCommandText.startBlink('yellow', 'lime')
- if not self.openFrontCapTimer.isValid():
- self.openFrontCapTimer.start()
- # Задняя крышка
- if self.checkStatus(s.TPK, s.tpk_back_opening):
- if self.checkStatus(s.TPK, s_tpk_back_opened):
- if self.openBackCapTimer.isValid():
- self.openBackCapTimer = QElapsedTimer()
- self.ui.label_zkOpened.setStyleSheet('background-color: lime')
- self.ui.label_zkCommandText.stopBlink('deepskyblue')
- else:
- self.ui.label_zkCommandText.startBlink('yellow', 'lime')
- if not self.openBackCapTimer.isValid():
- self.openBackCapTimer.start()
- def keyPressEvent(self, event):
- # Установлене связи с СПУ
- '''if event.key() == Qt.Key_S and event.modifiers() & Qt.ControlModifier and self.isStarted == False:
- self.timer_ping.start()
- self.isStarted = True
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Старт выполнен')
- self.ui.label_NextCommand.setStyleSheet("background-color: lightGray; color: gray;")
- self.ui.label_CurrenOperation.setText("Установление связи с СП")
- '''
- # Старт основного режима
- if event.key() == Qt.Key_F and event.modifiers() & Qt.ControlModifier:
- logger.warning("start")
- packet = [0] * 32
- packet[0] = 0xC0C0
- packet[1] = 5
- packet[2] = 0xF
- packet[3] = 2
- packet[4] = 0xC0D6
- choose_ins = AuuChooseIns()
- choose_ins.exec()
- logger.warning(choose_ins.result())
- if choose_ins.result() == 1:
- packet[3] = 1
- self.ui.plainTextEdit.appendPlainText(
- self.getTimeStamp() + 'Выбран режим работы с одной инерциальной системой')
- elif choose_ins.result() == 2:
- packet[3] = 2
- self.ui.plainTextEdit.appendPlainText(
- self.getTimeStamp() + 'Выбран режим работы с двумя инерциальными системами')
- else:
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Ошибка при установке работы ИНС')
- self.ui.plainTextEdit.appendPlainText(self.getTimeStamp() + 'Старт ЦГ выполнен')
- logger.warning(self.mkio_d.send(8, 2, packet))
- time.sleep(2)
- self.timer_status.start()
- self.send_packet[21] |= 1 << 0
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- app.setAttribute(Qt.AA_UseHighDpiPixmaps)
- auu = AuuWidget()
- auu.show()
- app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
- #cs = AuuCheckSums()
- #cs.show()
- sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement