private void btn_Send_Click(object sender, EventArgs e)
        {
            #region Initialization
            lst_clssSqaure.Clear();
            objFrame = new clssSqaure(10 - nwidth, 20, 1, color_Blue);
            lst_clssSqaure.Add(objFrame);
            bsend_file = true;
            dtstart = DateTime.Now;
            if (txt_Timeout.Text != string.Empty)
                dtimeout = int.Parse(txt_Timeout.Text);
            else
                dtimeout = 3;//default value
            #endregion
            if (rb_stp_wait.Checked)
            {
                if (LBx_Sender.SelectedIndex < 0)
                {
                    MessageBox.Show("please select frame to send", "Info", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                objselected_frame_stp_wt = LBx_Sender.SelectedItem;
            }
            else
            {
                if (!bcontinue_receive)
                {
                    bcontinue_receive = true;
                }

                //modify window size to the count of remaining items
                nwin_size = Convert.ToInt32(num_win_size.Value);
                if (nwin_size > LBx_Sender.Items.Count)
                    nwin_size = LBx_Sender.Items.Count;
                for (int i = 0; i < nwin_size; i++)
                {
                    Q_Frames.Enqueue(LBx_Sender.Items[i]);
                }
            }
            timer1.Enabled = simpleOpenGlControl1.Visible = true;
        }
        private void SlidingWindow(TimeSpan tsSend_Time, bool bIsGoBackN)
        {
            object[] arr_Frames = Q_Frames.ToArray();
            if (Q_Frames.Count != 0)//Sending Frames
            {
                objFrame.Fxpos += fspeed * objFrame.Fvec_X;
                lbl_sender.Text = "Sending " + arr_Frames[0].ToString();
                lbl_receiver.Text = "Receiving " + arr_Frames[0].ToString();

                if (objFrame.Fxpos + dlen > nwidth)//frame reached Rx
                {
                    object Objreceivedframe = Q_Frames.Dequeue();
                    if (tsSend_Time.Seconds < dtimeout) //within time
                    {
                        if (bcontinue_receive)//sending was not interrupted,receive frames normally
                        {
                            LBx_Receiver.Items.Add(Objreceivedframe);
                            LBx_Log.Items.Add(Objreceivedframe.ToString() + " received");
                            Q_Acks.Enqueue(Objreceivedframe);

                            objAck = new clssSqaure(nwidth, -20, -1, color_yellow);//Send Ack
                            lst_clssSqaure.Add(objAck);
                        }
                    }
                    else//frame exceeded time
                    {
                        LBx_Log.Items.Add(Objreceivedframe.ToString() + " timed out");
                        if (bIsGoBackN && bcontinue_receive)
                        {
                            LBx_Log.Items.Add("Rx stopped receiving");
                            bcontinue_receive = false;//stop receiving
                        }
                    }
                    dtstart = DateTime.Now; //reset time
                    objFrame.Fxpos = 10 - nwidth; //reset Frame position
                }

            }
            if (Q_Acks.Count != 0)//Sending Ack
            {
                objAck.Fxpos += fspeed * 2 * objAck.Fvec_X;
                if (((objAck.Fxpos - dlen + 10) < (nwidth * -1)))//Ack arrived to Tx
                {
                    LBx_Log.Items.Add("Ack received");
                    LBx_Sender.Items.Remove(Q_Acks.Dequeue());
                    lst_clssSqaure.Remove(objAck);
                }
            }
            if (Q_Frames.Count == 0 && Q_Acks.Count == 0)
            {
                lbl_receiver.Text = lbl_sender.Text = "Ready";
                lbl_TimeElapsed.Text = string.Empty;
            }
        }
        private void transform()
        {
            TimeSpan tsSend_Time = DateTime.Now - dtstart;
            lbl_TimeElapsed.Text = tsSend_Time.ToString();
           
            if (rb_stp_wait.Checked)
            {
                #region Stop & Wait
                #region Explanation
                /*
                     * Stop after Transmitting a Frame
                     * Wait for an Acknowledgement
                     * 
                     * 
                     * Tx                   Rx
                     * 
                     * Frame_0
                     * |------------------->|
                     * |                    |
                     * |                 Ack|         
                     * |<-------------------|
                     * |                    | 
                     * |                    |
                     * |Frame_1             |
                     * |---------->         |
                     * |             Timeout|
                     * |                NAck|         
                     * |<-------------------|
                     * |                    | 
                     * |                    |
                     * Frame_2
                     * |------------------->|
                     * |                    |
                     * |                 Ack|         
                     * |         <----------|
                     * |                    | 
                     * |Timeout             |
                     */
                #endregion
                if (objselected_frame_stp_wt != null)
                {
                    if (tsSend_Time.Seconds > dtimeout)//send time exceeded predetermined timeout
                    {
                        if (bsend_file) //Rx didnt receive Frame
                            lbl_receiver.Text = "Timeout";

                        else            //Tx didnt receive Acknowledgment
                            lbl_sender.Text = "Timeout";

                        timer1.Enabled = false;//stop sending
                    }

                    if (bsend_file)//Frame is being sent to Rx
                    {
                        if (LBx_Receiver.Items.Contains(objselected_frame_stp_wt))
                            lbl_sender.Text = "Resending " + objselected_frame_stp_wt.ToString();
                        else
                            lbl_sender.Text = "Sending " + objselected_frame_stp_wt.ToString();

                        if ((objFrame.Fxpos + dlen) > nwidth)//frame arrived to Rx
                        {
                            if (!LBx_Receiver.Items.Contains(objselected_frame_stp_wt))
                            {
                                LBx_Receiver.Items.Add(objselected_frame_stp_wt);
                            }
                            lbl_sender.Text = "awaiting acknowledgement";
                            lbl_receiver.Text = "sending acknowledgement";
                            bsend_file = false;
                            dtstart = DateTime.Now;
                            objAck = new clssSqaure(nwidth, -20, -1, color_yellow);
                            lst_clssSqaure.Add(objAck);
                        }
                        objFrame.Fxpos += fspeed * objFrame.Fvec_X;
                    }
                    else//Ack is being sent to Tx
                    {
                        if (((objAck.Fxpos - dlen + 10) < (nwidth * -1)))//Ack arrived to Tx
                        {
                            lbl_sender.Text = "Acknowledgement received";
                            if (LBx_Receiver.Items.Contains(objselected_frame_stp_wt))
                            {
                                LBx_Sender.Items.Remove(objselected_frame_stp_wt);
                            }
                            timer1.Enabled = false;
                            bsend_file = true;
                        }
                        objAck.Fxpos += fspeed * objAck.Fvec_X;
                    }
                }
                #endregion
            }
            else if (rb_goback_N.Checked)
            {
                #region Go Back N
                #region Explanation
                /*
                 * the sending process continues to send a number of frames specified by 
                 * a window size without waiting for the ACK packet from the receiver.
         
                 * if any frame was lost or damaged, or the ACK acknowledging them was lost or damaged,
                 * then that frame and all following frames in the window
                 * (even if they were received without error) will be re-sent.
                 */
                #endregion
                SlidingWindow(tsSend_Time, true  /*Is it GoBackN*/);
                
                #endregion
            }
            else
            {
                #region Selective Repeat
                #region Explanation
                /* The sending process continues to send a number of frames specified by a window size even after a frame loss.
                 * Unlike Go-Back-N ARQ, the receiving process will continue to accept and acknowledge frames sent after an initial
                 * error.
                 * Only faulted frames will be resent.
                 * */
                #endregion
                SlidingWindow(tsSend_Time, false /*Is it GoBackN*/);
                #endregion
            }
        }