Compare commits

..

114 Commits

Author SHA1 Message Date
a7ba382dad QVariantList -> list & QVariantMap -> dict 2024-09-16 10:35:35 +08:00
b7cc9db03c No need to create a new task for waiting 2024-09-09 18:29:24 +08:00
92d574a0e3 fixup! Zero limits warning cleanup 2024-09-09 16:29:32 +08:00
2d3bc96da9 super init's first 2024-09-09 15:44:07 +08:00
7efd184496 Format 2024-09-09 15:10:30 +08:00
14621e11a6 ch_tuning -> autotuning_channels 2024-09-09 15:10:16 +08:00
cfe9ee3985 Module docstring?? 2024-09-09 15:09:04 +08:00
a60f55d1c8 Reorder imports 2024-09-09 15:08:17 +08:00
a466e3e09d Sensible names for views 2024-09-09 15:06:22 +08:00
b0a4e1218a fixup! tec_qt: Private everything possible 2024-09-09 15:00:44 +08:00
d199770de1 Unprivate conn_menu
Used for autoconnect
2024-09-09 15:00:14 +08:00
9911f72059 Order? 2024-09-09 14:54:37 +08:00
f62adbbc1a Reorder 2024-09-09 14:54:37 +08:00
c416fd8b2b Not async 2024-09-09 14:54:37 +08:00
b3ba577268 Remove report mode from thermostat data model 2024-09-09 14:54:37 +08:00
3c1228e8a8 Remove report mode box 2024-09-09 14:54:37 +08:00
23653a1ecd More sensible names 2024-09-09 14:54:37 +08:00
29221ce570 tec_qt: Private everything possible 2024-09-09 14:54:35 +08:00
2334a922f7 Remove error handling for connecting task
Just let the exception propagate, even when stopping the connection
2024-09-09 14:54:24 +08:00
1aab3ca1d6 Update thermostat state from controller code 2024-09-09 14:54:24 +08:00
41d4154a28 extra func out 2024-09-09 14:54:24 +08:00
6473905488 No need extra function 2024-09-09 14:54:24 +08:00
b13f481381 State update explicitly 2024-09-09 14:54:24 +08:00
66303efd11 Zero limits warning cleanup 2024-09-02 16:12:55 +08:00
f0e7488682 Add NUM_CHANNELS to Thermostat! 2024-09-02 16:06:21 +08:00
70627342f3 Real concurrently 2024-08-30 17:37:53 +08:00
ffa0783cff Don't create report task if not polling for it 2024-08-30 16:55:15 +08:00
ba6b24fe95 PIDAutotuner: Don't use separate sig for interval 2024-08-30 16:55:15 +08:00
2e0ecd9758 aioexample: Show polling while report mode on
WIP: handle KeyboardInterrupt
2024-08-30 16:55:15 +08:00
199aeb3609 aioclient: More accurate DFU docstring 2024-08-30 16:55:15 +08:00
1e81641169 No need for async as well 2024-08-30 16:55:15 +08:00
2c95bd9d09 No need for async 2024-08-30 16:55:15 +08:00
d83c4ed4f6 Remove extra imports 2024-08-30 16:55:15 +08:00
637d8d029a report group 2024-08-30 16:55:15 +08:00
671004703b end_session in thermostat itself afterall 2024-08-30 16:55:15 +08:00
10873933f4 Reorder MainWindow 2024-08-30 16:55:15 +08:00
ec1fffecd1 Rearrange MainWindow.__init__ 2024-08-30 16:55:15 +08:00
36c063d917 Thermostat: Add disconnect callback
For communicating with the autotuner before the client fully
disconnects

