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

Last change on this file since 596 was 490, checked in by campagne, 14 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.