RTDEClient.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package at.acdp.urweb.rtde;
  2. import at.acdp.urweb.rtde.packets.IRtdeData;
  3. import at.acdp.urweb.rtde.packets.RtdeRequestProtocolVersion;
  4. import at.acdp.urweb.rtde.packets.RtdeRequestURVersion;
  5. import at.acdp.urweb.rtde.packets.RtdeTextMessage;
  6. import org.slf4j.LoggerFactory;
  7. import java.io.DataInputStream;
  8. import java.io.DataOutputStream;
  9. import java.io.IOException;
  10. import java.net.Socket;
  11. import java.util.concurrent.Semaphore;
  12. import static at.acdp.urweb.rtde.CommandType.*;
  13. public class RTDEClient implements Runnable {
  14. private final static org.slf4j.Logger logger = LoggerFactory.getLogger(RTDEClient.class);
  15. private final Semaphore waitingRequestSem = new Semaphore(0);
  16. private final Semaphore socketOpen = new Semaphore(0);
  17. private volatile IRtdeData waitingRequest=null;
  18. public static int RTDE_PROTOCOL_VERSION = 2;
  19. private final String ip;
  20. private final int port;
  21. private final boolean _running = true;
  22. private DataOutputStream dos;
  23. private DataInputStream dis;
  24. private Thread readThread;
  25. public RTDEClient(String ip, int port) {
  26. this.ip = ip;
  27. this.port = port;
  28. }
  29. public void start() throws IOException, InterruptedException {
  30. readThread = new Thread(this);
  31. readThread.start();
  32. socketOpen.acquire();
  33. init();
  34. }
  35. public void request(IRtdeData data) throws IOException, InterruptedException {
  36. if(readThread.getId()==Thread.currentThread().getId()) {
  37. logger.error("request() must not be called from readThread.");
  38. }
  39. waitingRequest=data;
  40. data.send(dos);
  41. waitingRequestSem.acquire();
  42. return;
  43. }
  44. // Internal method that actually reads the data
  45. private void readSocket() throws IOException, InterruptedException {
  46. int length = dis.readShort();
  47. int type=dis.readByte();
  48. if(type==waitingRequest.getType()) {
  49. waitingRequest.read(dis, length-3);
  50. waitingRequestSem.release();
  51. } else switch(type) {
  52. case RTDE_TEXT_MESSAGE:
  53. var rpv = new RtdeTextMessage();
  54. request(rpv);
  55. logger.info("RTDE_TEXT_MESSAGE", rpv.text);
  56. break;
  57. default: {
  58. logger.warn(String.format("Unexpected package type: %d", type));
  59. byte[] buf=new byte[length];
  60. dis.readFully(buf);
  61. }
  62. }
  63. }
  64. @Override
  65. public void run() {
  66. try {
  67. Socket rt = new Socket(ip, port);
  68. rt.setSoTimeout(0);
  69. rt.setReuseAddress(true);
  70. rt.setTcpNoDelay(true);
  71. if (rt.isConnected()) {
  72. System.out.println("Connected to UR Realtime Client");
  73. }
  74. dos = new DataOutputStream(rt.getOutputStream());
  75. dis = new DataInputStream(rt.getInputStream());
  76. socketOpen.release();
  77. while (_running) {
  78. try {
  79. readSocket();
  80. } catch (IOException | InterruptedException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. } catch (IOException e) {
  85. logger.warn("run",e);
  86. }
  87. }
  88. public void init() throws IOException, InterruptedException {
  89. var rpv = new RtdeRequestProtocolVersion();
  90. request(rpv);
  91. logger.info("RtdeRequestProtocolVersion succes:" + rpv.success);
  92. var ruv = new RtdeRequestURVersion();
  93. request(ruv);
  94. logger.info(String.format("RtdeRequestURVersion: %d.%d.%d.%d",ruv.major, ruv.minor, ruv.build, ruv.bugfix));
  95. }
  96. }