FrmMain.cs 13.3 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AGVControl
{
    public partial class FrmMain : Form
    {
        private bool change;
        private bool exit = false;
        private NotifyIcon notify;
        private ContextMenuStrip notifyMenu;

        public FrmMain()
        {
            InitializeComponent();
        }

        private void ShowConfig()
        {
            int n;

            for (int i = 0; i < Common.agvInfo.Count; i++)
            {
                n = DgvAgv.Rows.Add(Common.agvInfo[i].ToRow());
                dgvMission.Rows.Add(Common.agvInfo[i].ToMission());
                DgvAgv.Rows[n].HeaderCell.Value = (n + 1).ToString();
                if (!Common.agvInfo[i].IsCon)
                    DgvAgv.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
            }

            for (int i = 0; i < Common.nodeInfo.Count; i++)
            {
                n = DgvNode.Rows.Add(Common.nodeInfo[i].ToRow());
                DgvNode.Rows[n].HeaderCell.Value = (n + 1).ToString();
                if (!Common.nodeInfo[i].Online)
                    DgvNode.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
            }

            LstAgvPlace.Items.Clear();
            foreach (var item in Common.agvMission.Keys.ToArray())
            {
                if (item.Length.Equals(6))
                    continue;
                LstAgvPlace.Items.Add(item);
            }

            LstAgvPlace.SelectedIndex = 0;
        }

        private void Server_NodeChanged(int nodeIndex)
        {
            Invoke(new Action(() => 
            {              
                DgvNode.Rows[nodeIndex].SetValues(Common.nodeInfo[nodeIndex].ToRow()); 
            }));
        }

        private void Server_NodeOnline(int nodeIndex)
        {
            Invoke(new Action(() => { DgvNode.Rows[nodeIndex].DefaultCellStyle.ForeColor = Common.nodeInfo[nodeIndex].Online ? Color.Black : Color.Red; }));
        }

        private void Control_AgvChanged(int agvIndex)
        {
            Invoke(new Action(() => 
            { 
                DgvAgv.Rows[agvIndex].SetValues(Common.agvInfo[agvIndex].ToRow());
                dgvMission.Rows[agvIndex].SetValues(Common.agvInfo[agvIndex].ToMission());
            }));
        }

        private void Control_AgvOnline(int agvIndex)
        {
            Invoke(new Action(() => { DgvAgv.Rows[agvIndex].DefaultCellStyle.ForeColor = Common.agvInfo[agvIndex].IsCon ? Color.Black : Color.Red; }));
        }

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

        private void ItemExit_Click(object sender, EventArgs e)
        {
            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();
            ChkAutoRun.Checked = BLL.Shortcut.Exists();
            Common.log.ShowText = TxtLog;

            change = true;
            ChkAutoCharge.Checked = Common.chargeStatus.AutoCharge;
            change = false;

            Common.control.AgvChanged += Control_AgvChanged;
            Common.control.AgvOnline += Control_AgvOnline;
            Common.server.NodeChanged += Server_NodeChanged;
            Common.server.NodeOnline += Server_NodeOnline;
        }

        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!exit)
            {
                e.Cancel = true;
                Hide();
            }
        }

        private void DgvAgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1) return;
            if (e.ColumnIndex == 8)
            {
                Common.agvInfo[e.RowIndex].IsUse = !Common.agvInfo[e.RowIndex].IsUse;
                DgvAgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = Common.agvInfo[e.RowIndex].IsUse.ToString();
                Common.appConfig.AppSettings.Settings[Common.agvInfo[e.RowIndex].Name].Value = Common.agvInfo[e.RowIndex].IsUse.ToString();
                Common.appConfig.Save();
            }
            else if (e.ColumnIndex == 9)
            {
                //清除小车缓存
                Common.log.OutInfo(string.Format("手动清除缓存,{0} {1}", Common.agvInfo[e.RowIndex].Name, Common.agvInfo[e.RowIndex].Place));
                string place = Common.agvInfo[e.RowIndex].Place;
                Common.agvInfo[e.RowIndex].Mark = "";
                Common.agvInfo[e.RowIndex].Place = "";
                Common.agvInfo[e.RowIndex].RFID = "";
                Common.agvInfo[e.RowIndex].NextMission = "";
                Common.agvInfo[e.RowIndex].IsClearRunInfo = true;
                DgvAgv.Rows[e.RowIndex].SetValues(Common.agvInfo[e.RowIndex].ToRow());

                //清除节点缓存
                int idx = Common.nodeInfo.FindIndex(s => s.Name == place);
                if (idx > -1)
                {
                    Common.nodeInfo[idx].AgvName = "";
                    DgvNode.Rows[idx].Cells[5].Value = "";
                }

                //添加Init任务
                Common.mir.Add_Mission_Fleet(Common.agvInfo[e.RowIndex], Common.agvMission["Init"]);
                Common.mir.State_Ready(Common.agvInfo[e.RowIndex]);
            }
        }

        private void DgvNode_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1) return;
            if (e.ColumnIndex == 7)
            {
                Common.nodeInfo[e.RowIndex].IsUse = !Common.nodeInfo[e.RowIndex].IsUse;
                DgvNode.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = Common.nodeInfo[e.RowIndex].IsUse.ToString();
                Common.appConfig.AppSettings.Settings[Common.nodeInfo[e.RowIndex].Name].Value = Common.nodeInfo[e.RowIndex].IsUse.ToString();
                Common.appConfig.Save();
            }
            else if (e.ColumnIndex == 8)
            {
                //清除节点缓存
                Common.log.OutInfo(string.Format("手动清除缓存,{0} {1}", Common.nodeInfo[e.RowIndex].AgvName, Common.nodeInfo[e.RowIndex].Name));
                string name = Common.nodeInfo[e.RowIndex].AgvName;
                Common.nodeInfo[e.RowIndex].AgvName = "";
                DgvNode.Rows[e.RowIndex].Cells[5].Value = "";

                //清除小车缓存
                int idx = Common.agvInfo.FindIndex(s => s.Name == name);
                if (idx > -1)
                {
                    Common.agvInfo[idx].Mark = "";
                    Common.agvInfo[idx].Place = "";
                    Common.agvInfo[idx].RFID = "";
                    Common.agvInfo[idx].NextMission = "";
                    DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());
                    //添加Init任务
                    Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission["Init"]);
                    Common.mir.State_Ready(Common.agvInfo[idx]);
                }               

            }
        }

        private void BtnMissionAdd_Click(object sender, EventArgs e)
        {
            try
            {
                if (DgvAgv.SelectedCells.Count == 0) return;
                int idx = DgvAgv.SelectedCells[0].RowIndex;
                if (idx < 0) return;
                if (Common.agvInfo[idx].IsCon)
                {
                    if(!Common.agvInfo[idx].IsClearRunInfo)
                    {
                        MessageBox.Show("请先清除当前小车的任务缓存!");
                        return;
                    }
                    bool rtn = Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission[LstAgvPlace.Text]);
                    if (!rtn)
                        return;
                    Common.agvInfo[idx].Place = "";
                    Common.agvInfo[idx].IsClearRunInfo = false;
                    //if (LstAgvPlace.Text.StartsWith("Move") && LstAgvPlace.Text.Length ==6)
                    //{
                    //    Common.agvInfo[idx].Place = LstAgvPlace.Text.Substring(4);
                    //}

                }
            }
            catch(Exception ex){ Common.log.OutInfo("手动添加任务失败:  " + ex.Message + ex.StackTrace); };

        }

        private void BtnClearError_Click(object sender, EventArgs e)
        {
            if (DgvAgv.SelectedCells.Count == 0) return;
            int idx = DgvAgv.SelectedCells[0].RowIndex;
            if (idx < 0) return;
            if (Common.agvInfo[idx].IsCon)
                Common.mir.Clear_Error(Common.agvInfo[idx]);
        }

        private void BtnMissionReady_Click(object sender, EventArgs e)
        {
            if (DgvAgv.SelectedCells.Count == 0) return;
            int idx = DgvAgv.SelectedCells[0].RowIndex;
            if (idx < 0) return;
            if (Common.agvInfo[idx].IsCon)
                Common.mir.State_Ready(Common.agvInfo[idx]);
        }

        private void BtnMissionPause_Click(object sender, EventArgs e)
        {
            if (DgvAgv.SelectedCells.Count == 0) return;
            int idx = DgvAgv.SelectedCells[0].RowIndex;
            if (idx < 0) return;
            if (Common.agvInfo[idx].IsCon)
                Common.mir.State_Pause(Common.agvInfo[idx]);
        }

        private void BtnMarkClear_Click(object sender, EventArgs e)
        {
            Common.control.MarkClear();
            TxtMark.Text = "";
        }

        private void BtnMarkRead_Click(object sender, EventArgs e)
        {
            TxtMark.Text = Common.control.MarkRead();
        }

        private void BtnMarkWrite_Click(object sender, EventArgs e)
        {
            Common.control.MarkWrite(TxtMark.Text);
        }

        private void ChkAutoRun_CheckedChanged(object sender, EventArgs e)
        {
            if (ChkAutoRun.Checked)
            {
                if (!BLL.Shortcut.Exists())
                    BLL.Shortcut.Create();
            }
            else
            {
                BLL.Shortcut.Delete();
            }
        }

        private void ChkAutoCharge_CheckedChanged(object sender, EventArgs e)
        {
            if (change) return;
            Common.chargeStatus.AutoCharge = ChkAutoCharge.Checked;
        }

        private void BtnReadWriteCharge_Click(object sender, EventArgs e)
        {
            string name = (sender as Control).Name;
            int num = Convert.ToInt32(name.Substring(name.Length - 1, 1));

            if (name.IndexOf("Read") > 0)
            {
                if (num == 1)
                    tabPage3.Controls["TxtCharge1"].Text = Common.chargeStatus.charge1;
                else if (num == 2)
                    tabPage3.Controls["TxtCharge2"].Text = Common.chargeStatus.charge2;
            }
            else if (name.IndexOf("Write") > 0)
            {
                if (num == 1)
                    Common.chargeStatus.charge1 = tabPage3.Controls["TxtCharge1"].Text;
                else if (num == 2)
                    Common.chargeStatus.charge2 = tabPage3.Controls["TxtCharge2"].Text;
            }
        }

        private void tabPage3_Click(object sender, EventArgs e)
        {

        }

        private void BtnArrive_Click(object sender, EventArgs e)
        {
            Agv_Info agv = Common.agvInfo[DgvAgv.SelectedCells[0].RowIndex];
            Common.server.Arrive(agv);

        }

        private void BtnReady_Click(object sender, EventArgs e)
        {
            Agv_Info agv = Common.agvInfo[DgvAgv.SelectedCells[0].RowIndex];
            Common.server.Ready(agv);
        }

        private void CloseDoor_Click(object sender, EventArgs e)
        {
            Agv_Info agv = Common.agvInfo[DgvAgv.SelectedCells[0].RowIndex];
            Common.server.CloseDoor(agv);
        }

        private void BtnAddPlace_Click(object sender, EventArgs e)
        {
            if (DgvAgv.SelectedCells.Count == 0) return;
            int idx = DgvAgv.SelectedCells[0].RowIndex;
            if (idx < 0) return;
            if (Common.agvInfo[idx].IsCon)
            {
                Common.agvInfo[idx].Place = TxtPlace.Text;
                DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());

            }
        }

        private void BtnOpenExcel_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start(".\\AGV点位分布.xlsx");
        }
    }
}