ref: 53c0208f4caf8701189484e6125821f69e249f94
parent: aeb153cdd6cb37dc1e9d61b22a92430a756ddeb5
author: rodri <[email protected]>
date: Mon May 13 11:16:46 EDT 2024
solar: add a button to select the ephemeris date.
--- a/solar.c
+++ b/solar.c
@@ -81,7 +81,7 @@
{
char *label;
Rectangle r;
- void (*handler)(Cmdbut*, Mousectl*);
+ void (*handler)(Cmdbut*);
};
struct Cmdbox
@@ -122,6 +122,7 @@
{ .id = 9, .name = "Pluto", .scale = 0.166666 },
};
char stats[Se][256];
+char datefmt[] = "YYYY-MM-DD";
Rectangle viewr, cmdr;
Cmdbox cmdbox;
Image *screenb;
@@ -129,6 +130,8 @@
Keyboardctl *kctl;
Channel *drawc;
int kdown;
+Tm date;
+char datestr[16];
Model *model;
Scene *scene;
double θ, ω = 0;
@@ -178,17 +181,22 @@
}
static char *
-getplanetstate(int id, char *t0, char *t1)
+getplanetstate(int id, Tm *t)
{
Biobuf *bin;
- char *line, *lastline;
+ char *line, *lastline, t0[16], t1[16];
HReq r;
+ lastline = nil;
r.pid = id;
r.t0 = t0;
r.t1 = t1;
- lastline = nil;
+ snprint(t1, sizeof t1, "%τ", tmfmt(t, datefmt));
+ t->mday--;
+ snprint(t0, sizeof t0, "%τ", tmfmt(t, datefmt));
+ t->mday++;
+
if(pipe(r.pfd) < 0)
sysfatal("pipe: %r");
switch(fork()){
@@ -214,6 +222,32 @@
return lastline;
}
+void
+updateplanets(void)
+{
+ char *s, *p;
+ int i;
+
+ fprint(2, "loading planet states...\n");
+ for(i = 1; i < nelem(planets); i++){
+ s = getplanetstate(planets[i].id, &date);
+ if(s == nil){
+ fprint(2, "couldn't load planet: %s", planets[i].name);
+ continue;
+ }
+ p = strchr(s, '=');
+ planets[i].body->p.x = strtod(++p, nil);
+ p = strchr(p, '=');
+ planets[i].body->p.y = strtod(++p, nil);
+ p = strchr(p, '=');
+ planets[i].body->p.z = strtod(++p, nil);
+ planets[i].body->p.w = 1;
+ planets[i].body->p = divpt3(planets[i].body->p, 1e5);
+ free(s);
+ fprint(2, "%s ready\n", planets[i].name);
+ }
+}
+
static Planet *
getplanet(Entity *e)
{
@@ -352,13 +386,13 @@
}
void
-lookat_cmd(Cmdbut *, Mousectl *mc)
+lookat_cmd(Cmdbut *)
{
static Menu menu = { .gen = genplanetmenu };
Planet *p;
int idx;
- idx = menuhit(1, mc, &menu, _screen);
+ idx = menuhit(1, mctl, &menu, _screen);
if(idx < 0)
return;
p = &planets[idx];
@@ -367,13 +401,13 @@
}
void
-goto_cmd(Cmdbut *, Mousectl *mc)
+goto_cmd(Cmdbut *)
{
static Menu menu = { .gen = genplanetmenu };
Planet *p;
int idx;
- idx = menuhit(1, mc, &menu, _screen);
+ idx = menuhit(1, mctl, &menu, _screen);
if(idx < 0)
return;
p = &planets[idx];
@@ -381,9 +415,26 @@
nbsend(drawc, nil);
}
+void
+date_cmd(Cmdbut *)
+{
+ Tm t;
+ char buf[16];
+
+ memmove(buf, datestr, sizeof buf);
+ if(enter("new date", buf, sizeof buf, mctl, kctl, nil) <= 0)
+ return;
+ if(tmparse(&t, datefmt, buf, nil, nil) == nil)
+ return;
+ date = t;
+ snprint(datestr, sizeof datestr, "%τ", tmfmt(&date, datefmt));
+ updateplanets();
+}
+
Cmdbut cmds[] = {
{ .label = "look at", .handler = lookat_cmd },
{ .label = "go to", .handler = goto_cmd },
+ { .label = datestr, .handler = date_cmd },
};
void
@@ -399,7 +450,7 @@
if(cmd == nil)
return;
- cmd->handler(cmd, mctl);
+ cmd->handler(cmd);
}
void
@@ -580,9 +631,9 @@
Entity *subject;
OBJ *obj;
Point lblsiz;
- char *s, *p;
int i, j;
+ tmfmtinstall();
GEOMfmtinstall();
ARGBEGIN{
case 'p': doprof++; break;
@@ -599,10 +650,8 @@
loadobjmodel(model, obj);
objfree(obj);
scene = newscene(nil);
- fprint(2, "loading planet states...\n");
for(i = 0; i < nelem(planets); i++){
subject = newentity(model);
-// subject->p.x = i*2e3;
scene->addent(scene, subject);
planets[i].body = subject;
for(j = 0; j < model->nmaterials; j++)
@@ -612,20 +661,10 @@
subject->p = Pt3(0,0,0,1);
continue;
}
- s = getplanetstate(planets[i].id, nil, nil);
- if(s == nil)
- sysfatal("couldn't load planet: %s", planets[i].name);
- p = strchr(s, '=');
- subject->p.x = strtod(++p, nil);
- p = strchr(p, '=');
- subject->p.y = strtod(++p, nil);
- p = strchr(p, '=');
- subject->p.z = strtod(++p, nil);
- subject->p.w = 1;
- subject->p = divpt3(subject->p, 1e5);
- free(s);
- fprint(2, "%s ready\n", planets[i].name);
}
+ tmnow(&date, nil);
+ snprint(datestr, sizeof datestr, "%τ", tmfmt(&date, datefmt));
+ updateplanets();
if(memimageinit() != 0)
sysfatal("memimageinit: %r");