front_processing/extern/TUIO_JAVA/src/com/illposed/osc/OSCBundle.java
author bastiena
Tue, 20 Mar 2012 18:00:55 +0100
changeset 7 8a21bec5d45f
parent 0 6fefd4afe506
child 9 0f44b7360c8d
permissions -rw-r--r--
Middleware : No proximity bugs anymore. The skeleton disappear if a tracked person is too close or not tracked anymore. Processing : There are no laggs anymore when an user stay too long moving his hands and drawing tons of ellipses. (TUIO Cursors are not taken by their vectors, only the last position of the cursors are caught to be drawn).


/**
 * @author cramakrishnan
 *
 * Copyright (C) 2003, C. Ramakrishnan / Illposed Software
 * All rights reserved.
 * 
 * See license.txt (or license.rtf) for license information.
 * 
 *
 * OscBundle represents a collection of OscPackets.
 *
 * Use this when you want to send a bunch of OscPackets
 * in one go.
 *
 * Internally, I use Vector to maintain jdk1.1 compatability
 */

package com.illposed.osc;
import java.math.BigInteger;
import java.util.Date;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.Vector;

import com.illposed.osc.utility.*;

public class OSCBundle extends OSCPacket {

	protected Date timestamp;
	//	protected OSCPacket[] packets;
	protected Vector<OSCPacket> packets;
	public static final BigInteger SECONDS_FROM_1900_to_1970 =
		new BigInteger("2208988800");
	// 17 leap years

	/**
	 * Create a new OSCBundle, with a timestamp of now.
	 * You can add packets to the bundle with addPacket()
	 */
	public OSCBundle() {
		this(null, GregorianCalendar.getInstance().getTime());
	}
	
	/**
	 * Create an OSCBundle with the specified timestamp
	 * @param timestamp
	 */
	public OSCBundle(Date timestamp) {
		this(null, timestamp);
	}

	/**
	 * @param newPackets Array of OSCPackets to initialize this object with
	 */
	public OSCBundle(OSCPacket[] newPackets) {
		this(newPackets, GregorianCalendar.getInstance().getTime());
	}

	/**
	 * @param newPackets OscPacket[]
	 * @param time java.lang.Time
	 */
	public OSCBundle(OSCPacket[] newPackets, Date newTimestamp) {
		super();
		if (null != newPackets) {
			packets = new Vector<OSCPacket>(newPackets.length);
			for (int i = 0; i < newPackets.length; i++) {
				packets.add(newPackets[i]);
			}
		} else
			packets = new Vector<OSCPacket>();
		timestamp = newTimestamp;
		init();
	}
	
	/**
	 * Return the timestamp for this bundle
	 * @return a Date
	 */
	public Date getTimestamp() {
		return timestamp;
	}
	
	/**
	 * Set the timestamp for this bundle
	 * @param timestamp
	 */
	public void setTimestamp(Date timestamp) {
		this.timestamp = timestamp;
	}
	
	/**
	 * Add a packet to the list of packets in this bundle
	 * @param packet
	 */
	public void addPacket(OSCPacket packet) {
		packets.add(packet);
	}
	
	/**
	 * Get the packets contained in this bundle
	 * @return an array of packets
	 */
	public OSCPacket[] getPackets() {
		OSCPacket[] packetArray = new OSCPacket[packets.size()];
		packets.toArray(packetArray);
		return packetArray;
	}

	protected void computeTimeTagByteArray(OSCJavaToByteArrayConverter stream) {
		long millisecs = timestamp.getTime();
		long secsSince1970 = (long) (millisecs / 1000);
		long secs = secsSince1970 + SECONDS_FROM_1900_to_1970.longValue();
		long picosecs = (long) (millisecs - (secsSince1970 * 1000)) * 1000;
		
		stream.write((int) secs);
		stream.write((int) picosecs);

	}

	/**
	 * @param stream OscPacketByteArrayConverter
	 */
	protected void computeByteArray(OSCJavaToByteArrayConverter stream) {
		stream.write("#bundle");
		computeTimeTagByteArray(stream);
		Enumeration enm = packets.elements();
		OSCPacket nextElement;
		byte[] packetBytes;
		while (enm.hasMoreElements()) {
			nextElement = (OSCPacket) enm.nextElement();
			packetBytes = nextElement.getByteArray();
			stream.write(packetBytes.length);
			stream.write(packetBytes);
		}
		byteArray = stream.toByteArray();
	}

}