actual final state, removing compiled files
This commit is contained in:
		
							parent
							
								
									66c80162ed
								
							
						
					
					
						commit
						92504f7d92
					
				
					 11 changed files with 499 additions and 116 deletions
				
			
		
							
								
								
									
										11
									
								
								.project
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								.project
									
									
									
									
									
								
							|  | @ -14,4 +14,15 @@ | ||||||
| 	<natures> | 	<natures> | ||||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||||
| 	</natures> | 	</natures> | ||||||
|  | 	<filteredResources> | ||||||
|  | 		<filter> | ||||||
|  | 			<id>1714702259358</id> | ||||||
|  | 			<name></name> | ||||||
|  | 			<type>30</type> | ||||||
|  | 			<matcher> | ||||||
|  | 				<id>org.eclipse.core.resources.regexFilterMatcher</id> | ||||||
|  | 				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments> | ||||||
|  | 			</matcher> | ||||||
|  | 		</filter> | ||||||
|  | 	</filteredResources> | ||||||
| </projectDescription> | </projectDescription> | ||||||
|  |  | ||||||
							
								
								
									
										73
									
								
								Climate.java
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								Climate.java
									
									
									
									
									
								
							|  | @ -1,13 +1,36 @@ | ||||||
| //for all arrays, index 0 is driver's side, index 1 is passenger's side | //for all arrays, index 0 is driver's side, index 1 is passenger's side | ||||||
| 
 | 
 | ||||||
