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 \
* 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);
+}
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);
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);
$delim= ',';
}
o("\n};\n");
- o("const BoardObject info_maxreverse=$maxreverseobjnum;\n");
+ o("const BoardObject info_maxreverse= $maxreverseobjnum;\n");
}
# writeasm_KIND()