OSDN Git Service

lejos_NXJ_win32_0_4_0beta.zip
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / java / classes / lejos / nxt / Datalogger.java
diff --git a/nxtOSEK/lejos_nxj/src/java/classes/lejos/nxt/Datalogger.java b/nxtOSEK/lejos_nxj/src/java/classes/lejos/nxt/Datalogger.java
new file mode 100644 (file)
index 0000000..dfcff71
--- /dev/null
@@ -0,0 +1,160 @@
+         \r
+package lejos.nxt;\r
+import javax.microedition.io.StreamConnection;\r
+import lejos.nxt.comm.*;\r
+\r
+import java.io.*;\r
+/**\r
+ * Datalogger class; stores float values then  then transmits  via bluetooth or usb<br>\r
+ * works with DataViewer   in pctools.\r
+ * A maximum of 2000 data values can be stored. \r
+ */\r
+public class Datalogger \r
+{\r
+   // overcome limitation of array size; created as needed\r
+   private float [] log0;  \r
+   private float [] log1;\r
+   private float [] log2;\r
+   private float [] log3;\r
+   private int _indx = 0;  //where the data will be witten\r
+\r
+   private final int  BLOCK = 510; // block size\r
+   private int _blocks = 1; \r
+\r
+\r
+\r
+    public Datalogger()\r
+    {\r
+      log0 = new float[BLOCK];\r
+     \r
+    }\r
+/**\r
+ * write a float  value to the log\r
+ * @param v\r
+ */\r
+  public void writeLog(float v)\r
+  {   \r
+     if(_indx>=_blocks * BLOCK)\r
+     {\r
+        if(_blocks == 1 && log1 == null)log1 = new float[BLOCK];\r
+        else if(_blocks == 2 && log2 == null)log2 = new float[BLOCK];\r
+        else if(_blocks == 3 && log3 == null)log3 = new float [BLOCK];\r
+        else if (_blocks == 4) return;\r
+        _blocks ++;\r
+     }\r
+    if(_blocks == 1) log0[_indx]= v;\r
+    else  if(_blocks == 2)log1[_indx %BLOCK]= v;\r
+    else  if(_blocks == 3)log2[_indx %BLOCK]= v;\r
+    else  if(_blocks == 4)log3[_indx %BLOCK]= v;\r
+    else return;\r
+    _indx++;\r
+  }\r
+  \r
+  /**\r
+   * Clears the log; next write is at the beginning;\r
+   *\r
+   */\r
+  public void reset()\r
+  {\r
+     _indx = 0;\r
+     _blocks = 1;\r
+  }\r
+  \r
+ /**\r
+  * transmit the stored values to the PC via USB or bluetooth;<br>\r
+  * Displays "waiting" , so then start the DataViewer. \r
+  * When finished, displays the number values sent, and asks "Resend?". \r
+  * Press ENTER for yes, ESC to exit the program.\r
+  * @param useUSB  if false, uses Bluetooth\r
+  *\r
+  */\r
+    public  void transmit(boolean useUSB)\r
+    {\r
+       StreamConnection connection= null;\r
+       DataOutputStream dataOut = null;\r
+       InputStream is = null;\r
+       boolean more = true;\r
+       while(more)\r
+       {\r
+          LCD.clear();\r
+          LCD.drawInt(_indx, 0, 0);\r
+          LCD.drawString("waiting",8,0);\r
+          LCD.refresh();  \r
+          if(useUSB)\r
+          {\r
+             connection = new USBConnection();\r
+          }\r
+          else \r
+          {\r
+             connection = Bluetooth.waitForConnection();\r
+          }\r
+          try \r
+             { \r
+                dataOut=  connection.openDataOutputStream(); \r
+                is = connection.openInputStream(); \r
+                LCD.drawString("connected", 0, 1);\r
+                LCD.refresh();\r
+                int b = 0; \r
+                b = is.read();\r
+                LCD.drawInt(b, 8, 1);\r
+                LCD.refresh();\r
+             }\r
+             catch(IOException ie){LCD.drawString("no connection",0,0); LCD.refresh();}\r
+             LCD.clear();\r
+             LCD.drawString("sending",0,0);\r
+             LCD.drawInt(_indx, 12, 0);\r
+             LCD.refresh();\r
+             try\r
+             {\r
+               dataOut.writeFloat(_indx);\r
+               dataOut.flush();\r
+               for (int i = 0; i<_indx ; i++) \r
+               {        \r
+                  if(i<BLOCK)dataOut.writeFloat(log0[i]);   \r
+                  else if(i<2*BLOCK)dataOut.writeFloat(log1[i%BLOCK]);\r
+                  else if(i<3*BLOCK)dataOut.writeFloat(log2[i%BLOCK]);\r
+                  else if(i<3*BLOCK)dataOut.writeFloat(log3[i%BLOCK]);\r
+                  try{Thread.sleep(4);} catch (InterruptedException e ){}\r
+               }\r
+               dataOut.flush();\r
+               dataOut.close();\r
+          }\r
+          catch(IOException e)  {LCD.drawString("write error",0,0); LCD.refresh();}\r
+          Sound.beepSequence();\r
+          LCD.clear();\r
+          LCD.drawString("sent",0,0);\r
+          LCD.drawInt(_indx, 8, 0);\r
+          LCD.drawString("Resend?", 0, 1);\r
+          LCD.refresh();\r
+          more = Button.waitForPress()==1;\r
+       }\r
+       try{dataOut.close();}catch(IOException e){}\r
+    }\r
+\r
+       \r
+      \r
+          \r
+  /**\r
+   * to test the DL object\r
+   */  \r
+    public static void main(String[] args)\r
+    {\r
+       int size =600;\r
+       Datalogger dl = new Datalogger();\r
+       boolean more = true;\r
+       while(more)\r
+       {\r
+       for(int i = 0 ; i<size; i++)\r
+          {\r
+             float x = i*0.5f;\r
+             dl.writeLog(x);\r
+          }\r
+       dl.transmit(true); \r
+       dl.reset();\r
+       LCD.clear();\r
+       LCD.drawString("more?",0,2);\r
+       LCD.refresh();\r
+       more = 1 == Button.waitForPress();\r
+       }\r
+    }\r
+}\r