patrick
2019-12-10 1c4426810c71eead57084be8a18ade8d314dd8c4
src/Bro.Device.SeerAGV/SeerAGVConfig.cs
@@ -1,21 +1,17 @@
using Bro.Common.Base;
using Bro.Common.Helper;
using Bro.Common.Model.Helper;
using Bro.Common.Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
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
    public class SeerAGVInitialConfig : InitialMonitorConfigBase
    {
        [Category("通信配置")]
        [Description("AGVIP地址")]
@@ -29,22 +25,92 @@
        [Description("导航端口")]
        public int GuidePort { get; set; } = 19206;
        [Category("监听配置")]
        [Description("监听间隔,单位ms")]
        public int ScanInterval { get; set; } = 200;
        //[Category("监听配置")]
        //[Description("监听间隔,单位ms")]
        //public int ScanInterval { get; set; } = 500;
        ////[Category("监听配置")]
        ////[Description("监听的IO信息配置集合")]
        ////[TypeConverter(typeof(CollectionCountConvert))]
        ////[Editor(typeof(ComplexCollectionEditor<IODefinition>), typeof(UITypeEditor))]
        ////public List<IODefinition> IOCollection { get; set; } = new List<IODefinition>();
        //[Category("监听设置")]
        //[Description("监听操作配置集合")]
        //[TypeConverter(typeof(CollectionCountConvert))]
        //[Editor(typeof(ComplexCollectionEditor<MonitorSet>), typeof(UITypeEditor))]
        //public List<MonitorSet> MonitorSetCollection { get; set; } = new List<MonitorSet>();
        [Category("监听配置")]
        [Description("是否采用简单监听模式。true:简单模式,只获取任务状态;false:全部模式,获取任务所有信息")]
        public bool IsSimpleMonitor { get; set; } = true;
        private float batteryLvlToCharge = 0.1f;
        [Category("充电配置")]
        [Description("充电电池容量,电池容量低于该值时需要充电")]
        public float BatteryLvlToCharge
        {
            get => batteryLvlToCharge;
            set
            {
                if (value >= 1 || value <= 0)
                {
                    value = 0.1f;
                }
                batteryLvlToCharge = value;
            }
        }
        private float batteryLvlToCharge_Recommand = 0.3f;
        [Category("充电配置")]
        [Description("充电电池容量,电池容量低于该值时,设备空闲时建议充电")]
        public float BatteryLvlToCharge_Recommand
        {
            get => batteryLvlToCharge_Recommand;
            set
            {
                if (value >= 1 || value <= 0)
                {
                    value = 0.3f;
                }
                batteryLvlToCharge_Recommand = value;
            }
        }
        private float batteryLvlChargeDone = 0.9f;
        [Category("充电配置")]
        [Description("充电完成电池容量,电池容量高于该值时确认充电完成")]
        public float BatteryLvlChargeDone
        {
            get => batteryLvlChargeDone;
            set
            {
                if (value >= 1 || value <= 0)
                {
                    value = 0.9f;
                }
                batteryLvlChargeDone = value;
            }
        }
        [Category("动作设置")]
        [Description("动作超时设置,单位min")]
        public float OperationTimeout { get; set; } = 5;
    }
    [Device("SeerAGV", "SeerAGV", EnumHelper.DeviceAttributeType.OperationConfig)]
    public class SeerAGVOperationConfig : OperationConfigBase
    {
        [Category("导航配置")]
        [Description("AGV行驶目的地")]
        public string Location { get; set; }
        [Category("导航配置")]
        [Description("是否等待完成信号")]
        public bool IsWaitFinished { get; set; } = true;
    }
    public class SeerMessage
    public class SeerMessage : IComplexDisplay
    {
        private byte[] frame = null;
        public byte[] Frame
@@ -62,7 +128,7 @@
        }
        public int SyncHead { get; set; } = 0x5A;
        public int Version { get; set; }
        public int Version { get; set; } = 0x01;
        public int SeqNum { get; set; }
        public int DataLength { get; set; }
        public int TypeCode { get; set; }
@@ -111,13 +177,18 @@
            if (data.Length < 16 + msg.DataLength)
            {
                throw new ProcessException("数据长度错误", null);
                throw new ProcessException("数据长度错误");
            }
            msg.JsonData = data.Skip(16).Take(msg.DataLength).ToArray();
            msg.JValues = JsonConvert.DeserializeObject<JObject>(System.Text.Encoding.ASCII.GetString(msg.JsonData));
            return msg;
        }
        public string GetDisplayText()
        {
            return "";
        }
    }
@@ -134,10 +205,13 @@
    {
        QueryPosition = 0x03EC,
        QueryTaskStatus = 0x03FC,
        QueryIO = 0x03F5,
        CancelTask = 0x0BBB,
        PauseTask = 0x0BB9,
        TaskOrder = 0x0BEB,
        QueryBattery = 0x03EF,
    }
    public enum AGVTaskStatus