/** * 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); } } } } }