package com.indignado.logicbricks.systems.controllers;
import com.indignado.logicbricks.components.controllers.ConditionalControllerComponent;
import com.indignado.logicbricks.core.controllers.ConditionalController;
import com.indignado.logicbricks.core.controllers.ConditionalController.Op;
import com.indignado.logicbricks.core.data.LogicBrick.BrickMode;
import com.indignado.logicbricks.core.sensors.Sensor;
/**
* @author Rubentxu
*/
public class ConditionalControllerSystem extends ControllerSystem<ConditionalController, ConditionalControllerComponent> {
public ConditionalControllerSystem() {
super(ConditionalControllerComponent.class);
}
@Override
public void processController(ConditionalController controller) {
if (controller.actuators.size == 0 || controller.sensors.size == 0) {
return;
}
boolean doDispatch = false;
boolean seed = true, last = false, pos = false;
switch (controller.op) {
case OP_NOR:
controller.isInverter = true;
case OP_OR:
for (Sensor sens : controller.sensors.values()) {
pos = sens.positive;
if (pos)
doDispatch = true;
if (doDispatch)
break;
}
if (controller.isInverter)
doDispatch = !doDispatch;
break;
case OP_XNOR:
controller.isInverter = true;
case OP_XOR:
for (Sensor sens : controller.sensors.values()) {
seed = sens.positive;
if (seed && last) {
doDispatch = false;
break;
} else if (seed) doDispatch = true;
if (!last && seed)
last = true;
if (controller.op == Op.OP_XNOR && seed)
controller.isInverter = true;
}
if (controller.isInverter)
doDispatch = !doDispatch;
break;
case OP_NAND:
controller.isInverter = true;
case OP_AND:
for (Sensor sens : controller.sensors.values()) {
pos = sens.positive;
if (seed) {
seed = false;
doDispatch = pos;
} else
doDispatch = doDispatch && pos;
}
if (controller.isInverter) {
doDispatch = !doDispatch;
}
break;
}
if (doDispatch) {
controller.pulseState = BrickMode.BM_ON;
} else {
controller.pulseState = BrickMode.BM_OFF;
}
}
}