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<byte> list = new List<byte>();
|
|
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<JObject>(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,
|
}
|
}
|