Advertisement
Guest User

Untitled

a guest
Sep 16th, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.82 KB | None | 0 0
  1. import java.util.Random;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. import TSim.CommandException;
  7. import TSim.SensorEvent;
  8. import TSim.TSimInterface;
  9.  
  10. public class Lab2 {
  11.     private static int sim_speed;
  12.     private static final int MAXSPEED = 15;
  13.     private static TrackMonitor[] tracks;
  14.     private TSimInterface tsi;
  15.  
  16.     public static void main(String[] args){
  17.         new Lab2(args);
  18.     }
  19.  
  20.     public Lab2(String[] args) {
  21.         // Create all the track monitors
  22.         tracks = new TrackMonitor[]{
  23.                 new TrackMonitor(new Pos[]{new Pos(1,1),new Pos(2,2)},new Pos[]{new Pos(1,1),new Pos(2,2)},new Switch(1,1,1)),
  24.                 new TrackMonitor(new Pos[]{new Pos(1,1),new Pos(2,2)},new Pos[]{new Pos(1,1),new Pos(2,2)},new Switch(1,1,1)),
  25.                 new TrackMonitor(new Pos[]{new Pos(1,1),new Pos(2,2)},new Pos[]{new Pos(1,1),new Pos(2,2)},new Switch(1,1,1)),
  26.                 new TrackMonitor(new Pos[]{new Pos(1,1),new Pos(2,2)},new Pos[]{new Pos(1,1),new Pos(2,2)},new Switch(1,1,1)),
  27.                 new TrackMonitor(new Pos[]{new Pos(1,10)},new Pos[]{new Pos(19,8)},new Switch(4,9,tsi.SWITCH_LEFT)),
  28.                 new TrackMonitor(new Pos[]{new Pos(4,13),new Pos(6,11)},new Pos[]{new Pos(7,9)},new Switch(4,9,tsi.SWITCH_LEFT)),
  29.                 new TrackMonitor(new Pos[]{new Pos(4,13),new Pos(6,11)},new Pos[]{new Pos(6,10)},new Switch(4,9,tsi.SWITCH_RIGHT)),
  30.                 new TrackMonitor(new Pos[]{new Pos(1,10)},new Pos[]{new Pos(6,11)},new Switch(3,11,tsi.SWITCH_LEFT)),
  31.                 new TrackMonitor(new TrackPiece[]{new TrackPiece(new Pos(4,13),new Switch(3,11,tsi.SWITCH_RIGHT)),new TrackPiece(new Pos(6,11),new Switch(3,11,tsi.SWITCH_LEFT))},
  32.                         new TrackPiece[]{new TrackPiece(new Pos(6,10),new Switch(4,9,tsi.SWITCH_RIGHT)),new TrackPiece(new Pos(7,9),new Switch(4,9,tsi.SWITCH_LEFT))})         
  33.         };
  34.        
  35.         // Test if speeds for the trains are set, if not randomize a number between 1 and MAXSPEED
  36.         Random random = new Random();
  37.         if(args.length == 0){
  38.             args = new String[1];
  39.             args[0] = ""+(random.nextInt(14)+1);
  40.         }
  41.         if(args.length <= 1){
  42.             String [] temp = args.clone();
  43.             args = new String[args.length + 1];
  44.             System.arraycopy(temp, 0, args, 0, temp.length);
  45.             args[1] = ""+(random.nextInt(14)+1);
  46.         }
  47.         // Test if sim speed has been given, if not default it to 100.
  48.         if(args.length <= 2){
  49.             this.sim_speed = 100;
  50.         }
  51.         else{
  52.             this.sim_speed = Integer.parseInt(args[2]);
  53.         }
  54.         System.err.println(args[0]);
  55.         System.err.println(args[1]);
  56.         System.err.println(sim_speed);
  57.        
  58.         Train train1 = new Train(args[0], 1);
  59.         Train train2 = new Train(args[1], 2);
  60.         (new Thread(train1)).start();
  61.         (new Thread(train2)).start();
  62.     }
  63.    
  64.     public class Train implements Runnable {
  65.         private int speed, trainId;
  66.        
  67.  
  68.         public Train(String speed, int trainId) {
  69.             this.speed = Integer.parseInt(speed);
  70.             this.trainId = trainId;
  71.             this.tsi = TSimInterface.getInstance();
  72.         }
  73.  
  74.         public void run(){
  75.             try{
  76.                 tsi.setSpeed(trainId, speed);
  77.                 SensorEvent e;
  78.                
  79.                 while(true){
  80.                     e = tsi.getSensor(trainId);
  81.                    
  82.                     for(int i = 0;i<tracks.length;i++){
  83.                         Boolean bool = false;
  84.                         for(int j=0;j<tracks[i].tp1.length;i++){
  85.                             if(tracks[i].tp1[j].p.x == e.getXpos() && tracks[i].tp1[j].p.y == e.getYpos()){
  86.                                 bool = true;
  87.                             }
  88.                         }
  89.                         for(int j=0;j<tracks[i].tp2.length;i++){
  90.                             if(tracks[i].tp2[j].p.x == e.getXpos() && tracks[i].tp2[j].p.y == e.getYpos()){
  91.                                 bool = true;
  92.                             }
  93.                         }
  94.                        
  95.                         if(bool){
  96.                             if(tracks[i].tryEnter(e, trainId)){
  97.                             }
  98.                             else{
  99.                                 // Double track
  100.                                 if(i == 1 || i == 3 ||i == 5){
  101.                                     tracks[i+1].tryEnter(e, trainId);
  102.                                 }
  103.                                
  104.                                 // Set lower speed
  105.                                 tsi.setSpeed(trainId, 0);
  106.                                 tracks[i].enter(e, trainId);
  107.                                 tsi.setSpeed(trainId, speed);
  108.                             }
  109.                         }
  110.                        
  111.                         tracks[i].leave(e, trainId);
  112.                     }
  113.                 }
  114.             } catch (CommandException | InterruptedException e) {
  115.                 e.printStackTrace(); // or only e.getMessage() for the error
  116.                 System.exit(1);
  117.             }
  118.         }  
  119.     }
  120.    
  121.     public class Pos{
  122.         protected int x,y;
  123.        
  124.         public Pos(int x, int y){
  125.             this.x = x;
  126.             this.y = y;
  127.         }
  128.     }
  129.     public class Switch extends Pos{
  130.         private int switchDir;
  131.        
  132.         public Switch(int x, int y, int switchDir){
  133.             super(x,y);
  134.             this.switchDir = switchDir;
  135.         }
  136.     }
  137.    
  138.     public class TrackPiece{
  139.         private Pos p;
  140.         private Switch sw;
  141.        
  142.         public TrackPiece(Pos p, Switch sw){
  143.             this.p = p;
  144.             this.sw = sw;
  145.         }
  146.     }
  147.  
  148.     public class TrackMonitor{
  149.         private Lock l = new ReentrantLock();
  150.         private Condition enter = l.newCondition();
  151.         private TrackPiece[] tp1, tp2;
  152.         private Boolean trackBusy, enteredOn1;
  153.         private int trainId;
  154.        
  155.         public TrackMonitor(TrackPiece[] tp1, TrackPiece[] tp2){
  156.             this.tp1 = tp1;
  157.             this.tp2 = tp2;
  158.             trackBusy = false;
  159.             enteredOn1 = false; // Used to keep track on which direction the train entered the monitor.
  160.         }
  161.        
  162.         public Boolean tryEnter(SensorEvent e, int trainId) throws InterruptedException, CommandException{
  163.             if(!trackBusy){
  164.                 l.lock();
  165.                 enter(e, trainId);
  166.                 l.unlock();
  167.                 return true;
  168.             }
  169.            
  170.             return false;
  171.         }
  172.        
  173.         public void enter(SensorEvent e, int trainId) throws InterruptedException, CommandException{
  174.             l.lock();
  175.             try{
  176.                 Boolean canEnter = false;
  177.                 int trackId;
  178.                
  179.                 for(int i=0;i<tp1.length;i++){
  180.                     if(tp1[i].p.x == e.getXpos() && tp1[i].p.y == e.getYpos()){
  181.                         enteredOn1 = true;
  182.                         canEnter = true;
  183.                         trackId = i;
  184.                     }
  185.                 }
  186.                 for(int i=0;i<tp2.length;i++){
  187.                     if(tp2[i].p.x == e.getXpos() && tp2[i].p.y == e.getYpos()){
  188.                         enteredOn1 = false;
  189.                         canEnter = true;
  190.                         trackId = i;
  191.                     }
  192.                 }
  193.                
  194.                 if(canEnter){
  195.                     while(trackBusy){
  196.                         enter.await();
  197.                     }
  198.                     this.trainId = trainId;
  199.                     trackBusy = true;
  200.                     // Switch the switch
  201.                     if(enteredOn1 && tp1[trackId].sw != null){
  202.                         TSimInterface.getInstance().setSwitch(tp1[trackId].sw.x, tp1[trackId].sw.y, tp1[trackId].sw.switchDir);
  203.                     }
  204.                     else if(!enteredOn1 && tp2[trackId].sw != null){
  205.                         TSimInterface.getInstance().setSwitch(tp2[trackId].sw.x, tp2[trackId].sw.y, tp2[trackId].sw.switchDir);
  206.                     }
  207.                 }
  208.             } finally{
  209.                 l.unlock();
  210.             }
  211.         }
  212.        
  213.         public void leave(SensorEvent e, int trainId) throws CommandException{
  214.             l.lock();
  215.             try{
  216.                 if(enteredOn1){
  217.                     for(int i=0;i<tp2.length;i++){
  218.                         if(e.getXpos() == tp2[i].p.x && e.getYpos() == tp2[i].p.y && trackBusy && this.trainId == trainId){
  219.                             trackBusy = false;
  220.                             enter.signal();
  221.                         }
  222.                     }
  223.                 }
  224.                 else{
  225.                     for(int i=0;i<tp1.length;i++){
  226.                         if(e.getXpos() == tp1[i].p.x && e.getYpos() == tp1[i].p.y && trackBusy && this.trainId == trainId){
  227.                             trackBusy = false;
  228.                             enter.signal();
  229.                         }
  230.                     }
  231.                 }
  232.             } finally{
  233.                 l.unlock();
  234.             }
  235.         }
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement