/** * This callback is specific to TreeAgentState * and has no UI dependencies, so it is included here. * It should not be used with any agent state other then * TreeAgentState */ public class TreeCallbackCatchPhase2 implements ISimUICallback { boolean m_bTimeInit; double m_lfFirstTime; double m_lfLastTime; boolean m_bDoneLastTime; boolean m_bAllConnected; public TreeCallbackCatchPhase2() { m_bAllConnected = false; m_bTimeInit = false; m_bDoneLastTime = false; } public boolean doCallback(double [] arrLfState, IAgent agent, StateBundle [] arrStates, ISensor [] arrSensors, IEnvironment env , CommGraph graph, double lfSimTime) { if(m_bTimeInit == false) { m_lfFirstTime = lfSimTime; m_bTimeInit = true; } m_lfLastTime = lfSimTime; boolean bResult = true; m_bAllConnected = true; for(int i = 1; i < arrStates.length; ++i) { TreeAgentState currState = (TreeAgentState)(arrStates[i].getVars()); Boolean bDone1 = currState.getBoolVar(new Integer(0)); // just catch when everyone's attached to an ancestor -- // which might save us a few cycles, though not many if(bDone1 != null) { bResult = bResult && bDone1.booleanValue(); } else { bResult = false; } if(!currState.getDfsFinished() || currState.getParentId() < 0) { if(m_lfLastTime > 50.0) { System.out.println("This is bad"); } m_bAllConnected = false; bResult = false; } } m_bDoneLastTime = bResult; return bResult; } /** * In case we need more info then true/false from doCallback * @return arbitrary object (meaning depends on derived class) */ public Object getLastObject() { if(m_bTimeInit == false || m_bAllConnected == false) { double lfTimeDiff = m_lfLastTime - m_lfFirstTime; System.out.println("Time init == "+m_bTimeInit+ ", all connected == "+m_bAllConnected+ ", Last result == "+m_bDoneLastTime); System.out.println("Time would be "+lfTimeDiff); return new Boolean(false); } return new Double(m_lfLastTime-m_lfFirstTime); } }