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.demo.example; 24 25 import java.awt.Color; 26 import java.beans.PropertyVetoException; 27 28 import com.cosylab.gui.adapters.MultiplierConverter; 29 import com.cosylab.util.CommonException; 30 31 import de.desy.acop.chart.AcopDisplayMode; 32 import de.desy.acop.chart.AcopDrawStyleEnum; 33 import de.desy.acop.chart.AcopFFTEnum; 34 import de.desy.acop.displayers.AcopChart; 35 import de.desy.acop.displayers.tools.AcopGraphParameters; 36 import de.desy.acop.transport.AccessMode; 37 import de.desy.acop.transport.ConnectionParameters; 38 39 public class ChartExample { 40 public static void main(String[] args) { 41 //How to connect chart with remote properties? 42 //First we create an instance of the AcopChart object. 43 AcopChart chart = new AcopChart(); 44 45 //We require AcopGraphParameters which describe the remote property 46 47 //Let's display a few graphs in this chart. First we need to define the 48 //connection point for each graph. This is done by constructing 49 //ConnectionParameters 50 ConnectionParameters cp = new ConnectionParameters("TINE", "context", 51 "server", "device", "property", AccessMode.POLL, 1000); 52 //These parameters describe a remote property 'context/server/device/property' 53 //in the TINE control system. We will request a constant monitoring, 54 //therefore AccessMode.POLL was used. Polling rate is set to 1000 milliseconds, 55 //which means that value on the table will be updated every 1000 milliseconds. 56 57 //Now we make AcopGraphParameters. We will set the color of the graph 58 //to red, use no fft, and display data in the histogram with solid lines 59 //of width 2. We can set the fft, drawStyle and mode properties to any 60 //value included in the enumerations. The last two parameters describe 61 //that we don't intend to show trend. 62 AcopGraphParameters parameters = new AcopGraphParameters(cp, Color.RED, 63 AcopFFTEnum.NoFFT.ordinal(), AcopDrawStyleEnum.PS_SOLID.ordinal(), 64 AcopDisplayMode.SimpleHistogram.ordinal(), 2, false,0); 65 66 //Parameters are then attached to the chart. Connection is created automatically. 67 try { 68 chart.addDisplayerParameters(parameters); 69 } catch (CommonException e1) { 70 e1.printStackTrace(); 71 } catch (PropertyVetoException e1) { 72 e1.printStackTrace(); 73 } 74 //If no exception occurred, chart should show the remote value. 75 76 //AcopChart is able to display multiple connections. We will construct new 77 //AcopGraphParameters for the same property and will use a converter for this 78 //graph. However now we don't want to show all devices in the multi-channel. 79 //We only want to show the first 20 device. This can be set by configuring 80 //ConnectionParameters (the last parameter in the constructor). 81 ConnectionParameters cp1 = new ConnectionParameters("TINE", "context", 82 "server", "device", "property", AccessMode.POLL, 1000, 20); 83 AcopGraphParameters parameters1 = new AcopGraphParameters(cp1, 84 Color.BLUE, AcopFFTEnum.NoFFT.ordinal(), AcopDrawStyleEnum.PS_SOLID.ordinal(), 85 AcopDisplayMode.PolyLine.ordinal(), 1, false, 0, 86 new MultiplierConverter(2)); 87 //Here we used a MultiplierConverter which will multiply the value for a 88 //factor '2'. This graph will be shown as the polyline. 89 try { 90 chart.addDisplayerParameters(parameters1); 91 } catch (CommonException e1) { 92 e1.printStackTrace(); 93 } catch (PropertyVetoException e1) { 94 e1.printStackTrace(); 95 } 96 97 //Now we want to display a trend line in the graph. We will construct new 98 //AcopGraphParameters with a trend length of 1000. This means that the 99 //graph will show 1000 points. When the number of points exceeds this number 100 //the first value will be removed. 101 AcopGraphParameters parameters2 = new AcopGraphParameters(cp, 102 Color.BLUE, AcopFFTEnum.NoFFT.ordinal(), AcopDrawStyleEnum.PS_SOLID.ordinal(), 103 AcopDisplayMode.PolyLine.ordinal(), 1, true, 1000); 104 //It does not make sense displaying a histogram and trend on the same chart, 105 //therefore we have to remove all previous graphs. To remove a single 106 //parameters we can use the removeDisplayerParameters method. 107 chart.removeDisplayerParameters(parameters); 108 //To remove all parameters at once, we can also use method setDisplayerParameters. 109 try { 110 chart.setDisplayerParameters(new AcopGraphParameters[]{parameters2}); 111 } catch (CommonException e) { 112 e.printStackTrace(); 113 } catch (PropertyVetoException e) { 114 e.printStackTrace(); 115 } 116 117 //When adding parameters to the chart, chart will adjust the vertical boundaries 118 //with the values which are read from the remote property information. We are 119 //not sattisfied with this values and want to set different boundaries. 120 chart.setYMax(30); 121 chart.setYMin(-30); 122 //Another option is to allow the chart to adjust its boundaries by itself 123 //for best visualization. 124 chart.setYBestScale(true); 125 chart.setXBestScale(true); 126 127 //We can also enable horizontal and or vertical grid 128 chart.setXGrid(true); 129 chart.setYGrid(true); 130 //And if we aren't satisfied with the looks of the grid, we can customize it. 131 //We can set it's color, the width of grid's lines and also the type of lines 132 chart.setGridColor(Color.WHITE); 133 chart.setGridWidth(2); 134 chart.setGridStyle(AcopDrawStyleEnum.PS_DASH_DOT.ordinal()); 135 136 //And finally, if we want, we can change the color of background and foreground. 137 chart.setBackground(Color.BLACK); 138 } 139 140 }