Files
SequencerIO/arnold/__pycache__/sequencer.cpython-311.pyc

127 lines
21 KiB
Plaintext
Raw Normal View History

2026-03-02 17:48:55 -05:00
<EFBFBD>
<00><02>i<EFBFBD>D<00><01>R<00>dZddlmZddlZddlZddlZddlZddlZddlm Z m
Z
m Z ddl m Z m Z ddlmZddlmZmZmZmZerdd lmZmZmZdd
lmZeje<1C><00>Ze Gd <0B>d <0C><00><00><00>Ze Gd <0A>d<0E><00><00><00>ZGd<0F>d<10><00>Z Gd<11>d<12><00>Z!dS)uc
arnold/sequencer.py — Sequence execution engine.
Design:
- One sequence can run at a time (enforced by a mutex).
- Runs asynchronously in a worker thread; returns a run_id immediately.
- Caller polls GET /runs/{run_id} for result.
- Absolute timing: each step fires at t_start + step.t_ms (monotonic clock).
- check_input: reads from IOState cache (fast-poll value), instant check.
- set_output: calls IODriver.write_output() directly.
- On step failure: remaining steps are skipped, outputs are NOT auto-reset
(caller is responsible for safety; a future "on_abort" hook could be added).
<EFBFBD>)<01> annotationsN)<03> dataclass<73>field<6C>asdict)<02>datetime<6D>timezone)<01>Path)<04> TYPE_CHECKING<4E>Any<6E>Callable<6C>Literal<61>)<03>Config<69>Sequence<63> SequenceStep)<01>
IORegistryc<01>l<00>eZdZUded<ded<ded<ded<ded<d Zded
<d Zd ed <d Zd ed<d S)<0F>
StepResult<EFBFBD>int<6E>
step_index<EFBFBD>t_ms<6D>str<74>action<6F>signal<61>bool<6F>success<73><00>detailN<6C>bool | int | None<6E>actual<61>expected)<07>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__annotations__rr r!<00><00><00>+/home/noise/Code/arnold/arnold/sequencer.pyrr&sr<00><00><00><00><00><00><00><13>O<EFBFBD>O<EFBFBD>O<EFBFBD> <0A>I<EFBFBD>I<EFBFBD>I<EFBFBD><0F>K<EFBFBD>K<EFBFBD>K<EFBFBD><0F>K<EFBFBD>K<EFBFBD>K<EFBFBD><11>M<EFBFBD>M<EFBFBD>M<EFBFBD><14>F<EFBFBD><14><14><14><14> $<24>F<EFBFBD>$<24>$<24>$<24>$<24>"&<26>H<EFBFBD>&<26>&<26>&<26>&<26>&<26>&r'rc<01><><00>eZdZUded<ded<ded<dZded<dZded<d Zd
ed <d Zd
ed <d Zd
ed <dZ d
ed<dZ
ded<dZ ded<dd<16>Z dS)<18> RunResultr<00>run_id<69> sequence_namez;Literal['pending', 'running', 'success', 'failed', 'error']<5D>statusr<00>
started_at<EFBFBD> finished_atrr<00> duration_ms<6D>steps_completed<65> total_steps<70><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>current_step_indexNzStepResult | None<6E> failed_step<65> error_message<67>return<72>dictc<01>$<00>t|<00><00>}|S<00>N)r)<02>self<6C>ds r(<00>to_dictzRunResult.to_dict@s<00><00> <12>4<EFBFBD>L<EFBFBD>L<EFBFBD><01><10>r')r7r8) r"r#r$r%r.r/r0r1r2r4r5r6r=r&r'r(r*r*2s<><00><00><00><00><00><00><00><0F>K<EFBFBD>K<EFBFBD>K<EFBFBD><16><16><16><16>G<>G<>G<>G<><19>J<EFBFBD><19><19><19><19><19>K<EFBFBD><19><19><19><19><18>K<EFBFBD><18><18><18><18><1C>O<EFBFBD><1C><1C><1C><1C><18>K<EFBFBD><18><18><18><18> <20><16> <20> <20> <20> <20>%)<29>K<EFBFBD>)<29>)<29>)<29>)<29><1B>M<EFBFBD><1B><1B><1B><1B><11><11><11><11><11>r'r*c<01>(<00>eZdZdd<05>Zdd<08>Zddd <0A>ZdS)<13>RunLog<6F>pathr r7<00>Nonec<01>D<00>||_tj<00><00>|_dSr:)<04>_path<74> threading<6E>Lock<63>_lock)r;r@s r(<00>__init__zRunLog.__init__Js<00><00><19><04>
<EFBFBD><1E>^<5E>%<25>%<25><04>
<EFBFBD>
<EFBFBD>
r'<00>resultr*c<01><00>|j5t|jd<01><00>5}|<02>t j|<01><00><00><00><00>dz<00><00>ddd<00><00>n #1swxYwYddd<00><00>dS#1swxYwYdS)N<>a<>
)rF<00>openrC<00>write<74>json<6F>dumpsr=)r;rH<00>fs r(<00>appendz RunLog.appendNs<><00><00> <11>Z<EFBFBD> =<3D> =<3D><15>d<EFBFBD>j<EFBFBD>#<23>&<26>&<26> =<3D>!<21><11><07><07><04>
<EFBFBD>6<EFBFBD>><3E>><3E>#3<>#3<>4<>4<>t<EFBFBD>;<3B><<3C><<3C><<3C> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D><><EFBFBD><EFBFBD> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D><><EFBFBD><EFBFBD> =<3D> =<3D> =<3D> =<3D> =<3D> =s4<00>A?<03>=A'<05> A?<03>'A+ <09>+A?<03>.A+ <09>/A?<03>?B<07>B<07>2<00>nr<00>
list[dict]c<01><><00>|j<00><00><00>sgS|j5|j<00><00><00><00><00><00>}ddd<01><00>n #1swxYwYg}|| d<01>D]V}|<04><00><00>}|r> |<03>tj|<04><00><00><00><00>A#tj $rY<00>RwxYw<01>Wtt|<03><00><00><00>S)zReturn the last n entries.N) rC<00>existsrF<00> read_text<78>
splitlines<EFBFBD>striprQrN<00>loads<64>JSONDecodeError<6F>list<73>reversed)r;rS<00>lines<65>entries<65>lines r(<00>tailz RunLog.tailSs0<00><00><13>z<EFBFBD> <20> <20>"<22>"<22> <16><15>I<EFBFBD> <11>Z<EFBFBD> 8<> 8<><18>J<EFBFBD>(<28>(<28>*<2A>*<2A>5<>5<>7<>7<>E<EFBFBD> 8<> 8<> 8<> 8<> 8<> 8<> 8<> 8<> 8<> 8<> 8<><38><EFBFBD><EFBFBD> 8<> 8<> 8<> 8<><14><07><19>1<EFBFBD>"<22>#<23>#<23>J<EFBFBD> <19> <19>D<EFBFBD><17>:<3A>:<3A><<3C><<3C>D<EFBFBD><13> <19><19><1B>N<EFBFBD>N<EFBFBD>4<EFBFBD>:<3A>d<EFBFBD>#3<>#3<>4<>4<>4<>4<><34><1B>+<2B><19><19><19><18>D<EFBFBD><19><><EFBFBD><EFBFBD> <19>
<14>H<EFBFBD>W<EFBFBD>%<25>%<25>&<26>&<26>&s#<00>,A<03>A<07>"A<07> 'B4<02>4C<05>CN)r@r r7rA)rHr*r7rA<00>rR<00>rSrr7rT)r"r#r$rGrQrar&r'r(r?r?IsU<00><00><00><00><00><00>&<26>&<26>&<26>&<26>=<3D>=<3D>=<3D>=<3D>
'<27>'<27>'<27>'<27>'<27>'<27>'r'r?c<01><><00>eZdZ d1d2d <0C>Zd3d<10>Zd4d<13>Zd5d<15>Zd6d7d<1A>Zd8d<1D>Zd9d"<22>Z d:d%<25>Z
d:d&<26>Z d:d'<27>Z e d;d+<2B><04><00>Ze d<d-<2D><04><00>Ze d=d.<2E><04><00>Zd>d0<64>ZdS)?<3F> SequencerN<72>config<69>'Config'<27>registry<72> 'IORegistry'<27>log_pathr <00>on_output_write<74>(Callable[[str, bool | int], None] | Noner7rAc<01><><00>||_||_t|<03><00>|_||_t j<00><00>|_d|_t j<00><00>|_ i|_
dSr:) <0B>_config<69> _registryr?<00>_run_log<6F>_on_output_writerDrE<00> _run_lock<63>
_active_id<EFBFBD> _results_lock<63>_results)r;rfrhrjrks r(rGzSequencer.__init__is`<00><00> <20><04> <0C>!<21><04><0E><1F><08>)<29>)<29><04> <0A>!0<><04><1D>&<26>N<EFBFBD>,<2C>,<2C><04><0E>&*<2A><04><0F>'<27>^<5E>-<2D>-<2D><04><1A>.0<EFBFBD><04> <0A> <0A> r'r,r<00>tuple[str, bool]c
<01> <00>|j<00>|<01><00>}|<02>td|<01><02><02><00><00>|j<00>d<03><04><00>sdSt t j<00><00><00><00>}t||dt|j
<00><00><00><07><00>}|j 5||j |<||_ ddd<01><00>n #1swxYwYtj|j||fd|<01>d |dd
<EFBFBD><00><00>d <0B> <0C><00>}|<05><00><00>|d fS) z<>
Launch sequence_name in a background thread.
Returns (run_id, started).
started=False means another sequence is already running (caller
should return HTTP 409).
NzUnknown sequence: F)<01>blocking)rF<>pending)r+r,r-r2zseq-<2D>-<2D>T)<04>target<65>args<67>name<6D>daemon)rn<00>sequence<63>
ValueErrorrr<00>acquirer<00>uuid<69>uuid4r*<00>len<65>stepsrtrursrD<00>Thread<61> _run_thread<61>start)r;r,<00>seqr+rH<00>ts r(r<>zSequencer.start<72>sb<00><00><13>l<EFBFBD>#<23>#<23>M<EFBFBD>2<>2<><03> <0E>;<3B><1C>C<>-<2D>C<>C<>D<>D<> D<><14>~<7E>%<25>%<25>u<EFBFBD>%<25>5<>5<> <1F><1E>;<3B><14>T<EFBFBD>Z<EFBFBD>\<5C>\<5C>"<22>"<22><06><1A><19>'<27><1C><1B>C<EFBFBD>I<EFBFBD><0E><0E> 
<EFBFBD>
<EFBFBD>
<EFBFBD><06> <12> <1F> %<25> %<25>$*<2A>D<EFBFBD>M<EFBFBD>&<26> !<21>$<24>D<EFBFBD>O<EFBFBD> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25><><EFBFBD><EFBFBD> %<25> %<25> %<25> %<25> <16> <1C><17>#<23><15>v<EFBFBD><1D>4<> <0A>4<>4<><06>r<EFBFBD><01>r<EFBFBD>
<EFBFBD>4<>4<><17> 
<EFBFBD>
<EFBFBD>
<EFBFBD><01>
<EFBFBD><07><07> <09> <09> <09><16><04>~<7E>s<00>B6<03>6B:<07>=B:r+<00>RunResult | Nonec<01>x<00>|j5|j<00>|<01><00>cddd<00><00>S#1swxYwYdSr:)rtru<00>get)r;r+s r(<00>
get_resultzSequencer.get_result<6C>s<><00><00> <11> <1F> -<2D> -<2D><17>=<3D>$<24>$<24>V<EFBFBD>,<2C>,<2C> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D><><EFBFBD><EFBFBD> -<2D> -<2D> -<2D> -<2D> -<2D> -s <00>/<03>3<07>3<07>
str | Nonec<01>R<00>|j5|jcddd<00><00>S#1swxYwYdSr:)rtrs)r;s r(<00> active_run_idzSequencer.active_run_id<69>st<00><00> <11> <1F> #<23> #<23><17>?<3F> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23><><EFBFBD><EFBFBD> #<23> #<23> #<23> #<23> #<23> #s <00><03> <07> rRrSrrTc<01>6<00>|j<00>|<01><00>Sr:)rpra)r;rSs r(<00> recent_runszSequencer.recent_runs<6E>s<00><00><13>}<7D>!<21>!<21>!<21>$<24>$<24>$r'r<><00>
'Sequence'c <01><><00>tjtj<00><00>}t j<00><00>}|<00>|d|<03><00><00><00><02><00>t<00> d|j
|t|j <00><00><00><00>d}d} t|j <00><00>D]<5D>\}}|<00>||<07><05><00>||jdz z} t j<00><00>}
| |
krt j| |
z
<00><00>|<00>||<08><00>\} } | s9|}| }t<00>d|j
||j|j| j<00><00>nD|dz}|<00>||<06> <09><00>t<00>d
||j|j<00><00><00><><EFBFBD>n#t,$<00>r} t<00>d |j
| <0A><00>tjtj<00><00>}t1t j<00><00>|z
d z<00><00>}|<00>|d |<0E><00><00>||dt3| <0A><00><00><0F><00>}|j<00>|<10><00>|j<00><00><00>|j5d|_ddd<00><00>n #1swxYwYYd} ~ dSd} ~ wwxYwtjtj<00><00>}t1t j<00><00>|z
d z<00><00>}|rd}nd}t|j <00><00>}|<00>|||<0E><00><00>||d|<05><12><00>}|j<00>|<10><00>|j<00><00><00>|j5d|_ddd<00><00>n #1swxYwYt<00> d|j
|<11> <00><00>|||t|j <00><00><00><00>dS)N<>running)r-r.z(Sequence %r started run_id=%s steps=%dr)r4<00>@<40>@z)Sequence %r FAILED at step %d (%s %s): %sr)r1zStep %d OK: %s %sz Sequence %r raised exception: %si<73><00>errorr3)r-r/r0r1r4r6<00>failedr)r-r/r0r1r4r5z5Sequence %r %s run_id=%s duration=%dms steps=%d/%d)!r<00>nowr<00>utc<74>time<6D> monotonic<69>_update_result<6C> isoformat<61>log<6F>infor~r<>r<><00> enumerater<00>sleep<65> _execute_step<65>warningrrr<00>debug<75> Exception<6F> exceptionrrrprQrr<00>releasertrs<00>upper)r;r<>r+r.<00>t_startr5r1<00>i<>stepr|r<><00>ok<6F> step_result<6C>excr/r0rHr-s r(r<>zSequencer._run_thread<61>sO<00><00><1D>\<5C>(<28>,<2C>/<2F>/<2F>
<EFBFBD><19>^<5E>%<25>%<25><07> <0C><1B><1B>F<EFBFBD>9<EFBFBD>'1<>';<3B>';<3B>'=<3D>'=<3D> <1C> ?<3F> ?<3F> ?<3F> <0C><08><08>;<3B><14><18>6<EFBFBD>3<EFBFBD>s<EFBFBD>y<EFBFBD>><3E>><3E> 3<> 3<> 3<>*.<2E> <0B><1B><0F>+ <13>$<24>S<EFBFBD>Y<EFBFBD>/<2F>/<2F> L<01> L<01><07><01>4<EFBFBD><14>#<23>#<23>F<EFBFBD>q<EFBFBD>#<23>A<>A<>A<>!<21>4<EFBFBD>9<EFBFBD>v<EFBFBD>#5<>5<><06><1D><1E>)<29>)<29><03><19>C<EFBFBD><<3C><<3C><18>J<EFBFBD>v<EFBFBD><03>|<7C>,<2C>,<2C>,<2C>"&<26>"4<>"4<>Q<EFBFBD><04>"=<3D>"=<3D><0F><02>K<EFBFBD><19><1A>&'<27>O<EFBFBD>"-<2D>K<EFBFBD><17>K<EFBFBD>K<EFBFBD>C<><1B><08>!<21>T<EFBFBD>[<5B>$<24>+<2B>{<7B>?Q<><16><16><16><1A>E<EFBFBD>"#<23>a<EFBFBD>%<25><0F><14>#<23>#<23>F<EFBFBD>O<EFBFBD>#<23>L<>L<>L<><13> <09> <09>-<2D>q<EFBFBD>$<24>+<2B>t<EFBFBD>{<7B>K<>K<>K<>K<><4B><EFBFBD><18> <13> <13> <13> <0F>M<EFBFBD>M<EFBFBD><<3C>c<EFBFBD>h<EFBFBD><03> L<> L<> L<>#<23><<3C><08> <0C>5<>5<>K<EFBFBD><1E><04><0E> 0<> 0<>7<EFBFBD> :<3A>d<EFBFBD>B<>C<>C<>K<EFBFBD><19>(<28>(<28><16><1E>'<27>1<>1<>3<>3<>'<27> /<2F>#%<25>!<21>#<23>h<EFBFBD>h<EFBFBD>)<29><0E><0E>F<EFBFBD> <11>M<EFBFBD> <20> <20><16> (<28> (<28> (<28> <10>N<EFBFBD> "<22> "<22> $<24> $<24> $<24><15>#<23> '<27> '<27>"&<26><04><0F> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27><><EFBFBD><EFBFBD> '<27> '<27> '<27> '<27> <12>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD><46><EFBFBD><EFBFBD><EFBFBD># <13><><EFBFBD><EFBFBD>&<1F>l<EFBFBD>8<EFBFBD><<3C>0<>0<> <0B><19>4<EFBFBD>><3E>+<2B>+<2B>g<EFBFBD>5<><14>=<3D>><3E>><3E> <0B> <16> -<2D><1D>F<EFBFBD>F<EFBFBD><1E>F<EFBFBD>!<21>#<23>)<29>n<EFBFBD>n<EFBFBD>O<EFBFBD><15>$<24>$<24> <12><19>#<23>-<2D>-<2D>/<2F>/<2F>#<23>+<2B>!<21>#<23>%<25>
<EFBFBD>
<EFBFBD><06> <0A> <0A><1C><1C>V<EFBFBD>$<24>$<24>$<24> <0C><0E><1E><1E> <20> <20> <20> <11> <1F> #<23> #<23>"<22>D<EFBFBD>O<EFBFBD> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23><><EFBFBD><EFBFBD> #<23> #<23> #<23> #<23> <0C><08><08> C<> <0F>H<EFBFBD>f<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD>n<EFBFBD>f<EFBFBD>k<EFBFBD> <1B>S<EFBFBD><13><19>^<5E>^<5E>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
sP<00>DF<00> J+<03>'CJ&<03>J<05> J&<03>J <09>J&<03>J <09>J&<03>&J+<03>5N <03> N <07>N <07>indexr<78><00>'SequenceStep'<27>tuple[bool, StepResult]c <01><><00>|j<00>|j<00><00>}|<03>/t||j|j|jdd|j<00><02><02><00>}d|fS|jdkr|<00>|||<03><00>S|jdkr|<00>|||<03><00>S|jdkr|<00>|||<03><00>St||j|j|jdd|j<00><02><02><00>}d|fS)NFzUnknown signal <20>
set_output<EFBFBD> check_input<75>
wait_inputzUnknown action )rnrrrr<00> _set_output<75> _check_input<75> _wait_input)r;r<>r<><00>sig<69>srs r(r<>zSequencer._execute_steps<><00><00><12>l<EFBFBD>!<21>!<21>$<24>+<2B>.<2E>.<2E><03> <0E>;<3B><1B>E<EFBFBD>4<EFBFBD>9<EFBFBD>d<EFBFBD>k<EFBFBD>4<EFBFBD>;<3B>!<21>#D<>T<EFBFBD>[<5B>#D<>#D<>F<01>F<01>B<EFBFBD><18>"<22>9<EFBFBD> <1C> <0F>;<3B>,<2C> &<26> &<26><17>#<23>#<23>E<EFBFBD>4<EFBFBD><13>5<>5<> 5<> <11>[<5B>M<EFBFBD> )<29> )<29><17>$<24>$<24>U<EFBFBD>D<EFBFBD>#<23>6<>6<> 6<> <11>[<5B>L<EFBFBD> (<28> (<28><17>#<23>#<23>E<EFBFBD>4<EFBFBD><13>5<>5<> 5<><1B>E<EFBFBD>4<EFBFBD>9<EFBFBD>d<EFBFBD>k<EFBFBD>4<EFBFBD>;<3B>!<21>#D<>T<EFBFBD>[<5B>#D<>#D<>F<01>F<01>B<EFBFBD><18>"<22>9<EFBFBD> r'r<>r c <01><><00>|j<00>|j<00><00>}|<04>/t||j|j|jdd|j<00><02><02><00>}d|fS|jdkrIt|j pd<04><00>}|<04>
|j |<06><00>}d|j<00>d|<06><00>}d|j<00><00>} nJt|j <00><00>}|<04>|j |<06><00>}d|j<00>d|rdnd <09><00>}d
|j<00><00>} |r4|jr- |<00>|j|<06><00>n#t $rYnwxYwt||j|j|j||r|n| <09> <0B><00>}||fS) NFzNo driver for device rrzSet <20>=zRegister write failed for <20>ON<4F>OFFzCoil write failed for )rrrrrr)ro<00>driver<65>devicerrrr<00>
value_typer<00>value<75>write_register<65>modbus_addressr<00>state<74> write_outputrqr<>)
r;r<>r<>r<>r<>r<><00> write_valr<6C><00> detail_ok<6F>
detail_errs
r(r<>zSequencer._set_output(s<><00><00><16><1E>&<26>&<26>s<EFBFBD>z<EFBFBD>2<>2<><06> <11>><3E><1B>E<EFBFBD>4<EFBFBD>9<EFBFBD>d<EFBFBD>k<EFBFBD>4<EFBFBD>;<3B>!<21>#I<>3<EFBFBD>:<3A>#I<>#I<>K<01>K<01>B<EFBFBD><18>"<22>9<EFBFBD> <1C> <0E>><3E>U<EFBFBD> "<22> "<22>$'<27><04>
<EFBFBD><0F>a<EFBFBD>$8<>$8<>I<EFBFBD><17>&<26>&<26>s<EFBFBD>'9<>9<EFBFBD>E<>E<>B<EFBFBD>9<><04> <0B>9<>9<>i<EFBFBD>9<>9<>I<EFBFBD>C<>d<EFBFBD>k<EFBFBD>C<>C<>J<EFBFBD>J<EFBFBD><1D>T<EFBFBD>Z<EFBFBD>(<28>(<28>I<EFBFBD><17>$<24>$<24>S<EFBFBD>%7<><19>C<>C<>B<EFBFBD>L<><04> <0B>L<>L<>i<EFBFBD>.J<>d<EFBFBD>d<EFBFBD>U<EFBFBD>L<>L<>I<EFBFBD>?<3F>$<24>+<2B>?<3F>?<3F>J<EFBFBD> <0A> <15>$<24>'<27> <15> <15><14>%<25>%<25>d<EFBFBD>k<EFBFBD>9<EFBFBD>=<3D>=<3D>=<3D>=<3D><><1C> <15> <15> <15><14><04> <15><><EFBFBD><EFBFBD><18><1C><15><19><17>;<3B><17>;<3B><16> "<22>2<>9<EFBFBD>9<EFBFBD>
<EFBFBD> 
<EFBFBD>
<EFBFBD>
<EFBFBD><02><12>2<EFBFBD>v<EFBFBD> s<00>9D<00>
D"<03>!D"c <01>6<00>|j<00>|j<00><00>}|j<00>|j<00><00>}|s|<04>Gt ||j|j|jdd|j<00>d<03>||<00>||<03><00><00><04><00>}d|fS|<00>|||<03><00>\}}|j dkrd|j<00>d|<08>d|<04><00>} nd|j<00>d|j
rd nd
<EFBFBD>d|rd nd
<EFBFBD><00>} t ||j|j|j|| ||<00>||<03><00><00><04><00>}||fS) NFzSignal z is stale or not yet read<61>rrrrrrr r!rzCheck z : expected=z actual=r<>r<>) ro<00> get_valuer<00>is_stalerrr<00>_expected_for_step<65>_comparer<65>r!)
r;r<>r<>r<>r <00>staler<65>r<><00>expected_displayrs
r(r<>zSequencer._check_inputPs<><00><00><16><1E>)<29>)<29>$<24>+<2B>6<>6<><06><15><1E>(<28>(<28><14><1B>5<>5<><05> <10> <1D>F<EFBFBD>N<EFBFBD><1B> <20><19>Y<EFBFBD><1B>{<7B><1B>{<7B><1D>I<><14><1B>I<>I<>I<><1D><1D>0<>0<><14>s<EFBFBD>;<3B>;<3B> <0E> <0E> <0E>B<EFBFBD><19>"<22>9<EFBFBD> <1C>#<23>}<7D>}<7D>V<EFBFBD>T<EFBFBD>3<EFBFBD>?<3F>?<3F><1C><02> <1C> <0E>><3E>U<EFBFBD> "<22> "<22>#<23><14><1B>#<23>#<23>1A<31>#<23>#<23> <20>#<23>#<23> <13>F<EFBFBD> 6<><14><1B>6<>6<><14><1D>1Q<31><14><14>E<EFBFBD>6<>6<>"(<28>3<>$<24>$<24>e<EFBFBD>6<>6<> <13><18><1C><15><19><17>;<3B><17>;<3B><16><19><19><19>,<2C>,<2C>T<EFBFBD>3<EFBFBD>7<>7<> 
<EFBFBD> 
<EFBFBD> 
<EFBFBD><02><12>2<EFBFBD>v<EFBFBD> r'c<01><00>|jpddz }tj<00><00>|z}d}|<00>||<03><00>} |j<00>|j<00><00>}|j<00>|j<00><00>} | sh|<08>f|<00>|||<03><00>\}
} |
rJt||j
|j |jdd|j<00>d|<07>d<08>||<00> ||<03><00><00> <09><00>} d| fStj<00><00>|kr}| s|<08>d
} n!|j d krt|<08><00>} n|rd nd } t||j
|j |jdd|j<00>d|<07>d|j<00>d| <0A>d<11> ||<00> ||<03><00><00> <09><00>} d| fStj|<06><00><00><01>R)z<>
Poll the signal cache until the expected value is seen or timeout expires.
Polls every 50 ms. Supports both digital (exact bool match) and
analog (abs(actual - expected_value) <= tolerance) comparisons.
rr<>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?TNzWait z==z: condition metr<74>r<>rr<>r<>Fz: timeout after z ms (actual=<3D>))<10>
timeout_msr<EFBFBD>r<><00>_expected_displayror<>rr<>r<>rrrr<>r<>rr<>)r;r<>r<>r<><00> timeout_s<5F>deadline<6E> poll_interval<61> exp_displayr r<>r<><00>_r<5F><00>act_strs r(r<>zSequencer._wait_input|s<><00><00><1E><1F>-<2D>A<EFBFBD><16>7<> <09><1C><0E>(<28>(<28>9<EFBFBD>4<><08><1C> <0A><1A>,<2C>,<2C>T<EFBFBD>3<EFBFBD>7<>7<> <0B>) &<26><19>^<5E>-<2D>-<2D>d<EFBFBD>k<EFBFBD>:<3A>:<3A>F<EFBFBD><19>^<5E>,<2C>,<2C>T<EFBFBD>[<5B>9<>9<>E<EFBFBD><18> $<24>V<EFBFBD>/<2F><1C> <0A> <0A>f<EFBFBD>d<EFBFBD>C<EFBFBD>8<>8<><05><02>A<EFBFBD><15> $<24>#<23>#(<28>!<21>Y<EFBFBD>#<23>{<7B>#<23>{<7B> $<24>R<>t<EFBFBD>{<7B>R<>R<>k<EFBFBD>R<>R<>R<>%<25>!%<25>!8<>!8<><14>s<EFBFBD>!C<>!C<> <16> <16> <16>B<EFBFBD> <20><12>8<EFBFBD>O<EFBFBD><13>~<7E><1F><1F>8<EFBFBD>+<2B>+<2B><18>8<>F<EFBFBD>N<EFBFBD>%<25>G<EFBFBD>G<EFBFBD><18>^<5E>u<EFBFBD>,<2C>,<2C>!<21>&<26>k<EFBFBD>k<EFBFBD>G<EFBFBD>G<EFBFBD>&,<2C>7<>d<EFBFBD>d<EFBFBD>%<25>G<EFBFBD><1F>$<24><1D><19><1F>;<3B><1F>;<3B>!<21>Q<01><04> <0B>Q<01>Q<01>{<7B>Q<01>Q<01>)-<2D><1F>Q<01>Q<01>FM<46>Q<01>Q<01>Q<01>"<22>!<21>4<>4<>T<EFBFBD>3<EFBFBD>?<3F>?<3F> <12> <12> <12><02><1D>b<EFBFBD>y<EFBFBD> <20> <10>J<EFBFBD>}<7D> %<25> %<25> %<25>S) &r'r <00>
bool | int<6E>tuple[bool, str]c<01><00>|jdkrd|j<00>|jnd}|j<00>|jnd}tt |<00><00>|z
<00><00>|k}|dkr|<03>d|<04><00>}nt |<03><00>}||fS||jk}|jrdnd}||fS)zw
Compare actual value against step expectation.
Returns (match: bool, expected_display: str).
rNr<00>±r<C2B1>r<>)r<><00>expected_value<75> tolerance<63>absrrr!)r r<>r<>r!r<>r<><00>displays r(r<>zSequencer._compare<72>s<><00><00> <0F>><3E>U<EFBFBD> "<22> "<22>.2<EFBFBD>.A<>.M<>t<EFBFBD>*<2A>*<2A>ST<53>H<EFBFBD>*.<2E>.<2E>*D<><04><0E><0E>!<21>I<EFBFBD><14>S<EFBFBD><16>[<5B>[<5B>8<EFBFBD>+<2B>,<2C>,<2C> <09>9<>B<EFBFBD><18>1<EFBFBD>}<7D>}<7D>%<25>4<>4<><19>4<>4<><07><07><1D>h<EFBFBD>-<2D>-<2D><07><15>w<EFBFBD>;<3B> <1E><19>D<EFBFBD>M<EFBFBD>)<29>B<EFBFBD>"<22>m<EFBFBD>6<>d<EFBFBD>d<EFBFBD><15>G<EFBFBD><15>w<EFBFBD>;<3B> r'rc<01>4<00>|jdkr|jS|jS)zAReturn the expected value in the appropriate type for StepResult.r)r<>r<>r!)r<>r<>s r(r<>zSequencer._expected_for_step<65>s"<00><00> <0F>><3E>U<EFBFBD> "<22> "<22><17>&<26> &<26><13>}<7D>r'c<01><><00>|jdkr<|j<00>|jnd}|j<00>|jnd}|dkr|<02>d|<03><00>St|<02><00>S|jrdndS)z%Human-readable expected value string.rNrr<>r<>r<>)r<>r<>r<>rr!)r<>r<>r!r<>s r(r<>zSequencer._expected_display<61>ss<00><00> <0F>><3E>U<EFBFBD> "<22> "<22>.2<EFBFBD>.A<>.M<>t<EFBFBD>*<2A>*<2A>ST<53>H<EFBFBD>*.<2E>.<2E>*D<><04><0E><0E>!<21>I<EFBFBD><18>1<EFBFBD>}<7D>}<7D>"<22>1<>1<>i<EFBFBD>1<>1<>1<><16>x<EFBFBD>=<3D>=<3D> <20><1B>}<7D>/<2F>t<EFBFBD>t<EFBFBD>%<25>/r'r*c <01><><00>|j5|j|}|<02><00><00>D]\}}t|||<05><00><00>|cddd<00><00>S#1swxYwYdSr:)rtru<00>items<6D>setattr)r;r+<00>kwargsrH<00>k<>vs r(r<>zSequencer._update_result<6C>s<><00><00> <11> <1F> <1A> <1A><19>]<5D>6<EFBFBD>*<2A>F<EFBFBD><1E> <0C> <0C><0E><0E> &<26> &<26><04><01>1<EFBFBD><17><06><01>1<EFBFBD>%<25>%<25>%<25>%<25><19>  <1A> <1A> <1A> <1A> <1A> <1A> <1A> <1A> <1A> <1A> <1A> <1A><><EFBFBD><EFBFBD> <1A> <1A> <1A> <1A> <1A> s<00>:A<03>A<07>Ar:)
rfrgrhrirjr rkrlr7rA)r,rr7rv)r+rr7r<>)r7r<>rbrc)r<>r<>r+rr7rA)r<>rr<>r<>r7r<>)r<>rr<>r<>r<>r r7r<>)r r<>r<>r<>r<>r r7r<>)r<>r<>r<>r r7r)r<>r<>r<>r r7r)r+rr7r*)r"r#r$rGr<>r<>r<>r<>r<>r<>r<>r<>r<><00> staticmethodr<64>r<>r<>r<>r&r'r(rerehsj<00><00><00><00><00><00> EI<01> 1<>1<>1<>1<>1<>6"<1E>"<1E>"<1E>"<1E>H-<2D>-<2D>-<2D>-<2D>#<23>#<23>#<23>#<23>%<25>%<25>%<25>%<25>%<25>V
<EFBFBD>V
<EFBFBD>V
<EFBFBD>V
<EFBFBD>x<1D><1D><1D><1D>*$<16>$<16>$<16>$<16>P(<16>(<16>(<16>(<16>X8&<26>8&<26>8&<26>8&<26>x<12><1F><1F><1F><12>\<5C><1F>4<12><1D><1D><1D><12>\<5C><1D> <12>0<>0<>0<><12>\<5C>0<><1A><1A><1A><1A><1A>r're)"<22>__doc__<5F>
__future__rrN<00>loggingrDr<>r<><00> dataclassesrrrrr<00>pathlibr <00>typingr
r r r rfrrr<00> terminator_ior<00> getLoggerr"r<>rr*r?rer&r'r(<00><module>r<>s<><00><01> <04> <04>#<23>"<22>"<22>"<22>"<22>"<22> <0B> <0B> <0B> <0B><0E><0E><0E><0E><10><10><10><10> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27><18><18><18><18><18><18>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<><10>*<2A>6<>6<>6<>6<>6<>6<>6<>6<>6<>6<>)<29>)<29>)<29>)<29>)<29>)<29><17>g<EFBFBD><17><08>!<21>!<21><03> <0B>'<27>'<27>'<27>'<27>'<27>'<27>'<27> <0B><19>'<27> <0B><11><11><11><11><11><11><11> <0B><19><11>,'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>>F<1A>F<1A>F<1A>F<1A>F<1A>F<1A>F<1A>F<1A>F<1A>Fr'