chiark / gitweb /
implemented actual_polarity_* now
authorian <ian>
Mon, 19 Jun 2006 16:54:51 +0000 (16:54 +0000)
committerian <ian>
Mon, 19 Jun 2006 16:54:51 +0000 (16:54 +0000)
hostside/Makefile
hostside/actual.c
hostside/realtime.c
hostside/realtime.h
layout/data2safety

index d4b1c0f155c1565e425594810a3fa29944f9317e..8908f19c2e70182fd2c984fbfc0082d31c38d5e2 100644 (file)
@@ -23,6 +23,7 @@ on-bessar:    $(TARGETS)
                RSYNC_RSH=fsh rsync $^ $(BESSAR)
 
 realtime:      realtime.o startup.o cdumgr.o safety.o trackloc.o       \
+                actual.o                                               \
                 cmdinput.o obc.o eventhelp.o                           \
                 utils.o serialio.o parseutils.o auproto-pic.o          \
                 ../layout/ours.layout-data.o                           \
index d97195b32bb15b6a45540758300da1f57d2a0154..ef86d3a10615c0451d9873134fc969c62652e698 100644 (file)
@@ -3,16 +3,51 @@
  * implementation of safety algorithm's decisions
  */
 
-static int maxbytechange;
+#include "realtime.h"
+
 static PicInsn polarityinsn= { { 0x90 }, 0 };
 
+#define SEG                                            \
+  const SegmentInfo *segi= &info_segments[segn];
+
+#define OPONBIT_BYTE (polarityinsn.d[bytenum])
+#define OPONBIT(body) do{                              \
+    BoardObject bo;                                    \
+    int bytenum, bitnum;                               \
+    Byte bitv;                                         \
+                                                       \
+    bo= segi->invert;                                  \
+    assert(bo);                                                \
+    bytenum= (bo + 3) / 7;                             \
+    bitnum= bytenum ? 6 - (bo + 3) % 7 : 3 - bo;       \
+    bitv= 1u << bitnum;                                        \
+                                                       \
+    { body }                                           \
+  }while(0)
+
+int picinsn_polarity_testbit(const PicInsn *pi, SegmentNum segn) {
+  SEG;
+  OPONBIT({
+    return !!(OPONBIT_BYTE & bitv);
+  });
+}
+
 void actual_inversions_start(void) {
-  polarityinsn.l= 0;
+  polarityinsn.l= (info_maxreverse + 4 + 6) / 7;
 }
 
-void actual_inversions_done(void) {
-  if (polarityinsn.l)
-    serial_transmit(&polarityinsn);
+void actual_inversions_segment(SegmentNum segn) {
+  SEG;
+  State *s= &safety_state;
+  const SegmentState *seg= &s->segments[segn];
+  
+  OPONBIT({
+    Byte *insnbyte= &OPONBIT_BYTE;
+    if (seg->seg_inverted) *insnbyte |= bitv;
+    else *insnbyte &= ~bitv;
+  });
 }
 
-void actual_inversions_segment(SegmentNum);
+void actual_inversions_done(void) {
+  serial_transmit(&polarityinsn);
+}
index d94598e75ccadc88a214f061467462ead92deea8..4827ab358450d6b40e8f0f237f34789066cf8bb1 100644 (file)
@@ -114,13 +114,28 @@ void serial_transmit(const PicInsn *pi) {
   const PicInsnInfo *pii;
   int objnum;
 
-  fixme decode polarity
-  picinsn_decode(pi, pic_command_infos, &pii, &objnum);
-
-  if (!pii)
-    oprintf(UPO, "picio out unknown\n");
-  else
-    oupicio("out",pii,objnum);
+  if ((pi->d[0] & 0xf8) == 0x90) {
+    SegmentNum segn;
+    const SegmentInfo *segi;
+    const char *delim;
+    
+    oprintf(UPO,"picio out polarity <");
+    for (segn=0, segi=info_segments, delim="";
+        segn < info_nsegments;
+        segn++, segi++) {
+      if (!segi->invertible) continue;
+      if (!picinsn_polarity_testbit(pi,segn)) continue;
+      oprintf(UPO,"%s%s", delim, segi->pname);
+      delim= ",";
+    }
+    oprintf(UPO,">\n");
+  } else {
+    picinsn_decode(pi, pic_command_infos, &pii, &objnum);
+    if (!pii)
+      oprintf(UPO, "picio out unknown\n");
+    else
+      oupicio("out",pii,objnum);
+  }
 
   ouhex("picioh out", pi->d, pi->l);
 
index fbaafb65db2c8c2036079c28d32e692638885563..8738277d0da6d291ad77a53c1a5346eb0938fb2b 100644 (file)
@@ -74,6 +74,12 @@ void ouhex(const char *word, const Byte *command, int length);
 
 void serial_transmit(const PicInsn *pi);
 
+/*---------- from actual.c ----------*/
+
+int picinsn_polarity_testbit(const PicInsn *pi, SegmentNum segn);
+  /* this belongs in {au,skel}proto-pic.[ch] really but it's
+   * more convenient here. */
+
 /*---------- tbi ----------*/
 
 void abandon_run(void);
index 0d4cbaeea889a1c0779d2cb16a98cc26c1090c51..c6037ca9f5dd5ef08d15cf7e5e4c4f30a61f9444 100755 (executable)
@@ -491,7 +491,7 @@ sub writeout () {
        $delim= ',';
     }
     o("\n};\n");
-    o("const BoardObject info_maxreverse=$maxreverseobjnum;\n");
+    o("const BoardObject info_maxreverse= $maxreverseobjnum;\n");
 }
 
 # writeasm_KIND()