3 Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
5 This library is free software;
6 you can redistribute it and / or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation;
10 version 2.1 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT
ANY WARRANTY;
14 without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License
for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with
this library;
20 if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 - 1301 USA
45 #define LX200_TIMEOUT 5
66 const struct timespec timeout = {0, 50000000L};
68 char ack[1] = { 0x06 };
80 for (i = 0; i < 2; i++)
89 if (write(in_fd, ack, 1) < 0)
97 nanosleep(&timeout,
nullptr);
112 char ack[1] = { 0x06 };
114 int nbytes_write = 0, nbytes_read = 0, error_type;
128 nbytes_write = write(
fd, ack, 1);
130 if (nbytes_write < 0)
137 if (nbytes_read == 1)
138 return MountAlign[0];
147 int nbytes_write = 0, nbytes_read = 0;
152 tcflush(
fd, TCIFLUSH);
160 tcflush(
fd, TCIFLUSH);
164 read_buffer[nbytes_read - 1] =
'\0';
176 tcflush(
fd, TCIFLUSH);
185 int nbytes_write = 0, nbytes_read = 0;
190 tcflush(
fd, TCIFLUSH);
198 tcflush(
fd, TCIFLUSH);
202 read_buffer[nbytes_read - 1] =
'\0';
207 if (strchr(read_buffer,
'.'))
209 if (sscanf(read_buffer,
"%f", &temp_number) != 1)
212 *value =
static_cast<int>(temp_number);
215 else if (sscanf(read_buffer,
"%d", value) != 1)
227 int nbytes_write = 0, nbytes_read = 0;
238 tcflush(
fd, TCIFLUSH);
243 term = strchr(data,
'#');
256 char data[33] = { 0 };
258 int nbytes_write = 0, nbytes_read = 0;
259 const char *
cmd =
":D#";
288 tcflush(
fd, TCIOFLUSH);
301 for(i = 0; i < 33; i++)
303 if(data[i] ==
'#')
return 1;
304 if(data[i] != 0x20)
return 0;
318 int dd, mm, yy, YYYY;
321 char mell_prefix[3] = {0};
342 len = strnlen(date, 32);
346 nbytes_read = sscanf(date,
"%4d-%2d-%2d", &YYYY, &mm, &dd);
354 nbytes_read = sscanf(date,
"%d%*c%d%*c%d", &mm, &dd, &yy);
359 strncpy(mell_prefix,
"19", 3);
361 strncpy(mell_prefix,
"20", 3);
363 snprintf(date, 32,
"%s%02d-%02d-%02d", mell_prefix, yy, mm, dd);
373 int nbytes_write = 0, nbytes_read = 0;
392 tcflush(
fd, TCIFLUSH);
397 read_buffer[nbytes_read - 1] =
'\0';
402 if (strstr(read_buffer,
"("))
403 nbytes_read = sscanf(read_buffer,
"(%d)", &tMode);
405 nbytes_read = sscanf(read_buffer,
"%d", &tMode);
420 int nbytes_write = 0, nbytes_read = 0;
457 tcflush(
fd, TCIFLUSH);
462 siteName[nbytes_read - 1] =
'\0';
466 term = strchr(siteName,
' ');
470 term = strchr(siteName,
'<');
472 strcpy(siteName,
"unused site");
532 int nbytes_write = 0, nbytes_read = 0;
539 tcflush(
fd, TCIFLUSH);
546 tcflush(
fd, TCIFLUSH);
551 read_buffer[nbytes_read - 1] =
'\0';
556 if (sscanf(read_buffer,
"%d%*c%d:%lf", dd, mm, ssf) < 2)
594 int nbytes_write = 0, nbytes_read = 0;
606 tcflush(
fd, TCIFLUSH);
611 read_buffer[nbytes_read - 1] =
'\0';
616 if (sscanf(read_buffer,
"%d%*c%d:%lf", ddd, mm, ssf) < 2)
655 int nbytes_write = 0, nbytes_read = 0;
672 tcflush(
fd, TCIFLUSH);
677 read_buffer[nbytes_read] =
'\0';
681 if (sscanf(read_buffer,
"%f#", &Freq) < 1)
687 *value =
static_cast<double>(Freq);
699 int nbytes_write = 0, nbytes_read = 0;
718 tcflush(
fd, TCIFLUSH);
723 read_buffer[1] =
'\0';
727 if (read_buffer[0] ==
'0')
729 else if (read_buffer[0] ==
'1')
731 else if (read_buffer[0] ==
'2')
744 int nbytes_write = 0, nbytes_read = 0;
766 read_buffer[nbytes_read - 1] =
'\0';
770 if (sscanf(read_buffer,
"%f", &temp) < 1)
776 *value =
static_cast<double>(temp);
791 int nbytes_write = 0, nbytes_read = 0;
798 tcflush(
fd, TCIFLUSH);
805 tcflush(
fd, TCIFLUSH);
810 if (bool_return[0] ==
'0')
825 int nbytes_write = 0;
830 snprintf(read_buffer,
sizeof(read_buffer),
"%s%d#",
cmd, data);
834 tcflush(
fd, TCIFLUSH);
842 tcflush(
fd, TCIFLUSH);
868 snprintf(read_buffer,
sizeof(read_buffer),
":So%02d*#",
min);
887 snprintf(read_buffer,
sizeof(read_buffer),
":Sh%02d#",
max);
900 if (slewRate < 2 || slewRate > 8)
909 snprintf(read_buffer,
sizeof(read_buffer),
":Sw%d#", slewRate);
942 char read_buffer[22] = {0};
957 frac_m = (s / 60.0) * 10.;
958 snprintf(read_buffer,
sizeof(read_buffer),
":%s%02d:%02d.%01d#",
cmd, h, m, frac_m);
962 snprintf(read_buffer,
sizeof(read_buffer),
":%s%02d:%02d:%02d#",
cmd, h, m, s);
967 snprintf(read_buffer,
sizeof(read_buffer),
":%s%02d:%02d:%05.02f#",
cmd, h, m, d_s);
1012 char read_buffer[22] = {0};
1020 snprintf(read_buffer,
sizeof(read_buffer),
":%s-%02d*%02d#",
cmd, d, m);
1022 snprintf(read_buffer,
sizeof(read_buffer),
":%s%+03d*%02d#",
cmd, d, m);
1028 snprintf(read_buffer,
sizeof(read_buffer),
":%s-%02d*%02d:%02d#",
cmd, d, m, s);
1030 snprintf(read_buffer,
sizeof(read_buffer),
":%s%+03d*%02d:%02d#",
cmd, d, m, s);
1037 snprintf(read_buffer,
sizeof(read_buffer),
":%s-%02d*%02d:%04.1f#",
cmd, d, m, d_s);
1039 snprintf(read_buffer,
sizeof(read_buffer),
":%s%+03d*%02d:%04.1f#",
cmd, d, m, d_s);
1052 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
"%s %02d:%02d:%02d#" :
"%s%02d:%02d:%02d#",
cmd, x, y, z);
1063 int nbytes_write = 0;
1091 tcflush(
fd, TCIFLUSH);
1098 const struct timespec timeout = {0, 10000000L};
1102 int nbytes_write = 0, nbytes_read = 0;
1124 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":SC %02d/%02d/%02d#" :
":SC%02d/%02d/%02d#", mm, dd, yy);
1128 tcflush(
fd, TCIFLUSH);
1138 tcflush(
fd, TCIFLUSH);
1140 if (nbytes_read < 1)
1146 read_buffer[1] =
'\0';
1150 if (read_buffer[0] ==
'0')
1154 nanosleep(&timeout,
nullptr);
1155 tcflush(
fd, TCIFLUSH);
1174 snprintf(read_buffer,
sizeof(read_buffer),
":SG%+04.01lf#", hours);
1189 double LX200Longitude = -1.0 * CartographicLongitude;
1213 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":Sg %03d*%02d#" :
":Sg%03d*%02d#", d, m);
1217 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":Sg %03d*%02d:%02d#" :
":Sg%03d*%02d:%02d#", d, m, s);
1222 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":Sg %03d*%02d:%04.01lf#" :
":Sg%03d*%02d:%04.01lf#", d, m, s_f);
1260 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":St %+03d*%02d#" :
":St%+03d*%02d#", d, m);
1264 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":St %+03d*%02d:%02d#" :
":St%+03d*%02d:%02d#", d, m, s);
1269 snprintf(read_buffer,
sizeof(read_buffer), addSpace ?
":St %+03d*%02d:%04.01lf#" :
":St%+03d*%02d:%04.01lf#", d, m, s_f);
1296 snprintf(read_buffer,
sizeof(read_buffer),
":Sz%03d*%02d#", d, m);
1318 snprintf(read_buffer,
sizeof(read_buffer),
":Sa%+02d*%02d#", d, m);
1343 snprintf(read_buffer,
sizeof(read_buffer),
":SM%s#", siteName);
1346 snprintf(read_buffer,
sizeof(read_buffer),
":SN%s#", siteName);
1349 snprintf(read_buffer,
sizeof(read_buffer),
":SO%s#", siteName);
1352 snprintf(read_buffer,
sizeof(read_buffer),
":SP%s#", siteName);
1365 int nbytes_write = 0;
1401 tcflush(
fd, TCIFLUSH);
1409 int nbytes_write = 0;
1431 tcflush(
fd, TCIFLUSH);
1439 int nbytes_write = 0;
1467 tcflush(
fd, TCIFLUSH);
1476 int nbytes_write = 0;
1489 tcflush(
fd, TCIFLUSH);
1497 snprintf(speed_str, 8,
":F%d#", speed);
1504 tcflush(
fd, TCIFLUSH);
1545 snprintf(read_buffer,
sizeof(read_buffer),
":ST%05.01lf#", trackF);
1556 snprintf(read_buffer,
sizeof(read_buffer),
":ST%08.5f#", trackF);
1573 int nbytes_write = 0, nbytes_read = 0;
1592 if (nbytes_read < 1)
1599 tcflush(
fd, TCIFLUSH);
1603 error_type = slewNum[0] -
'0';
1604 if ((error_type >= 0) && (error_type <= 9))
1617 int nbytes_write = 0;
1649 tcflush(
fd, TCIFLUSH);
1653 int SendPulseCmd(
int fd,
int direction,
int duration_msec,
bool wait_after_command,
int max_wait_ms)
1656 int nbytes_write = 0;
1671 sprintf(
cmd,
":Mgn%04d#", duration_msec);
1674 sprintf(
cmd,
":Mgs%04d#", duration_msec);
1677 sprintf(
cmd,
":Mge%04d#", duration_msec);
1680 sprintf(
cmd,
":Mgw%04d#", duration_msec);
1693 tcflush(
fd, TCIFLUSH);
1695 if(wait_after_command){
1696 if (duration_msec > max_wait_ms)
1697 duration_msec = max_wait_ms;
1698 struct timespec duration_ns = {.tv_sec = 0,.tv_nsec = duration_msec*1000000};
1699 nanosleep(&duration_ns, NULL);
1708 int nbytes_write = 0;
1750 tcflush(
fd, TCIFLUSH);
1758 int nbytes_write = 0;
1769 tcflush(
fd, TCIFLUSH);
1776 const struct timespec timeout = {0, 10000000L};
1778 int nbytes_write = 0, nbytes_read = 0;
1807 if (nbytes_read < 1)
1810 matchedObject[nbytes_read - 1] =
'\0';
1815 nanosleep(&timeout,
nullptr);
1816 tcflush(
fd, TCIFLUSH);
1825 int nbytes_write = 0;
1869 tcflush(
fd, TCIFLUSH);
1878 int nbytes_write = 0;
1898 snprintf(read_buffer,
sizeof(read_buffer),
":LS%d#", NNNN);
1901 snprintf(read_buffer,
sizeof(read_buffer),
":LC%d#", NNNN);
1904 snprintf(read_buffer,
sizeof(read_buffer),
":LM%d#", NNNN);
1919 tcflush(
fd, TCIFLUSH);
1955 snprintf(read_buffer,
sizeof(read_buffer),
":LsD%d#", subCatalog);
1958 snprintf(read_buffer,
sizeof(read_buffer),
":LoD%d#", subCatalog);
1984 int nbytes_write = 0, nbytes_read = 0;
1991 tcflush(
fd, TCIFLUSH);
2012 if (nbytes_read < 1)
2018 read_buffer[nbytes_read - 1] =
'\0';
2023 if (nbytes_read >= 11 && read_buffer[8] ==
'.')
2031 if (read_buffer[5] ==
'.')
2065 else if (read_buffer[8] ==
'.')
2080 tcflush(
fd, TCIFLUSH);
2087 if (nbytes_read < 1)
2093 read_buffer[nbytes_read - 1] =
'\0';
2097 if (read_buffer[5] ==
'.')
2108 tcflush(
fd, TCIFLUSH);
2117 int nbytes_write = 0;
2153 tcflush(
fd, TCIFLUSH);
void getSexComponentsIID(double value, int *d, int *m, double *s)
int f_scansexa(const char *str0, double *dp)
convert sexagesimal string str AxBxC to double. x can be anything non-numeric. Any missing A,...
void getSexComponents(double value, int *d, int *m, int *s)
int tty_read(int fd, char *buf, int nbytes, int timeout, int *nbytes_read)
read buffer from terminal
int tty_write_string(int fd, const char *buf, int *nbytes_written)
Writes a null terminated string to fd.
int tty_nread_section(int fd, char *buf, int nsize, char stop_char, int timeout, int *nbytes_read)
read buffer from terminal with a delimiter
Implementations for common driver routines.
#define DEBUGDEVICE(device, priority, msg)
#define DEBUGFDEVICE(device, priority, msg,...)
int setFocuserMotion(int fd, int motionType)
int setAlignmentMode(int fd, unsigned int alignMode)
char lx200Name[MAXINDIDEVICE]
int setSlewMode(int fd, int slewMode)
int setObjAlt(int fd, double alt)
int setMinElevationLimit(int fd, int min)
std::mutex lx200CommsLock
int getHomeSearchStatus(int fd, int *status)
int SendPulseCmd(int fd, int direction, int duration_msec, bool wait_after_command, int max_wait_ms)
int getSiteLongitude(int fd, int *ddd, int *mm, double *ssf)
int setObjAz(int fd, double az)
int selectTrackingMode(int fd, int trackMode)
int setLocalTime(int fd, int x, int y, int z, bool addSpace)
int getSiteLatitudeAlt(int fd, int *dd, int *mm, double *ssf, const char *cmd)
int setMaxSlewRate(int fd, int slewRate)
int getSiteName(int fd, char *siteName, int siteNum)
int setMaxElevationLimit(int fd, int max)
int selectSite(int fd, int siteNum)
int getCommandInt(int fd, int *value, const char *cmd)
int setSDTime(int fd, int x, int y, int z, bool addSpace)
int setObjectRA(int fd, double ra, bool addSpace)
int getLX200EquatorialFormat()
int setStandardProcedure(int fd, const char *data)
int setSiteLongitude(int fd, double CartographicLongitude, bool addSpace)
int selectSubCatalog(int fd, int catalog, int subCatalog)
int setObjectDEC(int fd, double dec, bool addSpace)
int checkLX200EquatorialFormat(int fd)
int setSiteLatitude(int fd, double Lat, bool addSpace)
int getCommandSexa(int fd, double *value, const char *cmd)
int Sync(int fd, char *matchedObject)
int setTrackFreq(int fd, double trackF)
int setFocuserSpeedMode(int fd, int speedMode)
int setCalenderDate(int fd, int dd, int mm, int yy, bool addSpace)
int getCalendarDate(int fd, char *date)
int MoveTo(int fd, int direction)
int setCommandXYZ(int fd, int x, int y, int z, const char *cmd, bool addSpace)
int getTimeFormat(int fd, int *format)
int setCommandInt(int fd, int data, const char *cmd)
int getOTATemp(int fd, double *value)
int getLX200GeographicFormat()
int getTrackFreq(int fd, double *value)
int setPreciseTrackFreq(int fd, double trackF)
int setSiteName(int fd, char *siteName, int siteNum)
void setLX200Debug(const char *deviceName, unsigned int debug_level)
int setUTCOffset(int fd, double hours)
int check_lx200_connection(int in_fd)
int setGPSFocuserSpeed(int fd, int speed)
int getSiteLongitudeAlt(int fd, int *ddd, int *mm, double *ssf, const char *cmd)
int HaltMovement(int fd, int direction)
int getCommandString(int fd, char *data, const char *cmd)
int getSiteLatitude(int fd, int *dd, int *mm, double *ssf)
int isSlewComplete(int fd)
int selectCatalogObject(int fd, int catalog, int NNNN)
@ LX200_GEO_LONGER_FORMAT