Files
MiPi_TEST/__pycache__/analyze_captures.cpython-312.pyc

270 lines
28 KiB
Plaintext
Raw Normal View History

2026-04-08 14:19:31 +01:00
<EFBFBD>
2026-04-09 11:30:22 +01:00
<00>}<7D>i4j<00><00>h<00>dZddlZddlZddlZddlmZddlmZddlZddlm Z e ee
2026-04-09 11:03:35 +01:00
<EFBFBD>jdz <00>ddl m Z mZmZmZmZmZmZmZmZee
<EFBFBD>jdz Zee
<EFBFBD>jd z Zd
2026-04-09 11:30:22 +01:00
d d d ddddddddddd<18>d<19> ZdZdZee
<EFBFBD>jd z dz Zdededeeeffd <20>Zd!e d"ed#d$ddfd%<25>Z! d6d!e d"ed&e"e efd'e#dee eed$ed(ff
d)<29>Z$ d7d*ee ded+ed,ede f
d-<2D>Z% d8d.e d/e deded+ed,ed0edefd1<64>Z&d9d2eddfd3<64>Z'd:d4<64>Z(e)d5k(re(<28>yy);a<>
2026-04-08 14:19:31 +01:00
analyze_captures.py
Groups MIPI oscilloscope CSV files by capture, runs csv_preprocessor on each,
then sends the compact summaries to the Claude API for trend analysis.
Usage:
python analyze_captures.py # all captures in ./data
python analyze_captures.py --last N # most recent N captures only
python analyze_captures.py --capture 0001 # single capture by number
2026-04-09 11:30:22 +01:00
<EFBFBD>N)<01>datetime)<01>Path)<01> load_dotenvz.env) <09> analyze_file<6C>analyze_lp_file<6C>analyze_1v8_file<6C>analyze_reg_file<6C>group_captures<65>ChannelMetrics<63> LPMetrics<63> V1V8Metrics<63>RegDump<6D>data<74>reportsz@NXP i.MX 8M Mini (Samsung DSIM IP, sec-dsim/samsung-dsim driver)z*Texas Instruments SN65DSI83 (MIPI-to-LVDS)<29>H<00>zRGB888 (24 bpp)<29><>i<>g<><67>Q<EFBFBD><1E>@<40>6g<>S㥛<53>2@g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?uJ0x00000306 (TLPX=3→55.6ns ≥50ns ✓, THS_EXIT=6→111ns ≥100ns ✓)u<>0x03110A04 (TCLK_PREPARE=3→55.6ns, TCLK_ZERO=17→315ns ≥300ns ✓, TCLK_POST=10→185ns ≥180ns ✓, TCLK_TRAIL=4→74ns ≥60ns ✓)uw0x00040A03 (THS_TRAIL=4→74ns ≥69ns ✓, THS_ZERO=10→185ns ≥168ns ✓, THS_PREPARE=3→56ns within 49-99ns ✓))zPHYTIMING (0xb4)zPHYTIMING1 (0xb8)zPHYTIMING2 (0xbc)) <0C>dsi_host<73>
dsi_bridge<EFBFBD>pixel_clock_mhz<68> dsi_lanes<65> color_format<61> dsi_clock_mhz<68>hs_bit_rate_mbps<70>hs_ui_ns<6E>byte_clock_mhz<68>byte_period_ns<6E>vddio_v<5F>dsim_phytiming_targetzclaude-opus-4-6u<36>You are an expert in MIPI D-PHY signal integrity analysis. You will be given compact pre-processed summaries of oscilloscope captures from a MIPI CLK and DAT0 differential pair, plus 1.8 V supply rail measurements and DSI controller register snapshots (Samsung DSIM IP on NXP i.MX 8M Mini). The MIPI PHY drives LP states from the 1.8 V VDDIO. Each capture has up to five data sets: sig (high-res HS quality), proto (long-window HS stats), lp (single-ended LP-11/LP-00/HS burst including SoT sequence), pwr (1.8 V supply captured during the LP→HS transition), and reg (DSIM register snapshot — DSIM_PHYTIMING at 0x32e100b4, DSIM_PHYTIMING1 at 0xb8, DSIM_PHYTIMING2 at 0xbc control LP/HS state durations; timing fields are in byte-clock units where 1 unit = 18.518 ns at 432 Mbit/s). Analyse the data for trends, degradation, anomalies, or consistent spec concerns across captures. Correlate register field values with observed LP timing violations. Be concise and actionable.zflicker_log.csv<73>keys<79>flicker_suspects<74>returnc<00><><00>|s dt|<00>fS|D<00>chc]}|j<00><02>}}t|<03>t|<00>fScc}w)u<>
2026-04-09 11:03:35 +01:00
Count flicker events (display sessions that flickered) vs total sessions in this batch.
Each test iteration is one complete display load/unload session. Flicker is
per-session: it occurs at pipeline load, persists for that session only, then
clears automatically on the next load. A single suspect capture IS a genuine
flicker event — not a measurement artifact — because the LP pass fires at startup.
Returns (flicker_sessions, total_sessions).
2026-04-09 11:30:22 +01:00
r)<02>len<65> capture_num)r!r"<00>m<>suspect_sessionss <20>5/home/david-rice/Python/MiPi_Test/analyze_captures.py<70>_classify_flickerr*vsK<00><00> <1C><10>#<23>d<EFBFBD>)<29>|<7C><1B>0@<01>@<40>!<21><01> <0A> <0A>@<40><14>@<40> <0E><1F> <20>#<23>d<EFBFBD>)<29> +<2B>+<2B><>As<00>?<04>ts<74>numr'r c
2026-04-09 11:03:35 +01:00
<00><><00>tjjd<01><02>tj<00> }t tddd<05><06>5}ddl}|j |<04>}|r|jgd <09><01>|jtj<00>jd
<EFBFBD>||d <0B>|j|j|j|jg<07>ddd<08>y#1swYyxYw) z=Append a flicker suspect entry to the persistent flicker log.T<><01>exist_ok<6F>a<><00>utf-8)<02>newline<6E>encodingrN)<07> logged_at<61>
2026-04-09 11:30:22 +01:00
capture_tsr&<00>channel<65>lp_low_duration_ns<6E> lp11_to_hs_ns<6E>lp11_voltage_v<5F>%Y-%m-%d %H:%M:%S<>04d)<0F> FLICKER_LOG<4F>parent<6E>mkdir<69>exists<74>open<65>csv<73>writer<65>writerowr<00>now<6F>strftimer7r8r9r:)r+r,r'<00> write_header<65>f<>_csv<73>ws r)<00>_log_flicker_eventrK<00>s<><00><00><0F><16><16><1C><1C>d<EFBFBD><1C>+<2B>"<22>)<29>)<29>+<2B>+<2B>L<EFBFBD> <0A>k<EFBFBD>3<EFBFBD><02>W<EFBFBD> =<3D>
2026-04-09 11:03:35 +01:00
 <0B><11><1A> <10>K<EFBFBD>K<EFBFBD><01>N<EFBFBD><01> <17> <0A>J<EFBFBD>J<EFBFBD>Q<01> R<01> <09>
