ConnectionPerformance.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. /** default label */
  27. protected short label = 0;
  28. /**
  29. * Initializes the connection, adds participants of the protocol
  30. *
  31. * @param l Link which this connection uses
  32. * @param p Protocol of the connection
  33. */
  34. public ConnectionPerformance(Link l, Protocol p) {
  35. link = l;
  36. participants=new LinkedList<Port>();
  37. removedParticipants = new LinkedList<Port>();
  38. this.protocol = p;
  39. status =Connection.ACTIVE;
  40. if(p==null)
  41. name = "unspecified-connection";
  42. else
  43. name = p.getName()+"-connection";
  44. }
  45. public ConnectionPerformance() {
  46. link = null;
  47. this.protocol = null;
  48. participants=new LinkedList<Port>();
  49. removedParticipants = new LinkedList<Port>();
  50. status =Connection.ACTIVE;
  51. name = "unspecified-connection";
  52. }
  53. @Override
  54. public Link getLink() {
  55. return link;
  56. }
  57. @Override
  58. public void setLink(Link link){
  59. this.link = link;
  60. }
  61. @Override
  62. public Collection<Port> getParticipants() {
  63. LinkedList<Port> out = new LinkedList<Port>();
  64. out.addAll(participants);
  65. return out;
  66. }
  67. @Override
  68. public Collection<Port> getParticipantsAndRemoved() {
  69. LinkedList<Port> out = new LinkedList<Port>();
  70. out.addAll(participants);
  71. out.addAll(removedParticipants);
  72. return out;
  73. }
  74. @Override
  75. public boolean removeSmartDevice(Port sd) {
  76. boolean removed = participants.remove(sd);
  77. if(removed)
  78. removedParticipants.add(sd);
  79. if(participants.size()<2)setStatus(Connection.TERMINATED);
  80. return removed;
  81. }
  82. @Override
  83. public boolean addSmartDevice(Port sd) {
  84. return participants.add(sd);
  85. }
  86. @Override
  87. public Collection<Packet> simulateTimeInterval(long startTime, long duration) {
  88. LinkedList<Packet> returnPackets=new LinkedList<Packet>();
  89. returnPackets.addAll(getTerminationPackages(startTime));
  90. for(Port p:participants){
  91. if(p.getLastTrigger()+p.getTriggerInterval()<startTime && p.getStatus()==Port.SENDING){
  92. returnPackets.addAll(protocol.generateNextPackets(p, (long) (startTime+p.getJitter()*Math.random()),Math.random()<packetLossRate));
  93. }
  94. while(p.getLastTrigger()+p.getTriggerInterval()<startTime+duration &&p.getStatus()==Port.SENDING)
  95. returnPackets.addAll(protocol.generateNextPackets(p, (long) Math.max((p.getLastTrigger()+p.getTriggerInterval()+p.getJitter()*(Math.random())),p.getLastTrigger()+p.getTriggerInterval()),Math.random()<packetLossRate));
  96. }
  97. returnPackets.sort((a,b)->(Long.compare(a.getTimestamp(),b.getTimestamp())));
  98. if(label!=0)
  99. returnPackets.forEach(p->p.setLabel(label));
  100. return returnPackets;
  101. }
  102. @Override
  103. public Collection<Packet> encapsulatePackages(Collection<Packet> packets) {
  104. packets.forEach(p->{
  105. p.setLabel((short) Math.max(Math.max(label, p.getLabel()), p.getSource().getOwner().getLabel()));
  106. });
  107. return packets;
  108. }
  109. @Override
  110. public Collection<Packet> getTerminationPackages(long startTime) {
  111. changed=!removedParticipants.isEmpty();
  112. removedParticipants.clear();
  113. if(status==TERMINATED)status = DONE;
  114. return protocol.generateNextPackets(null, startTime, false);
  115. }
  116. @Override
  117. public Protocol getProtocol() {
  118. return protocol;
  119. }
  120. @Override
  121. public boolean setProtocol(Protocol protocol) {
  122. this.protocol = protocol;
  123. return true;
  124. }
  125. @Override
  126. public byte getStatus() {
  127. return status;
  128. }
  129. @Override
  130. public void setStatus(byte status) {
  131. this.status = status;
  132. }
  133. @Override
  134. public void setPacketLossProbability(double lossPercentage) {
  135. packetLossRate=lossPercentage;
  136. }
  137. @Override
  138. public double getPacketLossProbability() {
  139. return packetLossRate;
  140. }
  141. @Override
  142. public boolean getStatusChanged() {
  143. return changed;
  144. }
  145. @Override
  146. public String getName() {
  147. return name;
  148. }
  149. @Override
  150. public void setName(String name) {
  151. this.name = name;
  152. }
  153. @Override
  154. public short getLabel() {
  155. return label;
  156. }
  157. @Override
  158. public void setLabel(short label) {
  159. this.label = label;
  160. }
  161. }