BowlerKernel
RpcEncapsulation.java
Go to the documentation of this file.
1 package com.neuronrobotics.sdk.common;
2 
3 import com.neuronrobotics.sdk.common.device.server.IBowlerCommandProcessor;
4 
5 // TODO: Auto-generated Javadoc
9 public class RpcEncapsulation {
10 
12  private String namespace;
13 
15  private String rpc;
16 
19 
22 
25 
28 
30  private int namespaceIndex;
31 
34 
46  public RpcEncapsulation(int namespaceIndex,String namespace, String rpc,
49  this(namespaceIndex, namespace, rpc, downStreamMethod, downstreamArguments, upStreamMethod, upstreamArguments, null);
50  }
51 
64  public RpcEncapsulation(int namespaceIndex,String namespace, String rpc,
67  this.setProcessor(processor);
68  this.setNamespaceIndex(namespaceIndex);
69  this.setNamespace(namespace);
70  this.setRpc(rpc);
72  }
73 
83  this.setUpStreamMethod(upStreamMethod);
84  this.setDownstreamArguments(downstreamArguments);
85  this.setUpstreamArguments(upstreamArguments);
86  this.setDownStreamMethod(downStreamMethod);
87  }
88 
95  public BowlerAbstractCommand getCommand(Object [] doswnstreamData){
96  return getCommand(doswnstreamData, downstreamArguments);
97  }
98 
105  public BowlerAbstractCommand getCommandUpstream(Object [] doswnstreamData){
106  return getCommand(doswnstreamData, upstreamArguments);
107  }
108 
109 
117  public BowlerAbstractCommand getCommand(Object [] doswnstreamData, BowlerDataType [] arguments){
118  BowlerAbstractCommand command = new BowlerAbstractCommand() {};
119 
120  command.setOpCode(getRpc());
121  command.setMethod(getDownstreamMethod());
123 
124  for(int i=0;(i<arguments.length && i < doswnstreamData.length);i++ ){
125  try{
126  switch(arguments[i]){
127  case ASCII:
128  command.getCallingDataStorage().add(doswnstreamData[i].toString());
129  command.getCallingDataStorage().add(0);
130  break;
131  case FIXED100:
132  double d = Double.parseDouble(doswnstreamData[i].toString())*100;
133  command.getCallingDataStorage().addAs32((int)d);
134  break;
135  case FIXED1k:
136  double k = Double.parseDouble(doswnstreamData[i].toString())*1000;
137  command.getCallingDataStorage().addAs32((int)k);
138  break;
139  case I08:
140  command.getCallingDataStorage().add(Integer.parseInt(doswnstreamData[i].toString()));
141  break;
142  case BOOL:
143  command.getCallingDataStorage().add(Boolean.parseBoolean((doswnstreamData[i].toString()))?1:0);
144  break;
145  case I16:
146  command.getCallingDataStorage().addAs16(Integer.parseInt(doswnstreamData[i].toString()));
147  break;
148  case I32:
149  command.getCallingDataStorage().addAs32(Integer.parseInt(doswnstreamData[i].toString()));
150  break;
151  case I32STR:
152  try{
153  Integer [] data32 = (Integer [])doswnstreamData[i];
154  command.getCallingDataStorage().add(data32.length);
155  for(int i1=0;i1<data32.length;i1++){
156  command.getCallingDataStorage().addAs32(data32[i1]);
157  }
158  }catch (ClassCastException ex){
159  int [] data32 = (int [])doswnstreamData[i];
160  command.getCallingDataStorage().add(data32.length);
161  for(int i1=0;i1<data32.length;i1++){
162  command.getCallingDataStorage().addAs32(data32[i1]);
163  }
164  }
165  break;
166  case FIXED1k_STR:
167  double [] dataDouble = (double [])doswnstreamData[i];
168  command.getCallingDataStorage().add(dataDouble.length);
169  for(int i1=0;i1<dataDouble.length;i1++){
170  command.getCallingDataStorage().addAs32((int) (dataDouble[i1]*1000.0));
171  }
172  break;
173  case INVALID:
174  break;
175  case STR:
176  try{
177  ByteList data = (ByteList )doswnstreamData[i];
178  command.getCallingDataStorage().add(data.size());
179  for(int i1=0;i1<data.size();i1++){
180  command.getCallingDataStorage().add(data.get(i1));
181  }
182  }catch (ClassCastException ex){
183  try{
184  Integer [] data32 = (Integer [])doswnstreamData[i];
185  command.getCallingDataStorage().add(data32.length);
186  for(int i1=0;i1<data32.length;i1++){
187  command.getCallingDataStorage().addAs32(data32[i1]);
188  }
189  }catch (ClassCastException ex1){
190  int [] data32 = (int [])doswnstreamData[i];
191  command.getCallingDataStorage().add(data32.length);
192  for(int i1=0;i1<data32.length;i1++){
193  command.getCallingDataStorage().addAs32(data32[i1]);
194  }
195  }
196  }
197  break;
198  default:
199  throw new RuntimeException("Unrecognized data type "+arguments[i]);
200  }
201  }catch(Exception e){
202  e.printStackTrace();
203  Log.error("Expected : "+ arguments[i]+" got: "+doswnstreamData[i].getClass());
204  if(arguments.length != doswnstreamData.length){
205  Log.error("Wrong size : "+ arguments.length+" got: "+doswnstreamData.length);
206  }else{
207  for(int j=0;j<arguments.length;j++){
208  Log.error("Valid : "+ arguments[j]+" got: "+doswnstreamData[i].getClass());
209  }
210  }
211 
212  }
213 
214  }
215 
216  return command;
217  }
218 
225  public Object [] parseResponse(BowlerDatagram datagram){
226  return parseResponse(datagram, upstreamArguments);
227  }
228 
235  public Object [] parseResponseDownstream(BowlerDatagram datagram){
236  return parseResponse(datagram, downstreamArguments);
237  }
238 
246  public Object [] parseResponse(BowlerDatagram datagram, BowlerDataType [] arguments){
247  Object [] response = new Object[arguments.length];
248  int i=0;
249  try{
250  int numVals32;
251  ByteList data = datagram.getData();
252  for(i=0;(i<arguments.length);i++ ){
253 
254  switch(arguments[i]){
255  case ASCII:
256  String s = data.asString();
257  data.popList(s.length()+1);
258  response [i] = s;
259  break;
260  case FIXED100:
261  response [i] = new Double(ByteList.convertToInt(data.popList(4)))/100.0;
262  break;
263  case FIXED1k:
264  response [i] = new Double(ByteList.convertToInt(data.popList(4)))/1000.0;
265  break;
266  case I08:
267  response [i] = new Integer(data.getUnsigned(0));
268  data.pop();
269  break;
270  case BOOL:
271  response [i] = new Boolean(data.getUnsigned(0)!=0);
272  data.pop();
273  break;
274  case I16:
275  response [i] = new Integer(ByteList.convertToInt(data.popList(2)));
276  break;
277  case I32:
278  response [i] = new Integer(ByteList.convertToInt(data.popList(4),true));
279  break;
280  case I32STR:
281  numVals32 = data.getUnsigned(0);
282  data.pop();
283  ByteList d32 = new ByteList(data.popList(numVals32*4));
284  Integer [] i32Data = new Integer[numVals32];
285  response [i] = i32Data;
286  for(int j=0;j<numVals32;j++){
287  i32Data[j]=new Integer(ByteList.convertToInt(d32.popList(4)));
288  }
289  break;
290  case FIXED1k_STR:
291  numVals32 = data.getUnsigned(0);
292  data.pop();
293  ByteList dStr = new ByteList(data.popList(numVals32*4));
294  double [] dData = new double[numVals32];
295  response [i] = dData;
296  for(int j=0;j<numVals32;j++){
297  dData[j]=new Double(ByteList.convertToInt(dStr.popList(4)))/1000.0;
298  }
299  break;
300  case INVALID:
301  break;
302  case STR:
303  int numVals = data.getUnsigned(0);
304  data.pop();
305  ByteList iData = new ByteList();
306  response [i] = iData;
307  if(numVals>0){
308  ByteList d = new ByteList(data.popList(numVals));
309  for(int j=0;j<numVals;j++){
310  iData.add(new Integer(d.getUnsigned(j)));
311  }
312 
313  }
314 
315  break;
316  default:
317  throw new RuntimeException("Unrecognized data type"+arguments[i]);
318  }
319  }
320  }catch(java.lang.ClassCastException e){
321  e.printStackTrace();
322  Log.error("Expected : "+ arguments[i]+" got: "+response[i].getClass());
323  if(arguments.length != response.length){
324  Log.error("Wrong size : "+ arguments.length+" got: "+response.length);
325  }else{
326  for(int j=0;j<arguments.length;j++){
327  Log.error("Valid : "+ arguments[j]+" got: "+response[i].getClass());
328  }
329  }
330 
331  }catch(RuntimeException ex){
332  Log.error("Failed to parse "+i+"\n"+datagram+"\nFrom "+this);
333  throw ex;
334  }
335 
336  return response;
337  }
338 
344  public String getNamespace() {
345  return namespace;
346  }
347 
353  public void setNamespace(String namespace) {
354  this.namespace = namespace;
355  }
356 
362  public String getRpc() {
363  return rpc;
364  }
365 
371  public void setRpc(String rpc) {
372  this.rpc = rpc;
373  }
374 
381  return method;
382  }
383 
390  this.method = method;
391  }
392 
399  return downstreamArguments;
400  }
401 
402 
409  for(int i=0;i<downstreamArguments.length;i++){
410  if(downstreamArguments[i] == null){
411  throw new RuntimeException("RPC argument can not be null");
412  }
413  }
414  this.downstreamArguments = downstreamArguments;
415  }
416 
423  return upstreamArguments;
424  }
425 
432  if(upstreamArguments== null)
433  return;// asynchronus packets have no upstream
434  for(int i=0;i<upstreamArguments.length;i++){
435  if(upstreamArguments[i] == null){
436  throw new RuntimeException("RPC argument can not be null");
437  }
438  }
439  this.upstreamArguments = upstreamArguments;
440  }
441 
448  return upStreamMethod;
449  }
450 
457  this.upStreamMethod = upStreamMethod;
458  }
459 
460  /* (non-Javadoc)
461  * @see java.lang.Object#toString()
462  */
463  @Override
464  public String toString(){
465  String s=getNamespace()+" "+getRpc()+" "+getDownstreamMethod();
466  if(getDownstreamArguments()!=null){
467  s+=" (";
468  for(int i=0;i<getDownstreamArguments().length;i++){
469 
470  s+=getDownstreamArguments()[i]+ " ";
471  }
472  s+=") ";
473  s+=" "+getUpStreamMethod()+" (";
474  for(int i=0;i<getUpstreamArguments().length;i++){
475  s+=getUpstreamArguments()[i]+ " ";
476  }
477  s+=") ";
478  }
479  return s;
480  }
481 
487  public int getNamespaceIndex() {
488  return namespaceIndex;
489  }
490 
497  this.namespaceIndex = namespaceIndex;
498  }
499 
506  return processor;
507  }
508 
515  this.processor = processor;
516  }
517 
518 }
synchronized boolean add(byte data)
Definition: ByteList.java:149
static final int convertToInt(byte[] b)
Definition: ByteList.java:911
static void error(String message)
Definition: Log.java:92
RpcEncapsulation(int namespaceIndex, String namespace, String rpc, BowlerMethod downStreamMethod, BowlerDataType[] downstreamArguments, BowlerMethod upStreamMethod, BowlerDataType[] upstreamArguments)
Object[] parseResponse(BowlerDatagram datagram)
void setDownstreamArguments(BowlerDataType[] downstreamArguments)
void setProcessor(IBowlerCommandProcessor processor)
BowlerAbstractCommand getCommand(Object[] doswnstreamData, BowlerDataType[] arguments)
void setUpStreamMethod(BowlerMethod upStreamMethod)
BowlerAbstractCommand getCommand(Object[] doswnstreamData)
void setArguments(BowlerMethod downStreamMethod, BowlerDataType[] downstreamArguments, BowlerMethod upStreamMethod, BowlerDataType[] upstreamArguments)
Object[] parseResponseDownstream(BowlerDatagram datagram)
RpcEncapsulation(int namespaceIndex, String namespace, String rpc, BowlerMethod downStreamMethod, BowlerDataType[] downstreamArguments, BowlerMethod upStreamMethod, BowlerDataType[] upstreamArguments, IBowlerCommandProcessor processor)
BowlerAbstractCommand getCommandUpstream(Object[] doswnstreamData)
Object[] parseResponse(BowlerDatagram datagram, BowlerDataType[] arguments)
void setUpstreamArguments(BowlerDataType[] upstreamArguments)