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

Last change on this file since 689 was 490, checked in by campagne, 15 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.s = 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.s = 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.