# HG changeset patch # User nobody_special # Date 1618276338 14400 # Node ID aa698b41897d6eb1323cce718c7dc8bd290ac174 # Parent 85895476fecf64c5c4ad3334fb6fa4430aae5816 scat(7): get DSS plates from the web diff -r 85895476fecf -r aa698b41897d sys/src/cmd/scat/display.c --- a/sys/src/cmd/scat/display.c Tue Mar 02 22:56:58 2021 -0500 +++ b/sys/src/cmd/scat/display.c Mon Apr 12 21:12:18 2021 -0400 @@ -4,6 +4,66 @@ #include #include "sky.h" +char *dssfmt = "https://archive.stsci.edu/cgi-bin/dss_search?v=poss2ukstu_red&r=%s&d=%s&e=J2000&h=%s&w=%s&f=gif"; + +/* BUGS: Plenty more than what's listed here. + * - foolishly hardcoded block sizes to malloc(), + * - web connection is discarded but perhaps it should be kept persistent, + * - retreived plate is grayscale. DSS red and blue filters could potentially + * be combined (with an interpolated green channel) to create false-color + * plates. + */ +void +webplate(char *ra, char *dec, char *h, char *w) +{ + char *url, *ndir, *path; + int fd, many; + Dir *wdir; + + wdir = dirstat("/mnt/web/"); + + if(!wdir) { + fprint(2, "webfs expected at /mnt/web/\n"); + goto webOut; + } + + if((fd = open("/mnt/web/clone", ORDWR)) < 0) { + fprint(2, "failed to clone web connection.\n"); + goto webOut; + } + + ndir = malloc(6); + many = read(fd, ndir, 6); + ndir[many-1] = '\0'; + + url = malloc(250); + path = malloc(250); + sprint(url, dssfmt, ra, dec, h, w); + sprint(path, "/mnt/web/%s/body", ndir); + + print("Fetching plate from:\n%s\n", url); + + fprint(fd, "url %s", url); + + switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){ + case -1: + fprint(2, "fork failed retreiving plate from web: %r\n"); + break; + case 0: + execl("/bin/page", "page", "-w", path, nil); + fprint(2, "exec failed: %r\n"); + exits("exec page"); + default: + break; + } + + free(url); + free(ndir); + free(path); +webOut: + free(wdir); +} + void displaypic(Picture *pic) { diff -r 85895476fecf -r aa698b41897d sys/src/cmd/scat/scat.c --- a/sys/src/cmd/scat/scat.c Tue Mar 02 22:56:58 2021 -0500 +++ b/sys/src/cmd/scat/scat.c Mon Apr 12 21:12:18 2021 -0400 @@ -988,12 +988,27 @@ Bprint(&bout, " x %s\n", ms(decsize)); Bflush(&bout); flatten(); + +/* drag scat(7) into the 21st century */ + if(rasize <= 0 || decsize <=0) { + Bprint(&bout, "Plate too small, expanding to 15'x15'\n"); + rasize = RAD(0.25); + decsize = RAD(0.25); + } + + Bflush(&bout); + + webplate(hms(racenter), dms(deccenter), ms(rasize), ms(decsize)); + +/* Skip old codepath for calling up DSS plates from jukebox */ +/* pic = image(racenter, deccenter, rasize, decsize); if(pic == 0) return; Bprint(&bout, "plate %s locn %d %d %d %d\n", pic->name, pic->minx, pic->miny, pic->maxx, pic->maxy); Bflush(&bout); displaypic(pic); +*/ } void diff -r 85895476fecf -r aa698b41897d sys/src/cmd/scat/sky.h --- a/sys/src/cmd/scat/sky.h Tue Mar 02 22:56:58 2021 -0500 +++ b/sys/src/cmd/scat/sky.h Mon Apr 12 21:12:18 2021 -0400 @@ -391,6 +391,7 @@ extern Angle getdec(char*); extern void getplates(void); extern Img* dssread(char*); +extern void webplate(char*, char*, char*, char*); extern void hinv(Pix*, int, int); extern int input_bit(Biobuf*); extern int input_nbits(Biobuf*, int);