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