No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DestijlCommandManager.cs 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. using System;
  2. namespace monitor
  3. {
  4. public class DestijlCommandList
  5. {
  6. public const string HeaderMtsComDmb = "COM";
  7. public const string HeaderMtsDmbOrder = "DMB";
  8. public const string HeaderMtsCamera = "CAM";
  9. public const string HeaderMtsMessage = "MSG";
  10. public const string DataComOpen = "o";
  11. public const string DataComClose = "C";
  12. public const string DataCamOpen = "A";
  13. public const string DataCamClose = "I";
  14. public const string DataCamAskArena = "y";
  15. public const string DataCamArenaConfirm = "x";
  16. public const string DataCamInfirm = "z";
  17. public const string DataCamComputePosition = "p";
  18. public const string DataCamStopComputePosition = "s";
  19. public const string HeaderStmAck = "ACK";
  20. public const string HeaderStmNoAck = "NAK";
  21. public const string HeaderStmLostDmb = "LCD";
  22. public const string HeaderStmImage = "IMG";
  23. public const string HeaderStmPos = "POS";
  24. public const string HeaderStmMes = "MSG";
  25. public const string HeaderStmBat = "BAT";
  26. }
  27. public class RobotCommandList
  28. {
  29. public const string RobotPing = "p";
  30. public const string RobotReset = "r";
  31. public const string RobotStartWithoutWatchdog = "u";
  32. public const string RobotStartWithWatchdog = "W";
  33. public const string RobotGetBattery = "v";
  34. public const string RobotGetBusyState = "b";
  35. public const string RobotMove = "M";
  36. public const string RobotTurn = "T";
  37. public const string RobotGetVersion = "V";
  38. public const string RobotPowerOff = "z";
  39. }
  40. public class DestijlCommandManager
  41. {
  42. private CommandManager commandManager = null;
  43. private string receivedHeader = null;
  44. private string receivedData = null;
  45. public delegate void CommandReceivedEvent(string header, string data);
  46. public CommandReceivedEvent commandReceivedEvent = null;
  47. public double timeout = 100; // timeout pour les commandes avec acquitement
  48. public enum CommandStatus
  49. {
  50. Success,
  51. Rejected,
  52. InvalidAnswer,
  53. Busy,
  54. CommunicationLostWithRobot,
  55. CommunicationLostWithServer
  56. }
  57. public DestijlCommandManager(CommandReceivedEvent callback)
  58. {
  59. commandManager = new CommandManager(OnCommandReceived);
  60. this.commandReceivedEvent += callback;
  61. }
  62. ~DestijlCommandManager()
  63. {
  64. if (commandManager != null) commandManager.Close();
  65. }
  66. private void OnCommandReceived(string msg)
  67. {
  68. string[] msgs = msg.Split(':');
  69. if (msgs.Length >= 1) receivedHeader = msgs[0];
  70. else receivedHeader = null;
  71. if (msgs.Length >= 2) receivedData = msgs[1];
  72. else receivedData = null;
  73. this.commandReceivedEvent?.Invoke(receivedHeader, receivedData);
  74. }
  75. public bool Open(string hostname)
  76. {
  77. return this.Open(hostname, Client.defaultPort);
  78. }
  79. public bool Open(string hostname, int port)
  80. {
  81. if (commandManager != null) return commandManager.Open(hostname, port);
  82. else return false;
  83. }
  84. public void Close()
  85. {
  86. if (commandManager != null) commandManager.Close();
  87. }
  88. private string CreateCommand(string header, string data)
  89. {
  90. return header + ":" + data;
  91. }
  92. private void SplitCommand(string cmd, out string header, out string data)
  93. {
  94. string[] cmdParts = cmd.Split(':');
  95. if (cmdParts.Length > 0) header = cmdParts[0];
  96. else header = null;
  97. if (cmdParts.Length > 1) data = cmdParts[1];
  98. else data = null;
  99. }
  100. private CommandStatus DecodeStatus(CommandManager.CommandManagerStatus localStatus, string answer)
  101. {
  102. CommandStatus status = CommandStatus.Success;
  103. if (localStatus == CommandManager.CommandManagerStatus.Timeout) status = CommandStatus.CommunicationLostWithServer;
  104. else if (localStatus == CommandManager.CommandManagerStatus.Busy) status = CommandStatus.Busy;
  105. else
  106. {
  107. if (answer != null)
  108. {
  109. if (answer.ToUpper().Contains(DestijlCommandList.HeaderStmNoAck)) status = CommandStatus.Rejected;
  110. else if (answer.ToUpper().Contains(DestijlCommandList.HeaderStmLostDmb)) status = CommandStatus.CommunicationLostWithRobot;
  111. else if (answer.ToUpper().Contains(DestijlCommandList.HeaderStmAck)) status = CommandStatus.Success;
  112. else if (answer.Length == 0) status = CommandStatus.CommunicationLostWithServer;
  113. else status = CommandStatus.InvalidAnswer;
  114. }
  115. }
  116. return status;
  117. }
  118. public CommandStatus RobotOpenCom()
  119. {
  120. CommandManager.CommandManagerStatus localStatus;
  121. string answer;
  122. localStatus = commandManager.SendCommand(
  123. CreateCommand(DestijlCommandList.HeaderMtsComDmb, DestijlCommandList.DataComOpen),
  124. out answer,
  125. this.timeout);
  126. return DecodeStatus(localStatus, answer);
  127. }
  128. public CommandStatus RobotCloseCom()
  129. {
  130. CommandManager.CommandManagerStatus localStatus;
  131. string answer;
  132. localStatus = commandManager.SendCommand(
  133. CreateCommand(DestijlCommandList.HeaderMtsComDmb, DestijlCommandList.DataComClose),
  134. out answer,
  135. this.timeout);
  136. return DecodeStatus(localStatus, answer);
  137. }
  138. public CommandStatus RobotPing()
  139. {
  140. CommandManager.CommandManagerStatus localStatus;
  141. string answer;
  142. localStatus = commandManager.SendCommand(
  143. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotPing),
  144. out answer,
  145. this.timeout);
  146. return DecodeStatus(localStatus, answer);
  147. }
  148. public CommandStatus RobotReset()
  149. {
  150. CommandManager.CommandManagerStatus localStatus;
  151. string answer;
  152. localStatus = commandManager.SendCommand(
  153. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotReset),
  154. out answer,
  155. 0);
  156. return DecodeStatus(localStatus, answer);
  157. }
  158. public CommandStatus RobotStartWithWatchdog()
  159. {
  160. CommandManager.CommandManagerStatus localStatus;
  161. string answer;
  162. localStatus = commandManager.SendCommand(
  163. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotStartWithWatchdog),
  164. out answer,
  165. this.timeout);
  166. return DecodeStatus(localStatus, answer);
  167. }
  168. public CommandStatus RobotStartWithoutWatchdog()
  169. {
  170. CommandManager.CommandManagerStatus localStatus;
  171. string answer;
  172. localStatus = commandManager.SendCommand(
  173. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotStartWithoutWatchdog),
  174. out answer,
  175. this.timeout);
  176. return DecodeStatus(localStatus, answer);
  177. }
  178. public CommandStatus RobotMove(int distance)
  179. {
  180. CommandManager.CommandManagerStatus localStatus;
  181. string answer;
  182. localStatus = commandManager.SendCommand(
  183. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotMove + "=" + distance),
  184. out answer,
  185. 0);
  186. return DecodeStatus(localStatus, answer);
  187. }
  188. public CommandStatus RobotTurn(int angle)
  189. {
  190. CommandManager.CommandManagerStatus localStatus;
  191. string answer;
  192. localStatus = commandManager.SendCommand(
  193. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotTurn + "=" + angle),
  194. out answer,
  195. 0);
  196. return DecodeStatus(localStatus, answer);
  197. }
  198. //public CommandStatus RobotGetBattery(out int battery)
  199. public CommandStatus RobotGetBattery()
  200. {
  201. CommandManager.CommandManagerStatus localStatus;
  202. //CommandStatus status = CommandStatus.Success;
  203. //battery = -1;
  204. string answer;
  205. localStatus = commandManager.SendCommand(
  206. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotGetBattery),
  207. out answer,
  208. 0);
  209. //if (localStatus == CommandManager.CommandManagerStatus.AnswerReceived) {
  210. // string[] msg = answer.Split(':');
  211. // if (msg.Length > 1)
  212. // {
  213. // try
  214. // {
  215. // battery = Convert.ToInt32(msg[1]);
  216. // }
  217. // catch (Exception) { }
  218. // }
  219. //}
  220. //else if (localStatus == CommandManager.CommandManagerStatus.Timeout)
  221. //{
  222. // status = CommandStatus.CommunicationLostWithServer;
  223. //}
  224. //return status;
  225. return DecodeStatus(localStatus, answer);
  226. }
  227. public CommandStatus RobotGetVersion(out string version)
  228. {
  229. CommandManager.CommandManagerStatus localStatus;
  230. CommandStatus status = CommandStatus.Success;
  231. version = "";
  232. string answer;
  233. localStatus = commandManager.SendCommand(
  234. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotGetVersion),
  235. out answer,
  236. this.timeout);
  237. if (localStatus == CommandManager.CommandManagerStatus.AnswerReceived)
  238. {
  239. string[] msg = answer.Split(':');
  240. if (msg.Length > 1)
  241. {
  242. version = msg[1];
  243. }
  244. }
  245. else if (localStatus == CommandManager.CommandManagerStatus.Timeout)
  246. {
  247. status = CommandStatus.CommunicationLostWithServer;
  248. }
  249. return status;
  250. }
  251. public CommandStatus RobotPowerOff()
  252. {
  253. CommandManager.CommandManagerStatus localStatus;
  254. string answer;
  255. localStatus = commandManager.SendCommand(
  256. CreateCommand(DestijlCommandList.HeaderMtsDmbOrder, RobotCommandList.RobotPowerOff),
  257. out answer,
  258. 0);
  259. return DecodeStatus(localStatus, answer);
  260. }
  261. public CommandStatus CameraOpen()
  262. {
  263. CommandManager.CommandManagerStatus localStatus;
  264. string answer;
  265. localStatus = commandManager.SendCommand(
  266. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamOpen),
  267. out answer,
  268. this.timeout);
  269. return DecodeStatus(localStatus, answer);
  270. }
  271. public CommandStatus CameraClose()
  272. {
  273. CommandManager.CommandManagerStatus localStatus;
  274. string answer;
  275. localStatus = commandManager.SendCommand(
  276. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamClose),
  277. out answer,
  278. 0);
  279. return DecodeStatus(localStatus, answer);
  280. }
  281. public CommandStatus CameraAskArena()
  282. {
  283. CommandManager.CommandManagerStatus localStatus;
  284. string answer;
  285. localStatus = commandManager.SendCommand(
  286. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamAskArena),
  287. out answer,
  288. 0);
  289. return DecodeStatus(localStatus, answer);
  290. }
  291. public CommandStatus CameraArenaConfirm()
  292. {
  293. CommandManager.CommandManagerStatus localStatus;
  294. string answer;
  295. localStatus = commandManager.SendCommand(
  296. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamArenaConfirm),
  297. out answer,
  298. 0);
  299. return DecodeStatus(localStatus, answer);
  300. }
  301. public CommandStatus CameraArenaInfirm()
  302. {
  303. CommandManager.CommandManagerStatus localStatus;
  304. string answer;
  305. localStatus = commandManager.SendCommand(
  306. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamInfirm),
  307. out answer,
  308. 0);
  309. return DecodeStatus(localStatus, answer);
  310. }
  311. public CommandStatus CameraComputePosition()
  312. {
  313. CommandManager.CommandManagerStatus localStatus;
  314. string answer;
  315. localStatus = commandManager.SendCommand(
  316. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamComputePosition),
  317. out answer,
  318. 0);
  319. return DecodeStatus(localStatus, answer);
  320. }
  321. public CommandStatus CameraStopComputePosition()
  322. {
  323. CommandManager.CommandManagerStatus localStatus;
  324. string answer;
  325. localStatus = commandManager.SendCommand(
  326. CreateCommand(DestijlCommandList.HeaderMtsCamera, DestijlCommandList.DataCamStopComputePosition),
  327. out answer,
  328. 0);
  329. return DecodeStatus(localStatus, answer);
  330. }
  331. }
  332. }