/** * Mazilu Sinziana * * EZCab Client Entity */ package vnsim.applications.ezcab; import java.io.IOException; import java.io.Serializable; import java.nio.ByteBuffer; import vnsim.core.Communicator; import vnsim.core.Engine; import vnsim.core.events.SendEvent; import vnsim.map.object.Globals; import vnsim.network.dsrc.CarRunningDSRC; public class EzcabClient extends CarRunningDSRC{ private int entityType; /*type of entity: client or taxi car*/ private int state; /* state of client */ private int sendingTime; /* time of first request */ private int periodicalTime; /* periodical sending time */ private EzcabMessage newMessage; public EzcabClient(int state, int vehicleId, byte lane, double speed, short roadIdx, short pointIdx, byte direction,double offset) { super(vehicleId, lane, speed, roadIdx, pointIdx, direction, offset); this.entityType = EzcabGlobals.CLIENT; this.state = state; /* we create the message */ sendingTime = Globals.engine.crtTime; periodicalTime = Globals.engine.crtTime; this.newMessage = new EzcabRequest(Globals.PROT_EZCAB, EzcabGlobals.REQUEST, this.vehicleId, EzcabGlobals.MAX_HOPS, Globals.engine.crtTime); SendEvent e = new SendEvent(Globals.engine.crtTime, this, Globals.TYPE_EZCAB); e.setMessageObject(newMessage); Globals.engine.schedEvent(e); System.out.println("Scheduled event with id "+Globals.TYPE_EZCAB); } public EzcabClient(int vehicleId, byte lane, double speed, short roadIdx, short pointIdx, byte direction,double offset) { super(vehicleId, lane, speed, roadIdx, pointIdx, direction, offset); this.entityType = EzcabGlobals.CLIENT; this.state = EzcabGlobals.WAITING_STATE; /* we create the message */ sendingTime = Globals.engine.crtTime; periodicalTime = Globals.engine.crtTime; this.newMessage = new EzcabRequest(Globals.PROT_EZCAB, EzcabGlobals.REQUEST, this.vehicleId, EzcabGlobals.MAX_HOPS, Globals.engine.crtTime); SendEvent e = new SendEvent(Globals.engine.crtTime, this, Globals.TYPE_EZCAB); e.setMessageObject(this.newMessage); Globals.engine.schedEvent(e); try { Engine.bwClient.write("client: " + this.vehicleId + " sending: "+ (float)Globals.engine.crtTime / Globals.SECOND *1000 + "\n"); Engine.bwClient.flush(); } catch (IOException e1) { e1.printStackTrace(); } System.out.println("Scheduled event with id " + Globals.TYPE_EZCAB); } public void onReceive(byte[] bytesReceived, Serializable m, Communicator sender){ if (!isEquipped) return; if(bytesReceived == null){ processMessage(m); return; } byte header = bytesReceived[0]; switch(header) { case Globals.PROT_EZCAB: processMessage(m); break; default: super.onReceive(bytesReceived, m, sender); } } public void processMessage(Serializable m) { if( (((long)(Globals.engine.getCrtTime() - this.periodicalTime)/Globals.SECOND * 1000) > EzcabGlobals.TIMEOUT) && (this.state != EzcabGlobals.BUSY_STATE)){ /* make a new request */ this.newMessage = new EzcabRequest(Globals.PROT_EZCAB, EzcabGlobals.REQUEST, this.vehicleId, EzcabGlobals.MAX_HOPS, this.sendingTime); SendEvent e = new SendEvent(Globals.engine.crtTime, this, Globals.TYPE_EZCAB); e.setMessageObject(this.newMessage); } if(m == null) return; if( (m instanceof EzcabRequest) || (m instanceof EzcabAck) ){ return; } if(m instanceof EzcabResponse){ EzcabResponse res = (EzcabResponse)m; int idCab = res.getIdFreeCab(); int idClient = res.getIdClient(); if(idClient == this.vehicleId && this.state != EzcabGlobals.BUSY_STATE){ System.out.println("client: " + idClient + ", masina: " + idCab); this.state = EzcabGlobals.BUSY_STATE; /* randomize the answer of the client */ //if(System.currentTimeMillis() % 2 == 0){ this.newMessage = new EzcabAck(Globals.PROT_EZCAB, EzcabGlobals.ACK, this.vehicleId, idCab, EzcabGlobals.MAX_HOPS); //} //else // this.newMessage = null; } } SendEvent e = new SendEvent(Globals.engine.crtTime, this, Globals.TYPE_EZCAB); e.setMessageObject(this.newMessage); Globals.engine.schedEvent(e); } public byte[] prepareMessage(int messageType){ byte[] bytesToSend=null; if ( (!isEquipped) || (this.newMessage == null) ) return null; if(messageType == Globals.TYPE_EZCAB){ if(this.newMessage instanceof EzcabRequest){ EzcabRequest request = (EzcabRequest)this.newMessage; ByteBuffer bb = ByteBuffer.allocate(17); bb.put(request.getProtType()); //bb.put(Globals.PROT_EZCAB); bb.putInt(request.getMessageType()); //bb.putInt(EzcabGlobals.REQUEST); bb.putInt(request.getIdClient()); bb.putInt(request.getNoHops()); bb.putInt(request.getTimeOfSending()); bytesToSend = bb.array(); } if(this.newMessage instanceof EzcabAck){ EzcabAck ack = (EzcabAck)this.newMessage; ByteBuffer bb = ByteBuffer.allocate(17); bb.put(ack.getProtType()); //bb.put(Globals.PROT_EZCAB); bb.putInt(ack.getMessageType()); //bb.putInt(EzcabGlobals.ACK); bb.putInt(ack.getIdClient()); bb.putInt(ack.getIdCab()); bb.putInt(ack.getNoHops()); bytesToSend = bb.array(); } return bytesToSend; } else{ return super.prepareMessage(messageType); } } }