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

136 lines
12 KiB
Plaintext
Raw Normal View History

2026-03-02 17:48:55 -05:00
<EFBFBD>
<00> <0A>i<EFBFBD>'<00><01><><00>dZddlmZddlZddlmZddlmZddlm Z ddl
m Z m Z ddl mZmZdd lmZdd
lmZd d lmZd d lmZd dlmZeGd<0F>d<10><00><00><00>Zdd<14>ZdS)u<>
arnold/api.py — FastAPI REST application.
Receives an AppContext at creation time; no module-level mutable globals.
Endpoints:
GET / Redirect to web UI
GET /web/* Static files (web interface)
GET /status Device comms health + poll stats
GET /io All signal states from the poll cache
GET /io/{signal} Single signal state + metadata
POST /io/{signal}/write Write an output signal value
GET /config/signals Full signal metadata for UI bootstrap
GET /sequences List sequences defined in config
GET /sequences/{name} Sequence detail with step list
POST /sequences/{name}/run Start a sequence → {run_id} (409 if busy)
GET /runs Recent run log (last 50, most recent first)
GET /runs/{run_id} Single run result (pending/running/success/failed/error)
<EFBFBD>)<01> annotationsN)<01> dataclass)<01>Path)<01>Any)<02>FastAPI<50> HTTPException)<02> FileResponse<73>RedirectResponse)<01> StaticFiles)<01> BaseModel<65>)<01>Config)<01> Sequencer)<01>
IORegistryc<01><<00>eZdZUdZded<ded<ded<ded <d
S) <0B>
AppContextz=All runtime objects the API needs, passed in at app creation.r<00>configr<00>registryr<00> sequencer<65>float<61>
started_atN)<05>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F>__annotations__<5F><00><00>%/home/noise/Code/arnold/arnold/api.pyrr&sH<00><00><00><00><00><00><00>G<>G<><15><15><15><15><19><19><19><19><18><18><18><18><15><15><15><15><15>rr<00>ctx<74>returnrc<01>F<00><00>tddd<03><04><00>}tt<00><00><00><00><00>jjdz }|<02><00><00>r3|<01>dtt|<02><00><00><07><00>d<08> <09><00>|<01> d
d <0B> <0C><00>d <0A><00><00>}|<01> dd<0F><10><00>d=<3D>fd<13> <0C><00>}|<01> dd<15><10><00>d><3E>fd<17> <0C><00>}|<01> dd<19><10><00>d?<3F>fd<1C> <0C><00>}Gd<1D>dt<00><00>}|<01> dd <20><10><00>d@<40>fd"<22> <0C><00>}|<01> d#d$<24><10><00>dA<64>fd&<26> <0C><00>} |<01> d'd(<28><10><00>dA<64>fd)<29> <0C><00>}
|<01> d*d+<2B><10><00>dB<64>fd-<2D> <0C><00>} |<01> d.d/d0<64>1<EFBFBD><00>dB<64>fd2<64> <0C><00>} |<01> d3d4<64><10><00>dC<64>fd6<64> <0C><00>} |<01> d7d8<64><10><00>dDdE<64>fd<<3C> <0A><00>}|S)FNu Arnold — Terminator I/O Serverz0.1.0z<EFBFBD>Fast-poll Modbus TCP I/O server for AutomationDirect Terminator I/O. Provides real-time signal state and timed sequence execution.)<03>title<6C>version<6F> description<6F>webz/web)<01> directoryz
web-static)<01>name<6D>/F)<01>include_in_schemac<01>"<00>td<01><02><00>S)Nz/web/index.html)<01>url)r
rrr<00> root_redirectz!create_app.<locals>.root_redirectBs<00><00><1F>$5<>6<>6<>6<>6rz/statusz'Device comms health and poll statistics)<01>summaryr!<00>dictc<01><><00><01>dttj<00><00><00>jz
d<02><00><00>j<00><00><00><00>j<00><00><00><00>j<00><00><00>d<03>S)N<>okr )<05>status<75>uptime_s<5F>devices<65>
poll_stats<EFBFBD>
active_run) <09>round<6E>time<6D> monotonicrr<00> driver_statusr5r<00> active_run_id<69>r s<00>r<00>
get_statuszcreate_app.<locals>.get_statusJsf<00><><00><1F><1F><04><0E> 0<> 0<>3<EFBFBD>><3E> A<>1<EFBFBD>E<>E<><1D>,<2C>4<>4<>6<>6<><1D>,<2C>1<>1<>3<>3<><1D>-<2D>5<>5<>7<>7<> 
<EFBFBD>
<EFBFBD>
rz/iozAll signal states<65>dict[str, Any]c<01>n<00><01>d<01><00>j<00><00><00><00><00><00>D<00><00>S)Nc<01>@<00>i|]\}}||j|j|jd<00><03><02>S)<01><03>value<75>stale<6C>
updated_atrA)<03>.0r(<00>ss r<00>
<dictcomp>z2create_app.<locals>.get_all_io.<locals>.<dictcomp>ZsG<00><00>
<EFBFBD>
<EFBFBD>
<EFBFBD> <18><04>a<EFBFBD> <11><1F>g<EFBFBD><1F>g<EFBFBD><1F>l<EFBFBD><0E><0E>
<EFBFBD>
<EFBFBD>
r)r<00>snapshot<6F>itemsr<s<00>r<00>
get_all_iozcreate_app.<locals>.get_all_ioXs@<00><><00>
<EFBFBD>
<EFBFBD> <1F><<3C>0<>0<>2<>2<>8<>8<>:<3A>:<3A> 
<EFBFBD>
<EFBFBD>
<EFBFBD>
rz/io/{signal_name}zSingle signal state<74> signal_name<6D>strc <01>:<00><01><00>j<00>|<00><00>}|<01>tdd|<00><02><02><00><00><01>j<00>|<00><00>}||j|j|j|j|j |j
|j |j |r|j nd|r|jnd|r|jndd<04> S)N<><4E><00>Unknown signal: T) r(<00> direction<6F>category<72>
value_type<EFBFBD> modbus_space<63>device<63>slot<6F>point<6E>modbus_addressrBrCrD)r<00>signalrr<00>getrPrQrRrSrTrUrVrWrBrCrD)rK<00>sigrFr s <20>r<00>
get_signalzcreate_app.<locals>.get_signalgs<><00><><00><11>j<EFBFBD><1F><1F> <0B>,<2C>,<2C><03> <0E>;<3B><1F><03>%G<> <0B>%G<>%G<>H<>H<> H<> <0F>L<EFBFBD> <1C> <1C>[<5B> )<29> )<29><01>)<29>!<21>m<EFBFBD>!<21>l<EFBFBD>!<21>n<EFBFBD>!<21>.<2E>!<21>j<EFBFBD>!<21>h<EFBFBD>!<21>i<EFBFBD>!<21>0<>)*<2A>4<>a<EFBFBD>g<EFBFBD>g<EFBFBD><04>)*<2A>4<>a<EFBFBD>g<EFBFBD>g<EFBFBD><04>./<2F>9<>a<EFBFBD>l<EFBFBD>l<EFBFBD>T<EFBFBD> 
<EFBFBD> 
<EFBFBD>
rc<01><00>eZdZUded<dS)<04> create_app.<locals>.WriteRequestz
bool | intrBN)rrrrrrr<00> WriteRequestr]<00>s<00><00><00><00><00><00><00><19><19><19><19><19>rr^z/io/{signal_name}/writezWrite an output signal<61>reqc<01>Z<00><01><00>j<00>|<00><00>}|<02>tdd|<00><02><02><00><00>|jdkrtdd|<00>d<06><03><00><00><01>j<00>|j<00><00>}|<03>tdd|j<00><02><02><00><00>|jd krOt|j <00><00>}|d
ks|d krtdd |<04><00><02><00><00>|<03>
|j |<04><00>}n/t|j <00><00>}|<03> |j |<04><00>}|std d|<00><02><02><00><00>||dd<10>S)NrNrO<00>outputi<74>zSignal z is an input, not writablei<65>zNo driver for device <20>intri<><69>u$Analog value must be 065535, got i<>zWrite failed for T)rXrBr1)rrXrrPr<00>driverrTrRrbrB<00>write_registerrW<00>bool<6F> write_output)rKr_rZrc<00>valr1r s <20>r<00> write_signalz create_app.<locals>.write_signal<61>sL<00><><00><11>j<EFBFBD><1F><1F> <0B>,<2C>,<2C><03> <0E>;<3B><1F><03>%G<> <0B>%G<>%G<>H<>H<> H<> <0E>=<3D>H<EFBFBD> $<24> $<24><1F><03>%X<>{<7B>%X<>%X<>%X<>Y<>Y<> Y<><14><1C>$<24>$<24>S<EFBFBD>Z<EFBFBD>0<>0<><06> <11>><3E><1F><03>%K<>S<EFBFBD>Z<EFBFBD>%K<>%K<>L<>L<> L<> <0E>><3E>U<EFBFBD> "<22> "<22><15>c<EFBFBD>i<EFBFBD>.<2E>.<2E>C<EFBFBD><12>Q<EFBFBD>w<EFBFBD>w<EFBFBD>#<23><05>+<2B>+<2B>#<23>C<EFBFBD>)U<>PS<50>)U<>)U<>V<>V<>V<><17>&<26>&<26>s<EFBFBD>'9<>3<EFBFBD>?<3F>?<3F>B<EFBFBD>B<EFBFBD><16>s<EFBFBD>y<EFBFBD>/<2F>/<2F>C<EFBFBD><17>$<24>$<24>S<EFBFBD>%7<><13>=<3D>=<3D>B<EFBFBD><11> J<01><1F><03>%H<><1B>%H<>%H<>I<>I<> I<>%<25><03>4<EFBFBD>@<40>@<40>@rz/config/signalszAll signal metadata from config<69>
list[dict]c<01>0<00><01>d<01><00>jjD<00><00>S)Nc<01><><00>g|]G}|j|j|j|j|j|j|j|j|j|j |j
d<00> <0B><02>HS)<01> r(rPrQrRrSrTrUrVrW<00> default_state<74> default_valuerl)rErFs r<00>
<listcomp>z:create_app.<locals>.get_config_signals.<locals>.<listcomp><3E>si<00><00>
<EFBFBD>
<EFBFBD>
<EFBFBD><12>#$<24>&<26>"#<23>+<2B>"#<23>*<2A>"#<23>,<2C>"#<23>.<2E>"#<23>(<28>"#<23>&<26>"#<23>'<27>"#<23>"2<>"#<23>/<2F>"#<23>/<2F> <0E> <0E>
<EFBFBD>
<EFBFBD>
r)r<00>
logical_ior<s<00>r<00>get_config_signalsz&create_app.<locals>.get_config_signals<6C>s+<00><><00>
<EFBFBD>
<EFBFBD><19>Z<EFBFBD>*<2A>
<EFBFBD>
<EFBFBD>
<EFBFBD>
rz
/sequenceszList all sequencesc<01>0<00><01>d<01><00>jjD<00><00>S)Nc<01>R<00>g|]$}|j|jt|j<00><00>d<00><03><02>%S)<01>r(r%<00>steps)r(r%<00>lenru)rE<00>seqs rroz6create_app.<locals>.list_sequences.<locals>.<listcomp><3E>s><00><00>
<EFBFBD>
<EFBFBD>
<EFBFBD><13><19>X<EFBFBD>c<EFBFBD>o<EFBFBD><03>C<EFBFBD>I<EFBFBD><0E><0E> W<> W<>
<EFBFBD>
<EFBFBD>
r)r<00> sequencesr<s<00>r<00>list_sequencesz"create_app.<locals>.list_sequences<65>s)<00><><00>
<EFBFBD>
<EFBFBD><1A>z<EFBFBD>+<2B>
<EFBFBD>
<EFBFBD>
<EFBFBD>
rz/sequences/{name}zSequence detailr(c<01><><00><01><00>j<00>|<00><00>}|<01>tdd|<00><02><02><00><00>|j|jd<03>|jD<00><00>d<04>S)NrN<00>Unknown sequence: c <01><><00>g|];}|j|j|j|j|j|j|j|j|jd<00> <09><02><S)<01> <09>t_ms<6D>actionrX<00>state<74>expectedrB<00>expected_value<75> tolerance<63>
timeout_msr})rE<00>steps rroz4create_app.<locals>.get_sequence.<locals>.<listcomp><3E>s_<00><00><0E><0E><0E><19>'+<2B>i<EFBFBD>&*<2A>k<EFBFBD>&*<2A>k<EFBFBD>&*<2A>j<EFBFBD>&*<2A>m<EFBFBD>&*<2A>j<EFBFBD>&*<2A>&9<>&*<2A>n<EFBFBD>&*<2A>o<EFBFBD> <12> <12><0E><0E>rrt)r<00>sequencerr(r%ru)r(rwr s <20>r<00> get_sequencez create_app.<locals>.get_sequence<63>so<00><><00><11>j<EFBFBD>!<21>!<21>$<24>'<27>'<27><03> <0E>;<3B><1F><03>%B<>$<24>%B<>%B<>C<>C<> C<><1E>8<EFBFBD><1E>?<3F><0E><0E> <20>I<EFBFBD><0E><0E><0E>
<EFBFBD>
<EFBFBD>
rz/sequences/{name}/runzStart a sequence<63><65>)r.<00> status_codec<01><00><01><00>j<00>|<00><00><00>tdd|<00><02><02><00><00><01>j<00>|<00><00>\}}|s0<73>j<00><00><00>}tdd|<03>d|<03>d<06><05><00><00>||dd<08>S) NrNr{i<>z!Sequence already running (run_id=z). Poll GET /runs/z for status.<2E>running)<03>run_idr<64>r2)rr<>rr<00>startr;)r(r<><00>started<65>activer s <20>r<00> run_sequencez create_app.<locals>.run_sequence<63>s<><00><><00> <0E>:<3A> <1E> <1E>t<EFBFBD> $<24> $<24> ,<2C><1F><03>%B<>$<24>%B<>%B<>C<>C<> C<><1D>-<2D>-<2D>-<2D>d<EFBFBD>3<>3<><0F><06><07><16> <0E><18>]<5D>0<>0<>2<>2<>F<EFBFBD><1F><13>7<>F<EFBFBD>7<>7<>"(<28>7<>7<>7<><0E><0E> <0E> !<21>d<EFBFBD>i<EFBFBD>H<>H<>Hrz/runs/{run_id}zRun result by IDr<44>c<01><><00><01><00>j<00>|<00><00>}|<01>tdd|<00><02><02><00><00>|<01><00><00>S)NrNzUnknown run_id: )r<00>
get_resultr<00>to_dict)r<><00>resultr s <20>r<00>get_runzcreate_app.<locals>.get_run<75>sF<00><><00><14><1D>)<29>)<29>&<26>1<>1<><06> <11>><3E><1F><03>%B<><06>%B<>%B<>C<>C<> C<><15>~<7E>~<7E><1F><1F>rz/runszRecent run history<72>2<00>limitrbc<01>T<00><01><00>j<00>t|d<01><00><00><00>S)N<><4E>)r<00> recent_runs<6E>min)r<>r s <20>r<00> list_runszcreate_app.<locals>.list_runss!<00><><00><12>}<7D>(<28>(<28><13>U<EFBFBD>C<EFBFBD><1F><1F>9<>9<>9r)r!r/)r!r>)rKrLr!r/)rKrLr_r^r!r/)r!ri)r(rLr!r/)r<>rLr!r/)r<>)r<>rbr!ri) rr<00>__file__<5F>resolve<76>parent<6E>is_dir<69>mountr rLrYr <00>post)r <00>app<70>_web_dirr-r=rJr[r^rhrqryr<>r<>r<>r<>s` r<00>
create_appr<EFBFBD>/sT<00><><00>
<11>0<><17> L<01>  <06> <06> <06>C<EFBFBD><14>H<EFBFBD>~<7E>~<7E>%<25>%<25>'<27>'<27>.<2E>5<><05>=<3D>H<EFBFBD><0F><EFBFBD><EFBFBD><18><18>S<01> <0B> <09> <09>&<26>+<2B><03>H<EFBFBD> <0A> <0A>><3E>><3E>><3E>\<5C> <09>R<>R<>R<><08>W<EFBFBD>W<EFBFBD>S<EFBFBD>E<EFBFBD>W<EFBFBD>*<2A>*<2A>7<>7<>+<2B>*<2A>7<> <09>W<EFBFBD>W<EFBFBD>Y<EFBFBD> I<>W<EFBFBD>J<>J<>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>K<01>J<>
<EFBFBD> <09>W<EFBFBD>W<EFBFBD>U<EFBFBD>/<2F>W<EFBFBD>0<>0<>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>1<>0<>
<EFBFBD> <09>W<EFBFBD>W<EFBFBD> <20>*?<3F>W<EFBFBD>@<40>@<40>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>A<01>@<40>
<EFBFBD>2<1A><1A><1A><1A><1A>y<EFBFBD><1A><1A><1A> <09>X<EFBFBD>X<EFBFBD>'<27>1I<31>X<EFBFBD>J<>J<>A<01>A<01>A<01>A<01>A<01>K<01>J<>A<01>: <09>W<EFBFBD>W<EFBFBD> <1E>(I<>W<EFBFBD>J<>J<>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>K<01>J<>
<EFBFBD>, <09>W<EFBFBD>W<EFBFBD>\<5C>#7<>W<EFBFBD>8<>8<>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>9<>8<>
<EFBFBD> <09>W<EFBFBD>W<EFBFBD> <20>*;<3B>W<EFBFBD><<3C><<3C>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>=<3D><<3C>
<EFBFBD>< <09>X<EFBFBD>X<EFBFBD>%<25>/A<>s<EFBFBD>X<EFBFBD>S<>S<>I<01>I<01>I<01>I<01>I<01>T<01>S<>I<01>( <09>W<EFBFBD>W<EFBFBD> <1D>'9<>W<EFBFBD>:<3A>:<3A> <20> <20> <20> <20> <20>;<3B>:<3A> <20> <09>W<EFBFBD>W<EFBFBD>W<EFBFBD>2<>W<EFBFBD>3<>3<>:<3A>:<3A>:<3A>:<3A>:<3A>:<3A>4<>3<>:<3A> <0F>Jr)r rr!r)r<00>
__future__rr8<00> dataclassesr<00>pathlibr<00>typingr<00>fastapirr<00>fastapi.responsesr r
<00>fastapi.staticfilesr <00>pydanticr rrrr<00> terminator_iorrr<>rrr<00><module>r<>sD<00><01><04><04>(#<23>"<22>"<22>"<22>"<22>"<22> <0B> <0B> <0B> <0B>!<21>!<21>!<21>!<21>!<21>!<21><18><18><18><18><18><18><16><16><16><16><16><16>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A><<3C><<3C><<3C><<3C><<3C><<3C><<3C><<3C>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B><1E><1E><1E><1E><1E><1E> <20> <20> <20> <20> <20> <20>#<23>#<23>#<23>#<23>#<23>#<23>%<25>%<25>%<25>%<25>%<25>%<25> <0B><16><16><16><16><16><16><16> <0B><19><16>X<0F>X<0F>X<0F>X<0F>X<0F>Xr