Files
SequencerIO/__pycache__/tui.cpython-311.pyc

242 lines
36 KiB
Plaintext
Raw Normal View History

2026-03-02 17:48:55 -05:00
<EFBFBD>
5U<35>i<EFBFBD>m<00><01><><00>dZddlmZddlZddlZddlZddlZddlZddlm Z ddl
m Z m Z ddl mZmZddlmZddlmZdd lmZdd
lmZdd lmZmZdd lmZdd lmZej<00> de!e e"<22><00>j#<00><00><00><00>ddl$m%Z&m'Z'm(Z(m)Z)ddl*m+Z+m,Z,ddl-m.Z.m/Z/ej0d<11><00><00>1ej2<00><00>ej0d<12><00><00>1ej3<00><00>Gd<13>de<1A><00>Z4Gd<15>ded<17><18><00>Z5Gd<19>ded<17><18><00>Z6d)d*d!<21>Z7Gd"<22>d#e<1A><00>Z8Gd$<24>d%e<0E><00>Z9d+d'<27>Z:e;d(kr e:<3A><00>dSdS),u<>
tui.py — Interactive TUI debugger for the Terminator I/O system.
Usage:
python3 tui.py [config.yaml]
Default config path: config.yaml (same directory as this script).
Layout:
┌─ Status bar (device health, poll rate) ────────────────────────────────┐
│ Inputs (live) │ Outputs (selectable) │ Sequences (runnable) │
└─ Footer (keybindings) ─────────────────────────────────────────────────┘
Keybindings:
Tab Cycle focus between Outputs and Sequences panels
↑ / ↓ Navigate the focused panel
Space/Enter Outputs: toggle selected | Sequences: run selected
0 All outputs OFF (from Outputs panel)
1 All outputs ON (from Outputs panel)
r Force reconnect all devices
q Quit
<EFBFBD>)<01> annotationsN)<01>Path)<02>Any<6E>Callable)<02>App<70> ComposeResult)<01>Binding)<01>
Horizontal)<01>reactive)<01>Timer)<02>Footer<65>Static)<01>on)<01>Message)<04>load<61>Config<69> ConfigError<6F>Sequence)<02>
IORegistry<EFBFBD> SignalState)<02> Sequencer<65> RunResult<6C>pymodbus<75>arnoldc<01>8<00><00>eZdZdZdZd <0A>fd<07> Zdd
<EFBFBD>Zdd <0C>Z<07>xZS)<10>
InputPanelz Live table of all input signals.zh
InputPanel {
border: solid $primary;
padding: 0 1;
height: 100%;
}
<20>kwargsr<00>return<72>Nonec <01>H<00><01>t<00><00>jdi|<01><01>i|_dS)N<>)<03>super<65>__init__<5F> _snapshot<6F><03>selfr<00> __class__s <20><>tui.pyr#zInputPanel.__init__Gs+<00><><00><18><05><07><07><18>"<22>"<22>6<EFBFBD>"<22>"<22>"<22>13<31><04><0E><0E><0E><00>snapshot<6F>dict[str, SignalState]c<01><<00>||_|<00><00><00>dS<00>N)r$<00>refresh)r&r*s r(<00>update_snapshotzInputPanel.update_snapshotKs<00><00>!<21><04><0E> <0C> <0C> <0C><0E><0E><0E><0E>r)<00>strc <01>><00>dg}t|j<00><00><00><00><00>D]C\}}|jrd}d}n|jrd}d}nd}d}|<01>d|<04>d |<05>d
|<02>d |<05>d
<EFBFBD> <09><00><00>D|js|<01>d <0C><00>d <0A>|<01><00>S)Nz[bold]Inputs[/bold]
z [dim]?[/dim]<5D>dim<69>[bold green]●[/bold green]<5D>green<65>[dim]○[/dim]<5D>white<74> z [<5B>]<5D>[/z [dim](none)[/dim]<5D>
)<07>sortedr$<00>items<6D>stale<6C>value<75>append<6E>join)r&<00>lines<65>name<6D>state<74> indicator<6F>colors r(<00>renderzInputPanel.renderOs<><00><00>3<>4<><05>!<21>$<24>.<2E>"6<>"6<>"8<>"8<>9<>9<>
D<01>
D<01>K<EFBFBD>D<EFBFBD>%<25><14>{<7B> $<24>*<2A> <09>!<21><05><05><16><1B> $<24>:<3A> <09>#<23><05><05>,<2C> <09>#<23><05> <11>L<EFBFBD>L<EFBFBD>B<>Y<EFBFBD>B<>B<>%<25>B<>B<>$<24>B<>B<>%<25>B<>B<>B<> C<> C<> C<> C<><13>~<7E> /<2F> <11>L<EFBFBD>L<EFBFBD>-<2D> .<2E> .<2E> .<2E><13>y<EFBFBD>y<EFBFBD><15><1F><1F>r)<00>rrrr)r*r+rr<00>rr0) <09>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F> DEFAULT_CSSr#r/rF<00> __classcell__<5F>r's@r(rr<sr<00><><00><00><00><00><00>*<2A>*<2A><08>K<EFBFBD>4<>4<>4<>4<>4<>4<><17><17><17><17> <20> <20> <20> <20> <20> <20> <20> r)rc <01>f<00><00>eZdZUdZdZedddd<06><07><00>edd d
d<06><07><00>ed d d d<06><07><00>edd d d<06><07><00>edddd<06><07><00>edddd<06><07><00>gZed<15><00>Zde d<Gd<18>de
<EFBFBD><00>Z Gd<1A>de
<EFBFBD><00>Z d-<2D>fd"<22> Z d.d%<25>Zd/d'<27>Zd0d(<28>Zd0d)<29>Zd0d*<2A>Zd0d+<2B>Zd0d,<2C>Z<14>xZS)1<> OutputPanelu{
Selectable list of output signals.
Displays shadow state (what we last wrote) — the EBC100 has no readback.
z<>
OutputPanel {
border: solid $accent;
padding: 0 1;
height: 100%;
}
OutputPanel:focus {
border: solid $accent-lighten-2;
}
<20>up<75> cursor_up<75>UpF<70><01>show<6F>down<77> cursor_down<77>Down<77>space<63> do_toggle<6C>Toggle<6C>enter<65>0<>all_offzAll OFF<46>1<>all_onzAll ONr<00> reactive[int]<5D>cursorc<01> <00><00>eZdZd<08>fd<07> Z<03>xZS) <09>OutputPanel.ToggleOutput<75>signalr0<00> current_value<75>boolrrc<01>d<00><01>t<00><00><00><00><00>||_||_dSr-)r"r#rfrg)r&rfrgr's <20>r(r#z!OutputPanel.ToggleOutput.__init__<5F>s.<00><><00> <11>G<EFBFBD>G<EFBFBD> <1C> <1C> <1E> <1E> <1E>!'<27>D<EFBFBD>K<EFBFBD>!.<2E>D<EFBFBD> <1E> <1E> r))rfr0rgrhrr<00>rIrJrKr#rNrOs@r(<00> ToggleOutputre<00>s=<00><><00><00><00><00><00> /<2F> /<2F> /<2F> /<2F> /<2F> /<2F> /<2F> /<2F> /<2F> /r)rkc<01> <00><00>eZdZd<06>fd<05> Z<03>xZS)<07>OutputPanel.AllOutputsr>rhrrc<01>V<00><01>t<00><00><00><00><00>||_dSr-)r"r#r>)r&r>r's <20>r(r#zOutputPanel.AllOutputs.__init__<5F>s$<00><><00> <11>G<EFBFBD>G<EFBFBD> <1C> <1C> <1E> <1E> <1E><1E>D<EFBFBD>J<EFBFBD>J<EFBFBD>Jr))r>rhrrrjrOs@r(<00>
AllOutputsrm<00>s=<00><><00><00><00><00><00> <1F> <1F> <1F> <1F> <1F> <1F> <1F> <1F> <1F> r)ro<00> output_names<65> list[str]rrrrc <01>j<00><01>t<00><00>jdi|<02><01>||_d<01>|D<00><00>|_dS)Nc<01><00>i|]}|d<00><02>S<00>Fr!)<02>.0<EFBFBD>ns r(<00>
<dictcomp>z(OutputPanel.__init__.<locals>.<dictcomp><3E>s<00><00>'G<>'G<>'G<>Q<EFBFBD><01>5<EFBFBD>'G<>'G<>'Gr)r!)r"r#<00>_names<65>_state)r&rprr's <20>r(r#zOutputPanel.__init__<5F>s@<00><><00><18><05><07><07><18>"<22>"<22>6<EFBFBD>"<22>"<22>"<22>'3<><04> <0B>'G<>'G<>,<2C>'G<>'G<>'G<><04> <0B> <0B> r)rC<00>dict[str, bool]c<01><<00>||_|<00><00><00>dSr-)ryr.)r&rCs r(<00>update_output_statezOutputPanel.update_output_state<74>s<00><00><1B><04> <0B> <0C> <0C> <0C><0E><0E><0E><0E>r)r0c<01><><00>dg}|js*|<01>d<02><00>d<03>|<01><00>St|j<00><00>D]c\}}|j<00>|d<04><00>}|rdnd}|rdnd}||jkr d |<05>d
|<03>d |<06><00>}n d |<05>d |<03>d|<06><00>}|<01>|<07><00><00>dd<03>|<01><00>S)NuN[bold]Outputs[/bold] [dim](↑↓ navigate · Space toggle · 0/1 all)[/dim]
z# [dim](no outputs configured)[/dim]r:Fr3r5z[bold green]ON [/bold green]<5D>OFFu[reverse] ► [/reverse] z
[reverse]z [/reverse] z r7<00> )rxr?r@<00> enumeratery<00>getrc)r&rA<00>irB<00>valrD<00>val_str<74>lines r(rFzOutputPanel.render<65>s<00><00> ]<5D>
<EFBFBD><05><14>{<7B> $<24> <11>L<EFBFBD>L<EFBFBD>><3E> ?<3F> ?<3F> ?<3F><17>9<EFBFBD>9<EFBFBD>U<EFBFBD>#<23>#<23> #<23> <20><14><1B>-<2D>-<2D> <1F> <1F>G<EFBFBD>A<EFBFBD>t<EFBFBD><16>+<2B>/<2F>/<2F>$<24><05>.<2E>.<2E>C<EFBFBD>:=<3D>S<>6<>6<>CS<43>I<EFBFBD>:=<3D>H<>6<>6<>5<EFBFBD>G<EFBFBD><10>D<EFBFBD>K<EFBFBD><1F><1F>c<>9<EFBFBD>c<>c<><04>c<>c<>Za<5A>c<>c<><04><04>;<3B>i<EFBFBD>;<3B>;<3B>$<24>;<3B>;<3B>'<27>;<3B>;<3B><04> <11>L<EFBFBD>L<EFBFBD><14> <1E> <1E> <1E> <1E><13>y<EFBFBD>y<EFBFBD><15><1F><1F>r)c<01>`<00>|jr&|jdz
t|j<00><00>z|_dSdS<00>N<><00>rxrc<00>len<65>r&s r(<00>action_cursor_upzOutputPanel.action_cursor_up<75><00>6<00><00> <0F>;<3B> ?<3F><1F>;<3B><11>?<3F>c<EFBFBD>$<24>+<2B>.><3E>.><3E>><3E>D<EFBFBD>K<EFBFBD>K<EFBFBD>K<EFBFBD> ?<3F> ?r)c<01>`<00>|jr&|jdzt|j<00><00>z|_dSdSr<>r<>r<>s r(<00>action_cursor_downzOutputPanel.action_cursor_down<77>r<>r)c<01><><00>|jsdS|j|j}|j<00>|d<01><00>}|<00>|<00>||<02><02><00><00><00>dS)NF)rfrg)rxrcryr<><00> post_messagerk)r&rB<00>currents r(<00>action_do_togglezOutputPanel.action_do_toggle<6C>sa<00><00><13>{<7B> <13> <12>F<EFBFBD><16>+<2B>d<EFBFBD>k<EFBFBD>*<2A><04><16>+<2B>/<2F>/<2F>$<24><05>.<2E>.<2E><07> <0C><19><19>$<24>+<2B>+<2B>4<EFBFBD>w<EFBFBD>+<2B>O<>O<>P<>P<>P<>P<>Pr)c<01>X<00>|<00>|<00>d<01><02><00><00><00>dS)NF<4E>r><00>r<>ror<>s r(<00>action_all_offzOutputPanel.action_all_off<66>s*<00><00> <0C><19><19>$<24>/<2F>/<2F><05>/<2F>6<>6<>7<>7<>7<>7<>7r)c<01>X<00>|<00>|<00>d<01><02><00><00><00>dS)NTr<54>r<>r<>s r(<00> action_all_onzOutputPanel.action_all_on<6F>s*<00><00> <0C><19><19>$<24>/<2F>/<2F><04>/<2F>5<>5<>6<>6<>6<>6<>6r))rprqrrrr)rCrzrrrH<00>rr)rIrJrKrLrMr <00>BINDINGSr rc<00>__annotations__rrkror#r|rFr<>r<>r<>r<>r<>rNrOs@r(rQrQes<><00><><00><00><00><00><00><00><08><08>
<08>K<EFBFBD> <10><07><04><1B><04>u<EFBFBD>=<3D>=<3D>=<3D><0F><07><06><1D><06>u<EFBFBD>=<3D>=<3D>=<3D><0F><07><07><1B><08>u<EFBFBD>=<3D>=<3D>=<3D><0F><07><07><1B><08>u<EFBFBD>=<3D>=<3D>=<3D><0F><07><03><19> <09>u<EFBFBD>=<3D>=<3D>=<3D><0F><07><03><18><08>u<EFBFBD>=<3D>=<3D>=<3D> <06>H<EFBFBD>%<25>H<EFBFBD>Q<EFBFBD>K<EFBFBD>K<EFBFBD>F<EFBFBD>'<27>'<27>'<27>'<27>/<2F>/<2F>/<2F>/<2F>/<2F>w<EFBFBD>/<2F>/<2F>/<2F> <1F><1F><1F><1F><1F>W<EFBFBD><1F><1F><1F>H<01>H<01>H<01>H<01>H<01>H<01>
<17><17><17><17>  <20> <20> <20> <20>,?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>Q<01>Q<01>Q<01>Q<01>8<>8<>8<>8<>7<>7<>7<>7<>7<>7<>7<>7r)rQT)<01> can_focusc <01><00><00>eZdZUdZdZedddd<06><07><00>edd d
d<06><07><00>ed d d d<06><07><00>edd d d<06><07><00>gZed<0F><00>Zde d<Gd<12>de
<EFBFBD><00>Z d&<26>fd<1A> Z d'd<1E>Z d(d <20>Zd(d!<21>Zd(d"<22>Zd)d#<23>Zd)d$<24>Zd)d%<25>Z<13>xZS)*<2A> SequencePanelz<6C>
Idle mode: navigable list of all sequences; Enter/Space to run.
Running mode: full step list for the active sequence with the current
step highlighted and a progress bar header.
z<>
SequencePanel {
border: solid $warning-darken-2;
padding: 0 1;
height: 100%;
}
SequencePanel:focus {
border: solid $warning;
}
rRrSrTFrUrWrXrYrZ<00>do_run<75>Runr]rrbrcc<01> <00><00>eZdZd<06>fd<05> Z<03>xZS)<07>SequencePanel.RunSequencerBr0rrc<01>V<00><01>t<00><00><00><00><00>||_dSr-)r"r#rB)r&rBr's <20>r(r#z"SequencePanel.RunSequence.__init__<5F>s$<00><><00> <11>G<EFBFBD>G<EFBFBD> <1C> <1C> <1E> <1E> <1E><1C>D<EFBFBD>I<EFBFBD>I<EFBFBD>Ir))rBr0rrrjrOs@r(<00> RunSequencer<65><00>s=<00><><00><00><00><00><00> <1D> <1D> <1D> <1D> <1D> <1D> <1D> <1D> <1D> r)r<><00> sequences<65>list[Sequence]rrrrc <01><><00><01>t<00><00>jdi|<02><01>||_d<01>|D<00><00>|_d|_d|_dS)Nc<01><00>i|]
}|j|<01><02> Sr!<00>rB<00>ru<00>ss r(rwz*SequencePanel.__init__.<locals>.<dictcomp><3E>s<00><00>1O<31>1O<31>1O<31><01>!<21>&<26>!<21>1O<31>1O<31>1Or)r!)r"r#<00>
_sequences<EFBFBD> _seq_by_name<6D> _active_run<75> _last_result)r&r<>rr's <20>r(r#zSequencePanel.__init__<5F>sS<00><><00><18><05><07><07><18>"<22>"<22>6<EFBFBD>"<22>"<22>"<22>-6<><04><0F>1O<31>1O<31>Y<EFBFBD>1O<31>1O<31>1O<31><04><19>.2<EFBFBD><04><18>.2<EFBFBD><04><19><19>r)<00>
active_run<EFBFBD>RunResult | None<6E> last_resultc<01>J<00>||_||_|<00><00><00>dSr-)r<>r<>r.)r&r<>r<>s r(<00>update_run_statezSequencePanel.update_run_state<74>s%<00><00>
'<27><04><18>'<27><04><19> <0C> <0C> <0C><0E><0E><0E><0E>r)r0c<01>|<00>|jr"|jjdvr|<00><00><00>S|<00><00><00>S)N<><02>pending<6E>running)r<><00>status<75>_render_running<6E> _render_idler<65>s r(rFzSequencePanel.rendersB<00><00> <0F> <1B> *<2A><04> 0<> 7<>;Q<> Q<> Q<><17>'<27>'<27>)<29>)<29> )<29><13> <20> <20>"<22>"<22>"r)c<01><><00>dg}|js*|<01>d<02><00>d<03>|<01><00>St|j<00><00>D]<5D>\}}t |j<00><00>}||jkrd|j<00>d|<04>d<06>}nd|j<00>d|<04>d<06>}|<01>|<05><00>|jrS|j<00> <00><00><00>
d<03><00>d dd
<EFBFBD>}|<01>d |<06>d <0C><03><00><00><>|j r<>|j }d ddd<0F><03> |j d<10><00>}|<01>d|<08>d|j<00>d|j <00><00><00><00>d|<08>d|j<00>d|j<00>d|j<00>d<18><0F><00>|jr5|j} |<01>d| j<00>d| j<00>d| j<00>d<1C><07><00>d<03>|<01><00>S)NuB[bold]Sequences[/bold] [dim](↑↓ navigate · Enter run)[/dim]
z% [dim](no sequences configured)[/dim]r:u"[reverse] ► [/reverse] [reverse]z[/reverse] [dim]z steps[/dim]z z [dim]r<00><z [dim]<5D>[/dim]r4<00>red)<03>success<73>failed<65>errorr2z
[dim]Last run:[/dim] [r8<00> → r9z] [dim]<5D>/z steps z ms[/dim]u [red]✗ step z (z ms): z[/red])r<>r?r@r<>r<><00>stepsrcrB<00> description<6F>strip<69>splitr<74>r<>r<><00> sequence_name<6D>upper<65>steps_completed<65> total_steps<70> duration_ms<6D> failed_step<65>
step_index<EFBFBD>t_ms<6D>detail)
r&rAr<><00>seq<65>totalr<6C><00>short<72>rrE<00>fss
r(r<>zSequencePanel._render_idle sf<00><00> Q<>
<EFBFBD><05><14><EFBFBD> $<24> <11>L<EFBFBD>L<EFBFBD>@<40> A<> A<> A<><17>9<EFBFBD>9<EFBFBD>U<EFBFBD>#<23>#<23> #<23><1F><04><0F>0<>0<> :<3A> :<3A>F<EFBFBD>A<EFBFBD>s<EFBFBD><17><03> <09>N<EFBFBD>N<EFBFBD>E<EFBFBD><10>D<EFBFBD>K<EFBFBD><1F><1F>2<><13><18>2<>2<>#<23>2<>2<>2<><15><04>
D<01>s<EFBFBD>x<EFBFBD>C<>C<><05>C<>C<>C<><04> <11>L<EFBFBD>L<EFBFBD><14> <1E> <1E> <1E><12><EFBFBD> :<3A><1B><0F>-<2D>-<2D>/<2F>/<2F>5<>5<>d<EFBFBD>;<3B>;<3B>A<EFBFBD>><3E>s<EFBFBD><02>s<EFBFBD>C<><05><15> <0C> <0C>8<>5<EFBFBD>8<>8<>8<>9<>9<>9<><39> <10> <1C> <12><14>!<21>A<EFBFBD> '<27>5<EFBFBD>5<EFBFBD>I<>I<>M<>M<><11><08>%<25><0E><0E>E<EFBFBD> <12>L<EFBFBD>L<EFBFBD>.<2E>5<EFBFBD>.<2E>.<2E>1<EFBFBD>?<3F>.<2E>.<2E><18>x<EFBFBD>~<7E>~<7E>'<27>'<27>.<2E>.<2E>+0<>.<2E>.<2E><1B>+<2B>.<2E>.<2E>./<2F>m<EFBFBD>.<2E>.<2E><17>]<5D>.<2E>.<2E>.<2E> <0E> <0E> <0E> <11>}<7D> <12><16>]<5D><02><15> <0C> <0C>*<2A>r<EFBFBD>}<7D>*<2A>*<2A><02><07>*<2A>*<2A><1A> <09>*<2A>*<2A>*<2A><12><12><12>
<14>y<EFBFBD>y<EFBFBD><15><1F><1F>r)c <01>T<00>|j}|<01>J<00>|j<00>|j<00><00>}|<02> d|j<00>d<02>St |j<00><00>}|j}|j}|rt||z dz<00><00>nd}t|d<05><06><00>}d|j
<00>d|<07>d |<04>d
|<03>d <0B> g}t|j<00><00>D]<5D>\} }
|
j d z } | d <0A>d<0E>} |
j dkr|
jrdnd} d|
j<00>d| <0A><00>}np|
j dkr|
jrdnd}d|
j<00>d|<0F><00>}nL|
j dkr0|
jrdnd}|
jr
|
j<00>d<18>nd}d|
j<00>d|<0F>d|<10>d<1C>}n|
j <00>d|
j<00><00>}| |kr
d| <0C>d|<0E>d<1F>}n| |kr
d | <0C>d|<0E>d!<21>}n d"| <0C>d|<0E>d#<23>}|<08>|<11><00><00><>d$<24>|<08><00>S)%Nz[yellow]Running: z$[/yellow]
[dim](steps unknown)[/dim]<5D>dr<00>)<01>widthu[bold yellow]▶ z[/bold yellow] <20>
[yellow]r<>z
[/yellow]
i<EFBFBD>z6.1fr<EFBFBD><00>
set_outputzON r~zset r<><00> check_inputzchk z == <20>
wait_inputz ms<6D>?zwait z (timeout <20>)rueverse][bold yellow] ► z [/bold yellow][/reverse]u [dim green]✓ z [/dim green]z [dim] r<>r:)r<>r<>r<>r<>r<>r<>r<><00>current_step_index<65>int<6E> _progress_barrBr<>r<><00>actionrCrf<00>expected<65>
timeout_msr?r@)r&<00>runr<6E>r<><00>doner<65><00>pct<63>barrAr<><00>step<65>t_s<5F>t_strr<72>r<><00>exp<78>t_outr<74>s r(r<>zSequencePanel._render_running6sy<00><00><13><1F><03><12><EFBFBD><EFBFBD><EFBFBD><13> <20>$<24>$<24>S<EFBFBD>%6<>7<>7<><03> <0E>;<3B>_<>s<EFBFBD>'8<>_<>_<>_<> _<><15>c<EFBFBD>i<EFBFBD>.<2E>.<2E><05><15>%<25><04><15>(<28><07>-2<>9<>#<23>d<EFBFBD>U<EFBFBD>l<EFBFBD>S<EFBFBD>(<28>)<29>)<29>)<29><01><03><1F><03>2<EFBFBD>.<2E>.<2E>.<2E><03> :<3A><03><08> :<3A> :<3A><14> :<3A> :<3A> $<24> :<3A> :<3A>',<2C> :<3A> :<3A> :<3A>
<EFBFBD><05>
!<21><13><19>+<2B>+<2B> <1F> <1F>G<EFBFBD>A<EFBFBD>t<EFBFBD><1A>i<EFBFBD>$<24>&<26>C<EFBFBD><1C>n<EFBFBD>n<EFBFBD>n<EFBFBD>n<EFBFBD>E<EFBFBD><13>{<7B>l<EFBFBD>*<2A>*<2A>"&<26>*<2A>7<><15><15>%<25><03>9<>$<24>+<2B>9<>9<>C<EFBFBD>9<>9<><06><06><15><1B> <0A>-<2D>-<2D>"&<26>-<2D>:<3A><15><15>U<EFBFBD><03>8<>$<24>+<2B>8<>8<>3<EFBFBD>8<>8<><06><06><15><1B> <0C>,<2C>,<2C>"&<26>-<2D>:<3A><15><15>U<EFBFBD><03>48<34>O<EFBFBD>L<>D<EFBFBD>O<EFBFBD>0<>0<>0<>0<><13><05>K<>$<24>+<2B>K<>K<>3<EFBFBD>K<>K<>5<EFBFBD>K<>K<>K<><06><06> <20>K<EFBFBD>8<>8<>4<EFBFBD>;<3B>8<>8<><06><10>G<EFBFBD>|<7C>|<7C>_<>U<EFBFBD>_<>_<>f<EFBFBD>_<>_<>_<><04><04><12>T<EFBFBD><18><18>H<>5<EFBFBD>H<>H<>F<EFBFBD>H<>H<>H<><04><04>;<3B>5<EFBFBD>:<3A>:<3A>F<EFBFBD>:<3A>:<3A>:<3A><04> <11>L<EFBFBD>L<EFBFBD><14> <1E> <1E> <1E> <1E><13>y<EFBFBD>y<EFBFBD><15><1F><1F>r)c<01>`<00>|jr&|jdz
t|j<00><00>z|_dSdSr<><00>r<>rcr<>r<>s r(r<>zSequencePanel.action_cursor_upi<00>9<00><00> <0F>?<3F> C<01><1F>;<3B><11>?<3F>c<EFBFBD>$<24>/<2F>.B<>.B<>B<>D<EFBFBD>K<EFBFBD>K<EFBFBD>K<EFBFBD> C<01> Cr)c<01>`<00>|jr&|jdzt|j<00><00>z|_dSdSr<>r<>r<>s r(r<>z SequencePanel.action_cursor_downmr<>r)c<01><><00>|jsdS|<00>|<00>|j|jj<00><01><00><00><00>dS)Nr<4E>)r<>r<>r<>rcrBr<>s r(<00> action_do_runzSequencePanel.action_do_runqsH<00><00><13><EFBFBD> <13> <12>F<EFBFBD> <0C><19><19>$<24>*<2A>*<2A><04><0F><04> <0B>0L<30>0Q<30>*<2A>R<>R<>S<>S<>S<>S<>Sr))r<>r<>rrrr)r<>r<>r<>r<>rrrHr<>)rIrJrKrLrMr r<>r rcr<>rr<>r#r<>rFr<>r<>r<>r<>r<>rNrOs@r(r<>r<><00>s<><00><><00><00><00><00><00><00><08><08> <08>K<EFBFBD> <10><07><04><1B>t<EFBFBD>5<EFBFBD>9<>9<>9<><0F><07><06><1D>v<EFBFBD>E<EFBFBD>:<3A>:<3A>:<3A><0F><07><07><18>u<EFBFBD>5<EFBFBD>9<>9<>9<><0F><07><07><18>u<EFBFBD>5<EFBFBD>9<>9<>9<> <06>H<EFBFBD>%<25>H<EFBFBD>Q<EFBFBD>K<EFBFBD>K<EFBFBD>F<EFBFBD>'<27>'<27>'<27>'<27><1D><1D><1D><1D><1D>g<EFBFBD><1D><1D><1D>3<>3<>3<>3<>3<>3<><17><17><17><17>#<23>#<23>#<23>#<23>) <20>) <20>) <20>) <20>Z/ <20>/ <20>/ <20>/ <20>fC<01>C<01>C<01>C<01>C<01>C<01>C<01>C<01>T<01>T<01>T<01>T<01>T<01>T<01>T<01>Tr)r<>r<>r<>r<>r<>rr0c<01>T<00>t||zdz <00><00>}dd|zzd||z
zzdzS)Nr<4E><00>[u█u░r8)r<>)r<>r<><00>filleds r(r<>r<>ws:<00><00> <10><15><13><1B>s<EFBFBD>"<22> #<23> #<23>F<EFBFBD> <0E><15><16><1E> <1F>%<25>5<EFBFBD>6<EFBFBD>><3E>":<3A> :<3A>S<EFBFBD> @<40>@r)c<01><<00><00>eZdZdZd<0E>fd<06> Zdd <09>Zdd <0C>Zdd <0A>Z<07>xZS)<12> StatusBarzW
StatusBar {
dock: top;
height: 1;
padding: 0 1;
}
rrrrc <01>V<00><01>t<00><00>jdi|<01><01>g|_d|_dS)N<>)r<>)r"r#<00>_stats<74>_msgr%s <20>r(r#zStatusBar.__init__<5F>s2<00><><00><18><05><07><07><18>&<26>&<26>v<EFBFBD>&<26>&<26>&<26>"$<24><04> <0B>"$<24><04> <09> <09> r)<00>stats<74>
list[dict]c<01><<00>||_|<00><00><00>dSr-)r<><00>_rebuild)r&rs r(<00> update_statszStatusBar.update_stats<74>s<00><00><1B><04> <0B> <0C> <0A> <0A><0F><0F><0F><0F>r)<00>msgr0c<01><<00>||_|<00><00><00>dSr-)r<>r)r&rs r(<00> set_messagezStatusBar.set_message<67>s<00><00><17><04> <09> <0C> <0A> <0A><0F><0F><0F><0F>r)c <01>x<00>g}|jD]j}|<02>d<01><00>rdnd}|<01>|<03>d|d<00>d|<02>dd<08><00>d <09>d
|<02>d d<08><00><00><00><07><00><00>k|rd <0C>|<01><00>nd }|jr d|j<00>d<0F>nd}|<00>||z<00><00>dS)N<> connectedu[green]●[/green]u[red]✗[/red]r7<00> device_idr<00> achieved_hzrz.0fz Hz err=<3D> error_countz z[dim]no devices[/dim]r<>z [/yellow]r<>)r<>r<>r?r@r<><00>update)r&<00>partsr<73><00>dotr<74>rs r(rzStatusBar._rebuild<6C>s<><00><00><1D><05><15><1B> <0E> <0E>A<EFBFBD>*+<2B>%<25>%<25> <0B>*<<3C>*<<3C>R<>&<26>&<26>BR<42>C<EFBFBD> <11>L<EFBFBD>L<EFBFBD><16>1<>1<><11>;<3B><1E>1<>1<><14>5<EFBFBD>5<EFBFBD><1D><01>*<2A>*<2A>5<>1<>1<><18>u<EFBFBD>u<EFBFBD>]<5D>A<EFBFBD>.<2E>.<2E>1<>1<> <0E> <0E> <0E> <0E>
',<2C>H<><15><1A><1A>E<EFBFBD>"<22>"<22>"<22>1H<31><06>6:<3A>i<EFBFBD>G<>2<>d<EFBFBD>i<EFBFBD>2<>2<>2<>2<>R<EFBFBD><03> <0C> <0B> <0B>F<EFBFBD>S<EFBFBD>L<EFBFBD>!<21>!<21>!<21>!<21>!r)rG)rrrr)rr0rrr<>) rIrJrKrMr#rrrrNrOs@r(r<>r<><00>s<><00><><00><00><00><00><00><08>K<EFBFBD>%<25>%<25>%<25>%<25>%<25>%<25>
<18><18><18><18><18><18><18><18> "<22> "<22> "<22> "<22> "<22> "<22> "<22> "r)r<>c<01>b<00><00>eZdZdZdZdZeddd<06><00>eddd <09><00>ed
d d d <0A><0E><00>gZd1<64>fd<17> Zd2d<19>Z d3d<1A>Z
d3d<1B>Z d3d<1C>Z e ej<00><00>d4d<1F><04><00>Ze ej<00><00>d5d!<21><04><00>Zd6d&<26>Ze ej<00><00>d7d(<28><04><00>Zd8d9d-<2D>Zd3d.<2E>Zd3d/<2F>Zd3d0<64>Z<1A>xZS):<3A> TerminatorTUIz Arnold Terminator I/O debug TUI.u"Arnold — Terminator I/O Debuggera<72>
Screen {
layout: vertical;
}
#main-area {
height: 1fr;
layout: horizontal;
}
#input-panel {
width: 1fr;
height: 100%;
overflow-y: auto;
}
#output-panel {
width: 1fr;
height: 100%;
overflow-y: auto;
}
#sequence-panel {
width: 2fr;
height: 100%;
overflow-y: auto;
}
<20>q<>quit<69>Quitr<74><00> reconnect<63> Reconnect<63>tab<61> cycle_focus<75>TabFrU<00>configr<00>registryr<00> sequencerrrrc<01>.<00><01>t<00><00><00><00><00>||_||_||_d<01>|jD<00><00>|_d<02>|jD<00><00>|_d<03>|jD<00><00>|_d|_ d|_
d|_ d|_ dS)Nc<01>2<00>g|]}|jdk<00> |j<00><02>S)<01>input<75><02> directionrBr<>s r(<00>
<listcomp>z*TerminatorTUI.__init__.<locals>.<listcomp><3E>s-<00><00>(
<EFBFBD>(
<EFBFBD>(
<EFBFBD><18><11><1B><07>1G<31>1G<31>A<EFBFBD>F<EFBFBD>1G<31>1G<31>1Gr)c<01>2<00>g|]}|jdk<00> |j<00><02>S)<01>outputr r<>s r(r"z*TerminatorTUI.__init__.<locals>.<listcomp><3E>s-<00><00>)
<EFBFBD>)
<EFBFBD>)
<EFBFBD><18><11><1B><08>1H<31>1H<31>A<EFBFBD>F<EFBFBD>1H<31>1H<31>1Hr)c<01><00>i|]}|d<00><02>Srtr!)rurBs r(rwz*TerminatorTUI.__init__.<locals>.<dictcomp><3E>s'<00><00>/
<EFBFBD>/
<EFBFBD>/
<EFBFBD> <20>D<EFBFBD>%<25>/
<EFBFBD>/
<EFBFBD>/
r)) r"r#<00>_cfg<66>_io<69>_seq<65>
logical_io<EFBFBD> _input_names<65> _output_names<65> _output_state<74> _last_run_idr<64><00>_refresh_timer<65>_status_clear_timer)r&rrrr's <20>r(r#zTerminatorTUI.__init__<5F>s<><00><><00> <0A><07><07><18><18><1A><1A><1A><1B><04> <09><1D><04><08><1E><04> <09>(
<EFBFBD>(
<EFBFBD>"<22>-<2D>(
<EFBFBD>(
<EFBFBD>(
<EFBFBD><04><19>)
<EFBFBD>)
<EFBFBD>"<22>-<2D>)
<EFBFBD>)
<EFBFBD>)
<EFBFBD><04><1A>
/
<EFBFBD>/
<EFBFBD>$(<28>$6<>/
<EFBFBD>/
<EFBFBD>/
<EFBFBD><04><1A>
*.<2E><04><19>/3<><04><19>26<32><04><1B>26<32><04> <20> <20> r)rc#<01>,K<00>td<01><02><00>V<00>td<03><02><00>5td<04><02><00>V<00>t|jd<05><02><00>V<00>t |jjd<06><07><00>V<00>ddd<00><00>n #1swxYwYt<00><00>V<00>dS)Nz
status-bar)<01>idz main-areaz input-panelz output-panelzsequence-panel)r<>r1) r<>r
rrQr+r<>r&r<>r r<>s r(<00>composezTerminatorTUI.compose<73>s<><00><00><00><00><17><<3C>(<28>(<28>(<28>(<28>(<28>(<28> <17>;<3B> '<27> '<27> '<27> <0E> <0E><1C> <0A>.<2E>.<2E>.<2E> .<2E> .<2E> .<2E><1D>d<EFBFBD>0<>^<5E>D<>D<>D<> D<> D<> D<><1F><1E>)<29>-<2D>#<23><0E><0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><><EFBFBD><EFBFBD> <0E> <0E> <0E> <0E><15>h<EFBFBD>h<EFBFBD><0E><0E><0E><0E>s<00>AA9<03>9A=<07>A=c<01>*<00>|<00>t<00><00><00><00><00>|j<00><00><00>|<00>d|j<00><00>|_tj |j
d<02><03><00><00><00><00>dS)Ng<4E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?T<><02>target<65>daemon) <0B> query_onerQ<00>focusr'<00>start<72> set_interval<61> _refresh_uir.<00> threading<6E>Thread<61>_apply_defaultsr<73>s r(<00>on_mountzTerminatorTUI.on_mount<6E>sx<00><00> <0C><0E><0E>{<7B>#<23>#<23>)<29>)<29>+<2B>+<2B>+<2B> <0C><08><0E><0E><18><18><18>"<22>/<2F>/<2F><06><04>8H<38>I<>I<><04><1B><11><18><04> 4<>T<EFBFBD>B<>B<>B<>H<>H<>J<>J<>J<>J<>Jr)c<01>(<00>ddl}|<01>d<02><00>|jjD]k}|jdkr^|j<00>W|j<00>|j<00><00>}|r6|<03> |j
|j<00><00>}|r|j|j |j <<00>ldS)Nrg<00>?r$) <0A>time<6D>sleepr&r)r!<00> default_stater'<00>driver<65>device<63> write_output<75>modbus_addressr,rB)r&<00>_time<6D>sigrD<00>oks r(r>zTerminatorTUI._apply_defaults<74>s<><00><00><1C><1C><1C><1C> <0A> <0B> <0B>C<EFBFBD><18><18><18><17>9<EFBFBD>'<27> I<01> I<01>C<EFBFBD><12>}<7D><08>(<28>(<28>S<EFBFBD>-><3E>-J<><1D><18><1F><1F><13><1A>4<>4<><06><19>I<01><1F>,<2C>,<2C>S<EFBFBD>-?<3F><13>AR<41>S<>S<>B<EFBFBD><19>I<01>7:<3A>7H<37><04>*<2A>3<EFBFBD>8<EFBFBD>4<><34>  I<01> Ir)c <01><00><00><00>j<00><00><00>}<01>fd<01>|<01><00><00>D<00><00>}<02><00>t<00><00><00>|<02><00><00><00>t <00><00><00><00>j<00><00><00>j <00>
<00><00>}d}|r<1A>j <00> |<03><00>}|s?<3F>j r8<72>j <00> <00>j <00><00>}|r|j dvr|<05>_d<00>_ <00><00>t<00><00><00>|<04>j<00><03><00>d<04><00>j<00><00><00>D<00><00>}g}<07>j<00><00><00>D]M}|d} |<07>i|<08>d|<06>| i<00><00><00>dd<07><00>i<01><01><00><00>N<EFBFBD><00>t*<00><00><00>|<07><00>dS)Nc<01>.<00><01>i|]\}}|<01>jv<00>||<02><02>Sr!)r*)rurvr<>r&s <20>r(rwz-TerminatorTUI._refresh_ui.<locals>.<dictcomp> s,<00><><00>R<>R<>R<>t<EFBFBD>q<EFBFBD>!<21>1<EFBFBD><04>@Q<>;Q<>;Q<>a<EFBFBD><11>;Q<>;Q<>;Qr)r<>)r<>r<>c<01> <00>i|] }|d|<01><02> S)r
r!)ru<00>ds r(rwz-TerminatorTUI._refresh_ui.<locals>.<dictcomp>$s<00><00>J<>J<>J<>A<EFBFBD>a<EFBFBD> <0B>n<EFBFBD>a<EFBFBD>J<>J<>Jr)r
r F)r'r*r<r7rr/rQr|r,r(<00> active_run_id<69>
get_resultr-r<>r<>r<>r<><00> driver_status<75>
poll_statsr?r<>r<>r)
r&r*<00>
input_snap<EFBFBD> active_idr<64><00>result<6C>
driver_map<EFBFBD>combined<65>ps<70>dids
` r(r;zTerminatorTUI._refresh_uis<><00><><00><17>8<EFBFBD>$<24>$<24>&<26>&<26><08>S<01>R<>R<>R<>x<EFBFBD>~<7E>~<7E>'7<>'7<>R<>R<>R<>
<EFBFBD> <0C><0E><0E>z<EFBFBD>"<22>"<22>2<>2<>:<3A>><3E>><3E>><3E> <0A><0E><0E>{<7B>#<23>#<23>7<>7<><04>8J<38>K<>K<>K<><1A>Y<EFBFBD>,<2C>,<2C>.<2E>.<2E> <09>'+<2B>
<EFBFBD> <14> 9<><1D><19>-<2D>-<2D>i<EFBFBD>8<>8<>J<EFBFBD><19> *<2A>T<EFBFBD>.<2E> *<2A><19>Y<EFBFBD>)<29>)<29>$<24>*;<3B><<3C><<3C>F<EFBFBD><15> *<2A>&<26>-<2D>/E<>E<>E<>%+<2B><04>!<21>%)<29><04>!<21> <0C><0E><0E>}<7D>%<25>%<25>6<>6<>$<24><1E>+<2B> 7<>
<EFBFBD>
<EFBFBD>
<EFBFBD> K<01>J<><14><18>1G<31>1G<31>1I<31>1I<31>J<>J<>J<>
<EFBFBD>!<21><08><16>(<28>%<25>%<25>'<27>'<27> b<01> b<01>B<EFBFBD><14>[<5B>/<2F>C<EFBFBD> <14>O<EFBFBD>O<EFBFBD>`<60>r<EFBFBD>`<60>;<3B>
<EFBFBD><0E><0E>s<EFBFBD>B<EFBFBD>0G<30>0G<30>0K<30>0K<30>K<EFBFBD>Y^<5E>0_<30>0_<30>`<60>`<60> a<> a<> a<> a<> <0C><0E><0E>y<EFBFBD>!<21>!<21>.<2E>.<2E>x<EFBFBD>8<>8<>8<>8<>8r)<00>eventrec<01>H<00>|<00>|j|j <00><00>dSr-)<03> _write_outputrfrg)r&rZs r(<00> handle_togglezTerminatorTUI.handle_toggle-s&<00><00> <0C><1A><1A>5<EFBFBD><<3C>U<EFBFBD>-@<40>)@<40>A<>A<>A<>A<>Ar)rmc<01>P<00>|jD]}|<00>||j<00><00><00>dSr-)r+r\r>)r&rZrBs r(<00>handle_all_outputsz TerminatorTUI.handle_all_outputs1s9<00><00><18>&<26> 2<> 2<>D<EFBFBD> <10> <1E> <1E>t<EFBFBD>U<EFBFBD>[<5B> 1<> 1<> 1<> 1<> 2<> 2r)<00> signal_namer0r>rhc<01>`<00><00><01><02><04><05><00>j<00><00><01><00><00><05><05><1A><00>d<01><01><00><02><00>dS<00>j<00><00>j<00><00><00><04><04><1F><00>d<02>j<00><00><02><00>dSd<08><04><00><05><01>fd<05> }t j|d<06><07><00><00><00><00>dS) NzUnknown signal: zNo driver for rrc<01><><00><05><00><02><00>j<00><06><00>}<00>rdnd}|r&<26><06>j<00><<00><03><00><05>d|<01><00><03><00>dS<00><03>d<04><05>d|<01><00><04><00>dS)N<>ONr~r<>zWRITE FAILED: )rFrGr,<00>_flash)rJr<>rDr&rIr`r>s <20><><EFBFBD><EFBFBD><EFBFBD>r(<00>do_writez-TerminatorTUI._write_output.<locals>.do_write@s<><00><><00><17>$<24>$<24>S<EFBFBD>%7<><15>?<3F>?<3F>B<EFBFBD>#<23>.<2E>d<EFBFBD>d<EFBFBD><15>G<EFBFBD><11> J<01>27<32><04>"<22>;<3B>/<2F><14> <0B> <0B>{<7B>:<3A>:<3A><17>:<3A>:<3A>;<3B>;<3B>;<3B>;<3B>;<3B><14> <0B> <0B>H<>[<5B>H<>H<>w<EFBFBD>H<>H<>I<>I<>I<>I<>Ir)Tr4r<>) r&rfrdr'rDrEr<r=r9)r&r`r>rerDrIs``` @@r(r\zTerminatorTUI._write_output6s<><00><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><00><12>i<EFBFBD><1E><1E>{<7B>+<2B>+<2B><03> <0E>;<3B> <10>K<EFBFBD>K<EFBFBD>8<>;<3B>8<>8<> 9<> 9<> 9<> <12>F<EFBFBD><15><18><1F><1F><13><1A>,<2C>,<2C><06> <11>><3E> <10>K<EFBFBD>K<EFBFBD>5<><13><1A>5<>5<> 6<> 6<> 6<> <12>F<EFBFBD> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> <12><18><08><14>6<>6<>6<><<3C><<3C>><3E>><3E>><3E>><3E>>r)r<>c<01><><00>|j<00><00><00>}|r|<00>d<01><00>dS |j<00>|j<00><00>\}}n:#t
$r-}|<00>t |<05><00><00><00>Yd}~dSd}~wwxYw|s|<00>d<01><00>dS||_|<00>d|j<00><00><02><00>dS)NzBusy: sequence already runningz Started: )r(rOrdr9rB<00>
ValueErrorr0r-)r&rZrT<00>run_id<69>started<65>es r(<00>handle_run_sequencez!TerminatorTUI.handle_run_sequenceMs<><00><00><18>I<EFBFBD>+<2B>+<2B>-<2D>-<2D> <09> <14> <13> <10>K<EFBFBD>K<EFBFBD>9<> :<3A> :<3A> :<3A> <12>F<EFBFBD> <13>"<22>i<EFBFBD>o<EFBFBD>o<EFBFBD>e<EFBFBD>j<EFBFBD>9<>9<>O<EFBFBD>F<EFBFBD>G<EFBFBD>G<EFBFBD><47><19> <13> <13> <13> <10>K<EFBFBD>K<EFBFBD><03>A<EFBFBD><06><06> <1F> <1F> <1F> <12>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD><46><EFBFBD><EFBFBD><EFBFBD> <13><><EFBFBD><EFBFBD><17> <13> <10>K<EFBFBD>K<EFBFBD>8<> 9<> 9<> 9<> <12>F<EFBFBD>"<22><04><19> <0C> <0B> <0B>,<2C><05>
<EFBFBD>,<2C>,<2C>-<2D>-<2D>-<2D>-<2D>-s<00>"A<00>
B<03>!"B <03> B<03>@r<00>duration<6F>floatc<01><><00><00><00><00>t<00><00><00>|<01><00><00>jr<19>j<00><00><00><00><00>|<02>fd<01><08><00><00>_dS)Nc<01>^<00><01><00><00>t<00><00><00>d<01><00>S)Nr<4E>)r7r<>rr<>s<00>r(<00><lambda>z&TerminatorTUI._flash.<locals>.<lambda>hs!<00><><00>d<EFBFBD>n<EFBFBD>n<EFBFBD>Y<EFBFBD>7<>7<>C<>C<>B<EFBFBD>G<>G<>r))r7r<>rr/<00>stop<6F> set_timer)r&rrms` r(rdzTerminatorTUI._flashcsn<00><><00> <0C><0E><0E>y<EFBFBD>!<21>!<21>-<2D>-<2D>c<EFBFBD>2<>2<>2<> <0F> #<23> ,<2C> <10> $<24> )<29> )<29> +<2B> +<2B> +<2B>#'<27>><3E>><3E> <14>G<>G<>G<>G<>$
<EFBFBD>$
<EFBFBD><04> <20> <20> r)c<01>X<00>|<00>t<00><00>|<00>t<00><00>g}|j} |<01>|<02><00>}||dzt |<01><00>z<00><00><00>dS#t$r|d<00><00><00>YdSwxYw)Nr<4E>r)r7rQr<><00>focused<65>indexr<78>r8rg)r&<00>panelsru<00>idxs r(<00>action_cycle_focusz TerminatorTUI.action_cycle_focusms<><00><00><16>.<2E>.<2E><1B>-<2D>-<2D>t<EFBFBD>~<7E>~<7E>m<EFBFBD>/L<>/L<>M<><06><16>,<2C><07> <1E><18>,<2C>,<2C>w<EFBFBD>'<27>'<27>C<EFBFBD> <12>C<EFBFBD>!<21>G<EFBFBD>s<EFBFBD>6<EFBFBD>{<7B>{<7B>*<2A> +<2B> 1<> 1<> 3<> 3<> 3<> 3<> 3<><33><19> <1E> <1E> <1E> <12>1<EFBFBD>I<EFBFBD>O<EFBFBD>O<EFBFBD> <1D> <1D> <1D> <1D> <1D> <1D> <1E><><EFBFBD>s<00>AB<00>$B)<03>(B)c<01><><00><00><00><00>d<01><00>d<07>fd<04> }tj|d<05><06><00><00><00><00>dS)NuReconnecting…rrc<01><><00><01><00>jjD]7}<00>j<00>|j<00><00>}|r|<01><00><00><00>8<EFBFBD><02>d<01><00>dS)NzReconnect done)r&<00>devicesr'rDr1<00>connectrd)<03>devrDr&s <20>r(<00> do_reconnectz4TerminatorTUI.action_reconnect.<locals>.do_reconnectxs^<00><><00><1B>y<EFBFBD>(<28> %<25> %<25><03><1D><18><1F><1F><13><16>0<>0<><06><19>%<25><1A>N<EFBFBD>N<EFBFBD>$<24>$<24>$<24><> <10>K<EFBFBD>K<EFBFBD>(<28> )<29> )<29> )<29> )<29> )r)Tr4r<>)rdr<r=r9)r&rs` r(<00>action_reconnectzTerminatorTUI.action_reconnectvs^<00><><00> <0C> <0B> <0B>%<25>&<26>&<26>&<26> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> <12><18> <0C>T<EFBFBD>:<3A>:<3A>:<3A>@<40>@<40>B<>B<>B<>B<>Br)c<00><01><K<00>|j<00><00><00>dSr-)r'rrr<>s r(<00>
on_unmountzTerminatorTUI.on_unmount<6E>s<00><00><00><00> <0C><08> <0A> <0A><0F><0F><0F><0F>r))rrrrrrrr)rrr<>)rZrerr)rZrmrr<00>r`r0r>rhrr)rZr<>rr)rl)rr0rmrnrr)rIrJrKrL<00>TITLE<4C>CSSr r<>r#r2r?r>r;rrQrkr]ror_r\r<>r<>rkrdryr<>r<>rNrOs@r(rr<00>s<><00><><00><00><00><00><00>*<2A>*<2A> 0<>E<EFBFBD> <08>C<EFBFBD>4 <10><07><03>v<EFBFBD>V<EFBFBD>,<2C>,<2C><0F><07><03>{<7B>[<5B>1<>1<><0F><07><05>}<7D>U<EFBFBD>u<EFBFBD>=<3D>=<3D>=<3D><06>H<EFBFBD> 7<>7<>7<>7<>7<>7<>8 <17> <17> <17> <17>K<01>K<01>K<01>K<01> I<01> I<01> I<01> I<01>"9<>"9<>"9<>"9<>L<08>R<EFBFBD> <0B> <20>!<21>!<21>B<01>B<01>B<01>"<22>!<21>B<01><08>R<EFBFBD> <0B><1E><1F><1F>2<>2<>2<> <20><1F>2<>?<3F>?<3F>?<3F>?<3F>.<08>R<EFBFBD> <0A>!<21>"<22>"<22>.<2E>.<2E>.<2E>#<23>"<22>.<2E>*
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><1E><1E><1E><1E>C<01>C<01>C<01>C<01><18><18><18><18><18><18><18>r)rrc <01><><00><08>tjd<01><02><00>}|<00>ddtt t
<00><00>jdz <00><00>d<06><07><00>|<00><00><00>} t|j <00><00>}nI#t$r<}td|<03><00>tj <00> <09><00>tjd
<EFBFBD><00>Yd}~nd}~wwxYwt|<02><00>}d <0B>|jD<00><00><00>d<16>fd<12> }t#||t t
<00><00>jdz |<05><14><00>}t%|||<06><15><00>}<07>|_|<07><00><00>dS)NzArnold Terminator I/O debug TUI)r<>rr<>z config.yamlz/Path to YAML config file (default: config.yaml))<03>nargs<67>default<6C>helpzConfig error: )<01>filer<65>c<01>4<00>i|]}|jdk<00> |jd<01><02>S)r$Fr r<>s r(rwzmain.<locals>.<dictcomp><3E>s2<00><00>%<06>%<06>%<06> <0A>a<EFBFBD>k<EFBFBD>X<EFBFBD>&=<3D>&=<3D>
<EFBFBD><06><05>&=<3D>&=<3D>&=r)r`r0r>rhrrc<01><00><01>|<01>|<dSr-r!)r`r><00> output_states <20>r(<00>on_output_writezmain.<locals>.on_output_write<74>s<00><><00>$)<29> <0C>[<5B>!<21>!<21>!r)zruns.log)rr<00>log_pathr<68>)rrrr<>)<15>argparse<73>ArgumentParser<65> add_argumentr0r<00>__file__<5F>parent<6E>
parse_args<EFBFBD> load_configrr<00>print<6E>sys<79>stderr<72>exitrr)rrr,r<>) <09>parser<65>argsrrjrr<>r<00>appr<70>s @r(<00>mainr<6E><00>s<><00><><00> <15> $<24>1R<31> S<> S<> S<>F<EFBFBD>
<EFBFBD><17><17><10><11><13>D<EFBFBD><18>N<EFBFBD>N<EFBFBD>)<29>M<EFBFBD>9<>:<3A>:<3A> ><3E> <18><06><06><06> <12> <1C> <1C> <1E> <1E>D<EFBFBD><14><1C>T<EFBFBD>[<5B>)<29>)<29><06><06><> <16><14><14><14> <0A>"<22>q<EFBFBD>"<22>"<22><13><1A>4<>4<>4<>4<> <0B><08><11> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><><EFBFBD><EFBFBD><EFBFBD><14><><EFBFBD><EFBFBD><1A>&<26>!<21>!<21>H<EFBFBD>%<06>%<06><17>"<22>%<06>%<06>%<06>L<EFBFBD>
*<2A>*<2A>*<2A>*<2A>*<2A>*<2A><1A><19><1B><17><08>><3E>><3E>(<28>:<3A>5<>)<29> <06><06><06>I<EFBFBD> <18>v<EFBFBD><08>I<EFBFBD>
N<EFBFBD>
N<EFBFBD>
N<EFBFBD>C<EFBFBD>$<24>C<EFBFBD><15><07>G<EFBFBD>G<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>Is<00>,B<00>
C<03> 2C<03>C<03>__main__)r<>)r<>r<>r<>r<>rr0r<>)<rL<00>
__future__rr<>rA<00>loggingr<67>r<<00>pathlibr<00>typingrr<00> textual.apprr<00>textual.bindingr <00>textual.containersr
<00>textual.reactiver <00> textual.timerr <00>textual.widgetsr r<00>textualr<00>textual.messager<00>path<74>insertr0r<>r<><00> arnold.configrr<>rrr<00>arnold.terminator_iorr<00>arnold.sequencerrr<00> getLogger<65>setLevel<65>CRITICAL<41>WARNINGrrQr<>r<>r<>rr<>rIr!r)r(<00><module>r<>sD<00><01><04><04>.#<23>"<22>"<22>"<22>"<22>"<22>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> <0B> <0B> <0B> <0B><0E><0E><0E><0E><0F><0F><0F><0F><10><10><10><10><18><18><18><18><18><18> <20> <20> <20> <20> <20> <20> <20> <20>+<2B>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>#<23>#<23>#<23>#<23>#<23>#<23>)<29>)<29>)<29>)<29>)<29>)<29>%<25>%<25>%<25>%<25>%<25>%<25><1F><1F><1F><1F><1F><1F>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A><16><16><16><16><16><16>#<23>#<23>#<23>#<23>#<23>#<23><04><08><0F><0F><01>3<EFBFBD>3<EFBFBD>t<EFBFBD>t<EFBFBD>H<EFBFBD>~<7E>~<7E>,<2C>-<2D>-<2D>.<2E>.<2E>.<2E>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>L<>8<>8<>8<>8<>8<>8<>8<>8<>1<>1<>1<>1<>1<>1<>1<>1<><12><07><11>*<2A><1D><1D>&<26>&<26>w<EFBFBD>'7<>8<>8<>8<><11><07><11>(<28><1B><1B>$<24>$<24>W<EFBFBD>_<EFBFBD>5<>5<>5<>" <20>" <20>" <20>" <20>" <20><16>" <20>" <20>" <20>R_7<>_7<>_7<>_7<>_7<>&<26>D<EFBFBD>_7<>_7<>_7<>_7<>LiT<01>iT<01>iT<01>iT<01>iT<01>F<EFBFBD>d<EFBFBD>iT<01>iT<01>iT<01>iT<01>XA<01>A<01>A<01>A<01>A<01>!"<22>!"<22>!"<22>!"<22>!"<22><06>!"<22>!"<22>!"<22>PY<18>Y<18>Y<18>Y<18>Y<18>C<EFBFBD>Y<18>Y<18>Y<18>@*<0E>*<0E>*<0E>*<0E>Z <0C>z<EFBFBD><19><19><08>D<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD><1A>r)