1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.indi.examples;
20
21 import java.io.IOException;
22
23 import org.indi.clientmessages.GetProperties;
24 import org.indi.objects.Blob;
25 import org.indi.objects.BlobVector;
26 import org.indi.objects.Number;
27 import org.indi.objects.NumberVector;
28 import org.indi.objects.Permission;
29 import org.indi.objects.State;
30 import org.indi.objects.Switch;
31 import org.indi.objects.SwitchRule;
32 import org.indi.objects.SwitchVector;
33 import org.indi.reactor.TimerCallback;
34 import org.indi.server.BasicDevice;
35 import org.indi.server.IndiServer;
36
37
38
39
40
41
42
43
44 public class SimpleCCDSimulator extends BasicDevice implements TimerCallback {
45
46
47
48 private final SwitchVector powerswitch;
49
50
51
52 private final String powervectorname = "CONNECTION";
53
54
55
56 private final String groupname = "Main Control";
57
58
59
60 private Switch connectswitch = null;
61
62
63
64 private NumberVector temperaturevector = null;
65
66
67
68 private Number temperature = null;
69
70
71
72 private NumberVector exposuretimevector = null;
73
74
75
76 private Number exposuretime = null;
77
78
79
80 private BlobVector imagevector = null;
81
82
83
84 private final long timeout = 1000;
85
86
87
88
89 private Blob image = null;
90
91
92
93 private double targetTemperature = 0;
94
95
96
97 private final String name = "Simple CCD Simulator";
98
99
100
101
102
103
104
105 public SimpleCCDSimulator(IndiServer server) {
106 super(server);
107 this.powerswitch = new SwitchVector(this.name, this.powervectorname,
108 "Connection", this.groupname, State.Idle, Permission.ReadWrite,
109 SwitchRule.OneOfMany, 0);
110 this.connectswitch = new Switch("CONNECT", "Connect", Switch.State.Off);
111 this.powerswitch.add(this.connectswitch);
112 this.powerswitch.add(new Switch("DISCONNECT", "Disconnect",
113 Switch.State.On));
114 this.exposuretimevector = new NumberVector(this.name,
115 "EXPOSE_DURATION", "Expose", this.groupname, State.Idle,
116 Permission.ReadWrite, 60);
117 this.exposuretime = new Number("EXPOSE_S", "Duration (s)", "%5.2f", 0.,
118 36000., .5, 1.);
119 this.exposuretimevector.add(this.exposuretime);
120 this.temperaturevector = new NumberVector(this.name, "CCD_TEMPERATURE",
121 "Temperature (C)", this.groupname, State.Idle,
122 Permission.ReadWrite, 60);
123 this.temperature = new Number("TEMPERATURE", "Temperature", "%+06.2f",
124 -30., 40., 1., 0.);
125 this.temperaturevector.add(this.temperature);
126 this.imagevector = new BlobVector(this.name, "Video", "Video",
127 this.groupname, State.Idle, Permission.ReadOnly, 0);
128 this.image = new Blob("CCD1", "Feed");
129 this.imagevector.add(this.image);
130 timer(this.timeout);
131 }
132
133
134
135
136
137
138
139
140
141 public static void main(String[] args) throws IOException {
142 IndiServer s = new IndiServer();
143 new SimpleCCDSimulator(s);
144 new SimpleTelescopeSimulator(s);
145 while (true) {
146 s.reactor.handleEvents(10);
147 }
148 }
149
150 @Override
151 public void onGetProperties(GetProperties o) {
152 def(this.powerswitch);
153 def(this.exposuretimevector);
154 def(this.temperaturevector);
155 def(this.imagevector);
156 }
157
158 @Override
159 public void onNew(SwitchVector vector) {
160 if (!((this.powervectorname.equals(vector.getName())) && (this.name
161 .equals(vector.getDevice())))) {
162 return;
163 }
164 this.powerswitch.update(vector);
165 switch (this.connectswitch.getState()) {
166 case On:
167 this.powerswitch.setState(State.Ok);
168 set(this.powerswitch,
169 "Connection to Simple CCD Simulator is successful.");
170 break;
171 case Off:
172 this.powerswitch.setState(State.Idle);
173 set(this.powerswitch, "Simple CCD Simulator has been disconneced.");
174 break;
175 }
176 }
177
178 @Override
179 public void onNew(NumberVector vector) {
180 if (!(this.name.equals(this.name))) {
181 return;
182 }
183 if (vector.getName().equals(this.exposuretimevector.getName())) {
184 if (this.connectswitch.getState() == Switch.State.Off) {
185 this.exposuretimevector.setState(State.Idle);
186 msg("CCD Simulator is offline");
187 set(this.exposuretimevector);
188 } else {
189 this.exposuretimevector.setState(State.Busy);
190 this.exposuretimevector.update(vector);
191 }
192 }
193 if (vector.getName().equals(this.temperaturevector.getName())) {
194 if (this.connectswitch.getState() == Switch.State.Off) {
195 this.temperaturevector.setState(State.Idle);
196 msg("CCD Simulator is offline");
197 } else {
198 for (Number n : vector.getChlidren()) {
199 if (n.getName().equals(this.temperature.getName())) {
200 this.targetTemperature = n.getDouble();
201 }
202 }
203 if (this.targetTemperature == this.temperature.getDouble()) {
204 this.temperaturevector.setState(State.Ok);
205 } else {
206 this.temperaturevector.setState(State.Busy);
207 msg("Setting CCD temperature to "
208 + String.valueOf(this.targetTemperature));
209 }
210 set(this.temperaturevector);
211 }
212 }
213 }
214
215 @Override
216 public void onTimer() {
217 switch (this.exposuretimevector.getState()) {
218 case Busy:
219 this.exposuretime.subtractDouble(1.0);
220 if (this.exposuretime.getDouble() <= 0) {
221
222 this.exposuretimevector.setState(State.Ok);
223
224 this.image.setValue(Thread.currentThread()
225 .getContextClassLoader().getResourceAsStream(
226 "org/indi/examples/Test.fits"), "fits");
227 set(this.imagevector);
228 }
229 set(this.exposuretimevector);
230 break;
231 }
232 switch (this.temperaturevector.getState()) {
233 case Busy:
234 if (this.temperature.getDouble() < this.targetTemperature - 1.0) {
235 this.temperature.addDouble(1.0);
236 set(this.temperaturevector);
237 } else if (this.temperature.getDouble() > this.targetTemperature + 1.0) {
238 this.temperature.subtractDouble(1.0);
239 set(this.temperaturevector);
240 } else {
241 this.temperaturevector.setState(State.Ok);
242 this.temperature.setDouble(this.targetTemperature);
243 set(this.temperaturevector, "Target Temperature reached");
244 }
245 break;
246 }
247 timer(this.timeout);
248 }
249 }