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.transport.adapters;
24  
25  /*
26   * Copyright (c) 2006 by Cosylab d.o.o.
27   *
28   * The full license specifying the redistribution, modification, usage and other
29   * rights and obligations is included with the distribution of this project in
30   * the file license.html. If the license is not included you may find a copy at
31   * http://www.cosylab.com/legal/abeans_license.htm or may write to Cosylab, d.o.o.
32   *
33   * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
34   * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
35   * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
36   * OR REDISTRIBUTION OF THIS SOFTWARE.
37   */
38  
39  import java.util.Map;
40  
41  import com.cosylab.gui.displayers.DataConsumer;
42  import com.cosylab.gui.displayers.DataState;
43  import com.cosylab.gui.displayers.NonblockingNumberConsumer;
44  import com.cosylab.gui.displayers.SynchronousNumberConsumer;
45  import com.cosylab.util.CommonException;
46  
47  import de.desy.acop.transport.AccessMode;
48  import de.desy.acop.transport.AcopTransport;
49  import de.desy.acop.transport.ConnectionParameters;
50  import de.desy.tine.client.TCallback;
51  import de.desy.tine.client.TLink;
52  import de.desy.tine.dataUtils.TDataType;
53  import de.desy.tine.definitions.TAccess;
54  import de.desy.tine.definitions.TMode;
55  
56  
57  /**
58   * <code>ReverseConsumer</code> is an implementation consumer that is attached
59   * to those consumers which also act as data sources. This consumers receive
60   * data from those sources and forward it to the TINE channel.
61   * 
62   * @author Jaka Bobnar, Cosylab
63   *
64   */
65  public class ReverseConsumer implements SynchronousNumberConsumer, NonblockingNumberConsumer
66  	
67  {
68  	/** Supporter consumer types */
69  	public static final Class<?>[] SUPPORTED_CONSUMER_TYPES = {
70  		SynchronousNumberConsumer.class, NonblockingNumberConsumer.class};
71  	
72  	private AcopTransport transport;
73  	private ConnectionParameters parameters;
74  	private int timeout = 30000;
75  	private double[] data;
76  	private TLink asyncLink;
77  	private TDataType asyncDataIn;
78  	private TCallback asyncCallback;
79  	
80  	public ReverseConsumer(ConnectionParameters param, AcopTransport tran, int size)
81  	{
82  		transport= tran;
83          parameters = param.deriveWith(AccessMode.WRITE,timeout);
84          transport.setConnectionParameters(parameters);
85          data= new double[size];
86  	}
87  
88  	/* (non-Javadoc)
89  	 * @see com.cosylab.gui.displayers.DataConsumer#getDataConsumer(java.lang.Class)
90  	 */
91  	@SuppressWarnings("unchecked")
92      public DataConsumer getDataConsumer(Class type)
93  	{
94  		if (type.isAssignableFrom(this.getClass())) {
95  			return this;
96  		}
97  
98  		return null;
99  	}
100 
101 	/* (non-Javadoc)
102 	 * @see com.cosylab.gui.displayers.DataConsumer#getDefaultDataConsumer()
103 	 */
104 	public DataConsumer getDefaultDataConsumer()
105 	{
106 		return this;
107 	}
108 
109 	/* (non-Javadoc)
110 	 * @see com.cosylab.gui.displayers.DataConsumer#updateDataState(com.cosylab.gui.displayers.DataState)
111 	 */
112 	public void updateDataState(DataState state)
113 	{
114 	}
115 
116 	/* (non-Javadoc)
117 	 * @see com.cosylab.gui.displayers.DataConsumer#setCharacteristics(java.util.Map)
118 	 */
119 	public void setCharacteristics(Map attributes)
120 	{
121 	}
122 
123 	/* (non-Javadoc)
124 	 * @see com.cosylab.gui.displayers.DataConsumer#getName()
125 	 */
126 	public String getName()
127 	{
128 		return "WriteAdapter";
129 	}
130 
131 	/* (non-Javadoc)
132 	 * @see com.cosylab.gui.displayers.DataConsumer#getSupportedCharacteristics()
133 	 */
134 	public String[] getSupportedCharacteristics()
135 	{
136 		return null;
137 	}
138 
139 	/* (non-Javadoc)
140 	 * @see com.cosylab.gui.displayers.DataConsumer#getSupportedConsumerTypes()
141 	 */
142 	@SuppressWarnings("unchecked")
143 	public Class[] getSupportedConsumerTypes()
144 	{
145 		return SUPPORTED_CONSUMER_TYPES;
146 	}
147 
148 	/*
149 	 * (non-Javadoc)
150 	 * @see com.cosylab.gui.displayers.SynchronousNumberConsumer#updateSynchronously(long, java.lang.Number)
151 	 */
152 	public void updateSynchronously(long timestamp, Number value) throws CommonException {
153 		data[0] = value.doubleValue();
154 	    transport.execute(null,0,data,1);
155 	    
156     }
157 
158 	/*
159 	 * (non-Javadoc)
160 	 * @see com.cosylab.gui.displayers.NonblockingNumberConsumer#updateNonblocking(java.lang.Number)
161 	 */
162 	public void updateNonblocking(Number value) {
163 		data[0] = value.doubleValue();
164 		
165 		if (asyncLink == null) {
166 			String deviceName = "/" + parameters.getDeviceContext() +"/" + parameters.getDeviceGroup() +"/" + parameters.getDeviceName();
167 			asyncDataIn = new TDataType(data);
168 			asyncLink = new TLink(deviceName, parameters.getDeviceProperty(), new TDataType(), asyncDataIn, TAccess.CA_WRITE);
169 			asyncCallback = new TCallback(){
170 //				int count = 0;
171 				public void callback(int LinkIndex, int LinkStatus) {
172 //					System.out.println(count++);
173 				}
174 			};
175 		}
176 		asyncDataIn.putData(data);		
177 		asyncLink.attach(TMode.CM_SINGLE, asyncCallback, 1000);
178     }
179 	
180 	
181 	/**
182 	 * Releases this consumer.
183 	 */
184 	public void release() {
185 		transport=null;
186 		parameters=null;
187 		data=null;
188 	}
189 }
190 /* __oOo__ */