tinyos-main-master/deprecated/tosthreads/apps/tosthreads/capps/TestCollection/java/Node.java
/*
 * Copyright (c) 2006 Intel Corporation
 * All rights reserved.
 *
 * This file is distributed under the terms in the attached INTEL-LICENSE     
 * file. If you do not find these files, copies can be found by writing to
 * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
 * 94704.  Attention:  Intel License Inquiry.
 */

/**
 * Class holding all data received from a mote.
 */
class Node {
    /* Data is hold in an array whose size is a multiple of INCREMENT, and
       INCREMENT itself must be a multiple of Constant.NREADINGS. This
       simplifies handling the extension and clipping of old data
       (see setEnd) */
    final static int INCREMENT = 100 * Constants.NREADINGS;
    final static int MAX_SIZE = 100 * INCREMENT; // Must be multiple of INCREMENT

    /* The mote's identifier */
    int id;

    /* Data received from the mote. data[0] is the dataStart'th sample
       Indexes 0 through dataEnd - dataStart - 1 hold data.
       Samples are 16-bit unsigned numbers, -1 indicates missing data. */
    int[] data;
    int dataStart, dataEnd;

    Node(int _id) {
	id = _id;
    }

    /* Update data to hold received samples newDataIndex .. newEnd.
       If we receive data with a lower index, we discard newer data
       (we assume the mote rebooted). */
    private void setEnd(int newDataIndex, int newEnd) {
	if (newDataIndex < dataStart || data == null) {
	    /* New data is before the start of what we have. Just throw it
	       all away and start again */
	    dataStart = newDataIndex;
	    data = new int[INCREMENT];
	}
	if (newEnd > dataStart + data.length) {
	    /* Try extending first */
	    if (data.length < MAX_SIZE) {
		int newLength = (newEnd - dataStart + INCREMENT - 1) / INCREMENT * INCREMENT;
		if (newLength >= MAX_SIZE)
		    newLength = MAX_SIZE;

		int[] newData = new int[newLength];
		System.arraycopy(data, 0, newData, 0, data.length);
		data = newData;

	    }
	    if (newEnd > dataStart + data.length) {
		/* Still doesn't fit. Squish.
		   We assume INCREMENT >= (newEnd - newDataIndex), and ensure
		   that dataStart + data.length - INCREMENT = newDataIndex */
		int newStart = newDataIndex + INCREMENT - data.length;

		if (dataStart + data.length > newStart)
		    System.arraycopy(data, newStart - dataStart, data, 0,
				     data.length - (newStart - dataStart));
		dataStart = newStart;
	    }
	}
	/* Mark any missing data as invalid */
	for (int i = dataEnd < dataStart ? dataStart : dataEnd;
	     i < newDataIndex; i++)
	    data[i - dataStart] = -1;

	/* If we receive a count less than the old count, we assume the old
	   data is invalid */
	dataEnd = newEnd;

    }

    /* Data received containing NREADINGS samples from messageId * NREADINGS 
       onwards */
    void update(int messageId, int readings[]) {
	int start = messageId * Constants.NREADINGS;
	setEnd(start, start + Constants.NREADINGS);
	for (int i = 0; i < readings.length; i++)
	    data[start - dataStart + i] = readings[i];
    }

    /* Return value of sample x, or -1 for missing data */
    int getData(int x) {
	if (x < dataStart || x >= dataEnd)
	    return -1;
	else
	    return data[x - dataStart];
    }

    /* Return number of last known sample */
    int maxX() {
	return dataEnd - 1;
    }
}
