FestoXRServer.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package at.acdp.urweb.web;
  2. import at.acdp.urweb.Main;
  3. import at.acdp.urweb.fhpp.Status;
  4. import at.acdp.urweb.rtde.RTDEClient;
  5. import com.nmote.xr.XRMethod;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. import java.util.concurrent.ExecutionException;
  11. public class FestoXRServer {
  12. private final static Logger logger = LoggerFactory.getLogger(FestoXRServer.class);
  13. private final RTDEClient rtde;
  14. public FestoXRServer(RTDEClient r) {
  15. this.rtde = r;
  16. }
  17. private static boolean checkPos(int pos) {
  18. try {
  19. Status s = Main.fhm.readStatus().get();
  20. int curPos = s.istPosition;
  21. logger.info("curpos {} ({})", curPos, pos);
  22. if (curPos == pos) {
  23. logger.info("reached {}", pos);
  24. return true;
  25. }
  26. if (s.istMoment == 0 && Math.abs(curPos - pos) < 5) {
  27. logger.info("reached {} (moment=0)", pos);
  28. return true;
  29. }
  30. Thread.sleep(500);
  31. } catch (ExecutionException | InterruptedException e) {
  32. logger.warn("checkPos failed", e);
  33. }
  34. return false;
  35. }
  36. @XRMethod(value = "status", help = "Returns status")
  37. public static Map<String, Object> status() {
  38. var x = Main.fhm.readStatus();
  39. try {
  40. if (x == null)
  41. return null;
  42. var ret = x.get();
  43. Map<String, Object> m = new HashMap<>();
  44. m.put("opm1", ret.opm1);
  45. m.put("opm2", ret.opm2);
  46. m.put("fct", ret.fct);
  47. m.put("rdyen", ret.rdyen);
  48. m.put("fault", ret.fault);
  49. m.put("warn", ret.warn);
  50. m.put("open", ret.open);
  51. m.put("enabled", ret.enabled);
  52. m.put("ref", ret.ref);
  53. m.put("still", ret.still);
  54. m.put("dev", ret.dev);
  55. m.put("mov", ret.mov);
  56. m.put("teach", ret.teach);
  57. m.put("mc", ret.mc);
  58. m.put("ack", ret.ack);
  59. m.put("halt", ret.halt);
  60. m.put("func", ret.func);
  61. m.put("fgrp", ret.fgrp);
  62. m.put("fnum", ret.fnum);
  63. m.put("com", ret.com);
  64. m.put("abs", ret.abs);
  65. m.put("istMoment", ret.istMoment);
  66. m.put("istPosition", ret.istPosition);
  67. m.put("halt", ret.halt);
  68. return m;
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. return null;
  72. }
  73. }
  74. @XRMethod(value = "example.helloWorld", help = "Returns 'Helo ' + argument")
  75. public String hello(Object s) {
  76. return "Hello '" + s + "'";
  77. }
  78. @XRMethod(value = "ref2", help = "ref")
  79. public String ref(String a, String b) {
  80. return "ref";
  81. }
  82. @XRMethod(value = "rel", help = "rel")
  83. public String rel(int relPos, int speed) {
  84. try {
  85. logger.info("rel {}", relPos);
  86. int curPos = Main.fhm.readStatus().get().istPosition;
  87. int targetPos = curPos + relPos;
  88. logger.info("Relative by {} from {} to {} speed {}", relPos, curPos, targetPos, speed);
  89. Main.fhm.bereitschaft();
  90. if (!Main.fhm.readStatus().get().enabled) {
  91. logger.info("Controller not enabled");
  92. return "Controller not enabled";
  93. }
  94. Main.fhm.direktAuftrag(relPos, speed, 0, true, false);
  95. Thread.sleep(10);
  96. Main.fhm.direktAuftrag(relPos, speed, 1, true, false);
  97. Thread.sleep(10);
  98. while (true) {
  99. boolean reached = checkPos(targetPos);
  100. if (reached) {
  101. logger.info("Reached {}", targetPos);
  102. return "OK";
  103. }
  104. Thread.sleep(100);
  105. }
  106. } catch (ExecutionException | InterruptedException e) {
  107. logger.warn("abs failed", e);
  108. return "abs failed: " + e.toString();
  109. }
  110. }
  111. @XRMethod(value = "abs", help = "abs")
  112. public String abs(int targetPos, int speed) {
  113. try {
  114. int round = 1;
  115. boolean paused = false;
  116. restart(targetPos, speed);
  117. while (true) {
  118. logger.info("Absolute to {} speed {} try {}, stopped {}", targetPos, speed, round, paused);
  119. boolean reached = checkPos(targetPos);
  120. Status s = Main.fhm.readStatus().get();
  121. if (reached) {
  122. logger.info("Reached {}", targetPos);
  123. return "OK";
  124. }
  125. int rs = Integer.parseInt(rtde.getLastData().get("runtime_state"));
  126. //0=stopping, 1=stopped, 2=running, 3=paueing, 4=paused, 5=resuming, 6=retracting
  127. if(paused==true && (rs== 2||rs==5)) {
  128. restart(targetPos, speed);
  129. paused=false;
  130. }
  131. if (paused==false&&(rs == 3 || rs == 4)) { //paused -> stop axis
  132. Main.fhm.direktAuftrag(targetPos, speed, 0, false, false);
  133. Thread.sleep(20);
  134. Main.fhm.direktAuftrag(targetPos, speed, 0, false, true);
  135. Thread.sleep(20);
  136. paused=true;
  137. }
  138. else if (rs == 0 || rs == 1) { //stop -> abort
  139. Main.fhm.direktAuftrag(targetPos, speed, 0, false, false);
  140. Thread.sleep(20);
  141. Main.fhm.direktAuftrag(targetPos, speed, 0, false, true);
  142. Thread.sleep(20);
  143. logger.info("rs=" + rs + " re");
  144. return "OK";
  145. }
  146. //TODO: if(timeout)
  147. round++;
  148. }
  149. } catch (ExecutionException | InterruptedException e) {
  150. logger.warn("abs failed", e);
  151. return "abs failed: " + e.toString();
  152. }
  153. }
  154. private void restart(int targetPos, int speed) throws InterruptedException {
  155. Main.fhm.bereitschaft();
  156. Main.fhm.direktAuftrag(targetPos, speed, 0, false, false);
  157. Thread.sleep(20);
  158. Main.fhm.direktAuftrag(targetPos, speed, 1, false, false);
  159. Thread.sleep(20);
  160. }
  161. @XRMethod(value = "getpos", help = "getpos")
  162. public int getpos() {
  163. logger.info("GetPos");
  164. try {
  165. return Main.fhm.readStatus().get().istPosition;
  166. } catch (InterruptedException e) {
  167. e.printStackTrace();
  168. } catch (ExecutionException e) {
  169. e.printStackTrace();
  170. }
  171. return -1;
  172. }
  173. @XRMethod(value = "ready", help = "ready")
  174. public String ready() {
  175. try {
  176. logger.info("Ready called");
  177. Main.fhm.bereitschaft();
  178. for (int i = 0; i < 5; i++) {
  179. Status s = Main.fhm.readStatus().get();
  180. if (s.enabled) {
  181. return "OK";
  182. }
  183. logger.info("Controller not enabled.." + i);
  184. Thread.sleep(100);
  185. }
  186. } catch (InterruptedException | ExecutionException e) {
  187. logger.warn("ready failed", e);
  188. }
  189. return "Controller not enabled";
  190. }
  191. }