source: BAORadio/libindi/v1.0.1/examples/tutorial_dome.c@ 674

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

import libindi (JEC)

File size: 5.4 KB
Line 
1#if 0
2 Inter-driver communications tutorial - Dome Driver
3 Copyright (C) 2007 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#endif
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <stdarg.h>
25#include <math.h>
26#include <unistd.h>
27#include <time.h>
28#include <fcntl.h>
29#include <errno.h>
30#include <sys/stat.h>
31#include <sys/time.h>
32#include <sys/types.h>
33#include <sys/socket.h>
34#include <netinet/in.h>
35#include <netdb.h>
36#include <zlib.h>
37
38#include "indidevapi.h"
39#include "eventloop.h"
40#include "indicom.h"
41
42#define mydev "Dome"
43
44#define MAIN_GROUP "Main"
45#define SNOOP_GROUP "Snooped"
46
47/* Connect/Disconnect */
48static ISwitch PowerS[] = {{"CONNECT" , "Connect" , ISS_OFF, 0, 0},{"DISCONNECT", "Disconnect", ISS_ON, 0, 0}};
49static ISwitchVectorProperty PowerSP = { mydev, "CONNECTION" , "Connection", MAIN_GROUP, IP_RW, ISR_1OFMANY, 60, IPS_IDLE, PowerS, NARRAY(PowerS), "", 0};
50
51/* Dome Open/Close */
52static ISwitch DomeS[] = {{"Open", "", ISS_ON, 0, 0}, {"Close", "", ISS_OFF, 0, 0}};
53static ISwitchVectorProperty DomeSP = { mydev, "Dome Status", "", MAIN_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, DomeS , NARRAY(DomeS), "", 0};
54
55/* The property we're trying to fetch from the rain driver. It's a carbon copy of the property define in rain.c, we initilize its structure here like any
56 other local property, but we don't define it to client, it's only used internally within the driver.
57
58 MAKE SURE to set the property's device name to the device we're snooping on! If you copy/paste the property definition from the snooped driver
59 don't forget to remove "mydev" and replace it with the driver name.
60*/
61static ILight RainL[] = {{"Status", "", IPS_IDLE, 0, 0}};
62static ILightVectorProperty RainLP = { "Rain", "Rain Alert", "", SNOOP_GROUP, IPS_IDLE, RainL , NARRAY(RainL), "", 0};
63
64void ISGetProperties (const char *dev)
65{
66 /* MAIN_GROUP */
67 IDDefSwitch(&PowerSP, NULL);
68 IDDefSwitch(&DomeSP, NULL);
69
70 /* Let's listen for Rain Alert property in the device Rain */
71 IDSnoopDevice("Rain", "Rain Alert");
72}
73
74void ISNewBLOB (const char *dev, const char *name, int sizes[], int blobsizes[], char *blobs[], char *formats[], char *names[], int n) {}
75
76void ISSnoopDevice (XMLEle *root)
77{
78
79 IPState old_state = RainL[0].s;
80
81 /* If the "Rain Alert" property gets updated in the Rain device, we will receive a notification. We need to process the new values of Rain Alert and update the local version
82 of the property.*/
83 if (IUSnoopLight(root, &RainLP) == 0)
84 {
85
86 // If the dome is connected and rain is Alert */
87 if (PowerSP.s == IPS_OK && RainL[0].s == IPS_ALERT)
88 {
89 // If dome is open, then close it */
90 if (DomeS[0].s == ISS_ON)
91 closeDome();
92 else
93 IDMessage(mydev, "Rain Alert Detected! Dome is already closed.");
94 }
95 else if (old_state == IPS_ALERT && RainL[0].s != IPS_ALERT)
96 IDMessage(mydev, "Rain threat passed. Opening the dome is now safe.");
97
98 }
99
100}
101
102void ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
103{
104 /* ignore if not ours */
105 if (dev && strcmp (dev, mydev))
106 return;
107
108 /* Connection */
109 if (!strcmp (name, PowerSP.name))
110 {
111 if (IUUpdateSwitch(&PowerSP, states, names, n) < 0)
112 return;
113
114 PowerSP.s = IPS_OK;
115
116 if (PowerS[0].s == ISS_ON)
117 IDSetSwitch(&PowerSP, "Dome is online.");
118 else
119 {
120 PowerSP.s = IPS_IDLE;
121 IDSetSwitch(&PowerSP, "Dome is offline.");
122 }
123
124 return;
125 }
126
127 /* Dome */
128 if (!strcmp (name, DomeSP.name))
129 {
130
131 if (PowerSP.s != IPS_OK)
132 {
133 IDMessage(mydev, "Dome is offline!");
134 return;
135 }
136
137 if (IUUpdateSwitch(&DomeSP, states, names, n) < 0)
138 return;
139
140 DomeSP.s = IPS_BUSY;
141
142 if (DomeS[0].s == ISS_ON)
143 {
144 if (RainL[0].s == IPS_ALERT)
145 {
146 DomeSP.s = IPS_ALERT;
147 DomeS[0].s = ISS_OFF;
148 DomeS[1].s = ISS_ON;
149 IDSetSwitch(&DomeSP, "It is raining, cannot open dome.");
150 return;
151 }
152
153 IDSetSwitch(&DomeSP, "Dome is opening.");
154 }
155 else
156 IDSetSwitch(&DomeSP, "Dome is closing.");
157
158 sleep(5);
159
160 DomeSP.s = IPS_OK;
161
162 if (DomeS[0].s == ISS_ON)
163 IDSetSwitch(&DomeSP, "Dome is open.");
164 else
165 IDSetSwitch(&DomeSP, "Dome is closed.");
166
167 return;
168 }
169
170}
171
172void ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n)
173{
174 /* ignore if not ours */
175 if (dev && strcmp (mydev, dev))
176 return;
177
178 /* suppress warning */
179 n=n; dev=dev; name=name; names=names; texts=texts;
180}
181
182
183void ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n) {}
184
185void closeDome()
186{
187 DomeSP.s = IPS_BUSY;
188
189 IDSetSwitch(&DomeSP, "Rain Alert! Dome is closing...");
190
191 sleep(5);
192
193 DomeS[0].s = ISS_OFF;
194 DomeS[1].s = ISS_ON;
195
196 DomeSP.s = IPS_OK;
197
198 IDSetSwitch(&DomeSP, "Dome is closed.");
199
200
201}
202
Note: See TracBrowser for help on using the repository browser.