From 6428fad15dbe79e30a48ffc9aabe31e03a45426c Mon Sep 17 00:00:00 2001
From: patrick <patrick.xu@broconcentric.com>
Date: 星期四, 05 十二月 2019 12:50:13 +0800
Subject: [PATCH] 1. 添加部分log信息 2. 修改部分机器人动作流程 3. 开放OperationConfig的InputData参数

---
 src/Bro.Device.SeerAGV/SeerAGVDriver.cs |   68 +++++++++++++++++++++++++++------
 1 files changed, 55 insertions(+), 13 deletions(-)

diff --git a/src/Bro.Device.SeerAGV/SeerAGVDriver.cs b/src/Bro.Device.SeerAGV/SeerAGVDriver.cs
index c5247c7..b875bda 100644
--- a/src/Bro.Device.SeerAGV/SeerAGVDriver.cs
+++ b/src/Bro.Device.SeerAGV/SeerAGVDriver.cs
@@ -19,6 +19,7 @@
     {
         public Action<SeerAGVDriver, string> OnAGVPositoinChanged;
         public Action<SeerAGVDriver, AGVTaskStatus> OnAGVTaskStatusChanged;
+        public Action<SeerAGVDriver, float, float> OnAGVBatteryLvlChanged;
 
         SeerAGVInitialConfig IConfig
         {
@@ -36,13 +37,13 @@
 
         protected override void Init()
         {
-            InitialTcpClient(client_State, IConfig.StatusPort);
-            InitialTcpClient(client_Guide, IConfig.GuidePort);
+            InitialTcpClient(ref client_State, IConfig.StatusPort);
+            InitialTcpClient(ref client_Guide, IConfig.GuidePort);
         }
 
-        private void InitialTcpClient(TcpClient client, int port)
+        private void InitialTcpClient(ref TcpClient client, int port)
         {
-            if (client == null || !client_State.Connected)
+            if (client == null || !client.Connected)
             {
                 client = new TcpClient();
                 client.SendBufferSize = client.ReceiveBufferSize = 0;
@@ -64,6 +65,7 @@
         {
             msg_Position = new SeerMessage((int)AGVCode.QueryPosition, SID);
             msg_GuideStatus = new SeerMessage((int)AGVCode.QueryTaskStatus, SID, IConfig.IsSimpleMonitor ? JsonConvert.SerializeObject(new { simple = true }) : "");
+            msg_Battery = new SeerMessage((int)AGVCode.QueryBattery, SID, IConfig.IsSimpleMonitor ? JsonConvert.SerializeObject(new { simple = true }) : "");
 
             Task.Run(() =>
             {
@@ -73,7 +75,18 @@
 
         protected override void Stop()
         {
-            throw new NotImplementedException();
+            if (client_Guide != null && client_Guide.Connected)
+            {
+                CancelTask();
+                client_Guide.Close();
+                client_Guide = null;
+            }
+
+            if (client_State != null && client_State.Connected)
+            {
+                client_State.Close();
+                client_State = null;
+            }
         }
         #endregion
 
@@ -131,16 +144,41 @@
             }
         }
 
+        float batteryLvl = 0;
+        public float BatteryLvl
+        {
+            get => batteryLvl;
+            set
+            {
+                if (batteryLvl != value)
+                {
+                    float pre = batteryLvl;
+                    batteryLvl = value;
+                    OnAGVBatteryLvlChanged?.Invoke(this, pre, batteryLvl);
+                }
+            }
+        }
+
         SeerMessage msg_Position = new SeerMessage();
         SeerMessage msg_GuideStatus = new SeerMessage();
+        SeerMessage msg_Battery = new SeerMessage();
         private void MonitorAGV()
         {
             while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept)
             {
-                SendMsg(client_State, IConfig.StatusPort, msg_Position);
-                Thread.Sleep(IConfig.ScanInterval);
-                SendMsg(client_State, IConfig.StatusPort, msg_GuideStatus);
-                Thread.Sleep(IConfig.ScanInterval);
+                try
+                {
+                    SendMsg(client_State, IConfig.StatusPort, msg_Position);
+                    Thread.Sleep(IConfig.ScanInterval);
+                    SendMsg(client_State, IConfig.StatusPort, msg_GuideStatus);
+                    Thread.Sleep(IConfig.ScanInterval);
+                    SendMsg(client_State, IConfig.StatusPort, msg_Battery);
+                    Thread.Sleep(IConfig.ScanInterval);
+                }
+                catch (Exception ex)
+                {
+                    OnLog?.Invoke(DateTime.Now, this, $"{Name}鐩戝惉寮傚父锛歿ex.GetExceptionMessage()}");
+                }
             }
         }
 
@@ -152,7 +190,7 @@
             {
                 try
                 {
-                    InitialTcpClient(client, port);
+                    InitialTcpClient(ref client, port);
 
                     var stream = client.GetStream();
                     stream.Write(msg.Frame, 0, msg.Frame.Length);
@@ -162,8 +200,7 @@
                     {
                         byte[] rec = buffer.Take(recSize).ToArray();
                         SeerMessage recMsg = SeerMessage.GetSeerMessage(rec);
-
-                        if (recMsg.TypeCode != msg.TypeCode || recMsg.SeqNum != msg.SeqNum)
+                        if (recMsg.TypeCode != (10000 + msg.TypeCode) || recMsg.SeqNum != msg.SeqNum)
                         {
                             throw new ProcessException("鍙嶉淇℃伅鍜屽彂閫佷俊鎭笉涓�鑷�", null);
                         }
@@ -206,13 +243,16 @@
         {
             await Task.Run(() =>
             {
-                switch (recMsg.TypeCode)
+                switch (recMsg.TypeCode - 10000)
                 {
                     case (int)AGVCode.QueryPosition:
                         CurrentPosition = recMsg.JValues.Value<string>("current_station");
                         break;
                     case (int)AGVCode.QueryTaskStatus:
                         TaskStatus = (AGVTaskStatus)recMsg.JValues.Value<int>("task_status");
+                        break;
+                    case (int)AGVCode.QueryBattery:
+                        BatteryLvl = recMsg.JValues.Value<float>("battery_level");
                         break;
                     default:
                         break;
@@ -236,6 +276,8 @@
         {
             CurrentPosition = "";
             SeerMessage msg = new SeerMessage((int)AGVCode.TaskOrder, SID, JsonConvert.SerializeObject(new { id = dest }));
+
+            OnLog?.BeginInvoke(DateTime.Now, this, $"{Name}琛岄┒鍚� {dest}", null, null);
             SendMsg(client_Guide, IConfig.GuidePort, msg);
         }
     }

--
Gitblit v1.8.0