org.squidy.nodes.tracking.CameraConfigComm.java Source code

Java tutorial

Introduction

Here is the source code for org.squidy.nodes.tracking.CameraConfigComm.java

Source

/**
 * Squidy Interaction Library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * Squidy Interaction Library is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Squidy Interaction Library. If not, see
 * <http://www.gnu.org/licenses/>.
 * 
 * 2009 Human-Computer Interaction Group, University of Konstanz.
 * <http://hci.uni-konstanz.de>
 * 
 * Please contact info@squidy-lib.de or visit our website
 * <http://www.squidy-lib.de> for further information.
 */

package org.squidy.nodes.tracking;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squidy.manager.ProcessException;
import org.squidy.manager.controls.ComboBox;
import org.squidy.manager.controls.TextField;
import org.squidy.manager.data.DataConstant;
import org.squidy.manager.data.IDataContainer;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.Throughput;
import org.squidy.manager.data.domainprovider.impl.EndianDomainProvider;
import org.squidy.manager.data.impl.DataObject;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.manager.util.DataUtility;
import org.squidy.nodes.ir.ConfigManagable;
import org.squidy.nodes.tracking.config.ConfigNotifier;

import java.net.Socket;
import com.illposed.osc.Endian;
import com.illposed.osc.OSCBundle;
import com.illposed.osc.OSCListener;
import com.illposed.osc.OSCMessage;
import com.illposed.osc.OSCPortIn;
import com.illposed.osc.OSCPortOut;

public class CameraConfigComm /*extends Thread*/ implements ImageCallback {

    private static final Log LOG = LogFactory.getLog(CameraConfigComm.class);

    private String addressOutgoing = "127.0.0.1";
    private int portOutgoing = 4444;

    public int getPortOutgoing() {
        return portOutgoing;
    }

