📄 merge-scen
字号:
#!/usr/bin/perl -w################################################################### Merge scenario files together to form a larger scenario.# Output is written to stdout## Assumptions:# 1. Scenario files are sorted by ascending order of time # stamps of events.# This is only neccesary when ad-hockey is used.# 2. Optimal routes are not needed in the merged scenario,# even it may be produced by setdest or other tools.# Note:# 1. ad-hockey needs some comment lines in order to behave # properly.# some of these comment lines are already taken care of,# but some of them may still need to be modified manually # after merging.############################################################################################ Global Variables#########################my $MaxX=0; # Max Xmy $MaxY=0; # Max Ymy $MaxSpeed=0; # Max Speedmy $MaxTime=0; # Max simulation timemy $PAUSE=0.0; # Pause Timemy $NN=0; # Number of nodes read so farmy $MaxNodeID=0; # Max of all IDs of nodes read so farmy @InitPos; # Initial position of nodesmy @MoveSrc; # first Node movementsmy @MoveDes; # second Node movements#my @MergedMove; # Merged movementsmy @Comments; # Comment lines needed by ad-hockey################################################################### Read the Scenario file # $_[0] -- reference to the hash to put the lines# $_[1] -- name of scenario file##################################################################sub readScen{ my ($move) = $_[0]; my ($SCEN) = $_[1]; my ($time, $nodeID, $toX, $toY, $speed, $nn, $maxX, $maxY); my ($maxTime) = 0; if (!open(SCEN,"<$SCEN")) { print "Can't read scenario file $SCEN\n"; return -1; } while(<SCEN>) { my $line = $_; if (/at (\d+\.\d+|\d+) .*node_\((\d+)\) setdest (\d+.\d+) (\d+.\d+) (\d+.\d+)/) { # movement set lines like # $ns_ at 825.29 "$node_(4) setdest 318.756 257.1639283 1.00000000" $time = $1; $nodeID = $2; $toX = $3; $toY = $4; $speed = $5; ($time > $maxTime) && ($maxTime = $time); # update node ID $nodeID += $NN; $line =~ s/node_\(\d+\)/node_\($nodeID\)/; #print "$line"; # store the line push @$move,$line; #$$move[++$#{$move}] = $line; # update max node ID to calculate the number of nodes so far $MaxNodeID = ($nodeID > $MaxNodeID) ? $nodeID : $MaxNodeID; } elsif (/^.node_\((\d+)\) set ([XY]). (\d+\.\d+|\d+)/) { # $node_(7) set X_ 0.0000000 $nodeID = $1; # update node ID $nodeID += $NN; $line =~ s/node_\(\d+\)/node_\($nodeID\)/; #print "$line"; # store the line unshift @InitPos,$line; } elsif (/nodes: (\d+), max time: (\d+.\d+), max x: (\d+.\d+), max y: (\d+.\d+)/) { # new style lines # # nodes: 50, max time: 900.00, max x: 1500.00, max y: 300.00 $nn = $1; ($2 > $maxTime) && ($maxTime = $2); $maxX = $3; $maxY = $4; } elsif (/nodes: (\d+),.*max x = (\d+.\d+), max y: (\d+.\d+)/) { # old style lines # # nodes: 50, pause: 30.00, max speed: 1.00 max x = 1500.00, max y: 300.00 $nn = $1; $maxX = $2; $maxY = $3; } elsif (/nominal range: (\d+.\d+) link bw: (\d+.\d+)/) { ## nominal range: 250.0 link bw: 2000000.00 push @Comments,$line; } elsif (/comm pattern: ([---\w_\#\.]+)/) { ## comm pattern: comm-123 push @Comments,$line; } elsif (/background bitmap: ([---\w_\#\.]+) (\d+) (\d+)/) { ## background bitmap: site.xbm 430 540 push @Comments,$line; } } # end of while close(SCEN); # Update global variables $NN = $MaxNodeID; ($maxX > $MaxX) && ($MaxX = $maxX); ($maxY > $MaxY) && ($MaxY = $maxY); ($maxTime > $MaxTime) && ($MaxTime = $maxTime); return 1;}############################################################## merge# Merges all the movements together.# Assume that all scenario files are sorted by ascending# order of the event time.#############################################################sub merge{ my ($i, $j, $k); # indices my ($time1, $time2); $i = 0; $j = 0; while ($i <= $#MoveSrc and $j <= $#MoveDes) {#print "Entering wile loop: $i, $j\n"; $MoveSrc[$i] =~ /at (\d+\.\d+|\d+) .*node_\((\d+)\) setdest (\d+.\d+) (\d+.\d+) (\d+.\d+)/; $time1 = $1; $MoveDes[$j] =~ /at (\d+\.\d+|\d+) .*node_\((\d+)\) setdest (\d+.\d+) (\d+.\d+) (\d+.\d+)/; $time2 = $1; if ($time1 <= $time2) { print $MoveSrc[$i]; $i++; } else { print $MoveDes[$j]; $j++; } } # end of while if ($i <= $#MoveSrc) { for ($k = $i; $k <= $#MoveSrc; $k++) { print $MoveSrc[$k]; } } else { for ($k = $j; $k <= $#MoveDes; $k++) { print $MoveDes[$k]; } } }################################################### generateComments# generates comment lines of node info # as needed by ad-hockey##################################################sub generateComments{ # use the "new style" push @Comments,"# nodes: $NN, max time: $MaxTime, max x: $MaxX, max y: $MaxY\n";}###################### printUsage#####################sub printUsage { print STDERR "Usage: $0 <senario file 1> <senario file 2>\n";}######################### Main ########################if ($#ARGV == -1) { printUsage(); exit(0);} readScen(\@MoveSrc, $ARGV[0]);readScen(\@MoveDes, $ARGV[1]);generateComments();print @Comments; # entries here may need to be manually justifiedprint reverse @InitPos;merge();#print "Number of element in MoveSrc: $#MoveSrc\n";#print "Number of element in MoveDes: $#MoveDes\n";#print "Number of element in InitPos: $#InitPos\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -