source: BAORadio/libindi/v1/drivers/telescope/lx200driver.c@ 689

Last change on this file since 689 was 490, checked in by campagne, 15 years ago

import libindi (JEC)

File size: 36.4 KB
Line 
1#if 0
2 LX200 Driver
3 Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
19#endif
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <stdarg.h>
25#include <math.h>
26#include <sys/time.h>
27#include <unistd.h>
28#include <fcntl.h>
29#include <time.h>
30
31#include "indicom.h"
32#include "indidevapi.h"
33#include "lx200driver.h"
34
35#ifndef _WIN32
36#include <termios.h>
37#endif
38
39#define LX200_TIMEOUT 5 /* FD timeout in seconds */
40
41int controller_format;
42
43/**************************************************************************
44 Diagnostics
45 **************************************************************************/
46char ACK(int fd);
47/*int testTelescope(void);
48int testAP(void);*/
49int check_lx200_connection(int fd);
50
51/**************************************************************************
52 Get Commands: store data in the supplied buffer. Return 0 on success or -1 on failure
53 **************************************************************************/
54
55/* Get Double from Sexagisemal */
56int getCommandSexa(int fd, double *value, const char *cmd);
57/* Get String */
58int getCommandString(int fd, char *data, const char* cmd);
59/* Get Int */
60int getCommandInt(int fd, int *value, const char* cmd);
61/* Get tracking frequency */
62int getTrackFreq(int fd, double * value);
63/* Get site Latitude */
64int getSiteLatitude(int fd, int *dd, int *mm);
65/* Get site Longitude */
66int getSiteLongitude(int fd, int *ddd, int *mm);
67/* Get Calender data */
68int getCalenderDate(int fd, char *date);
69/* Get site Name */
70int getSiteName(int fd, char *siteName, int siteNum);
71/* Get Number of Bars */
72int getNumberOfBars(int fd, int *value);
73/* Get Home Search Status */
74int getHomeSearchStatus(int fd, int *status);
75/* Get OTA Temperature */
76int getOTATemp(int fd, double * value);
77/* Get time format: 12 or 24 */
78int getTimeFormat(int fd, int *format);
79
80
81/**************************************************************************
82 Set Commands
83 **************************************************************************/
84
85/* Set Int */
86int setCommandInt(int fd, int data, const char *cmd);
87/* Set Sexigesimal */
88int setCommandXYZ(int fd, int x, int y, int z, const char *cmd);
89/* Common routine for Set commands */
90int setStandardProcedure(int fd, char * writeData);
91/* Set Slew Mode */
92int setSlewMode(int fd, int slewMode);
93/* Set Alignment mode */
94int setAlignmentMode(int fd, unsigned int alignMode);
95/* Set Object RA */
96int setObjectRA(int fd, double ra);
97/* set Object DEC */
98int setObjectDEC(int fd, double dec);
99/* Set Calender date */
100int setCalenderDate(int fd, int dd, int mm, int yy);
101/* Set UTC offset */
102int setUTCOffset(int fd, double hours);
103/* Set Track Freq */
104int setTrackFreq(int fd, double trackF);
105/* Set current site longitude */
106int setSiteLongitude(int fd, double Long);
107/* Set current site latitude */
108int setSiteLatitude(int fd, double Lat);
109/* Set Object Azimuth */
110int setObjAz(int fd, double az);
111/* Set Object Altitude */
112int setObjAlt(int fd, double alt);
113/* Set site name */
114int setSiteName(int fd, char * siteName, int siteNum);
115/* Set maximum slew rate */
116int setMaxSlewRate(int fd, int slewRate);
117/* Set focuser motion */
118int setFocuserMotion(int fd, int motionType);
119/* Set focuser speed mode */
120int setFocuserSpeedMode (int fd, int speedMode);
121/* Set minimum elevation limit */
122int setMinElevationLimit(int fd, int min);
123/* Set maximum elevation limit */
124int setMaxElevationLimit(int fd, int max);
125
126/**************************************************************************
127 Motion Commands
128 **************************************************************************/
129/* Slew to the selected coordinates */
130int Slew(int fd);
131/* Synchronize to the selected coordinates and return the matching object if any */
132int Sync(int fd, char *matchedObject);
133/* Abort slew in all axes */
134int abortSlew(int fd);
135/* Move into one direction, two valid directions can be stacked */
136int MoveTo(int fd, int direction);
137/* Half movement in a particular direction */
138int HaltMovement(int fd, int direction);
139/* Select the tracking mode */
140int selectTrackingMode(int fd, int trackMode);
141/* Select Astro-Physics tracking mode */
142int selectAPTrackingMode(int fd, int trackMode);
143/* Send Pulse-Guide command (timed guide move), two valid directions can be stacked */
144int SendPulseCmd(int fd, int direction, int duration_msec);
145
146/**************************************************************************
147 Other Commands
148 **************************************************************************/
149 /* Ensures LX200 RA/DEC format is long */
150int checkLX200Format(int fd);
151/* Select a site from the LX200 controller */
152int selectSite(int fd, int siteNum);
153/* Select a catalog object */
154int selectCatalogObject(int fd, int catalog, int NNNN);
155/* Select a sub catalog */
156int selectSubCatalog(int fd, int catalog, int subCatalog);
157
158int check_lx200_connection(int in_fd)
159{
160
161 int i=0;
162 char ack[1] = { (char) 0x06 };
163 char MountAlign[64];
164 int nbytes_read=0;
165
166 #ifdef INDI_DEBUG
167 IDLog("Testing telescope's connection using ACK...\n");
168 #endif
169
170 if (in_fd <= 0) return -1;
171
172 for (i=0; i < 2; i++)
173 {
174 if (write(in_fd, ack, 1) < 0) return -1;
175 tty_read(in_fd, MountAlign, 1, LX200_TIMEOUT, &nbytes_read);
176 if (nbytes_read == 1)
177 return 0;
178 usleep(50000);
179 }
180
181 return -1;
182}
183
184
185/**********************************************************************
186* GET
187**********************************************************************/
188
189char ACK(int fd)
190{
191 char ack[1] = { (char) 0x06 };
192 char MountAlign[2];
193 int nbytes_write=0, nbytes_read=0, error_type;
194
195 nbytes_write = write(fd, ack, 1);
196
197 if (nbytes_write < 0)
198 return -1;
199
200 /*read_ret = portRead(MountAlign, 1, LX200_TIMEOUT);*/
201 error_type = tty_read(fd, MountAlign, 1, LX200_TIMEOUT, &nbytes_read);
202
203 if (nbytes_read == 1)
204 return MountAlign[0];
205 else
206 return error_type;
207}
208
209int getCommandSexa(int fd, double *value, const char * cmd)
210{
211 char temp_string[16];
212 int error_type;
213 int nbytes_write=0, nbytes_read=0;
214
215 tcflush(fd, TCIFLUSH);
216
217 if ( (error_type = tty_write_string(fd, cmd, &nbytes_write)) != TTY_OK)
218 return error_type;
219
220 /*if ( (read_ret = portRead(temp_string, -1, LX200_TIMEOUT)) < 1)
221 return read_ret;*/
222 tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
223
224 temp_string[nbytes_read - 1] = '\0';
225
226 /*IDLog("getComandSexa: %s\n", temp_string);*/
227
228 if (f_scansexa(temp_string, value))
229 {
230 #ifdef INDI_DEBUG
231 IDLog("unable to process [%s]\n", temp_string);
232 #endif
233 return -1;
234 }
235
236 tcflush(fd, TCIFLUSH);
237 return 0;
238}
239
240int getCommandInt(int fd, int *value, const char* cmd)
241{
242 char temp_string[16];
243 float temp_number;
244 int error_type;
245 int nbytes_write=0, nbytes_read=0;
246
247
248 tcflush(fd, TCIFLUSH);
249
250 if ( (error_type = tty_write_string(fd, cmd, &nbytes_write)) != TTY_OK)
251 return error_type;
252
253 tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
254
255 temp_string[nbytes_read - 1] = '\0';
256
257 /* Float */
258 if (strchr(temp_string, '.'))
259 {
260 if (sscanf(temp_string, "%f", &temp_number) != 1)
261 return -1;
262
263 *value = (int) temp_number;
264 }
265 /* Int */
266 else if (sscanf(temp_string, "%d", value) != 1)
267 return -1;
268
269 return 0;
270}
271
272
273int getCommandString(int fd, char *data, const char* cmd)
274{
275 char * term;
276 int error_type;
277 int nbytes_write=0, nbytes_read=0;
278
279 /*if (portWrite(cmd) < 0)
280 return -1;*/
281
282 if ( (error_type = tty_write_string(fd, cmd, &nbytes_write)) != TTY_OK)
283 return error_type;
284
285 /*read_ret = portRead(data, -1, LX200_TIMEOUT);*/
286 error_type = tty_read_section(fd, data, '#', LX200_TIMEOUT, &nbytes_read);
287 tcflush(fd, TCIFLUSH);
288
289 if (error_type != TTY_OK)
290 return error_type;
291
292 term = strchr (data, '#');
293 if (term)
294 *term = '\0';
295
296 #ifdef INDI_DEBUG
297 /*IDLog("Requested data: %s\n", data);*/
298 #endif
299
300 return 0;
301}
302
303int getCalenderDate(int fd, char *date)
304{
305
306 int dd, mm, yy;
307 int error_type;
308 int nbytes_read=0;
309 char mell_prefix[3];
310
311
312 if ( (error_type = getCommandString(fd, date, "#:GC#")) )
313 return error_type;
314
315 /* Meade format is MM/DD/YY */
316
317 nbytes_read = sscanf(date, "%d%*c%d%*c%d", &mm, &dd, &yy);
318 if (nbytes_read < 3)
319 return -1;
320
321 /* We consider years 50 or more to be in the last century, anything less in the 21st century.*/
322 if (yy > 50)
323 strncpy(mell_prefix, "19", 3);
324 else
325 strncpy(mell_prefix, "20", 3);
326
327 /* We need to have in in YYYY/MM/DD format */
328 snprintf(date, 16, "%s%02d/%02d/%02d", mell_prefix, yy, mm, dd);
329
330 return (0);
331
332}
333
334int getTimeFormat(int fd, int *format)
335{
336 char temp_string[16];
337 int error_type;
338 int nbytes_write=0, nbytes_read=0;
339 int tMode;
340
341 /*if (portWrite("#:Gc#") < 0)
342 return -1;*/
343
344 if ( (error_type = tty_write_string(fd, "#:Gc#", &nbytes_write)) != TTY_OK)
345 return error_type;
346
347 /*read_ret = portRead(temp_string, -1, LX200_TIMEOUT);*/
348 if ( (error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read)) != TTY_OK)
349 return error_type;
350
351 tcflush(fd, TCIFLUSH);
352
353 if (nbytes_read < 1)
354 return error_type;
355
356 temp_string[nbytes_read-1] = '\0';
357
358 nbytes_read = sscanf(temp_string, "(%d)", &tMode);
359
360 if (nbytes_read < 1)
361 return -1;
362 else
363 *format = tMode;
364
365 return 0;
366
367}
368
369int getSiteName(int fd, char *siteName, int siteNum)
370{
371 char * term;
372 int error_type;
373 int nbytes_write=0, nbytes_read=0;
374
375 switch (siteNum)
376 {
377 case 1:
378 /*if (portWrite("#:GM#") < 0)
379 return -1;*/
380 if ( (error_type = tty_write_string(fd, "#:GM#", &nbytes_write)) != TTY_OK)
381 return error_type;
382 break;
383 case 2:
384 /*if (portWrite("#:GN#") < 0)
385 return -1;*/
386 if ( (error_type = tty_write_string(fd, "#:GN#", &nbytes_write)) != TTY_OK)
387 return error_type;
388 break;
389 case 3:
390 /*if (portWrite("#:GO#") < 0)
391 return -1;*/
392 if ( (error_type = tty_write_string(fd, "#:GO#", &nbytes_write)) != TTY_OK)
393 return error_type;
394 break;
395 case 4:
396 /*if (portWrite("#:GP#") < 0)
397 return -1;*/
398 if ( (error_type = tty_write_string(fd, "#:GP#", &nbytes_write)) != TTY_OK)
399 return error_type;
400 break;
401 default:
402 return -1;
403 }
404
405 /*read_ret = portRead(siteName, -1, LX200_TIMEOUT);*/
406 error_type = tty_read_section(fd, siteName, '#', LX200_TIMEOUT, &nbytes_read);
407 tcflush(fd, TCIFLUSH);
408
409 if (nbytes_read < 1)
410 return error_type;
411
412 siteName[nbytes_read - 1] = '\0';
413
414 term = strchr (siteName, ' ');
415 if (term)
416 *term = '\0';
417
418 term = strchr (siteName, '<');
419 if (term)
420 strcpy(siteName, "unused site");
421
422 #ifdef INDI_DEBUG
423 IDLog("Requested site name: %s\n", siteName);
424 #endif
425
426 return 0;
427}
428
429int getSiteLatitude(int fd, int *dd, int *mm)
430{
431 char temp_string[16];
432 int error_type;
433 int nbytes_write=0, nbytes_read=0;
434
435 /*if (portWrite("#:Gt#") < 0)
436 return -1;*/
437 if ( (error_type = tty_write_string(fd, "#:Gt#", &nbytes_write)) != TTY_OK)
438 return error_type;
439
440 /*read_ret = portRead(temp_string, -1, LX200_TIMEOUT);*/
441 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
442 tcflush(fd, TCIFLUSH);
443
444 if (nbytes_read < 1)
445 return error_type;
446
447 temp_string[nbytes_read -1] = '\0';
448
449 if (sscanf (temp_string, "%d%*c%d", dd, mm) < 2)
450 return -1;
451
452 #ifdef INDI_DEBUG
453 fprintf(stderr, "Requested site latitude in String %s\n", temp_string);
454 fprintf(stderr, "Requested site latitude %d:%d\n", *dd, *mm);
455 #endif
456
457 return 0;
458}
459
460int getSiteLongitude(int fd, int *ddd, int *mm)
461{
462 char temp_string[16];
463 int error_type;
464 int nbytes_write=0, nbytes_read=0;
465
466 if ( (error_type = tty_write_string(fd, "#:Gg#", &nbytes_write)) != TTY_OK)
467 return error_type;
468
469 /*if (portWrite("#:Gg#") < 0)
470 return -1;*/
471 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
472 /*read_ret = portRead(temp_string, -1, LX200_TIMEOUT);*/
473
474 tcflush(fd, TCIFLUSH);
475
476 if (nbytes_read < 1)
477 return error_type;
478
479 temp_string[nbytes_read -1] = '\0';
480
481 if (sscanf (temp_string, "%d%*c%d", ddd, mm) < 2)
482 return -1;
483
484 #ifdef INDI_DEBUG
485 fprintf(stderr, "Requested site longitude in String %s\n", temp_string);
486 fprintf(stderr, "Requested site longitude %d:%d\n", *ddd, *mm);
487 #endif
488
489 return 0;
490}
491
492int getTrackFreq(int fd, double *value)
493{
494 float Freq;
495 char temp_string[16];
496 int error_type;
497 int nbytes_write=0, nbytes_read=0;
498
499 if ( (error_type = tty_write_string(fd, "#:GT#", &nbytes_write)) != TTY_OK)
500 return error_type;
501
502 /*if (portWrite("#:GT#") < 0)
503 return -1;*/
504
505 /*read_ret = portRead(temp_string, -1, LX200_TIMEOUT);*/
506 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
507 tcflush(fd, TCIFLUSH);
508
509 if (nbytes_read < 1)
510 return error_type;
511
512 temp_string[nbytes_read] = '\0';
513
514 /*fprintf(stderr, "Telescope tracking freq str: %s\n", temp_string);*/
515
516 if (sscanf(temp_string, "%f#", &Freq) < 1)
517 return -1;
518
519 *value = (double) Freq;
520
521 #ifdef INDI_DEBUG
522 fprintf(stderr, "Tracking frequency value is %f\n", Freq);
523 #endif
524
525 return 0;
526}
527
528int getNumberOfBars(int fd, int *value)
529{
530 char temp_string[128];
531 int error_type;
532 int nbytes_write=0, nbytes_read=0;
533
534 if ( (error_type = tty_write_string(fd, "#:D#", &nbytes_write)) != TTY_OK)
535 return error_type;
536 /*if (portWrite("#:D#") < 0)
537 return -1;*/
538
539 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
540 tcflush(fd, TCIFLUSH);
541
542 if (nbytes_read < 0)
543 return error_type;
544
545 *value = nbytes_read -1;
546
547 return 0;
548}
549
550int getHomeSearchStatus(int fd, int *status)
551{
552 char temp_string[16];
553 int error_type;
554 int nbytes_write=0, nbytes_read=0;
555
556 if ( (error_type = tty_write_string(fd, "#:h?#", &nbytes_write)) != TTY_OK)
557 return error_type;
558 /*if (portWrite("#:h?#") < 0)
559 return -1;*/
560
561 /*read_ret = portRead(temp_string, 1, LX200_TIMEOUT);*/
562 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
563 tcflush(fd, TCIFLUSH);
564
565 if (nbytes_read < 1)
566 return error_type;
567
568 temp_string[1] = '\0';
569
570 if (temp_string[0] == '0')
571 *status = 0;
572 else if (temp_string[0] == '1')
573 *status = 1;
574 else if (temp_string[0] == '2')
575 *status = 1;
576
577 return 0;
578}
579
580int getOTATemp(int fd, double *value)
581{
582
583 char temp_string[16];
584 int error_type;
585 int nbytes_write=0, nbytes_read=0;
586 float temp;
587
588 if ( (error_type = tty_write_string(fd, "#:fT#", &nbytes_write)) != TTY_OK)
589 return error_type;
590
591 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
592
593 if (nbytes_read < 1)
594 return error_type;
595
596 temp_string[nbytes_read - 1] = '\0';
597
598 if (sscanf(temp_string, "%f", &temp) < 1)
599 return -1;
600
601 *value = (double) temp;
602
603 return 0;
604
605}
606
607int updateSkyCommanderCoord(int fd, double *ra, double *dec)
608{
609 char coords[16];
610 char CR[1] = { (char) 0x0D };
611 float RA=0.0, DEC=0.0;
612 int error_type;
613 int nbytes_read=0;
614
615 error_type = write(fd, CR, 1);
616
617 error_type = tty_read(fd, coords, 16, LX200_TIMEOUT, &nbytes_read);
618 /*read_ret = portRead(coords, 16, LX200_TIMEOUT);*/
619 tcflush(fd, TCIFLUSH);
620
621 nbytes_read = sscanf(coords, " %g %g", &RA, &DEC);
622
623 if (nbytes_read < 2)
624 {
625 #ifdef INDI_DEBUG
626 IDLog("Error in Sky commander number format [%s], exiting.\n", coords);
627 #endif
628 return error_type;
629 }
630
631 *ra = RA;
632 *dec = DEC;
633
634 return 0;
635
636}
637
638int updateIntelliscopeCoord (int fd, double *ra, double *dec)
639{
640 char coords[16];
641 char CR[1] = { (char) 0x51 }; /* "Q" */
642 float RA = 0.0, DEC = 0.0;
643 int error_type;
644 int nbytes_read=0;
645
646 /*IDLog ("Sending a Q\n");*/
647 error_type = write (fd, CR, 1);
648 /* We start at 14 bytes in case its a Sky Wizard,
649 but read one more later it if it's a intelliscope */
650 /*read_ret = portRead (coords, 14, LX200_TIMEOUT);*/
651 error_type = tty_read(fd, coords, 14, LX200_TIMEOUT, &nbytes_read);
652 tcflush(fd, TCIFLUSH);
653 /*IDLog ("portRead() = [%s]\n", coords);*/
654
655 /* Remove the Q in the response from the Intelliscope but not the Sky Wizard */
656 if (coords[0] == 'Q') {
657 coords[0] = ' ';
658 /* Read one more byte if Intelliscope to get the "CR" */
659 error_type = tty_read(fd, coords, 1, LX200_TIMEOUT, &nbytes_read);
660 /*read_ret = portRead (coords, 1, LX200_TIMEOUT);*/
661 }
662 nbytes_read = sscanf (coords, " %g %g", &RA, &DEC);
663 /*IDLog ("sscanf() RA = [%f]\n", RA * 0.0390625);*/
664 /*IDLog ("sscanf() DEC = [%f]\n", DEC * 0.0390625);*/
665
666 /*IDLog ("Intelliscope output [%s]", coords);*/
667 if (nbytes_read < 2)
668 {
669 #ifdef INDI_DEBUG
670 IDLog ("Error in Intelliscope number format [%s], exiting.\n", coords);
671 #endif
672 return -1;
673 }
674
675 *ra = RA * 0.0390625;
676 *dec = DEC * 0.0390625;
677
678 return 0;
679
680}
681
682
683/**********************************************************************
684* SET
685**********************************************************************/
686
687int setStandardProcedure(int fd, char * data)
688{
689 char bool_return[2];
690 int error_type;
691 int nbytes_write=0, nbytes_read=0;
692
693 if ( (error_type = tty_write_string(fd, data, &nbytes_write)) != TTY_OK)
694 return error_type;
695
696 error_type = tty_read(fd, bool_return, 1, LX200_TIMEOUT, &nbytes_read);
697 /*read_ret = portRead(boolRet, 1, LX200_TIMEOUT);*/
698 tcflush(fd, TCIFLUSH);
699
700 if (nbytes_read < 1)
701 return error_type;
702
703 if (bool_return[0] == '0')
704 {
705 #ifdef INDI_DEBUG
706 IDLog("%s Failed.\n", data);
707 #endif
708 return -1;
709 }
710
711 #ifdef INDI_DEBUG
712 IDLog("%s Successful\n", data);
713 #endif
714
715 return 0;
716
717
718}
719
720int setCommandInt(int fd, int data, const char *cmd)
721{
722 char temp_string[16];
723 int error_type;
724 int nbytes_write=0;
725
726 snprintf(temp_string, sizeof( temp_string ), "%s%d#", cmd, data);
727
728 if ( (error_type = tty_write_string(fd, temp_string, &nbytes_write)) != TTY_OK)
729 return error_type;
730
731 /* if (portWrite(temp_string) < 0)
732 return -1;*/
733
734 return 0;
735}
736
737int setMinElevationLimit(int fd, int min)
738{
739 char temp_string[16];
740
741 snprintf(temp_string, sizeof( temp_string ), "#:Sh%02d#", min);
742
743 return (setStandardProcedure(fd, temp_string));
744}
745
746int setMaxElevationLimit(int fd, int max)
747{
748 char temp_string[16];
749
750 snprintf(temp_string, sizeof( temp_string ), "#:So%02d*#", max);
751
752 return (setStandardProcedure(fd, temp_string));
753
754}
755
756int setMaxSlewRate(int fd, int slewRate)
757{
758
759 char temp_string[16];
760
761 if (slewRate < 2 || slewRate > 8)
762 return -1;
763
764 snprintf(temp_string, sizeof( temp_string ), "#:Sw%d#", slewRate);
765
766 return (setStandardProcedure(fd, temp_string));
767
768}
769
770int setObjectRA(int fd, double ra)
771{
772
773 int h, m, s, frac_m;
774 char temp_string[16];
775
776 getSexComponents(ra, &h, &m, &s);
777
778 frac_m = (s / 60.0) * 10.;
779
780 if (controller_format == LX200_LONG_FORMAT)
781 snprintf(temp_string, sizeof( temp_string ), "#:Sr %02d:%02d:%02d#", h, m, s);
782 else
783 snprintf(temp_string, sizeof( temp_string ), "#:Sr %02d:%02d.%01d#", h, m, frac_m);
784
785 /*IDLog("Set Object RA String %s\n", temp_string);*/
786 return (setStandardProcedure(fd, temp_string));
787}
788
789
790int setObjectDEC(int fd, double dec)
791{
792 int d, m, s;
793 char temp_string[16];
794
795 getSexComponents(dec, &d, &m, &s);
796
797 switch(controller_format)
798 {
799
800 case LX200_SHORT_FORMAT:
801 /* case with negative zero */
802 if (!d && dec < 0)
803 snprintf(temp_string, sizeof( temp_string ), "#:Sd -%02d*%02d#", d, m);
804 else
805 snprintf(temp_string, sizeof( temp_string ), "#:Sd %+03d*%02d#", d, m);
806 break;
807
808 case LX200_LONG_FORMAT:
809 /* case with negative zero */
810 if (!d && dec < 0)
811 snprintf(temp_string, sizeof( temp_string ), "#:Sd -%02d:%02d:%02d#", d, m, s);
812 else
813 snprintf(temp_string, sizeof( temp_string ), "#:Sd %+03d:%02d:%02d#", d, m, s);
814 break;
815 }
816
817 /*IDLog("Set Object DEC String %s\n", temp_string);*/
818
819 return (setStandardProcedure(fd, temp_string));
820
821}
822
823int setCommandXYZ(int fd, int x, int y, int z, const char *cmd)
824{
825 char temp_string[16];
826
827 snprintf(temp_string, sizeof( temp_string ), "%s %02d:%02d:%02d#", cmd, x, y, z);
828
829 return (setStandardProcedure(fd, temp_string));
830}
831
832int setAlignmentMode(int fd, unsigned int alignMode)
833{
834 /*fprintf(stderr , "Set alignment mode %d\n", alignMode);*/
835 int error_type;
836 int nbytes_write=0;
837
838 switch (alignMode)
839 {
840 case LX200_ALIGN_POLAR:
841 if ( (error_type = tty_write_string(fd, "#:AP#", &nbytes_write)) != TTY_OK)
842 return error_type;
843 /*if (portWrite("#:AP#") < 0)
844 return -1;*/
845 break;
846 case LX200_ALIGN_ALTAZ:
847 if ( (error_type = tty_write_string(fd, "#:AA#", &nbytes_write)) != TTY_OK)
848 return error_type;
849 /*if (portWrite("#:AA#") < 0)
850 return -1;*/
851 break;
852 case LX200_ALIGN_LAND:
853 if ( (error_type = tty_write_string(fd, "#:AL#", &nbytes_write)) != TTY_OK)
854 return error_type;
855 /*if (portWrite("#:AL#") < 0)
856 return -1;*/
857 break;
858 }
859
860 tcflush(fd, TCIFLUSH);
861 return 0;
862}
863
864int setCalenderDate(int fd, int dd, int mm, int yy)
865{
866 char temp_string[32];
867 char dumpPlanetaryUpdateString[64];
868 char bool_return[2];
869 int error_type;
870 int nbytes_write=0, nbytes_read=0;
871 yy = yy % 100;
872
873 snprintf(temp_string, sizeof( temp_string ), "#:SC %02d/%02d/%02d#", mm, dd, yy);
874
875 if ( (error_type = tty_write_string(fd, temp_string, &nbytes_write)) != TTY_OK)
876 return error_type;
877
878 /*if (portWrite(temp_string) < 0)
879 return -1;*/
880
881 /*read_ret = portRead(boolRet, 1, LX200_TIMEOUT);*/
882 error_type = tty_read(fd, bool_return, 1, LX200_TIMEOUT, &nbytes_read);
883 tcflush(fd, TCIFLUSH);
884
885 if (nbytes_read < 1)
886 return error_type;
887
888 bool_return[1] = '\0';
889
890 if (bool_return[0] == '0')
891 return -1;
892
893 /* Read dumped data */
894 error_type = tty_read_section(fd, dumpPlanetaryUpdateString, '#', LX200_TIMEOUT, &nbytes_read);
895 error_type = tty_read_section(fd, dumpPlanetaryUpdateString, '#', 5, &nbytes_read);
896
897 return 0;
898}
899
900int setUTCOffset(int fd, double hours)
901{
902 char temp_string[16];
903
904 snprintf(temp_string, sizeof( temp_string ), "#:SG %+03d#", (int) hours);
905
906 /*IDLog("UTC string is %s\n", temp_string);*/
907
908 return (setStandardProcedure(fd, temp_string));
909
910}
911
912int setSiteLongitude(int fd, double Long)
913{
914 int d, m, s;
915 char temp_string[32];
916
917 getSexComponents(Long, &d, &m, &s);
918
919 snprintf(temp_string, sizeof( temp_string ), "#:Sg%03d:%02d#", d, m);
920
921 return (setStandardProcedure(fd, temp_string));
922}
923
924int setSiteLatitude(int fd, double Lat)
925{
926 int d, m, s;
927 char temp_string[32];
928
929 getSexComponents(Lat, &d, &m, &s);
930
931 snprintf(temp_string, sizeof( temp_string ), "#:St%+03d:%02d:%02d#", d, m, s);
932
933 return (setStandardProcedure(fd, temp_string));
934}
935
936int setObjAz(int fd, double az)
937{
938 int d,m,s;
939 char temp_string[16];
940
941 getSexComponents(az, &d, &m, &s);
942
943 snprintf(temp_string, sizeof( temp_string ), "#:Sz%03d:%02d#", d, m);
944
945 return (setStandardProcedure(fd, temp_string));
946
947}
948
949int setObjAlt(int fd, double alt)
950{
951 int d, m, s;
952 char temp_string[16];
953
954 getSexComponents(alt, &d, &m, &s);
955
956 snprintf(temp_string, sizeof( temp_string ), "#:Sa%+02d*%02d#", d, m);
957
958 return (setStandardProcedure(fd, temp_string));
959}
960
961
962int setSiteName(int fd, char * siteName, int siteNum)
963{
964
965 char temp_string[16];
966
967 switch (siteNum)
968 {
969 case 1:
970 snprintf(temp_string, sizeof( temp_string ), "#:SM %s#", siteName);
971 break;
972 case 2:
973 snprintf(temp_string, sizeof( temp_string ), "#:SN %s#", siteName);
974 break;
975 case 3:
976 snprintf(temp_string, sizeof( temp_string ), "#:SO %s#", siteName);
977 break;
978 case 4:
979 snprintf(temp_string, sizeof( temp_string ), "#:SP %s#", siteName);
980 break;
981 default:
982 return -1;
983 }
984
985 return (setStandardProcedure(fd, temp_string));
986}
987
988int setSlewMode(int fd, int slewMode)
989{
990 int error_type;
991 int nbytes_write=0;
992
993 switch (slewMode)
994 {
995 case LX200_SLEW_MAX:
996 if ( (error_type = tty_write_string(fd, "#:RS#", &nbytes_write)) != TTY_OK)
997 return error_type;
998 /*if (portWrite("#:RS#") < 0)
999 return -1;*/
1000 break;
1001 case LX200_SLEW_FIND:
1002 if ( (error_type = tty_write_string(fd, "#:RM#", &nbytes_write)) != TTY_OK)
1003 return error_type;
1004 /*if (portWrite("#:RM#") < 0)
1005 return -1;*/
1006 break;
1007 case LX200_SLEW_CENTER:
1008 if ( (error_type = tty_write_string(fd, "#:RC#", &nbytes_write)) != TTY_OK)
1009 return error_type;
1010 /*if (portWrite("#:RC#") < 0)
1011 return -1;*/
1012 break;
1013 case LX200_SLEW_GUIDE:
1014 if ( (error_type = tty_write_string(fd, "#:RG#", &nbytes_write)) != TTY_OK)
1015 return error_type;
1016 /*if (portWrite("#:RG#") < 0)
1017 return -1;*/
1018 break;
1019 default:
1020 break;
1021 }
1022
1023 tcflush(fd, TCIFLUSH);
1024 return 0;
1025
1026}
1027
1028int setFocuserMotion(int fd, int motionType)
1029{
1030 int error_type;
1031 int nbytes_write=0;
1032
1033 switch (motionType)
1034 {
1035 case LX200_FOCUSIN:
1036 if ( (error_type = tty_write_string(fd, "#:F+#", &nbytes_write)) != TTY_OK)
1037 return error_type;
1038 #ifdef INDI_DEBUG
1039 /*IDLog("Focus IN Command\n");*/
1040 #endif
1041 /*if (portWrite("#:F+#") < 0)
1042 return -1;*/
1043 break;
1044 case LX200_FOCUSOUT:
1045 if ( (error_type = tty_write_string(fd, "#:F-#", &nbytes_write)) != TTY_OK)
1046 return error_type;
1047 #ifdef INDI_DEBUG
1048 /*IDLog("Focus OUT Command\n");*/
1049 #endif
1050 /*if (portWrite("#:F-#") < 0)
1051 return -1;*/
1052 break;
1053 }
1054
1055 tcflush(fd, TCIFLUSH);
1056 return 0;
1057}
1058
1059int setFocuserSpeedMode (int fd, int speedMode)
1060{
1061 int error_type;
1062 int nbytes_write=0;
1063
1064 switch (speedMode)
1065 {
1066 case LX200_HALTFOCUS:
1067 if ( (error_type = tty_write_string(fd, "#:FQ#", &nbytes_write)) != TTY_OK)
1068 return error_type;
1069 #ifdef INDI_DEBUG
1070 /*IDLog("Halt Focus Command\n");*/
1071 #endif
1072 /* if (portWrite("#:FQ#") < 0)
1073 return -1;*/
1074 break;
1075 case LX200_FOCUSSLOW:
1076 if ( (error_type = tty_write_string(fd, "#:FS#", &nbytes_write)) != TTY_OK)
1077 return error_type;
1078 #ifdef INDI_DEBUG
1079 /*IDLog("Focus Slow (FS) Command\n");*/
1080 #endif
1081 /*if (portWrite("#:FS#") < 0)
1082 return -1;*/
1083 break;
1084 case LX200_FOCUSFAST:
1085 if ( (error_type = tty_write_string(fd, "#:FF#", &nbytes_write)) != TTY_OK)
1086 return error_type;
1087 #ifdef INDI_DEBUG
1088 /*IDLog("Focus Fast (FF) Command\n");*/
1089 #endif
1090 /*if (portWrite("#:FF#") < 0)
1091 return -1;*/
1092 break;
1093 }
1094
1095 tcflush(fd, TCIFLUSH);
1096 return 0;
1097}
1098
1099int setGPSFocuserSpeed (int fd, int speed)
1100{
1101 char speed_str[8];
1102 int error_type;
1103 int nbytes_write=0;
1104
1105 if (speed == 0)
1106 {
1107 /*if (portWrite("#:FQ#") < 0)
1108 return -1;*/
1109 if ( (error_type = tty_write_string(fd, "#:FQ#", &nbytes_write)) != TTY_OK)
1110 return error_type;
1111 #ifdef INDI_DEBUG
1112 /*IDLog("GPS Focus HALT Command (FQ) \n");*/
1113 #endif
1114
1115 return 0;
1116 }
1117
1118 snprintf(speed_str, 8, "#:F%d#", speed);
1119
1120 if ( (error_type = tty_write_string(fd, speed_str, &nbytes_write)) != TTY_OK)
1121 return error_type;
1122
1123 #ifdef INDI_DEBUG
1124 /*IDLog("GPS Focus Speed command %s \n", speed_str);*/
1125 #endif
1126 /*if (portWrite(speed_str) < 0)
1127 return -1;*/
1128
1129 tcflush(fd, TCIFLUSH);
1130 return 0;
1131}
1132
1133int setTrackFreq(int fd, double trackF)
1134{
1135 char temp_string[16];
1136
1137 snprintf(temp_string, sizeof( temp_string ), "#:ST %04.1f#", trackF);
1138
1139 return (setStandardProcedure(fd, temp_string));
1140
1141}
1142
1143/**********************************************************************
1144* Misc
1145*********************************************************************/
1146
1147int Slew(int fd)
1148{
1149 char slewNum[2];
1150 int error_type;
1151 int nbytes_write=0, nbytes_read=0;
1152
1153 if ( (error_type = tty_write_string(fd, "#:MS#", &nbytes_write)) != TTY_OK)
1154 return error_type;
1155
1156 error_type = tty_read(fd, slewNum, 1, LX200_TIMEOUT, &nbytes_read);
1157
1158 if (nbytes_read < 1)
1159 return error_type;
1160
1161 /* We don't need to read the string message, just return corresponding error code */
1162 tcflush(fd, TCIFLUSH);
1163
1164 if (slewNum[0] == '0')
1165 return 0;
1166 else if (slewNum[0] == '1')
1167 return 1;
1168 else return 2;
1169
1170}
1171
1172int MoveTo(int fd, int direction)
1173{
1174 int nbytes_write=0;
1175
1176 switch (direction)
1177 {
1178 case LX200_NORTH:
1179 tty_write_string(fd, "#:Mn#", &nbytes_write);
1180 /*portWrite("#:Mn#");*/
1181 break;
1182 case LX200_WEST:
1183 tty_write_string(fd, "#:Mw#", &nbytes_write);
1184 /*portWrite("#:Mw#");*/
1185 break;
1186 case LX200_EAST:
1187 tty_write_string(fd, "#:Me#", &nbytes_write);
1188 /*portWrite("#:Me#");*/
1189 break;
1190 case LX200_SOUTH:
1191 tty_write_string(fd, "#:Ms#", &nbytes_write);
1192 /*portWrite("#:Ms#");*/
1193 break;
1194 default:
1195 break;
1196 }
1197
1198 tcflush(fd, TCIFLUSH);
1199 return 0;
1200}
1201
1202int SendPulseCmd(int fd, int direction, int duration_msec)
1203{
1204 int nbytes_write=0;
1205 char cmd[20];
1206 switch (direction)
1207 {
1208 case LX200_NORTH: sprintf(cmd, "#:Mgn%04d#", duration_msec); break;
1209 case LX200_SOUTH: sprintf(cmd, "#:Mgs%04d#", duration_msec); break;
1210 case LX200_EAST: sprintf(cmd, "#:Mge%04d#", duration_msec); break;
1211 case LX200_WEST: sprintf(cmd, "#:Mgw%04d#", duration_msec); break;
1212 default: return 1;
1213 }
1214
1215 tty_write_string(fd, cmd, &nbytes_write);
1216
1217 tcflush(fd, TCIFLUSH);
1218 return 0;
1219}
1220
1221int HaltMovement(int fd, int direction)
1222{
1223 int error_type;
1224 int nbytes_write=0;
1225
1226 switch (direction)
1227 {
1228 case LX200_NORTH:
1229 /*if (portWrite("#:Qn#") < 0)
1230 return -1;*/
1231 if ( (error_type = tty_write_string(fd, "#:Qn#", &nbytes_write)) != TTY_OK)
1232 return error_type;
1233 break;
1234 case LX200_WEST:
1235 /*if (portWrite("#:Qw#") < 0)
1236 return -1;*/
1237 if ( (error_type = tty_write_string(fd, "#:Qw#", &nbytes_write)) != TTY_OK)
1238 return error_type;
1239 break;
1240 case LX200_EAST:
1241 /*if (portWrite("#:Qe#") < 0)
1242 return -1;*/
1243 if ( (error_type = tty_write_string(fd, "#:Qe#", &nbytes_write)) != TTY_OK)
1244 return error_type;
1245 break;
1246 case LX200_SOUTH:
1247 if ( (error_type = tty_write_string(fd, "#:Qs#", &nbytes_write)) != TTY_OK)
1248 return error_type;
1249 /*if (portWrite("#:Qs#") < 0)
1250 return -1;*/
1251 break;
1252 case LX200_ALL:
1253 /*if (portWrite("#:Q#") < 0)
1254 return -1;*/
1255 if ( (error_type = tty_write_string(fd, "#:Q#", &nbytes_write)) != TTY_OK)
1256 return error_type;
1257 break;
1258 default:
1259 return -1;
1260 break;
1261 }
1262
1263 tcflush(fd, TCIFLUSH);
1264 return 0;
1265
1266}
1267
1268int abortSlew(int fd)
1269{
1270 /*if (portWrite("#:Q#") < 0)
1271 return -1;*/
1272 int error_type;
1273 int nbytes_write=0;
1274
1275 if ( (error_type = tty_write_string(fd, "#:Q#", &nbytes_write)) != TTY_OK)
1276 return error_type;
1277
1278 tcflush(fd, TCIFLUSH);
1279 return 0;
1280}
1281
1282int Sync(int fd, char *matchedObject)
1283{
1284 int error_type;
1285 int nbytes_write=0, nbytes_read=0;
1286
1287 if ( (error_type = tty_write_string(fd, "#:CM#", &nbytes_write)) != TTY_OK)
1288 return error_type;
1289
1290 /*portWrite("#:CM#");*/
1291
1292 /*read_ret = portRead(matchedObject, -1, LX200_TIMEOUT);*/
1293 error_type = tty_read_section(fd, matchedObject, '#', LX200_TIMEOUT, &nbytes_read);
1294
1295 if (nbytes_read < 1)
1296 return error_type;
1297
1298 matchedObject[nbytes_read-1] = '\0';
1299
1300 /*IDLog("Matched Object: %s\n", matchedObject);*/
1301
1302 /* Sleep 10ms before flushing. This solves some issues with LX200 compatible devices. */
1303 usleep(10000);
1304 tcflush(fd, TCIFLUSH);
1305
1306 return 0;
1307}
1308
1309int selectSite(int fd, int siteNum)
1310{
1311 int error_type;
1312 int nbytes_write=0;
1313
1314 switch (siteNum)
1315 {
1316 case 1:
1317 if ( (error_type = tty_write_string(fd, "#:W1#", &nbytes_write)) != TTY_OK)
1318 return error_type;
1319 /*if (portWrite("#:W1#") < 0)
1320 return -1;*/
1321 break;
1322 case 2:
1323 if ( (error_type = tty_write_string(fd, "#:W2#", &nbytes_write)) != TTY_OK)
1324 return error_type;
1325 /*if (portWrite("#:W2#") < 0)
1326 return -1;*/
1327 break;
1328 case 3:
1329 if ( (error_type = tty_write_string(fd, "#:W3#", &nbytes_write)) != TTY_OK)
1330 return error_type;
1331 /*if (portWrite("#:W3#") < 0)
1332 return -1;*/
1333 break;
1334 case 4:
1335 if ( (error_type = tty_write_string(fd, "#:W4#", &nbytes_write)) != TTY_OK)
1336 return error_type;
1337 /*if (portWrite("#:W4#") < 0)
1338 return -1;*/
1339 break;
1340 default:
1341 return -1;
1342 break;
1343 }
1344
1345 tcflush(fd, TCIFLUSH);
1346 return 0;
1347
1348}
1349
1350int selectCatalogObject(int fd, int catalog, int NNNN)
1351{
1352 char temp_string[16];
1353 int error_type;
1354 int nbytes_write=0;
1355
1356 switch (catalog)
1357 {
1358 case LX200_STAR_C:
1359 snprintf(temp_string, sizeof( temp_string ), "#:LS%d#", NNNN);
1360 break;
1361 case LX200_DEEPSKY_C:
1362 snprintf(temp_string, sizeof( temp_string ), "#:LC%d#", NNNN);
1363 break;
1364 case LX200_MESSIER_C:
1365 snprintf(temp_string, sizeof( temp_string ), "#:LM%d#", NNNN);
1366 break;
1367 default:
1368 return -1;
1369 }
1370
1371 if ( (error_type = tty_write_string(fd, temp_string, &nbytes_write)) != TTY_OK)
1372 return error_type;
1373 /*if (portWrite(temp_string) < 0)
1374 return -1;*/
1375
1376 tcflush(fd, TCIFLUSH);
1377 return 0;
1378}
1379
1380int selectSubCatalog(int fd, int catalog, int subCatalog)
1381{
1382 char temp_string[16];
1383 switch (catalog)
1384 {
1385 case LX200_STAR_C:
1386 snprintf(temp_string, sizeof( temp_string ), "#:LsD%d#", subCatalog);
1387 break;
1388 case LX200_DEEPSKY_C:
1389 snprintf(temp_string, sizeof( temp_string ), "#:LoD%d#", subCatalog);
1390 break;
1391 case LX200_MESSIER_C:
1392 return 1;
1393 default:
1394 return 0;
1395 }
1396
1397 return (setStandardProcedure(fd, temp_string));
1398}
1399
1400int checkLX200Format(int fd)
1401{
1402 char temp_string[16];
1403 controller_format = LX200_LONG_FORMAT;
1404 int error_type;
1405 int nbytes_write=0, nbytes_read=0;
1406
1407 if ( (error_type = tty_write_string(fd, "#:GR#", &nbytes_write)) != TTY_OK)
1408 return error_type;
1409
1410 /*if (portWrite("#:GR#") < 0)
1411 return -1;*/
1412
1413 /*read_ret = portRead(temp_string, -1, LX200_TIMEOUT);*/
1414 error_type = tty_read_section(fd, temp_string, '#', LX200_TIMEOUT, &nbytes_read);
1415
1416 if (nbytes_read < 1)
1417 return error_type;
1418
1419 temp_string[nbytes_read - 1] = '\0';
1420
1421 /* Check whether it's short or long */
1422 if (temp_string[5] == '.')
1423 {
1424 controller_format = LX200_SHORT_FORMAT;
1425 return 0;
1426 }
1427 else
1428 return 0;
1429}
1430
1431int selectTrackingMode(int fd, int trackMode)
1432{
1433 int error_type;
1434 int nbytes_write=0;
1435
1436 switch (trackMode)
1437 {
1438 case LX200_TRACK_DEFAULT:
1439 #ifdef INDI_DEBUG
1440 IDLog("Setting tracking mode to sidereal.\n");
1441 #endif
1442 if ( (error_type = tty_write_string(fd, "#:TQ#", &nbytes_write)) != TTY_OK)
1443 return error_type;
1444 /*if (portWrite("#:TQ#") < 0)
1445 return -1;*/
1446 break;
1447 case LX200_TRACK_LUNAR:
1448 #ifdef INDI_DEBUG
1449 IDLog("Setting tracking mode to LUNAR.\n");
1450 #endif
1451 if ( (error_type = tty_write_string(fd, "#:TL#", &nbytes_write)) != TTY_OK)
1452 return error_type;
1453 /*if (portWrite("#:TL#") < 0)
1454 return -1;*/
1455 break;
1456 case LX200_TRACK_MANUAL:
1457 #ifdef INDI_DEBUG
1458 IDLog("Setting tracking mode to CUSTOM.\n");
1459 #endif
1460 if ( (error_type = tty_write_string(fd, "#:TM#", &nbytes_write)) != TTY_OK)
1461 return error_type;
1462 /*if (portWrite("#:TM#") < 0)
1463 return -1;*/
1464 break;
1465 default:
1466 return -1;
1467 break;
1468 }
1469
1470 tcflush(fd, TCIFLUSH);
1471 return 0;
1472
1473}
1474
Note: See TracBrowser for help on using the repository browser.