Advertisement
Guest User

Untitled

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