package jadex.bdi.examples.cleanerworld_classic.environment; import jadex.base.fipa.Done; import jadex.base.fipa.IDF; import jadex.base.fipa.IDFComponentDescription; import jadex.base.fipa.IDFServiceDescription; import jadex.bdi.examples.cleanerworld_classic.Chargingstation; import jadex.bdi.examples.cleanerworld_classic.Cleaner; import jadex.bdi.examples.cleanerworld_classic.Environment; import jadex.bdi.examples.cleanerworld_classic.RequestCompleteVision; import jadex.bdi.examples.cleanerworld_classic.Vision; import jadex.bdi.examples.cleanerworld_classic.Waste; import jadex.bdi.examples.cleanerworld_classic.Wastebin; import jadex.bdi.runtime.GoalFailureException; import jadex.bdi.runtime.IGoal; import jadex.bdi.runtime.Plan; import jadex.commons.service.SServiceProvider; /** * Update the environment belief. */ public class UpdateEnvironmentPlan extends Plan { //-------- conctructors -------- /** * Create a new plan. */ public UpdateEnvironmentPlan() { getLogger().info("Created: "+this); } //-------- methods -------- /** * The plan body. */ public void body() { while(true) { // Search and store the environment agent. if(getBeliefbase().getBelief("environmentagent").getFact()==null) searchEnvironmentAgent(); if(getBeliefbase().getBelief("environmentagent").getFact()==null) { // If no environment agent found, wait a while before trying again. waitFor(5000); } else { RequestCompleteVision rv = new RequestCompleteVision(); IGoal rg = createGoal("rp_initiate"); rg.getParameter("receiver").setValue(getBeliefbase().getBelief("environmentagent").getFact()); rg.getParameter("action").setValue(rv); rg.getParameter("ontology").setValue("cleaner_ontology"); //rg.getParameter("language").setValue(SFipa.FIPA_SL0); try { dispatchSubgoalAndWait(rg); Environment env = (Environment)getBeliefbase().getBelief("environment").getFact(); env.clear(); Vision vision = ((RequestCompleteVision)((Done)rg.getParameter("result").getValue()).getAction()).getVision(); Cleaner[] cleaners = vision.getCleaners(); for(int i=0; i<cleaners.length; i++) env.addCleaner(cleaners[i]); Waste[] wastes = vision.getWastes(); for(int i=0; i<wastes.length; i++) env.addWaste(wastes[i]); Wastebin[] wastebins = vision.getWastebins(); for(int i=0; i<wastebins.length; i++) env.addWastebin(wastebins[i]); Chargingstation[] stations = vision.getStations(); for(int i=0; i<stations.length; i++) env.addChargingStation(stations[i]); env.setDaytime(vision.isDaytime()); } catch(GoalFailureException gfe) { gfe.printStackTrace(); getLogger().warning("Request vision failed: "+gfe); } waitFor(100); //System.out.println("Updated environement"); } } } /** * Search the environent agent and store its AID in the beliefbase. */ protected void searchEnvironmentAgent() { IDF df = (IDF)SServiceProvider.getService(getScope().getServiceProvider(), IDF.class); IDFServiceDescription sd = df.createDFServiceDescription(null, "dispatch vision", null); IDFComponentDescription ad = df.createDFComponentDescription(null, sd); // Use a subgoal to search for a translation agent IGoal ft = createGoal("df_search"); ft.getParameter("description").setValue(ad); if(getBeliefbase().getBelief("df").getFact()!=null) ft.getParameter("df").setValue(getBeliefbase().getBelief("df").getFact()); try { dispatchSubgoalAndWait(ft); //Object result = ft.getResult(); Object result = ft.getParameterSet("result").getValues(); if(result instanceof IDFComponentDescription[]) { IDFComponentDescription[] tas = (IDFComponentDescription[])result; if(tas.length!=0) { getBeliefbase().getBelief("environmentagent").setFact(tas[0].getName()); if(tas.length>1) System.out.println("WARNING: more than environment agent found."); } } } catch(GoalFailureException gfe) { getLogger().warning("DF search failed: "+gfe); } } }