Also then there's no need for explicitly resetting autotune elements
2024-08-30 16:55:15 +08:00
65b9202cea Remove info_box_trigger 2024-08-30 16:55:15 +08:00
a72a0606f1 Remove connection errored 2024-08-30 16:55:15 +08:00
81f09a9f0f Simply test for connectivity for turning PID off 2024-08-30 16:55:15 +08:00
f768ea5d4f Fix pressing enter not working in conn menu 2024-08-30 16:55:15 +08:00
e849610658 Assign connection_errored as well 2024-08-30 16:55:15 +08:00
bbe9a60824 Back out 2024-08-30 16:55:15 +08:00
cd07cdeddd Put UI changes into conn_menu 2024-08-30 16:55:15 +08:00
fe3a22a599 ConnectionBtn + StatusLbl 2024-08-30 16:55:15 +08:00
2b35bf57f9 Clear Graph UI changes 2024-08-30 16:55:15 +08:00
8a83bbc1d1 Concentrate ThermostatCtrlMenu UI changes 2024-08-30 16:55:15 +08:00
82315d65b2 Descriptive name 2024-08-30 16:55:15 +08:00
dfe08546fe Refactor repeated stuff 2024-08-30 16:55:15 +08:00
c4309c5ba0 Split PID handler UI up 2024-08-30 16:55:15 +08:00
3387ad67f7 Fix hwrev getting 2024-08-30 16:55:15 +08:00
903f9f8767 hwrev updates 2024-08-30 15:53:05 +08:00
aadf8a2595 Fix info boxes for load/saving from flash 2024-08-30 15:53:05 +08:00
49561a2f5a Move reset request to thermostat control menu
We don't get auto reconnect anymore
2024-08-30 15:53:05 +08:00
b32b38d830 Move pid autotuning request to CtrlPanel
And update autotune UI only on state change instead of every single
report update
2024-08-30 15:53:05 +08:00
fcda46d1f3 Move channelGraph stuff inside LiveDataPlotter 2024-08-30 15:53:05 +08:00
89e9da4499 Move plot_options_menu stuff into menu 2024-08-30 15:53:05 +08:00
87ca0694cd Move autotune ticking connect 2024-08-30 15:53:05 +08:00
03233386d0 Get thermostat_ctrl_menu to subscribe to hwrev updates 2024-08-30 15:53:05 +08:00
242a2b2e69 Save/load info box content 2024-08-30 15:53:05 +08:00
b84af82722 Fix loading all channel settings would bring up 2 info boxes 2024-08-30 15:53:05 +08:00
7997ef2472 Add back asyncSlot to save_cfg_request 2024-08-30 15:53:05 +08:00
911b4c680f hw_rev 2024-08-30 15:53:05 +08:00
19677c2251 fan_update: tec_qt to thermostat_ctrl_menu 2024-08-30 15:53:05 +08:00
5f30f12875 Fix updating status label for hwrev = None 2024-08-30 15:53:05 +08:00
3283b126b8 Put some menu requests in menu itself 2024-08-30 15:53:05 +08:00
59ba8c692d Broadcast ConnectionState changes from Thermostat 2024-08-30 15:53:05 +08:00
e3ef9115a5 Move sigActivatedHandle to CtrlPanel 2024-08-30 15:53:05 +08:00
c5c311ae14 Get rid of timeout on readline 2024-08-30 15:53:05 +08:00
6699458939 Put send_command in CtrlPanel 2024-08-30 15:53:05 +08:00
8a4a963f9b Extra bail removed 2024-08-30 15:53:05 +08:00
2f10ad8056 return hwrev when start_session 2024-08-30 15:53:05 +08:00
3731282146 state str 2024-08-30 15:53:05 +08:00
50ac1c2078 params update concurrently 2024-08-30 15:53:05 +08:00
0eebc0a6df Stuff non-UI changes in Thermostat model 2024-08-30 15:53:05 +08:00
78ba799d56 Base Thermostat connectivity UI changes to state 2024-08-30 15:53:05 +08:00
f9c0f140fa Remove wait_for
OSError raised anyways
2024-08-30 15:53:05 +08:00
93d96401b9 Actually its OSError 2024-08-30 15:53:05 +08:00
881bf6ff6c {start,end}_session -> [dis]connect 2024-08-30 15:53:05 +08:00
7e0dd61f79 Simplify on_connect_btn_clicked
Raise if OSError
2024-08-30 15:53:05 +08:00
ed34eb9e03 Connecting task moved? 2024-08-30 15:53:05 +08:00
387d1226c5 AsyncIO version Client -> AsyncioClient 2024-08-30 15:53:05 +08:00
058e597ef0 Exclusively use the Thermostat object as a medium
All calls to the Thermostat should be forwarded by the medium.
2024-08-30 15:53:05 +08:00
80975f50b1 Integrate WrappedClient into Thermostat model 2024-08-30 15:53:05 +08:00
86afa19085 Should not stop cancelling read if timeout'd 2024-08-30 15:53:05 +08:00
4b6dfdf478 Fix Autotuner state for forceful disconnect 2024-08-30 15:53:05 +08:00
85cb2027a8 _ 2024-08-30 15:53:05 +08:00
4fedb14727 Make connection loss handling more elegant
Show an info box on connection lost informing the user that the
Thermostat was forcefully disconnected.
2024-08-30 15:53:05 +08:00
863920f922 ================gui_dev-fix_asyncio=============== 2024-08-30 15:53:05 +08:00
96b57f199d Use new style super() 2024-08-30 15:53:05 +08:00
f2da457860 Move command line host:port setting handling
To main
2024-08-30 15:40:31 +08:00
066c75fc21 aioclient: Add missing readline for saving
Saving all channels returns multiple JSON objects, read the extra {}.
2024-08-30 15:38:59 +08:00
60b05ddfeb import order rearrange 2024-08-30 15:38:59 +08:00
6a78a2069d This is bail 2024-08-30 15:38:59 +08:00
6eb5b7298e thermostat: Properly register task
Also Thermostat.task -> Thermostat._update_params_task
2024-08-30 15:38:58 +08:00
4a292c19db ip -> host 2024-08-30 15:38:58 +08:00
0b115b3394 Lazy evaluating for debug string command 2024-08-30 15:38:58 +08:00
2e904cb498 Add pytec runnables 2024-08-30 15:38:58 +08:00
d3f378f058 PYTHON shell 2024-08-30 15:38:58 +08:00
d0273cd41b Exactlier wording 2024-08-30 15:38:58 +08:00
0988ed24d6 unused 2024-08-30 15:38:58 +08:00
ab3b26a2a4 encoding 2024-08-30 15:38:58 +08:00
000b97398b Just catch asyncio.TimeoutError
Will just change to TimeoutError once we switch to Python 3.11 in the
flake.
2024-08-30 15:38:58 +08:00
e162bcf210 Remove exception too general 2024-08-30 15:38:58 +08:00
c3d7804898 Use asserts to check for connectivity 2024-08-30 15:38:58 +08:00
9c0977262c Add back the parent 2024-08-30 15:38:58 +08:00
017206bd34 Fix method call 2024-08-30 15:38:58 +08:00
f46bd2b50e README: Proofread 2024-08-30 15:38:58 +08:00
5b48fb2793 Swap order arounda bit more 2024-08-30 15:38:58 +08:00
358403e651 Formatting 2024-08-30 15:38:58 +08:00
4a48379923 Use qtextras 2024-08-30 15:38:58 +08:00
b766e949e8 flake update 2024-08-30 15:38:58 +08:00
2fc0d265e4 flake.nix: nixfmt-rfc-style 2024-08-26 12:16:57 +08:00
2 changed files with 119 additions and 86 deletions

