View Javadoc

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 }