chiark / gitweb /
New manual mode
authorian <ian>
Sun, 11 May 2008 11:37:41 +0000 (11:37 +0000)
committerian <ian>
Sun, 11 May 2008 11:37:41 +0000 (11:37 +0000)
hostside/movpos.c
hostside/realtime.c
hostside/realtime.h
hostside/retransmit.c
hostside/startup.c
hostside/stastate.h.gen

index 4b77d7c64f5b0c6fc3f2d809e8780e12eb51fee9..706f21ef8be6c6e73d9b2d092f7a7d7c9e49dcba 100644 (file)
@@ -630,19 +630,24 @@ static void waggle_settle_check(void) {
   }
 }
 
+void waggle_startup_manual(void) {
+  waggle.f.ready= 1;
+}
+
 void waggle_settle(void) {
   waggle.f.ready= 1;
   waggle_settle_check();
 }
   
 void on_pic_waggled(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
-  if (sta_state < Sta_Settling) return;
-
-  waggle.f.ready= 1;
-  if (sta_state >= Sta_Resolving) { fsq_check_action(&waggle); return; }
-
-  assert(sta_state == Sta_Settling);
-  waggle_settle_check();
+  if (sta_state == Sta_Settling) {
+    waggle.f.ready= 1;
+    waggle_settle_check();
+  } else if (sta_state >= Sta_Resolving || sta_state == Sta_Manual) {
+    waggle.f.ready= 1;
+    fsq_check_action(&waggle);
+    return;
+  }
 }
 
 static FsqMethod relays_method= {
@@ -686,7 +691,7 @@ static Method *methods[]= {
 
 static Change *mp_allocate(Method *meth, Segment *move,
                           int alloc_motions, MovPosComb target) {
-  assert(sta_state >= Sta_Resolving);
+  assert(sta_state >= Sta_Resolving || sta_state == Sta_Manual);
   Change *chg= meth->allocate(meth, alloc_motions);
   chg->meth=      meth;
   chg->move=      move;
index e5adf6534660a8d5abcc4de997710f95b3ef76a0..d2c83bb565d9c5aa38d23461d17290f9d02ba5d8 100644 (file)
@@ -331,6 +331,7 @@ int main(int argc, const char **argv) {
     case 's': device= arg; break;
     case 'p': persist_fn= arg; break;
     case 'v': picio_send_noise= atoi(arg); break;
+    case 'm': sta_state= Sta_Manual; break;
     case 'L': logcopy_fn= arg; break;
     case 'S': simulate= arg; break;
     default: badusage("unknown option");
index 065f1c0da794bfdb0876388c10be6fd4b72a5864..fafa15d96827414f51b31b02bef9e32a85349c61 100644 (file)
@@ -134,6 +134,7 @@ int resolve_complete(void);
 void resolve_motioncheck(void);
 
 void waggle_settle(void); /* from movpos.c */
+void waggle_startup_manual(void);
 
 /*---------- from/for record.c and persist.c ----------*/
 
index 52aaa9c20ef2dbab9ad68e86bca8b9940c1fed99..0a60bfdaea721487cba24f57c90a02cc9db8c2f5 100644 (file)
@@ -141,9 +141,10 @@ void retransmit_urgent_cancel(RetransmitUrgentNode *urg) {
 
 void on_pic_nmradone(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
   if (!objnum) die("PIC sent NUL!");
-  if (sta_state <= Sta_Settling) return;
-  if (sta_state != Sta_Run) die("PIC sent NMRADONE in Resolving");
-
-  while (objnum--)
-    retransmit_something();
+  if (sta_state == Sta_Run || sta_state == Sta_Manual)
+    while (objnum--)
+      retransmit_something();
+  else
+    if (sta_state > Sta_Settling)
+      die("PIC sent NMRADONE in %s", stastatelist[sta_state]);
 }
index 42ff8138af36e240deb332235a99cdf7bf666c3b..27091a081acb37f904cce9e9f5bbc5d5832948ce 100644 (file)
@@ -47,7 +47,14 @@ oprintf(DUPO("ip") " %ld.%06ld\n", now.tv_sec, now.tv_usec);
   timefor_ping(0);
 }
 
-void sta_startup(void) { sta_goto(Sta_Flush); }
+void sta_startup(void) {
+  if (sta_state != Sta_Manual) {
+    sta_goto(Sta_Flush);
+  } else {
+    waggle_startup_manual();
+    retransmit_start();
+  }
+}
 void sta_finalising_done(void) { sta_goto(Sta_Run); }
 
 static void sta_goto(StartupState new_state) {
@@ -66,6 +73,7 @@ static void sta_goto(StartupState new_state) {
   switch (new_state) {
   case Sta_Flush:      sta_toev.duration=   300;   break;
   case Sta_Off:                                    break;
+  case Sta_Manual:                                 abort();
   case Sta_Ping:                                   break;
   case Sta_Fault:                                  break;
   case Sta_Settling:   sta_toev.duration=   750;   break;
@@ -83,6 +91,7 @@ static void sta_goto(StartupState new_state) {
   switch (new_state) {
   case Sta_Flush:                                                  break;
   case Sta_Off:   if (sta_state > Sta_Ping) enco_pic_off(&piob);   break;
+  case Sta_Manual:                                                 abort();
   case Sta_Ping:                                                   break;
   case Sta_Fault:                                                  break;
   case Sta_Settling:   waggle_settle();     enco_pic_off(&piob);   break;
@@ -140,7 +149,8 @@ void serial_moredata(PicInsn *buf) {
   }
   if (PICMSG_HELLO_P(buf->d[0])) {
     ouhexi("picioh in hello", buf->d, 1);
-    sta_goto(Sta_Flush);
+    if (sta_state != Sta_Manual)
+      sta_goto(Sta_Flush);
     buf->l= 1;
     return;
   }
@@ -150,7 +160,7 @@ void serial_moredata(PicInsn *buf) {
     return;
   }
 
-  assert(sta_state >= Sta_Ping);
+  assert(sta_state >= Sta_Manual);
   /* So, we are expecting properly formed messages. */
   
   for (ep= buf->d; ep < buf->d + buf->l; ep++)
@@ -182,6 +192,9 @@ void serial_moredata(PicInsn *buf) {
 }
 
 void on_pic_pong(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
+  if (sta_state == Sta_Manual)
+    return;
+
   if (objnum != ping_seq)
     die("PIC sent wrong ping response (0x%x, wanted 0x%x)", objnum, ping_seq);
 
@@ -249,6 +262,7 @@ void on_pic_detect1(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
   switch (sta_state) {
   case Sta_Flush:
   case Sta_Off:
+  case Sta_Manual:
   case Sta_Ping:
   case Sta_Fault:
   case Sta_Settling:
index 91a24056799a732e329c471a64f4c4f16c808c28..951921f78ebf838a531f8d69a678b1397eb12374 100755 (executable)
@@ -5,6 +5,7 @@ Sta () { l="$l $1"; }
 
   Sta Flush
   Sta Off
+  Sta Manual
   Sta Ping
   Sta Fault
   Sta Settling