/**
   * A fila de eventos precisa ser setada com eventos iniciais. Este método seta envios de pacotes
   * de congestionamento (tráfego de fundo) e também envios de pacotes vindo dos Txs.
   */
  private void setFirstEvents() {
    resetSimulation();

    // Prepara o tráfego de fundo.
    if (SimulationProperties.isWithCongestion()) {
      Event firstCongestionPack =
          new Event(
              EventType
                  .CongestionPacketIntoRouter); // Evento "Pacote de Tráfego de Fundo chegar ao
                                                // roteador"
      firstCongestionPack.setTime(random.generateExponential(1.0 / congestionPacketFrequency));
      getEvents().add(firstCongestionPack);
    }

    // Prepara os servidores para transmissão de Tx-Rx.
    for (Tx tx : getSystem().getTxs()) {
      double propagationDelay = setPropagationDelay(tx);
      // Fator aleatório além da propagação e da transmissão.
      // É zero por padrão, mas este intervalo muda nos cenários 2 e 3.
      double randTime = random.generateDouble() * SimulationProperties.getAssyncInterval();

      Event packSent = new Event(EventType.TxPacketHeadsToRouter); // Evento "Pacote sair do Tx"
      packSent.setTime(randTime + transmissionTime);
      packSent.setTxIndex(tx.getIndex());
      getEvents().add(packSent);

      Pack pack = tx.sendPacket(randTime);
      Event firstTcpPack =
          new Event(EventType.TxPacketIntoRouter); // Evento "Pacote TCP chegar ao roteador"
      firstTcpPack.setTime(randTime + transmissionTime + propagationDelay);
      firstTcpPack.setPack(pack);
      getEvents().add(firstTcpPack);

      Event possibleTimeout = new Event(EventType.Timeout); // Evento "Possível Timeout do pacote"
      possibleTimeout.setTime(randTime + tx.getRTO());
      possibleTimeout.setTxIndex(tx.getIndex());
      pack.setTimeout(possibleTimeout);
      getEvents().add(possibleTimeout);
    }
  }