 
   bool run_next_protocol(Protocol *ps, Dura d) {
     Protocol *p = ps + who;
-    pin_low();
+    pin_off(p);
     if (p->next < 255) {
       p = ps + p->next;
-      pin_off(ps);
+      pin_off(p);
       runlevel = C_WAIT;
       t = p->t; t += d;
       yn = p->d; yn += d;
     }
     else {
       who = 255;
+      digitalWrite(pin, LOW);
       runlevel = C_ZZZ;
-      disabled = 1;
       return false;
     }
   }
+
+  bool alive() { return runlevel != C_ZZZ && who != 255; }
 
   Dura advance(Dura d, Protocol *ps) {
     bool started_yn = false;
     bool started_pq = false;
 tail_recurse:
-    if (disabled || runlevel == C_ZZZ) return (Dura){0,0};
+    if (!alive()) return (Dura){0,0};
     if (runlevel == C_WAIT) {
       // Only relevant times are c->t and c->yn
       Dura *x = (yn < t) ? &yn : &t;

      default:
        error_with_message("Command not valid (setting): ", (char*)buf, 2);
    }
    bufi = shift_buffer(buf, bufi, 2);
  }
}


      default:
        error_with_message("Channel command not valid (running): ", (char*)buf, 3);
    }
    discard_buf(3);
  }
  else {
    switch(b) {
