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__ */