33 #define NULL_PTR(x) (x *)0
56 void SetLimits(
double limitLower,
double limitHigher);
61 int CheckCoords(
double desRA,
double desDec,
double tolRA,
double tolDEC);
70 void Focus(
int focus);
75 static int TelConnectFlag = 0;
79 static double returnRA;
80 static double returnDec;
87 static double offsetRA = 0;
88 static double offsetDec = 0;
98 static int readn(
int fd,
char *ptr,
int nbytes,
int sec);
99 static int writen(
int fd,
char *ptr,
int nbytes);
100 static int telstat(
int fd,
int sec,
int usec);
108 tcflush(TelPortFD, TCIOFLUSH);
112 writen(TelPortFD,
"Kx", 2);
113 numRead = readn(TelPortFD, returnStr, 3, 2);
114 returnStr[numRead] =
'\0';
134 fprintf(stderr,
"Connecting to port: %s\n", port);
136 if (TelConnectFlag != 0)
141 TelPortFD = open(port, O_RDWR);
145 tcgetattr(TelPortFD, &tty);
146 cfsetospeed(&tty, (speed_t)B9600);
147 cfsetispeed(&tty, (speed_t)B9600);
148 tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
149 tty.c_iflag = IGNBRK;
152 tty.c_cflag |= CLOCAL | CREAD;
155 tty.c_iflag &= ~(IXON | IXOFF | IXANY);
156 tty.c_cflag &= ~(PARENB | PARODD);
157 tcsetattr(TelPortFD, TCSANOW, &tty);
161 tcflush(TelPortFD, TCIOFLUSH);
165 writen(TelPortFD,
"Kx", 2);
166 numRead = readn(TelPortFD, returnStr, 3, 2);
167 returnStr[numRead] =
'\0';
170 fprintf(stderr,
"ConnectTel read %d characters: %s\n", numRead, returnStr);
191 else if (newRate ==
FIND)
195 else if (newRate ==
CENTER)
199 else if (newRate ==
GUIDE)
210 char slewCmd[] = { 0x50, 0x02, 0x11, 0x24, 0x09, 0x00, 0x00, 0x00 };
213 if (direction ==
NORTH)
217 slewCmd[4] = slewRate;
219 else if (direction ==
EAST)
223 slewCmd[4] = slewRate;
225 else if (direction ==
SOUTH)
229 slewCmd[4] = slewRate;
231 else if (direction ==
WEST)
235 slewCmd[4] = slewRate;
238 writen(TelPortFD, slewCmd, 8);
244 if (readn(TelPortFD, inputStr, 1, 1))
246 if (inputStr[0] ==
'#')
251 fprintf(stderr,
"No acknowledgment from telescope in StartSlew.\n");
261 char slewCmd[] = { 0x50, 0x02, 0x11, 0x24, 0x00, 0x00, 0x00, 0x00 };
264 if (direction ==
NORTH)
269 else if (direction ==
EAST)
274 else if (direction ==
SOUTH)
279 else if (direction ==
WEST)
285 writen(TelPortFD, slewCmd, 8);
291 if (readn(TelPortFD, inputStr, 1, 1))
293 if (inputStr[0] ==
'#')
298 fprintf(stderr,
"No acknowledgment from telescope in StartSlew.\n");
307 if (TelConnectFlag == 1)
347 writen(TelPortFD,
"L", 1);
348 numRead = readn(TelPortFD, returnStr, 2, 2);
349 returnStr[numRead] =
'\0';
353 return (returnStr[0] ==
'0' ? 0 : 1);
359 int countRA, countDec;
362 writen(TelPortFD,
"E", 1);
363 numRead = readn(TelPortFD, returnStr, 10, 1);
364 returnStr[4] = returnStr[9] =
'\0';
372 sscanf(returnStr,
"%x", &countRA);
373 sscanf(returnStr + 5,
"%x:", &countDec);
374 returnRA = (double)countRA;
375 returnRA = returnRA / (3. * 15. * 60. * 65536. / 64800.);
376 returnDec = (double)countDec;
377 returnDec = returnDec / (3. * 60. * 65536. / 64800.);
383 if ((returnDec > 90.) && (returnDec <= 180.))
385 returnDec = 180. - returnDec;
390 if ((returnDec > 180.) && (returnDec <= 270.))
392 returnDec = returnDec - 270.;
397 if ((returnDec > 270.) && (returnDec <= 360.))
399 returnDec = returnDec - 360.;
410 returnRA = returnRA - offsetRA;
411 returnDec = returnDec - offsetDec;
432 n1 = newRA * 0x1000000 / 24;
433 n2 = newDec * 0x1000000 / 360;
436 sprintf((
char *)str,
"s%08X,%08X", n1, n2);
437 writen(TelPortFD, str, 18);
442 if (readn(TelPortFD, str, 1, 2))
448 fprintf(stderr,
"No acknowledgment from telescope after SyncToCoords.\n");
457 int lat_d, lat_m, lat_s;
458 int long_d, long_m, long_s;
473 cmd[3] = lat_d > 0 ? 0 : 1;
474 cmd[4] = abs(long_d);
477 cmd[7] = long_d > 0 ? 0 : 1;
480 writen(TelPortFD, str, 9);
485 if (readn(TelPortFD, str, 1, 2))
491 fprintf(stderr,
"No acknowledgment from telescope after updateLocation.\n");
501 struct ln_zonedate local_date;
504 ln_date_to_zonedate(utc, &local_date, utc_offset * 3600);
506 cmd[0] = local_date.hours;
507 cmd[1] = local_date.minutes;
508 cmd[2] = local_date.seconds;
509 cmd[3] = local_date.months;
510 cmd[4] = local_date.days;
511 cmd[5] = local_date.years - 2000;
514 cmd[6] = 256 - ((
unsigned int)fabs(utc_offset));
516 cmd[6] = ((
unsigned int)fabs(utc_offset));
522 writen(TelPortFD, str, 9);
527 if (readn(TelPortFD, str, 1, 2))
533 fprintf(stderr,
"No acknowledgment from telescope after updateTime.\n");
544 int countRA, countDec;
545 char r0, r1, r2, r3, d0, d1, d2, d3;
547 char outputStr[32], inputStr[2048];
551 hrs = newRA + offsetRA;
552 degs = newDec + offsetDec;
556 hrs = hrs * (3. * 15. * 60. * 65536. / 64800.);
561 if ((newDec >= 0.0) && (newDec <= 90.0))
563 degs = degs * (3. * 60. * 65536. / 64800.);
565 else if ((newDec < 0.0) && (newDec >= -90.0))
567 degs = (360. + degs) * (3. * 60. * 65536. / 64800.);
571 fprintf(stderr,
"Invalid newDec in SlewToCoords.\n");
577 countDec = (int)degs;
593 countRA = countRA / 16;
603 countRA = countRA / 16;
625 printf(
"RA count overflow in SlewToCoords.\n");
628 if (countDec < 65536)
639 countDec = countDec / 16;
649 countDec = countDec / 16;
671 fprintf(stderr,
"Dec count overflow in SlewToCoords.\n");
677 sprintf(outputStr,
"R%c%c%c%c,%c%c%c%c", r3, r2, r1, r0, d3, d2, d1, d0);
678 writen(TelPortFD, outputStr, 10);
684 if (readn(TelPortFD, inputStr, 1, 2))
686 if (inputStr[0] ==
'#')
690 fprintf(stderr,
"No acknowledgment from telescope after SlewToCoords.\n");
703 int CheckCoords(
double desRA,
double desDec,
double tolRA,
double tolDEC)
705 double errorRA, errorDec, nowRA, nowDec;
708 writen(TelPortFD,
"L", 1);
714 if (readn(TelPortFD, inputStr, 2, 2))
716 if ((inputStr[0] ==
'0') && (inputStr[1] ==
'#'))
724 errorRA = nowRA - desRA;
726 errorDec = nowDec - desDec;
730 if (fabs(errorRA) > tolRA || fabs(errorDec) > tolDEC)
740 limitLower = limitHigher;
741 fprintf(stderr,
"NexStar does not support software limits.\n");
748 fprintf(stderr,
"NexStar does not support remote setting of slew rate.\n");
758 writen(TelPortFD,
"M", 1);
764 if (readn(TelPortFD, inputStr, 1, 1))
766 if (inputStr[0] ==
'#')
771 fprintf(stderr,
"No acknowledgment from telescope in StopNSEW.\n");
781 fprintf(stderr,
"NexStar does not support remote setting of reticle.\n");
789 fprintf(stderr,
"NexStar does not support remote setting of focus.\n");
798 fprintf(stderr,
"NexStar does not support an image derotator.\n");
807 fprintf(stderr,
"NexStar does not have a fan.\n");
817 fprintf(stderr,
"NexStar does not support remote setting of sidereal time.\n");
825 fprintf(stderr,
"NexStar does not support remote setting of local time.\n");
831 static int writen(
fd, ptr, nbytes)
int fd;
839 nwritten = write(
fd, ptr, nleft);
845 return (nbytes - nleft);
848 static int readn(
fd, ptr, nbytes, sec)
int fd;
858 status = telstat(
fd, sec, 0);
861 nread = read(
fd, ptr, nleft);
872 return (nbytes - nleft);
885 static int telstat(
fd, sec, usec)
register int fd, sec, usec;
889 struct timeval timeout;
892 memset((
char *)&readfds, 0,
sizeof(readfds));
893 FD_SET(
fd, &readfds);
895 timeout.tv_sec = sec;
896 timeout.tv_usec = usec;
int updateTime(struct ln_date *utc, double utc_offset)
int CheckCoords(double desRA, double desDec, double tolRA, double tolDEC)
void Derotator(int rotate)
int StartSlew(int direction)
int CheckConnectTel(void)
int updateLocation(double lng, double lat)
void Reticle(int reticle)
void SetLimits(double limitLower, double limitHigher)
int ConnectTel(char *port)
int SyncLST(double newTime)
int SyncToCoords(double newRA, double newDec)
void SetRate(int newRate)
int StopSlew(int direction)
int SlewToCoords(double newRA, double newDec)
void getSexComponents(double value, int *d, int *m, int *s)