<EFBFBD>
<EFBFBD> <14>L<EFBFBD>L<EFBFBD>N<EFBFBD> #<23> #<23>$7<> 8<> <0E>3<EFBFBD>s<EFBFBD>)<29>a<EFBFBD>i<EFBFBD>i<EFBFBD> <0A> <20> <20>!<21>/<2F>/<2F>1<EFBFBD>3C<33>3C<33>
<EFBFBD> <0B>
 <0B>
 <0B>
 <0B>s <00> BC <03> C)<07>files<65>verboserc
<00><><00>d|d<02>d|<00>d<04>g}g}g}g}dD<00>]p}||vrL|dk(r|jd|<08>d<08><03>n0|d k(r|jd|<08>d
<EFBFBD><03>n|jd|<08>d <0B><03><00>T |jd <0C>rt||<00>} n6|dk(rt||<00>} n"|d k(rt ||<00>} nt ||<00>} |j| j <00><00>|j| <09>|rt| j <00><00>t| t<00>rJ| jr>|j| <09>t||| <09>td |d<02>d|<00>d| j<00>d<10><07>t| t<00>r|j| <09><00><01>sdj|<04>|||fS#t$r"}
|jd|<08>d|
<EFBFBD><00><04>Yd}
~
<EFBFBD><01><>d}
~
wwxYw)z<>
2026-04-08 14:19:31 +01:00
Run the pre-processor on all CSV files for one capture.
2026-04-09 11:03:35 +01:00
Returns (text_summary, metrics_list, flicker_suspects, reg_dumps).
2026-04-08 14:19:31 +01:00
Missing files produce a one-line note instead of crashing.
2026-04-09 11:30:22 +01:00
z === Capture r<<00> z ===)<08> proto_clk<6C> proto_dat<61>sig_clk<6C>sig_dat<61>lp_clk<6C>lp_dat<61>pwr_1v8<76>regrVz [z0] NOT CAPTURED (Rigol not connected or no droop)rWz4] NOT CAPTURED (device unreachable or memtool error)z ] MISSING<4E>lp_z
2026-04-09 11:03:35 +01:00
*** FLICKER SUSPECT: capture <20> [z ] lp_low=z ns ***
z ] ERROR: N<>
)<10>append<6E>
startswithrrr r<00>summary<72>print<6E>
2026-04-09 11:30:22 +01:00
isinstancer <00>flicker_suspectrKr8r<00> Exception<6F>join) r+r,rLrM<00>lines<65> metrics_listr"<00> reg_dumps<70>keyr'<00>excs r)<00>process_capturerh<00>s<><00><00><1C>C<EFBFBD><03>9<EFBFBD>B<EFBFBD>r<EFBFBD>d<EFBFBD>$<24> /<2F> 0<>E<EFBFBD>MO<4D>L<EFBFBD>(*<2A><14>!<21>I<EFBFBD>"<22> 4<><03> <0E>e<EFBFBD> <1B><12>i<EFBFBD><1F><15> <0C> <0C>s<EFBFBD>3<EFBFBD>%<25>'W<>X<>Y<><14><05><1C><15> <0C> <0C>s<EFBFBD>3<EFBFBD>%<25>'[<5B>\<5C>]<5D><15> <0C> <0C>s<EFBFBD>3<EFBFBD>%<25>y<EFBFBD>1<>2<> <14> 4<><12>~<7E>~<7E>e<EFBFBD>$<24>#<23>E<EFBFBD>#<23>J<EFBFBD>/<2F><01><14> <09>!<21>$<24>U<EFBFBD>3<EFBFBD>Z<EFBFBD>0<><01><14><05><1C>$<24>U<EFBFBD>3<EFBFBD>Z<EFBFBD>0<><01> <20><15>s<EFBFBD><1A>,<2C><01> <11>L<EFBFBD>L<EFBFBD><11><19><19><1B> %<25> <18> <1F> <1F><01> "<22><16><15>a<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>"<22><19>!<21>Y<EFBFBD>'<27>A<EFBFBD>,=<3D>,=<3D> <20>'<27>'<27><01>*<2A>"<22>2<EFBFBD>s<EFBFBD>A<EFBFBD>.<2E><15>9<>#<23>c<EFBFBD><19>"<22>R<EFBFBD>D<EFBFBD>I <20> !<21> 4<> 4<>5<>Y<EFBFBD>@<01>A<01><19>!<21>W<EFBFBD>%<25><19> <20> <20><11>#<23><>= 4<>D <10>9<EFBFBD>9<EFBFBD>U<EFBFBD> <1B>\<5C>+;<3B>Y<EFBFBD> F<>F<><46><19> 4<> <11>L<EFBFBD>L<EFBFBD>3<EFBFBD>s<EFBFBD>e<EFBFBD>9<EFBFBD>S<EFBFBD>E<EFBFBD>2<> 3<> 3<><33> 4<>s<00>)DF<02> G<05>&G<05>G<05> all_summaries<65> flicker_count<6E>total_sessionsc<00><><00>t}|d}d|d<00>d|d<00>d|d<00>d|d <00>d
|d <00>d |d <00>d|d<00>d|dd<12>d|d<00>d|dd<12>d|d<00>d<19>djd<1B>|j<00>D<00><00>z}dj|<00>}d}|r8|dkDr3djd<1F>|D<00><00>} |<02>d |<03>d!d"|z|z d#<23>d$<24>}
d%|
<EFBFBD>d&| <09>d'<27>}d(|<06>d|<08>d|<07>d)<29>S)*Nr z&Device under test:
DSI host: rz
DSI bridge: rz
Pixel clock: rz MHz
DSI lanes: rz data lanes
Color format: rz
DSI clock: rug MHz (= 3 × pixel clock; fixed by 24bpp/4lanes/DDR — not independently tunable)
HS bit rate: ru= Mbit/s per lane (= DSI clock × 2, DDR)
HS UI: rz.3fz ns
Byte clock: rz MHz (rz ns/byte)
VDDIO: rzU V
Target DSIM PHY timing registers (byte-clock units, MIPI D-PHY v1.1 compliant):
rZc3<00>2K<00>|]\}}d|<01>d|<02><00><04><01><00>y<02>w)z z: N<>)<03>.0<EFBFBD>k<>vs r)<00> <genexpr>zbuild_prompt.<locals>.<genexpr><3E>s <00><00><><00>?<3F><04><01>1<EFBFBD>d<EFBFBD>1<EFBFBD>#<23>R<EFBFBD><01>s<EFBFBD>O<EFBFBD>?<3F>s<00>z
2026-04-08 14:19:31 +01:00
2026-04-09 11:30:22 +01:00
r1rc3<00><>K<00>|]V}d|jd<01>d|j<00>d|j<00>d|j<00>d|j<00>d|j
<00>d<07> <0A><01><00>Xy<08>w) z - Capture r<rYz
] channel=z lp_low=z ns lp11_to_hs=z ns lp11_v=z VN<56>r&<00> timestampr7r8r9r:<00>ror's r)rrzbuild_prompt.<locals>.<genexpr><3E>sp<00><00><><00>
2026-04-09 11:03:35 +01:00
<EFBFBD><12><1B>1<EFBFBD>=<3D>=<3D><13>-<2D>R<EFBFBD><01> <0B> <0B>}<7D>J<EFBFBD>q<EFBFBD>y<EFBFBD>y<EFBFBD>k<EFBFBD>R<16><17>*<2A>*<2A>+<2B>+;<3B>A<EFBFBD>O<EFBFBD>O<EFBFBD>;L<>M<16><17>&<26>&<26>'<27>r<EFBFBD> +<2B>
<EFBFBD><EFBFBD><00>AA<01>/<2F> display load sessions (<28>d<00>.0f<EFBFBD>%)u
ALERT — FLICKER DETECTED: z; produced screen flicker in this batch.
Affected captures:
a<EFBFBD>
Each capture is one complete display pipeline load/unload cycle. Flicker is per-session: it occurs at pipeline load and persists for that session only, then clears automatically on the next load. A flagged capture therefore represents a genuine flicker event, not a measurement artifact.
LP-low plateau < 50 ns means the LP-01/LP-00 SoT states are absent or too brief for the SN65DSI83 MIPI/LVDS bridge to detect start-of-transmission, causing it to drop a frame and produce visible flicker.
Focus your analysis on WHY the SoT sequence is being violated at pipeline startup and what register setting, supply condition, or hardware change would prevent it.
2026-04-09 11:30:22 +01:00
u<EFBFBD>Below are pre-processed summaries of MIPI D-PHY captures from a Digi ConnectCore 8M Mini SOM (NXP i.MX 8M Mini) driving a SN65DSI83 MIPI-to-LVDS bridge.
Flicker behaviour (confirmed by observation):
- The system is BISTABLE at initialisation. The state is determined entirely at
pipeline load (LP→HS SoT sequence) and does not change during a session.
- State A (good): SoT succeeds → bridge locks → display runs indefinitely, perfectly stable, no flicker.
- State B (bad): SoT fails → bridge stuck → flickers indefinitely until the
display pipeline is unloaded and reloaded (no other recovery).
- After a reset the system is almost always in State A — good state is strongly
preferred but State B occurs intermittently at pipeline load.
- Nothing ongoing (supply noise, EMI, temperature drift) causes or ends flicker;
the root cause is non-deterministic and acts only at the LP→HS SoT moment.
- The LP pass captures the very first SoT transition at pipeline startup.
Any LP timing anomaly in these captures is a genuine flicker event, not noise.
Each capture has up to five data sets per lane (CLK and DAT0):
2026-04-08 14:19:31 +01:00
sig — high-res HS differential (rise/fall times)
proto — long-window HS differential (jitter, clock freq, amplitude)
2026-04-09 11:03:35 +01:00
lp — single-ended LP state capture at pipeline startup (LP-11, SoT sequence, HS bursts)
2026-04-09 08:45:57 +01:00
pwr — 1.8 V supply rail captured during LP→HS transition (droop, ripple, spec)
2026-04-09 11:22:46 +01:00
reg — DSIM PHY timing register snapshot from running device
2026-04-09 11:03:35 +01:00
uw
2026-04-08 14:19:31 +01:00
Please:
1. Identify any consistent spec concerns (HS voltage, LP-11 voltage, LP-low timing).
2026-04-09 08:45:57 +01:00
2. Highlight any trends over captures (amplitude drift, jitter, LP-11 voltage, 1.8 V droop, etc.).
2026-04-08 14:19:31 +01:00
3. Flag anomalies — missing LP transitions, short LP-low, unexpected burst counts.
2026-04-09 08:45:57 +01:00
4. Correlate 1.8 V supply droop/ripple with MIPI LP anomalies — does droop depth or ripple correlate with SoT timing violations, short LP-low plateaux, or LP-11 voltage drops? If pwr data is absent, note that supply correlation could not be assessed.
5. For any ERROR or WARNING lines in the summaries, explain the most likely cause (e.g. missing file, bad trigger, signal absent, probe issue, supply marginal) and what to check.
6. Provide specific, actionable recommendations to address all identified issues and anomalies.
2026-04-09 11:30:22 +01:00
7. Summarise overall signal health and flicker risk in 23 sentences.)<03> DEVICE_CONFIGrb<00>items) rir"rjrk<00>cfg<66>target<65>config_section<6F>body<64>flicker_sectionr~<00>rates r)<00> build_promptr<74><00>s<><00><00>
<17>C<EFBFBD> <10>(<28> )<29>F<EFBFBD> <1E>!<21>*<2A>o<EFBFBD>.<2E>/<1E>!<21>,<2C>/<2F>0<>1<1E>!<21>"3<>4<>5<>6<1E>!<21>+<2B>.<2E>/<2F>0<1E>!<21>.<2E>1<>2<>3<1E>!<21>/<2F>2<>3<>4<1E>!<21>"4<>5<>6<>7<1E>!<21>*<2A>o<EFBFBD>c<EFBFBD>2<>3<1E>!<21>"2<>3<>4<>F<EFBFBD>3<EFBFBD>?O<>;P<>QT<51>:U<>V<1E>!<21>)<29>n<EFBFBD>-<2D>.^<01> _<01> <0F>)<29>)<29>?<3F><06> <0C> <0C><0E>?<3F>
?<3F> @<01><13>$ <12>;<3B>;<3B>}<7D> %<25>D<EFBFBD><18>O<EFBFBD><17>M<EFBFBD>A<EFBFBD>-<2D><14> <09> <09>
2026-04-09 11:03:35 +01:00
<EFBFBD>&<26> 
<EFBFBD>
<EFBFBD><05>  <20><1F><01>.<2E>!1<>1I<31>#<23>m<EFBFBD>J[<5B>\j<>Jj<4A>kn<6B>Io<49>oq<6F>r<><04>.<2E>t<EFBFBD>f<EFBFBD>5#<23>#(<28>'<27> *b<01>
2026-04-09 11:30:22 +01:00
b<01> <18> <0A>*<1C> <1C>B<EFBFBD> <1A>
<1B>2<EFBFBD> <0F>&<26> R<01>/" R<01>$<06><00>analysis<69>
2026-04-09 11:03:35 +01:00
token_line<EFBFBD> all_reg_dumpsc<00>6<00><1A><1B>tjd<01><02>tj<00>}|j d<03>}t|z } t |<02>dk(r d|ddd<07><04>nd|ddd<07>d |d
dd<07><04>}
|j d <0B>} d t d t fd<0E>} | |<00>} d}|r>|dkDr9|rd|z|z nd}|<04>d|<05>d|d<13>d<14>}djd<15>|D<00><00>}d|<10>d|<11>d<18>}d}|r<>g}i<00>|D]G}|jD]6}|d<00>vs<01> |j|d<00>|jdd<0F><00>|d<<00>8<00>I|r<>dj<00>fd<1B>|D<00><00>}d}|D]a}|jD<00>cic] }|d|d<00><02> c}<15>dj<00>fd<1D>|D<00><00>}|d|jd<07>d|j<00>d |<18>d!<21>z }<17>cd"t |<06><00>d#|<16>d$|<17>d%<25>}d&|
<EFBFBD>d'|<0E>d(|<12>d)| <0B>d*|
2026-04-09 11:30:22 +01:00
<EFBFBD>d+t<00>d,| <0A>d-tj|<01><00>d.<2E>}| j!|d/<2F>0<EFBFBD>| Scc}w)1z:Write a timestamped HTML report to the reports/ directory.Tr.z%Y%m%d_%H%M%S_analysis.html<6D><00>Capture rr<z Captures u<><E28093><EFBFBD><EFBFBD><EFBFBD>r;<00>textr#c
2026-04-08 15:42:51 +01:00
<00><<00>tj|<00>}ddl}|jdd|<01>}|j d|<01>}g}|D]<5D>}|j <00>j <00>}|s<01>$|dj<00>jd<05>r\djd<07>|D<00><00>}|dj<00>dj<00>rdnd }|jd
2026-04-09 11:30:22 +01:00
|<08>d |<07>d |<08>d <0B><07><00><>|jd dj|<06>zdz<00><00><>dj|<04>S)Nrz \*\*(.+?)\*\*z<strong>\1</strong>z\n{2,})z1.z2.z3.<2E>-<2D>*r1c3<00>hK<00>|]*}|j<00>s<01>d|jd<01><00>d<02><03><01><00>,y<03>w)z<li>z0123456789.-* z</li>N)<02>strip<69>lstrip)ro<00>ls r)rrz9save_html_report.<locals>.text_to_html.<locals>.<genexpr>Fs0<00><00><><00>e<>Q<EFBFBD>[\<5C>[b<>[b<>[d<>$<24>q<EFBFBD>x<EFBFBD>x<EFBFBD>0@<40>'A<>&B<>%<25> H<>e<>s<00>2<01>2<01>ol<6F>ul<75><<3C>>z</z<p>z<br>z</p>rZ) <0C>html<6D>escape<70>re<72>sub<75>splitr<74><00>
splitlinesr<EFBFBD>r\rb<00>isdigitr[) r<><00>escapedr<64><00>
paragraphs<EFBFBD>parts<74>pararcr~<00>tags r)<00> text_to_htmlz&save_html_report.<locals>.text_to_html8s <00><00><16>+<2B>+<2B>d<EFBFBD>#<23><07><11><14>&<26>&<26>)<29>+A<>7<EFBFBD>K<><07><17>X<EFBFBD>X<EFBFBD>i<EFBFBD><17>1<>
2026-04-08 15:42:51 +01:00
<EFBFBD><12><05><1E>
B<01>D<EFBFBD><18>J<EFBFBD>J<EFBFBD>L<EFBFBD>+<2B>+<2B>-<2D>E<EFBFBD><18><18><14>Q<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD> <20>+<2B>+<2B>,H<>I<><1A><07><07>e<>RW<52>e<>e<><05>#<23>A<EFBFBD>h<EFBFBD>o<EFBFBD>o<EFBFBD>/<2F><01>2<>:<3A>:<3A><<3C>d<EFBFBD>$<24><03><15> <0C> <0C>q<EFBFBD><13><05>Q<EFBFBD>u<EFBFBD>g<EFBFBD>R<EFBFBD><03>u<EFBFBD>A<EFBFBD>6<>7<><15> <0C> <0C>U<EFBFBD>V<EFBFBD>[<5B>[<5B><15>%7<>7<>&<26>@<40>A<>
2026-04-09 11:30:22 +01:00
B<01><14>y<EFBFBD>y<EFBFBD><15><1F>r<>r1rzz of ryr{r|c3<00><>K<00>|]V}d|jd<01>d|j<00>d|j<00>d|j<00>d|j<00>d|j
<00>d<05> <0A><01><00>Xy<06>w)<07><tr><td>r<<00> </td><td>z</td><td style='color:red'>z ns</td><td>z V</td></tr>Nrtrvs r)rrz#save_html_report.<locals>.<genexpr>Sso<00><00><><00>
2026-04-09 11:03:35 +01:00
<EFBFBD><12><17>q<EFBFBD>}<7D>}<7D>S<EFBFBD>)<29><19>1<EFBFBD>;<3B>;<3B>-<2D>y<EFBFBD><11><19><19> <0B>T%<25>%&<26>%9<>%9<>$:<3A>;<13><14>?<3F>?<3F>#<23><<3C><01>0@<40>0@<40>/A<><1C> O<01>
2026-04-09 11:30:22 +01:00
<EFBFBD>rwz<>
2026-04-09 11:03:35 +01:00
<div style="background:#fff3cd;border:2px solid #e65100;border-radius:6px;
padding:16px 20px;margin-bottom:28px;">
<h2 style="color:#e65100;margin-top:0">&#9888; FLICKER DETECTED &mdash; uB flickered</h2>
<p>Each flagged capture is a genuine flicker event (not an artifact) — the LP pass fires at
pipeline startup, so a missing or sub-50&nbsp;ns LP-low plateau means the SN65DSI83 bridge
missed the SoT sequence and dropped a frame.<br>
LP-low plateau &lt; 50&nbsp;ns means the LP-01/LP-00 SoT states are absent or too brief
for the SN65DSI83 bridge to detect start-of-transmission.</p>
<table>
<tr><th>Capture</th><th>Timestamp</th><th>Channel</th>
<th>LP-low plateau</th><th>LP exit&rarr;HS</th><th>LP-11 voltage</th></tr>
z
</table>
2026-04-09 11:30:22 +01:00
</div><3E>address<73>namec3<00><><00>K<00>|]6}dtj|<01><00>dtj<00>|<00><00>d<02><05><01><00>8y<03>w)z<th>z <br><small>z </small></th>N)r<>r<>)ro<00>addr<64>
addr_namess <20>r)rrz#save_html_report.<locals>.<genexpr>vsB<00><><00><><00>#<0E><18><17>t<EFBFBD>{<7B>{<7B>4<EFBFBD>(<28>)<29><1B>T<EFBFBD>[<5B>[<5B><1A>D<EFBFBD>AQ<41>5R<35>4S<34>S`<60>a<>#<0E>s<00><?<01>valuec3<00>p<00>K<00>|]-}dtj<00>j|d<01><00><00>d<02><03><01><00>/y<03>w)z<td>u<></td>N)r<>r<><00>get)ror<><00>reg_maps <20>r)rrz#save_html_report.<locals>.<genexpr>}s7<00><><00><><00> <12><1C><1B>4<EFBFBD>;<3B>;<3B>w<EFBFBD>{<7B>{<7B>4<EFBFBD><15>'?<3F>@<40>A<><15>G<> <12>s<00>36r<>r<>r<>z</tr>z<>
2026-04-09 11:03:35 +01:00
<details style="margin-bottom:24px;">
<summary style="cursor:pointer;font-weight:bold;color:#1a3a5c;font-size:1.05em;">
DSI Register Snapshots (z| captures)
</summary>
<div style="overflow-x:auto;margin-top:8px;">
<table>
<tr><th>Capture</th><th>Timestamp</th>z
</tr>
z
</table>
</div>
</details>uX<!DOCTYPE html>
2026-04-08 15:42:51 +01:00
<html lang="en">
<head>
<meta charset="UTF-8">
2026-04-09 11:03:35 +01:00
<title>MIPI Analysis — a<></title>
2026-04-08 15:42:51 +01:00
<style>
body { font-family: Arial, sans-serif; max-width: 900px; margin: 40px auto; padding: 0 20px; color: #222; }
h1 { color: #1a3a5c; border-bottom: 2px solid #1a3a5c; padding-bottom: 8px; }
.meta { color: #555; font-size: 0.95em; margin-top: -8px; margin-bottom: 24px; }
p { line-height: 1.6; }
ol, ul { line-height: 1.8; padding-left: 24px; }
li { margin: 4px 0; }
.tokens { color: #888; font-size: 0.8em; margin-top: 32px; border-top: 1px solid #ddd; padding-top: 8px; }
2026-04-09 11:03:35 +01:00
.flicker-alert { background: #fff3cd; border: 2px solid #e65100; border-radius: 6px;
padding: 16px 20px; margin-bottom: 28px; }
.flicker-alert h2 { color: #e65100; margin-top: 0; }
.flicker-alert table { border-collapse: collapse; width: 100%; margin-top: 10px; }
.flicker-alert th { background: #e65100; color: white; padding: 6px 10px; text-align: left; }
.flicker-alert td { border: 1px solid #ccc; padding: 5px 10px; }
table { border-collapse: collapse; width: 100%; }
th { background: #1a3a5c; color: white; padding: 6px 10px; text-align: left; }
td { border: 1px solid #ddd; padding: 5px 10px; }
2026-04-08 15:42:51 +01:00
@media print { body { margin: 20px; } }
</style>
</head>
<body>
<h1>MIPI D-PHY Analysis Report</h1>
2026-04-09 11:30:22 +01:00
rZz0
2026-04-08 15:42:51 +01:00
<p class="meta">
<strong>Generated:</strong> z) &nbsp;|&nbsp;
<strong>Scope:</strong> z) &nbsp;|&nbsp;
<strong>Model:</strong> z
</p>
z
<p class="tokens">z</p>
</body>
</html>
2026-04-09 11:30:22 +01:00
r2)r4)<11> REPORTS_DIRr?rrErFr%<00>strrb<00> registersr[r<>r&ru<00> CLAUDE_MODELr<4C>r<><00>
write_text)r<>r<>r!r"rjrkr<>rE<00>filename<6D>path<74> cap_range<67>date_strr<72><00> body_html<6D>flicker_banner<65>rate_pct<63>rate_str<74>rows<77> reg_section<6F>
addr_order<EFBFBD>rd<72>r<> header_cells<6C> rows_html<6D>cells<6C> html_contentr<74>r<>s @@r)<00>save_html_reportr<74>%s<00><><00> <10><15><15>t<EFBFBD><15>$<24>
2026-04-08 15:42:51 +01:00
<12>,<2C>,<2C>.<2E>C<EFBFBD><12>|<7C>|<7C>9<>:<3A>H<EFBFBD> <16><18> !<21>D<EFBFBD> <0F>t<EFBFBD>9<EFBFBD><01>><3E> <13>4<EFBFBD><01>7<EFBFBD>1<EFBFBD>:<3A>c<EFBFBD>"<22>#<23><18><14>a<EFBFBD><17><11><1A>C<EFBFBD>(<28><03>D<EFBFBD><12>H<EFBFBD>Q<EFBFBD>K<EFBFBD><03>+<<3C> =<3D><0E>
2026-04-09 11:03:35 +01:00
<13>|<7C>|<7C>/<2F>0<>H<EFBFBD> <20>3<EFBFBD> <20>3<EFBFBD> <20>*<1D>X<EFBFBD>&<26>I<EFBFBD><17>N<EFBFBD><17>M<EFBFBD>A<EFBFBD>-<2D>;I<>3<EFBFBD><1D>&<26><1E>7<>q<EFBFBD><08>#<23>_<EFBFBD>D<EFBFBD><1E>(8<>8P<38>QY<51>Z]<5D>P^<5E>^`<60>a<><08><11>w<EFBFBD>w<EFBFBD>
<EFBFBD>&<26> 
<EFBFBD>
<EFBFBD><04> K<01>LT<01>*<2A> U<05>
<EFBFBD>F<EFBFBD> <07>
<EFBFBD><0E>"<15>K<EFBFBD><14><17>
<EFBFBD><17>
<EFBFBD><1F> A<01>B<EFBFBD><17>\<5C>\<5C> A<01><01><14>Y<EFBFBD><<3C>z<EFBFBD>1<><1E>%<25>%<25>a<EFBFBD> <09>l<EFBFBD>3<>/0<>u<EFBFBD>u<EFBFBD>V<EFBFBD>R<EFBFBD>/@<40>J<EFBFBD>q<EFBFBD><19>|<7C>,<2C> A<01> A<01> <16><1D>7<EFBFBD>7<EFBFBD>#<0E>&<26>#<0E><0E>L<EFBFBD><1B>I<EFBFBD>#<23> e<01><02>=?<3F>\<5C>\<5C>J<><01>1<EFBFBD>Y<EFBFBD><<3C><11>7<EFBFBD><1A>3<>J<><07><1A><07><07> <12> *<2A> <12><12><05><1A>x<EFBFBD><02><0E><0E>s<EFBFBD>';<3B>9<EFBFBD>R<EFBFBD>\<5C>\<5C>N<EFBFBD>RW<52>X]<5D>W^<5E>^c<>d<>d<> <09>  e<01><1D>!<21><1D>/<2F>0<>1+<2B>,8<>.<2E>9<05><0E>K<EFBFBD> <0B> <0E>K<EFBFBD><1A>$<24><1B>%<01>.<10><10><01> <0C> <0A><1F>'<27>j<EFBFBD>)<1B>$<24>+<2B>&<1B>'<27>.<2E>)<01>
<EFBFBD> <0B> <13><17>;<3B>;<3B>z<EFBFBD>*<2A>+<2B>,<01>G&<04>L<EFBFBD>N <09>O<EFBFBD>O<EFBFBD>L<EFBFBD>7<EFBFBD>O<EFBFBD>3<> <0F>K<EFBFBD><4B>yKs<00>'H<06>lastc <00> <00>tt<00>}|s td<01>yt|j <00><00>| d}tdt |<02><00>d<04><03>g}g}g}|D]O\}}t |||||f<00>\}} }
} |j|<08>|j|
<EFBFBD>|j| <0B><00>Qt||<04>\} } t||| | <0A>}tdt |<0E>d<06>dt<00>d<08><05>tj<00>}|jjtd t d
|d <0B>g<01> <0C>}|j"d j$}d|j&j(<00>d|j&j*<00>d<10>}d}td|<13><00><02>td<13>t|<13>t|<11>td|<12>d<15><03>t|dz<00>t-||||| | |<05>}td|<14><00><02>| d kDr*| rd| z| z nd }td| <0C>d| <0A>d|d<1B>dt.<00>d<1D> <09>yy)z<>
2026-04-08 14:19:31 +01:00
Called by mgmt_worker after each file transfer.
Analyses the most recent `last` captures and prints the Claude report.
z[ANALYSIS] No captures found.Nz
[ANALYSIS] Processing z most-recent capture(s)...z[ANALYSIS] Sending <20>,z
2026-04-09 11:03:35 +01:00
chars to z...<2E><00>user<65><02>role<6C>content<6E><04>model<65>
2026-04-09 11:30:22 +01:00
max_tokens<EFBFBD>system<65>messagesr<00>Tokens: <20> in / <20> out<75><============================================================rZzCLAUDE ANALYSIS<49>(<28>)zNALYSIS] Report saved to rzu$[ANALYSIS] *** FLICKER DETECTED — rx<00> sessions (r{u%) — logged to <20> ***)r
<00>DATA_DIRr^<00>sortedr!r%rhr[<00>extendr*r<>r<><00> anthropic<69> Anthropicr<63><00>create<74> SYSTEM_PROMPTr<54>r<><00>usage<67> input_tokens<6E> output_tokensr<73>r=)r<><00>groupsr!ri<00>all_flicker_suspectsr<73>r+r,<00> summary_text<78>_<>suspectsrerjrk<00>prompt<70>client<6E>messager<65>r<><00> separator<6F> report_pathr<68>s r)<00> run_analysisr<73><00>sH<00><00>
2026-04-08 14:19:31 +01:00
<1C>H<EFBFBD> %<25>F<EFBFBD> <11> <0A>-<2D>.<2E><0E> <11>&<26>+<2B>+<2B>-<2D> <20>$<24><15><16> (<28>D<EFBFBD> <09> $<24>S<EFBFBD><14>Y<EFBFBD>K<EFBFBD>/I<>
2026-04-09 11:03:35 +01:00
J<EFBFBD>K<>!<21>M<EFBFBD>,.<2E><18>#%<25>M<EFBFBD><17>(<28><07><02>C<EFBFBD>/><3E>r<EFBFBD>3<EFBFBD><06>PR<50>TW<54>y<EFBFBD>HY<48>/Z<>,<2C> <0C>a<EFBFBD><18>9<EFBFBD><15><1C><1C>\<5C>*<2A><1C>#<23>#<23>H<EFBFBD>-<2D><15><1C><1C>Y<EFBFBD>'<27> (<28> %6<>d<EFBFBD><P<>$Q<>!<21>M<EFBFBD>><3E> <19>-<2D>)=<3D>}<7D>n<EFBFBD> ]<5D>F<EFBFBD> <09> <1F><03>F<EFBFBD> <0B>A<EFBFBD><EFBFBD>j<EFBFBD><1C><0E>c<EFBFBD>
2026-04-08 15:42:51 +01:00
J<EFBFBD>K<><17>!<21>!<21>#<23>F<EFBFBD><14>o<EFBFBD>o<EFBFBD>$<24>$<24>!<21><19>"<22>%<25>&<26>9<>:<3A> %<25><06>G<EFBFBD> <19><1F><1F><11>#<23>(<28>(<28>H<EFBFBD><1B>G<EFBFBD>M<EFBFBD>M<EFBFBD>6<>6<>7<>v<EFBFBD>g<EFBFBD>m<EFBFBD>m<EFBFBD>>Y<>>Y<>=Z<>Z^<5E>_<>J<EFBFBD><19>I<EFBFBD> <09>B<EFBFBD>y<EFBFBD>k<EFBFBD>
2026-04-08 14:19:31 +01:00
<1A><1B> <09>
<1B><1C> <09>)<29><14> <09>(<28>O<EFBFBD> <09>A<EFBFBD>j<EFBFBD>\<5C><11>
<1B><1C> <09>)<29>d<EFBFBD>
2026-04-09 11:03:35 +01:00
<1A><1B>#<23>8<EFBFBD>Z<EFBFBD><14>#7<><1D><0E>#0<>2<>K<EFBFBD>
<EFBFBD> '<27> <0B>}<7D>
2026-04-09 11:30:22 +01:00
5<EFBFBD>6<><14>q<EFBFBD><18>;I<>3<EFBFBD><1D>&<26><1E>7<>q<EFBFBD><08> <0A>4<>]<5D>O<EFBFBD>1<EFBFBD>^<5E>DT<44>U<12><1A>3<EFBFBD><1E>0<><1B> <0A>T<EFBFBD>C<01> D<01>r<>c <00>4<00>tjd<01><02>}|jdtddd<05><06>|jdtddd <09><06>|jd
2026-04-09 11:03:35 +01:00
d d <0C> <0A>|jdd d<0F> <0A>|j <00>}t t<00>}|s7tdt<00><00>tj<00><11>tjd<12>t|j<00><00>}|j<00>mt|j<00>}|D<00>cgc] }|d|k(s<01> |<05><02>}}|s>td|j<00>d<14>tj<00><11>tjd<12>|j<00>||j d}tdt!|<03><00>dt<00>d<17><05>g}g}g}|D]<5D>\} }
t#| |
|| |
f|j$<00><18>\} } } }|j'| <0B>|j)| <0A>|j)|<0E>|j$r<01>i| rdnd}td|
d<1C>d| <09>|<0F><00><05><00><>t+||<07>\}}t-||||<11>}|j.rtd<1E>t|<12>ytdt!|<12>d <20>d!t0<00>d"<22><05>t3j4<00>}|j6j9t0d#t:d$|d%<25>g<01>&<26>}|j<d'j>}d(|j@jB<00>d)|j@jD<00>d*<2A>}d+}td|<17>d,|<17><00><04>t|<15>td-|<16>d.<2E><03>t|<17>tG|||||||<08>}td/|<18><00><02>|d'kDr*|rd0|z|z nd'}td1|<10>d2|<11>d3|d4<64>d5tH<00>d6<64> <09>yycc}w)7Nz%Analyse MIPI CSV captures with Claude)<01> descriptionz--last<73>Nz'Process only the N most recent captures)<04>type<70>default<6C>metavar<61>helpz --capture<72>NUMz+Process a single capture number (e.g. 0001)z --verbose<73>
2026-04-09 11:30:22 +01:00
store_truez"Print per-file summaries to stdout)<02>actionr<6E>z --dry-runz5Print summaries and prompt but do not call Claude APIzNo CSV files found in )<01>filer<65>r<>z not found.z Processing z capture(s) from rZ)rMz *** FLICKER SUSPECT ***r1z Processed capture r<rOz,
2026-04-08 14:19:31 +01:00
--- Prompt that would be sent to Claude ---z
2026-04-09 11:30:22 +01:00
Sending r<>z characters to z...
r<EFBFBD>r<>r<>r<>rr<>r<>r<>r<>z
2026-04-08 14:19:31 +01:00
CLAUDE ANALYSIS
2026-04-09 11:30:22 +01:00
r<EFBFBD>r<>z
Report saved to rzu*** FLICKER DETECTED — rxr<>r{u %) — see r<>)%<25>argparse<73>ArgumentParser<65> add_argument<6E>intr<74><00>
2026-04-09 11:03:35 +01:00
parse_argsr
2026-04-09 11:30:22 +01:00
r<>r^<00>sys<79>stderr<72>exitr<74>r!<00>capturer<65>r%rhrMr[r<>r*r<><00>dry_runr<6E>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r=)<1A>parser<65>argsr<73>r!<00>
target_numrprir<>r<>r+r,r<>r<>r<>re<00>flagrjrkr<>r<>r<>r<>r<>r<>r<>r<>s r)<00>mainr<00>s<><00><00> <15> $<24> $<24>1X<31> Y<>F<EFBFBD>
2026-04-08 14:19:31 +01:00
<EFBFBD><17><17><08>#<23><04>c<EFBFBD>F<><18>H<01>
<EFBFBD><17><17> <0B>#<23><04>e<EFBFBD>J<><18>L<01>
<EFBFBD><17><17> <0B>L<EFBFBD>A<><18>C<01>
<EFBFBD><17><17> <0B>L<EFBFBD>T<><18>V<01> <11> <1C> <1C> <1E>D<EFBFBD><1C>H<EFBFBD> %<25>F<EFBFBD> <11> <0A>&<26>x<EFBFBD>j<EFBFBD>1<><03>
<EFBFBD>
<EFBFBD>C<> <0B><08><08><11> <0B> <11>&<26>+<2B>+<2B>-<2D> <20>D<EFBFBD> <0B>|<7C>|<7C><1F><18><14><1C><1C>&<26>
<EFBFBD><1F>6<>a<EFBFBD>1<EFBFBD>Q<EFBFBD>4<EFBFBD>:<3A>#5<><01>6<><04>6<><13> <11>H<EFBFBD>T<EFBFBD>\<5C>\<5C>N<EFBFBD>+<2B>6<>S<EFBFBD>Z<EFBFBD>Z<EFBFBD> H<> <0F>H<EFBFBD>H<EFBFBD>Q<EFBFBD>K<EFBFBD> <0B>y<EFBFBD>y<EFBFBD><1C><13>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>J<EFBFBD>K<EFBFBD> <20><04> <09>K<EFBFBD><03>D<EFBFBD> <09>{<7B>"3<>H<EFBFBD>:<3A>R<EFBFBD>
2026-04-09 11:03:35 +01:00
@<40>A<> "<22>M<EFBFBD>,.<2E><18>#%<25>M<EFBFBD><17>@<01><07><02>C<EFBFBD>/><3E> <0E><03>V<EFBFBD>R<EFBFBD><13>I<EFBFBD>&<26><04> <0C> <0C>0><3E>,<2C> <0C>a<EFBFBD><18>9<EFBFBD><15><1C><1C>\<5C>*<2A><1C>#<23>#<23>H<EFBFBD>-<2D><15><1C><1C>Y<EFBFBD>'<27><13>|<7C>|<7C>2:<3A>.<2E><02>D<EFBFBD> <11>(<28><13>S<EFBFBD> <09><12>B<EFBFBD>4<EFBFBD><04>v<EFBFBD>><3E> ?<3F>@<01>%6<>d<EFBFBD><P<>$Q<>!<21>M<EFBFBD>><3E> <19>-<2D>)=<3D>}<7D>n<EFBFBD> ]<5D>F<EFBFBD> <0B>|<7C>|<7C> <0A>=<3D>><3E> <0A>f<EFBFBD> <0A><0E>
2026-04-08 14:19:31 +01:00
<EFBFBD>J<EFBFBD>s<EFBFBD>6<EFBFBD>{<7B>1<EFBFBD>o<EFBFBD>_<EFBFBD>\<5C>N<EFBFBD>%<25>
2026-04-08 15:42:51 +01:00
H<EFBFBD>I<><18>"<22>"<22>$<24>F<EFBFBD><15><EFBFBD><EFBFBD>%<25>%<25>!<21><19>"<22>%<25>&<26>9<>:<3A> &<26><06>G<EFBFBD> <19><1F><1F><11>#<23>(<28>(<28>H<EFBFBD><1B>G<EFBFBD>M<EFBFBD>M<EFBFBD>6<>6<>7<>v<EFBFBD>g<EFBFBD>m<EFBFBD>m<EFBFBD>>Y<>>Y<>=Z<>Z^<5E>_<>J<EFBFBD><19>I<EFBFBD>
2026-04-08 14:19:31 +01:00
<EFBFBD>B<EFBFBD>y<EFBFBD>k<EFBFBD>,<2C>Y<EFBFBD>K<EFBFBD>
8<EFBFBD>9<> <09>(<28>O<EFBFBD> <09>A<EFBFBD>j<EFBFBD>\<5C><11>
2026-04-09 11:03:35 +01:00
<1B><1C> <09>)<29><14>#<23>8<EFBFBD>Z<EFBFBD><14>#7<><1D><0E>#0<>2<>K<EFBFBD>
<EFBFBD> <1E>{<7B>m<EFBFBD>
,<2C>-<2D><14>q<EFBFBD><18>;I<>3<EFBFBD><1D>&<26><1E>7<>q<EFBFBD><08> <0A>)<29>-<2D><1F><01>.<2E>9I<39>J<12><1A>3<EFBFBD><1E>{<7B>;<3B>-<2D>t<EFBFBD>=<3D> ><3E><19><>s7s <00> N<04>N<04>__main__)F)Nrr)NrrN)<01>
2026-04-09 11:30:22 +01:00
)r#N)*<2A>__doc__rr<>rr<00>pathlibrr<><00>dotenvr<00>__file__r><00>csv_preprocessorrrrr r
r r r rr<>r<>r}r<>r<>r=<00>list<73>tuplerr*r<>rK<00>dict<63>boolrhr<>r<>r<>r<00>__name__rnr<>r)<00><module>rsV<00><01>
2026-04-08 15:42:51 +01:00
<04><10> <0B>
2026-04-09 11:03:35 +01:00
<EFBFBD><1D><18><10><1E> <0B>D<EFBFBD><18>N<EFBFBD> !<21> !<21>F<EFBFBD> *<2A>+<2B><02><02><02>
2026-04-09 11:30:22 +01:00
<13>8<EFBFBD>n<EFBFBD>#<23>#<23>f<EFBFBD>,<2C><08><12>8<EFBFBD>n<EFBFBD>#<23>#<23>i<EFBFBD>/<2F> <0B>B[<01>D<><1A><19>)<29>
<1C><1B><1D><1A><1E><1B>j<01>l<02>W<02><06>-<02> <0A>:#<23> <0C>!<21><0E>.<13>8<EFBFBD>n<EFBFBD>#<23>#<23>i<EFBFBD>/<2F>2C<32>C<> <0B>,<2C>D<EFBFBD>,<2C>D<EFBFBD>,<2C>U<EFBFBD>3<EFBFBD><03>8<EFBFBD>_<EFBFBD>,<2C>& <0B>3<EFBFBD> <0B>S<EFBFBD> <0B>[<5B> <0B>T<EFBFBD> <0B>*<1A> 2G<01> <0B>2G<01> <0C>2G<01> <10><03>T<EFBFBD> <09>?<3F>2G<01><12> 2G<01>
 <0B>3<EFBFBD><04>d<EFBFBD>;<3B>'<27><14>i<EFBFBD><1F> 8<>9<> 2G<01>jEI<01>?@<40>S<06><04>S<EFBFBD> <09>S<06>T<EFBFBD>S<06> #<23>S<06>9<<3C>S<06>EH<45>S<06>n/3<>*+<2B>+,<2C>+/<2F> S<10>s<EFBFBD>S<10><03>S<10>4<EFBFBD>S<10>'+<2B>S<10>$'<27>S<10>&)<29>S<10>%)<29> S<10>59<35> S<10>t5D<01>s<EFBFBD>5D<01>D<EFBFBD>5D<01>pR><3E>j <0C>z<EFBFBD><19><08>F<EFBFBD>r<>