/* * TODO: * - determine which action to execute * - send message to actuator * - optimisation: reuse the same json_parser, don't recreate it */ import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import jade.core.AID; import jade.core.Agent; import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage; public class ControllerBehaviour extends CyclicBehaviour { /** * Last pv sent by the sensor. */ private Long pv1; private Long pv2; /** * Last timestamp sent by the sensor. */ private Long timestamp; public void action() { /* receive the message */ ACLMessage msg = this.myAgent.receive(); if (msg != null) { /* parse the json message */ // to optimize performance we can avoid this object // creation and reuse an existing one. JSONParser parser = new JSONParser(); Object parsed_content = null; try { parsed_content = (JSONObject)parser.parse(msg.getContent()); } catch(ParseException e) { System.out.println("Controller:error:" + e); } JSONObject json_content = (JSONObject)parsed_content; /* access and process the received values from the sensor */ this.pv1 = (Long)json_content.get("pv1"); this.pv2 = (Long)json_content.get("pv2"); this.timestamp = (Long)json_content.get("timestamp"); System.out.println("Controller: pv1 = " + this.pv1 + ", pv2 = " + this.pv2 + ", timestamp = " + this.timestamp ); /* send order to actuor */ long order = this.determineOrder(); this.sendOrder(order, this.timestamp); } else { block(); } } private long determineOrder() { long order = 0; if(this.pv1 > 0) { order = -1; } else if(this.pv1 < 0) { order = 1; } return order; } private void sendOrder(long order, Long timestamp) { /* send message */ ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("Khepera_sensor", AID.ISLOCALNAME)); // TODO /* json formating */ JSONObject json_msg = new JSONObject(); json_msg.put("u", order); json_msg.put("timestamp", this.timestamp); msg.setContent(json_msg.toString()); myAgent.send(msg); } }