📄 sim.c
字号:
break;
case REMOVENODE:
tmpx = (xpos - 10.0) / SIDE;
tmpy = (ypos - 15.0) / SIDE;
n1 = manager.findNode(tmpx, tmpy);
if (n1 != NULL) {
manager.removeNode(n1);
manager.refresh(painter);
msgb.message("Renumber the nodes!");
}
else msgb.message("Mouse didn't point to a node");
flag = NOTHING;
break;
case MOVENODE:
tmpx = (xpos - 10.0) / SIDE;
tmpy = (ypos - 15.0) / SIDE;
n1 = manager.findNode(tmpx, tmpy);
if (n1 != NULL) {
msgb.message("Click on the new position");
flag = MOVENODE2;
}
else {
msgb.message("Mouse didn't point to a node");
flag = NOTHING;
};
break;
case ADDLINK: case REMOVELINK: case EDITLINKCAP:
if (flag == ADDLINK) flag = ADDLINK2;
else if (flag == REMOVELINK) flag = REMOVELINK2;
else flag = EDITLINKCAP2;
tmpx = (xpos - 10.0) / SIDE;
tmpy = (ypos - 15.0) / SIDE;
if (flag == EDITLINKCAP) msgb.message("Click on the head node");
else msgb.message("Click on the second node");
break;
case MOVENODE2:
tmpx2 = (xpos - 10.0) / SIDE;
tmpy2 = (ypos - 15.0) / SIDE;
n1 = manager.findNode(tmpx, tmpy);
n1->nodePtr()->X(tmpx2);
n1->nodePtr()->Y(tmpy2);
msgb.message("");
manager.refresh(painter);
flag = NOTHING;
break;
case ADDLINK2: case REMOVELINK2: case EDITLINKCAP2:
tmpx2 = (xpos - 10.0) / SIDE;
tmpy2 = (ypos - 15.0) / SIDE;
n1 = manager.findNode(tmpx, tmpy);
n2 = manager.findNode(tmpx2, tmpy2);
if ((n1 != NULL) && (n2 != NULL)) {
if (flag == ADDLINK2) {
status = manager.addLink(n1, n2);
if (status == 0) msgb.message("A link already exists");
else msgb.message("");
flag = NOTHING;
}
else if (flag == REMOVELINK2) {
status = manager.removeLink(n1, n2);
if (status ==0) msgb.message("No link between these two nodes");
else msgb.message("");
flag = NOTHING;
}
else {
tmpAdj = n1->nodePtr()->adjacentNodes();
while ((tmpAdj != NULL) && (tmpAdj->nodePtr()!=n2->nodePtr()))
tmpAdj = tmpAdj->next();
if (tmpAdj == NULL) {
msgb.message("No link between these two nodes");
flag = NOTHING;
}
else {
char *ss = new char[60];
sprintf(ss, "Capacity of link from %d to %d (in Mbps) = ",
n1->nodePtr()->name(), n2->nodePtr()->name());
msgb.message(ss);
char *s = new char[10];
sprintf(s, "%.3lf", tmpAdj->linkCapacity() / 1e6);
cmdb.message(s, True);
flag = EDITLINKCAP3;
};
};
manager.refresh(painter);
}
else msgb.message("Mouse didn't point to two nodes");
break;
case ADDSOURCE: case REMOVESOURCE: case ADDDESTINATION:
case REMOVEDESTINATION: case ROUTER:case REMOVETREE:
tmpx = (xpos - 10.0) / SIDE;
tmpy = (ypos - 15.0) / SIDE;
tmpNode = manager.findNode(tmpx, tmpy);
if (tmpNode != NULL) {
msgb.message("Enter group address");
cmdb.message("", True);
switch (flag) {
case ADDSOURCE: flag = ADDSOURCE2; break;
case REMOVESOURCE: flag = REMOVESOURCE2; break;
case ADDDESTINATION: flag = ADDDESTINATION2; break;
case REMOVEDESTINATION: flag = REMOVEDESTINATION2; break;
case ROUTER: flag = ROUTER2; break;
case REMOVETREE: flag = REMOVETREE2; break;
};
}
else {
msgb.message("Mouse didn't point to a node");
flag = NOTHING;
};
break;
case DISPLAYTREE:
tmpx = (xpos - 10.0) / SIDE;
tmpy = (ypos - 15.0) / SIDE;
tmpNode = manager.findNode(tmpx, tmpy);
if (tmpNode != NULL) {
manager.displayTree(tmpNode->nodePtr()->name());
manager.refresh(painter);
flag = NOTHING;
}
else {
msgb.message("Mouse didn't point to a node");
flag = NOTHING;
};
break;
};
};
void refreshCB() {
//refreshes and updates the drawing area
manager.refresh(painter);
};
void renumberCB() {
//renumbers the nodes starting from 0
cmdb.message("", False);
msgb.message("");
manager.renumber();
manager.refresh(painter);
};
//The next four functions are for changing the parameters for the
//random network ganerator and the random link generator
void alphaCB() {
msgb.message("Alpha = ");
char *s = new char[10];
sprintf(s, "%f", alpha);
cmdb.message(s, True);
flag = Alpha;
};
void betaCB() {
msgb.message("Beta = ");
char *s = new char[10];
sprintf(s, "%f", beta);
cmdb.message(s, True);
flag = Beta;
};
void numberCB() {
msgb.message("# of nodes = ");
char *s = new char[10];
sprintf(s, "%d", number);
cmdb.message(s, True);
flag = NUMBER;
};
void degreeCB() {
msgb.message("Expected node degree = ");
char *s = new char[10];
sprintf(s, "%f", degree);
cmdb.message(s, True);
flag = DEGREE;
};
void defCapCB() {
msgb.message("Default link capacity (in Mbps) = ");
char *s = new char[10];
sprintf(s, "%.3lf", manager.defaultCapacity / 1e6);
cmdb.message(s, True);
flag = DEFCAP;
};
void Activate() {
//handles data entered by the user through the command bar
char *s = cmdb.getString();
cmdb.message("", False);
msgb.message("");
double tmpd = atof(s);
int tmpi = atoi(s);
int status;
switch (flag) {
case OPEN: //open file
manager.deleteGraph();
status = manager.readFromFile(s);
manager.refresh(painter);
flag = NOTHING;
currentFile = s;
changeTitle();
break;
case SAVE: //save to file
manager.writeToFile(s);
currentFile = s;
changeTitle();
flag = NOTHING;
break;
case Alpha: //change alpha
if (tmpd > 0) alpha = tmpd;
flag = NOTHING;
break;
case Beta: //change beta
if (tmpd > 0) beta = tmpd;
flag = NOTHING;
break;
case NUMBER: //change the number of nodes
if (tmpi > 0) number = tmpi;
flag = NOTHING;
break;
case DEGREE: //change the node degree
if (tmpd >= 2) degree = tmpd;
flag = NOTHING;
break;
case DEFCAP: //change the default link capacity
if (tmpd > 0) manager.defaultCapacity = tmpd*1e6;
flag = NOTHING;
break;
case BATCHSIZE: //change the batchsize
if (tmpd > 0) batchSize = (tmpd / 1000.0);
flag = NOTHING;
break;
case MINNUMBATCHES: //change the minmumnumber of batches
if (tmpi > 0) minNumBatches = tmpi;
flag = NOTHING;
break;
case MAXNUMBATCHES: //change the maximum number of batches
if (tmpi > 0) maxNumBatches = tmpi;
flag = NOTHING;
break;
case ADDSOURCE2:
if (tmpi > 0) {
i = tmpi;
flag = ADDSOURCE3;
msgb.message("Enter peak rate in Mbps:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case ADDSOURCE3:
if (tmpd > 0) {
tmpx = tmpd * 1e6;
flag = ADDSOURCE4;
msgb.message("Enter average to peak ratio:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case ADDSOURCE4:
if ((tmpd > 0) && (tmpd <= 1)) {
tmpy = tmpd;
flag = ADDSOURCE5;
msgb.message("Enter burst size in msec:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case ADDSOURCE5:
if (tmpd > 0) {
tmpz = tmpd * 1e-3;
manager.addMCSource(tmpNode->nodePtr(), tmpx, tmpy, tmpz, i,
model);
manager.refresh(painter);
};
flag = NOTHING;
break;
case REMOVESOURCE2:
if (tmpi > 0) {
manager.removeMCSource(tmpNode->nodePtr(), tmpi);
manager.refresh(painter);
};
flag = NOTHING;
break;
case RANDOMGROUP:
if (tmpi > 0) {
i = tmpi;
flag = RANDOMGROUP2;
msgb.message("Enter # of members:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case RANDOMGROUP2:
if ((tmpi > 0) && (tmpi <= manager.count())) {
manager.addRandomMCGroup(tmpi, i);
manager.refresh(painter);
};
flag = NOTHING;
break;
case REMOVEGROUP:
if (tmpi > 0) {
manager.removeMCGroup(tmpi);
manager.refresh(painter);
};
flag = NOTHING;
break;
case ADDDESTINATION2:
if (tmpi > 0) {
manager.addMCDestination(tmpNode->nodePtr(), tmpi);
manager.refresh(painter);
};
flag = NOTHING;
break;
case REMOVEDESTINATION2:
if (tmpi > 0) {
manager.removeMCDestination(tmpNode->nodePtr(),tmpi);
manager.refresh(painter);
};
flag = NOTHING;
break;
case BACKGROUND1:
if (tmpd >= 0) {
tmpx = tmpd * 1e6;
flag = BACKGROUND2;
msgb.message("Enter max. bg. peak rate in Mbps:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case BACKGROUND2:
if (tmpd >= 0) {
tmpy = tmpd * 1e6;
flag = BACKGROUND3;
msgb.message("Enter min average to peak ratio:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case BACKGROUND3:
if ((tmpd > 0) && (tmpd <= 1)) {
tmpx2 = tmpd;
flag = BACKGROUND4;
msgb.message("Enter max average to peak ratio:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case BACKGROUND4:
if ((tmpd > 0) && (tmpd <= 1)) {
tmpy2 = tmpd;
flag = BACKGROUND5;
msgb.message("Enter min burst in msec:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case BACKGROUND5:
if (tmpd > 0) {
tmpz = tmpd * 1e-3;
flag = BACKGROUND6;
msgb.message("Enter max burst in msec:");
cmdb.message("", True);
}
else flag = NOTHING;
break;
case BACKGROUND6:
if ((tmpd > 0) && (tmpx <= tmpy) && (tmpx2 <= tmpy2)
&& (tmpz <= (tmpd * 1e-3))) {
if (symmetry == False) {
if (batch == False)
manager.addMuxedBackgroundTrafficSources(tmpx,
tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
else manager.addBatchBackgroundTrafficSources(tmpx,
tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
}
else {
if (batch == False)
manager.addMuxedSymmetricBackgroundTrafficSources(tmpx,
tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
else manager.addBatchSymmetricBackgroundTrafficSources(tmpx,
tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
};
};
manager.refresh(painter);
flag = NOTHING;
break;
case ROUTER2:
if (tmpi > 0) {
i = tmpi; //i is the group address
SourceList *ss = tmpNode->nodePtr()->sourceList();
int found = 0;
while ((ss != NULL) && (found == 0)) {
if ((ss->source()->type() != Background) &&
(ss->source()->address() == i)) found = 1;
else ss = ss->next();
};
double cost;
if (found == 1) {
double del, h, maxDel, minDel, ndCount;
cost = manager.router(alg, tmpNode->nodePtr(), i,
del, maxDel, minDel, h, ndCount);
char *s = new char[60];
if (cost < FAILURE)
sprintf(s, "Total cost = %.2lf", (cost / 1e6));
else if (cost == DBVIOL)
sprintf(s, "Failure: Delay Bound Violated");
else if (cost == LINKSAT)
sprintf(s, "Failure: Saturated Links");
else if (cost == SATORDB)
sprintf(s, "Failure: Saturated Links or Delay Bound Violated");
msgb.message(s);
cmdb.message("", False);
manager.refresh(painter);
}
else {
msgb.message("No source for that group at selected node!");
cmdb.message("", False);
};
};
flag = NOTHING;
break;
case REMOVETREE2:
if (tmpi > 0) {
i = tmpi; //i is the group address
SourceList *sss = tmpNode->nodePtr()->sourceList();
int Found = 0;
while ((sss != NULL) && (Found == 0)) {
if (sss->source()->address() == i) Found = 1;
else sss = sss->next();
};
if (Found == 1) {
manager.removeTree(tmpNode->nodePtr(), i);
manager.refresh(painter);
}
else {
msgb.message("No source for that group at selected node!");
cmdb.message("", False);
};
};
flag = NOTHING;
break;
case DISPLAYGROUP:
if (tmpi > 0) {
i = tmpi; //i is the group address
manager.displayGroup(i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -