RTDEClient.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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.net.SocketException;
  12. import java.net.UnknownHostException;
  13. import java.nio.ByteBuffer;
  14. import java.util.List;
  15. import java.util.concurrent.Semaphore;
  16. import static at.acdp.urweb.rtde.CommandType.*;
  17. public class RTDEClient implements Runnable {
  18. private final static org.slf4j.Logger logger = LoggerFactory.getLogger(RTDEClient.class);
  19. private final Semaphore waitingRequestSem = new Semaphore(0);
  20. private final Semaphore socketOpen = new Semaphore(0);
  21. private volatile IRtdeData waitingRequest=null;
  22. public static int RTDE_PROTOCOL_VERSION = 2;
  23. private final String ip;
  24. private final int port;
  25. private final boolean _running = true;
  26. private DataOutputStream dos;
  27. private DataInputStream dis;
  28. public RTDEClient(String ip, int port) {
  29. this.ip = ip;
  30. this.port = port;
  31. }
  32. public void start() throws IOException, InterruptedException {
  33. Thread readThread = new Thread(this);
  34. readThread.start();
  35. socketOpen.acquire();
  36. init();
  37. }
  38. private void request(IRtdeData data) throws IOException, InterruptedException {
  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);
  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 send_output_setup(List<String> variables, List<String> types, int frequency) throws IOException {
  89. var payload = String.join(",", variables);
  90. byte[] p = payload.getBytes();
  91. ByteBuffer bytes = ByteBuffer.allocate(8 + p.length);
  92. bytes.putDouble(frequency);
  93. bytes.put(p);
  94. }
  95. public void init() throws IOException, InterruptedException {
  96. var rpv = new RtdeRequestProtocolVersion();
  97. request(rpv);
  98. logger.info("RtdeRequestProtocolVersion succes:" + rpv.success);
  99. var ruv = new RtdeRequestURVersion();
  100. request(ruv);
  101. logger.info(String.format("RtdeRequestURVersion: %d.%d.%d.%d",ruv.major, ruv.minor, ruv.build, ruv.bugfix));
  102. }
  103. }