diff --git a/PyQt_app.ui b/PyQt_app.ui index 3ec7a12..37fefb2 100644 --- a/PyQt_app.ui +++ b/PyQt_app.ui @@ -49,10 +49,10 @@ - GET URL + POST URL - + 430 @@ -75,7 +75,7 @@ Журнал запросов - + 550 @@ -103,7 +103,6 @@ 8 - 50 false @@ -128,7 +127,6 @@ - 50 false @@ -235,7 +233,7 @@ - :/img/off.svg + :/img/off.svg true @@ -254,7 +252,7 @@ - :/img/ON.svg + :/img/ON.svg true @@ -273,7 +271,7 @@ - :/img/led_on.svg + :/img/led_on.svg true @@ -295,7 +293,7 @@ - :/img/led_off.svg + :/img/led_off.svg true @@ -340,7 +338,7 @@ - :/img/led_on.svg + :/img/led_on.svg true @@ -359,7 +357,7 @@ - :/img/led_off.svg + :/img/led_off.svg true @@ -391,7 +389,7 @@ - :/img/led_on.svg + :/img/led_on.svg true @@ -410,7 +408,7 @@ - :/img/led_off.svg + :/img/led_off.svg true @@ -429,7 +427,7 @@ - :/img/off.svg + :/img/off.svg true @@ -448,7 +446,7 @@ - :/img/ON.svg + :/img/ON.svg true @@ -467,7 +465,7 @@ - :/img/off.svg + :/img/off.svg true @@ -486,7 +484,7 @@ - :/img/ON.svg + :/img/ON.svg true @@ -504,7 +502,6 @@ 8 - 50 false @@ -556,7 +553,6 @@ 8 - 50 false @@ -564,7 +560,7 @@ Освещенность - + 550 @@ -592,7 +588,6 @@ 8 - 50 false @@ -612,7 +607,6 @@ 8 - 50 false @@ -847,7 +841,6 @@ - 50 false @@ -896,7 +889,7 @@ QLCDNumber::Flat - + 310 @@ -908,7 +901,6 @@ 8 - 50 false @@ -968,7 +960,6 @@ MS Shell Dlg 2 8 - 50 false @@ -999,7 +990,7 @@ Отправить GET запрос - + 430 @@ -1048,7 +1039,7 @@ - POST URL + GET URL @@ -1071,12 +1062,13 @@ 0 0 1185 - 18 + 28 + diff --git a/config.json b/config.json index 86444ec..2e51307 100644 --- a/config.json +++ b/config.json @@ -4,19 +4,22 @@ "defaultMDNSname": "localhost:3001", "defaultPostRoute": "/postvalue", "defaultGetRoute": "/sensval", - "pressure": "355", + "LED1": true, + "LED2": false, + "LED3": true, + "pressure": 355, "temperature": [2, 45, 56, 66, 12, 30, 23, 25, 22, 15], - "button1State": "True", - "button2State": "False", - "button3State": "True", - "ambient_light": "1", - "red_light": "1", - "green_light":"1", - "blue_light":"0", - "lightness": "0", - "acceleration_x": "12", - "acceleration_y": "23", - "acceleration_z": "11", + "button1State": true, + "button2State": false, + "button3State": true, + "ambient_light": 1, + "red_light": 1, + "green_light": 1, + "blue_light": 0, + "lightness": 0, + "acceleration_x": 12, + "acceleration_y": 23, + "acceleration_z": 11, "defaultRGBLeds": { "leds1": {"red": 0, "green": 0, "blue": 0}, "leds2": {"red": 0, "green": 0, "blue": 0}, @@ -27,5 +30,6 @@ "leds7": {"red": 0, "green": 0, "blue": 0}, "leds8": {"red": 0, "green": 0, "blue": 0} }, - "defaultUpdateInterval": 5000 + "defaultUpdateInterval": 5000, + "startWithAutoupdate": false } diff --git a/main.py b/main.py index 5c334a4..8522763 100644 --- a/main.py +++ b/main.py @@ -55,20 +55,19 @@ class AppWindow(QMainWindow): self.nam = QNetworkAccessManager() # Init plotter - self.plot = Plot(self.ui.plotwidget) + self.plot = Plot(self.ui.plotwidget, initial_array=conf["temperature"]) # Set window title self.setWindowTitle("Lr4") # Init request url editors - self.ui.lineEdit_URL.setText("http://" + conf['defaultMDNSname'] + conf['defaultPostRoute']) - self.ui.lineEdit_request.setText("http://" + conf['defaultMDNSname'] + conf['defaultGetRoute']) + self.ui.lineEdit_POST_URL.setText("http://" + conf['defaultMDNSname'] + conf['defaultPostRoute']) + self.ui.lineEdit_GET_URL.setText("http://" + conf['defaultMDNSname'] + conf['defaultGetRoute']) # Init LED controls for i in range(1, 4): getattr(self.ui, f"pushButton_switch_lamp{i}").setCheckable(True) # вкл режим перекл - getattr(self.ui, f"pushButton_switch_lamp{i}").setChecked(False) # нач значение - getattr(self.ui, f"label_lamp_on{i}").hide() + self.handle_toggle_lamp(i, conf[f"LED{i}"]) getattr(self.ui, f"pushButton_switch_lamp{i}").toggled["bool"].connect(lambda val, i=i: self.handle_toggle_lamp(i, val)) # Setup request manual triggers @@ -81,8 +80,13 @@ class AppWindow(QMainWindow): # Store RGB LEDs default values self.rgb_leds_state = conf["defaultRGBLeds"] - # Init RGB LEDs as turned off - self.switch_all(False) + self.update_colors(self.rgb_leds_state) + + self.update_buttons(self.convert_buttons_state(conf)) + + # Init LCDs values + self.update_lcds(conf) + self.ui.lcd_temperature.display(conf["temperature"][-1]) # Setup RGB LED stip click handlers for led in self.ui.led_array: @@ -107,6 +111,8 @@ class AppWindow(QMainWindow): # Setup autoupdate toggler self.ui.checkBox_autoupdate.stateChanged.connect(self.handle_toggle_autoupdate) + self.ui.checkBox_autoupdate.setChecked(conf["startWithAutoupdate"]) + def handle_toggle_autoupdate(self): """ @@ -116,6 +122,8 @@ class AppWindow(QMainWindow): if self.ui.checkBox_autoupdate.isChecked(): interval_s = self.ui.spinBox_autoupdate.value() self.timer.start(interval_s * 1000) + + self.timer.timeout.emit() # Trigger timer event immediately else: self.timer.stop() @@ -263,7 +271,7 @@ class AppWindow(QMainWindow): """ # Get inputed url - url = self.ui.lineEdit_URL.text() + url = self.ui.lineEdit_POST_URL.text() # compose body json_data = self.compose_post_json_data() @@ -291,7 +299,7 @@ class AppWindow(QMainWindow): GET запрос """ - url = self.ui.lineEdit_request.text() + url = self.ui.lineEdit_GET_URL.text() request = QNetworkRequest(QUrl(url)) @@ -319,9 +327,23 @@ class AppWindow(QMainWindow): func(self) # calling actual handler elif err == QNetworkReply.NetworkError.OperationCanceledError: self.ui.textEdit_message.append(f"{operation} запрос был отменён, так как не успел выполниться до нового вызова") + elif err == QNetworkReply.NetworkError.TemporaryNetworkFailureError: + self.ui.textEdit_message.append(f"Произошла временная ошибка при {operation} запросе, повторите запрос ещё раз") else: - status_code = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) - self.ui.textEdit_message.append(f'Ошибка при {operation} запросе: {status_code}') + msg = f"Ошибка при {operation} запросе: " + if (err == QNetworkReply.NetworkError.ConnectionRefusedError + or err == QNetworkReply.NetworkError.RemoteHostClosedError + or err == QNetworkReply.NetworkError.HostNotFoundError + or err == QNetworkReply.NetworkError.TimeoutError + or err == QNetworkReply.NetworkError.SslHandshakeFailedError + or err == QNetworkReply.NetworkError.NetworkSessionFailedError + or err == QNetworkReply.NetworkError.BackgroundRequestNotAllowedError + or err == QNetworkReply.NetworkError.TooManyRedirectsError + or err == QNetworkReply.NetworkError.InsecureRedirectError): + self.ui.textEdit_message.append(msg + 'не удалось установить подключение к серверу') + else: + status_code = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) + self.ui.textEdit_message.append(msg + f'сервер вернул статус код {status_code}') return wrapper @@ -347,23 +369,32 @@ class AppWindow(QMainWindow): for i in range(1,4): self.handle_toggle_lamp(i, data[f"LED{i}"]) - # convert buttons + self.update_buttons(self.convert_buttons_state(data)) + + # Update LCDs + self.update_lcds(data) + + # Append dot to plot and set corresponding LCD + self.plot.update(data["temperature"]) + self.ui.lcd_temperature.display(data["temperature"]) + + self.update_colors(data) + + + def convert_buttons_state(self, data: dict[str, bool]) -> list[bool]: buttons_status = list() for i in range(1, 4): buttons_status.append(data[f"button{i}State"]) - - self.update_buttons(buttons_status) - - # Update LCDs - color_l=("ambient_light", "red_light", "green_light", "blue_light", "lightness","acceleration_x", "acceleration_y", "acceleration_z", "pressure") + + return buttons_status + + + def update_lcds(self, data: dict): + color_l=("ambient_light", "red_light", "green_light", "blue_light", "lightness", "acceleration_x", "acceleration_y", "acceleration_z", "pressure") for s in color_l: getattr(self.ui, "lcd_" + s).display(data[s]) - # Append dot to plot - self.plot.update(data["temperature"]) - - def update_buttons(self, bs: list[bool]): for i in range(1, 4): button_on = bs[i-1] @@ -379,6 +410,15 @@ class AppWindow(QMainWindow): label_tumbler_off.show() + def update_colors(self, new_state: dict[str, dict[int]]): + for name in self.rgb_leds_state.keys(): + self.rgb_leds_state[name] = new_state[name] + self.paint_led_color( + getattr(self.ui, name), + QColor(*list(map(lambda c: new_state[name][c], RGB))) + ) + + if __name__ == "__main__": app = QApplication(sys.argv) diff --git a/plot.py b/plot.py index 0120b7b..71283fd 100644 --- a/plot.py +++ b/plot.py @@ -10,8 +10,13 @@ class Plot(): QT bar plot drawing class """ - def __init__(self, widget, arr_len = 20, default_val = 20): - self.__arr_vals = [default_val] * arr_len # TODO: Инициализировать значениями из conf["temperature"] + def __init__(self, widget, arr_len = 20, default_val = 20, initial_array = []): + if initial_array: + self.__arr_vals = initial_array + arr_len = len(initial_array) + else: + self.__arr_vals = [default_val] * arr_len + self.__x = list(range(1, arr_len + 1)) self.__plot = pg.plot() #создает объект PlotWidget из библиотеки PyqtGraph