for (;;) {
ob= ch->obs.head;
if (!ob) {
- events->cancel_fd(events, ch->fd, OOP_WRITE);
+ if (events)
+ events->cancel_fd(events, ch->fd, OOP_WRITE);
return 0;
}
if (ch->done_of_head == ob->l) {
ch->error(ch,"write log",strerror(errno));
}
}
- if (!ch->obs.head)
+ if (!ch->obs.head && events) /* in simulation, events==0 */
events->on_fd(events, ch->fd, OOP_WRITE, writeable, ch);
LIST_LINK_TAIL(ch->obs, ob);
ch->total += ob->l;
static size_t sevent_buflen;
static SimEventFn *sevent_type;
-static char *sevent_data, *sevent_extrap;
+static char *sevent_data;
static struct timeval sevent_abst;
/*---------- simulation input stream parser ----------*/
return;
}
IF_ET("timer-event", se_timerevent) {
- sevent_extrap= strchr(p,'.');
- if (!sevent_extrap) simbad("missing `.' in timer event name");
- *sevent_extrap++= 0;
sevent_data= p;
return;
}
static void se_timerevent(void) {
TimeoutEvent *toev;
SimTimeout *s;
+ char *delim;
+
+ delim= strchr(sevent_data,'.');
+ if (!delim) simbad("missing `.' in timer event name");
+ *delim= 0;
for (s=simtimeouts; s; s=simtimeouts->l.next) {
toev= s->toev;
if (!strcmp(toev->pclass, sevent_data) &&
- !strcmp(toev->pinst, sevent_extrap))
+ !strcmp(toev->pinst, delim+1))
goto found;
}
- simbad("timeout event not found");
+ *delim='.'; simbad("timeout event not found");
found:
sim_toev_remove(s);
}
static void se_serial(void) {
- int l, buf_used, i;
+ int buf_used;
char c[3], *ep;
const char *p;
- Byte *q;
- l= strlen(sevent_data);
- if (l%2) simbad("odd number of hex digits");
- l /= 2;
+ c[2]= 0;
+ for (p=sevent_data, buf_used=serial_buf.l;
+ ;
+ ) {
+ if (*p==' ') p++;
+ if (!(c[0]= *p++)) break;
+ if (!(c[1]= *p++)) simbad("odd number of hex digits");
- buf_used= serial_buf.l + l;
- if (buf_used > sizeof(serial_buf.d)) simbad("serial_buf overrun");
+ if (buf_used==sizeof(serial_buf.d)) simbad("serial_buf overrun");
- c[2]= 0;
- for (i=0, p=sevent_data, q=serial_buf.d+serial_buf.l; i<l; i++, q++) {
- c[0]= *p++;
- c[1]= *p++;
- *q= strtoul(c,&ep,16);
+ serial_buf.d[buf_used++]= strtoul(c,&ep,16);
if (*ep) simbad("bad hex");
}
serial_indata_process(buf_used);
for (;;) {
sevent();
sevent_type();
+ sevent_type= 0;
obc_tryflush(&cmdi.out);
}
}
#set args --persist-convert-entrails <persist.data.new
#break cmd_movfeat
-set args -s/dev/ttyUSB0 shinkansen.speeds.record homes.record
+set args shinkansen.speeds.record homes.record
break vdie
break nmra_errchk_fail
run
-# valgrind ./realtime -s/dev/ttyUSB0 shinkansen.speeds.record homes.record
-# strace -e read=5 -e write=5 -ot ./realtime -s/dev/ttyUSB0 shinkansen.speeds.record homes.record
+# valgrind ./realtime shinkansen.speeds.record homes.record
+# strace -e read=5 -e write=5 -ot ./realtime shinkansen.speeds.record homes.record