--- /dev/null
+ \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