package lego.explorer;
import lego.lib.Sensors;
/**
* Manual Calibration:
* LEDS: 1 = IR, 2 = ?, 3 = ?, 4 = ?
* B1: Start Calibrartion
* B2: Next Calibration
* B3: Finished Calibration
* B4: Emergency (in every mode)
* -------------------------------------
* IR Calibration
* LEDS: 1 is blinking
* B1: Record Low
* B2: Record High
* B3: Finish Calibration
*
* @author Benedikt Huber <benedikt.huber@gmail.com>
*
*/
public class ManualCalibrationMode implements BotMode {
public static class IrCalibrationMode implements BotMode {
public int treshold;
private static final int IR_RECORD_LOW=0, IR_RECORD_HIGH=1,IR_RECORD_DONE=2;
private int maxLow,minHigh;
private BotInterface iface;
private static final IrCalibrationMode inst = new IrCalibrationMode();
private IrCalibrationMode() {}
public static IrCalibrationMode start(BotInterface iface) {
inst.iface = iface;
inst.maxLow = Sensors.MIN_VALUE;
inst.minHigh = Sensors.MAX_VALUE;
return inst;
}
public boolean driver(boolean stop) {
if(stop) return false;
boolean[] btnPressed = iface.buttonEdge;
int sens = iface.irSensor.value;
if(btnPressed[IR_RECORD_DONE]) {
treshold = (maxLow + minHigh) >>> 1;
iface.irSensor.setTreshold(treshold);
return false;
} else if(btnPressed[IR_RECORD_LOW]) {
maxLow = (sens > maxLow) ? sens : maxLow;
} else if(btnPressed[IR_RECORD_HIGH]) {
minHigh = (sens > maxLow && sens < minHigh) ? sens : minHigh;
}
return true;
}
}
private BotInterface iface;
private static ManualCalibrationMode inst = new ManualCalibrationMode();
private ManualCalibrationMode() {}
private BotMode calibDriver;
public static ManualCalibrationMode start(BotInterface iface) {
inst.iface = iface;
inst.calibDriver = IrCalibrationMode.start(iface);
return inst;
}
public boolean driver(boolean stop) {
iface.ledStatus[2] = BotInterface.LED_STATUS_BLINK;
if(calibDriver != null) {
boolean active = calibDriver.driver(stop);
if(! active) calibDriver = null;
else return true;
}
// Insert logic for more calibration modes here
if(stop || calibDriver == null) {
iface.ledStatus[2] = BotInterface.LED_STATUS_OFF;
return false;
} else {
return true;
}
}
}