← Commit history
demos/fan-safety/README.mdadded+15
@@ -0,0 +1,15 @@+# Fan safety software replay++This is an offline host simulation, not a hardware control surface. `trace.c` calls the actual portable controller and tach decoder with synthetic voltage, latch, temperature, qualification and tach inputs. It never connects to an instrument. The production control-panel remains disconnected by default and is separate from this replay.++Compile from the project root:++```+cc -std=c11 -Wall -Wextra -Werror -fsanitize=address,undefined demos/fan-safety/trace.c firmware/load_core.c firmware/fan_tach.c -lm -o /tmp/adom-load-fan-demo+/tmp/adom-load-fan-demo > demos/fan-safety/trace.json+python3 -m http.server 45955 --directory demos/fan-safety+```++At 2000 ms synthetic tach pulses stop. At 2013 ms the decoder invalidates feedback and the policy disables the load command. Pulses return at 3000 ms; after qualification the fan feedback becomes valid again, but the fault remains latched. Assertions verify the trip and absence of automatic restart. These times describe this input schedule and host model only; they do not establish physical shutdown latency or cooling performance.++The browser replays saved trace values at 1× simulation time. It does not execute firmware or invent readings. Video capture has its own timing limitations; the displayed simulation clock is authoritative for the replay.
demos/fan-safety/favicon.svgadded+1
@@ -0,0 +1 @@+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="12" fill="#161b22"/><path d="M14 32h9l5-12 8 24 5-12h9" fill="none" stroke="#00b8b1" stroke-width="5" stroke-linejoin="round"/></svg>
demos/fan-safety/index.htmladded+12
@@ -0,0 +1,12 @@+<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width"><link rel="icon" href="favicon.svg"><title>Adom Load · Fan protection replay</title><style>+:root{color-scheme:dark;font:18px system-ui;color:#eaf2fa;background:#0d1420}body{max-width:1100px;margin:4vh auto;padding:24px}small{color:#a7bbc9}.badge{color:#ffc56f;border:1px solid #8a6234;border-radius:5px;padding:7px 12px;display:inline-block}h1{font-size:38px;margin:20px 0 10px}p{color:#afc0d0;line-height:1.5}.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:28px 0}.card{background:#172334;border:1px solid #304155;padding:20px;border-radius:12px}.value{font-size:36px;font-weight:650;margin-top:10px}.good{color:#64dfc4}.bad{color:#ff937f}svg{width:100%;background:#111d2d;border:1px solid #304155;border-radius:12px}button{background:#74e3ca;color:#102326;border:0;border-radius:7px;padding:12px 22px;font:inherit;cursor:pointer}#event{min-height:52px;font-size:23px;margin-top:24px}footer{font-size:14px;color:#91a9bf;line-height:1.5;margin-top:24px}.controls{display:flex;align-items:center;gap:20px;margin-top:20px}input{flex:1}text{fill:#a6b9ca;font:15px system-ui}</style>+<div class="badge">SOFTWARE SIMULATION · NO HARDWARE CONNECTED</div><h1>Fan feedback must stay healthy.</h1><p>Replay generated by Adom’s portable C load controller and tachometer decoder.<br>Synthetic input: 5 V, a 0.75 A request, and a 7,000 RPM fan.</p>+<div class="cards"><div class="card"><small>Qualified fan feedback</small><div id="rpm" class="value">—</div></div><div class="card"><small>Commanded current</small><div id="amps" class="value">0.000 A</div></div><div class="card"><small>Controller state</small><div id="state" class="value">OFF</div></div></div>+<svg viewBox="0 0 1000 230" role="img" aria-label="Commanded current over simulation time"><path d="M60 30V185H970" fill="none" stroke="#597082"/><text x="12" y="40">1 A</text><text x="12" y="190">0 A</text><text x="56" y="215">0 s</text><text x="439" y="215">2 s · tach stops</text><text x="640" y="215">3 s · fan returns</text><text x="916" y="215">4.5 s</text><path id="curve" fill="none" stroke="#65dec5" stroke-width="4"/><line id="cursor" y1="25" y2="185" stroke="#fff" stroke-width="2"/><circle id="dot" r="6" fill="#fff"/></svg>+<div id="event">Ready to replay the software test.</div><div class="controls"><button id="play">Play replay</button><input aria-label="Replay position" id="seek" type="range" min="0" max="4500" value="0"><span id="time">0.000 s</span></div><footer>1× simulation time. The plot shows the software command, not measured current. Assembly qualification and hardware-latch inputs are synthetic test fixtures. Physical fan behavior, MCU timing, analog response, and shutdown latency remain unverified.</footer>+<script>+let data,playing=false,start=0,position=0;const $=id=>document.getElementById(id),names=['OFF','ARMED','RUNNING','FAULT'];+function show(t){position=t;let i=data.samples.findLastIndex(s=>s.ms<=t),s=data.samples[Math.max(i,0)];$('rpm').textContent=s.rpmValid?Math.round(s.rpm).toLocaleString()+' RPM':'UNKNOWN';$('rpm').className='value '+(s.rpmValid?'good':'bad');$('amps').textContent=s.setpointA.toFixed(3)+' A';$('state').textContent=names[s.state];$('state').className='value '+(s.state===3?'bad':'good');$('time').textContent=(t/1000).toFixed(3)+' s';$('seek').value=t;let x=60+t/4500*910,y=185-s.setpointA*155;$('cursor').setAttribute('x1',x);$('cursor').setAttribute('x2',x);$('dot').setAttribute('cx',x);$('dot').setAttribute('cy',y);$('curve').setAttribute('d',data.samples.filter(v=>v.ms<=t).map((v,j)=>(j?'L':'M')+(60+v.ms/4500*910)+','+(185-v.setpointA*155)).join(' '));$('event').textContent=t<100?'Waiting for qualified fan feedback.':t<2000?'Load enabled. Current command rises at 1 A/s.':t<data.faultMs?'Tach pulses stopped. Checking freshness…':t<3000?'Fan feedback expired. Enable LOW; DAC code zero.':'Fan feedback recovered. Fault stays latched—no automatic restart.';}+function frame(now){if(!playing)return;let t=Math.min(4500,now-start);show(t);if(t>=4500){playing=false;$('play').textContent='Replay again';}else requestAnimationFrame(frame);}+$('play').onclick=()=>{if(!data)return;if(playing){playing=false;$('play').textContent='Continue';return;}if(position>=4500)position=0;playing=true;start=performance.now()-position;$('play').textContent='Pause';requestAnimationFrame(frame);};$('seek').oninput=e=>{playing=false;$('play').textContent='Continue';show(+e.target.value);};fetch('trace.json').then(r=>r.json()).then(d=>{data=d;show(0)}).catch(()=>{$('event').textContent='Trace could not be loaded.'});+</script></html>
demos/fan-safety/trace.cadded+28
@@ -0,0 +1,28 @@+/* Host-only demonstration: synthetic inputs, actual portable policy and tach code.+ * This does not qualify hardware or implement an MCU adapter. */+#include "../../firmware/load_core.h"+#include "../../firmware/fan_tach.h"+#include <assert.h>+#include <stdio.h>+int main(void){+ load_core c; fan_tach f;load_init(&c,0);fan_tach_init(&f);+ unsigned next_edge=0,last_edge=0,trip=0; bool armed=false;+ puts("{\"kind\":\"HOST SOFTWARE SIMULATION\",\"inputs\":\"Synthetic 5 V source and 7000 RPM tach pulses; no hardware connected\",\"samples\":[");+ for(unsigned t=0;t<=4500;t++){+  bool spinning=t<2000||t>=3000;+  if(spinning){while(next_edge<=t*1000){fan_tach_edge(&f,next_edge);last_edge=next_edge;next_edge+=4286;}}+  else next_edge=(t+1)*1000;+  float rpm=0;bool valid=fan_tach_read(&f,t*1000,&rpm);+  load_sample s={.now_ms=t,.sample_ms=t,.last_tach_ms=last_edge/1000,.volts=5,.amps=c.enable?c.applied_a:0,.case_c=30,.fan_rpm=rpm,.fan_rpm_valid=valid,.sensors_valid=true,.hw_ok=true,.latch_q=true,.assembly_qualified=true};+  load_heartbeat(&c,t);+  if(t==100){assert(load_set_current(&c,.75f));assert(load_arm(&c,&s));armed=true;}+  load_tick(&c,&s);+  if(c.state==LOAD_FAULT&&!trip)trip=t;+  if(t>=2050)assert(c.state==LOAD_FAULT&&!c.enable&&c.dac_code==0);+  if(t%10==0||t==trip){+   static bool comma=false;printf("%s{\"ms\":%u,\"rpm\":%.1f,\"rpmValid\":%s,\"setpointA\":%.3f,\"enabled\":%s,\"dacCode\":%u,\"state\":%d,\"faults\":%u}",comma?",\n":"",t,rpm,valid?"true":"false",c.applied_a,c.enable?"true":"false",c.dac_code,c.state,c.faults);comma=true;+  }+ }+ assert(armed&&trip>=2000&&trip<=2016);+ printf("\n],\"tachStopsMs\":2000,\"faultMs\":%u,\"fanReturnsMs\":3000,\"automaticRestart\":false}\n",trip);+}
demos/fan-safety/trace.jsonadded+454
@@ -0,0 +1,454 @@+{"kind":"HOST SOFTWARE SIMULATION","inputs":"Synthetic 5 V source and 7000 RPM tach pulses; no hardware connected","samples":[+{"ms":0,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":10,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":20,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":30,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":40,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":50,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":60,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":70,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":80,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":90,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":0,"faults":0},+{"ms":100,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":2,"faults":0},+{"ms":110,"rpm":6999.5,"rpmValid":true,"setpointA":0.010,"enabled":true,"dacCode":12,"state":2,"faults":0},+{"ms":120,"rpm":6999.5,"rpmValid":true,"setpointA":0.020,"enabled":true,"dacCode":25,"state":2,"faults":0},+{"ms":130,"rpm":6999.5,"rpmValid":true,"setpointA":0.030,"enabled":true,"dacCode":38,"state":2,"faults":0},+{"ms":140,"rpm":6999.5,"rpmValid":true,"setpointA":0.040,"enabled":true,"dacCode":51,"state":2,"faults":0},+{"ms":150,"rpm":6999.5,"rpmValid":true,"setpointA":0.050,"enabled":true,"dacCode":64,"state":2,"faults":0},+{"ms":160,"rpm":6999.5,"rpmValid":true,"setpointA":0.060,"enabled":true,"dacCode":77,"state":2,"faults":0},+{"ms":170,"rpm":6999.5,"rpmValid":true,"setpointA":0.070,"enabled":true,"dacCode":90,"state":2,"faults":0},+{"ms":180,"rpm":6999.5,"rpmValid":true,"setpointA":0.080,"enabled":true,"dacCode":103,"state":2,"faults":0},+{"ms":190,"rpm":6999.5,"rpmValid":true,"setpointA":0.090,"enabled":true,"dacCode":116,"state":2,"faults":0},+{"ms":200,"rpm":6999.5,"rpmValid":true,"setpointA":0.100,"enabled":true,"dacCode":129,"state":2,"faults":0},+{"ms":210,"rpm":6999.5,"rpmValid":true,"setpointA":0.110,"enabled":true,"dacCode":142,"state":2,"faults":0},+{"ms":220,"rpm":6999.5,"rpmValid":true,"setpointA":0.120,"enabled":true,"dacCode":155,"state":2,"faults":0},+{"ms":230,"rpm":6999.5,"rpmValid":true,"setpointA":0.130,"enabled":true,"dacCode":168,"state":2,"faults":0},+{"ms":240,"rpm":6999.5,"rpmValid":true,"setpointA":0.140,"enabled":true,"dacCode":181,"state":2,"faults":0},+{"ms":250,"rpm":6999.5,"rpmValid":true,"setpointA":0.150,"enabled":true,"dacCode":194,"state":2,"faults":0},+{"ms":260,"rpm":6999.5,"rpmValid":true,"setpointA":0.160,"enabled":true,"dacCode":207,"state":2,"faults":0},+{"ms":270,"rpm":6999.5,"rpmValid":true,"setpointA":0.170,"enabled":true,"dacCode":220,"state":2,"faults":0},+{"ms":280,"rpm":6999.5,"rpmValid":true,"setpointA":0.180,"enabled":true,"dacCode":233,"state":2,"faults":0},+{"ms":290,"rpm":6999.5,"rpmValid":true,"setpointA":0.190,"enabled":true,"dacCode":246,"state":2,"faults":0},+{"ms":300,"rpm":6999.5,"rpmValid":true,"setpointA":0.200,"enabled":true,"dacCode":259,"state":2,"faults":0},+{"ms":310,"rpm":6999.5,"rpmValid":true,"setpointA":0.210,"enabled":true,"dacCode":272,"state":2,"faults":0},+{"ms":320,"rpm":6999.5,"rpmValid":true,"setpointA":0.220,"enabled":true,"dacCode":285,"state":2,"faults":0},+{"ms":330,"rpm":6999.5,"rpmValid":true,"setpointA":0.230,"enabled":true,"dacCode":298,"state":2,"faults":0},+{"ms":340,"rpm":6999.5,"rpmValid":true,"setpointA":0.240,"enabled":true,"dacCode":311,"state":2,"faults":0},+{"ms":350,"rpm":6999.5,"rpmValid":true,"setpointA":0.250,"enabled":true,"dacCode":324,"state":2,"faults":0},+{"ms":360,"rpm":6999.5,"rpmValid":true,"setpointA":0.260,"enabled":true,"dacCode":337,"state":2,"faults":0},+{"ms":370,"rpm":6999.5,"rpmValid":true,"setpointA":0.270,"enabled":true,"dacCode":350,"state":2,"faults":0},+{"ms":380,"rpm":6999.5,"rpmValid":true,"setpointA":0.280,"enabled":true,"dacCode":363,"state":2,"faults":0},+{"ms":390,"rpm":6999.5,"rpmValid":true,"setpointA":0.290,"enabled":true,"dacCode":376,"state":2,"faults":0},+{"ms":400,"rpm":6999.5,"rpmValid":true,"setpointA":0.300,"enabled":true,"dacCode":389,"state":2,"faults":0},+{"ms":410,"rpm":6999.5,"rpmValid":true,"setpointA":0.310,"enabled":true,"dacCode":402,"state":2,"faults":0},+{"ms":420,"rpm":6999.5,"rpmValid":true,"setpointA":0.320,"enabled":true,"dacCode":415,"state":2,"faults":0},+{"ms":430,"rpm":6999.5,"rpmValid":true,"setpointA":0.330,"enabled":true,"dacCode":428,"state":2,"faults":0},+{"ms":440,"rpm":6999.5,"rpmValid":true,"setpointA":0.340,"enabled":true,"dacCode":441,"state":2,"faults":0},+{"ms":450,"rpm":6999.5,"rpmValid":true,"setpointA":0.350,"enabled":true,"dacCode":454,"state":2,"faults":0},+{"ms":460,"rpm":6999.5,"rpmValid":true,"setpointA":0.360,"enabled":true,"dacCode":467,"state":2,"faults":0},+{"ms":470,"rpm":6999.5,"rpmValid":true,"setpointA":0.370,"enabled":true,"dacCode":480,"state":2,"faults":0},+{"ms":480,"rpm":6999.5,"rpmValid":true,"setpointA":0.380,"enabled":true,"dacCode":493,"state":2,"faults":0},+{"ms":490,"rpm":6999.5,"rpmValid":true,"setpointA":0.390,"enabled":true,"dacCode":506,"state":2,"faults":0},+{"ms":500,"rpm":6999.5,"rpmValid":true,"setpointA":0.400,"enabled":true,"dacCode":519,"state":2,"faults":0},+{"ms":510,"rpm":6999.5,"rpmValid":true,"setpointA":0.410,"enabled":true,"dacCode":532,"state":2,"faults":0},+{"ms":520,"rpm":6999.5,"rpmValid":true,"setpointA":0.420,"enabled":true,"dacCode":544,"state":2,"faults":0},+{"ms":530,"rpm":6999.5,"rpmValid":true,"setpointA":0.430,"enabled":true,"dacCode":557,"state":2,"faults":0},+{"ms":540,"rpm":6999.5,"rpmValid":true,"setpointA":0.440,"enabled":true,"dacCode":570,"state":2,"faults":0},+{"ms":550,"rpm":6999.5,"rpmValid":true,"setpointA":0.450,"enabled":true,"dacCode":583,"state":2,"faults":0},+{"ms":560,"rpm":6999.5,"rpmValid":true,"setpointA":0.460,"enabled":true,"dacCode":596,"state":2,"faults":0},+{"ms":570,"rpm":6999.5,"rpmValid":true,"setpointA":0.470,"enabled":true,"dacCode":609,"state":2,"faults":0},+{"ms":580,"rpm":6999.5,"rpmValid":true,"setpointA":0.480,"enabled":true,"dacCode":622,"state":2,"faults":0},+{"ms":590,"rpm":6999.5,"rpmValid":true,"setpointA":0.490,"enabled":true,"dacCode":635,"state":2,"faults":0},+{"ms":600,"rpm":6999.5,"rpmValid":true,"setpointA":0.500,"enabled":true,"dacCode":648,"state":2,"faults":0},+{"ms":610,"rpm":6999.5,"rpmValid":true,"setpointA":0.510,"enabled":true,"dacCode":661,"state":2,"faults":0},+{"ms":620,"rpm":6999.5,"rpmValid":true,"setpointA":0.520,"enabled":true,"dacCode":674,"state":2,"faults":0},+{"ms":630,"rpm":6999.5,"rpmValid":true,"setpointA":0.530,"enabled":true,"dacCode":687,"state":2,"faults":0},+{"ms":640,"rpm":6999.5,"rpmValid":true,"setpointA":0.540,"enabled":true,"dacCode":700,"state":2,"faults":0},+{"ms":650,"rpm":6999.5,"rpmValid":true,"setpointA":0.550,"enabled":true,"dacCode":713,"state":2,"faults":0},+{"ms":660,"rpm":6999.5,"rpmValid":true,"setpointA":0.560,"enabled":true,"dacCode":726,"state":2,"faults":0},+{"ms":670,"rpm":6999.5,"rpmValid":true,"setpointA":0.570,"enabled":true,"dacCode":739,"state":2,"faults":0},+{"ms":680,"rpm":6999.5,"rpmValid":true,"setpointA":0.580,"enabled":true,"dacCode":752,"state":2,"faults":0},+{"ms":690,"rpm":6999.5,"rpmValid":true,"setpointA":0.590,"enabled":true,"dacCode":765,"state":2,"faults":0},+{"ms":700,"rpm":6999.5,"rpmValid":true,"setpointA":0.600,"enabled":true,"dacCode":778,"state":2,"faults":0},+{"ms":710,"rpm":6999.5,"rpmValid":true,"setpointA":0.610,"enabled":true,"dacCode":791,"state":2,"faults":0},+{"ms":720,"rpm":6999.5,"rpmValid":true,"setpointA":0.620,"enabled":true,"dacCode":804,"state":2,"faults":0},+{"ms":730,"rpm":6999.5,"rpmValid":true,"setpointA":0.630,"enabled":true,"dacCode":817,"state":2,"faults":0},+{"ms":740,"rpm":6999.5,"rpmValid":true,"setpointA":0.640,"enabled":true,"dacCode":830,"state":2,"faults":0},+{"ms":750,"rpm":6999.5,"rpmValid":true,"setpointA":0.650,"enabled":true,"dacCode":843,"state":2,"faults":0},+{"ms":760,"rpm":6999.5,"rpmValid":true,"setpointA":0.660,"enabled":true,"dacCode":856,"state":2,"faults":0},+{"ms":770,"rpm":6999.5,"rpmValid":true,"setpointA":0.670,"enabled":true,"dacCode":869,"state":2,"faults":0},+{"ms":780,"rpm":6999.5,"rpmValid":true,"setpointA":0.680,"enabled":true,"dacCode":882,"state":2,"faults":0},+{"ms":790,"rpm":6999.5,"rpmValid":true,"setpointA":0.690,"enabled":true,"dacCode":895,"state":2,"faults":0},+{"ms":800,"rpm":6999.5,"rpmValid":true,"setpointA":0.700,"enabled":true,"dacCode":908,"state":2,"faults":0},+{"ms":810,"rpm":6999.5,"rpmValid":true,"setpointA":0.710,"enabled":true,"dacCode":921,"state":2,"faults":0},+{"ms":820,"rpm":6999.5,"rpmValid":true,"setpointA":0.720,"enabled":true,"dacCode":934,"state":2,"faults":0},+{"ms":830,"rpm":6999.5,"rpmValid":true,"setpointA":0.730,"enabled":true,"dacCode":947,"state":2,"faults":0},+{"ms":840,"rpm":6999.5,"rpmValid":true,"setpointA":0.740,"enabled":true,"dacCode":960,"state":2,"faults":0},+{"ms":850,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":860,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":870,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":880,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":890,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":900,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":910,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":920,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":930,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":940,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":950,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":960,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":970,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":980,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":990,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1000,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1010,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1020,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1030,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1040,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1050,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1060,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1070,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1080,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1090,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1100,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1110,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1120,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1130,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1140,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1150,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1160,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1170,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1180,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1190,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1200,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1210,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1220,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1230,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1240,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1250,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1260,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1270,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1280,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1290,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1300,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1310,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1320,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1330,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1340,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1350,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1360,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1370,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1380,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1390,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1400,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1410,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1420,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1430,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1440,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1450,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1460,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1470,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1480,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1490,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1500,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1510,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1520,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1530,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1540,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1550,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1560,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1570,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1580,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1590,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1600,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1610,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1620,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1630,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1640,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1650,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1660,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1670,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1680,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1690,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1700,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1710,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1720,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1730,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1740,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1750,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1760,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1770,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1780,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1790,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1800,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1810,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1820,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1830,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1840,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1850,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1860,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1870,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1880,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1890,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1900,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1910,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1920,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1930,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1940,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1950,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1960,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1970,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1980,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":1990,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":2000,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":2010,"rpm":6999.5,"rpmValid":true,"setpointA":0.750,"enabled":true,"dacCode":973,"state":2,"faults":0},+{"ms":2013,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2020,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2030,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2040,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2050,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2060,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2070,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2080,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2090,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2100,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2110,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2120,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2130,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2140,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2150,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2160,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2170,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2180,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2190,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2200,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2210,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2220,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2230,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2240,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2250,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2260,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2270,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2280,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2290,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2300,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2310,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2320,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2330,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2340,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2350,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2360,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2370,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2380,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2390,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2400,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2410,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2420,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2430,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2440,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2450,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2460,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2470,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2480,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2490,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2500,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2510,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2520,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2530,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2540,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2550,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2560,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2570,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2580,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2590,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2600,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2610,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2620,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2630,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2640,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2650,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2660,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2670,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2680,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2690,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2700,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2710,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2720,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2730,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2740,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2750,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2760,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2770,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2780,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2790,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2800,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2810,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2820,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2830,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2840,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2850,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2860,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2870,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2880,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2890,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2900,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2910,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2920,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2930,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2940,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2950,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2960,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2970,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2980,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":2990,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3000,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3010,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3020,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3030,"rpm":0.0,"rpmValid":false,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3040,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3050,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3060,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3070,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3080,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3090,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3100,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3110,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3120,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3130,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3140,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3150,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3160,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3170,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3180,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3190,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3200,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3210,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3220,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3230,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3240,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3250,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3260,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3270,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3280,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3290,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3300,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3310,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3320,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3330,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3340,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3350,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3360,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3370,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3380,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3390,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3400,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3410,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3420,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3430,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3440,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3450,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3460,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3470,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3480,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3490,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3500,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3510,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3520,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3530,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3540,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3550,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3560,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3570,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3580,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3590,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3600,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3610,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3620,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3630,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3640,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3650,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3660,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3670,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3680,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3690,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3700,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3710,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3720,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3730,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3740,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3750,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3760,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3770,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3780,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3790,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3800,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3810,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3820,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3830,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3840,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3850,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3860,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3870,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3880,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3890,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3900,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3910,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3920,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3930,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3940,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3950,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3960,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3970,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3980,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":3990,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4000,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4010,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4020,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4030,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4040,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4050,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4060,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4070,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4080,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4090,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4100,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4110,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4120,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4130,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4140,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4150,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4160,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4170,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4180,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4190,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4200,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4210,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4220,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4230,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4240,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4250,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4260,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4270,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4280,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4290,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4300,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4310,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4320,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4330,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4340,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4350,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4360,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4370,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4380,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4390,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4400,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4410,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4420,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4430,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4440,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4450,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4460,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4470,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4480,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4490,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4},+{"ms":4500,"rpm":6999.5,"rpmValid":true,"setpointA":0.000,"enabled":false,"dacCode":0,"state":3,"faults":4}+],"tachStopsMs":2000,"faultMs":2013,"fanReturnsMs":3000,"automaticRestart":false}
design/accepted-native-net-audit.jsonadded+4
@@ -0,0 +1,4 @@+{+  "checkedItems": 1927,+  "changes": []+}
design/ground-final-v5-gate.logadded+2
@@ -0,0 +1,2 @@+OK: gate passed: 0 new DRC errors (0 inherited), 0 unconnected; copper {"copperLengthMm":2419.94,"entries":68,"nets":52,"segments":1655,"segmentsByWidth":{"0.25":1330,"0.3":91,"0.5":195,"1":11,"1.2":28},"vias":249}+Hint: Next: adom-aiflow land route (then pour, land vias, land pours).
design/ground-routing-review.mdadded+9
@@ -0,0 +1,9 @@+# Ground continuity correction++The reviewed routing plan initially passed the geometric DRC comparison but left eleven open ground connections. A native top ground zone reduced this to seven. Native filled-copper geometry identified eight connected ground groups.++Five stitching vias reduced the seven opens to two. Rejected trial bridges crossed existing traces; they were never landed. The accepted candidate shortens a fan-tach branch, shifts its neighboring ground via from y=61.7 to y=61.9 mm, detours the latch signal to free a ground corridor, and adds a sixth stitching via at (114,80.4) mm.++`route-plan-ground-final-v5.json` passes the native AIFlow gate with zero new DRC errors, zero inherited errors and zero unconnected items. Project rules travel with the candidate. This is candidate evidence; final native landing, saved-board verification, fitted visibility, current capacity, USB electrical review and thermal analysis remain separate gates.++The conservative local escape search is only an experiment and did not find a path. Its output is not accepted native routing. Native candidate fills are disposable snapshots; no failed trial modified the live editor.
docs/build-clips.md+14
@@ -47,3 +47,17 @@ The fan sequence is **SIMULATED**, shown at the labeled **0.02× slow-motion sca Native KiCad 3D review after adding TP12 for fan tach and TP13 for Kelvin minus. This is a review of the generated checkpoint, not a recording of pad insertion. The board remains unrouted and has no cooling assembly. Seven-second normal-speed excerpt.  <video controls preload="metadata" poster="docs/clips/probe-pads-3d-poster.jpg" src="docs/clips/probe-pads-3d.mp4"></video>++## Top ground pour creation++Actual native creation, trimmed to the changing copper. A 3.7-second excerpt; the board is still being routed in this shot.++<video controls preload="metadata" poster="docs/clips/top-ground-poster.jpg" src="docs/clips/top-ground-creation.mp4"></video>++## Fan feedback loss: software replay++The actual portable C controller and tach decoder run with synthetic inputs. At 2 seconds the tach pulses stop; the controller disables its command at 2.013 seconds. When feedback returns, the fault stays latched. This is **software simulation**, not measured electrical current or physical shutdown latency. Host assertions and address/undefined-behavior sanitizers passed.++<video controls preload="metadata" poster="docs/clips/fan-safety-poster.jpg" src="docs/clips/fan-safety-replay.mp4"></video>++The recording preserves the simulation label. Recorder timing repair failed; use the displayed simulation clock for event timing, not encoded-video duration. [Replay source and trace](../demos/fan-safety/README.md).
docs/clips/fan-safety-poster.jpgadded
⋯ 1 unchanged line ⋯
docs/clips/fan-safety-replay.mp4added
⋯ 1 unchanged line ⋯
docs/clips/fan-safety-sheet.jpgadded
⋯ 1 unchanged line ⋯
docs/clips/top-ground-contact-sheet.jpgadded
⋯ 1 unchanged line ⋯
docs/clips/top-ground-creation.mp4added
⋯ 1 unchanged line ⋯
docs/clips/top-ground-poster.jpgadded
⋯ 1 unchanged line ⋯
docs/video-edit-plan.mdadded+27
@@ -0,0 +1,27 @@+# Electronic load build film++Target: 4–5 minutes, narrated. This is a process film about an engineering prototype. Hardware operation, cooling qualification and a finished workcell integration are not yet demonstrated.++## Recorded material++The latest audited inventory contains 23 unique raw takes before the current live routing take, plus seven reviewed trimmed excerpts. Raw counts include failed/static takes; action cuts and speed variants are not additional recordings. See `videos/inventory.json` and [reviewed clips](build-clips.md).++Use the real placement corrections, native board views, Mouser denial/native-browser comparison, simulated fan state transitions, ground creation and actual route commits. Exclude static setup, the dark fan preview and failed close-up. The Mouser material is a later walkthrough; do not imply uninterrupted original discovery. Fan RPM is simulated, with the existing 0.02× motion display label preserved.++## Proposed sequence++| Time | Story | Evidence needed |+|---|---|---|+| 0:00–0:25 | Why a digitally controlled load belongs in the probing workcell | Clear requirements and board overview |+| 0:25–1:05 | Select a tach-feedback fan and recover sourcing through native browser | Existing sourcing excerpts; exact part page |+| 1:05–1:40 | Build the component twin with off/on/speed behavior | Existing simulated rotor clip; stationary housing |+| 1:40–2:45 | Place, route and correct the two-layer board | Actual placement and routing recordings, bounded 2×–10× cuts |+| 2:45–3:25 | Show connectivity and native design checks | Final saved-board DRC and close-up native views, still pending |+| 3:25–4:10 | Control panel and fan-fault protection | Record clearly labeled simulation until hardware exists |+| 4:10–4:40 | Show package contents and honest next steps | Current wiki assets; cooling and prototype-validation limits |++Times are editorial targets, not recorded durations. Remove idle computation and validation waits. Keep speed labels accurate and inspect actual decoded frames at cut boundaries. Do not publish the private fabrication provider name or its rule pack; use **3rdPartyFab**.++## Missed original moments++The original router debugging, regression-test work and direct AIFlow release were not recorded in an editor. Later explanations or walkthroughs must be labeled as such. Do not recreate those events and present them as original capture.
videos/inventory.jsonadded+145
@@ -0,0 +1,145 @@+{+  "rawTakeCount": 23,+  "reviewedExcerptCount": 7,+  "countingRule": "Unique raw window recording filenames in this project; excludes derivative action/speed exports and reference projects. Raw count includes rejected takes.",+  "takes": [+    {+      "file": "videos/raw/window-1120836-20261008-134401.mp4",+      "durationSeconds": 11.266667,+      "topic": "Native review after adding fan and Kelvin-minus probe pads",+      "review": "contact sheet reviewed; top, oblique and bottom views visible; trimmed normal-speed excerpt prepared; final film not approved"+    },+    {+      "file": "videos/raw/window-138824-20261008-134146.mp4",+      "durationSeconds": 6.9,+      "topic": "Native review after adding fan and Kelvin-minus probe pads",+      "review": "exclude from final action edit: net selection changes too subtle in contact sheet"+    },+    {+      "file": "aiflow/run/window-138824-20261008-134527.mp4",+      "durationSeconds": 11.933333,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "aiflow/run/window-138824-20261008-140325.mp4",+      "durationSeconds": 124.066667,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "aiflow/run/window-138824-20261008-140601.mp4",+      "durationSeconds": 45.4,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "checkpoints/usb-pad-orientation/window-138824-20261008-140620.mp4",+      "durationSeconds": 5.866667,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "aiflow/run/window-138824-20261008-140702.mp4",+      "durationSeconds": 179.0,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "videos/raw/window-200940-20261007-175323.mp4",+      "durationSeconds": 58.433333,+      "topic": "Public linear MOSFET datasheet review",+      "review": "captured; requires edit and decode verification"+    },+    {+      "file": "aiflow/run/window-204360-20261008-141541.mp4",+      "durationSeconds": 1285.066667,+      "topic": "Native bottom GND pour creation and display",+      "review": "captured; final edit review pending"+    },+    {+      "file": "aiflow/run/window-204360-20261008-143932.mp4",+      "durationSeconds": 100.233333,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "videos/raw/window-393534-20261008-113747.mp4",+      "durationSeconds": 10.0,+      "topic": "Native 3D placement review with orbit and side views",+      "review": "contact sheet reviewed; board and changing views visible; final edit not approved"+    },+    {+      "file": "videos/raw/window-5573630-20261008-120401.mp4",+      "durationSeconds": 12.1,+      "topic": "Pup actual Mouser Access Denied page",+      "review": "captured; final edit not approved"+    },+    {+      "file": "videos/raw/window-5573630-20261008-121840.mp4",+      "durationSeconds": 24.266667,+      "topic": "Simulated fan GLB state motion",+      "review": "exclude: dark geometry and oversized axes; superseded"+    },+    {+      "file": "videos/raw/window-5573630-20261008-122523.mp4",+      "durationSeconds": 25.033333,+      "topic": "Simulated fan GLB state motion",+      "review": "exclude: superseded by complete off-on-off sequence"+    },+    {+      "file": "videos/raw/window-5573630-20261008-122709.mp4",+      "durationSeconds": 13.466667,+      "topic": "Simulated fan GLB state motion",+      "review": "contact sheet reviewed; real GLB off, 3000, 7000, off actions; final film not approved"+    },+    {+      "file": "videos/raw/window-591672-20261008-113647.mp4",+      "durationSeconds": 19.25,+      "topic": "Native capacitor moves following DRC rejection",+      "review": "contact sheet reviewed; moves visible; trim static lead-in; final edit not approved"+    },+    {+      "file": "aiflow/run/window-597540-20261008-144312.mp4",+      "durationSeconds": 516.133333,+      "topic": "Four native sense-route commits",+      "review": "captured; final edit review pending"+    },+    {+      "file": "videos/raw/window-597540-20261008-150215.mp4",+      "durationSeconds": 3.166667,+      "topic": "unindexed checkpoint capture",+      "review": "exclude: attempted close-up did not change framing"+    },+    {+      "file": "checkpoints/top-ground/window-597540-20261008-151057.mp4",+      "durationSeconds": 13.2,+      "topic": "unindexed checkpoint capture",+      "review": "automatic/checkpoint take; editorial review pending"+    },+    {+      "file": "videos/raw/window-6491100-20261008-120324.mp4",+      "durationSeconds": 25.85,+      "topic": "Native browser recovered Mouser product page",+      "review": "captured; final edit not approved"+    },+    {+      "file": "videos/raw/window-6491100-20261008-120542.mp4",+      "durationSeconds": 13.75,+      "topic": "Native browser product to manufacturer CAD link walkthrough",+      "review": "captured; final edit not approved"+    },+    {+      "file": "aiflow/run/window-723264-20261007-191656.mp4",+      "durationSeconds": 38.6,+      "topic": "Static component setup",+      "review": "exclude from final demo: contact sheet has no meaningful construction action"+    },+    {+      "file": "videos/raw/window-983810-20261007-182712.mp4",+      "durationSeconds": 30.5,+      "topic": "Native KiCad outline and unplaced components",+      "review": "raw, not approved for final edit"+    }+  ]+}
videos/shotlog.json+26−1
@@ -118,6 +118,31 @@       "topic": "Four native sense-route commits",       "status": "captured; final edit review pending",       "note": "Both Kelvin paths plus bus-voltage and DUT divider branches. Native saved-board DRC zero violations, 202 opens. Contact sheet reviewed; close-up edit review pending."+    },+    {+      "id": "top-ground-16",+      "file": "../checkpoints/top-ground/window-597540-20261008-151057.mp4",+      "topic": "Actual native top ground pour creation",+      "status": "Contact sheet reviewed; creation moment trimmed to 3.7 s; final film not approved"+    },+    {+      "id": "fan-safety-17",+      "file": "raw/window-5642480-20261008-160219.mp4",+      "topic": "Host C safety replay: tach stops, command disabled, feedback returns without restart",+      "status": "Contact sheet reviewed; 6.5 s excerpt prepared; final film not approved",+      "note": "SOFTWARE SIMULATION. Real portable C controller and tach decoder receive synthetic inputs. 13 ms is simulated latency, not a hardware measurement. Recorder timeline repair warning retained."+    },+    {+      "id": "sense-inspection-rejected",+      "file": "raw/window-597540-20261008-150215.mp4",+      "topic": "Attempted sense-route close-up",+      "status": "exclude: menu action did not produce the intended close-up"+    },+    {+      "id": "usb-orientation-review",+      "file": "../checkpoints/usb-pad-orientation/window-138824-20261008-140620.mp4",+      "topic": "USB resistor orientation correction",+      "status": "Contact sheet reviewed; movement too subtle at overview scale; exclude from final action edit"     }   ],   "failed_captures": [@@ -128,4 +153,4 @@       "status": "not a usable captured clip"     }   ]-}\ No newline at end of file+}