1 /*
2 * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
3 * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
4 *
5 * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
6 * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
7 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
8 * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
9 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
11 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
12 * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
13 * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
14 * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
15 * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
16 * OR MODIFICATIONS.
17 * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
18 * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
19 * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
20 * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
21 */
22
23 package de.desy.acop.displayers.chart;
24
25 import java.util.ArrayList;
26
27 import de.desy.tine.histUtils.THistory;
28 import de.desy.tine.types.DBLDBL;
29
30 /**
31 * <code>THistoryConnector</code> is used to retrieve data from the
32 * history server.
33 *
34 * @author Tilen Kusterle, Cosylab
35 *
36 */
37 public class THistoryConnector {
38
39 private boolean simulate;
40 private boolean checkForBadData;
41 private int timeout = 3000;
42
43 protected synchronized double[][] getHistoryData(String context, String server, String device, String property, int index, double start, double stop) {
44 int size = 1000;
45 DBLDBL[] data = new DBLDBL[size];
46 if (simulate) {
47 double span = stop - start;
48 for (int i = 0; i < size; i++) {
49 data[i] = new DBLDBL(Math.random()*3 + 60, start + span/size * i);
50 }
51 } else {
52 THistory.getArchivedData(context, server, property, device, index, start, stop, data, timeout);
53 }
54
55 ArrayList<Double> x = new ArrayList<Double>();
56 ArrayList<Double> y = new ArrayList<Double>();
57 if (isCheckForBadData()) {
58 for (int i = 0; i < data.length; i++) {
59 if (data[i].d2val == 0 || data[i].d1val > 1E30) continue;
60 x.add(data[i].d2val);
61 y.add(data[i].d1val);
62 }
63 } else {
64 for (int i = 0; i < data.length; i++) {
65 if (data[i].d2val == 0) continue;
66 x.add(data[i].d2val);
67 y.add(data[i].d1val);
68 }
69 }
70
71 double[][] result = new double[2][x.size()];
72 for (int i = 0; i < result[0].length; i++) {
73 result[0][i] = x.get(i);
74 result[1][i] = y.get(i);
75 }
76 return result;
77 }
78
79 /**
80 * Returns the history data for the specified remote point between
81 * the given start and stop dates in TINE time.
82 *
83 * @param hp history connection point
84 * @param start starting time
85 * @param stop end time
86 * @return array of history data of length 2: the first array are timestamps and
87 * the second are the values
88 */
89 public double[][] loadHistory(HistoryParameters hp, double start, double stop) {
90 if (hp == null) throw new IllegalArgumentException("History parameters can not be null.");
91 return getHistoryData(hp.getHistoryContext(), hp.getHistoryServer(), hp.getHistoryDevice(), hp.getHistoryProperty(), hp.getHistoryIndex(), start, stop);
92 }
93
94 /**
95 * Returns true if check for bad data is turned on.
96 *
97 * @return the checkForBadData
98 */
99 public boolean isCheckForBadData() {
100 return checkForBadData;
101 }
102
103 /**
104 * Enables/disables checking for bad data. Bad data is any value higher than 1E30.
105 * If enabled these values are filtered out.
106 *
107 * @param checkForBadData true if check for bad data is turned on
108 */
109 public void setCheckForBadData(boolean checkForBadData) {
110 this.checkForBadData = checkForBadData;
111 }
112
113 /**
114 * Is history data simulated.
115 *
116 * @return true if data is simulated
117 */
118 public boolean isSimulate() {
119 return simulate;
120 }
121
122 /**
123 * Simulates the history data.
124 *
125 * @param simulate true if history data should be simulated
126 */
127 public void setSimulate(boolean simulate) {
128 this.simulate = simulate;
129 }
130
131 /**
132 * Returns the timeout.
133 *
134 * @return the timeout
135 */
136 public int getTimeout() {
137 return timeout;
138 }
139
140 /**
141 * Sets the timeout for all remote calls.
142 *
143 * @param timeout the timeout to set
144 */
145 public void setTimeout(int timeout) {
146 this.timeout = timeout;
147 }
148
149 }