package org.jactr.modules.pm.motor.buffer.processor; /* * default logging */ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.commonreality.modalities.motor.MotorUtilities; import org.commonreality.object.IEfferentObject; import org.jactr.core.buffer.IActivationBuffer; import org.jactr.core.buffer.delegate.SimpleRequestDelegate; import org.jactr.core.chunktype.IChunkType; import org.jactr.core.logging.Logger; import org.jactr.core.model.IModel; import org.jactr.core.production.request.ChunkTypeRequest; import org.jactr.core.production.request.IRequest; import org.jactr.core.slot.IConditionalSlot; import org.jactr.modules.pm.motor.AbstractMotorModule; import org.jactr.modules.pm.motor.command.ICommandTranslator; import org.jactr.modules.pm.motor.command.IMovement; import org.jactr.modules.pm.motor.managers.MotorCommandManager; public class AbortRequestDelegate extends SimpleRequestDelegate { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(AbortRequestDelegate.class); public AbortRequestDelegate(IChunkType chunkType) { super(chunkType); } public boolean request(IRequest request, IActivationBuffer buffer, double requestTime) { ChunkTypeRequest cRequest = (ChunkTypeRequest) request; String muscleName = null; for (IConditionalSlot slot : cRequest.getConditionalSlots()) if (slot.getName().equalsIgnoreCase("muscle") && slot.getCondition() == IConditionalSlot.EQUALS) { muscleName = (String) slot.getValue(); break; } IModel model = buffer.getModel(); AbstractMotorModule amm = (AbstractMotorModule) buffer.getModule(); ICommandTranslator translator = amm.getCommandTranslator(); MotorCommandManager manager = amm.getCommandManager(); String msg = null; IMovement toAbort = null; if (muscleName != null) { IEfferentObject muscle = translator.getMuscle(muscleName, model); if (muscle == null) msg = "No muscle found corresponding to " + muscleName + ", cannot abort movement of it"; else { IMovement movement = manager.getMovementFromMuscle(muscle .getIdentifier()); if (movement != null) toAbort = movement; else { movement = manager.getPreparedMovement(muscle.getIdentifier()); if (movement != null) toAbort = movement; else msg = "No currently executing movement of " + muscleName; } } } else { /* * no name provided, snag the last executed movement */ IMovement movement = manager.getMovementFromMuscle(null); if (movement != null) toAbort = movement; else { movement = manager.getPreparedMovement(null); if (movement != null) toAbort = movement; else msg = "No currently executing movement"; } } if (toAbort != null) { msg = "Requesting abort of movement of " + MotorUtilities.getName(manager.getMuscle(toAbort .getMuscleIdentifier())); amm.abort(toAbort, requestTime); } if (LOGGER.isDebugEnabled()) LOGGER.debug(msg); if (Logger.hasLoggers(model)) Logger.log(model, Logger.Stream.MOTOR, msg); return toAbort != null; } /** * returns the current movement associated with the muscle defined in this * request * * @param request * @return */ static public IMovement getMovement(ChunkTypeRequest cRequest, AbstractMotorModule motor) { String muscleName = null; for (IConditionalSlot slot : cRequest.getConditionalSlots()) if (slot.getName().equalsIgnoreCase("muscle") && slot.getCondition() == IConditionalSlot.EQUALS) { muscleName = (String) slot.getValue(); break; } if (muscleName == null) { if (LOGGER.isDebugEnabled()) LOGGER.debug("No muscle name found"); return null; } ICommandTranslator translator = motor.getCommandTranslator(); MotorCommandManager manager = motor.getCommandManager(); IEfferentObject muscle = translator.getMuscle(muscleName, motor.getModel()); if (muscle == null) { if (LOGGER.isWarnEnabled()) LOGGER.warn("No muscle found named " + muscleName); return null; } IMovement movement = manager.getMovementFromMuscle(muscle.getIdentifier()); if (movement == null) { if (LOGGER.isDebugEnabled()) LOGGER.debug("No active movement for " + muscle + ", checking for prepared movement"); movement = manager.getPreparedMovement(muscle.getIdentifier()); } return movement; } /** * noop. aborts are immediately processed */ public void clear() { } }