View File

@ -137,33 +137,36 @@ class CtrlPanel(QObject):
for inner_param, change, data in changes: for inner_param, change, data in changes:
if change == "value": if change == "value":
new_value = data if inner_param.opts.get("param", None) is not None:
if "thermostat:set_param" in inner_param.opts:
if inner_param.opts.get("suffix", None) == "mA": if inner_param.opts.get("suffix", None) == "mA":
new_value /= 1000 # Given in mA data /= 1000 # Given in mA
thermostat_param = inner_param.opts["thermostat:set_param"] thermostat_param = inner_param.opts["param"]
if thermostat_param[1] == "ch":
thermostat_param[1] = ch
# Handle thermostat command irregularities if inner_param.name() == "Postfilter Rate" and data is None:
match inner_param.name(), new_value: set_param_args = (*thermostat_param[:2], "off")
case "Postfilter Rate", None: else:
thermostat_param = thermostat_param.copy() set_param_args = (*thermostat_param, data)
thermostat_param["field"] = "off" param.child(*param.childPath(inner_param)).setOpts(lock=True)
new_value = "" await self.thermostat.set_param(*set_param_args)
case "Control Method", "Constant Current": param.child(*param.childPath(inner_param)).setOpts(lock=False)
return
case "Control Method", "Temperature PID":
new_value = ""
inner_param.setOpts(lock=True) if inner_param.opts.get("pid_autotune", None) is not None:
await self.thermostat.set_param( auto_tuner_param = inner_param.opts["pid_autotune"][0]
channel=ch, value=new_value, **thermostat_param if inner_param.opts["pid_autotune"][1] != "ch":
) ch = inner_param.opts["pid_autotune"][1]
inner_param.setOpts(lock=False) self.autotuners.set_params(auto_tuner_param, ch, data)
if "pid_autotune" in inner_param.opts: if inner_param.opts.get("activaters", None) is not None:
auto_tuner_param = inner_param.opts["pid_autotune"] activater = inner_param.opts["activaters"][
self.autotuners.set_params(auto_tuner_param, ch, new_value) inner_param.opts["limits"].index(data)
]
if activater is not None:
if activater[1] == "ch":
activater[1] = ch
await self.thermostat.set_param(*activater)
@pyqtSlot(list) @pyqtSlot(list)
def update_pid(self, pid_settings): def update_pid(self, pid_settings):

