Compare commits
No commits in common. "9cc9edaf291d32cb21bb0c2f156c62fbb06093ba" and "606770f64e5b129b135471ec75d11ddad8da9522" have entirely different histories.
9cc9edaf29
...
606770f64e
2
Makefile
2
Makefile
|
@ -3,7 +3,7 @@ PRGS = padec iFlow iPump iComII iPmon
|
|||
IPRG = aprs485
|
||||
HLOG = aprs485
|
||||
|
||||
%: %.c aprs485.h; gcc -O -Wall -I. -o $* $*.c -lm -mbe32 -g
|
||||
%: %.c aprs485.h; gcc -O -Wall -I. -o $* $*.c -lm
|
||||
|
||||
all: $(PRGS) $(IPRG)
|
||||
|
||||
|
|
86
aprs485.c
86
aprs485.c
|
@ -9,6 +9,8 @@ typedef struct { /* log entry */
|
|||
tmv_t tim;
|
||||
char buf[256-8];
|
||||
} sle_t;
|
||||
void slog(char *fmt, ...);
|
||||
void slog_dump();
|
||||
|
||||
typedef struct {
|
||||
tmv_t tim; /* pwr on time */
|
||||
|
@ -47,6 +49,50 @@ static int tm2yymmdd(struct tm *tm)
|
|||
return (tm->tm_year%100)*10000+(tm->tm_mon+1)*100+tm->tm_mday;
|
||||
}
|
||||
|
||||
void slog(char *fmt, ...)
|
||||
{
|
||||
sle_t *se;
|
||||
int *a, i;
|
||||
|
||||
se = &gl.sles[gl.nsle++];
|
||||
if (gl.nsle >= NEL(gl.sles)) return;
|
||||
gettimeofday(&se->tim,0);
|
||||
a = (int *)&fmt; a++;
|
||||
i = snprintf(se->buf,NEL(se->buf)-1,fmt,a[0],a[1],a[2],a[3],a[4],a[5]);
|
||||
se->buf[i] = 0;
|
||||
}
|
||||
|
||||
void slog_dump()
|
||||
{
|
||||
sle_t *se;
|
||||
int ymd, lf, fd, k;
|
||||
char *p, buf[BUFSIZ], lfn[BUFSIZ];
|
||||
struct tm tm;
|
||||
|
||||
fd = lf = -1;
|
||||
for (se = gl.sles, k = MIN(NEL(gl.sles),gl.nsle); --k >= 0; se++) {
|
||||
p = buf;
|
||||
localtime_r(&se->tim.tv_sec,&tm);
|
||||
ymd = tm2yymmdd(&tm);
|
||||
p += sprintf(p,"%06d",ymd);
|
||||
p += sprintf(p," %02d:%02d:%02d.%03lu",tm.tm_hour,tm.tm_min,tm.tm_sec,se->tim.tv_usec/1000);
|
||||
p += sprintf(p," %.*s",NEL(se->buf),se->buf);
|
||||
if (p[-1] != '\n' && p[-1] != '\r') *p++ = '\n';
|
||||
if (gl.ldir) {
|
||||
if (fd < 0 || lf != ymd) {
|
||||
if (fd >= 0) close(fd);
|
||||
lf = ymd;
|
||||
sprintf(lfn,"%s/%06d.log",gl.ldir,lf);
|
||||
fd = open(lfn,O_WRONLY|O_CREAT|O_APPEND,0644);
|
||||
}
|
||||
if (fd >= 0) write(fd,buf,p-buf);
|
||||
}
|
||||
if (gl.dbug) *p++ = '\r', write(1,buf,p-buf);
|
||||
}
|
||||
if (fd >= 0) close(fd);
|
||||
gl.nsle = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* tab management
|
||||
*/
|
||||
|
@ -93,7 +139,7 @@ int tab_man(soa_t *sa, u08_t *pkb, int pks)
|
|||
break;
|
||||
}
|
||||
if (n < 0) t = 0;
|
||||
else printf("T __ add [%d]\n",t-gl.tabs);
|
||||
else slog("T __ add [%d]",t-gl.tabs);
|
||||
}
|
||||
pkb[0] = t ? ACK : NAK;
|
||||
pkb[1] = t ? (t-gl.tabs) : NEL(gl.tabs);
|
||||
|
@ -104,7 +150,7 @@ int tab_man(soa_t *sa, u08_t *pkb, int pks)
|
|||
if (t == gl.tsnd) gl.tsnd = 0;
|
||||
t->pwr = 0;
|
||||
pkb[0] = ACK;
|
||||
printf("T __ del [%d]\n",t-gl.tabs);
|
||||
slog("T __ del [%d]",t-gl.tabs);
|
||||
}
|
||||
else pkb[0] = NAK;
|
||||
return 2;
|
||||
|
@ -124,7 +170,7 @@ void snd2tabs(int sd, tab_t *ts, u08_t *pkb, int pks)
|
|||
k = sendto(sd,pkb,pks,0,&t->adr.sa,sizeof(t->adr.sa));
|
||||
if (k != pks) {
|
||||
t->pwr = 0;
|
||||
printf("T __ drop [%d] %s\n",t-gl.tabs,k<0?strerror(errno):"");
|
||||
slog("T __ drop [%d] %s",t-gl.tabs,k<0?strerror(errno):"");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -151,14 +197,14 @@ void usr_in(fd)
|
|||
char buf[32];
|
||||
|
||||
if ((k = read(fd,buf,sizeof(buf))) != 1) {
|
||||
printf("E __ term read()=%d %s\n",k,k<0?strerror(errno):"");
|
||||
slog("E __ term read()=%d %s",k,k<0?strerror(errno):"");
|
||||
gl.exit = 1;
|
||||
return;
|
||||
}
|
||||
switch (buf[0]) {
|
||||
default: printf("D __ hit <Escape> to exit\n"); break;
|
||||
default: slog("D __ hit <Escape> to exit"); break;
|
||||
case ESC: gl.exit = 1; break;
|
||||
case 'D': gl.lprd ^= 1; printf("D __ log partial read %d now\n",gl.lprd); break;
|
||||
case 'D': gl.lprd ^= 1; slog("D __ log partial read %d now",gl.lprd); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -171,16 +217,16 @@ void bus_in(int bd)
|
|||
char hb[128];
|
||||
|
||||
if ((k = NEL(gl.brcv) - gl.nrcv) <= 0) {
|
||||
printf("E __ bus buffer overrun drop %d bytes\n",gl.nrcv);
|
||||
slog("E __ bus buffer overrun drop %d bytes",gl.nrcv);
|
||||
gl.nrcv = 0; /* drop everything */
|
||||
k = NEL(gl.brcv);
|
||||
}
|
||||
if ((k = read(bd,&gl.brcv[gl.nrcv],k)) <= 0) {
|
||||
printf("E __ bus read()=%d %s\n",k,k<0?strerror(errno):"disconnect!");
|
||||
slog("E __ bus read()=%d %s",k,k<0?strerror(errno):"disconnect!");
|
||||
gl.exit = 1;
|
||||
return;
|
||||
}
|
||||
if (gl.lprd) printf("r %2d %s\n",k,hex(&gl.brcv[gl.nrcv],k,hb,sizeof(hb)));
|
||||
if (gl.lprd) slog("r %2d %s",k,hex(&gl.brcv[gl.nrcv],k,hb,sizeof(hb)));
|
||||
gl.nrcv += k;
|
||||
}
|
||||
|
||||
|
@ -191,9 +237,9 @@ void bus_out(int sd, int bd)
|
|||
char hb[UDPSIZ*2+4];
|
||||
|
||||
if ((t = gl.tsnd) == 0) return;
|
||||
printf("S %2d %s\n", t->pks, hex(t->pkb, t->pks, hb, sizeof(hb)));
|
||||
slog("S %2d %s",t->pks,hex(t->pkb,t->pks,hb,sizeof(hb)));
|
||||
if ((k = write(bd,t->pkb,t->pks)) != t->pks) {
|
||||
printf("E __ bus write(%d)=%d %s",t->pks,k,k<0?strerror(errno):"");
|
||||
slog("E __ bus write(%d)=%d %s",t->pks,k,k<0?strerror(errno):"");
|
||||
if (k < 0) gl.exit = 1;
|
||||
}
|
||||
else snd2tabs(sd,t,t->pkb,t->pks);
|
||||
|
@ -269,7 +315,7 @@ void srv_client(int sd, soa_t *fa, int na, char **av)
|
|||
else {
|
||||
sendto(sd,EOT_STR,2,0,&t->adr.sa,sizeof(t->adr.sa));
|
||||
t->pwr = 0;
|
||||
printf("T __ kill [%d]\n",t-gl.tabs);
|
||||
slog("T __ kill [%d]",t-gl.tabs);
|
||||
a += sprintf(a,"done");
|
||||
}
|
||||
}
|
||||
|
@ -301,7 +347,7 @@ void soc_in(int sd)
|
|||
pks = recvfrom(sd,pkb,sizeof(pkb)-4,0,&fa.sa,&len);
|
||||
if (pks <= 0) {
|
||||
if (++gl.esin >= 3) gl.exit = 1;
|
||||
printf("E __ socket read()=%d %s\n",pks,pks<0?strerror(errno):"");
|
||||
slog("E __ socket read()=%d %s",pks,pks<0?strerror(errno):"");
|
||||
return;
|
||||
}
|
||||
gl.esin = 0;
|
||||
|
@ -342,11 +388,11 @@ void soc_out(int sd)
|
|||
if ((n = gl.nrcv) > 2) {
|
||||
for (i = 0; i < n; i += k) {
|
||||
k = a5end(gl.brcv+i,n-i);
|
||||
printf("R %2d %s\n", k, hex(gl.brcv+i, k, hb, sizeof(hb)));
|
||||
slog("R %2d %s",k,hex(gl.brcv+i,k,hb,sizeof(hb)));
|
||||
snd2tabs(sd,0,gl.brcv+i,k);
|
||||
}
|
||||
}
|
||||
else printf("E %2d %s noise?\n",n,hex(gl.brcv,n,hb,sizeof(hb)));
|
||||
else slog("E %2d %s noise?",n,hex(gl.brcv,n,hb,sizeof(hb)));
|
||||
gl.nrcv = 0;
|
||||
}
|
||||
|
||||
|
@ -368,13 +414,14 @@ int bridge(int bd, int sd)
|
|||
FD_SET(sd,&pfds);
|
||||
md = MAX(bd,sd) + 1;
|
||||
ct = lt = -1;
|
||||
printf("B __ %s bus:%s\n", version+5, gl.bus);
|
||||
slog("B __ %s bus:%s",version+5,gl.bus);
|
||||
while (!gl.exit) {
|
||||
gettimeofday(&tc,0);
|
||||
if ((ct = (tc.tv_sec%(60*60))/MTICK) != lt) { /* mark tick */
|
||||
if (lt >= 0) printf("M __ %s bus:%s\n", version+5, gl.bus);
|
||||
if (lt >= 0) slog("M __ %s bus:%s",version+5,gl.bus);
|
||||
lt = ct;
|
||||
}
|
||||
slog_dump();
|
||||
tv.tv_sec = tv.tv_usec = 0;
|
||||
if (gl.nrcv <= 0 && gl.tsnd == 0) {
|
||||
tv.tv_sec = ((tc.tv_sec/MTICK)+1)*MTICK;
|
||||
|
@ -385,7 +432,7 @@ int bridge(int bd, int sd)
|
|||
rfds = pfds;
|
||||
if ((n = select(md,&rfds,0,0,&tv)) < 0) {
|
||||
if (++gl.esel >= 3) gl.exit = 1;
|
||||
printf("E __ select() %s\n",strerror(errno));
|
||||
slog("E __ select() %s",strerror(errno));
|
||||
continue;
|
||||
}
|
||||
gl.esel = 0;
|
||||
|
@ -400,7 +447,8 @@ int bridge(int bd, int sd)
|
|||
}
|
||||
}
|
||||
snd2tabs(sd,0,(u08_t *)EOT_STR,2);
|
||||
printf("X __ %s bus:%s\n",version+5,gl.bus);
|
||||
slog("X __ %s bus:%s",version+5,gl.bus);
|
||||
slog_dump();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue