FestoXRServer.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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(20);
  96. Main.fhm.direktAuftrag(relPos, speed, 1, true, false);
  97. Thread.sleep(20);
  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("rel failed", e);
  108. return "rel 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. Thread.sleep(20);
  133. Main.fhm.direktAuftrag(targetPos, speed, 0, false, false);
  134. Thread.sleep(20);
  135. Main.fhm.direktAuftrag(targetPos, speed, 0, false, true);
  136. Thread.sleep(20);
  137. paused=true;
  138. }
  139. else if (rs == 0 || rs == 1) { //stop -> abort
  140. Thread.sleep(20);
  141. Main.fhm.direktAuftrag(targetPos, speed, 0, false, false);
  142. Thread.sleep(20);
  143. Main.fhm.direktAuftrag(targetPos, speed, 0, false, true);
  144. Thread.sleep(20);
  145. logger.info("rs=" + rs + " re");
  146. return "OK";
  147. }
  148. //TODO: if(timeout)
  149. round++;
  150. }
  151. } catch (ExecutionException | InterruptedException e) {
  152. logger.warn("abs failed", e);
  153. return "abs failed: " + e.toString();
  154. }
  155. }
  156. private void restart(int targetPos, int speed) throws InterruptedException {
  157. Main.fhm.bereitschaft();
  158. Thread.sleep(20);
  159. Main.fhm.direktAuftrag(targetPos, speed, 0, false, false);
  160. Thread.sleep(20);
  161. Main.fhm.direktAuftrag(targetPos, speed, 1, false, false);
  162. Thread.sleep(20);
  163. }
  164. @XRMethod(value = "getpos", help = "getpos")
  165. public int getpos() {
  166. logger.info("GetPos");
  167. try {
  168. return Main.fhm.readStatus().get().istPosition;
  169. } catch (InterruptedException e) {
  170. e.printStackTrace();
  171. } catch (ExecutionException e) {
  172. e.printStackTrace();
  173. }
  174. return -1;
  175. }
  176. @XRMethod(value = "ready", help = "ready")
  177. public String ready() {
  178. try {
  179. logger.info("Ready called");
  180. Main.fhm.bereitschaft();
  181. for (int i = 0; i < 5; i++) {
  182. Status s = Main.fhm.readStatus().get();
  183. if (s.enabled) {
  184. return "OK";
  185. }
  186. logger.info("Controller not enabled.." + i);
  187. Thread.sleep(100);
  188. }
  189. } catch (InterruptedException | ExecutionException e) {
  190. logger.warn("ready failed", e);
  191. }
  192. return "Controller not enabled";
  193. }
  194. }