public SessionData RunSimulation(int delay, int tabIndex)
        {
            SessionData sessionData = new SessionData(tabIndex);

            sessionData.SetStartingBatteryLevels(mobileNodes);              // Save starting battery levels
            sessionData.SetNumberOfAttemptedTransmissions(messages.Count);  // Save number of attempted transmissions

            string tag = "";

            if (tabIndex == PROTOCOL_INDEX_DSR)
            {
                tag = OutputTag.TAG_DSR;
            }
            else if (tabIndex == PROTOCOL_INDEX_SADSR)
            {
                tag = OutputTag.TAG_SADSR;
            }
            else if (tabIndex == PROTOCOL_INDEX_MSADSR)
            {
                tag = OutputTag.TAG_MSADSR;
            }

            /* Send all messages */
            foreach (Message message in messages)
            {
                controller.PrintToOutputPane(OutputTag.TAG_NOTE, "Message: " + message.GetMessageID());
                if (tabIndex == PROTOCOL_INDEX_DSR)
                {
                    controller.PrintToOutputPane(OutputTag.TAG_DSR, "Running DSR Simulation.");
                    SendMessageDSR(message, sessionData, delay);
                }
                else if (tabIndex == PROTOCOL_INDEX_SADSR)
                {
                    controller.PrintToOutputPane(OutputTag.TAG_SADSR, "Running SA-DSR Simulation.");
                    SendMessageSADSR(message, sessionData, delay);
                }
                else if (tabIndex == PROTOCOL_INDEX_MSADSR)
                {
                    controller.PrintToOutputPane(OutputTag.TAG_MSADSR, "Running MSA-DSR Simulation.");
                    SendMessageMSADSR(message, sessionData, delay);
                }
            }

            sessionData.SetEndingBatteryLevels(mobileNodes); // Save ending battery levels
            sessionData.PrintResults();                      // Print collected metrics
            sessions.Add(sessionData);                       // Add collected data to recorded sessions
            controller.PrintToOutputPane(tag, sessionData.GetNumberOfAttemptedTransmissions() + " attempted transmissions.");
            controller.PrintToOutputPane(tag, sessionData.GetNumberOfSuccessfulTranmissions() + " successful transmissions.");
            controller.PrintToOutputPane(tag, "Finished Transmitting Messages.");
            controller.MarkTransferAsComplete(tabIndex);

            return(sessionData);
        }