Commit 45b02a76f2fc6edffe1d6737ce561eb90e5aea62

Authored by 尹本进
1 parent 2a8e3c51
Exists in develop

handOver具体逻辑完成

src/main/java/com/example/mina/client/base/ExperimentOptions.java
@@ -31,7 +31,7 @@ public abstract class ExperimentOptions { @@ -31,7 +31,7 @@ public abstract class ExperimentOptions {
31 31
32 protected ZonedDateTime finishAt; 32 protected ZonedDateTime finishAt;
33 33
34 - protected List<ExperimentOptionsPair> pairs; 34 + protected List<StationPair> pairs;
35 35
36 protected abstract boolean checkOptions(); 36 protected abstract boolean checkOptions();
37 } 37 }
src/main/java/com/example/mina/client/base/ExperimentOptionsPair.java
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -package com.example.mina.client.base;  
2 -  
3 -import java.util.List;  
4 -import lombok.Data;  
5 -  
6 -/**  
7 - * 输入输出端口  
8 - * @author BenJin Yin  
9 - * @date 2021/4/2  
10 - */  
11 -@Data  
12 -public class ExperimentOptionsPair {  
13 - /**  
14 - * 输入端口  
15 - */  
16 - private Integer out;  
17 - /**  
18 - * 输出端口  
19 - */  
20 - private List<Integer> inList;  
21 -}  
src/main/java/com/example/mina/client/base/MatrixClient.java
@@ -179,7 +179,7 @@ public class MatrixClient { @@ -179,7 +179,7 @@ public class MatrixClient {
179 public void run() { 179 public void run() {
180 while (true) { 180 while (true) {
181 try { 181 try {
182 - MatrixCommand command = commands.poll(5, TimeUnit.SECONDS); 182 + MatrixCommand command = commands.poll();
183 183
184 if(command != null){ 184 if(command != null){
185 log.info("======================"); 185 log.info("======================");
src/main/java/com/example/mina/client/base/StationPair.java 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +import java.util.List;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * 输入输出端口
  8 + * @author BenJin Yin
  9 + * @date 2021/4/2
  10 + */
  11 +@Data
  12 +public class StationPair {
  13 + /**
  14 + * 输出端口
  15 + */
  16 + private Integer out;
  17 + /**
  18 + * 输入端口
  19 + */
  20 + private List<Integer> inList;
  21 +}
src/main/java/com/example/mina/client/experiment/HandOverExperimentOptions.java
@@ -2,8 +2,12 @@ package com.example.mina.client.experiment; @@ -2,8 +2,12 @@ package com.example.mina.client.experiment;
2 2
3 import com.example.mina.client.base.ExperimentOptions; 3 import com.example.mina.client.base.ExperimentOptions;
4 import lombok.Data; 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
5 7
6 @Data 8 @Data
  9 +@EqualsAndHashCode(callSuper = true)
  10 +@ToString(callSuper = true)
7 public class HandOverExperimentOptions extends ExperimentOptions { 11 public class HandOverExperimentOptions extends ExperimentOptions {
8 12
9 13
src/main/java/com/example/mina/client/experiment/HandoverExperiment.java
1 package com.example.mina.client.experiment; 1 package com.example.mina.client.experiment;
2 2
3 -import com.example.mina.client.base.MatrixClient;  
4 -import com.example.mina.client.base.MatrixConstants;  
5 import com.example.mina.client.base.Experiment; 3 import com.example.mina.client.base.Experiment;
6 import com.example.mina.client.base.ExperimentOptions; 4 import com.example.mina.client.base.ExperimentOptions;
  5 +import com.example.mina.client.base.MatrixClient;
  6 +import com.example.mina.client.base.MatrixCommand;
  7 +import com.example.mina.client.base.MatrixConstants;
  8 +import com.example.mina.client.base.StationPair;
  9 +import java.util.ArrayList;
  10 +import java.util.List;
  11 +import org.springframework.util.CollectionUtils;
7 12
8 public class HandoverExperiment extends Experiment { 13 public class HandoverExperiment extends Experiment {
9 14
@@ -18,6 +23,110 @@ public class HandoverExperiment extends Experiment { @@ -18,6 +23,110 @@ public class HandoverExperiment extends Experiment {
18 23
19 @Override 24 @Override
20 public void schedule() { 25 public void schedule() {
  26 + List<StationPair> pairs = options.getPairs();
  27 + if (CollectionUtils.isEmpty(pairs)) {
  28 + return;
  29 + }
  30 + StationPair one = pairs.get(0);
  31 + if (one == null || one.getInList() == null) {
  32 + return;
  33 + }
  34 + // 输入端口的个数
  35 + int inSize = one.getInList().size();
  36 + if (inSize < 2) {
  37 + return;
  38 + }
  39 + // 循环次数
  40 + Integer count = options.getMaxIterCount();
  41 + if (count == null || count < 1) {
  42 + return;
  43 + }
  44 + Integer step = options.getStep();
  45 + Integer endAttenuation = options.getEndAttenuation();
  46 + int dynamicCont = endAttenuation / step;
  47 + if (step == null || step <= 0) {
  48 + return;
  49 + }
  50 + for (int i = 0; i < count; i++) {
  51 + // 输入端口只有 2 个
  52 + if (inSize == 2) {
  53 + for (int k = 0; k <= dynamicCont; k++) {
  54 + int dynamic = step * k;
  55 + List<MatrixCommand> commandList = new ArrayList<>();
  56 + for (StationPair pair : pairs) {
  57 + Integer out = pair.getOut();
  58 + Integer inOne = pair.getInList().get(0);
  59 + Integer inTwo = pair.getInList().get(1);
  60 + MatrixCommand commandOne = MatrixCommand.builder().command(MatrixConstants.COMMAND_SET_ATTN)
  61 + .col(inOne).row(out).attn(dynamic).build();
  62 + MatrixCommand commandTwo = MatrixCommand.builder().command(MatrixConstants.COMMAND_SET_ATTN)
  63 + .col(inTwo).row(out).attn(endAttenuation - dynamic).build();
  64 + commandList.add(commandOne);
  65 + commandList.add(commandTwo);
  66 + }
  67 + commandList.forEach(this::sendCommand);
  68 + commandList.clear();
  69 + try {
  70 + Thread.sleep(options.getPeriod() * 1000);
  71 + } catch (InterruptedException e) {
  72 + e.printStackTrace();
  73 + }
  74 + }
  75 + } else {
  76 + // 输入端口大于 2
  77 + // 行数
  78 + int rowCount = 1 + inSize * dynamicCont;
  79 + // 动态衰减值 矩阵
  80 + int[][] attenuation = new int[rowCount][inSize];
  81 + // 当前动态输入端口指针
  82 + int current = 0;
  83 + for (int k = 0; k < rowCount; k++) {
  84 + // 动态衰减值
  85 + int dynamic = step * (k != 0 && k % dynamicCont == 0 ? dynamicCont : k % dynamicCont);
  86 + for (int j = 0; j < inSize; j++) {
  87 + if (j == current && j != inSize - 1) {
  88 + attenuation[k][j++] = dynamic;
  89 + attenuation[k][j] = endAttenuation - dynamic;
  90 + } else if (j == current && j == inSize - 1) {
  91 + attenuation[k][j] = dynamic;
  92 + attenuation[k][0] = endAttenuation - dynamic;
  93 + } else {
  94 + attenuation[k][j] = endAttenuation;
  95 + }
  96 + }
  97 + // 一轮衰减完成后,当前动态输入端口指针 加 1
  98 + if (k != 0 && k % dynamicCont == 0) {
  99 + current++;
  100 + }
  101 + }
  102 + for (int x = 0; x < rowCount; x++) {
  103 + // 当前行 --> 时间点,需要发送的 命令
  104 + List<MatrixCommand> commandList = new ArrayList<>();
  105 + for (int y = 0; y < inSize; y++) {
  106 + int att = attenuation[x][y];
  107 + for (StationPair pair : pairs) {
  108 + Integer out = pair.getOut();
  109 + Integer in = pair.getInList().get(y);
  110 + commandList.add(MatrixCommand.builder().command(MatrixConstants.COMMAND_SET_ATTN)
  111 + .col(in).row(out).attn(att).build());
  112 + }
  113 + }
  114 + commandList.forEach(this::sendCommand);
  115 + // 发送完成后,清空集合。
  116 + commandList.clear();
  117 + try {
  118 + Thread.sleep(options.getPeriod() * 1000);
  119 + } catch (InterruptedException e) {
  120 + e.printStackTrace();
  121 + }
  122 + }
  123 + }
  124 + try {
  125 + Thread.sleep(options.getPause() * 1000);
  126 + } catch (InterruptedException e) {
  127 + e.printStackTrace();
  128 + }
  129 + }
21 } 130 }
22 131
23 } 132 }