Project Name | CID | Checker | Category | Developer Description |
---|---|---|---|---|
niskyRobotics/javadeck | 118707 | INFINITE_LOOP | Program hangs | Detected an oversight while programming, that would have possibly caused severe hardware damage to a competition robot by not allowing the drivetrain to shut down. |
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
double distDuringAccel = Math.max(0.5 * maxSpeed * maxSpeed / accel, distance / 2); double holdTime = (distDuringAccel * 2 - distance) / maxSpeed; double accelTime = Math.sqrt(2 * distDuringAccel / accel); assert (holdTime >= 0) : "holding speed for negative time"; // 1/2 a t^2, but twice due to decel time as well assert (Math.abs(distance - (accel * accelTime * accelTime + holdTime * maxSpeed)) < ASSERTION_ALLOWED_ERROR); assert (accelTime * accel <= maxSpeed); try { long tStart = System.currentTimeMillis(); // accelerate long millisNow = 0; double spd; while (millisNow < accelTime) { spd = millisNow * accel; assert (spd <= maxSpeed); millisNow = System.currentTimeMillis() - tStart; ((HolonomicDrivetrain) vd).set2DVelocity(spd * Math.cos(holonomicAngleOffset), spd * Math.sin(holonomicAngleOffset)); // hardware writes occur every 50msec Thread.sleep(MSEC_PER_CONTROL_ITER); } |
<< If "millisNow < accelTime + holdTime" is initially true then it will remain true.
229 230 231 232 233 |
while (millisNow < (accelTime + holdTime)) { spd = maxSpeed; ((HolonomicDrivetrain) vd).set2DVelocity(spd * Math.cos(holonomicAngleOffset), spd * Math.sin(holonomicAngleOffset)); Thread.sleep(MSEC_PER_CONTROL_ITER); |
<< Bottom of the loop.
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
} while (millisNow < (2 * accelTime + holdTime)) { spd = (2 * accelTime + holdTime - millisNow) * accel; assert (spd <= maxSpeed); assert (spd >= 0); millisNow = System.currentTimeMillis() - tStart; ((HolonomicDrivetrain) vd).set2DVelocity(spd * Math.cos(holonomicAngleOffset), spd * Math.sin(holonomicAngleOffset)); // hardware writes occur every 50msec Thread.sleep(MSEC_PER_CONTROL_ITER); } vd.stopAll(); } catch (InterruptedException | PeripheralInoperableException | PeripheralCommunicationException e) { throw new RobotHardwareException(e); } } @Override protected double calculateDrift(RelativePosition travel) { return 0; } @Override protected double calculateAngularDrift(RelativePosition travel) { return 0; } @Override |
loop_condition | PositionBasedDrivetrain.java:229 | |
loop_bottom | PositionBasedDrivetrain.java:234 | |
loop_top | PositionBasedDrivetrain.java:229 |