package OpenDis4Examples;

// originally edu.nps.moves.examples.ReceiverPerformance

import java.net.*;

import edu.nps.moves.dis.*;
import edu.nps.moves.disutil.PduFactory;
import java.io.IOException;

/** Listen for IEEE DIS Protocol Data Units (PDUs) */
public class PduReceiver 
{
    /** Default constructor */
    public PduReceiver()
    {
        // default constructor
    }
    private static final int    MULTICAST_PORT  = 3000;
    private static final String MULTICAST_GROUP = "239.1.2.3";
    private static final boolean USE_FAST_ESPDU = false;
    
    /**
     * Program invocation, execution starts here
     * @param args command-line arguments
     */
    public static void main(String args[])
    {
        PduFactory      factory;
        MulticastSocket socket;
        InetAddress     address;
		DatagramPacket  packet;
		
        try
        {
			System.out.println("OpenDis4Examples.PduReceiver started...");
            socket  = new MulticastSocket  (MULTICAST_PORT);
            address = InetAddress.getByName(MULTICAST_GROUP);
//          socket.joinGroup(address); // deprecated
            // =======================================================================
            // new approach using interface
            NetworkInterface networkInterface = NetworkInterface.getByInetAddress(address);
            SocketAddress localMulticastSocketAddress = new InetSocketAddress(address, MULTICAST_PORT);
            socket.joinGroup(localMulticastSocketAddress, networkInterface);
            // =======================================================================
            
            factory = new PduFactory();
            
            while (true) // Loop infinitely, receiving datagrams
            {
                byte buffer[] = new byte[1500]; // typical MTU size
                
                packet = new DatagramPacket(buffer, buffer.length); // reset
                
                socket.receive(packet);
                
                Pdu pdu = factory.createPdu (packet.getData());
				if (pdu != null)
				{
					short  currentPduType          = pdu.getPduType();
					String currentPduTypeName      = pdu.getClass().getSimpleName();
					short  currentProtocolFamilyID = pdu.getProtocolFamily();
					String currentPduFamilyName    = pdu.getClass().getSuperclass().getSimpleName();
					
					StringBuilder message = new StringBuilder();
					message.append("received DIS PDU: ");
					message.append("pduType ");
					if (currentPduType < 10)
						message.append(" ");
					message.append(currentPduType).append(" ").append(currentPduTypeName);
					message.append(", protocolFamily ").append(currentProtocolFamilyID);
					message.append(" ").append(currentPduFamilyName);
				    System.out.println(message.toString());
				}
				else System.out.println("received packet but pdu is null, packet.getData().length=" + packet.getData().length + ", error...");
            }
        }
        catch (IOException e)
        {
            System.out.println("Problem with OpenDis4Examples.PduReceiver, see exception trace:");
            System.out.println(e);
        }
        finally
        {
            System.out.println("OpenDis4Examples.PduReceiver complete.");
        }
    }
}