]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - apps/tosthreads/capps/TestCollection/java/Node.java
added java stuff to the TestCollection apps
[tinyos-2.x.git] / apps / tosthreads / capps / TestCollection / java / Node.java
diff --git a/apps/tosthreads/capps/TestCollection/java/Node.java b/apps/tosthreads/capps/TestCollection/java/Node.java
new file mode 100644 (file)
index 0000000..cfe8db9
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * 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;
+    }
+}