From: ian Date: Sun, 11 May 2008 22:04:06 +0000 (+0000) Subject: do not loop too much in waggle_settle_* X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=726f379b806537b23a64351c106435debf4b08df;p=trains.git do not loop too much in waggle_settle_* --- diff --git a/hostside/movpos.c b/hostside/movpos.c index ead666d..6247052 100644 --- a/hostside/movpos.c +++ b/hostside/movpos.c @@ -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(); }