source: BAORadio/libindi/v1.0.1/drivers/telescope/lx200autostar.cpp @ 614

Last change on this file since 614 was 490, checked in by campagne, 14 years ago

import libindi (JEC)

File size: 7.1 KB
Line 
1/*
2    LX200 Autostar
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*/
20
21#include "lx200autostar.h"
22#include "lx200driver.h"
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <unistd.h>
28
29#define BASIC_GROUP   "Main Control"
30#define FIRMWARE_GROUP "Firmware data"
31#define FOCUS_GROUP   "Focus Control"
32
33
34extern LX200Generic *telescope;
35extern int MaxReticleFlashRate;
36extern ITextVectorProperty TimeTP;
37extern INumberVectorProperty SDTimeNP;
38extern INumberVectorProperty EquatorialCoordsWNP;
39extern INumberVectorProperty EquatorialCoordsRNP;
40extern INumberVectorProperty FocusTimerNP;
41extern ISwitchVectorProperty ConnectSP;
42extern ISwitchVectorProperty FocusMotionSP;
43extern ISwitchVectorProperty AbortSlewSP;
44extern ISwitchVectorProperty MovementNSSP;
45extern ISwitchVectorProperty MovementWESP;
46
47
48static IText   VersionT[] ={{ "Date", "", 0, 0, 0, 0} ,
49                           { "Time", "", 0, 0, 0, 0} ,
50                           { "Number", "", 0, 0, 0 ,0} ,
51                           { "Full", "", 0, 0, 0, 0} ,
52                           { "Name", "" ,0 ,0 ,0 ,0}};
53
54static ITextVectorProperty VersionInfo = {mydev, "Firmware Info", "", FIRMWARE_GROUP, IP_RO, 0, IPS_IDLE, VersionT, NARRAY(VersionT), "" ,0};
55
56// Focus Control
57static INumber  FocusSpeedN[]    = {{"SPEED", "Speed", "%0.f", 0.0, 4.0, 1.0, 0.0, 0, 0, 0}};
58static INumberVectorProperty    FocusSpeedNP  = {mydev, "FOCUS_SPEED", "Speed", FOCUS_GROUP, IP_RW, 0, IPS_IDLE, FocusSpeedN, NARRAY(FocusSpeedN), "", 0};
59
60/********************************************
61 Property: Park telescope to HOME
62*********************************************/
63static ISwitch ParkS[]                  = { {"PARK", "Park", ISS_OFF, 0, 0} };
64ISwitchVectorProperty ParkSP            = {mydev, "TELESCOPE_PARK", "Park Scope", BASIC_GROUP, IP_RW, ISR_ATMOST1, 0, IPS_IDLE, ParkS, NARRAY(ParkS), "", 0 };
65
66
67void changeLX200AutostarDeviceName(const char *newName)
68{
69  strcpy(VersionInfo.device, newName);
70  strcpy(FocusSpeedNP.device, newName);
71  strcpy(ParkSP.device, newName);
72}
73
74LX200Autostar::LX200Autostar() : LX200Generic()
75{
76
77}
78
79void LX200Autostar::ISGetProperties (const char *dev)
80{
81
82if (dev && strcmp (thisDevice, dev))
83    return;
84
85    LX200Generic::ISGetProperties(dev);
86
87    IDDefSwitch (&ParkSP, NULL);
88    IDDefText   (&VersionInfo, NULL);
89    IDDefNumber (&FocusSpeedNP, NULL);
90
91    // For Autostar, we have a different focus speed method
92    // Therefore, we don't need the classical one
93    IDDelete(thisDevice, "FOCUS_MODE", NULL);
94
95}
96
97void LX200Autostar::ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n)
98{
99        // ignore if not ours //
100        if (strcmp (dev, thisDevice))
101            return;
102
103        // suppress warning
104        n=n;
105
106  LX200Generic::ISNewText (dev, name, texts, names, n);
107
108}
109
110
111void LX200Autostar::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
112{
113        // ignore if not ours
114        if (strcmp (dev, thisDevice))
115            return;
116
117        // Focus speed
118        if (!strcmp (name, FocusSpeedNP.name))
119        {
120          if (checkPower(&FocusSpeedNP))
121           return;
122
123          if (IUUpdateNumber(&FocusSpeedNP, values, names, n) < 0)
124                return;
125
126          setGPSFocuserSpeed(fd,  ( (int) FocusSpeedN[0].value));
127          FocusSpeedNP.s = IPS_OK;
128          IDSetNumber(&FocusSpeedNP, NULL);
129          return;
130        }
131
132    LX200Generic::ISNewNumber (dev, name, values, names, n);
133}
134
135 void LX200Autostar::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
136 {
137   int index=0, err=0;
138 
139   if (!strcmp(name, ParkSP.name))
140   {
141          if (checkPower(&ParkSP))
142            return;
143           
144          if (EquatorialCoordsWNP.s == IPS_BUSY)
145          {
146             if (abortSlew(fd) < 0)
147             {
148                AbortSlewSP.s = IPS_ALERT;
149                IDSetSwitch(&AbortSlewSP, NULL);
150                slewError(err);
151                return;
152             }
153
154             AbortSlewSP.s = IPS_OK;
155             EquatorialCoordsWNP.s       = IPS_IDLE;
156             IDSetSwitch(&AbortSlewSP, "Slew aborted.");
157             IDSetNumber(&EquatorialCoordsWNP, NULL);
158
159             if (MovementNSSP.s == IPS_BUSY || MovementWESP.s == IPS_BUSY)
160             {
161                MovementNSSP.= MovementWESP.s =  IPS_IDLE; 
162                EquatorialCoordsWNP.s       = IPS_IDLE;
163                IUResetSwitch(&MovementNSSP);
164                IUResetSwitch(&MovementWESP);
165                IUResetSwitch(&AbortSlewSP);
166
167                IDSetSwitch(&MovementNSSP, NULL);
168                IDSetSwitch(&MovementWESP, NULL);
169              }
170
171             // sleep for 200 mseconds
172             usleep(200000);
173          }
174
175          if (slewToPark(fd) < 0)
176          {
177                ParkSP.s = IPS_ALERT;
178                IDSetSwitch(&ParkSP, "Parking Failed.");
179                return;
180          }
181
182          ParkSP.s = IPS_OK;
183          ConnectSP.s   = IPS_IDLE;
184          ConnectSP.sp[0].s = ISS_OFF;
185          ConnectSP.sp[1].s = ISS_ON;
186          tty_disconnect(fd);
187          IDSetSwitch(&ParkSP, "The telescope is slewing to park position. Turn off the telescope after park is complete. Disconnecting...");
188          IDSetSwitch(&ConnectSP, NULL);
189          return;
190    }
191
192        // Focus Motion
193        if (!strcmp (name, FocusMotionSP.name))
194        {
195          if (checkPower(&FocusMotionSP))
196           return;
197
198          IUResetSwitch(&FocusMotionSP);
199         
200          // If speed is "halt"
201          if (FocusSpeedN[0].value == 0)
202          {
203            FocusMotionSP.s = IPS_IDLE;
204            IDSetSwitch(&FocusMotionSP, NULL);
205            return;
206          }
207         
208          IUUpdateSwitch(&FocusMotionSP, states, names, n);
209          index = getOnSwitch(&FocusMotionSP);
210         
211         
212          if ( ( err = setFocuserMotion(fd, index) < 0) )
213          {
214             handleError(&FocusMotionSP, err, "Setting focuser speed");
215             return;
216          }
217         
218          FocusMotionSP.s = IPS_BUSY;
219         
220          // with a timer
221        if (FocusTimerNP.np[0].value > 0) 
222        {
223             FocusTimerNP.= IPS_BUSY;
224             IDLog("Starting Focus Timer BUSY\n");
225             IEAddTimer(50, LX200Generic::updateFocusTimer, this);
226        }
227         
228          IDSetSwitch(&FocusMotionSP, NULL);
229          return;
230        }
231
232   LX200Generic::ISNewSwitch (dev, name, states, names,  n);
233
234 }
235
236 void LX200Autostar::ISPoll ()
237 {
238
239      LX200Generic::ISPoll();
240
241 }
242
243 void LX200Autostar::getBasicData()
244 {
245
246   VersionInfo.tp[0].text = new char[64];
247   getVersionDate(fd, VersionInfo.tp[0].text);
248   VersionInfo.tp[1].text = new char[64];
249   getVersionTime(fd, VersionInfo.tp[1].text);
250   VersionInfo.tp[2].text = new char[64];
251   getVersionNumber(fd, VersionInfo.tp[2].text);
252   VersionInfo.tp[3].text = new char[128];
253   getFullVersion(fd, VersionInfo.tp[3].text);
254   VersionInfo.tp[4].text = new char[128];
255   getProductName(fd, VersionInfo.tp[4].text);
256
257   IDSetText(&VersionInfo, NULL);
258   
259   // process parent
260   LX200Generic::getBasicData();
261
262 }
Note: See TracBrowser for help on using the repository browser.