xref: /plan9/sys/src/cmd/astro/main.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include "astro.h"
2 
3 char*	herefile = "/lib/sky/here";
4 
5 void
main(int argc,char * argv[])6 main(int argc, char *argv[])
7 {
8 	int i, j;
9 	double d;
10 
11 	pi = atan(1.0)*4;
12 	pipi = pi*2;
13 	radian = pi/180;
14 	radsec = radian/3600;
15 	converge = 1.0e-14;
16 
17 	fmtinstall('R', Rconv);
18 	fmtinstall('D', Dconv);
19 
20 	per = PER;
21 	deld = PER/NPTS;
22 	init();
23 	args(argc, argv);
24 	init();
25 
26 loop:
27 	d = day;
28 	pdate(d);
29 	if(flags['p'] || flags['e']) {
30 		print(" ");
31 		ptime(d);
32 		pstime(d);
33 	}
34 	print("\n");
35 	for(i=0; i<=NPTS+1; i++) {
36 		setime(d);
37 
38 		for(j=0; objlst[j]; j++) {
39 			(*objlst[j]->obj)();
40 			setobj(&objlst[j]->point[i]);
41 			if(flags['p']) {
42 				if(flags['m'])
43 					if(strcmp(objlst[j]->name, "Comet"))
44 						continue;
45 				output(objlst[j]->name, &objlst[j]->point[i]);
46 			}
47 		}
48 		if(flags['e']) {
49 			d = dist(&eobj1->point[i], &eobj2->point[i]);
50 			print("dist %s to %s = %.4f\n", eobj1->name, eobj2->name, d);
51 		}
52 //		if(flags['p']) {
53 //			pdate(d);
54 //			print(" ");
55 //			ptime(d);
56 //			print("\n");
57 //		}
58 		if(flags['p'] || flags['e'])
59 			break;
60 		d += deld;
61 	}
62 	if(!(flags['p'] || flags['e']))
63 		search();
64 	day += per;
65 	nperiods -= 1;
66 	if(nperiods > 0)
67 		goto loop;
68 	exits(0);
69 }
70 
71 void
args(int argc,char * argv[])72 args(int argc, char *argv[])
73 {
74 	char *p;
75 	long t;
76 	int f, i;
77 	Obj2 *q;
78 
79 	memset(flags, 0, sizeof(flags));
80 	ARGBEGIN {
81 	default:
82 		fprint(2, "astro [-adeklmopst] [-c nperiod] [-C tperiod]\n");
83 		exits(0);
84 
85 	case 'c':
86 		nperiods = 1;
87 		p = ARGF();
88 		if(p)
89 			nperiods = atol(p);
90 		flags['c']++;
91 		break;
92 	case 'C':
93 		p = ARGF();
94 		if(p)
95 			per = atof(p);
96 		break;
97 	case 'e':
98 		eobj1 = nil;
99 		eobj2 = nil;
100 		p = ARGF();
101 		if(p) {
102 			for(i=0; q=objlst[i]; i++) {
103 				if(strcmp(q->name, p) == 0)
104 					eobj1 = q;
105 				if(strcmp(q->name1, p) == 0)
106 					eobj1 = q;
107 			}
108 			p = ARGF();
109 			if(p) {
110 				for(i=0; q=objlst[i]; i++) {
111 					if(strcmp(q->name, p) == 0)
112 						eobj2 = q;
113 					if(strcmp(q->name1, p) == 0)
114 						eobj2 = q;
115 				}
116 			}
117 		}
118 		if(eobj1 && eobj2) {
119 			flags['e']++;
120 			break;
121 		}
122 		fprint(2, "cant recognize eclipse objects\n");
123 		exits("eflag");
124 
125 	case 'a':
126 	case 'd':
127 	case 'j':
128 	case 'k':
129 	case 'l':
130 	case 'm':
131 	case 'o':
132 	case 'p':
133 	case 's':
134 	case 't':
135 		flags[ARGC()]++;
136 		break;
137 	} ARGEND
138 	if(*argv){
139 		fprint(2, "usage: astro [-dlpsatokm] [-c nday] [-e obj1 obj2]\n");
140 		exits("usage");
141 	}
142 
143 	t = time(0);
144 	day = t/86400. + 25567.5;
145 	if(flags['d'])
146 		day = readate();
147 	if(flags['j'])
148 		print("jday = %.4f\n", day);
149 	deltat = day * .001704;
150 	if(deltat > 32.184)		// assume date is utc1
151 		deltat = 32.184;	// correct by leap sec
152 	if(flags['t'])
153 		deltat = readdt();
154 
155 	if(flags['l']) {
156 		fprint(2, "nlat wlong elev\n");
157 		readlat(0);
158 	} else {
159 		f = open(herefile, OREAD);
160 		if(f < 0) {
161 			fprint(2, "%s?\n", herefile);
162 			/* btl mh */
163 			nlat = (40 + 41.06/60)*radian;
164 			awlong = (74 + 23.98/60)*radian;
165 			elev = 150 * 3.28084;
166 		} else {
167 			readlat(f);
168 			close(f);
169 		}
170 	}
171 }
172 
173 double
readate(void)174 readate(void)
175 {
176 	int i;
177 	Tim t;
178 
179 	fprint(2, "year mo da hr min\n");
180 	rline(0);
181 	for(i=0; i<5; i++)
182 		t.ifa[i] = atof(skip(i));
183 	return convdate(&t);
184 }
185 
186 double
readdt(void)187 readdt(void)
188 {
189 
190 	fprint(2, "ΔT (sec) (%.3f)\n", deltat);
191 	rline(0);
192 	return atof(skip(0));
193 }
194 
195 double
etdate(long year,int mo,double day)196 etdate(long year, int mo, double day)
197 {
198 	Tim t;
199 
200 	t.ifa[0] = year;
201 	t.ifa[1] = mo;
202 	t.ifa[2] = day;
203 	t.ifa[3] = 0;
204 	t.ifa[4] = 0;
205 	return convdate(&t) + 2415020;
206 }
207 
208 void
readlat(int f)209 readlat(int f)
210 {
211 
212 	rline(f);
213 	nlat = atof(skip(0)) * radian;
214 	awlong = atof(skip(1)) * radian;
215 	elev = atof(skip(2)) * 3.28084;
216 }
217 
218 double
fmod(double a,double b)219 fmod(double a, double b)
220 {
221 	return a - floor(a/b)*b;
222 }
223