ConnectionPerformance.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package de.tu_darmstadt.tk.SmartHomeNetworkSim.core;
  2. import java.util.Collection;
  3. import java.util.LinkedList;
  4. /**
  5. * Implementation of the Connection Interface, with main focus on performance
  6. *
  7. * @author Andreas T. Meyer-Berg
  8. */
  9. public class ConnectionPerformance implements Connection {
  10. /** Link on which this connection runs */
  11. protected Link link;
  12. /** Link on which this connection runs */
  13. protected LinkedList<Port> participants;
  14. /** Link on which this connection runs */
  15. protected LinkedList<Port> removedParticipants;
  16. /** Link on which this connection runs */
  17. protected Protocol protocol;
  18. /** Link on which this connection runs */
  19. protected double packetLossRate;
  20. /** Link on which this connection runs */
  21. protected byte status;
  22. /** Link on which this connection runs */
  23. protected boolean changed = false;
  24. /** Link on which this connection runs */
  25. protected String name;
  26. /**
  27. * Initializes the connection, adds participants of the protocol
  28. *
  29. * @param l Link which this connection uses
  30. * @param p Protocol of the connection
  31. */
  32. public ConnectionPerformance(Link l, Protocol p) {
  33. link = l;
  34. participants=new LinkedList<Port>();
  35. removedParticipants = new LinkedList<Port>();
  36. this.protocol = p;
  37. status =Connection.ACTIVE;
  38. if(p==null)
  39. name = "unspecified-connection";
  40. else
  41. name = p.getName()+"-connection";
  42. }
  43. public ConnectionPerformance() {
  44. link = null;
  45. this.protocol = null;
  46. participants=new LinkedList<Port>();
  47. removedParticipants = new LinkedList<Port>();
  48. status =Connection.ACTIVE;
  49. name = "unspecified-connection";
  50. }
  51. @Override
  52. public Link getLink() {
  53. return link;
  54. }
  55. @Override
  56. public void setLink(Link link){
  57. this.link = link;
  58. }
  59. @Override
  60. public Collection<Port> getParticipants() {
  61. LinkedList<Port> out = new LinkedList<Port>();
  62. out.addAll(participants);
  63. return out;
  64. }
  65. @Override
  66. public Collection<Port> getParticipantsAndRemoved() {
  67. LinkedList<Port> out = new LinkedList<Port>();
  68. out.addAll(participants);
  69. out.addAll(removedParticipants);
  70. return out;
  71. }
  72. @Override
  73. public boolean removeSmartDevice(Port sd) {
  74. boolean removed = participants.remove(sd);
  75. if(removed)
  76. removedParticipants.add(sd);
  77. if(participants.size()<2)setStatus(Connection.TERMINATED);
  78. return removed;
  79. }
  80. @Override
  81. public boolean addSmartDevice(Port sd) {
  82. return participants.add(sd);
  83. }
  84. @Override
  85. public Collection<Packet> simulateTimeInterval(long startTime, long duration) {
  86. LinkedList<Packet> returnPackets=new LinkedList<Packet>();
  87. returnPackets.addAll(getTerminationPackages(startTime));
  88. for(Port p:participants){
  89. if(p.getLastTrigger()+p.getTriggerInterval()<startTime && p.getStatus()==Port.SENDING){
  90. returnPackets.addAll(protocol.generateNextPackets(p, (long) (startTime+p.getJitter()*Math.random()),Math.random()<packetLossRate));
  91. }
  92. while(p.getLastTrigger()+p.getTriggerInterval()<startTime+duration &&p.getStatus()==Port.SENDING)
  93. returnPackets.addAll(protocol.generateNextPackets(p, (long) Math.max((p.getLastTrigger()+p.getTriggerInterval()+p.getJitter()*(Math.random())),p.getLastTrigger()+p.getTriggerInterval()),Math.random()<packetLossRate));
  94. }
  95. returnPackets.sort((a,b)->(Long.compare(a.getTimestamp(),b.getTimestamp())));
  96. return returnPackets;
  97. }
  98. @Override
  99. public Collection<Packet> encapsulatePackages(Collection<Packet> packets) {
  100. return packets;
  101. }
  102. @Override
  103. public Collection<Packet> getTerminationPackages(long startTime) {
  104. changed=!removedParticipants.isEmpty();
  105. removedParticipants.clear();
  106. if(status==TERMINATED)status = DONE;
  107. return protocol.generateNextPackets(null, startTime, false);
  108. }
  109. @Override
  110. public Protocol getProtocol() {
  111. return protocol;
  112. }
  113. @Override
  114. public boolean setProtocol(Protocol protocol) {
  115. this.protocol = protocol;
  116. return true;
  117. }
  118. @Override
  119. public byte getStatus() {
  120. return status;
  121. }
  122. @Override
  123. public void setStatus(byte status) {
  124. this.status = status;
  125. }
  126. @Override
  127. public void setPacketLossProbability(double lossPercentage) {
  128. packetLossRate=lossPercentage;
  129. }
  130. @Override
  131. public double getPacketLossProbability() {
  132. return packetLossRate;
  133. }
  134. @Override
  135. public boolean getStatusChanged() {
  136. return changed;
  137. }
  138. @Override
  139. public String getName() {
  140. return name;
  141. }
  142. @Override
  143. public void setName(String name) {
  144. this.name = name;
  145. }
  146. }