//for all arrays, index 0 is driver's side, index 1 is passenger's side public class Climate implements Runnable { private int[] targetTemp = new int[2]; //array to store temp preference entered by user private int[] currentTemp = new int[2]; //stores current internal temp from last check private int externalTemp; //stores current external temp from last check private boolean[] coolingActive = new boolean[2]; //whether cooling 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 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) { //temp range should be between 65 F and 90 F, these if statements prohibit temps outside that range if (driverZone < 65) {driverZone = 65;} if (driverZone > 90) {driverZone = 90;} if (passengerZone < 65) {passengerZone = 65;} if (passengerZone > 90) {passengerZone = 90;} targetTemp[0] = driverZone; targetTemp[1] = passengerZone; } private int avgTargetTemp() { //gets internal target average for ease of calculation return (targetTemp[0] + targetTemp[1])/2; } private void updateCurrentTemps() { //queries temp sensors for current cabin temp HelperFunctions tSensor = new HelperFunctions(); currentTemp = tSensor.internalTempSensors(); externalTemp = tSensor.externalTempSensors(); } public int[] getTargetTemps() { return targetTemp; } public int[] getCurrentTemps() { return currentTemp; } public void activateClimate() { //driver's side 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;} //passenger's side if (targetTemp[1]+1 < currentTemp[1]) {coolingActive[1] = true;} if (targetTemp[1] >= currentTemp[1]) {coolingActive[1] = false;} //driver's side if (targetTemp[0]-1 > currentTemp[0]) {heatingActive[0] = true;} if (targetTemp[0] <= currentTemp[0]) {heatingActive[0] = false;} //passenger's side if (targetTemp[1]-1 > currentTemp[1]) {heatingActive[1] = true;} 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 switch (driver) { case "OFF": case "1": fanSpeed[0] = fanLevels.OFF; break; case "LOW": case "2": fanSpeed[0] = fanLevels.LOW; break; case "MED": case "3": fanSpeed[0] = fanLevels.MED; break; case "HI": case "4": fanSpeed[0] = fanLevels.HI; break; } switch (passenger) { case "OFF": case "1": fanSpeed[1] = fanLevels.OFF; break; case "LOW": case "2": fanSpeed[1] = fanLevels.LOW; break; case "MED": case "3": fanSpeed[1] = fanLevels.MED; break; case "HI": case "4": fanSpeed[1] = fanLevels.HI; break; } } public String[] getFanSpeeds() { String[] workingString = {fanSpeed[0].toString(), fanSpeed[1].toString()}; 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"); } }