RTDEClient.java 4.2 KB

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