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 | |
---|
41 | int controller_format; |
---|
42 | |
---|
43 | /************************************************************************** |
---|
44 | Diagnostics |
---|
45 | **************************************************************************/ |
---|
46 | char ACK(int fd); |
---|
47 | /*int testTelescope(void); |
---|
48 | int testAP(void);*/ |
---|
49 | int 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 */ |
---|
56 | int getCommandSexa(int fd, double *value, const char *cmd); |
---|
57 | /* Get String */ |
---|
58 | int getCommandString(int fd, char *data, const char* cmd); |
---|
59 | /* Get Int */ |
---|
60 | int getCommandInt(int fd, int *value, const char* cmd); |
---|
61 | /* Get tracking frequency */ |
---|
62 | int getTrackFreq(int fd, double * value); |
---|
63 | /* Get site Latitude */ |
---|
64 | int getSiteLatitude(int fd, int *dd, int *mm); |
---|
65 | /* Get site Longitude */ |
---|
66 | int getSiteLongitude(int fd, int *ddd, int *mm); |
---|
67 | /* Get Calender data */ |
---|
68 | int getCalenderDate(int fd, char *date); |
---|
69 | /* Get site Name */ |
---|
70 | int getSiteName(int fd, char *siteName, int siteNum); |
---|
71 | /* Get Number of Bars */ |
---|
72 | int getNumberOfBars(int fd, int *value); |
---|
73 | /* Get Home Search Status */ |
---|
74 | int getHomeSearchStatus(int fd, int *status); |
---|
75 | /* Get OTA Temperature */ |
---|
76 | int getOTATemp(int fd, double * value); |
---|
77 | /* Get time format: 12 or 24 */ |
---|
78 | int getTimeFormat(int fd, int *format); |
---|
79 | |
---|
80 | |
---|
81 | /************************************************************************** |
---|
82 | Set Commands |
---|
83 | **************************************************************************/ |
---|
84 | |
---|
85 | /* Set Int */ |
---|
86 | int setCommandInt(int fd, int data, const char *cmd); |
---|
87 | /* Set Sexigesimal */ |
---|
88 | int setCommandXYZ(int fd, int x, int y, int z, const char *cmd); |
---|
89 | /* Common routine for Set commands */ |
---|
90 | int setStandardProcedure(int fd, char * writeData); |
---|
91 | /* Set Slew Mode */ |
---|
92 | int setSlewMode(int fd, int slewMode); |
---|
93 | /* Set Alignment mode */ |
---|
94 | int setAlignmentMode(int fd, unsigned int alignMode); |
---|
95 | /* Set Object RA */ |
---|
96 | int setObjectRA(int fd, double ra); |
---|
97 | /* set Object DEC */ |
---|
98 | int setObjectDEC(int fd, double dec); |
---|
99 | /* Set Calender date */ |
---|
100 | int setCalenderDate(int fd, int dd, int mm, int yy); |
---|
101 | /* Set UTC offset */ |
---|
102 | int setUTCOffset(int fd, double hours); |
---|
103 | /* Set Track Freq */ |
---|
104 | int setTrackFreq(int fd, double trackF); |
---|
105 | /* Set current site longitude */ |
---|
106 | int setSiteLongitude(int fd, double Long); |
---|
107 | /* Set current site latitude */ |
---|
108 | int setSiteLatitude(int fd, double Lat); |
---|
109 | /* Set Object Azimuth */ |
---|
110 | int setObjAz(int fd, double az); |
---|
111 | /* Set Object Altitude */ |
---|
112 | int setObjAlt(int fd, double alt); |
---|
113 | /* Set site name */ |
---|
114 | int setSiteName(int fd, char * siteName, int siteNum); |
---|
115 | /* Set maximum slew rate */ |
---|
116 | int setMaxSlewRate(int fd, int slewRate); |
---|
117 | /* Set focuser motion */ |
---|
118 | int setFocuserMotion(int fd, int motionType); |
---|
119 | /* Set focuser speed mode */ |
---|
120 | int setFocuserSpeedMode (int fd, int speedMode); |
---|
121 | /* Set minimum elevation limit */ |
---|
122 | int setMinElevationLimit(int fd, int min); |
---|
123 | /* Set maximum elevation limit */ |
---|
124 | int setMaxElevationLimit(int fd, int max); |
---|
125 | |
---|
126 | /************************************************************************** |
---|
127 | Motion Commands |
---|
128 | **************************************************************************/ |
---|
129 | /* Slew to the selected coordinates */ |
---|
130 | int Slew(int fd); |
---|
131 | /* Synchronize to the selected coordinates and return the matching object if any */ |
---|
132 | int Sync(int fd, char *matchedObject); |
---|
133 | /* Abort slew in all axes */ |
---|
134 | int abortSlew(int fd); |
---|
135 | /* Move into one direction, two valid directions can be stacked */ |
---|
136 | int MoveTo(int fd, int direction); |
---|
137 | /* Half movement in a particular direction */ |
---|
138 | int HaltMovement(int fd, int direction); |
---|
139 | /* Select the tracking mode */ |
---|
140 | int selectTrackingMode(int fd, int trackMode); |
---|
141 | /* Select Astro-Physics tracking mode */ |
---|
142 | int selectAPTrackingMode(int fd, int trackMode); |
---|
143 | /* Send Pulse-Guide command (timed guide move), two valid directions can be stacked */ |
---|
144 | int SendPulseCmd(int fd, int direction, int duration_msec); |
---|
145 | |
---|
146 | /************************************************************************** |
---|
147 | Other Commands |
---|
148 | **************************************************************************/ |
---|
149 | /* Ensures LX200 RA/DEC format is long */ |
---|
150 | int checkLX200Format(int fd); |
---|
151 | /* Select a site from the LX200 controller */ |
---|
152 | int selectSite(int fd, int siteNum); |
---|
153 | /* Select a catalog object */ |
---|
154 | int selectCatalogObject(int fd, int catalog, int NNNN); |
---|
155 | /* Select a sub catalog */ |
---|
156 | int selectSubCatalog(int fd, int catalog, int subCatalog); |
---|
157 | |
---|
158 | int 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 | |
---|
189 | char 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 | |
---|
209 | int 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 | |
---|
240 | int 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 | |
---|
273 | int 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 | |
---|
303 | int 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 | |
---|
334 | int 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 | |
---|
369 | int 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 | |
---|
429 | int 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 | |
---|
460 | int 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 | |
---|
492 | int 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 | |
---|
528 | int 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 | |
---|
550 | int 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 | |
---|
580 | int 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 | |
---|
607 | int 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 | |
---|
638 | int 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 | |
---|
687 | int 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 | |
---|
720 | int 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 | |
---|
737 | int 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 | |
---|
746 | int 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 | |
---|
756 | int 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 | |
---|
770 | int 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 | |
---|
790 | int 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 | |
---|
823 | int 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 | |
---|
832 | int 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 | |
---|
864 | int 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 | |
---|
900 | int 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 | |
---|
912 | int 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 | |
---|
924 | int 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 | |
---|
936 | int 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 | |
---|
949 | int 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 | |
---|
962 | int 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 | |
---|
988 | int 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 | |
---|
1028 | int 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 | |
---|
1059 | int 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 | |
---|
1099 | int 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 | |
---|
1133 | int 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 | |
---|
1147 | int 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 | |
---|
1172 | int 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 | |
---|
1202 | int 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 | |
---|
1221 | int 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 | |
---|
1268 | int 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 | |
---|
1282 | int 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 | |
---|
1309 | int 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 | |
---|
1350 | int 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 | |
---|
1380 | int 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 | |
---|
1400 | int 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 | |
---|
1431 | int 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 | |
---|