001 public class NodeToHemisson { 002 public static String TURN_RIGHT = "3,227"; //turns 90 degrees to the right, with offset 003 public static String TURN_LEFT = "4,227"; //turns 90 degrees to the left, with offset 004 public static String RESET = "5"; //reset after encountering line 005 public static String MOVE_FORWARD = "6"; //moves 1 sec/11.5 cm forwards 006 public static String MOVE_BACKWARD = "7"; //moves 1 sec/11.5 cm backwards 007 public static String LINE_TRESHOLD = "8,F"; //set black line treshold 008 public static String MOVE_HALF_BACKWARD = "9,255"; //move specified time back 009 public static String MOVE_HALF_BACKWARD_OFFSET = "9,200"; //move specified time back 010 011 /** 012 * Actually moves the Hemisson from one node to another 013 * @return the orientation after the move 014 * @param nStart The start Node 015 * @param nGoal The Goal Node 016 * @param nOrientation The initial orientation 017 */ 018 public static int run(Node nStart, Node nGoal, int iOrientation){ 019 int iDirection = 0; 020 if(nGoal.getY() > nStart.getY()){iDirection = 0;} 021 if(nGoal.getX() > nStart.getX()){iDirection = 1;} 022 if(nGoal.getY() < nStart.getY()){iDirection = 2;} 023 if(nGoal.getX() < nStart.getX()){iDirection = 3;} 024 025 if((iOrientation % 2) != (iDirection % 2)){ 026 if(((iDirection - iOrientation) == -3) || ((iDirection - iOrientation) == 1)){ 027 moveHemisson(TURN_RIGHT); 028 } else { 029 moveHemisson(TURN_LEFT); 030 } 031 iOrientation = iDirection; 032 } 033 034 if(iOrientation == iDirection){ 035 moveHemisson(MOVE_FORWARD); 036 }else{ 037 moveHemisson(MOVE_BACKWARD); 038 } 039 return iOrientation; 040 } 041 /** 042 * moveHemisson send the String commands to the class Hemisson and waits. 043 * @return true if a white line was encountered by the Hemisson Robot 044 * @param sMove a string with a move 045 */ 046 public static boolean moveHemisson(String sMove){ 047 int iSleep; 048 049 if(sMove == TURN_RIGHT || sMove == TURN_LEFT || sMove == MOVE_HALF_BACKWARD || sMove == MOVE_HALF_BACKWARD_OFFSET){ 050 iSleep = Integer.parseInt(sMove.substring(2,5)); 051 Hemisson.write(sMove.substring(0,1) + "," + Integer.toHexString(iSleep).toUpperCase()); 052 } else if(sMove == MOVE_FORWARD || sMove == MOVE_BACKWARD){ 053 iSleep = 1000; 054 Hemisson.write(sMove + ",FF"); 055 } else { 056 iSleep = 0; 057 Hemisson.write(sMove); 058 } 059 060 String input =""; 061 062 long lStart = System.currentTimeMillis(); 063 while((System.currentTimeMillis() - lStart) < iSleep/10){ 064 input += Hemisson.read(); 065 } 066 if(input.indexOf('F') != -1){ 067 System.out.println("Encountered line"); 068 return true; 069 } else { 070 System.out.println("Free"); 071 return false; 072 } 073 074 } 075 }