    public void setPortOutgoing(int portOutgoing) {

        if (portOutgoing != this.portOutgoing) {
            this.portOutgoing = portOutgoing;
            if (oscPortOut != null) {
                oscPortOut.close();
                try {
                    oscPortOut = new OSCPortOut(InetAddress.getByName(addressOutgoing), portOutgoing);
                } catch (SocketException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    private int portIncoming = 4445;

    public int getPortIncoming() {
        return portIncoming;
    }

    public void setPortIncoming(int portIncoming) {

        if (portIncoming != this.portIncoming) {
            this.portIncoming = portIncoming;
            if (oscPortIn != null) {
                oscPortIn.stopListening();
                oscPortIn.close();
                try {
                    oscPortIn = new OSCPortIn(portIncoming, endian);
                } catch (SocketException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                startConfigListener();
            }
        }
    }

    private int id = 0;
    private boolean isFirstImageRequest = true;

    private OSCPortOut oscPortOut;
    private OSCPortIn oscPortIn;
    private ServerSocket imageServer;
    private Socket imageClient;
    private DatagramSocket imageClientUDP;
    private boolean initDone = false;
    private Endian endian;
    private CameraCallback configUpdate;
    private DataInputStream is;
    private String line;
    private int MAX_LEN = 100000;
    private byte[] imgBuffer;
    private int imgLoadDelay = 250;
    private ImageListener il;
    private boolean connectedToImageClient = false;
    private boolean streamImage = false;
    private ImageListener imageListener = null;
    private boolean isStopped = true;
    private int imageServerPort = 7777;

    public int getImageServerPort() {
        return imageServerPort;
    }

    public void setImageServerPort(int imageServerPort) {

        if (imageServerPort != this.imageServerPort) {

            this.imageServerPort = imageServerPort;

            try {
                if (imageServer != null) {
                    imageServer.close();
                    imageServer = new ServerSocket(imageServerPort);
                    if (imageListener != null) {
                        imageListener = new ImageListener(imageServer, this);
                    }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public boolean isStopped() {
        return isStopped;
    }

    public void setStopped(boolean isStopped) {
        this.isStopped = isStopped;
    }

    public CameraConfigComm(String addressOut, int portOut, int portIn, int imageServerPort, Endian endian,
            CameraCallback cb) {
        this.imageServerPort = imageServerPort;
        portOutgoing = portOut;
        portIncoming = portIn;
        addressOutgoing = addressOut;
        this.endian = endian;
        configUpdate = cb;
    }

    public void updateImage(BufferedImage img) {
        configUpdate.imageUpdate(img);
    }

    /*
     * public void streamImage(){ new Thread() {
     * 
     * @Override public void run() { super.run();
     * 
     * 
     * 
     * 
     * } }.start(); }
     */

    /*
    @Override
    public void run() {
       imageListener.setStopped(false);
       while (!isInterrupted() && !isStopped) {
        
     try {
            
        Thread.sleep(imgLoadDelay);
        OSCBundle bundle = new OSCBundle();
        OSCMessage param = new OSCMessage("/config/param");
        param.addArgument(id);
        param.addArgument(1);
        param.addArgument("set");
        param.addArgument("stream_image");
        param.addArgument("bool");
        param.addArgument("true");
        bundle.addPacket(param);
        try {
           oscPortOut.send(bundle);
        } catch (IOException e) {
           interrupt();
           imageListener.setStopped(true);
           //throw new ProcessException(e.getMessage(), e);
        }
        if (!imageListener.isAlive())
           imageListener.start();
        
            
     } catch (InterruptedException e) {
        interrupt();
        // System.out.println( "Unterbrechung in sleep()" );
     }
       }
       imageListener.setStopped(true);
    }
    */

    public void closeConnections() {
        if (oscPortOut != null)
            oscPortOut.close();
        if (oscPortIn != null) {
            oscPortIn.stopListening();
            oscPortIn.close();
        }
        //if(imageClientUDP != null)
        {

            //imageClientUDP.close();
        }
        try {
            if (imageServer != null) {
                imageServer.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        initDone = false;
    }

    public void initConnection() throws UnknownHostException {
        try {
            //if(oscPortOut == null )
            {
                oscPortOut = new OSCPortOut(InetAddress.getByName(addressOutgoing), portOutgoing);
            }
            //if(oscPortIn == null )
            {
                oscPortIn = new OSCPortIn(portIncoming, endian);
                startConfigListener();
            }
            //imageClientUDP = new DatagramSocket(7778);

            try {
                //if( imageServer == null && !imageServer.isBound()){
                imageServer = new ServerSocket(imageServerPort);
                //}
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            initDone = true;
        } catch (SocketException e) {
            throw new ProcessException(e.getMessage(), e);
        }
    }

    public void waitForImage() {
        try {

            /*
             * byte[] imgArrUDP = new byte[MAX_LEN]; DatagramPacket p = new
             * DatagramPacket(imgArrUDP, MAX_LEN); imageClientUDP.receive(p);
             * byte[] imgArr = new byte[p.getLength()];
             * System.arraycopy(imgArrUDP, 0, imgArr, 0, p.getLength());
             */

            if (!connectedToImageClient) {
                imageClient = imageServer.accept();
                connectedToImageClient = true;
            }

            is = new DataInputStream(imageClient.getInputStream());

            int i1 = is.read();
            int i2 = is.read();
            int i3 = is.read();
            int i4 = is.read();

            String s1 = Integer.toHexString(i1);
            String s2 = Integer.toHexString(i2);
            String s3 = Integer.toHexString(i3);
            String s4 = Integer.toHexString(i4);

            String sHex = s4 + s3 + s2 + s1;
            int imgLen = Integer.parseInt(sHex, 16);
            byte[] imgArr = new byte[imgLen];
            byte[] imgTemp = new byte[imgLen];

            int numBytesRead = is.read(imgTemp, 0, imgLen);
            System.arraycopy(imgTemp, 0, imgArr, 0, numBytesRead);
            while (numBytesRead < imgLen) {
                int bytesRead = is.read(imgTemp, 0, imgLen);
                System.arraycopy(imgTemp, 0, imgArr, numBytesRead - 1, bytesRead);
                numBytesRead += bytesRead;
            }

            // byte [] imgArr = new byte[v.size()];
            // byte[] imgArr = (byte[])al.toArray();
            BufferedImage image = ImageIO.read(new ByteArrayInputStream(imgArr));
            File outputFile = new File("image.jpg");
            ImageIO.write(image, "JPG", outputFile);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void startConfigListener() {

        oscPortIn.addListener("/config/param", new OSCListener() {
            public void acceptMessages(Date time, OSCMessage[] messages) {
                for (OSCMessage message : messages) {
                    Object[] arguments = message.getArguments();
                    int ackID = -1;
                    int numArgs = arguments.length;
                    ackID = Integer.parseInt(arguments[0].toString());
                    int numParams = Integer.parseInt(arguments[1].toString());
                    for (int i = 2; i < numArgs; i += 4) {
                        String command = arguments[i].toString();
                        String name = arguments[i + 1].toString();
                        String type = arguments[i + 2].toString();
                        String value = arguments[i + 3].toString();
                        configUpdate.configUpdate(name, type, value);
                    }
                }
            }
        });

        oscPortIn.startListening();
    }

    public void sendMultipleParameters(String name, String type, String[] values, int numParams) {
        if (!initDone) {
            try {
                initConnection();
            } catch (UnknownHostException e1) {
                if (LOG.isErrorEnabled()) {
                    LOG.error(e1.getMessage(), e1);
                }
                System.out.println("Could not connect to Camera on " + addressOutgoing + " : " + portOutgoing);
                return;
            }
        }
        OSCBundle bundle = new OSCBundle();
        OSCMessage param = new OSCMessage("/config/param");
        param.addArgument(id);
        param.addArgument(numParams);
        param.addArgument("set");
        for (int i = 0; i < numParams; i++) {
            param.addArgument(name);
            param.addArgument(type);
            param.addArgument(values[i]);
        }
        bundle.addPacket(param);
        //   int len = bundle.getByteArray().length;

        try {
            oscPortOut.send(bundle);
        } catch (IOException e) {
            throw new ProcessException(e.getMessage(), e);
        }

    }

    public void sendParameter(String name, String type, String value) {
        if (!initDone) {
            try {
                initConnection();
            } catch (UnknownHostException e1) {
                if (LOG.isErrorEnabled()) {
                    LOG.error(e1.getMessage(), e1);
                }
                System.out.println("Could not connect to Camera on " + addressOutgoing + " : " + portOutgoing);
                return;
            }
        }
        OSCBundle bundle = new OSCBundle();
        OSCMessage param = new OSCMessage("/config/param");

        param.addArgument(id);
        param.addArgument(1);
        param.addArgument("set");
        param.addArgument(name);
        param.addArgument(type);
        param.addArgument(value);
        bundle.addPacket(param);
        int len = bundle.getByteArray().length;

        if (name.equals("stream_image") && value.equals("true")) {

            //init imageServer
            if (imageServer == null) {
                try {
                    imageServer = new ServerSocket(imageServerPort);
                } catch (IOException e) {
                    e.printStackTrace();
                    imageServer = null;
                }
            }
            if (imageListener == null) {
                imageListener = new ImageListener(imageServer, this);
                imageListener.start();
            }
        }

        //send
        try {
            oscPortOut.send(bundle);
        } catch (IOException e) {
            throw new ProcessException(e.getMessage(), e);
        }

        /*
        if (name.equals("stream_image") && value.equals("true")) {
           try {
        imageServer.close();         
        imageServer = new ServerSocket(imageServerPort);
           } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
           }
           imageListener = new ImageListener(imageServer, this);
           if (!this.isAlive())
        this.start();
           else
        this.resume();
            
        } else if (name.equals("stream_image") && value.equals("false")) {
           try {
        imageServer.close();
        imageServer = new ServerSocket(imageServerPort);
        if (this.isAlive())
           this.suspend();
            
           } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
           }
        } else {
           try {
        oscPortOut.send(bundle);
           } catch (IOException e) {
        throw new ProcessException(e.getMessage(), e);
           }
        }
        */
        id++;

    }
    /*
     * public void requestImage() { if( !initDone ) { try { initConnection(); }
     * catch (UnknownHostException e1) { if (LOG.isErrorEnabled()) {
     * LOG.error(e1.getMessage(), e1); }
     * System.out.println("Could not connect to Camera on " + addressOutgoing +
     * " : " + portOutgoing); return; } } OSCBundle bundle = new OSCBundle();
     * OSCMessage param = new OSCMessage("/config/param");
     * param.addArgument(id); param.addArgument("get");
     * param.addArgument("image"); bundle.addPacket(param); int len =
     * bundle.getByteArray().length; try { oscPortOut.send(bundle); } catch
     * (IOException e) { throw new ProcessException(e.getMessage(), e); } id++;
     * }
     */
}