View File

@ -25,10 +25,14 @@
"Constant Current", "Constant Current",
"Temperature PID" "Temperature PID"
], ],
"thermostat:set_param":{ "activaters":[
"topic":"pwm", null,
"field":"pid" [
}, "pwm",
"ch",
"pid"
]
],
"children":[ "children":[
{ {
"name":"Set Current", "name":"Set Current",
@ -42,10 +46,11 @@
"triggerOnShow":true, "triggerOnShow":true,
"decimals":6, "decimals":6,
"suffix":"mA", "suffix":"mA",
"thermostat:set_param":{ "param":[
"topic":"pwm", "pwm",
"field":"i_set" "ch",
}, "i_set"
],
"lock":false "lock":false
}, },
{ {
@ -58,10 +63,11 @@
300 300
], ],
"format":"{value:.4f} °C", "format":"{value:.4f} °C",
"thermostat:set_param":{ "param":[
"topic":"pid", "pid",
"field":"target" "ch",
}, "target"
],
"lock":false "lock":false
} }
] ]
@ -82,10 +88,11 @@
2000 2000
], ],
"suffix":"mA", "suffix":"mA",
"thermostat:set_param":{ "param":[
"topic":"pwm", "pwm",
"field":"max_i_pos" "ch",
}, "max_i_pos"
],
"lock":false "lock":false
}, },
{ {
@ -99,10 +106,11 @@
2000 2000
], ],
"suffix":"mA", "suffix":"mA",
"thermostat:set_param":{ "param":[
"topic":"pwm", "pwm",
"field":"max_i_neg" "ch",
}, "max_i_neg"
],
"lock":false "lock":false
}, },
{ {
@ -116,10 +124,11 @@
], ],
"siPrefix":true, "siPrefix":true,
"suffix":"V", "suffix":"V",
"thermostat:set_param":{ "param":[
"topic":"pwm", "pwm",
"field":"max_v" "ch",
}, "max_v"
],
"lock":false "lock":false
} }
] ]
@ -141,10 +150,11 @@
100 100
], ],
"format":"{value:.4f} °C", "format":"{value:.4f} °C",
"thermostat:set_param":{ "param":[
"topic":"s-h", "s-h",
"field":"t0" "ch",
}, "t0"
],
"lock":false "lock":false
}, },
{ {
@ -154,10 +164,11 @@
"step":1, "step":1,
"siPrefix":true, "siPrefix":true,
"suffix":"Ω", "suffix":"Ω",
"thermostat:set_param":{ "param":[
"topic":"s-h", "s-h",
"field":"r0" "ch",
}, "r0"
],
"lock":false "lock":false
}, },
{ {
@ -167,20 +178,22 @@
"step":1, "step":1,
"suffix":"K", "suffix":"K",
"decimals":4, "decimals":4,
"thermostat:set_param":{ "param":[
"topic":"s-h", "s-h",
"field":"b" "ch",
}, "b"
],
"lock":false "lock":false
}, },
{ {
"name":"Postfilter Rate", "name":"Postfilter Rate",
"type":"list", "type":"list",
"value":16.67, "value":16.67,
"thermostat:set_param":{ "param":[
"topic":"postfilter", "postfilter",
"field":"rate" "ch",
}, "rate"
],
"limits":{ "limits":{
"Off":null, "Off":null,
"16.67 Hz":16.67, "16.67 Hz":16.67,
@ -202,10 +215,11 @@
"type":"float", "type":"float",
"step":0.1, "step":0.1,
"suffix":"", "suffix":"",
"thermostat:set_param":{ "param":[
"topic":"pid", "pid",
"field":"kp" "ch",
}, "kp"
],
"lock":false "lock":false
}, },
{ {
@ -213,10 +227,11 @@
"type":"float", "type":"float",
"step":0.1, "step":0.1,
"suffix":"Hz", "suffix":"Hz",
"thermostat:set_param":{ "param":[
"topic":"pid", "pid",
"field":"ki" "ch",
}, "ki"
],
"lock":false "lock":false
}, },
{ {
@ -224,10 +239,11 @@
"type":"float", "type":"float",
"step":0.1, "step":0.1,
"suffix":"s", "suffix":"s",
"thermostat:set_param":{ "param":[
"topic":"pid", "pid",
"field":"kd" "ch",
}, "kd"
],
"lock":false "lock":false
}, },
{ {
@ -245,10 +261,11 @@
], ],
"decimals":6, "decimals":6,
"suffix":"mA", "suffix":"mA",
"thermostat:set_param":{ "param":[
"topic":"pid", "pid",
"field":"output_min" "ch",
}, "output_min"
],
"lock":false "lock":false
}, },
{ {
@ -261,10 +278,11 @@
], ],
"decimals":6, "decimals":6,
"suffix":"mA", "suffix":"mA",
"thermostat:set_param":{ "param":[
"topic":"pid", "pid",
"field":"output_max" "ch",
}, "output_max"
],
"lock":false "lock":false
} }
] ]
@ -280,7 +298,10 @@
"value":20, "value":20,
"step":0.1, "step":0.1,
"format":"{value:.4f} °C", "format":"{value:.4f} °C",
"pid_autotune":"target_temp" "pid_autotune":[
"target_temp",
"ch"
]
}, },
{ {
"name":"Test Current", "name":"Test Current",
@ -293,7 +314,10 @@
2000 2000
], ],
"suffix":"mA", "suffix":"mA",
"pid_autotune":"test_current" "pid_autotune":[
"test_current",
"ch"
]
}, },
{ {
"name":"Temperature Swing", "name":"Temperature Swing",
@ -302,7 +326,10 @@
"step":0.1, "step":0.1,
"prefix":"±", "prefix":"±",
"format":"{value:.4f} °C", "format":"{value:.4f} °C",
"pid_autotune":"temp_swing" "pid_autotune":[
"temp_swing",
"ch"
]
}, },
{ {
"name":"Lookback", "name":"Lookback",
@ -310,7 +337,10 @@
"value":3.0, "value":3.0,
"step":0.1, "step":0.1,
"format":"{value:.4f} s", "format":"{value:.4f} s",
"pid_autotune":"lookback" "pid_autotune":[
"lookback",
"ch"
]
}, },
{ {
"name":"Run", "name":"Run",