From: ian Date: Sun, 11 May 2008 11:37:41 +0000 (+0000) Subject: New manual mode X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=32b1f0dc0990f788510c96914332734e16bd468f;p=trains.git New manual mode --- diff --git a/hostside/movpos.c b/hostside/movpos.c index 4b77d7c..706f21e 100644 --- a/hostside/movpos.c +++ b/hostside/movpos.c @@ -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; diff --git a/hostside/realtime.c b/hostside/realtime.c index e5adf65..d2c83bb 100644 --- a/hostside/realtime.c +++ b/hostside/realtime.c @@ -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"); diff --git a/hostside/realtime.h b/hostside/realtime.h index 065f1c0..fafa15d 100644 --- a/hostside/realtime.h +++ b/hostside/realtime.h @@ -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 ----------*/ diff --git a/hostside/retransmit.c b/hostside/retransmit.c index 52aaa9c..0a60bfd 100644 --- a/hostside/retransmit.c +++ b/hostside/retransmit.c @@ -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]); } diff --git a/hostside/startup.c b/hostside/startup.c index 42ff813..27091a0 100644 --- a/hostside/startup.c +++ b/hostside/startup.c @@ -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: diff --git a/hostside/stastate.h.gen b/hostside/stastate.h.gen index 91a2405..951921f 100755 --- a/hostside/stastate.h.gen +++ b/hostside/stastate.h.gen @@ -5,6 +5,7 @@ Sta () { l="$l $1"; } Sta Flush Sta Off + Sta Manual Sta Ping Sta Fault Sta Settling