/**
   * Performs simulation.
   *
   * @param sendingNodes The source Nodes.
   * @param receivingNodes The destination Nodes.
   * @param syncTransmissionLength The length of a synchronous transmission in seconds. O =
   *     asynchronous transmission
   */
  public void startSimulation(
      ArrayList<Node> sendingNodes,
      ArrayList<Node> receivingNodes,
      ArrayList<Integer> syncTransmissionLength) {
    int numberOfCompletedTransfers = 0;
    int totalNumberOfTransfers = sendingNodes.size();

    while (numberOfCompletedTransfers < totalNumberOfTransfers) {

      for (int i = 0; i < totalNumberOfTransfers; i++) {

        Node sender = sendingNodes.get(i);
        Node receiver = receivingNodes.get(i);
        int syncLength = syncTransmissionLength.get(i);

        if (receiver.getIdle() == true && sender.getIdle() == true) {
          // RTS and CTS performed
          performHandshake(sender, receiver);

          // Operations for Asynchronous transmission
          if (syncLength == 0) {
            // Check if the sender has files to send
            int numFiles = sender.getNumOfFiles();

            if (numFiles > 0) {
              // Get the first file size
              double fileSize = sender.getFiles().poll();

              // Lower number of files
              numFiles--;
              sender.setNumOfFiles(numFiles);

              // Test simulation
              int simStatus = performAsyncTransmission(fileSize, sender, receiver);
              numberOfCompletedTransfers += simStatus;
              if (simStatus == 1) {
                sender.reset();
                receiver.reset();
                //								sendingNodes.remove(i);
                //								receivingNodes.remove(i);
              }
            }

          }
          // Operations for Synchronous transmission
          else if (syncLength > 0) {

            int simStatus = performSyncTransmission(syncLength, sender, receiver);
            numberOfCompletedTransfers += simStatus;

            if (simStatus == 1) {
              sender.reset();
              receiver.reset();
              //							sendingNodes.remove(i);
              //							receivingNodes.remove(i);
            }
          }

        }
        // Operations for sender backoff
        else if (receiver.getIdle() == false && sender.getIdle() == true) {
          int simStatus = performBackoff(sender);
          numberOfCompletedTransfers += simStatus;
          if (simStatus == 1) {
            sender.reset();
            sendingNodes.remove(i);
            receivingNodes.remove(i);
          }
        }
      }
    }
  }