chiark / gitweb /
fire points for 20ms; recharge for 300ms
authorian <ian>
Sat, 24 May 2008 00:43:53 +0000 (00:43 +0000)
committerian <ian>
Sat, 24 May 2008 00:43:53 +0000 (00:43 +0000)
detpic/points.asm
detpic/program.clocks
hostside/commands.c
hostside/movpos.c
hostside/safety.h
hostside/speed.c

index 4b3732c1e1ba8c202f58eab4237ca7848475410f..e36ce94235f5a368b22d8111dcafbe82489f6c1e 100644 (file)
@@ -22,7 +22,7 @@
 ; cducharging only counts if the cdu is enabled
 ;  (according to CDU Enable LAT bit)
 
-cdu_timeout    equ     200 ; ms
+cdu_timeout    equ     300 ; ms
 cdu_inittimeout        equ     750 ; ms
 
 ptix2latbit equ 0x300 ; has to be a multiple of 0x100
index fc70a0c3a5ca3f4283679e871177ce0a6dc5f42e..78c97ffb311cddc79311ae304ab15f9b0bc79dda 100644 (file)
@@ -13,7 +13,7 @@
 # M and S mean generate <name>_{master,slave}_<things> respectively
 # T means generate <name>_{us,ms}
 
-points         MS      T3ov            10ms
+points         MS      T3ov            20ms
 tick           MST     T2period        1ms
 nmra           M       T0ov8           58us-10cy
 
index f590ce43fc6d55c022c93f378348c70a2eba3bd8..a23d4c590bfe8a25d4f5462ed63fc64e3d9829fa 100644 (file)
@@ -280,7 +280,11 @@ static int cmd_speed(ParseState *ps, const CmdInfo *ci) {
   MUSTECR( ps_neednumber(ps,&speed,0,126,"speed step") );
   MUSTECR( ps_neednoargs(ps) );
 
-  MUSTECRPREDICT( speedmanager_speedchange_request(tra,speed,CMDPPC) );
+  if (ci->xarg & CIXF_FORCE) {
+    actual_speed(tra,speed);
+  } else {
+    MUSTECRPREDICT( speedmanager_speedchange_request(tra,speed,CMDPPC) );
+  }
 
   return 0;
 }
@@ -339,5 +343,6 @@ const CmdInfo toplevel_cmds[]= {
   { "!movpos",    cmd_movpos,     CIXF_ANYSTA|CIXF_FORCE   },
   { "!invert",    cmd_invert,     CIXF_ANYSTA|CIXF_FORCE   },
   { "speed",      cmd_speed                                },
+  { "!speed",     cmd_speed,      CIXF_ANYSTA|CIXF_FORCE   },
   { 0 }
 };
index 8d31f08994f62a2f8de8a8cc3120a16df52649a9..83d4bcaaed2e06b77b27820a4b27359eaad74644 100644 (file)
@@ -546,7 +546,7 @@ static void fsq_all_abandon(Method *mm) {
  *
  */
 
-#define CDU_RECHARGE   250 /*ms*/
+#define CDU_RECHARGE   350 /*ms*/
 #define POINT_MOVEMENT  50 /*ms*/
 
 static Change *point_allocate(Method *mm, int alloc_motions) {
index 64abf9e99dc56b15aeddb448a34c9f413d0511df..87305c4771561beaa620dfc78e2f235c169bfc16 100644 (file)
@@ -232,6 +232,8 @@ double speedmanager_speed_maxestimate(Train *tra, struct timeval tnow);
 double speedmanager_stoppingdistance(Train *tra, struct timeval tnow);
 int speedmanager_stopping(Train *tra);
 
+void actual_speed(Train *tra, int step);
+
 /*========== actual.c ==========*/
 /* actual.c should only be called from safety.c.
  * It is responsible for communicating with the PICs, including
index 9341dc73d1fc71388460e39ed8b8fecac894c503..4ad15aecb78f65bf483e102a4a2dcf7579236305 100644 (file)
@@ -6,12 +6,16 @@
 #include "realtime.h"
 #include "nmra.h"
 
-static void xmit(Train *tra) {
+void actual_speed(Train *tra, int step) {
   Nmra n;
-  enco_nmra_speed126(&n, tra->addr, tra->speed.step, tra->backwards);
+  enco_nmra_speed126(&n, tra->addr, step, tra->backwards);
   retransmit_urgent_requeue(&tra->speed.rn, &n);
 }
 
+static void xmit(Train *tra) {
+  actual_speed(tra,tra->speed.step);
+}
+
 static void decel_done(TimeoutEvent *toev) {
   Train *tra= (void*)((char*)toev - offsetof(Train, speed.decel));
   tra->speed.speed= tra->speedcurve[tra->speed.step];