source: BAORadio/libindi/v1.0.1/libs/indibase/defaultdriver.cpp@ 654

Last change on this file since 654 was 502, checked in by frichard, 15 years ago

-BAOControl : petite interface permettant de contrôler les antennes via le pilote indi_BAO
-Le pilote indi_BAO utilise désormais indilib v 0.7

File size: 10.2 KB
Line 
1#include <stdlib.h>
2#include <string.h>
3#include <errno.h>
4#include <zlib.h>
5
6#include "defaultdriver.h"
7#include "indicom.h"
8#include "base64.h"
9
10
11INDI::DefaultDriver::DefaultDriver()
12{
13 pDebug = false;
14 pSimulation = false;
15}
16
17bool INDI::DefaultDriver::loadConfig()
18{
19 char errmsg[MAXRBUF];
20 bool pResult = false;
21
22 pResult = IUReadConfig(NULL, deviceID, errmsg) == 0 ? true : false;
23
24 if (pResult)
25 IDMessage(deviceID, "Configuration successfully loaded.");
26
27 IUSaveDefaultConfig(NULL, NULL, deviceID);
28
29 return pResult;
30}
31
32bool INDI::DefaultDriver::saveConfig()
33{
34 std::vector<pOrder>::const_iterator orderi;
35 ISwitchVectorProperty *svp=NULL;
36 char errmsg[MAXRBUF];
37 FILE *fp = NULL;
38
39 fp = IUGetConfigFP(NULL, deviceID, errmsg);
40
41 if (fp == NULL)
42 {
43 IDMessage(deviceID, "Error saving configuration. %s", errmsg);
44 return false;
45 }
46
47 IUSaveConfigTag(fp, 0);
48
49 for (orderi = pAll.begin(); orderi != pAll.end(); orderi++)
50 {
51 switch ( (*orderi).type)
52 {
53 case INDI_NUMBER:
54 IUSaveConfigNumber(fp, static_cast<INumberVectorProperty *> ((*orderi).p));
55 break;
56 case INDI_TEXT:
57 IUSaveConfigText(fp, static_cast<ITextVectorProperty *> ((*orderi).p));
58 break;
59 case INDI_SWITCH:
60 svp = static_cast<ISwitchVectorProperty *> ((*orderi).p);
61 /* Never save CONNECTION property. Don't save switches with no switches on if the rule is one of many */
62 if (!strcmp(svp->name, "CONNECTION") || (svp->r == ISR_1OFMANY && !IUFindOnSwitch(svp)))
63 continue;
64 IUSaveConfigSwitch(fp, svp);
65 break;
66 case INDI_BLOB:
67 IUSaveConfigBLOB(fp, static_cast<IBLOBVectorProperty *> ((*orderi).p));
68 break;
69 }
70 }
71
72 IUSaveConfigTag(fp, 1);
73
74 fclose(fp);
75
76 IUSaveDefaultConfig(NULL, NULL, deviceID);
77
78 IDMessage(deviceID, "Configuration successfully saved.");
79
80 return true;
81}
82
83bool INDI::DefaultDriver::loadDefaultConfig()
84{
85 char configDefaultFileName[MAXRBUF];
86 char errmsg[MAXRBUF];
87 bool pResult = false;
88
89 if (getenv("INDICONFIG"))
90 snprintf(configDefaultFileName, MAXRBUF, "%s.default", getenv("INDICONFIG"));
91 else
92 snprintf(configDefaultFileName, MAXRBUF, "%s/.indi/%s_config.xml.default", getenv("HOME"), deviceID);
93
94 if (pDebug)
95 IDLog("Requesting to load default config with: %s\n", configDefaultFileName);
96
97 pResult = IUReadConfig(configDefaultFileName, deviceID, errmsg) == 0 ? true : false;
98
99 if (pResult)
100 IDMessage(deviceID, "Default configuration loaded.");
101 else
102 IDMessage(deviceID, "Error loading default configuraiton. %s", errmsg);
103
104 return pResult;
105}
106
107bool INDI::DefaultDriver::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
108{
109
110 // ignore if not ours //
111 if (strcmp (dev, deviceID))
112 return false;
113
114 ISwitchVectorProperty *svp = getSwitch(name);
115
116 if (!svp)
117 return false;
118
119 if (!strcmp(svp->name, "DEBUG"))
120 {
121 IUUpdateSwitch(svp, states, names, n);
122 ISwitch *sp = IUFindOnSwitch(svp);
123 if (!sp)
124 return false;
125
126 if (!strcmp(sp->name, "ENABLE"))
127 setDebug(true);
128 else
129 setDebug(false);
130 return true;
131 }
132
133 if (!strcmp(svp->name, "SIMULATION"))
134 {
135 IUUpdateSwitch(svp, states, names, n);
136 ISwitch *sp = IUFindOnSwitch(svp);
137 if (!sp)
138 return false;
139
140 if (!strcmp(sp->name, "ENABLE"))
141 setSimulation(true);
142 else
143 setSimulation(false);
144 return true;
145 }
146
147 if (!strcmp(svp->name, "CONFIG_PROCESS"))
148 {
149 IUUpdateSwitch(svp, states, names, n);
150 ISwitch *sp = IUFindOnSwitch(svp);
151 IUResetSwitch(svp);
152 bool pResult = false;
153 if (!sp)
154 return false;
155
156 if (!strcmp(sp->name, "CONFIG_LOAD"))
157 pResult = loadConfig();
158 else if (!strcmp(sp->name, "CONFIG_SAVE"))
159 pResult = saveConfig();
160 else if (!strcmp(sp->name, "CONFIG_DEFAULT"))
161 pResult = loadDefaultConfig();
162
163 if (pResult)
164 svp->s = IPS_OK;
165 else
166 svp->s = IPS_ALERT;
167
168 IDSetSwitch(svp, NULL);
169 return true;
170 }
171
172 return false;
173
174}
175
176void INDI::DefaultDriver::addAuxControls()
177{
178 /**************************************************************************/
179 DebugSP = getSwitch("DEBUG");
180 if (!DebugSP)
181 {
182 DebugSP = new ISwitchVectorProperty;
183 IUFillSwitch(&DebugS[0], "ENABLE", "Enable", ISS_OFF);
184 IUFillSwitch(&DebugS[1], "DISABLE", "Disable", ISS_ON);
185 IUFillSwitchVector(DebugSP, DebugS, NARRAY(DebugS), deviceID, "DEBUG", "Debug", "Options", IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
186 pSwitches.push_back(DebugSP);
187 pOrder debo = {INDI_SWITCH, DebugSP};
188 pAll.push_back(debo);
189 }
190 else
191 {
192 ISwitch *sp = IUFindSwitch(DebugSP, "ENABLE");
193 if (sp)
194 if (sp->s == ISS_ON)
195 pDebug = true;
196 }
197 /**************************************************************************/
198
199 /**************************************************************************/
200 SimulationSP = getSwitch("SIMULATION");
201 if (!SimulationSP)
202 {
203 SimulationSP = new ISwitchVectorProperty;
204 IUFillSwitch(&SimulationS[0], "ENABLE", "Enable", ISS_OFF);
205 IUFillSwitch(&SimulationS[1], "DISABLE", "Disable", ISS_ON);
206 IUFillSwitchVector(SimulationSP, SimulationS, NARRAY(SimulationS), deviceID, "SIMULATION", "Simulation", "Options", IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
207 pSwitches.push_back(SimulationSP);
208 pOrder simo = {INDI_SWITCH, SimulationSP};
209 pAll.push_back(simo);
210 }
211 else
212 {
213 ISwitch *sp = IUFindSwitch(SimulationSP, "ENABLE");
214 if (sp)
215 if (sp->s == ISS_ON)
216 pSimulation = true;
217 }
218
219 /**************************************************************************/
220 ConfigProcessSP = getSwitch("CONFIG_PROCESS");
221 if (!ConfigProcessSP)
222 {
223 ConfigProcessSP = new ISwitchVectorProperty;
224 IUFillSwitch(&ConfigProcessS[0], "CONFIG_LOAD", "Load", ISS_OFF);
225 IUFillSwitch(&ConfigProcessS[1], "CONFIG_SAVE", "Save", ISS_OFF);
226 IUFillSwitch(&ConfigProcessS[2], "CONFIG_DEFAULT", "Default", ISS_OFF);
227 IUFillSwitchVector(ConfigProcessSP, ConfigProcessS, NARRAY(ConfigProcessS), deviceID, "CONFIG_PROCESS", "Configuration", "Options", IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
228 pSwitches.push_back(ConfigProcessSP);
229 pOrder cpono = {INDI_SWITCH, ConfigProcessSP};
230 pAll.push_back(cpono);
231 }
232 /**************************************************************************/
233
234}
235
236void INDI::DefaultDriver::setDebug(bool enable)
237{
238 if (pDebug == enable)
239 {
240 DebugSP->s = IPS_OK;
241 IDSetSwitch(DebugSP, NULL);
242 return;
243 }
244
245 if (!DebugSP)
246 return;
247
248 IUResetSwitch(DebugSP);
249
250 if (enable)
251 {
252 ISwitch *sp = IUFindSwitch(DebugSP, "ENABLE");
253 if (sp)
254 {
255 sp->s = ISS_ON;
256 IDMessage(deviceID, "Debug is enabled.");
257 }
258 }
259 else
260 {
261 ISwitch *sp = IUFindSwitch(DebugSP, "DISABLE");
262 if (sp)
263 {
264 sp->s = ISS_ON;
265 IDMessage(deviceID, "Debug is disabled.");
266 }
267 }
268
269 pDebug = enable;
270 DebugSP->s = IPS_OK;
271 IDSetSwitch(DebugSP, NULL);
272
273}
274
275void INDI::DefaultDriver::setSimulation(bool enable)
276{
277 if (pSimulation == enable)
278 {
279 SimulationSP->s = IPS_OK;
280 IDSetSwitch(SimulationSP, NULL);
281 return;
282 }
283
284 if (!SimulationSP)
285 return;
286
287 IUResetSwitch(SimulationSP);
288
289 if (enable)
290 {
291 ISwitch *sp = IUFindSwitch(SimulationSP, "ENABLE");
292 if (sp)
293 {
294 IDMessage(deviceID, "Simulation is enabled.");
295 sp->s = ISS_ON;
296 }
297 }
298 else
299 {
300 ISwitch *sp = IUFindSwitch(SimulationSP, "DISABLE");
301 if (sp)
302 {
303 sp->s = ISS_ON;
304 IDMessage(deviceID, "Simulation is disabled.");
305 }
306 }
307
308 pSimulation = enable;
309 SimulationSP->s = IPS_OK;
310 IDSetSwitch(SimulationSP, NULL);
311
312}
313
314bool INDI::DefaultDriver::isDebug()
315{
316 return pDebug;
317}
318
319bool INDI::DefaultDriver::isSimulation()
320{
321 return pSimulation;
322}
323
324void INDI::DefaultDriver::ISGetProperties (const char *dev)
325{
326 std::vector<pOrder>::const_iterator orderi;
327
328 for (orderi = pAll.begin(); orderi != pAll.end(); orderi++)
329 {
330 switch ( (*orderi).type)
331 {
332 case INDI_NUMBER:
333 IDDefNumber(static_cast<INumberVectorProperty *>((*orderi).p) , NULL);
334 break;
335 case INDI_TEXT:
336 IDDefText(static_cast<ITextVectorProperty *>((*orderi).p) , NULL);
337 break;
338 case INDI_SWITCH:
339 IDDefSwitch(static_cast<ISwitchVectorProperty *>((*orderi).p) , NULL);
340 break;
341 case INDI_LIGHT:
342 IDDefLight(static_cast<ILightVectorProperty *>((*orderi).p) , NULL);
343 break;
344 case INDI_BLOB:
345 IDDefBLOB(static_cast<IBLOBVectorProperty *>((*orderi).p) , NULL);
346 break;
347 }
348 }
349
350}
351
352void INDI::DefaultDriver::resetProperties()
353{
354 std::vector<INumberVectorProperty *>::const_iterator numi;
355 std::vector<ISwitchVectorProperty *>::const_iterator switchi;
356 std::vector<ITextVectorProperty *>::const_iterator texti;
357 std::vector<ILightVectorProperty *>::const_iterator lighti;
358 std::vector<IBLOBVectorProperty *>::const_iterator blobi;
359
360 for ( numi = pNumbers.begin(); numi != pNumbers.end(); numi++)
361 {
362 (*numi)->s = IPS_IDLE;
363 IDSetNumber( (*numi), NULL);
364 }
365
366 for ( switchi = pSwitches.begin(); switchi != pSwitches.end(); switchi++)
367 {
368 (*switchi)->s = IPS_IDLE;
369 IDSetSwitch( (*switchi), NULL);
370 }
371
372 for ( texti = pTexts.begin(); texti != pTexts.end(); texti++)
373 {
374 (*texti)->s = IPS_IDLE;
375 IDSetText( (*texti), NULL);
376 }
377
378 for ( lighti = pLights.begin(); lighti != pLights.end(); lighti++)
379 {
380 (*lighti)->s = IPS_IDLE;
381 IDSetLight( (*lighti), NULL);
382 }
383
384 for ( blobi = pBlobs.begin(); blobi != pBlobs.end(); blobi++)
385 {
386 (*blobi)->s = IPS_IDLE;
387 IDSetBLOB( (*blobi), NULL);
388 }
389}
Note: See TracBrowser for help on using the repository browser.