AbstractMessage.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. using System;
  2. using System.Collections.Generic;
  3. namespace nettyCommunication
  4. {
  5. /// <summary>
  6. /// 抽象消息类
  7. /// </summary>
  8. public abstract class AbstractMessage
  9. {
  10. }
  11. /// <summary>
  12. /// 用户指令类,s停,f取,p预约停
  13. /// </summary>
  14. public class MessageUTF8 : AbstractMessage, ICloneable
  15. {
  16. public string cmd { set; get; }
  17. public string context { set; get; }
  18. public string sender { set; get; }
  19. public string receiver { set; get; }
  20. public int parkingRecordsID { set; get; }
  21. public int garageID { get; set; }
  22. public string bookTime { get; set; }
  23. public MessageUTF8()
  24. {
  25. }
  26. public MessageUTF8(string cmd, string context, string sender, string receiver, int garageID, int parkingRecordsID, string bookTime)
  27. {
  28. this.cmd = cmd;
  29. this.context = context;
  30. this.sender = sender;
  31. this.receiver = receiver;
  32. this.garageID = garageID;
  33. this.parkingRecordsID = parkingRecordsID;
  34. this.bookTime = bookTime;
  35. }
  36. public object Clone()
  37. {
  38. if (this == null)
  39. return null;
  40. MessageUTF8 webMsg = new MessageUTF8(this.cmd, this.context, this.sender, this.receiver, this.garageID, this.parkingRecordsID, this.bookTime);
  41. return webMsg;
  42. }
  43. }
  44. //********************************************* plc ************************************************
  45. /// <summary>
  46. /// plc节点类
  47. /// </summary>
  48. public class PLCNode : AbstractMessage
  49. {
  50. public string Address { get; set; }
  51. public string Value { get; set; }
  52. public PLCNode()
  53. {
  54. Address = "";
  55. Value = "";
  56. }
  57. public PLCNode(string addr, string v)
  58. {
  59. Address = addr;
  60. Value = v;
  61. }
  62. public override bool Equals(System.Object obj)
  63. {
  64. if (this == obj)
  65. return true;
  66. if (obj == null || obj.GetType() != this.GetType())
  67. return false;
  68. PLCNode p = obj as PLCNode;
  69. return (Address == p.Address) && (Value == p.Value);
  70. }
  71. public override int GetHashCode()
  72. {
  73. int hash = 7;
  74. return 31 * hash + Address.GetHashCode() + Value.GetHashCode();
  75. }
  76. }
  77. /// <summary>
  78. /// plc消息类
  79. /// </summary>
  80. public class PLCMessage : AbstractMessage, ICloneable
  81. {
  82. public List<PLCNode> extendedPlcList { get; set; }
  83. public List<PLCNode> originalPlcList { get; set; }
  84. public List<LaserMessage> laserMsgList { get; set; }
  85. public PLCMessage()
  86. {
  87. extendedPlcList = new List<PLCNode>();
  88. originalPlcList = new List<PLCNode>();
  89. laserMsgList = new List<LaserMessage>();
  90. }
  91. public object Clone()
  92. {
  93. PLCMessage plcClone = new PLCMessage();
  94. foreach (PLCNode pn in extendedPlcList)
  95. {
  96. plcClone.extendedPlcList.Add(pn);
  97. }
  98. foreach (PLCNode pn in originalPlcList)
  99. {
  100. plcClone.originalPlcList.Add(pn);
  101. }
  102. foreach (LaserMessage lm in laserMsgList)
  103. {
  104. plcClone.laserMsgList.Add(lm);
  105. }
  106. return plcClone;
  107. }
  108. }
  109. //******************************************* NumMachine *********************************************
  110. /// <summary>
  111. /// 号牌机状态枚举
  112. /// </summary>
  113. public enum EnumNumberMachineStatus
  114. {
  115. Offline, Normal
  116. }
  117. /// <summary>
  118. /// 号牌机节点类
  119. /// </summary>
  120. public class NumberMachineNode : ICloneable
  121. {
  122. public string ip { get; set; }
  123. public string LicenseNum { get; set; }
  124. public string TimeRecord { get; set; }
  125. public int id;
  126. public EnumNumberMachineStatus status;
  127. public NumberMachineNode() { }
  128. public NumberMachineNode(string ipAddr, int id, string license, string time, int stat)
  129. {
  130. SetLic(ipAddr, id, license, time, stat);
  131. }
  132. public void SetLic(string ipAddr, int id, string license, string time, int stat)
  133. {
  134. ip = ipAddr;
  135. this.id = id;
  136. LicenseNum = license;
  137. TimeRecord = time;
  138. if (stat == 1)
  139. status = EnumNumberMachineStatus.Normal;
  140. else
  141. status = EnumNumberMachineStatus.Offline;
  142. }
  143. public override bool Equals(object obj)
  144. {
  145. if (obj == null || obj.GetType() != this.GetType())
  146. return false;
  147. if (this == obj)
  148. return true;
  149. NumberMachineNode l = (NumberMachineNode)obj;
  150. return (l.LicenseNum == LicenseNum);
  151. }
  152. public override int GetHashCode()
  153. {
  154. return ip.GetHashCode() + LicenseNum.GetHashCode();
  155. }
  156. public object Clone()
  157. {
  158. if (status == EnumNumberMachineStatus.Normal)
  159. return new NumberMachineNode(ip, id, LicenseNum, TimeRecord, 1);
  160. else
  161. return new NumberMachineNode(ip, id, LicenseNum, TimeRecord, 0);
  162. }
  163. }
  164. /// <summary>
  165. /// 号牌机消息类
  166. /// </summary>
  167. public class NumberMachineMessage : AbstractMessage
  168. {
  169. public List<NumberMachineNode> data { get; set; }
  170. public NumberMachineNode aNode;
  171. public Dictionary<int, Queue<NumberMachineNode>> filterMap;
  172. public NumberMachineMessage()
  173. {
  174. data = new List<NumberMachineNode>();
  175. aNode = new NumberMachineNode();
  176. filterMap = new Dictionary<int, Queue<NumberMachineNode>>();
  177. }
  178. public override bool Equals(System.Object obj)
  179. {
  180. if (this == obj)
  181. return true;
  182. if (obj == null || obj.GetType() != this.GetType())
  183. return false;
  184. NumberMachineMessage n = obj as NumberMachineMessage;
  185. return (data.Equals(n.data));
  186. }
  187. public override int GetHashCode()
  188. {
  189. int hash = 7;
  190. return 31 * hash + data.GetHashCode();
  191. }
  192. }
  193. //********************************************** laser ************************************************
  194. /// <summary>
  195. /// 激光消息类
  196. /// </summary>
  197. public class LaserMessage : AbstractMessage, ICloneable
  198. {
  199. public int id { get; set; }
  200. public int status { get; set; }
  201. public bool recorded { get; set; }
  202. public bool abort_rescan { get; set; }
  203. public bool occupied { get; set; }
  204. public bool disconnected { get; set; }
  205. public string licenseNum { get; set; }
  206. public Data data;
  207. public LaserMessage()
  208. {
  209. data = new Data();
  210. licenseNum = "";
  211. }
  212. public LaserMessage(int id, int status)
  213. {
  214. this.id = id;
  215. this.status = status;
  216. abort_rescan = false;
  217. disconnected = false;
  218. data = new Data();
  219. }
  220. public object Clone()
  221. {
  222. LaserMessage lm = new LaserMessage();
  223. lm.id = id;
  224. lm.status = status;
  225. lm.data = (Data)data.Clone();
  226. lm.recorded = recorded;
  227. lm.abort_rescan = abort_rescan;
  228. lm.licenseNum = licenseNum;
  229. lm.disconnected = disconnected;
  230. return lm;
  231. }
  232. public override string ToString()
  233. {
  234. return "[id:" + id + ",状态:" + status + ",占用:" + occupied + ",记录:" + recorded + "]";
  235. }
  236. }
  237. /// <summary>
  238. /// 激光数据类
  239. /// </summary>
  240. public class Data : ICloneable
  241. {
  242. public int centerX { get; set; }
  243. public int centerY { get; set; }
  244. public int angleA { get; set; }
  245. public int length { get; set; }
  246. public int width { get; set; }
  247. public int height { get; set; }
  248. public Data() : this(0, 0, 0, 0, 0, 0) { }
  249. public Data(int cx, int cy, int aa, int l, int w, int h)
  250. {
  251. centerX = cx;
  252. centerY = cy;
  253. angleA = aa;
  254. length = l;
  255. width = w;
  256. height = h;
  257. }
  258. public object Clone()
  259. {
  260. Data d = new Data(centerX, centerY, angleA, length, width, height);
  261. return d;
  262. }
  263. }
  264. //********************************************** command **********************************************
  265. /// <summary>
  266. /// 命令类,由队列线程处理号牌与指令后产生
  267. /// </summary>
  268. public class Command : AbstractMessage, ICloneable
  269. {
  270. public char commandType { get; set; }
  271. public string LicenseNum { get; set; }
  272. public string userID { get; set; }
  273. public int garageID { get; set; }
  274. public int parkingRecordsID { get; set; }
  275. public string TimeRecord { get; set; }
  276. public string ip { get; set; }//新添加,用于定位号牌机
  277. public int returnedCount { get; set; }//标记被返回的命令
  278. public int id { get; set; }
  279. public bool manual { get; set; }//判断是否手动停取
  280. public Command()
  281. {
  282. LicenseNum = "";
  283. TimeRecord = "";
  284. userID = "";
  285. garageID = 0;
  286. parkingRecordsID = 0;
  287. ip = "";
  288. returnedCount = 0;
  289. id = 0;
  290. manual = false;
  291. }
  292. public object Clone()
  293. {
  294. Command cmdClone = new Command();
  295. cmdClone.commandType = commandType;
  296. cmdClone.LicenseNum = LicenseNum;
  297. cmdClone.userID = userID;
  298. cmdClone.garageID = garageID;
  299. cmdClone.parkingRecordsID = parkingRecordsID;
  300. cmdClone.TimeRecord = TimeRecord;
  301. cmdClone.ip = ip;
  302. cmdClone.id = id;
  303. cmdClone.returnedCount = returnedCount;
  304. cmdClone.manual = manual;
  305. return cmdClone;
  306. }
  307. }
  308. /// <summary>
  309. /// 控制信息类,核心在不同阶段发至plc
  310. /// 1: 停车startLaser--park_command_address
  311. /// 2: 停车激光的6个数据,startRobot,车位信息4个
  312. /// 3:停车完成,归零--park_completed_address
  313. /// 4:取车startRobot,车位信息4个
  314. /// 5: 取车完成,归零-fetch_completed_address
  315. /// </summary>
  316. public class ControlMessage : AbstractMessage
  317. {
  318. public int status { get; set; }
  319. public string LicenseNum { get; set; }
  320. public int posID { get; set; }//激光地址
  321. public string parkingSpaceID { get; set; }
  322. public string parkingSpaceX { get; set; }
  323. public string parkingSpaceY { get; set; }
  324. public string parkingSpaceZ { get; set; }
  325. public string centerX { get; set; }
  326. public string centerY { get; set; }
  327. public string angleA { get; set; }
  328. public string length { get; set; }
  329. public string width { get; set; }
  330. public string height { get; set; }
  331. public int fetchPosition { get; set; }//取车放置位置(临时缓冲位)
  332. public int RobotID { get; set; }//机械手编号
  333. public int frontWheelbase { get; set; }
  334. public int rearWheelbase { get; set; }
  335. }
  336. }