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

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

import libindi (JEC)

File size: 9.9 KB
Line 
1/*
2 LX200 GPS
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 "lx200gps.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 GPSGroup "Extended GPS Features"
30
31extern LX200Generic *telescope;
32extern int MaxReticleFlashRate;
33
34static ISwitch GPSPowerS[] = {{ "On", "", ISS_OFF, 0, 0}, {"Off", "", ISS_ON, 0, 0}};
35static ISwitch GPSStatusS[] = {{ "Sleep", "", ISS_OFF, 0, 0}, {"Wake up", "", ISS_OFF, 0 ,0}, {"Restart", "", ISS_OFF, 0, 0}};
36static ISwitch GPSUpdateS[] = { {"Update GPS", "", ISS_OFF, 0, 0}, {"Update Client", "", ISS_OFF, 0, 0}};
37static ISwitch AltDecPecS[] = {{ "Enable", "", ISS_OFF, 0 ,0}, {"Disable", "", ISS_OFF, 0 ,0}};
38static ISwitch AzRaPecS[] = {{ "Enable", "", ISS_OFF, 0, 0}, {"Disable", "", ISS_OFF, 0 ,0}};
39static ISwitch SelenSyncS[] = {{ "Sync", "", ISS_OFF, 0, 0}};
40static ISwitch AltDecBackSlashS[] = {{ "Activate", "", ISS_OFF, 0, 0}};
41static ISwitch AzRaBackSlashS[] = {{ "Activate", "", ISS_OFF, 0, 0}};
42static ISwitch OTAUpdateS[] = {{ "Update", "", ISS_OFF, 0, 0}};
43
44static ISwitchVectorProperty GPSPowerSP = { mydev, "GPS Power", "", GPSGroup, IP_RW, ISR_1OFMANY, 0 , IPS_IDLE, GPSPowerS, NARRAY(GPSPowerS), "", 0};
45static ISwitchVectorProperty GPSStatusSP = { mydev, "GPS Status", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, GPSStatusS, NARRAY(GPSStatusS), "", 0};
46static ISwitchVectorProperty GPSUpdateSP = { mydev, "GPS System", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, GPSUpdateS, NARRAY(GPSUpdateS), "", 0};
47static ISwitchVectorProperty AltDecPecSP = { mydev, "Alt/Dec PEC", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, AltDecPecS, NARRAY(AltDecPecS), "", 0};
48static ISwitchVectorProperty AzRaPecSP = { mydev, "Az/Ra PEC", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, AzRaPecS, NARRAY(AzRaPecS), "", 0};
49static ISwitchVectorProperty SelenSyncSP = { mydev, "Selenographic Sync", "", GPSGroup, IP_RW, ISR_ATMOST1, 0, IPS_IDLE, SelenSyncS, NARRAY(SelenSyncS), "", 0};
50static ISwitchVectorProperty AltDecBackSlashSP = { mydev, "Alt/Dec Anti-backslash", "", GPSGroup, IP_RW, ISR_ATMOST1, 0, IPS_IDLE, AltDecBackSlashS, NARRAY(AltDecBackSlashS), "", 0};
51static ISwitchVectorProperty AzRaBackSlashSP = { mydev, "Az/Ra Anti-backslash", "", GPSGroup, IP_RW, ISR_ATMOST1, 0, IPS_IDLE, AzRaBackSlashS, NARRAY(AzRaBackSlashS), "", 0};
52static ISwitchVectorProperty OTAUpdateSP = { mydev, "OTA Update", "", GPSGroup, IP_RW, ISR_ATMOST1, 0, IPS_IDLE, OTAUpdateS, NARRAY(OTAUpdateS), "", 0};
53
54static INumber OTATempN[] = { {"Temp.", "", "%g", -200., 500., 0., 0., 0, 0, 0 } };
55static INumberVectorProperty OTATempNP = { mydev, "OTA Temperature (C)", "", GPSGroup, IP_RO, 0, IPS_IDLE, OTATempN, NARRAY(OTATempN), "", 0};
56
57void updateTemp(void *p);
58
59void changeLX200GPSDeviceName(const char *newName)
60{
61 strcpy(GPSPowerSP.device, newName);
62 strcpy(GPSStatusSP.device, newName );
63 strcpy(GPSUpdateSP.device, newName );
64 strcpy(AltDecPecSP.device, newName );
65 strcpy(AzRaPecSP.device,newName );
66 strcpy(SelenSyncSP.device, newName );
67 strcpy(AltDecBackSlashSP.device, newName );
68 strcpy(AzRaBackSlashSP.device, newName );
69 strcpy(OTATempNP.device, newName );
70 strcpy(OTAUpdateSP.device, newName);
71
72}
73
74LX200GPS::LX200GPS() : LX200_16()
75{
76 IEAddTimer(900000, updateTemp, &fd);
77
78}
79
80void LX200GPS::ISGetProperties (const char *dev)
81{
82
83if (dev && strcmp (thisDevice, dev))
84 return;
85
86// process parent first
87 LX200_16::ISGetProperties(dev);
88
89IDDefSwitch (&GPSPowerSP, NULL);
90IDDefSwitch (&GPSStatusSP, NULL);
91IDDefSwitch (&GPSUpdateSP, NULL);
92IDDefSwitch (&AltDecPecSP, NULL);
93IDDefSwitch (&AzRaPecSP, NULL);
94IDDefSwitch (&SelenSyncSP, NULL);
95IDDefSwitch (&AltDecBackSlashSP, NULL);
96IDDefSwitch (&AzRaBackSlashSP, NULL);
97IDDefNumber (&OTATempNP, NULL);
98IDDefSwitch (&OTAUpdateSP, NULL);
99
100}
101
102void LX200GPS::ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n)
103{
104 // ignore if not ours //
105 if (strcmp (dev, thisDevice))
106 return;
107
108 LX200_16::ISNewText (dev, name, texts, names, n);
109}
110
111void LX200GPS::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
112{
113
114 LX200_16::ISNewNumber (dev, name, values, names, n);
115
116 }
117
118
119 void LX200GPS::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
120 {
121 int index=0, err=0;
122 char msg[64];
123
124 if (strcmp (dev, thisDevice))
125 return;
126
127 /* GPS Power */
128 if (!strcmp(name,GPSPowerSP.name))
129 {
130 if (checkPower(&GPSPowerSP))
131 return;
132
133 if (IUUpdateSwitch(&GPSPowerSP, states, names, n) < 0)
134 return;
135
136 index = getOnSwitch(&GPSPowerSP);
137 if (index == 0)
138 turnGPSOn(fd);
139 else
140 turnGPSOff(fd);
141
142 GPSPowerSP.s = IPS_OK;
143 IDSetSwitch (&GPSPowerSP, index == 0 ? "GPS System is ON" : "GPS System is OFF" );
144 return;
145 }
146
147 /* GPS Status Update */
148 if (!strcmp(name,GPSStatusSP.name))
149 {
150 if (checkPower(&GPSStatusSP))
151 return;
152
153 if (IUUpdateSwitch(&GPSStatusSP, states, names, n) < 0)
154 return;
155
156 index = getOnSwitch(&GPSStatusSP);
157
158 if (index == 0)
159 {
160 err = gpsSleep(fd);
161 strcpy(msg, "GPS system is in sleep mode.");
162 }
163 else if (index == 1)
164 {
165 err = gpsWakeUp(fd);
166 strcpy(msg, "GPS system is reactivated.");
167 }
168 else
169 {
170 err = gpsRestart(fd);
171 strcpy(msg, "GPS system is restarting...");
172 updateTime();
173 updateLocation();
174 }
175
176 GPSStatusSP.s = IPS_OK;
177 IDSetSwitch (&GPSStatusSP, "%s", msg);
178 return;
179
180 }
181
182 /* GPS Update */
183 if (!strcmp(name,GPSUpdateSP.name))
184 {
185 if (checkPower(&GPSUpdateSP))
186 return;
187
188 if (IUUpdateSwitch(&GPSUpdateSP, states, names, n) < 0)
189 return;
190
191 index = getOnSwitch(&GPSUpdateSP);
192
193 GPSUpdateSP.s = IPS_OK;
194
195 if (index == 0)
196 {
197
198 IDSetSwitch(&GPSUpdateSP, "Updating GPS system. This operation might take few minutes to complete...");
199 if (updateGPS_System(fd))
200 {
201 IDSetSwitch(&GPSUpdateSP, "GPS system update successful.");
202 updateTime();
203 updateLocation();
204 }
205 else
206 {
207 GPSUpdateSP.s = IPS_IDLE;
208 IDSetSwitch(&GPSUpdateSP, "GPS system update failed.");
209 }
210 }
211 else
212 {
213 updateTime();
214 updateLocation();
215 IDSetSwitch(&GPSUpdateSP, "Client time and location is synced to LX200 GPS Data.");
216
217 }
218 return;
219 }
220
221 /* Alt Dec Periodic Error correction */
222 if (!strcmp(name, AltDecPecSP.name))
223 {
224 if (checkPower(&AltDecPecSP))
225 return;
226
227 if (IUUpdateSwitch(&AltDecPecSP, states, names, n) < 0)
228 return;
229
230 index = getOnSwitch(&AltDecPecSP);
231
232 if (index == 0)
233 {
234 err = enableDecAltPec(fd);
235 strcpy (msg, "Alt/Dec Compensation Enabled");
236 }
237 else
238 {
239 err = disableDecAltPec(fd);
240 strcpy (msg, "Alt/Dec Compensation Disabled");
241 }
242
243 AltDecPecSP.s = IPS_OK;
244 IDSetSwitch(&AltDecPecSP, "%s", msg);
245
246 return;
247 }
248
249 /* Az RA periodic error correction */
250 if (!strcmp(name, AzRaPecSP.name))
251 {
252 if (checkPower(&AzRaPecSP))
253 return;
254
255 if (IUUpdateSwitch(&AzRaPecSP, states, names, n) < 0)
256 return;
257
258 index = getOnSwitch(&AzRaPecSP);
259
260 if (index == 0)
261 {
262 err = enableRaAzPec(fd);
263 strcpy (msg, "Ra/Az Compensation Enabled");
264 }
265 else
266 {
267 err = disableRaAzPec(fd);
268 strcpy (msg, "Ra/Az Compensation Disabled");
269 }
270
271 AzRaPecSP.s = IPS_OK;
272 IDSetSwitch(&AzRaPecSP, "%s", msg);
273
274 return;
275 }
276
277 if (!strcmp(name, AltDecBackSlashSP.name))
278 {
279 if (checkPower(&AltDecBackSlashSP))
280 return;
281
282 err = activateAltDecAntiBackSlash(fd);
283 AltDecBackSlashSP.s = IPS_OK;
284 IDSetSwitch(&AltDecBackSlashSP, "Alt/Dec Anti-backslash enabled");
285 return;
286 }
287
288 if (!strcmp(name, AzRaBackSlashSP.name))
289 {
290 if (checkPower(&AzRaBackSlashSP))
291 return;
292
293 err = activateAzRaAntiBackSlash(fd);
294 AzRaBackSlashSP.s = IPS_OK;
295 IDSetSwitch(&AzRaBackSlashSP, "Az/Ra Anti-backslash enabled");
296 return;
297 }
298
299 if (!strcmp(name, OTAUpdateSP.name))
300 {
301 int error_type=0;
302
303 if (checkPower(&OTAUpdateSP))
304 return;
305
306 IUResetSwitch(&OTAUpdateSP);
307
308 if ( (error_type = getOTATemp(fd, &OTATempNP.np[0].value)) < 0)
309 {
310 OTAUpdateSP.s = IPS_ALERT;
311 OTATempNP.s = IPS_ALERT;
312 IDSetNumber(&OTATempNP, "Error: OTA temperature read timed out.");
313 }
314 else
315 {
316 OTAUpdateSP.s = IPS_OK;
317 OTATempNP.s = IPS_OK;
318 IDSetNumber(&OTATempNP, NULL);
319 }
320
321 return;
322 }
323
324 LX200_16::ISNewSwitch (dev, name, states, names, n);
325
326}
327
328 void LX200GPS::ISPoll ()
329 {
330
331 LX200_16::ISPoll();
332
333
334 }
335
336 void updateTemp(void * p)
337 {
338
339 int fd = *((int *) p);
340
341 if (telescope->isTelescopeOn())
342 {
343 if (getOTATemp(fd, &OTATempNP.np[0].value) < 0)
344 {
345 OTATempNP.s = IPS_ALERT;
346 IDSetNumber(&OTATempNP, "Error: OTA temperature read timed out.");
347 return;
348 }
349 else
350 {
351 OTATempNP.s = IPS_OK;
352 IDSetNumber(&OTATempNP, NULL);
353 }
354 }
355
356 IEAddTimer(900000, updateTemp, &fd);
357
358 }
359
360 void LX200GPS::getBasicData()
361 {
362
363 //getOTATemp(&OTATempNP.np[0].value);
364 //IDSetNumber(&OTATempNP, NULL);
365
366 // process parent
367 LX200_16::getBasicData();
368 }
369
Note: See TracBrowser for help on using the repository browser.