FrmMain.cs 16.6 KB
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Common;
using DeviceLibrary;
using static DeviceLibrary.HttpManager;

namespace AGVControl
{
    public partial class FrmMain : Form
    {
        private bool exit = false;
        private NotifyIcon notify;
        private ContextMenuStrip notifyMenu;
        private System.Timers.Timer showTimer;
        //private string[] agvRunStep;
        public FrmMain()
        {
            InitializeComponent();
            showTimer = new System.Timers.Timer();
            showTimer.Interval = 5000;
            showTimer.Enabled = true;
            showTimer.AutoReset = true;
            showTimer.Elapsed += ShowTimer_Elapsed;
            showTimer.Start();
            LogUtil.logBox = richTextBox1;
        }

        private void ShowConfig()
        {
            int n;
            //agvRunStep = new string[Common.agvInfo.Count];
            for (int i = 0; i < AGVManager.agvInfo.Count; i++)
            {
                //MiR_API.Get_IO_Status(AGVManager.agvInfo[i], out bool[] input, out bool[] output);
                //if (input != null && input.Length == 4)
                //    AGVManager.agvInfo[i].IsExistShelf = input[3];
                flowLayoutPanel1.Controls.Add(AGVManager.agvInfo[i].StateKanban);
                AddForm(AGVManager.agvInfo[i].Name, new Manual(AGVManager.agvInfo[i]));
                AGVManager.agvInfo[i].StateKanban.Init();
            }

            for (int i = 0; i < AGVManager.nodeInfo.Count; i++)
            {
                if (AGVManager.nodeInfo[i].IP.Trim().Equals(""))
                    continue;
                n = DgvNode.Rows.Add(AGVManager.nodeInfo[i].ToRow());
                DgvNode.Rows[n].HeaderCell.Value = (n + 1).ToString();
                if (i % 2 == 0)
                    DgvNode.Rows[n].DefaultCellStyle.BackColor = Color.LightBlue;
                if (!AGVManager.nodeInfo[i].Online)
                    DgvNode.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
            }
        }

        private void Server_NodeChanged(int nodeIndex)
        {
            Invoke(new Action(() =>
            {
                //for (int i = 0; i < AGVManager.nodeInfo.Count; i++)
                {
                    DgvNode.Rows[nodeIndex].DefaultCellStyle.ForeColor = AGVManager.nodeInfo[nodeIndex].Online && AGVManager.nodeInfo[nodeIndex].IsUse ? Color.Black : Color.Red;
                    DgvNode.Rows[nodeIndex].SetValues(AGVManager.nodeInfo[nodeIndex].ToRow());
                }

            }));
            System.GC.Collect();
        }

        private void Server_NodeOnline(int nodeIndex)
        {
            Invoke(new Action(() =>
            {
                // for (int i = 0; i < AGVManager.nodeInfo.Count; i++)
                {
                    DgvNode.Rows[nodeIndex].DefaultCellStyle.ForeColor = AGVManager.nodeInfo[nodeIndex].Online && AGVManager.nodeInfo[nodeIndex].IsUse ? Color.Black : Color.Red;
                    DgvNode.Rows[nodeIndex].SetValues(AGVManager.nodeInfo[nodeIndex].ToRow());
                }
            }));
            System.GC.Collect();
        }

        private void ItemShow_Click(object sender, EventArgs e)
        {
            Show();
            if (WindowState == FormWindowState.Minimized)
                WindowState = FormWindowState.Normal;
        }

        private void ItemExit_Click(object sender, EventArgs e)
        {
            foreach (var item in AGVManager.agvInfo)
            {
                AGVManager.WriteIni(item.Name, SettingString.RFID, item.RFID);
            }
            notify.Dispose();
            exit = true;
            Close();
        }

