📄 genericlink.java
字号:
theSim.enqueue(e); //loopback to me until the actual time!
}
else {
schedule_next_checkpoint((Integer)paramlist[1]);
}
break;
}
}
////compInfo of GenericLink
////(refer constant definitions near the beginning of the class declaration)
public Object compInfo(int infoid,SimComponent src,Object paramlist) {
switch(infoid) {
case GET_CAPACITY:
return new Double(ln_speed.getValue());
case GET_OTHER_END:
if(neighborCount()<2) return null;
if(neighbor(0)==(SimComponent)paramlist) return neighbor(1);
else if(neighbor(1)==(SimComponent)paramlist) return neighbor(0);
else return null;
case LINK_ANIM:
Object [] params=(Object [])paramlist;
draw_anim((Graphics)params[0],((Boolean)params[1]).booleanValue(),
((Double)params[2]).doubleValue());
break;
}
return null;
}
///////////////////// private methods ////////////////////////////////
private void ln_create() {
link_neighbors=new java.util.ArrayList();
animPackets=new java.util.HashMap();
//Initialize the parameters
ln_speed=new SimParamDouble("Link Speed (MBits/sec)",this,theSim.now(),false,true,10);
ln_distance=new SimParamDouble("Distance (km)",this,theSim.now(),false,true,0.1);
ln_prop_speed=new SimParamDouble("Propagation Speed (km/s)",this,theSim.now(),false,true,200000);
ln_ai=new SimParamDouble("Averaging Interval (usec)",this,theSim.now(),false,true,100000.0);
ln_fail=new SimParamBool("Enable Link Fail",this,theSim.now(),false,true,false);
ln_fail_start=new SimParamDouble("Fail start time (s)",this,theSim.now(),false,true,0);
ln_fail_len=new SimParamDouble("Fail duration (s) (0=inf)",this,theSim.now(),false,true,0);
ln_fail_repeat=new SimParamInt("Fail repeat times (-1=inf)",this,theSim.now(),false,true,-1);
ln_fail_delay=new SimParamDouble("Delay between fails (s)",this,theSim.now(),false,true,0);
ln_fail_random_len=new SimParamBool("Random fail duration",this,theSim.now(),false,true,false);
ln_fail_random_delay=new SimParamBool("Random delay bet. fails",this,theSim.now(),false,true,false);
ln_fail_start_delay=new SimParamBool("Fail start delay",this,theSim.now(),false,true,false);
ln_fail_notify=new SimParamBool("Fail Notification",this,theSim.now(),false,true,true);
ln_name_seed=new SimParamBool("Use name as seed",this,theSim.now(),false,true,false);
ln_anim=new SimParamBool("Enable Animation",this,theSim.now(),false,true,false);
ln_checkpoint=new SimParamInt("Animation Detail (>0)",this,theSim.now(),false,true,5);
ln_anim_delay=new SimParamDouble("Animation Delay (msec/km)",this,theSim.now(),false,true,5000);
ln_log_factor=new SimParamInt("Logging every (ticks) (e.g. 1, 100)",this,theSim.now(),false,true,0);
addParameter(ln_speed);
addParameter(ln_distance);
addParameter(ln_prop_speed);
addParameter(ln_ai);
addParameter(ln_fail);
addParameter(ln_fail_start);
addParameter(ln_fail_len);
addParameter(ln_fail_repeat);
addParameter(ln_fail_delay);
addParameter(ln_fail_random_len);
addParameter(ln_fail_random_delay);
addParameter(ln_fail_start_delay);
addParameter(ln_fail_notify);
addParameter(ln_anim);
addParameter(ln_checkpoint);
addParameter(ln_anim_delay);
addParameter(ln_name_seed);
addParameter(ln_log_factor);
}
private void ln_averaging_interval() {
double interval;
for(int i=0;i<link_neighbors.size();i++) {
LinkNeighbor n=(LinkNeighbor)link_neighbors.get(i);
interval=SimClock.Tick2USec(theSim.now()-n.prev_sample);
if(interval>0) {
n.c_rate.setValue(n.curbits/interval,theSim.now(),ln_log_factor.getValue());
n.totalbits+=n.curbits;
n.l_rate.setValue(n.totalbits/SimClock.Tick2USec(theSim.now()),theSim.now(),ln_log_factor.getValue());
n.curbits=0;
n.prev_sample=theSim.now();
}
}
}
private void ln_ready(SimEvent e) {
theSim.enqueue(new SimEvent(SimProvider.EV_READY,this,e.getSource(),theSim.now(),null));
if(fail_state) return; //don't do animation during link failure
if(ln_anim.getValue()==true && neighborCount()==2) {
schedule_checkpoints(e);
}
}
private void ln_receive(SimEvent e) {
Bits bits=(Bits)e.getParams();
long ticks,eta;
ticks= SimClock.USec2Tick(bits.length()/ln_speed.getValue());
eta=theSim.now() + ticks;
theSim.enqueue(new SimEvent(MY_READY,e.getSource(),this,eta,null));
//NOTE: if link is in fail state, READY is still sent back to neighbor,
// but delivery is not done
ticks=ticks + SimClock.Sec2Tick(ln_distance.getValue()/ln_prop_speed.getValue());
eta=theSim.now() + ticks;
SimComponent to_link=null;
for(int i=0;i<link_neighbors.size();i++) {
LinkNeighbor n=(LinkNeighbor)link_neighbors.get(i);
if(n.to_link != e.getSource()) {
if(fail_state) {
n.packet_drop.setValue(n.packet_drop.getValue()+1,theSim.now(),ln_log_factor.getValue());
n.bits_drop.setValue(n.bits_drop.getValue()+bits.length(),theSim.now(),ln_log_factor.getValue());
return;
}
else {
n.curbits+=bits.length();
theSim.enqueue(new SimEvent(SimProvider.EV_RECEIVE,this,n.to_link,eta,bits));
to_link=n.to_link;
break;
}
}
}
//for Analyzer
if(analyzer != null) {
analyzer.update(bits,(SimComponent)e.getSource(),to_link);
}
}
private long getFailDelay() {
double delay=ln_fail_delay.getValue();
if(ln_fail_random_delay.getValue()) {
delay= -delay * Math.log(1.0 - randgen.nextDouble());
}
return SimClock.Sec2Tick(delay);
}
private long getFailLen() {
double len=ln_fail_len.getValue();
if(ln_fail_random_len.getValue()) {
len= -len * Math.log(1.0 - randgen.nextDouble());
}
return SimClock.Sec2Tick(len);
}
private void ln_do_fail() {
fail_state=true;
//schedule end of fail
if(ln_fail_len.getValue()>0) {
long tick=getFailLen();
theSim.enqueue(new SimEvent(EV_END_FAIL,this,this,theSim.now()+tick,null));
}
//notify both neighbors
if(ln_fail_notify.getValue()==true) {
for(int i=0;i<neighborCount();i++) {
theSim.enqueue(new SimEvent(SimProvider.EV_LINK_DOWN,this,neighbor(i),theSim.now(),null));
}
}
}
private void ln_end_fail() {
fail_state=false;
//schedule next fail
fail_time++;
if(fail_time<ln_fail_repeat.getValue() || ln_fail_repeat.getValue()<0) {
long tick=getFailDelay();
theSim.enqueue(new SimEvent(EV_DO_FAIL,this,this,theSim.now()+tick,null));
}
//notify both neighbors
if(ln_fail_notify.getValue()==true) {
for(int i=0;i<neighborCount();i++) {
theSim.enqueue(new SimEvent(SimProvider.EV_LINK_UP,this,neighbor(i),theSim.now(),null));
}
}
}
private synchronized void schedule_checkpoints(SimEvent e) {
//schedule the next checkpoint
Object [] paramlist=new Object[2];
paramlist[0]=new Long(System.currentTimeMillis()); //next expected time
paramlist[1]=new Integer(last_id++); //asign new id
theSim.enqueue(new SimEvent(MY_CHECK_POINT,this,this,theSim.now(),paramlist));
//add new packet info
AnimPacket anim=new AnimPacket();
anim.checkpoint=0;
anim.neighbor_index=(e.getSource()==neighbor(0))?0:1;
animPackets.put(paramlist[1],anim);
}
private synchronized void schedule_next_checkpoint(Integer id) {
AnimPacket anim=(AnimPacket)animPackets.get(id);
if(anim==null) return;
anim.checkpoint++;
int chk_points=ln_checkpoint.getValue() * 2;
if(anim.checkpoint>chk_points) {
animPackets.remove(id);
return;
}
//schedule the next checkpoint
long segment_time=(long)(ln_distance.getValue()*ln_anim_delay.getValue()/chk_points);
long segment_ticks=SimClock.Sec2Tick((ln_distance.getValue()/ln_prop_speed.getValue())/chk_points);
Object [] paramlist=new Object[2];
paramlist[0]=new Long(System.currentTimeMillis()+segment_time); //next expected time
paramlist[1]=id;
theSim.enqueue(new SimEvent(MY_CHECK_POINT,this,this,theSim.now()+segment_ticks,paramlist));
}
private synchronized void draw_anim(Graphics g,boolean isZooming,double zoomFactor) {
if(animPackets.isEmpty()) return;
int n0,n1,x,y;
double ratio;
java.util.Iterator i=animPackets.values().iterator();
while(i.hasNext()) {
AnimPacket anim=(AnimPacket)i.next();
if(anim.neighbor_index==0) {
n0=0; n1=1;
}
else {
n0=1; n1=0;
}
if(anim.checkpoint > ln_checkpoint.getValue()) {
ratio=((double)anim.checkpoint-ln_checkpoint.getValue())/ln_checkpoint.getValue();
x=(int)(ratio*(neighbor(n1).getX()-this.getX()) + this.getX());
y=(int)(ratio*(neighbor(n1).getY()-this.getY()) + this.getY());
}
else {
ratio=((double)anim.checkpoint)/ln_checkpoint.getValue();
x=(int)(ratio*(this.getX()-neighbor(n0).getX()) + neighbor(n0).getX());
y=(int)(ratio*(this.getY()-neighbor(n0).getY()) + neighbor(n0).getY());
}
g.setColor(ANIM_NEIGHBOR_COL[anim.neighbor_index]);
if(isZooming)
g.fillRect((int)(x*zoomFactor-3),(int)(y*zoomFactor-3),6,6);
else
g.fillRect(x-3,y-3,6,6);
}
}
////////////////////// SimCommand services ///////////////////////
public void analyzerUp(Analyzer a) {
analyzer=a;
}
public void analyzerDown(Analyzer a) {
analyzer=null;
}
public SimCommand querySimCommand(int selectedCount) {
if(selectedCount==1) { //only allow one at a time...
if(analyzer!=null) return analyzer;
return new Analyzer(this,this);
}
else return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -