From 9afbcfbf438e44730a7a6c6c77ded0fcd3539f13 Mon Sep 17 00:00:00 2001 From: Blizzard Finnegan Date: Mon, 13 Mar 2023 08:08:17 -0400 Subject: [PATCH 1/2] End of day 10 Mar. commit --- originalJavaUML.xmi | 474 --------- pom.xml | 2 +- pythonUML.xmi | 920 ------------------ src/main/java/org/baxter/disco/ocr/Cli.java | 48 +- .../org/baxter/disco/ocr/OpenCVFacade.java | 10 + umlAndStateFlow.xmi | 144 +++ 6 files changed, 202 insertions(+), 1396 deletions(-) delete mode 100644 originalJavaUML.xmi delete mode 100644 pythonUML.xmi create mode 100644 umlAndStateFlow.xmi diff --git a/originalJavaUML.xmi b/originalJavaUML.xmi deleted file mode 100644 index 15aba98..0000000 --- a/originalJavaUML.xmi +++ /dev/null @@ -1,474 +0,0 @@ - - - - - umbrello uml modeller http://umbrello.kde.org - 1.6.18 - UnicodeUTF8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index 9ba0377..e300bae 100644 --- a/pom.xml +++ b/pom.xml @@ -186,7 +186,7 @@ 3.4.1 + --> diff --git a/pythonUML.xmi b/pythonUML.xmi deleted file mode 100644 index d2499f9..0000000 --- a/pythonUML.xmi +++ /dev/null @@ -1,920 +0,0 @@ - - - - - umbrello uml modeller http://umbrello.kde.org - 1.6.18 - UnicodeUTF8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/baxter/disco/ocr/Cli.java b/src/main/java/org/baxter/disco/ocr/Cli.java index 45c5181..fae6b6d 100644 --- a/src/main/java/org/baxter/disco/ocr/Cli.java +++ b/src/main/java/org/baxter/disco/ocr/Cli.java @@ -337,10 +337,52 @@ public class Cli println("3. Change Threshold Value"); println("4. Toggle crop"); println("5. Toggle threshold"); - println("6. Exit"); + println("6. Help"); + println("7. Exit"); println("===================================="); } + /** + * Pre-defined menu for printing camera configuration options + */ + private static void printCameraConfigHelpMenu() + { + println("\n\n"); + println("============================================================"); + println("Camera Config Menu options:"); + println("------------------------------------------------------------"); + println("1. Change Crop Region:"); + println("\tChange where to crop the image down to."); + println("\tThis crop should only include the numbers"); + println("\ton the screen of the DUT, and not include"); + println("\tthe battery symbol, the degree symbol, or"); + println("\tany other additional items on the screen."); + println("2. Change Composite Frame Count:"); + println("\tChange the number of images to stack on top of each other."); + println("\tA higher number here can compensate slightly for low "); + println("\tthreshold value."); + println(""); + println("3. Change Threshold Value:"); + println("\tChange the threshold point used on the image."); + println("\tValid numbers range from 0 to 255."); + println("\tA higher number will make more of the image black."); + println("\tA lower number will make more of the image white."); + println(""); + println("4. Toggle crop:"); + println("\tTurn off cropping for the preview."); + println(""); + println("5. Toggle threshold:"); + println("\tTurn off thesholding for the preview."); + println(""); + println("6. Help:"); + println("\tShow this menu"); + println(""); + println("7. Exit:"); + println("\t Exit to the previous menu to pick another camera"); + println("============================================================"); + println("Press enter to continue..."); + } + /** * Sub-function used to configure cameras. */ @@ -404,6 +446,10 @@ public class Cli modifiedProperty = ConfigProperties.THRESHOLD; break; case 6: + printCameraConfigHelpMenu(); + inputScanner.nextLine(); + break; + case 7: modifiedProperty = ConfigProperties.PRIME; break; default: diff --git a/src/main/java/org/baxter/disco/ocr/OpenCVFacade.java b/src/main/java/org/baxter/disco/ocr/OpenCVFacade.java index fe20f69..13b5a91 100644 --- a/src/main/java/org/baxter/disco/ocr/OpenCVFacade.java +++ b/src/main/java/org/baxter/disco/ocr/OpenCVFacade.java @@ -249,6 +249,16 @@ public class OpenCVFacade { Mat uncroppedImage = takePicture(cameraName); Rect roi = selectROI("Pick Crop Location", uncroppedImage); + if(roi.x() == 0 && roi.y() == 0 && roi.width() == 0 && roi.height() == 0) + { + ErrorLogging.logError("Crop error! - Invalid crop selection."); + ErrorLogging.logError("If the crop region did not have a box indicating is location, please restart the program."); + ConfigFacade.setValue(cameraName,ConfigProperties.CROP_X,ConfigProperties.CROP_X.getDefaultValue()); + ConfigFacade.setValue(cameraName,ConfigProperties.CROP_Y,ConfigProperties.CROP_Y.getDefaultValue()); + ConfigFacade.setValue(cameraName,ConfigProperties.CROP_W,ConfigProperties.CROP_W.getDefaultValue()); + ConfigFacade.setValue(cameraName,ConfigProperties.CROP_H,ConfigProperties.CROP_H.getDefaultValue()); + return; + } ConfigFacade.setValue(cameraName,ConfigProperties.CROP_X, roi.x()); ConfigFacade.setValue(cameraName,ConfigProperties.CROP_Y, roi.y()); ConfigFacade.setValue(cameraName,ConfigProperties.CROP_W, roi.width()); diff --git a/umlAndStateFlow.xmi b/umlAndStateFlow.xmi new file mode 100644 index 0000000..a1edaa8 --- /dev/null +++ b/umlAndStateFlow.xmi @@ -0,0 +1,144 @@ + + + + + umbrello uml modeller 2.32.3 http://umbrello.kde.org + 1.7.3 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.47.2 From caed5f0d1e9e88395f0047d08e6c57262a67b534 Mon Sep 17 00:00:00 2001 From: Blizzard Finnegan Date: Mon, 13 Mar 2023 10:14:11 -0400 Subject: [PATCH 2/2] Remove PWM code Pi's PWM pin has been replaced with PWM-generating hardware. Motor location-finding algorithm has been left in, to ensure safe travel. --- dependency-reduced-pom.xml | 2 +- pom.xml | 2 +- runScript.sh | 2 +- src/main/java/org/baxter/disco/ocr/Cli.java | 10 +- .../org/baxter/disco/ocr/MovementFacade.java | 278 +----------------- 5 files changed, 21 insertions(+), 273 deletions(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 0211333..ca3dfe2 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -4,7 +4,7 @@ org.baxter.disco ocr Disco OCR Accuracy Over Life Testing - 4.3.6 + 4.3.7 Testing Discos for long-term accuracy, using automated optical character recognition. Baxter International diff --git a/pom.xml b/pom.xml index e300bae..9cc91ad 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.baxter.disco ocr - 4.3.6 + 4.3.7 jar Disco OCR Accuracy Over Life Testing Testing Discos for long-term accuracy, using automated optical character recognition. diff --git a/runScript.sh b/runScript.sh index 9cb3eae..be18343 100644 --- a/runScript.sh +++ b/runScript.sh @@ -1,2 +1,2 @@ #! /usr/bin/env sh -sudo java -jar discoTesting-4.3.6.jar 2>/dev/null +sudo java -jar discoTesting-4.3.7.jar 2>/dev/null diff --git a/src/main/java/org/baxter/disco/ocr/Cli.java b/src/main/java/org/baxter/disco/ocr/Cli.java index fae6b6d..1def78f 100644 --- a/src/main/java/org/baxter/disco/ocr/Cli.java +++ b/src/main/java/org/baxter/disco/ocr/Cli.java @@ -25,7 +25,7 @@ public class Cli /** * Complete build version number */ - private static final String version = "4.3.6"; + private static final String version = "4.3.7"; /** * Currently saved iteration count. @@ -58,7 +58,7 @@ public class Cli /** * Number of options currently available in the camera configuration sub-menu. */ - private static final int cameraMenuOptionCount = 6; + private static final int cameraMenuOptionCount = 7; /** * Lock object, used for temporary interruption of {@link #runTests()} @@ -85,7 +85,7 @@ public class Cli int userInput = 0; - ErrorLogging.logError("Calibrating motor movement. This may take several minutes..."); + ErrorLogging.logError("Calibrating motor movement. "); ErrorLogging.logError("The piston will fire momentarily when the motor calibration is complete."); MovementFacade.pressButton(); @@ -191,6 +191,7 @@ public class Cli */ private static void printHelp() { + println("\n\n"); println("========================================"); println("Explanations:"); println("----------------------------------------"); @@ -261,6 +262,7 @@ public class Cli */ private static void printCameraMenu(List cameraList) { + println("\n\n"); println("Available cameras to configure:"); println("------------------------------------"); for(int index = 0; index < cameraList.size(); index++) @@ -278,6 +280,7 @@ public class Cli */ private static void printSerialMenu(List cameraList) { + println("\n\n"); println("Available serial numbers to set:"); println("------------------------------------"); for(int index = 0; index < cameraList.size(); index++) @@ -299,6 +302,7 @@ public class Cli */ private static void printActiveToggleMenu(List cameraList) { + println("\n\n"); println("Available cameras to toggle:"); println("------------------------------------"); for(int index = 0; index < cameraList.size(); index++) diff --git a/src/main/java/org/baxter/disco/ocr/MovementFacade.java b/src/main/java/org/baxter/disco/ocr/MovementFacade.java index 05166da..a1024ae 100644 --- a/src/main/java/org/baxter/disco/ocr/MovementFacade.java +++ b/src/main/java/org/baxter/disco/ocr/MovementFacade.java @@ -9,9 +9,6 @@ import com.pi4j.io.gpio.digital.DigitalOutput; import com.pi4j.io.gpio.digital.DigitalOutputConfigBuilder; import com.pi4j.io.gpio.digital.DigitalState; import com.pi4j.io.gpio.digital.PullResistance; -import com.pi4j.io.pwm.Pwm; -import com.pi4j.io.pwm.PwmConfigBuilder; -import com.pi4j.io.pwm.PwmType; /** * Facade for all movement of the fixture. @@ -36,30 +33,9 @@ public class MovementFacade private static Thread runSwitchThread; /** - * Max allowed speed by current fixture design. - * Motor appears to start acting erratically over 192kHz. + * Fraction of the total travel time, so the arm won't push through the limit switch. */ - private static final int MAX_FREQUENCY = 192000; - - /** - * Amount of buffer between the found absolute speed, and used speed. - */ - private static final int SPEED_BUFFER = 7500; - - /** - * Minimum allowed speed of the fixture arm; also used for reset travels. - */ - private static final int MIN_FREQUENCY = 10000; - - /** - * Fraction of the total travel time at speed to start slowing down. - */ - private static final double SLOW_POLL_FACTOR = 3.0 / 4.0; - - /** - * Amount to slow down the speed by. - */ - private static final int SPEED_DOWN_FACTOR = 2; + private static final double SLOW_POLL_FACTOR = 0.95; /** * Amount of distance to travel. @@ -68,17 +44,6 @@ public class MovementFacade */ private static double TRAVEL_DIST; - /** - * Frequency fed to the PWM pin, which the motor controller converts into movement speed. - */ - private static int FREQUENCY = MIN_FREQUENCY; - - /** - * PWM Duty Cycle. - * Does not affect motor speed; necessary for PWM setup. - */ - private static final int DUTY_CYCLE = 50; - //PWM Addresses //All addresses are in BCM format. @@ -97,11 +62,6 @@ public class MovementFacade */ private static final int PISTON_ADDR = 25; - /** - * PWM pin address. - */ - private static final int PWM_PIN_ADDR = 12; - /** * Input pin address for the run switch. */ @@ -122,11 +82,6 @@ public class MovementFacade */ private static final int POLL_WAIT = 10; - /** - * Multiply the time-out value by this value to get the number of polls to make. - */ - private static final int TIME_CONVERSION = 1000 / POLL_WAIT; - //Pi GPIO pin objects /** @@ -177,12 +132,6 @@ public class MovementFacade */ private static DigitalOutput pistonActivate; - /** - * PWM pin object. - * Never used, but needs to be initialised to get GPIO to work properly. - */ - private static Pwm pwm; - /** * {@link Pi4J} API interaction object. */ @@ -224,60 +173,9 @@ public class MovementFacade motorDirection = outputBuilder("motorDirection", "Motor Direction", MOTOR_DIRECTION_ADDR); pistonActivate = outputBuilder("piston" , "Piston Activate", PISTON_ADDR); - pwm = pwmBuilder("pwm","PWM Pin",PWM_PIN_ADDR); - pwm.on(DUTY_CYCLE, FREQUENCY); - - calibrate(); + findDistance(); } - /** - * Builder function for PWM pins. - * - * @param id ID of the new PWM pin. - * @param name Name of the new PWM pin. - * @param address BCM address of the PWM pin. - * - * @return newly created PWM pin object. - */ - private static Pwm pwmBuilder(String id, String name, int address) - { - PwmConfigBuilder configBuilder; - switch (address) - { - //The following pins allow for hardware PWM support. - case 12: - case 13: - case 18: - case 19: - case 40: - case 41: - case 45: - case 52: - case 53: - configBuilder = Pwm.newConfigBuilder(pi4j) - .id(id) - .name(name) - .address(address) - .pwmType(PwmType.HARDWARE) - .frequency(FREQUENCY) - .provider("pigpio-pwm") - .initial(1) - .shutdown(0); - break; - //Any pin not listed above must be software PWM controlled. - default: - configBuilder = Pwm.newConfigBuilder(pi4j) - .id(id) - .name(name) - .address(address) - .pwmType(PwmType.SOFTWARE) - .frequency(FREQUENCY) - .provider("pigpio-pwm") - .initial(1) - .shutdown(0); - } - return pi4j.create(configBuilder); - } /** * Builder function for DigitalInput pins. @@ -328,7 +226,6 @@ public class MovementFacade ErrorLogging.logError("DEBUG: --------------------------------------"); int counter; ErrorLogging.logError("DEBUG: Setting minimum frequency of PWM..."); - pwm.on(DUTY_CYCLE, MIN_FREQUENCY); if(upperLimit.isHigh()) { ErrorLogging.logError("DEBUG: Motor at highest point! Lowering to reset."); @@ -362,22 +259,6 @@ public class MovementFacade return counter; } - /** - * Used to programmatically determine the motor's max speed. - */ - private static void calibrate() - { - ErrorLogging.logError("Determining distance to limit switches..."); - findDistance(); - ErrorLogging.logError("Resetting arm to set speed."); - resetArm(); - ErrorLogging.logError("Calibrating..."); - FREQUENCY = calib(MIN_FREQUENCY, MAX_FREQUENCY, 10000); - ErrorLogging.logError("Calibration complete!"); - ErrorLogging.logError("DEBUG: Speed set to " + (FREQUENCY - SPEED_BUFFER)); - setFrequency(FREQUENCY - SPEED_BUFFER); - } - /** * Used to programmatically find the distance between the upper and lower limit switches. */ @@ -386,7 +267,7 @@ public class MovementFacade resetArm(); int downTravelCounter = 0; int upTravelCounter = 0; - pwm.on(DUTY_CYCLE, MIN_FREQUENCY); + //pwm.on(DUTY_CYCLE, MIN_FREQUENCY); motorDirection.low(); motorEnable.on(); for(downTravelCounter = 0; downTravelCounter < Integer.MAX_VALUE; downTravelCounter++) @@ -401,8 +282,6 @@ public class MovementFacade motorEnable.off(); if(lowerLimit.isOff()) ErrorLogging.logError("DEBUG: False positive on findDistance down!"); - int downTravelDist = downTravelCounter * MIN_FREQUENCY; - ErrorLogging.logError("DEBUG: Down travel distance found to be: " + downTravelDist); ErrorLogging.logError("DEBUG: Down travel count: " + downTravelCounter); motorDirection.high(); @@ -419,95 +298,10 @@ public class MovementFacade motorEnable.off(); if(upperLimit.isOff()) ErrorLogging.logError("DEBUG: False positive on findDistance up!"); - int upTravelDist = upTravelCounter * MIN_FREQUENCY; - ErrorLogging.logError("DEBUG: Up travel distance found to be: " + upTravelDist); ErrorLogging.logError("DEBUG: Up travel count: " + downTravelCounter); - if(Math.abs(upTravelCounter - downTravelCounter) > 3) - { - ErrorLogging.logError("DEBUG: Values differ too far to be error. Setting to lower value."); - } int travelCounter = Math.min(upTravelCounter, downTravelCounter); - TRAVEL_DIST = travelCounter * MIN_FREQUENCY; - } - - - /** - * Find the max frequency to feed to the motor. - * - * @param start Lowest frequency to check - * @param max Highest frequency to check - * @param iterate How much to iterate by - * - * @return The largest safe value between start and max. - */ - private static int calib(int start, int max, int iterate) - { - for(int i = start; i < max; i+=iterate) - { - if(!setFrequency(i)) - { - ErrorLogging.logError("DEBUG: Speed set unsuccessfully! returning " + MIN_FREQUENCY + "..."); - return MIN_FREQUENCY; - } - ErrorLogging.logError("DEBUG: Motor travelling down."); - motorDirection.low(); - ErrorLogging.logError("DEBUG: Motor Frequency: " + FREQUENCY); - ErrorLogging.logError("DEBUG: Motor calibrate on."); - motorEnable.on(); - int TWO_SECONDS = 2 * TIME_CONVERSION; - for(int j = 0; j < TWO_SECONDS; j++) - { - try{ Thread.sleep(POLL_WAIT); } catch(Exception e){ ErrorLogging.logError(e); } - if(lowerLimit.isHigh()) - { - ErrorLogging.logError("DEBUG: Breaking loop early!"); - break; - } - } - motorEnable.off(); - ErrorLogging.logError("DEBUG: Motor calibrate off."); - if(upperLimit.isHigh()) - { - ErrorLogging.logError("DEBUG: Motor failed to move! Returning " + (i - iterate)); - return i-iterate; - } - else - { - - ErrorLogging.logError("DEBUG: Motor moved at speed " + i + ". Checking for errors."); - if(resetArm() < 10) - { - ErrorLogging.logError("DEBUG: Motor failed to move! Returning " + (i - iterate)); - return i - iterate; - } - } - } - return max-iterate; - } - - /** - * Safely set the speed of the motor and fixture. - * - * @return true if set successfully, else false - */ - private static boolean setFrequency(int newFrequency) - { - boolean output; - if(newFrequency < MIN_FREQUENCY || newFrequency > MAX_FREQUENCY) - { - ErrorLogging.logError("DEBUG: Invalid MovementFacade.setFrequency() value, setting to minfrequency!"); - FREQUENCY = MIN_FREQUENCY; - output = false; - } - else - { - FREQUENCY = newFrequency; - output = true; - } - ErrorLogging.logError("DEBUG: Setting frequency to " + FREQUENCY); - pwm.on(DUTY_CYCLE, FREQUENCY); - return output; + TRAVEL_DIST = travelCounter; } /** @@ -526,32 +320,22 @@ public class MovementFacade { motorDirection.high(); limitSense = upperLimit; - ErrorLogging.logError("Sending fixture up..."); + ErrorLogging.logError("DEBUG: Sending fixture up..."); } else { motorDirection.low(); limitSense = lowerLimit; - ErrorLogging.logError("Sending fixture down..."); + ErrorLogging.logError("DEBUG: Sending fixture down..."); } if(limitSense.isHigh()) return FinalState.SAFE; - pwm.on(DUTY_CYCLE, FREQUENCY); - int totalPollCount = (int)(TRAVEL_DIST / FREQUENCY); + int totalPollCount = (int)(TRAVEL_DIST); int highSpeedPolls = (int)(totalPollCount * SLOW_POLL_FACTOR); - int notHighSpeedPolls = totalPollCount - highSpeedPolls; - int medSpeedPolls = (int)(notHighSpeedPolls * SLOW_POLL_FACTOR); - int lowSpeedPolls = notHighSpeedPolls - medSpeedPolls; - - medSpeedPolls *= SPEED_DOWN_FACTOR; - lowSpeedPolls *= 2 * SPEED_DOWN_FACTOR; - ErrorLogging.logError("DEBUG: ============================="); ErrorLogging.logError("DEBUG: Travel time: " + totalPollCount); ErrorLogging.logError("DEBUG: High speed poll count: " + highSpeedPolls); - ErrorLogging.logError("DEBUG: Medium speed poll count: " + medSpeedPolls); - ErrorLogging.logError("DEBUG: Low speed poll count: " + lowSpeedPolls); ErrorLogging.logError("DEBUG: ============================="); motorEnable.on(); for(int i = 0; i < highSpeedPolls; i++) @@ -560,53 +344,13 @@ public class MovementFacade if(limitSense.isOn()) { motorEnable.off(); - ErrorLogging.logError("DEBUG: Motor moved too fast! Stopping motor early."); - ErrorLogging.logError("DEBUG: Breaking high-speed loop and turning off motor!"); - ErrorLogging.logError("DEBUG: Iteration count: " + i); - output = FinalState.FAILED; break; } } - - if(motorEnable.isOn()) - { - output = FinalState.UNSAFE; - pwm.on(DUTY_CYCLE, (FREQUENCY / SPEED_DOWN_FACTOR)); - for(int i = 0; i < medSpeedPolls; i++) - { - try{ Thread.sleep(POLL_WAIT); } catch(Exception e){ ErrorLogging.logError(e); } - if(limitSense.isOn()) - { - motorEnable.off(); - ErrorLogging.logError("DEBUG: Motor only partially slowed down! Stopping motor early."); - ErrorLogging.logError("DEBUG: Breaking medium-speed loop and turning off motor!"); - ErrorLogging.logError("DEBUG: Iteration count: " + i); - break; - } - } - } - - if(motorEnable.isOn()) - { - output = FinalState.SAFE; - pwm.on(DUTY_CYCLE, (FREQUENCY / (2 * SPEED_DOWN_FACTOR))); - for(int i = 0; i < lowSpeedPolls; i++) - { - try{ Thread.sleep(POLL_WAIT); } catch(Exception e){ ErrorLogging.logError(e); } - if(limitSense.isOn()) - { - motorEnable.off(); - ErrorLogging.logError("DEBUG: Motor slowed down completely, but hit limit switch early."); - ErrorLogging.logError("DEBUG: Breaking low-speed loop and turning off motor!"); - ErrorLogging.logError("DEBUG: Iteration count: " + i); - break; - } - } - } - motorEnable.off(); - - pwm.on(DUTY_CYCLE, FREQUENCY); + + output = (limitSense.isOn() ? FinalState.UNSAFE : FinalState.SAFE); + return output; } -- 2.47.2