| public class Climate { | public class Climate implements Runnable { | ||||||
|     private int[] targetTemp; //array to store temp preference entered by user |     private int[] targetTemp = new int[2]; //array to store temp preference entered by user | ||||||
|     private int[] currentTemp; //stores current internal temp from last check |     private int[] currentTemp = new int[2]; //stores current internal temp from last check | ||||||
|     private int externalTemp; //stores current external temp from last check |     private int externalTemp; //stores current external temp from last check | ||||||
|     private boolean[] coolingActive; //whether cooling is toggled on (true) or off (false) |     private boolean[] coolingActive = new boolean[2]; //whether cooling is toggled on (true) or off (false) | ||||||
|     private boolean[] heatingActive; //whether heating is toggled on (true) or off (false) |     private boolean[] heatingActive = new boolean[2]; //whether heating is toggled on (true) or off (false) | ||||||
|     public enum fanLevels {OFF, LOW, MED, HI}; //standardization of fan levels |     public enum fanLevels {OFF, LOW, MED, HI}; //standardization of fan levels | ||||||
|     fanLevels[] fanSpeed; //array to store fan speeds, zones match temp indices |     fanLevels[] fanSpeed = new fanLevels[2];; //array to store fan speeds, zones match temp indices | ||||||
|  | 
 | ||||||
|  |     public void run() { | ||||||
|  |     	while (currentTemp[0] != targetTemp[0] || currentTemp[1] != targetTemp[1]) { | ||||||
|  |     		displayInformation(); | ||||||
|  |     		activateClimate(); | ||||||
|  |     		adjustClimate(0); | ||||||
|  |     		adjustClimate(1); | ||||||
|  |     		HelperFunctions.sleep(1); | ||||||
|  |     	} | ||||||
|  |     	System.out.println("Climate adjustment complete"); | ||||||
|  |     	HelperFunctions.pressEnterToContinue(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public Climate() { | ||||||
|  |     	targetTemp = new int[2]; | ||||||
|  |     	currentTemp = new int[2]; | ||||||
|  |     	targetTemp[0] = 72; | ||||||
|  |     	targetTemp[1] = 74; | ||||||
|  |     	updateCurrentTemps(); | ||||||
|  |     	fanSpeed = new fanLevels[2]; | ||||||
|  |     	fanSpeed[0] = fanLevels.LOW; | ||||||
|  |     	fanSpeed[1] = fanLevels.LOW; | ||||||
|  |     } | ||||||
|      |      | ||||||
|     public void setTargetTemp(int driverZone, int passengerZone) { |     public void setTargetTemp(int driverZone, int passengerZone) { | ||||||
|         //temp range should be between 65 F and 90 F, these if statements prohibit temps outside that range |         //temp range should be between 65 F and 90 F, these if statements prohibit temps outside that range | ||||||
|  | @ -39,15 +62,12 @@ public class Climate { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void activateClimate() { |     public void activateClimate() { | ||||||
|         updateCurrentTemps(); //check current temps before actioning logic |  | ||||||
|         if (externalTemp >= avgTargetTemp()) { //puts logic into "cooling" mode |  | ||||||
|         //driver's side |         //driver's side | ||||||
|         if (targetTemp[0]+1 < currentTemp[0]) {coolingActive[0] = true;} //provides 1 deg buffer to prevent excessive activation/deactivation |         if (targetTemp[0]+1 < currentTemp[0]) {coolingActive[0] = true;} //provides 1 deg buffer to prevent excessive activation/deactivation | ||||||
|         if (targetTemp[0] >= currentTemp[0]) {coolingActive[0] = false;} |         if (targetTemp[0] >= currentTemp[0]) {coolingActive[0] = false;} | ||||||
|         //passenger's side |         //passenger's side | ||||||
|         if (targetTemp[1]+1 < currentTemp[1]) {coolingActive[1] = true;} |         if (targetTemp[1]+1 < currentTemp[1]) {coolingActive[1] = true;} | ||||||
|         if (targetTemp[1] >= currentTemp[1]) {coolingActive[1] = false;} |         if (targetTemp[1] >= currentTemp[1]) {coolingActive[1] = false;} | ||||||
|         } else if (externalTemp < avgTargetTemp()) { //puts logic into "heating" mode |  | ||||||
|         //driver's side |         //driver's side | ||||||
|         if (targetTemp[0]-1 > currentTemp[0]) {heatingActive[0] = true;} |         if (targetTemp[0]-1 > currentTemp[0]) {heatingActive[0] = true;} | ||||||
|         if (targetTemp[0] <= currentTemp[0]) {heatingActive[0] = false;} |         if (targetTemp[0] <= currentTemp[0]) {heatingActive[0] = false;} | ||||||
|  | @ -55,36 +75,44 @@ public class Climate { | ||||||
|         if (targetTemp[1]-1 > currentTemp[1]) {heatingActive[1] = true;} |         if (targetTemp[1]-1 > currentTemp[1]) {heatingActive[1] = true;} | ||||||
|         if (targetTemp[1] <= currentTemp[1]) {heatingActive[1] = false;} |         if (targetTemp[1] <= currentTemp[1]) {heatingActive[1] = false;} | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     private void adjustClimate(int zone) { | ||||||
|  |     	if (coolingActive[zone]) { | ||||||
|  |     		currentTemp[zone] = currentTemp[zone] - 1; | ||||||
|  |     	} | ||||||
|  |     	if (heatingActive[zone]) { | ||||||
|  |     		currentTemp[zone] = currentTemp[zone] + 1; | ||||||
|  |     	} | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void setFanSpeeds(String driver, String passenger) { //maps a string passed in to the appropriate enum value |     public void setFanSpeeds(String driver, String passenger) { //maps a string passed in to the appropriate enum value | ||||||
|         switch (driver) { |         switch (driver) { | ||||||
|             case "OFF": |             case "OFF": case "1": | ||||||
|                 fanSpeed[0] = fanLevels.OFF; |                 fanSpeed[0] = fanLevels.OFF; | ||||||
|                 break; |                 break; | ||||||
|             case "LOW": |             case "LOW": case "2": | ||||||
|                 fanSpeed[0] = fanLevels.LOW; |                 fanSpeed[0] = fanLevels.LOW; | ||||||
|                 break; |                 break; | ||||||
|             case "MED": |             case "MED": case "3": | ||||||
|                 fanSpeed[0] = fanLevels.MED; |                 fanSpeed[0] = fanLevels.MED; | ||||||
|                 break; |                 break; | ||||||
|             case "HI": |             case "HI": case "4": | ||||||
|                 fanSpeed[0] = fanLevels.HI; |                 fanSpeed[0] = fanLevels.HI; | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         switch (passenger) { |         switch (passenger) { | ||||||
|             case "OFF": |             case "OFF": case "1": | ||||||
|                 fanSpeed[1] = fanLevels.OFF; |                 fanSpeed[1] = fanLevels.OFF; | ||||||
|                 break; |                 break; | ||||||
|             case "LOW": |             case "LOW": case "2": | ||||||
|                 fanSpeed[2] = fanLevels.LOW; |                 fanSpeed[1] = fanLevels.LOW; | ||||||
|                 break; |                 break; | ||||||
|             case "MED": |             case "MED": case "3": | ||||||
|                 fanSpeed[3] = fanLevels.MED; |                 fanSpeed[1] = fanLevels.MED; | ||||||
|                 break; |                 break; | ||||||
|             case "HI": |             case "HI": case "4": | ||||||
|                 fanSpeed[4] = fanLevels.HI; |                 fanSpeed[1] = fanLevels.HI; | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -93,4 +121,9 @@ public class Climate { | ||||||
|         String[] workingString = {fanSpeed[0].toString(), fanSpeed[1].toString()}; |         String[] workingString = {fanSpeed[0].toString(), fanSpeed[1].toString()}; | ||||||
|         return workingString; |         return workingString; | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     private void displayInformation() { | ||||||
|  |     	System.out.print("Left | Current: " + currentTemp[0] + "; Set: " + targetTemp[0] + " || "); | ||||||
|  |         System.out.print("Right| Current: " + currentTemp[1] + "; Set: " + targetTemp[1] + "\n"); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,12 +0,0 @@ | ||||||
| STRAIGHT;0.2;20;0.00 |  | ||||||
| LEFT;0.044;20;0.00 |  | ||||||
| LEFT;0.1;35;0.00 |  | ||||||
| LEFT;3.0;45;0.00 |  | ||||||
| RIGHT;2.3;50;0.00 |  | ||||||
| LEFT;0.3;50;0.00 |  | ||||||
| STRAIGHT;9.6;70;0.00 |  | ||||||
| STRAIGHT;0.3;50;0.00 |  | ||||||
| RIGHT;0.2;35;0.00 |  | ||||||
| LEFT;0.2;35;0.00 |  | ||||||
| LEFT;0.4;35;0.00 |  | ||||||
| RIGHT;0.08;20;0.00 |  | ||||||
							
								
								
									
										12
									
								
								DrivingRoute1.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								DrivingRoute1.txt
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | STRAIGHT;0.2;20;0.00;EFSC Melbourne Campus | ||||||
|  | LEFT;0.044;20;0.00;EFSC Melbourne Campus | ||||||
|  | LEFT;0.1;35;0.00;Post Rd. WEST | ||||||
|  | LEFT;3.0;45;0.00;Wickham Rd. SOUTH | ||||||
|  | RIGHT;2.3;50;0.00;Eau Gallie Blvd. WEST | ||||||
|  | LEFT;0.3;50;0.00;I-95 SOUTH Onramp | ||||||
|  | STRAIGHT;9.6;70;0.00;I-95 SOUTH | ||||||
|  | STRAIGHT;0.3;50;0.00;Malabar Rd. Exit Ramp | ||||||
|  | RIGHT;0.2;35;0.00;Malabar Rd. WEST | ||||||
|  | LEFT;0.2;35;0.00;San Filippo Dr. SOUTH | ||||||
|  | LEFT;0.4;35;0.00;Community College Pkwy. EAST | ||||||
|  | RIGHT;0.08;20;0.00;EFSC Palm Bay Campus | ||||||
							
								
								
									
										7
									
								
								DrivingRoute2.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								DrivingRoute2.txt
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | STRAIGHT;0.2;20;0.00;EFSC Melbourne Campus | ||||||
|  | LEFT;0.044;20;0.00;EFSC Melbourne Campus | ||||||
|  | RIGHT;1.4;35;0.00;Post Rd. EAST | ||||||
|  | RIGHT;4.4;50;0.00;US-1 SOUTH | ||||||
|  | RIGHT;9.2;50;0.00;Babcock St. SOUTH | ||||||
|  | RIGHT;1.1;35;0.00;Community College Pkwy. WEST | ||||||
|  | LEFT;0.01;20;0.00;EFSC Palm Bay Campus | ||||||
|  | @ -2,9 +2,14 @@ import java.lang.Class; | ||||||
| 
 | 
 | ||||||
| public class Entertainment { | public class Entertainment { | ||||||
|     public String activeMediaSource; |     public String activeMediaSource; | ||||||
|     public String[] nowPlayingMetadata; |     public String nowPlayingMetadata; | ||||||
|     public boolean playState; //true for playing, false for paused   |     public boolean playState; //true for playing, false for paused   | ||||||
|      |      | ||||||
|  |     public Entertainment() { | ||||||
|  |     	activeMediaSource = ""; | ||||||
|  |     	nowPlayingMetadata = ""; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public Entertainment(String[] sourceParams) { //loads previously played media source at instantiation, Vehicle class handles storing data |     public Entertainment(String[] sourceParams) { //loads previously played media source at instantiation, Vehicle class handles storing data | ||||||
|             selectSource(sourceParams[0], sourceParams[1]); |             selectSource(sourceParams[0], sourceParams[1]); | ||||||
|     } |     } | ||||||
|  | @ -13,10 +18,10 @@ public class Entertainment { | ||||||
|         //source is a string selection from RADIO, USB, AUX, BLUETOOTH |         //source is a string selection from RADIO, USB, AUX, BLUETOOTH | ||||||
|         //params are a delimited string with a URI and metadata |         //params are a delimited string with a URI and metadata | ||||||
|         activeMediaSource = source; |         activeMediaSource = source; | ||||||
|         nowPlayingMetadata = params.split(";", 0); |         nowPlayingMetadata = params; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public String[] getMetadata() { |     public String getMetadata() { | ||||||
|         return nowPlayingMetadata; |         return nowPlayingMetadata; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ import java.util.Vector; | ||||||
| import java.nio.file.Paths; | import java.nio.file.Paths; | ||||||
| import java.util.Scanner; | import java.util.Scanner; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  | import java.util.concurrent.*;  | ||||||
| 
 | 
 | ||||||
| //a collection of helper functions to act as responses for otherwise | //a collection of helper functions to act as responses for otherwise | ||||||
| //external calls in this implementation for demo purposes | //external calls in this implementation for demo purposes | ||||||
|  | @ -26,13 +27,34 @@ public class HelperFunctions { | ||||||
|     public Vector<String[]> routingAPI(double[] startCoords, String destinationAddress, Boolean tollsFlag, Boolean hwyFlag) { |     public Vector<String[]> routingAPI(double[] startCoords, String destinationAddress, Boolean tollsFlag, Boolean hwyFlag) { | ||||||
|         //method simulates a call to translate two pairs of coords into a driving route |         //method simulates a call to translate two pairs of coords into a driving route | ||||||
|         //for demo purposes returns a pregenerated set of move instructions |         //for demo purposes returns a pregenerated set of move instructions | ||||||
|         //located in DrivingRoute.txt as semicolon delimited strings for direction, distance, and speedLimit |         //located in DrivingRoute<X>.txt as semicolon delimited strings for direction, distance, and speedLimit | ||||||
|         Vector<String[]> routeArray = new Vector<String[]>(); |         Vector<String[]> routeArray = new Vector<String[]>(); | ||||||
|         if (tollsFlag && hwyFlag) { //provides a result that both avoid tolls and major highways |         if (tollsFlag && hwyFlag) { //provides a result that both avoid tolls and major highways | ||||||
|  |         	try (Scanner infile = new Scanner(Paths.get("DrivingRoute2.txt"))) { | ||||||
|  |                 while (infile.hasNext()) { | ||||||
|  |                     routeArray.addElement(infile.nextLine().split(";")); | ||||||
|  |                 } | ||||||
|  |             } catch (IOException e) { | ||||||
|  |                 System.err.println("File handling error"); | ||||||
|  |             } | ||||||
|         } else if (tollsFlag && !hwyFlag) { //provides a result that avoids tolls but not major highways |         } else if (tollsFlag && !hwyFlag) { //provides a result that avoids tolls but not major highways | ||||||
|  |         	try (Scanner infile = new Scanner(Paths.get("DrivingRoute1.txt"))) { | ||||||
|  |                 while (infile.hasNext()) { | ||||||
|  |                     routeArray.addElement(infile.nextLine().split(";")); | ||||||
|  |                 } | ||||||
|  |             } catch (IOException e) { | ||||||
|  |                 System.err.println("File handling error"); | ||||||
|  |             } | ||||||
|         } else if (!tollsFlag && hwyFlag) { //provides a result that does not avoid tolls and does avoid major highways |         } else if (!tollsFlag && hwyFlag) { //provides a result that does not avoid tolls and does avoid major highways | ||||||
|  |         	try (Scanner infile = new Scanner(Paths.get("DrivingRoute2.txt"))) { | ||||||
|  |                 while (infile.hasNext()) { | ||||||
|  |                     routeArray.addElement(infile.nextLine().split(";")); | ||||||
|  |                 } | ||||||
|  |             } catch (IOException e) { | ||||||
|  |                 System.err.println("File handling error"); | ||||||
|  |             } | ||||||
|         } else if (!tollsFlag && !hwyFlag) { //provides a result that does not avoid tolls or major highways |         } else if (!tollsFlag && !hwyFlag) { //provides a result that does not avoid tolls or major highways | ||||||
|             try (Scanner infile = new Scanner(Paths.get("DrivingRoute.txt"))) { |             try (Scanner infile = new Scanner(Paths.get("DrivingRoute1.txt"))) { | ||||||
|                 while (infile.hasNext()) { |                 while (infile.hasNext()) { | ||||||
|                     routeArray.addElement(infile.nextLine().split(";")); |                     routeArray.addElement(infile.nextLine().split(";")); | ||||||
|                 } |                 } | ||||||
|  | @ -52,4 +74,16 @@ public class HelperFunctions { | ||||||
|     public int externalTempSensors() { |     public int externalTempSensors() { | ||||||
|         return 88; |         return 88; | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     public static void sleep(int time) { //helper function to sleep 1 second | ||||||
|  |     	try {TimeUnit.SECONDS.sleep(time);} //sleep for 1-15 second to simulate traffic light | ||||||
|  |         catch (InterruptedException e) {System.err.println("Sleep interrupted");} | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void pressEnterToContinue() {  | ||||||
|  |     	System.out.println("Press Enter key to continue..."); | ||||||
|  |         try { | ||||||
|  |         	System.in.read(); | ||||||
|  |         } catch(Exception e) {}   | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,3 +1,5 @@ | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  | 
 | ||||||
| public class RoadSensor { | public class RoadSensor { | ||||||
|     private boolean hazardDetected; //flag for whether a hazard is detected |     private boolean hazardDetected; //flag for whether a hazard is detected | ||||||
|     private String roadwayDetails; //stores road quality details, eg wet, uneven |     private String roadwayDetails; //stores road quality details, eg wet, uneven | ||||||
|  | @ -16,7 +18,7 @@ public class RoadSensor { | ||||||
|         return 45; |         return 45; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public int identifyHazard() { |     public static boolean identifyHazard() { | ||||||
|         //image processing algorithms from external cameras would |         //image processing algorithms from external cameras would | ||||||
|         //review data and identify a hazard |         //review data and identify a hazard | ||||||
|         //types of hazards could be |         //types of hazards could be | ||||||
|  | @ -25,17 +27,35 @@ public class RoadSensor { | ||||||
|         //lane closure |         //lane closure | ||||||
|         //pedestrian on roadway |         //pedestrian on roadway | ||||||
|         //stationary object on roadway |         //stationary object on roadway | ||||||
|         //for testing, this function will return 0 to signal no hazard detected |  | ||||||
|         //for testing purposes, this function will roll a 1/100 chance of detecting a hazard |         //for testing purposes, this function will roll a 1/100 chance of detecting a hazard | ||||||
|  |     	//and a value of 1 means a hazard was detected | ||||||
|     	double detection = Math.floor(Math.random()*100); |     	double detection = Math.floor(Math.random()*100); | ||||||
|     	if (detection == 1) { return 1; } |     	if (detection == 1) { return true; } | ||||||
|     	else { return 0; } |     	else { return false; } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     public int detectTrafficLight() { //rolls a 1 in 5 that a traffic light will be detected when approaching an intersection |     public static boolean detectTrafficLight() { //rolls a 1 in 5 that a traffic light will be detected when approaching an intersection | ||||||
|     	double detection = Math.floor(Math.random()*5); |     	double detection = Math.floor(Math.random()*5); | ||||||
|     	if (detection == 1) { return 1; } |     	if (detection == 1) { return true; } | ||||||
|     	else { return 0; } |     	else { return false; } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     public static int roadQuality(String type) { | ||||||
|  |     	//function to check road state | ||||||
|  |     	//for testing purposes, these checks are being separated | ||||||
|  |     	//so they can proc independently during a roadtrip | ||||||
|  |     	double rand = 0; | ||||||
|  |     	switch (type) { | ||||||
|  | 	    	case "WET": | ||||||
|  | 	    		rand = Math.floor(Math.random()*10); | ||||||
|  | 	    		if (rand == 1) {return 1;} | ||||||
|  | 	    		else {return 0;} | ||||||
|  | 	    	case "SURFACE": { | ||||||
|  | 	    		rand = Math.floor(Math.random()*20); | ||||||
|  | 	    		if (rand == 1) {return 1;} | ||||||
|  | 	    		else {return 0;} | ||||||
|  | 	    	} | ||||||
|  |     	} | ||||||
|  |     	return 1; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								Route.java
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								Route.java
									
									
									
									
									
								
							|  | @ -8,20 +8,19 @@ public class Route { | ||||||
|     private boolean hwyFlag; //stores user preference for whether to avoid major highways |     private boolean hwyFlag; //stores user preference for whether to avoid major highways | ||||||
|     public Vector<Double> timeEstimate; //time estimate in seconds |     public Vector<Double> timeEstimate; //time estimate in seconds | ||||||
|     public Vector<Double> tollsAmount; //stores toll amount if toll roads are used |     public Vector<Double> tollsAmount; //stores toll amount if toll roads are used | ||||||
|     private Destination currentDestination = new Destination(); |     public Destination currentDestination = new Destination(); | ||||||
|      |      | ||||||
|     public Route() { |     public Route() { | ||||||
|     	this.routeSequences = new Vector<Vector<String[]>>(); |     	this.routeSequences = new Vector<Vector<String[]>>(); | ||||||
|     	this.timeEstimate = new Vector<Double>(); |     	this.timeEstimate = new Vector<Double>(); | ||||||
|     	this.tollsAmount = new Vector<Double>(); |     	this.tollsAmount = new Vector<Double>(); | ||||||
|  |     	this.routeSelected = -1; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     public Route(String destination) { |     public Route(String destination) { | ||||||
|     	setRouteDestination(destination); |     	setRouteDestination(destination); | ||||||
|     	this.timeEstimate = new Vector<Double>(); |     	this.timeEstimate = new Vector<Double>(); | ||||||
|     	this.tollsAmount = new Vector<Double>(); |     	this.tollsAmount = new Vector<Double>(); | ||||||
|     	tollsFlag = false; |  | ||||||
|     	hwyFlag = false; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private void updateCurrentLocation() { |     private void updateCurrentLocation() { | ||||||
|  | @ -39,20 +38,26 @@ public class Route { | ||||||
|         updateCurrentLocation(); |         updateCurrentLocation(); | ||||||
|         HelperFunctions apiCallToRouting = new HelperFunctions(); |         HelperFunctions apiCallToRouting = new HelperFunctions(); | ||||||
|         //route option 1 |         //route option 1 | ||||||
|  |     	tollsFlag = false; | ||||||
|  |     	hwyFlag = false; | ||||||
|         routeSequences.add(apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationAddress(), tollsFlag, hwyFlag)); |         routeSequences.add(apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationAddress(), tollsFlag, hwyFlag)); | ||||||
|         timeEstimate.add(estimateTime(routeSequences.get(0))); |         timeEstimate.add(estimateTime(routeSequences.get(0))); | ||||||
|         tollsAmount.add(estimateTolls(routeSequences.get(0))); |         tollsAmount.add(estimateTolls(routeSequences.get(0))); | ||||||
|         //route option 2 |         //route option 2 | ||||||
|  |     	tollsFlag = false; | ||||||
|  |     	hwyFlag = true; | ||||||
|         routeSequences.add(apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationAddress(), tollsFlag, hwyFlag)); |         routeSequences.add(apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationAddress(), tollsFlag, hwyFlag)); | ||||||
|         timeEstimate.add(estimateTime(routeSequences.get(1))); |         timeEstimate.add(estimateTime(routeSequences.get(1))); | ||||||
|         tollsAmount.add(estimateTolls(routeSequences.get(1))); |         tollsAmount.add(estimateTolls(routeSequences.get(1))); | ||||||
|         //route option 3 |  | ||||||
|         routeSequences.add(apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationAddress(), tollsFlag, hwyFlag)); |  | ||||||
|         timeEstimate.add(estimateTime(routeSequences.get(2))); |  | ||||||
|         tollsAmount.add(estimateTolls(routeSequences.get(2))); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public int enumRoutes() { |     public String[] enumRoutes() { | ||||||
|  |         //for testing, values are hardcoded. Would generate headings based on route characteristics ideally | ||||||
|  |     	String[] routeNames = {"1. via I-95 SOUTH\n\tNo Tolls\n\tUses Highways", "2. via US-1 and Babcock St.\n\tNo Tolls\n\tAvoids Highways"}; | ||||||
|  |     	return routeNames; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public int countRoutesAvailable() { | ||||||
|     	return routeSequences.size(); |     	return routeSequences.size(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,15 +1,252 @@ | ||||||
| import java.util.Scanner; | import java.util.Scanner; | ||||||
| import java.util.concurrent.*;  |  | ||||||
| 
 | 
 | ||||||
| public class SelfDrivingRoadtrip { | public class SelfDrivingRoadtrip { | ||||||
|     public static void main(String[] args) { |     public static void main(String[] args) { | ||||||
|         Vehicle myVehicle = new Vehicle(); |         Vehicle myVehicle = new Vehicle(); | ||||||
|  |         Entertainment nowPlaying = new Entertainment(); | ||||||
|  |         Climate climate = new Climate(); | ||||||
|         Scanner userInput = new Scanner(System.in); |         Scanner userInput = new Scanner(System.in); | ||||||
|          |          | ||||||
|  |         int userSelection = -1; | ||||||
|  |         while (userSelection != 0) { | ||||||
|  |         	userSelection = -1; | ||||||
|  |         	 | ||||||
|  |         	System.out.print("\033[H\033[2J"); | ||||||
|  |         	//Show current destination on main menu | ||||||
|  |         	System.out.print("Current Destination: "); | ||||||
|  |         	if (myVehicle.currentRoute.currentDestination.getDestinationAddress() != null) { | ||||||
|  |         		System.out.print(myVehicle.currentRoute.currentDestination.getDestinationAddress() + "\n"); | ||||||
|  |         	} else {System.out.print("None Selected\n");} | ||||||
|  |         	 | ||||||
|  |         	//Show current route on main menu | ||||||
|  |         	System.out.print("Current Route: "); | ||||||
|  |         	if (myVehicle.currentRoute.getRouteSelected() == -1) { | ||||||
|  |         		System.out.print("None Selected\n"); | ||||||
|  |         	} else { | ||||||
|  |         		String[] routes = myVehicle.currentRoute.enumRoutes(); | ||||||
|  |         		String[] splitNames = routes[myVehicle.currentRoute.getRouteSelected()].split("\n"); | ||||||
|  |         		System.out.print(splitNames[0] + "\n"); | ||||||
|  |         	} | ||||||
|  |         	 | ||||||
|  |         	//Show current fuel level on main menu | ||||||
|  |         	System.out.printf("Fuel Level: %.0f%%\n", myVehicle.getFuelLevel()*100); | ||||||
|  |         	 | ||||||
|  |         	//Show current media source on Main Menu | ||||||
|  |         	System.out.print("Now Playing: " + nowPlaying.getMetadata() + "\n\n"); | ||||||
|  |         	 | ||||||
|  |         	mainMenu(); | ||||||
|  | 	        userSelection = userInput.nextInt(); | ||||||
|  | 	        switch (userSelection) { | ||||||
|  | 		        case 1: //destination selection menu | ||||||
|  | 		        	while (userSelection != 0) { | ||||||
|  | 			        	destinationMenu(); | ||||||
|  | 			        	userSelection = userInput.nextInt(); | ||||||
|  | 			        	if (userSelection == 0) { | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		break; | ||||||
|  | 			        	} | ||||||
|  | 			        	else if (userSelection == 1) { | ||||||
|  | 			        		System.out.println("Destination 1 selected"); | ||||||
| 			        		myVehicle.currentRoute.setRouteDestination("250 Community College Pkwy SE, Palm Bay, FL 32909"); | 			        		myVehicle.currentRoute.setRouteDestination("250 Community College Pkwy SE, Palm Bay, FL 32909"); | ||||||
|         System.out.println("Number of available routes: " + myVehicle.currentRoute.enumRoutes()); | 			        		userSelection = -1; | ||||||
|         int tmp = userInput.nextInt(); | 			        		HelperFunctions.sleep(3); | ||||||
|         myVehicle.currentRoute.selectRoute(tmp); | 			        		break; | ||||||
|         myVehicle.navigateRoute(); | 			        	} else { | ||||||
|  | 			        		System.out.println("Please select a valid option."); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		HelperFunctions.sleep(3); | ||||||
|  | 			        	} | ||||||
|  | 		        	} | ||||||
|  | 		        	break; | ||||||
|  | 		        case 2: //route selection menu | ||||||
|  | 		        	if (myVehicle.currentRoute.currentDestination.getDestinationAddress() == null) { | ||||||
|  | 		        		System.out.println("Please select a destination first."); | ||||||
|  | 		        		userSelection = -1; | ||||||
|  | 		        		break; | ||||||
|  | 		        	} | ||||||
|  | 		        	while (userSelection != 0) { | ||||||
|  | 		        		routesMenu(myVehicle.currentRoute.enumRoutes()); | ||||||
|  | 		        		userSelection = userInput.nextInt(); | ||||||
|  | 		        		if (userSelection == 0) { | ||||||
|  | 		        			userSelection = -1; | ||||||
|  | 		        			break; | ||||||
|  | 		        		} | ||||||
|  | 		        		else if (userSelection <= myVehicle.currentRoute.countRoutesAvailable()) { | ||||||
|  | 		        			myVehicle.currentRoute.selectRoute(userSelection - 1); | ||||||
|  | 		        			System.out.println("Route " + userSelection + " selected"); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		HelperFunctions.sleep(3); | ||||||
|  | 			        		break; | ||||||
|  | 		        		} else { | ||||||
|  | 		        			System.out.println("Please select a valid option."); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		HelperFunctions.sleep(3); | ||||||
|  | 		        		} | ||||||
|  | 		        	} | ||||||
|  | 		        	break; | ||||||
|  | 		        case 3: //start navigation | ||||||
|  | 		        	System.out.println("Start navigation"); | ||||||
|  | 		        	myVehicle.run(); | ||||||
|  | 		        	System.out.println("Navigation complete, destination reached."); | ||||||
|  | 		        	HelperFunctions.pressEnterToContinue(); | ||||||
|  | 		        	break; | ||||||
|  | 		        case 4: //entertainment controls | ||||||
|  | 		        	while (userSelection != 0) { | ||||||
|  | 		        		entertainmentMenu(); | ||||||
|  | 			        	userSelection = userInput.nextInt(); | ||||||
|  | 			        	 | ||||||
|  | 			        	if (userSelection == 0) { | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		break; | ||||||
|  | 			        	} else if (userSelection == 1) { | ||||||
|  | 			        		nowPlaying.selectSource("RADIO", "FM 104.1"); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		break; | ||||||
|  | 			        	} else if (userSelection == 2) { | ||||||
|  | 			        		nowPlaying.selectSource("AUX", "AUX Input"); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		break; | ||||||
|  | 			        	} else if (userSelection == 3) { | ||||||
|  | 			        		nowPlaying.selectSource("BLUETOOTH", "Bluetooth Device"); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        		break; | ||||||
|  | 			        	} else { | ||||||
|  | 			        		System.out.println("Please select a valid option"); | ||||||
|  | 			        		userSelection = -1; | ||||||
|  | 			        	} | ||||||
|  | 	        		} | ||||||
|  | 		        	break; | ||||||
|  | 		        case 5: //climate controls | ||||||
|  | 		        	while (userSelection != 0) { | ||||||
|  | 		        		climateMenu(); | ||||||
|  | 		        		userSelection = -1; | ||||||
|  | 		        		userSelection = userInput.nextInt(); | ||||||
|  | 		        		if (userSelection == 0) { | ||||||
|  | 		        			userSelection = -1; | ||||||
|  | 		        			break; | ||||||
|  | 		        		} else if (userSelection == 1) { | ||||||
|  | 		        			userSelection = -1; | ||||||
|  | 		        			climateTempMenu(climate.getCurrentTemps(), climate.getTargetTemps()); | ||||||
|  | 		        			userSelection = userInput.nextInt(); | ||||||
|  | 		        			if (userSelection == 0) { | ||||||
|  | 			        			userSelection = -1; | ||||||
|  | 			        		} else if (userSelection == 1) { | ||||||
|  | 			        			System.out.print("Enter new left target temp (65-90F): "); | ||||||
|  | 			        			climate.setTargetTemp(userInput.nextInt(), climate.getTargetTemps()[1]); | ||||||
|  | 			        		} else if (userSelection == 2) { | ||||||
|  | 			        			System.out.print("Enter new right target temp (65-90F): "); | ||||||
|  | 			        			climate.setTargetTemp(climate.getTargetTemps()[0], userInput.nextInt()); | ||||||
|  | 			        		} | ||||||
|  | 		        		} else if (userSelection == 2) { | ||||||
|  | 		        			userSelection = -1; | ||||||
|  | 		        			climateFanMenu(climate.getFanSpeeds()); | ||||||
|  | 		        			userSelection = userInput.nextInt(); | ||||||
|  | 	        				if (userSelection == 0) { | ||||||
|  | 	        					userSelection = -1; | ||||||
|  | 	        				} else if (userSelection == 1) { | ||||||
|  | 	        					userSelection = -1; | ||||||
|  | 	        					climateFanSpeedMenu(); | ||||||
|  | 	        					userSelection = userInput.nextInt(); | ||||||
|  | 	        					climate.setFanSpeeds(Integer.toString(userSelection), climate.getFanSpeeds()[1]); | ||||||
|  | 	        				} else if (userSelection == 2) { | ||||||
|  | 	        					userSelection = -1; | ||||||
|  | 	        					climateFanSpeedMenu(); | ||||||
|  | 	        					userSelection = userInput.nextInt(); | ||||||
|  | 	        					climate.setFanSpeeds(climate.getFanSpeeds()[0], Integer.toString(userSelection)); | ||||||
|  | 	        				} | ||||||
|  | 		        		} else if (userSelection == 3) { | ||||||
|  | 		        			userSelection = -1; | ||||||
|  | 		        			climate.run(); | ||||||
|  | 		        		} | ||||||
|  | 		        	} | ||||||
|  | 	        } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         userInput.close(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void mainMenu() { | ||||||
|  |     	System.out.println("Main Menu\n=========\n"); | ||||||
|  |         System.out.println("1. Set Destination"); | ||||||
|  |         System.out.println("2. Select Route"); | ||||||
|  |         System.out.println("3. Start Navigation"); | ||||||
|  |         System.out.println("4. Entertainment Controls"); | ||||||
|  |         System.out.println("5. Climate Controls"); | ||||||
|  |         System.out.println("0. Turn Off"); | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void destinationMenu() { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Destinations\n=============\n"); | ||||||
|  |         System.out.println("Select a Destination\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         System.out.println("1. EFSC Palm Bay Campus\n   250 Community College Pkwy SE, Palm Bay, FL 32909"); | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void routesMenu(String[] routes) { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Routes Available\n================\n"); | ||||||
|  |         System.out.println("Select a Route\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         for (String el : routes) { | ||||||
|  |         	System.out.println(el); | ||||||
|  |         } | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void entertainmentMenu() { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Media\n=====\n"); | ||||||
|  |         System.out.println("Select a Source\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         System.out.println("1. Radio"); | ||||||
|  |         System.out.println("2. AUX"); | ||||||
|  |         System.out.println("3. Bluetooth"); | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void climateMenu() { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Climate Controls\n===============\n"); | ||||||
|  |         System.out.println("Select an option\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         System.out.println("1. Set Temperature"); | ||||||
|  |         System.out.println("2. Set Fan Speed"); | ||||||
|  |         System.out.println("3. Run Climate Adjustments"); //only necessary while application is non-concurrent | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void climateTempMenu(int[] currentTemps, int[] targetTemps) { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Temperature Controls\n===================\n"); | ||||||
|  |         System.out.println("Select an option\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         System.out.println("1. Set Left Temperature | Current: " + currentTemps[0] + "; Set: " + targetTemps[0]); | ||||||
|  |         System.out.println("2. Set Right Temperature | Current: " + currentTemps[1] + "; Set: " + targetTemps[1]); | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void climateFanMenu(String[] speeds) { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Fan Controls\n============\n"); | ||||||
|  |         System.out.println("Select an option\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         System.out.println("1. Set Left Fan Speed | Current: " + speeds[0]); | ||||||
|  |         System.out.println("2. Set Right Fan Speed | Current: " + speeds[1]); | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public static void climateFanSpeedMenu() { | ||||||
|  |     	System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.println("Set Fan Speed\n=============\n"); | ||||||
|  |         System.out.println("Select an option\n"); | ||||||
|  |         System.out.println("0. Go Back"); | ||||||
|  |         System.out.println("1. OFF"); | ||||||
|  |         System.out.println("2. LOW"); | ||||||
|  |         System.out.println("3. MED"); | ||||||
|  |         System.out.println("4. HI"); | ||||||
|  |         System.out.print("\nSelection: "); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										113
									
								
								Vehicle.java
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								Vehicle.java
									
									
									
									
									
								
							|  | @ -1,10 +1,11 @@ | ||||||
| import java.util.concurrent.*;  |  | ||||||
| 
 |  | ||||||
| public class Vehicle implements Runnable{ | public class Vehicle implements Runnable{ | ||||||
|     private Integer currentSpeed; |     private Integer currentSpeed; | ||||||
|     private Integer targetSpeed; |     private Integer targetSpeed; | ||||||
|     private double fuelLevel; |     private double fuelLevel; //percentage of full tank | ||||||
|  |     private double fuelEconomy = 0.03125; //gallons consumed per mile of travel (32 MPG) | ||||||
|  |     private double tripOdometer; //miles traveled in current trip | ||||||
|     private double distanceRemaining; |     private double distanceRemaining; | ||||||
|  |     private String currentLocation; | ||||||
|     public Route currentRoute = new Route(); |     public Route currentRoute = new Route(); | ||||||
| 
 | 
 | ||||||
|     public void run() { |     public void run() { | ||||||
|  | @ -12,42 +13,46 @@ public class Vehicle implements Runnable{ | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public Vehicle() { |     public Vehicle() { | ||||||
|         fuelLevel = getFuelLevel(); |         fuelLevel = 1; //12 gallon tank as full | ||||||
|         currentSpeed = 0; |         currentSpeed = 0; | ||||||
|         currentRoute.setRouteDestination("250 Community College Pkwy SE, Palm Bay, FL 32909"); |         //currentRoute.setRouteDestination("250 Community College Pkwy SE, Palm Bay, FL 32909"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void setTargetSpeed(int newSpeed) {targetSpeed = newSpeed;} |     public void setTargetSpeed(int newSpeed) {targetSpeed = newSpeed;} | ||||||
|     public int getCurrentSpeed() {return currentSpeed;} |     public int getCurrentSpeed() {return currentSpeed;} | ||||||
|     public double getFuelLevel() {return fuelLevel;} |     public double getFuelLevel() { | ||||||
|  |     	updateFuelLevel(); | ||||||
|  |     	return fuelLevel; | ||||||
|  |     } | ||||||
|     public void updateFuelLevel() { |     public void updateFuelLevel() { | ||||||
|         //would check fuel sensor and update accordingly |         //would check fuel sensor and update accordingly | ||||||
|         fuelLevel = 0.75; |         fuelLevel = (12 - (tripOdometer * fuelEconomy))/12; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void navigateRoute() { |     public void navigateRoute() { | ||||||
|         System.out.println("Start navigation"); |         int isRoadWet =  RoadSensor.roadQuality("WET"); //check whether road is wet | ||||||
|         boolean turnCompleted = false; |         boolean turnCompleted = false; //flag to validate completion of moveset instruction | ||||||
|  |          | ||||||
|  |         //at start of trip, check for whether road is wet | ||||||
|  |         if (isRoadWet == 1) {System.out.println("Road is wet, trip will have reduced speed for safety.");} | ||||||
|          |          | ||||||
|         for (String[] el : currentRoute.getSelectedRouteSteps()) { |         for (String[] el : currentRoute.getSelectedRouteSteps()) { | ||||||
|         	RoadSensor trafficSensor = new RoadSensor(); |         	turnCompleted = false; | ||||||
|         	if (targetSpeed > 20 && trafficSensor.detectTrafficLight() == 1 && el[0] != "STRAIGHT") { |  | ||||||
|         		//simulates stopping at traffic lights on major roadways |  | ||||||
|         		//for demo purposes, the spherical cow in a vacuum is that this only happens at turns |  | ||||||
|         		long sleepTime = Double.valueOf(Math.floor(Math.random()*15)).longValue(); |  | ||||||
|         		while (sleepTime > 0) { |  | ||||||
|         			System.out.println("Traffic light detected, waiting..."); |  | ||||||
| 	        		try {TimeUnit.SECONDS.sleep(1);} //sleep for 1-15 second to simulate traffic light |  | ||||||
| 	                catch (InterruptedException e) {System.err.println("Sleep interrupted");} |  | ||||||
|         		} |  | ||||||
|         		System.out.println("Resuming navigation"); |  | ||||||
|         	} |  | ||||||
|         	 |  | ||||||
|             turnCompleted = false; //flag to validate completion of moveset instruction |  | ||||||
|             distanceRemaining = Double.parseDouble(el[1]); |             distanceRemaining = Double.parseDouble(el[1]); | ||||||
|             targetSpeed = Integer.parseInt(el[2]); |             targetSpeed = Integer.parseInt(el[2]); | ||||||
|             while (!turnCompleted) { |             currentLocation = el[4]; | ||||||
|                 if (currentSpeed < 15 || el[0] == "STRAIGHT") { |             int isRoadUneven = RoadSensor.roadQuality("SURFACE"); | ||||||
|  |              | ||||||
|  |             //checks for presence of traffic light before completing next moveset to simulate cross-traffic | ||||||
|  |         	if (targetSpeed > 20 && RoadSensor.detectTrafficLight() && el[0] != "STRAIGHT") { | ||||||
|  |         		vehicleHalt("Traffic light"); | ||||||
|  |         	} | ||||||
|  |         	 | ||||||
|  |         	//checks whether road surface is degraded on current road to drive more cautiously | ||||||
|  |         	if (isRoadUneven == 1) {System.out.println("Road surface is uneven, speed will be reduced.");} | ||||||
|  |         	 | ||||||
|  |             while (!turnCompleted) { //move action routines to transition between movesets | ||||||
|  |                 if (currentSpeed <= 15 || el[0] == "STRAIGHT") { | ||||||
|                     changeDirection(el[0]); |                     changeDirection(el[0]); | ||||||
|                     turnCompleted = true; |                     turnCompleted = true; | ||||||
|                 } else { |                 } else { | ||||||
|  | @ -55,40 +60,46 @@ public class Vehicle implements Runnable{ | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             while (distanceRemaining > 0) { |             while (distanceRemaining > 0) { //forward motion routines to drive current road segment | ||||||
|                 System.out.printf("%.2f miles to next instruction\n", distanceRemaining); |                 if (RoadSensor.identifyHazard()) { | ||||||
|                 System.out.println("Current Speed: " + currentSpeed + " MPH"); |                 	vehicleHalt("Hazard"); | ||||||
|                 controlThrottle(); |                 } else { | ||||||
|  | 	            	displayInformation(); //displays current route and state information to console | ||||||
|  | 	                controlThrottle(isRoadWet + isRoadUneven); | ||||||
|  | 	                tripOdometer += Double.valueOf(currentSpeed)/3600; | ||||||
| 	                distanceRemaining = distanceRemaining - (Double.valueOf(currentSpeed)/3600); //travel distance in one second | 	                distanceRemaining = distanceRemaining - (Double.valueOf(currentSpeed)/3600); //travel distance in one second | ||||||
|                 try {TimeUnit.SECONDS.sleep(1);} //sleep action for 1 second to simulate continuous movement | 	                HelperFunctions.sleep(1); //sleep 1 second to simulate continuous movement | ||||||
|                 catch (InterruptedException e) {System.err.println("Sleep interrupted");} |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         System.out.println("Navigation complete, destination reached."); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void changeDirection(String direction) { |     public void changeDirection(String direction) { | ||||||
|         switch (direction) { |         switch (direction) { | ||||||
|             case "LEFT": |             case "LEFT": | ||||||
|                 System.out.println("Turning left..."); |                 System.out.println("Turning left...\n"); | ||||||
|                 break; |                 break; | ||||||
|             case "RIGHT": |             case "RIGHT": | ||||||
|                 System.out.println("Turning right..."); |                 System.out.println("Turning right...\n"); | ||||||
|                 break; |                 break; | ||||||
|             case "STRAIGHT": |             case "STRAIGHT": | ||||||
|                 System.out.println("Continuing straight..."); |                 System.out.println("Continuing straight...\n"); | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void controlThrottle() { |     public void controlThrottle(int unsafeCondition) { | ||||||
|         if (currentSpeed < targetSpeed && (targetSpeed - currentSpeed) > 6) { //normal acceleration |     	int safeTargetSpeed = targetSpeed; | ||||||
|  |     	//adjust driving speed for road conditions. 5 MPH reduction per unsafe condition detected | ||||||
|  |         if (targetSpeed > 20) {safeTargetSpeed = targetSpeed - (5 * unsafeCondition);} | ||||||
|  |     	 | ||||||
|  |     	if (currentSpeed < safeTargetSpeed && (safeTargetSpeed - currentSpeed) > 6) { //normal acceleration | ||||||
|             currentSpeed = currentSpeed + 6; |             currentSpeed = currentSpeed + 6; | ||||||
|         } else if (currentSpeed < targetSpeed && (targetSpeed - currentSpeed) <= 6) { //partial acceleration to reach speed limit |         } else if (currentSpeed < safeTargetSpeed && (safeTargetSpeed - currentSpeed) <= 6) { //partial acceleration to reach speed limit | ||||||
|             currentSpeed = currentSpeed + (targetSpeed - currentSpeed); |             currentSpeed = currentSpeed + (safeTargetSpeed - currentSpeed); | ||||||
|         } else if (currentSpeed > targetSpeed) { //deceleration by coasting |         } else if (currentSpeed > safeTargetSpeed) { //deceleration by coasting | ||||||
|             currentSpeed--; |             currentSpeed--; | ||||||
|         } else if (currentSpeed == targetSpeed) { |         } else if (currentSpeed == safeTargetSpeed) { | ||||||
|         	//do nothing |         	//do nothing | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -98,4 +109,24 @@ public class Vehicle implements Runnable{ | ||||||
|         if (currentSpeed >= 10) {currentSpeed -= 10;} |         if (currentSpeed >= 10) {currentSpeed -= 10;} | ||||||
|         else if (currentSpeed < 10) {currentSpeed = 0;} |         else if (currentSpeed < 10) {currentSpeed = 0;} | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     public void vehicleHalt(String type) { //helper function to simulate a environmentally-driven vehicle stop | ||||||
|  | 		long sleepTime = Double.valueOf(Math.floor((Math.random()*10)+5)).longValue(); //wait time, between 5 and 15 seconds | ||||||
|  | 		while (sleepTime > 0) { | ||||||
|  | 			System.out.println(type + " detected, stopping (" + sleepTime + ")..."); | ||||||
|  | 			while (currentSpeed > 0) {applyBrakes();} | ||||||
|  | 			HelperFunctions.sleep(1); //sleep 1 second to simulate time for obstruction to clear | ||||||
|  |     		sleepTime--; | ||||||
|  | 		} | ||||||
|  | 		System.out.println(type + " cleared, resuming navigation\n"); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public void displayInformation() { | ||||||
|  |     	//System.out.print("\033[H\033[2J"); | ||||||
|  |     	System.out.printf("%.2f miles to next instruction\n", distanceRemaining); | ||||||
|  |     	System.out.println("Current Location: " + currentLocation); | ||||||
|  |         System.out.println("Current Speed: " + currentSpeed + " MPH\n"); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue