actual final state, removing compiled files

This commit is contained in:
Fennel Kora 2024-05-02 22:35:22 -04:00
parent 66c80162ed
commit 92504f7d92
11 changed files with 499 additions and 116 deletions

View file

@ -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>

View file

@ -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");
}
} }

View file

@ -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
View 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
View 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

View file

@ -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;
} }
} }

View file

@ -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) {}
}
} }

View file

@ -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;
}
} }

View file

@ -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();
} }

View file

@ -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: ");
} }
} }

View file

@ -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");
}
} }