        private void Notify_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Show();
            if (WindowState == FormWindowState.Minimized)
                WindowState = FormWindowState.Normal;
        }
        private void FrmMain_Load(object sender, EventArgs e)
        {
            //托盘菜单
            notifyMenu = new ContextMenuStrip();
            ToolStripMenuItem itemShow = new ToolStripMenuItem("显示(&S)");
            itemShow.Click += ItemShow_Click;
            ToolStripMenuItem itemExit = new ToolStripMenuItem("退出(&X)");
            itemExit.Click += ItemExit_Click;
            notifyMenu.Items.Add(itemShow);
            notifyMenu.Items.Add(itemExit);

            //托盘控件
            notify = new NotifyIcon { Icon = Icon, Visible = true, ContextMenuStrip = notifyMenu, Text = Text };
            notify.MouseDoubleClick += Notify_MouseDoubleClick;

            ShowConfig();
            AGVManager.server.NodeChanged += Server_NodeChanged;
            AGVManager.control.NodeChangedEvent += Server_NodeChanged;
            AGVManager.server.NodeOnline += Server_NodeOnline;
        }

        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!exit)
            {
                e.Cancel = true;
                Hide();
            }
            foreach (var item in AGVManager.agvInfo)
            {
                AGVManager.WriteIni(item.Name, SettingString.RFID, item.RFID);
            }
            LogUtil.logBox = null;
            //showTimer.Enabled = false;
            showTimer.Stop();
            AGVManager.server.NodeChanged -= Server_NodeChanged;
            AGVManager.server.NodeOnline -= Server_NodeOnline;
        }

        private void DgvNode_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1) return;

            if (e.ColumnIndex == 6)  //调用
            {
                AGVManager.nodeInfo[e.RowIndex].IsUse = !AGVManager.nodeInfo[e.RowIndex].IsUse;
                DgvNode.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = AGVManager.nodeInfo[e.RowIndex].IsUse.ToString();
                AGVManager.WriteIni(AGVManager.nodeInfo[e.RowIndex].Name, SettingString.IsUse, AGVManager.nodeInfo[e.RowIndex].IsUse.ToString());
                DgvNode.Rows[e.RowIndex].SetValues(AGVManager.nodeInfo[e.RowIndex].ToRow());
            }
        }





        bool InShhow = false;
        Dictionary<string, string> destInfoMap = new Dictionary<string, string>();
        private void ShowTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //ShowEmptyTask();
            if (InShhow)
                return;
            InShhow = true;
            BoxDestInfo destInfo;
            ClientNode node;
            string line = "";
            Invoke(new Action(() =>
            {
                try
                {
                    node = AGVManager.nodeInfo.Find(s => s.Name.Equals(SettingString.D1) && s.RFID.StartsWith(SettingString.ReelString_RFID_Prefix));
                    if (node != null)
                    {
                        if (!destInfoMap.ContainsKey(SettingString.D1))
                        {
                            FindFullShelfTarget(node.RFID, out destInfo);
                            if (destInfo != null)
                            {
                                lblD1.Text = destInfo.ToString();
                                destInfoMap.Add(SettingString.D1, node.RFID);
                                if (!destInfo.data.ToLower().Equals("none") && !AGVManager.GetLineNameByNodeName(destInfo.data, out line))
                                {
                                    lblD1Warn.Text = string.Format("{0}的料架[{1}]目的地不存在:{2}\r\n", node.LineName, node.RFID, destInfo.data);
                                }

                            }
                            else
                            {
                                lblD1Warn.Text = string.Format("{0}的料架[{1}]请求服务端无反馈\r\n", node.LineName, node.RFID);
                            }
                        }
                        else if (!destInfoMap[SettingString.D1].Equals(node.RFID))
                        {
                            FindFullShelfTarget(node.RFID, out destInfo);
                            if (destInfo != null)
                            {
                                lblD1.Text = destInfo.ToString();
                                destInfoMap[SettingString.D1] = node.RFID;
                                if (!destInfo.data.ToLower().Equals("none") && !AGVManager.GetLineNameByNodeName(destInfo.data, out line))
                                {
                                    lblD1Warn.Text = string.Format("{0}的料架[{1}]目的地不存在:{2}\r\n", node.LineName, destInfo.data);
                                }
                                else
                                {
                                    lblD1Warn.Text = string.Format("{0}的料架[{1}]请求服务端无反馈\r\n", node.LineName, node.RFID);
                                }
                            }

                        }
                    }
                    else
                    {
                        lblD1.Text = "";
                        lblD1Warn.Text = "";
                        if (destInfoMap.ContainsKey(SettingString.D1))
                            destInfoMap.Remove(SettingString.D1);
                    }

                    node = AGVManager.nodeInfo.Find(s => s.Name.Equals(SettingString.D2) && s.RFID.StartsWith(SettingString.ReelString_RFID_Prefix));
                    if (node != null)
                    {
                        if (!destInfoMap.ContainsKey(SettingString.D2))
                        {
                            FindFullShelfTarget(node.RFID, out destInfo);
                            if (destInfo != null)
                            {
                                lblD2.Text = destInfo.ToString();
                                destInfoMap.Add(SettingString.D2, node.RFID);
                                if (!destInfo.data.ToLower().Equals("none") && !AGVManager.GetLineNameByNodeName(destInfo.data, out line))
                                {
                                    lblD2Warn.Text = string.Format("{0}的料架[{1}]目的地不存在:{2}\r\n", node.LineName, node.RFID, destInfo.data);
                                }
                            }
                            else
                            {
                                lblD2Warn.Text = string.Format("{0}的料架[{1}]请求服务端无反馈\r\n", node.LineName, node.RFID);
                            }
                        }
                        else if (!destInfoMap[SettingString.D2].Equals(node.RFID))
                        {
                            FindFullShelfTarget(node.RFID, out destInfo);
                            if (destInfo != null)
                            {
                                lblD2.Text = destInfo.ToString();
                                destInfoMap[SettingString.D2] = node.RFID;
                                if (!destInfo.data.ToLower().Equals("none") && !AGVManager.GetLineNameByNodeName(destInfo.data, out line))
                                {
                                    lblD2Warn.Text = string.Format("{0}的料架[{1}]目的地不存在:{2}\r\n", node.LineName, node.RFID, destInfo.data);
                                }
                            }
                            else
                                lblD2Warn.Text = string.Format("{0}的料架[{1}]请求服务端无反馈\r\n", node.LineName, node.RFID);
                        }
                    }
                    else
                    {
                        lblD2.Text = "";
                        lblD2Warn.Text = "";
                        if (destInfoMap.ContainsKey(SettingString.D2))
                            destInfoMap.Remove(SettingString.D2);
                    }

                    node = AGVManager.nodeInfo.Find(s => s.Name.Equals(SettingString.D3) && s.RFID.StartsWith(SettingString.ReelString_RFID_Prefix));
                    if (node != null)
                    {
                        if (!destInfoMap.ContainsKey(SettingString.D3))
                        {
                            FindFullShelfTarget(node.RFID, out destInfo);
                            if (destInfo != null)
                            {
                                lblD3.Text = destInfo.ToString();
                                destInfoMap.Add(SettingString.D3, node.RFID);
                                if (!destInfo.data.ToLower().Equals("none") && !AGVManager.GetLineNameByNodeName(destInfo.data, out line))
                                {
                                    lblD3Warn.Text = string.Format("{0}的料架[{1}]目的地不存在:{2}\r\n", node.LineName, node.RFID, destInfo.data);
                                }
                            }
                            else
                                lblD3Warn.Text = string.Format("{0}的料架[{1}]请求服务端无反馈\r\n", node.LineName, node.RFID);
                        }
                        else if (!destInfoMap[SettingString.D3].Equals(node.RFID))
                        {
                            FindFullShelfTarget(node.RFID, out destInfo);
                            if (destInfo != null)
                            {
                                lblD3.Text = destInfo.ToString();
                                destInfoMap[SettingString.D3] = node.RFID;
                                if (!destInfo.data.ToLower().Equals("none") && !AGVManager.GetLineNameByNodeName(destInfo.data, out line))
                                {
                                    lblD3Warn.Text = string.Format("{0}的料架[{1}]目的地不存在:{2}\r\n", node.LineName, node.RFID, destInfo.data);
                                }
                            }
                            else
                                lblD3Warn.Text = string.Format("{0}的料架[{1}]请求服务端无反馈\r\n", node.LineName, node.RFID);
                        }
                    }
                    else
                    {
                        lblD3.Text = "";
                        lblD3Warn.Text = "";
                        if (destInfoMap.ContainsKey(SettingString.D3))
                            destInfoMap.Remove(SettingString.D3);
                    }
                }catch(Exception ex)
                {
                    LogUtil.error("ShowTimer_Elapsed", ex);
                }


                Application.DoEvents();
            }));

            InShhow = false;
        }

        private void AddForm(string text, Form form)
        {
            text = text.PadLeft(10, ' ');
            TabPage lineTabPage = new TabPage(text);
            // lineTabPage.AutoScroll = true;
            // lineTabPage.Tag = lineBean;
            Panel linePan = new Panel();
            linePan.Dock = DockStyle.Fill;
            linePan.AutoScroll = true;
            lineTabPage.Controls.Add(linePan);
            form.FormBorderStyle = FormBorderStyle.None;
            form.TopLevel = false;
            linePan.Controls.Add(form);
            //form.Dock = DockStyle.Fill;
            //linePan.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left)));
            //form.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left)));
            form.Show();
            // tabPageList.Add(lineTabPage);
            tabControlManual.Controls.Add(lineTabPage);
        }

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tabControl1.SelectedIndex == 1)
            {
                LogUtil.logBox = this.richTextBox1;
            }
        }

        private void btnAgvRemoveRfid_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtBoxRFID.Text.Equals(""))
                    return;
                Task.Factory.StartNew(() =>
                {
                    bool rtn = HttpManager.AgvRemoveRfid(txtBoxRFID.Text.ToUpper());
                    this.Invoke(new Action(() =>
                    {
                        label1.BackColor = rtn ? Color.Green : Color.Red;
                        label1.Text = rtn ? "清理料架的缓存信息成功:" + txtBoxRFID.Text.ToUpper() : "清理料架的缓存信息失败:" + txtBoxRFID.Text.ToUpper();
                    }));
                    LogUtil.info(string.Format("手动清理料架的缓存信息成功[{0}]", txtBoxRFID.Text.ToUpper()));
                    txtBoxRFID.Text = "";
                });
            }
            catch (Exception ex)
            {

            }
        }
    }
}