private void HomeScreenForm_Load(object sender, EventArgs e)
        {
            DashboardForm dashboardForm = new DashboardForm();

            Initial_Form(dashboardForm);
            pnMain.Controls.Add(dashboardForm);
            dashboardForm.BringToFront();
            dashboardForm.Show();
        }
        private void dashoardToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Thread.Sleep(200);
            DashboardForm dashboardForm = new DashboardForm();

            Initial_Form(dashboardForm);
            pnMain.Controls.Add(dashboardForm);
            dashboardForm.BringToFront();
            dashboardForm.Show();
        }
        //  public static System.Windows.Forms.Timer timerToSendPath2Again;
        public static void GetDataRecieve()
        {
            int rxBufferSize = 18;

            byte[] rxBuffer    = new byte[rxBufferSize];
            int    rxByteCount = Communication.SerialPort.Read(rxBuffer, 0, rxBufferSize);

            // add to a list of bytes received
            for (int i = 0; i < rxByteCount; i++)
            {
                bytesReceived.Add(rxBuffer[i]);
            }

            int  startIndex   = 0;
            byte functionCode = new byte();

            // check header
            if (bytesReceived.Count < 3)
            {
                return;
            }
            for (int i = 0; i < bytesReceived.Count - 3; i++)
            {
                if (bytesReceived[i] == 0xAA && bytesReceived[i + 1] == 0xFF)
                {
                    startIndex   = i;
                    functionCode = bytesReceived[i + 2];

                    if (functionCode == 0xA0)
                    {
                        // waitting for receive enough frame data of this function code
                        if (bytesReceived.Count - startIndex < PIDInfoReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PIDInfoReceivePacketSize];
                        for (int j = 0; j < PIDInfoReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PIDInfoReceivePacket receiveFrame = PIDInfoReceivePacket.FromArray(data);

                        // check sum
                        //   ushort crc = 0;
                        //   for (int j = 0; j < PIDInfoReceivePacketSize - 4; j++)
                        //      crc += data[j];
                        // if (crc != receiveFrame.CheckSum) continue;

                        bytesReceived.RemoveRange(0, startIndex + PIDInfoReceivePacketSize - 1);

                        // update AGV info to lists of AGVs (real-time mode)
                        // if (receiveFrame.Header[0] == 0xAA && receiveFrame.Header[1] == 0xFF && receiveFrame.EndOfFrame[0] == 0x0D && receiveFrame.EndOfFrame[1] == 0x0A)

                        speed = receiveFrame.Velocity;
                        //dk_Speed = receiveFrame.UdkVelocity;
                        line = receiveFrame.LinePos;
                        var agv = AGV.ListAGV.Find(a => a.ID == receiveFrame.AGVID);
                        if (agv == null)
                        {
                            continue;
                        }
                        //udk_LinePos = receiveFrame.UdkLinePos;
                        //if(receiveFrame.CurrentNode >=0 || receiveFrame.CurrentNode <= 56)
                        agv.CurrentNode           = receiveFrame.CurrentNode;
                        agv.CurrentOrient         = receiveFrame.currentOrient;
                        agv.Velocity              = receiveFrame.Velocity;
                        agv.DistanceToCurrentNode = receiveFrame.distanceToPreNode;
                        //Display.UpdateComStatus("receive", agv.ID, "Receive AGV Information", Color.Green);
                    }
                    if (functionCode == 0xE0)      //Xac nhan chay xong Path1
                    {
                        // waitting for receive enough frame data of this function code
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);

                        Debug.Write("PathRun_Completed");
                        AGV agv = AGV.ListAGV[0];
                        agv.PathCopmpleted = 1;
                        Debug.WriteLine("PathComplete = 1");
                        FlagPath1Complete++;
                        if (FlagPath1Complete == 1)
                        {
                            Display.UpdateComStatus("receive", agv.ID, " AGV Complete Path 1", Color.Green);
                        }
                    }
                    if (functionCode == 0xE1)      //Xac nhan chay xong Path2
                    {
                        // waitting for receive enough frame data of this function code
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);

                        Debug.Write("PathRun_Completed");
                        AGV agv = AGV.ListAGV[0];
                        agv.PathCopmpleted = 3;
                        Debug.WriteLine("PathComplete = 3");
                        FlagPath2Complete++;
                        if (FlagPath2Complete == 1)
                        {
                            Display.UpdateComStatus("receive", agv.ID, " AGV Complete Path 2", Color.Green);
                        }
                    }
                    if (functionCode == 0xC1)        // ACK Speed
                    {
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);

                        if (DashboardForm.timerToSendSpeedAgain.Enabled == true)
                        {
                            DashboardForm.timerToSendSpeedAgain.Stop();
                        }
                        Display.UpdateComStatus("receive", receiveFrame.AGVID, " ACK Speed", Color.Green);
                    }

                    else if (functionCode == 0xD0)       //NAK Speed
                    {
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);
                        Display.UpdateComStatus("receive", receiveFrame.AGVID, " NAK Speed", Color.Red);
                        //   if (DashboardForm.timerToSendSpeedAgain.Enabled == true)
                        //     DashboardForm.timerToSendSpeedAgain.Stop();
                        DashboardForm.sendSpeedFrame();
                    }
                    if (functionCode == 0xC2)       //ACK Line
                    {
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);

                        if (DashboardForm.timerToSendLineAgain.Enabled == true)
                        {
                            DashboardForm.timerToSendLineAgain.Stop();
                        }
                        Display.UpdateComStatus("receive", receiveFrame.AGVID, " ACK Line", Color.Green);
                    }

                    else if (functionCode == 0xD1)       //NAK Line
                    {
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);

                        // if (DashboardForm.timerToSendLineAgain.Enabled == true)
                        //     DashboardForm.timerToSendLineAgain.Stop();
                        DashboardForm.sendLineFrame();
                        Display.UpdateComStatus("receive", receiveFrame.AGVID, " NAK Line", Color.Red);
                    }
                    if (functionCode == 0xC3)       //ACK Path
                    {
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);
                        FlagPath1Complete = 0;
                        FlagPath2Complete = 0;
                        if (AGV.ListAGV[0].PathCopmpleted == 1)
                        {
                            AGV.ListAGV[0].PathCopmpleted = 2;
                            //if (DashboardForm.timerToSendPathAgain.Enabled == true)
                            //   DashboardForm.timerToSendPathAgain.Stop();
                        }
                        else if (AGV.ListAGV[0].PathCopmpleted == 0)
                        {
                            AGV.ListAGV[0].Tasks[0].Status = "Doing";
                            AGV.ListAGV[0].Status          = "Running";
                            //  if (DashboardForm.timerToSendPathAgain.Enabled == true)
                            //    DashboardForm.timerToSendPathAgain.Stop();
                        }
                        Debug.WriteLine("AcK Path");
                        Display.UpdateComStatus("receive", receiveFrame.AGVID, " ACK Path", Color.Green);
                    }
                    else if (functionCode == 0xD2)       //NAK Path
                    {
                        if (bytesReceived.Count - startIndex < PathCompleteReceivePacketSize)
                        {
                            return;
                        }

                        // put data in an array
                        byte[] data = new byte[PathCompleteReceivePacketSize];
                        for (int j = 0; j < PathCompleteReceivePacketSize; j++)
                        {
                            data[j] = bytesReceived[startIndex + j];
                        }

                        PathCompleteRecievePacket receiveFrame = PathCompleteRecievePacket.FromArray(data);
                        bytesReceived.RemoveRange(0, startIndex + PathCompleteReceivePacketSize - 1);

                        if (AGV.ListAGV[0].PathCopmpleted == 1)
                        {
                            AGV.ListAGV[0].PathCopmpleted = 1;
                        }
                        else if (AGV.ListAGV[0].PathCopmpleted == 0)
                        {
                            AGV.ListAGV[0].PathCopmpleted = 0;
                            //  DashboardForm.timerToSendPathAgain.Stop();
                            // Task currentTask = AGV.ListAGV[0].Tasks[0];
                            //  currentTask.Status = "Waiting";
                            // AGV.ListAGV[0].PathCopmpleted = 0;
                        }
                        Debug.WriteLine("NAK Path");
                        Display.UpdateComStatus("receive", receiveFrame.AGVID, " NAK Path", Color.Red);
                    }
                }
            }
        }