BowlerKernel
DyIOConversation.java
Go to the documentation of this file.
1 package com.neuronrobotics.application.xmpp;
2 
3 import java.util.ArrayList;
4 import java.util.EnumSet;
5 
6 import org.jivesoftware.smack.Chat;
7 import org.jivesoftware.smack.MessageListener;
8 import org.jivesoftware.smack.XMPPException;
9 import org.jivesoftware.smack.packet.Message;
10 
11 import com.neuronrobotics.application.xmpp.GoogleChat.IChatLog;
12 import com.neuronrobotics.sdk.dyio.DyIO;
13 import com.neuronrobotics.sdk.dyio.DyIOChannelEvent;
14 import com.neuronrobotics.sdk.dyio.DyIOChannelMode;
15 import com.neuronrobotics.sdk.common.DeviceManager;
16 import com.neuronrobotics.sdk.dyio.IChannelEventListener;
17 
18 
19 // TODO: Auto-generated Javadoc
23 public class DyIOConversation implements IConversation, MessageListener, IChannelEventListener {
24 
26  private ArrayList<ChatAsyncListener> listeners = new ArrayList<ChatAsyncListener>();
27 
29  private IChatLog log;
30 
37  this.log=log;
38  }
39 
40  /* (non-Javadoc)
41  * @see org.jivesoftware.smack.MessageListener#processMessage(org.jivesoftware.smack.Chat, org.jivesoftware.smack.packet.Message)
42  */
43  public void processMessage(Chat chat, Message message) {
44  Message msg = new Message(message.getFrom(), Message.Type.chat);
45  if(message.getType().equals(Message.Type.chat) && message.getBody() != null) {
46  System.out.println("Received: " + message.getBody()+" from: "+message.getFrom());
47  if(log!=null){
48  log.onLogEvent(""+message.getFrom()+">> "+ message.getBody());
49  }
50  try {
51  String ret =onMessage(message.getBody(),chat, message.getFrom());
52  msg.setBody(ret);
53  System.out.println("Sending: "+msg.getBody());
54  if(log!=null){
55  log.onLogEvent(""+message.getFrom()+"<< "+ ret);
56  }
57  chat.sendMessage(msg);
58  } catch (XMPPException ex) {
59  ex.printStackTrace();
60  System.out.println("Failed to send message");
61  }
62  } else {
63  System.out.println("I got a message I didn't understand\n\n"+message.getType());
64  }
65  }
66 
67  /* (non-Javadoc)
68  * @see com.neuronrobotics.application.xmpp.IConversation#onMessage(java.lang.String, org.jivesoftware.smack.Chat, java.lang.String)
69  */
70  @Override
71  public String onMessage(String input,Chat chat,String from) {
72  String [] packet = input.split("\\ ");
73  if(packet[0].toLowerCase().contains("ping")){
74  return "ping: \n"+((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).ping();
75  }else if(packet[0].toLowerCase().contains("state")){
76  return "state: \n"+((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).toString();
77  }else if(packet[0].toLowerCase().contains("setmode")){
79  boolean found = false;
80  String options = "";
81  for(DyIOChannelMode cm : EnumSet.allOf(DyIOChannelMode.class)) {
82  options+=cm.toSlug()+"\n";
83  if(packet[2].toLowerCase().equals(cm.toSlug())){
84  m=cm;
85  found = true;
86  }
87  }
88  try{
89  int port = Integer.parseInt(packet[1]);
90  if(found && ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).canBeMode(m)){
91  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).setMode(port, m);
92  return "setMode "+port+" "+m.toSlug();
93  }
94  }catch(Exception ex){
95  ex.printStackTrace();
96  }
97  return "error: Mode not settible on channel #"+packet[1]+" mode options are:\n"+options;
98  }else if(packet[0].toLowerCase().contains("setvalue")){
99  int port = Integer.parseInt(packet[1]);
100  int value = Integer.parseInt(packet[2]);
101  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).setValue(value);
102  return "setValue "+port+" "+value;
103  }else if(packet[0].toLowerCase().contains("getvalue")){
104  int port = Integer.parseInt(packet[1]);
105  int value = ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).getValue();
106  return "getValue "+port+" "+value;
107  }else if(packet[0].toLowerCase().contains("addasync")){
108  int port = Integer.parseInt(packet[1]);
109  int rate = 500;
110  try{
111  rate = Integer.parseInt(packet[2]);
112  }catch (Exception ex){
113  rate = 500;
114  }
115  if(rate < 500)
116  rate = 500;
117  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).setAsync(true);
118  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).configAdvancedAsyncNotEqual(rate);
119  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).addChannelEventListener( getListener(chat, from));
120  return "async "+port+" "+rate;
121  }
122  else if(packet[0].toLowerCase().contains("removeasync")){
123  int port = Integer.parseInt(packet[1]);
124  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(port).removeChannelEventListener( getListener(chat, from));
125  return "async removed "+port+" ";
126  }
127  else if(packet[0].toLowerCase().contains("reset")){
128  for (int i=0;i<24;i++){
129  ((DyIO) DeviceManager.getSpecificDevice(DyIO.class, null)).getChannel(i).removeAllChannelEventListeners();
130  }
131  return "system reset!";
132  }else{
133  return help();
134  }
135  }
136 
144  private ChatAsyncListener getListener(Chat c,String from){
145  ChatAsyncListener back=null;
147  if(l.getFrom().equals(from) && l.getChat()==c){
148  back = l;
149  System.out.println("Found old listener");
150  }
151  }
152  if(back == null){
153  System.out.println("Adding new listener");
154  back = new ChatAsyncListener(c, from);
155  listeners.add(back);
156  }
157  return back;
158  }
159 
170  private class ChatAsyncListener implements IChannelEventListener{
171 
173  private Chat chat;
174 
176  private String from;
177 
184  public ChatAsyncListener(Chat c,String from){
185  setChat(c);
186  this.setFrom(from);
187  }
188 
194  public Chat getChat() {
195  return chat;
196  }
197 
198  /* (non-Javadoc)
199  * @see com.neuronrobotics.sdk.dyio.IChannelEventListener#onChannelEvent(com.neuronrobotics.sdk.dyio.DyIOChannelEvent)
200  */
201  @Override
203  Message msg = new Message(getFrom(), Message.Type.chat);
204  String body = "asyncData "+e.getChannel().getChannelNumber()+" "+e.getValue();
205  msg.setBody(body);
206  System.err.println("async: "+msg.getBody());
207  try {
208  chat.sendMessage(msg);
209  } catch (XMPPException e1) {
210  // TODO Auto-generated catch block
211  e1.printStackTrace();
212  }
213  }
214 
220  public void setChat(Chat chat) {
221  this.chat = chat;
222  }
223 
229  public void setFrom(String from) {
230  this.from = from;
231  }
232 
238  public String getFrom() {
239  return from;
240  }
241  }
242 
248  private String help(){
249  String s="This is a REPL loop for talking to the DyIO\n" +
250  "Commands use a command name, which DyIO port your connected to, and a value\n" +
251  "The 3 fields are seperated by a single space charrector\n" +
252  "The name is a string, and the 2 data fields are integers\n" +
253  "If a field is unused, it will be displayed as 'none'\n" +
254  "Commands are: \n" ;
255  s+="ping \tnone \tnone :returns ping message\n";
256  s+="state \tnone \tnone :returns state information\n";
257  s+="reset \tnone \tnone :returns none Removes all async listeners\n";
258  s+="setMode \t(int)channel \t(String)mode :returns the mode if successful, 'error' if not sucessful\n";
259  s+="setValue \t(int)channel \t(int)value :returns the value if successful, 'error' if not sucessful\n";
260  s+="getValue \t(int)channel \tnone :returns (int)value\n";
261  s+="addAsync \t(int)channel \t(int)update rate in Ms :returns (int)value: Async of any incoming data\n";
262  s+="removeAsync \t(int)channel \tnone :returns none Removes one async listener\n";
263  return s;
264  }
265 
266  /* (non-Javadoc)
267  * @see com.neuronrobotics.sdk.dyio.IChannelEventListener#onChannelEvent(com.neuronrobotics.sdk.dyio.DyIOChannelEvent)
268  */
269  @Override
271  // TODO Auto-generated method stub
272 
273  }
274 
275 }
String onMessage(String input, Chat chat, String from)
ChatAsyncListener getListener(Chat c, String from)
static Object getSpecificDevice(String name, IDeviceProvider provider)