1
2
3
4 package de.desy.acop.video;
5
6 import java.beans.PropertyChangeListener;
7 import java.beans.PropertyChangeSupport;
8
9 import de.desy.acop.transport.ConnectionFailed;
10 import de.desy.acop.transport.ConnectionParameters;
11 import de.desy.acop.video.analysis.AImage;
12
13 import de.desy.tine.client.TCallback;
14 import de.desy.tine.client.TLink;
15 import de.desy.tine.client.TLinkCallback;
16 import de.desy.tine.dataUtils.TDataType;
17 import de.desy.tine.definitions.TAccess;
18 import de.desy.tine.definitions.TErrorList;
19 import de.desy.tine.definitions.TMode;
20 import de.desy.tine.types.IMAGE;
21
22
23
24
25
26
27
28
29 public class VideoServerConnection {
30
31
32 public static final String PROPERTY_A_IMAGE = "aImage";
33 public static final String PROPERTY_BACKGROUND = "background";
34 public static final String PROPERTY_PRECISE_BACKGROUND = "preciseBackground";
35 public static final String PROPERTY_PRECISE_BACKGROUND_WIDTH = "preciseBackgroundWidth";
36 private static final String ANALYSIS_PROPERTY = "Analysis";
37 private static final String BACKGROUND_PROPERTY = "Background";
38 private static final String PRECISE_BACKGROUND_PROPERTY = "PreciseBackground";
39 private static final String BACKGROUND_ID_PROPERTY = "BackgroundId";
40 private static final String ANALYSIS_PARAMETERS_PROPERTY = "AnalysisParameters";
41
42 private class AnalysisHandler implements TLinkCallback {
43
44 private TLink tlink;
45 private boolean isTransfering;
46 private AImage image;
47
48 public AnalysisHandler() {
49 IMAGE image = new IMAGE();
50 this.image = new AImage(image, 0, 0, 0, 0,
51 0, 0, 0, 0, 0.0,
52 new double[]{}, 0.0, 0.0, 0.0, 0.0,0.0,
53 0.0,0.0,0.0,0.0,
54 new double[]{}, 0.0, 0.0, 0.0, 0.0,0.0,
55 0.0,0.0,0.0,0.0,
56 0.0, 0.0, 0.0, 0.0, 0.0,0,true,false,true);
57
58 }
59
60
61
62
63
64 @Override
65 public void callback(TLink link) {
66 if (!isTransfering) return;
67 if (link.getLinkStatus() != 0) {
68 System.out.println("Link Error : code=" + link.getLinkStatus() + " msg=" + link.getLastError());
69 return;
70 }
71 int id = getBackgroundId();
72 if (backgroundId != id) {
73 try {
74 backgroundId = id;
75 loadBackground();
76 loadPreciseBackground();
77
78 getPcSupport().firePropertyChange(PROPERTY_BACKGROUND, null, background);
79 getPcSupport().firePropertyChange(PROPERTY_PRECISE_BACKGROUND,null,preciseBackground);
80 getPcSupport().firePropertyChange(PROPERTY_PRECISE_BACKGROUND_WIDTH,null,preciseBackgroundWidth);
81 } catch (Exception e) {
82 e.printStackTrace();
83 }
84 }
85 aImage = new AImage(this.image);
86 getPcSupport().firePropertyChange(PROPERTY_A_IMAGE, null, aImage);
87 }
88
89 public void openLink(int accessRate) throws ConnectionFailed {
90 TDataType dataOut = new TDataType(new AImage[]{image});
91 tlink = new TLink(server+"/"+device, ANALYSIS_PROPERTY, dataOut, null, TAccess.CA_READ);
92 if (tlink.attach(TMode.CM_POLL, this, accessRate) < 0) {
93 tlink.cancel();
94 tlink = null;
95 throw new ConnectionFailed("No permanent connection to server (\"" + tlink.getLastError() + "\".", null);
96 }
97 isTransfering = true;
98 }
99
100 public void closeLink() {
101 if (tlink != null) {
102 tlink.cancel();
103 tlink = null;
104 }
105 isTransfering = false;
106 }
107
108 }
109
110 private String server = "VideoAnalysis-EQM";
111 private String device = "Device";
112 private int backgroundId = -1;
113
114 private AnalysisHandler analysisHandler;
115
116 private AImage aImage;
117 private IMAGE background;
118 private double[] preciseBackground;
119 private int preciseBackgroundWidth = -1;
120 private int accessRate = 1000;
121 private int timeout = 1000;
122 private boolean connected = false;
123
124 private PropertyChangeSupport pcSupport;
125
126
127
128
129
130
131
132
133
134
135
136 public void setAnalysisParameters(double threshold, int roiX, int roiY, int roiW, int roiH, int roi2X, int roi2Y, int roi2W, int roi2H, boolean calculateThreshold,boolean performFit) throws ConnectionFailed {
137 TDataType tdt = new TDataType(new double[]{threshold, roiX, roiY, roiW, roiH,roi2X, roi2Y, roi2W,roi2H,calculateThreshold ? 1.0 : 0.0,performFit ? 1.0 : 0.0});
138 TLink tl = new TLink(server+"/"+device, ANALYSIS_PARAMETERS_PROPERTY, null, tdt, TAccess.CA_WRITE);
139 tl.execute(timeout, true);
140 tl.cancel();
141 }
142
143
144
145
146
147
148
149 public void setBackground(IMAGE background) throws ConnectionFailed {
150 if (background == null) {
151 background = new IMAGE(0);
152 }
153 TDataType tdt = new TDataType(new IMAGE[]{background});
154 TLink tl = new TLink(server+"/"+device, BACKGROUND_PROPERTY, null, tdt, TAccess.CA_WRITE);
155 tl.execute(timeout, true);
156 tl.cancel();
157 }
158
159
160
161
162
163
164 public IMAGE getBackground() {
165 return background;
166 }
167
168 private void loadBackground() {
169 if (background == null) {
170 background = new IMAGE(
171 }
172 TDataType tdt = new TDataType(new IMAGE[]{background});
173 TLink tl = new TLink(server+"/"+device, BACKGROUND_PROPERTY, tdt, null, TAccess.CA_READ);
174 tl.execute(timeout, true);
175 tdt.getData(background);
176 tl.cancel();
177
178 }
179
180 private void loadPreciseBackground() {
181
182 if (preciseBackground == null) {
183 preciseBackground = new double[0];
184 }
185 TDataType tdt = new TDataType(preciseBackground);
186 TLink tl = new TLink(server+"/"+device, PRECISE_BACKGROUND_PROPERTY, tdt, null, TAccess.CA_READ);
187 tl.execute(timeout, true);
188 tdt.getData(preciseBackground);
189 tl.cancel();
190 }
191
192
193
194
195
196
197
198
199 public void setPreciseBackground(double[] background, int width) throws ConnectionFailed {
200
201 if (background == null) {
202 background = new double[0];
203 }
204 TDataType tdt = new TDataType(background);
205 TLink tl = new TLink(server+"/"+device, PRECISE_BACKGROUND_PROPERTY, null, tdt, TAccess.CA_WRITE);
206 tl.execute(timeout, true);
207 tl.cancel();
208 }
209
210
211
212
213
214 public int getPreciseBackgroundWidth() {
215 return preciseBackgroundWidth;
216 }
217
218
219
220
221
222
223 public double[] getPreciseBackground() {
224 return preciseBackground;
225 }
226
227 public int getBackgroundId() {
228 int[] result = new int[] {-1};
229 TDataType tdt = new TDataType(result);
230 TLink tl = new TLink(server+"/"+device, BACKGROUND_ID_PROPERTY, tdt, null, TAccess.CA_READ);
231 tl.execute(timeout, true);
232 tl.cancel();
233 return result[0];
234 }
235
236
237
238
239
240 public void connect() throws ConnectionFailed {
241 if (connected) return;
242 getAnalysisHandler().openLink(accessRate);
243 connected = true;
244 }
245
246
247
248
249 public void disconnect() {
250 if (!connected) return;
251 getAnalysisHandler().closeLink();
252 connected = false;
253 }
254
255 public void setConnectionParameters(ConnectionParameters cp) {
256 disconnect();
257 server = cp.getDeviceGroup();
258 device = cp.getDeviceName();
259 accessRate = cp.getAccessRate();
260 }
261
262
263
264
265
266 public int getAccessRate() {
267 return accessRate;
268 }
269
270 public void setAccessRate(int accessRate) {
271 if (this.accessRate == accessRate) return;
272 this.accessRate = accessRate;
273 if (connected) {
274 disconnect();
275 try {
276 connect();
277 } catch (ConnectionFailed e) {
278 e.printStackTrace();
279 }
280 }
281
282 }
283
284
285
286
287
288 public AImage getAImage() {
289 return aImage;
290 }
291
292 private AnalysisHandler getAnalysisHandler() {
293 if (analysisHandler == null) {
294 analysisHandler = new AnalysisHandler();
295 }
296 return analysisHandler;
297 }
298
299 private PropertyChangeSupport getPcSupport() {
300 if (pcSupport == null) {
301 pcSupport = new PropertyChangeSupport(this);
302 }
303 return pcSupport;
304 }
305
306
307
308
309
310
311 public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
312 getPcSupport().addPropertyChangeListener(propertyName, listener);
313 }
314
315
316
317
318
319
320 public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
321 getPcSupport().removePropertyChangeListener(propertyName, listener);
322 }
323
324
325
326
327
328 public void addPropertyChangeListener(PropertyChangeListener listener) {
329 getPcSupport().addPropertyChangeListener(listener);
330 }
331
332
333
334
335
336 public void removePropertyChangeListener(PropertyChangeListener listener) {
337 getPcSupport().removePropertyChangeListener(listener);
338 }
339
340 public static void main(String[] args) {
341 final IMAGE image = new IMAGE();
342 final AImage aImage = new AImage(image, 0, 0, 0, 0, 0, 0, 0, 0, 0.0,
343 new double[]{}, 0.0, 0.0, 0.0, 0.0,0.0,
344 0.0,0.0,0.0,0.0,
345 new double[]{}, 0.0, 0.0, 0.0, 0.0,0.0,
346 0.0,0.0,0.0,0.0,
347 0.0, 0.0, 0.0, 0.0, 0.0,0,true,false,true);
348 TDataType dataOut = new TDataType(aImage);
349 TLink tlink = new TLink("/TEST/VideoAnalysis-EQM/Device", "Analysis", dataOut, null, TAccess.CA_READ);
350 int c = tlink.attach(TMode.CM_POLL, new TCallback(){
351 @Override
352 public void callback(int LinkIndex, int LinkStatus) {
353 System.out.println(LinkIndex + " " + TErrorList.toString(LinkStatus));
354 System.out.println(aImage);
355 }
356 }, 1000);
357 System.out.println(c);
358 }
359 }