chiark / gitweb /
do not loop too much in waggle_settle_*
authorian <ian>
Sun, 11 May 2008 22:04:06 +0000 (22:04 +0000)
committerian <ian>
Sun, 11 May 2008 22:04:06 +0000 (22:04 +0000)
hostside/movpos.c

index ead666d464f5cb40f59b353cc7d1cbdc80ef6109..624705210c9c2c7e250af3efbc293909e8e91145 100644 (file)
@@ -613,20 +613,26 @@ static void waggle_do(FsqMethod *m, const MovFeatInfo *mfi, int posn) {
   serial_transmit(&piob);
 }
 
+static SegmentNum waggle_settle_seg;
+static int waggle_settle_feat;
+
 static void waggle_settle_check(void) {
-  SEG_IV;
-  int feat;
-  
-  FOR_SEG {
-    if (seg->movposcomb<0) continue;
-    for (feat=0; feat < seg->i->n_movfeats; feat++) {
-      const MovFeatInfo *feati= &seg->i->movfeats[feat];
-      if (feati->kind != mfk_relay) continue;
-      assert(feati->posns==2);
-      waggle.f.ready= 0;
-      waggle_do(&waggle, feati, (seg->movposcomb / feati->weight) & 1);
-      return;
+  for (;;) {
+    if (waggle_settle_seg >= info_nsegments) return;
+
+    Segment *seg= &segments[waggle_settle_seg];
+    if (waggle_settle_feat >= seg->i->n_movfeats) {
+      waggle_settle_seg++; waggle_settle_feat=0; continue;
+    }
+
+    const MovFeatInfo *feati= &seg->i->movfeats[waggle_settle_feat];
+    if (feati->kind != mfk_relay) {
+      waggle_settle_feat++; continue;
     }
+
+    waggle.f.ready= 0;
+    waggle_do(&waggle, feati, (seg->movposcomb / feati->weight) & 1);
+    waggle_settle_feat++;
   }
 }
 
@@ -635,6 +641,8 @@ void waggle_startup_manual(void) {
 }
 
 void waggle_settle(void) {
+  waggle_settle_seg= 0;
+  waggle_settle_feat= 0;
   waggle.f.ready= 1;
   waggle_settle_check();
 }