using Bro.Common.Base; using Bro.Common.Helper; using Bro.Common.Model.Helper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace Bro.Device.SeerAGV { [Device("SeerAGV", "SeerAGV", EnumHelper.DeviceAttributeType.InitialConfig)] public class SeerAGVInitialConfig : InitialConfigBase { [Category("通信配置")] [Description("AGVIP地址")] public string AGVIP { get; set; } = "0.0.0.0"; [Category("通信配置")] [Description("状态端口")] public int StatusPort { get; set; } = 19204; [Category("通信配置")] [Description("导航端口")] public int GuidePort { get; set; } = 19206; [Category("监听配置")] [Description("监听间隔,单位ms")] public int ScanInterval { get; set; } = 200; [Category("监听配置")] [Description("是否采用简单监听模式。true:简单模式,只获取任务状态;false:全部模式,获取任务所有信息")] public bool IsSimpleMonitor { get; set; } = true; } [Device("SeerAGV", "SeerAGV", EnumHelper.DeviceAttributeType.OperationConfig)] public class SeerAGVOperationConfig : OperationConfigBase { } public class SeerMessage { private byte[] frame = null; public byte[] Frame { get { if (frame == null) { frame = GetFrame(); } return frame; } set => frame = value; } public int SyncHead { get; set; } = 0x5A; public int Version { get; set; } public int SeqNum { get; set; } public int DataLength { get; set; } public int TypeCode { get; set; } public byte[] JsonData { get; set; } = new byte[0]; public JObject JValues { get; set; } = null; public SeerMessage() { } public SeerMessage(int typeCode, int seqNum, string jsonData = "") { TypeCode = typeCode; SeqNum = seqNum; if (!string.IsNullOrWhiteSpace(jsonData)) { JsonData = System.Text.Encoding.ASCII.GetBytes(jsonData); } DataLength = JsonData.Length; } public byte[] GetFrame() { List list = new List(); list.Add((byte)SyncHead); list.Add((byte)Version); list.AddRange(SeqNum.IntToBytes()); list.AddRange(DataLength.IntToBytes(4)); list.AddRange(TypeCode.IntToBytes()); list.AddRange(new byte[] { 0, 0, 0, 0, 0, 0 }); list.AddRange(JsonData); return list.ToArray(); } public static SeerMessage GetSeerMessage(byte[] data) { SeerMessage msg = new SeerMessage(); msg.Frame = data; msg.SeqNum = data.Skip(2).Take(2).ToArray().BytesToInt(); msg.DataLength = data.Skip(4).Take(4).ToArray().BytesToInt(); msg.TypeCode = data.Skip(8).Take(2).ToArray().BytesToInt(); if (data.Length < 16 + msg.DataLength) { throw new ProcessException("数据长度错误", null); } msg.JsonData = data.Skip(16).Take(msg.DataLength).ToArray(); msg.JValues = JsonConvert.DeserializeObject(System.Text.Encoding.ASCII.GetString(msg.JsonData)); return msg; } } //public enum RobotPort //{ // StatusPort = 19204, // ControlPort = 19205, // GuidePort = 19206, // SettingPort = 19207, // OtherPort = 19210 //} public enum AGVCode { QueryPosition = 0x03EC, QueryTaskStatus = 0x03FC, CancelTask = 0x0BBB, TaskOrder = 0x0BEB, } public enum AGVTaskStatus { None = 0, Waiting = 1, Running = 2, Suspended = 3, Completed = 4, Failed = 5, Cancelled = 6, } }