package org.jactr.modules.pm.motor.managers;
/*
* default logging
*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.commonreality.identifier.IIdentifier;
import org.jactr.core.buffer.six.IStatusBuffer;
import org.jactr.core.production.request.ChunkTypeRequest;
import org.jactr.modules.pm.buffer.IPerceptualBuffer;
import org.jactr.modules.pm.motor.AbstractMotorModule;
import org.jactr.modules.pm.motor.command.IMovement;
public class Movement implements IMovement
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory.getLog(Movement.class);
final private AbstractMotorModule _module;
final private ChunkTypeRequest _definingPattern;
private MuscleState _muscleState;
private IIdentifier _muscleIdentifier;
private IIdentifier _commandIdentifier;
private State _state;
private double[] _timingInfo;
public Movement(ChunkTypeRequest pattern, IIdentifier muscleId,
AbstractMotorModule module)
{
_definingPattern = pattern;
_module = module;
_muscleIdentifier = muscleId;
}
protected void configure(MuscleState muscleState,
IIdentifier commandIdentifier)
{
_commandIdentifier = commandIdentifier;
_muscleState = muscleState;
}
protected void setTimingInfo(double[] timing)
{
_timingInfo = timing;
}
protected double[] getTimingInfo()
{
return _timingInfo;
}
public ChunkTypeRequest getChunkTypeRequest()
{
return _definingPattern;
}
public IIdentifier getCommandIdentifier()
{
return _commandIdentifier;
}
public MuscleState getMuscleState()
{
return _muscleState;
}
public IIdentifier getMuscleIdentifier()
{
return _muscleIdentifier;
}
public void setState(State state, boolean updateNow)
{
if (_state != state)
{
_state = state;
if (updateNow)
updateMuscleState();
else
_module.getModel().getCycleProcessor().executeBefore(new Runnable() {
public void run()
{
updateMuscleState();
}
});
}
}
public State getState()
{
return _state;
}
protected void updateMuscleState()
{
switch (_state)
{
case INITIALIZED:
_muscleState.set(_module.getFreeChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PREPARATION_SLOT,
IPerceptualBuffer.PROCESSOR_SLOT, IPerceptualBuffer.EXECUTION_SLOT);
break;
case PREPARING:
_muscleState.set(_module.getBusyChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PREPARATION_SLOT);
break;
case PREPARED:
_muscleState.set(_module.getFreeChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PREPARATION_SLOT);
break;
case PROCESSING:
_muscleState.set(_module.getBusyChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PROCESSOR_SLOT, IPerceptualBuffer.EXECUTION_SLOT);
break;
case EXECUTING:
_muscleState.set(_module.getFreeChunk(),
IPerceptualBuffer.PROCESSOR_SLOT);
_muscleState.set(_module.getBusyChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.EXECUTION_SLOT);
break;
case ABORTING:
_muscleState.set(_module.getAbortingChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PREPARATION_SLOT,
IPerceptualBuffer.PROCESSOR_SLOT, IPerceptualBuffer.EXECUTION_SLOT);
break;
case COMPLETED:
_muscleState.set(_module.getFreeChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PREPARATION_SLOT,
IPerceptualBuffer.PROCESSOR_SLOT, IPerceptualBuffer.EXECUTION_SLOT);
break;
case FAILED:
_muscleState.set(_module.getErrorChunk(), IStatusBuffer.STATE_SLOT,
IPerceptualBuffer.PREPARATION_SLOT,
IPerceptualBuffer.PROCESSOR_SLOT, IPerceptualBuffer.EXECUTION_SLOT);
break;
}
}
@Override
public String toString()
{
return _definingPattern.toString();
}
}