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

Last change on this file since 689 was 490, checked in by campagne, 15 years ago

import libindi (JEC)

File size: 10.1 KB
Line 
1/*
2 LX200 Classoc
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 "lx200classic.h"
22#include "lx200driver.h"
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27
28extern LX200Generic *telescope;
29extern INumberVectorProperty EquatorialCoordsWNP;
30extern INumberVectorProperty EquatorialCoordsRNP;
31extern ITextVectorProperty TimeTP;
32extern int MaxReticleFlashRate;
33
34/* Handy Macros */
35#define currentRA EquatorialCoordsRNP.np[0].value
36#define currentDEC EquatorialCoordsRNP.np[1].value
37#define targetRA EquatorialCoordsWNP.np[0].value
38#define targetDEC EquatorialCoordsWNP.np[1].value
39
40#define BASIC_GROUP "Main Control"
41#define LIBRARY_GROUP "Library"
42#define MOVE_GROUP "Movement Control"
43
44static IText ObjectText[] = {{"objectText", "Info", 0, 0, 0, 0}};
45static ITextVectorProperty ObjectInfoTP = {mydev, "Object Info", "", BASIC_GROUP, IP_RO, 0, IPS_IDLE, ObjectText, NARRAY(ObjectText), "", 0};
46
47/* Library group */
48static ISwitch StarCatalogS[] = {{"STAR", "", ISS_ON, 0, 0}, {"SAO", "", ISS_OFF, 0, 0}, {"GCVS", "", ISS_OFF, 0, 0}};
49static ISwitch DeepSkyCatalogS[] = {{"NGC", "", ISS_ON, 0, 0}, {"IC", "", ISS_OFF, 0, 0}, {"UGC", "", ISS_OFF, 0, 0}, {"Caldwell", "", ISS_OFF, 0, 0}, {"Arp", "", ISS_OFF, 0, 0}, {"Abell", "", ISS_OFF, 0, 0}, {"Messier", "", ISS_OFF, 0, 0}};
50static ISwitch SolarS[] = { {"Select", "Select item...", ISS_ON, 0, 0}, {"1", "Mercury", ISS_OFF,0 , 0}, {"2", "Venus", ISS_OFF, 0, 0}, {"3", "Moon", ISS_OFF, 0, 0}, {"4", "Mars", ISS_OFF, 0, 0}, {"5", "Jupiter", ISS_OFF, 0, 0}, {"6", "Saturn", ISS_OFF, 0, 0}, {"7", "Uranus", ISS_OFF, 0, 0}, {"8", "Neptune", ISS_OFF, 0, 0}, {"9", "Pluto", ISS_OFF, 0 ,0}};
51
52static ISwitchVectorProperty StarCatalogSP = { mydev, "Star Catalogs", "", LIBRARY_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, StarCatalogS, NARRAY(StarCatalogS), "", 0};
53static ISwitchVectorProperty DeepSkyCatalogSP= { mydev, "Deep Sky Catalogs", "", LIBRARY_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, DeepSkyCatalogS, NARRAY(DeepSkyCatalogS), "", 0};
54static ISwitchVectorProperty SolarSP = { mydev, "SOLAR_SYSTEM", "Solar System", LIBRARY_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, SolarS, NARRAY(SolarS), "", 0};
55
56static INumber ObjectN[] = {{ "ObjectN", "Number", "%g", 1., 10000., 1., 0., 0, 0, 0}};
57static INumberVectorProperty ObjectNoNP= { mydev, "Object Number", "", LIBRARY_GROUP, IP_RW, 0, IPS_IDLE, ObjectN, NARRAY(ObjectN), "", 0 };
58
59static INumber MaxSlew[] = {{"maxSlew", "Rate", "%g", 2.0, 9.0, 1.0, 9., 0, 0 ,0}};
60static INumberVectorProperty MaxSlewRateNP = { mydev, "Max slew Rate", "", MOVE_GROUP, IP_RW, 0, IPS_IDLE, MaxSlew, NARRAY(MaxSlew), "", 0};
61
62static INumber altLimit[] = {
63 {"minAlt", "min Alt", "%+03f", -90., 90., 0., 0., 0, 0, 0},
64 {"maxAlt", "max Alt", "%+03f", -90., 90., 0., 0., 0, 0, 0}};
65static INumberVectorProperty ElevationLimitNP = { mydev, "altLimit", "Slew elevation Limit", BASIC_GROUP, IP_RW, 0, IPS_IDLE, altLimit, NARRAY(altLimit), "", 0};
66
67void changeLX200ClassicDeviceName(const char *newName)
68{
69 strcpy(ObjectInfoTP.device, newName);
70 strcpy(SolarSP.device, newName);
71 strcpy(StarCatalogSP.device, newName);
72 strcpy(DeepSkyCatalogSP.device, newName);
73 strcpy(ObjectNoNP.device, newName);
74 strcpy(MaxSlewRateNP.device , newName );
75 strcpy(ElevationLimitNP.device , newName );
76}
77
78LX200Classic::LX200Classic() : LX200Generic()
79{
80 ObjectInfoTP.tp[0].text = NULL;
81
82 currentCatalog = LX200_STAR_C;
83 currentSubCatalog = 0;
84
85}
86
87void LX200Classic::ISGetProperties (const char *dev)
88{
89
90if (dev && strcmp (thisDevice, dev))
91 return;
92
93 LX200Generic::ISGetProperties(dev);
94
95 IDDefNumber (&ElevationLimitNP, NULL);
96 IDDefText (&ObjectInfoTP, NULL);
97 IDDefSwitch (&SolarSP, NULL);
98 IDDefSwitch (&StarCatalogSP, NULL);
99 IDDefSwitch (&DeepSkyCatalogSP, NULL);
100 IDDefNumber (&ObjectNoNP, NULL);
101 IDDefNumber (&MaxSlewRateNP, NULL);
102
103}
104
105void LX200Classic::ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n)
106{
107 // ignore if not ours //
108 if (strcmp (dev, thisDevice))
109 return;
110
111 LX200Generic::ISNewText (dev, name, texts, names, n);
112}
113
114
115void LX200Classic::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
116{
117 int err=0;
118
119 // ignore if not ours //
120 if (strcmp (dev, thisDevice))
121 return;
122
123 if ( !strcmp (name, ObjectNoNP.name) )
124 {
125
126 char object_name[256];
127
128 if (checkPower(&ObjectNoNP))
129 return;
130
131 if (selectCatalogObject(fd, currentCatalog, (int) values[0]) < 0)
132 {
133 ObjectNoNP.s = IPS_ALERT;
134 IDSetNumber(&ObjectNoNP, "Failed to select catalog object.");
135 return;
136 }
137
138 getLX200RA(fd, &targetRA);
139 getLX200DEC(fd, &targetDEC);
140
141 ObjectNoNP.s = IPS_OK;
142 IDSetNumber(&ObjectNoNP , "Object updated.");
143
144 if (getObjectInfo(fd, object_name) < 0)
145 IDMessage(thisDevice, "Getting object info failed.");
146 else
147 {
148 IUSaveText(&ObjectInfoTP.tp[0], object_name);
149 IDSetText (&ObjectInfoTP, NULL);
150 }
151
152 handleCoordSet();
153 return;
154 }
155
156 if ( !strcmp (name, MaxSlewRateNP.name) )
157 {
158
159 if (checkPower(&MaxSlewRateNP))
160 return;
161
162 if ( ( err = setMaxSlewRate(fd, (int) values[0]) < 0) )
163 {
164 handleError(&MaxSlewRateNP, err, "Setting maximum slew rate");
165 return;
166 }
167 MaxSlewRateNP.s = IPS_OK;
168 MaxSlewRateNP.np[0].value = values[0];
169 IDSetNumber(&MaxSlewRateNP, NULL);
170 return;
171 }
172
173
174 if (!strcmp (name, ElevationLimitNP.name))
175 {
176 // new elevation limits
177 double minAlt = 0, maxAlt = 0;
178 int i, nset;
179
180 if (checkPower(&ElevationLimitNP))
181 return;
182
183 for (nset = i = 0; i < n; i++)
184 {
185 INumber *altp = IUFindNumber (&ElevationLimitNP, names[i]);
186 if (altp == &altLimit[0])
187 {
188 minAlt = values[i];
189 nset += minAlt >= -90.0 && minAlt <= 90.0;
190 } else if (altp == &altLimit[1])
191 {
192 maxAlt = values[i];
193 nset += maxAlt >= -90.0 && maxAlt <= 90.0;
194 }
195 }
196 if (nset == 2)
197 {
198 //char l[32], L[32];
199 if ( ( err = setMinElevationLimit(fd, (int) minAlt) < 0) )
200 {
201 handleError(&ElevationLimitNP, err, "Setting elevation limit");
202 }
203 setMaxElevationLimit(fd, (int) maxAlt);
204 ElevationLimitNP.np[0].value = minAlt;
205 ElevationLimitNP.np[1].value = maxAlt;
206 ElevationLimitNP.s = IPS_OK;
207 IDSetNumber (&ElevationLimitNP, NULL);
208 } else
209 {
210 ElevationLimitNP.s = IPS_IDLE;
211 IDSetNumber(&ElevationLimitNP, "elevation limit missing or invalid");
212 }
213
214 return;
215 }
216
217 LX200Generic::ISNewNumber (dev, name, values, names, n);
218}
219
220 void LX200Classic::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
221 {
222
223 int index=0;
224
225 // ignore if not ours //
226 if (strcmp (dev, thisDevice))
227 return;
228
229 // Star Catalog
230 if (!strcmp (name, StarCatalogSP.name))
231 {
232 if (checkPower(&StarCatalogSP))
233 return;
234
235 IUResetSwitch(&StarCatalogSP);
236 IUUpdateSwitch(&StarCatalogSP, states, names, n);
237 index = getOnSwitch(&StarCatalogSP);
238
239 currentCatalog = LX200_STAR_C;
240
241 if (selectSubCatalog(fd, currentCatalog, index))
242 {
243 currentSubCatalog = index;
244 StarCatalogSP.s = IPS_OK;
245 IDSetSwitch(&StarCatalogSP, NULL);
246 }
247 else
248 {
249 StarCatalogSP.s = IPS_IDLE;
250 IDSetSwitch(&StarCatalogSP, "Catalog unavailable");
251 }
252 return;
253 }
254
255 // Deep sky catalog
256 if (!strcmp (name, DeepSkyCatalogSP.name))
257 {
258 if (checkPower(&DeepSkyCatalogSP))
259 return;
260
261 IUResetSwitch(&DeepSkyCatalogSP);
262 IUUpdateSwitch(&DeepSkyCatalogSP, states, names, n);
263 index = getOnSwitch(&DeepSkyCatalogSP);
264
265 if (index == LX200_MESSIER_C)
266 {
267 currentCatalog = index;
268 DeepSkyCatalogSP.s = IPS_OK;
269 IDSetSwitch(&DeepSkyCatalogSP, NULL);
270 return;
271 }
272 else
273 currentCatalog = LX200_DEEPSKY_C;
274
275 if (selectSubCatalog(fd, currentCatalog, index))
276 {
277 currentSubCatalog = index;
278 DeepSkyCatalogSP.s = IPS_OK;
279 IDSetSwitch(&DeepSkyCatalogSP, NULL);
280 }
281 else
282 {
283 DeepSkyCatalogSP.s = IPS_IDLE;
284 IDSetSwitch(&DeepSkyCatalogSP, "Catalog unavailable");
285 }
286 return;
287 }
288
289 // Solar system
290 if (!strcmp (name, SolarSP.name))
291 {
292
293 if (checkPower(&SolarSP))
294 return;
295
296 if (IUUpdateSwitch(&SolarSP, states, names, n) < 0)
297 return;
298
299 index = getOnSwitch(&SolarSP);
300
301 // We ignore the first option : "Select item"
302 if (index == 0)
303 {
304 SolarSP.s = IPS_IDLE;
305 IDSetSwitch(&SolarSP, NULL);
306 return;
307 }
308
309 selectSubCatalog (fd, LX200_STAR_C, LX200_STAR);
310 selectCatalogObject(fd, LX200_STAR_C, index + 900);
311
312 ObjectNoNP.s = IPS_OK;
313 SolarSP.s = IPS_OK;
314
315 getObjectInfo(fd, ObjectInfoTP.tp[0].text);
316 IDSetNumber(&ObjectNoNP , "Object updated.");
317 IDSetSwitch(&SolarSP, NULL);
318
319 if (currentCatalog == LX200_STAR_C || currentCatalog == LX200_DEEPSKY_C)
320 selectSubCatalog(fd, currentCatalog, currentSubCatalog);
321
322 getObjectRA(fd, &targetRA);
323 getObjectDEC(fd, &targetDEC);
324
325 handleCoordSet();
326
327 return;
328 }
329
330 LX200Generic::ISNewSwitch (dev, name, states, names, n);
331
332 }
333
334 void LX200Classic::ISPoll ()
335 {
336
337 LX200Generic::ISPoll();
338
339 }
340
341 void LX200Classic::getBasicData()
342 {
343
344 // process parent first
345 LX200Generic::getBasicData();
346
347 }
Note: See TracBrowser for help on using the repository browser.