From 1665fbf95fb9c804f6e5b10433c11b26e22f2bd2 Mon Sep 17 00:00:00 2001 From: ian Date: Mon, 19 Jun 2006 16:54:51 +0000 Subject: [PATCH] implemented actual_polarity_* now --- hostside/Makefile | 1 + hostside/actual.c | 47 +++++++++++++++++++++++++++++++++++++++------ hostside/realtime.c | 29 +++++++++++++++++++++------- hostside/realtime.h | 6 ++++++ layout/data2safety | 2 +- 5 files changed, 71 insertions(+), 14 deletions(-) diff --git a/hostside/Makefile b/hostside/Makefile index d4b1c0f..8908f19 100644 --- a/hostside/Makefile +++ b/hostside/Makefile @@ -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 \ diff --git a/hostside/actual.c b/hostside/actual.c index d97195b..ef86d3a 100644 --- a/hostside/actual.c +++ b/hostside/actual.c @@ -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); +} diff --git a/hostside/realtime.c b/hostside/realtime.c index d94598e..4827ab3 100644 --- a/hostside/realtime.c +++ b/hostside/realtime.c @@ -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); diff --git a/hostside/realtime.h b/hostside/realtime.h index fbaafb6..8738277 100644 --- a/hostside/realtime.h +++ b/hostside/realtime.h @@ -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); diff --git a/layout/data2safety b/layout/data2safety index 0d4cbae..c6037ca 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -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() -- 2.30.2