OSDN Git Service

dfcff71bb48e96e3c71aaaefb43a9e250cfaac63
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / java / classes / lejos / nxt / Datalogger.java
1          \r
2 package lejos.nxt;\r
3 import javax.microedition.io.StreamConnection;\r
4 import lejos.nxt.comm.*;\r
5 \r
6 import java.io.*;\r
7 /**\r
8  * Datalogger class; stores float values then  then transmits  via bluetooth or usb<br>\r
9  * works with DataViewer   in pctools.\r
10  * A maximum of 2000 data values can be stored. \r
11  */\r
12 public class Datalogger \r
13 {\r
14    // overcome limitation of array size; created as needed\r
15    private float [] log0;  \r
16    private float [] log1;\r
17    private float [] log2;\r
18    private float [] log3;\r
19    private int _indx = 0;  //where the data will be witten\r
20 \r
21    private final int  BLOCK = 510; // block size\r
22    private int _blocks = 1; \r
23 \r
24 \r
25 \r
26     public Datalogger()\r
27     {\r
28       log0 = new float[BLOCK];\r
29      \r
30     }\r
31 /**\r
32  * write a float  value to the log\r
33  * @param v\r
34  */\r
35   public void writeLog(float v)\r
36   {   \r
37      if(_indx>=_blocks * BLOCK)\r
38      {\r
39         if(_blocks == 1 && log1 == null)log1 = new float[BLOCK];\r
40         else if(_blocks == 2 && log2 == null)log2 = new float[BLOCK];\r
41         else if(_blocks == 3 && log3 == null)log3 = new float [BLOCK];\r
42         else if (_blocks == 4) return;\r
43         _blocks ++;\r
44      }\r
45     if(_blocks == 1) log0[_indx]= v;\r
46     else  if(_blocks == 2)log1[_indx %BLOCK]= v;\r
47     else  if(_blocks == 3)log2[_indx %BLOCK]= v;\r
48     else  if(_blocks == 4)log3[_indx %BLOCK]= v;\r
49     else return;\r
50     _indx++;\r
51   }\r
52   \r
53   /**\r
54    * Clears the log; next write is at the beginning;\r
55    *\r
56    */\r
57   public void reset()\r
58   {\r
59      _indx = 0;\r
60      _blocks = 1;\r
61   }\r
62   \r
63  /**\r
64   * transmit the stored values to the PC via USB or bluetooth;<br>\r
65   * Displays "waiting" , so then start the DataViewer. \r
66   * When finished, displays the number values sent, and asks "Resend?". \r
67   * Press ENTER for yes, ESC to exit the program.\r
68   * @param useUSB  if false, uses Bluetooth\r
69   *\r
70   */\r
71     public  void transmit(boolean useUSB)\r
72     {\r
73        StreamConnection connection= null;\r
74        DataOutputStream dataOut = null;\r
75        InputStream is = null;\r
76        boolean more = true;\r
77        while(more)\r
78        {\r
79           LCD.clear();\r
80           LCD.drawInt(_indx, 0, 0);\r
81           LCD.drawString("waiting",8,0);\r
82           LCD.refresh();  \r
83           if(useUSB)\r
84           {\r
85              connection = new USBConnection();\r
86           }\r
87           else \r
88           {\r
89              connection = Bluetooth.waitForConnection();\r
90           }\r
91           try \r
92              { \r
93                 dataOut=  connection.openDataOutputStream(); \r
94                 is = connection.openInputStream(); \r
95                 LCD.drawString("connected", 0, 1);\r
96                 LCD.refresh();\r
97                 int b = 0; \r
98                 b = is.read();\r
99                 LCD.drawInt(b, 8, 1);\r
100                 LCD.refresh();\r
101              }\r
102              catch(IOException ie){LCD.drawString("no connection",0,0); LCD.refresh();}\r
103              LCD.clear();\r
104              LCD.drawString("sending",0,0);\r
105              LCD.drawInt(_indx, 12, 0);\r
106              LCD.refresh();\r
107              try\r
108              {\r
109                dataOut.writeFloat(_indx);\r
110                dataOut.flush();\r
111                for (int i = 0; i<_indx ; i++) \r
112                {        \r
113                   if(i<BLOCK)dataOut.writeFloat(log0[i]);   \r
114                   else if(i<2*BLOCK)dataOut.writeFloat(log1[i%BLOCK]);\r
115                   else if(i<3*BLOCK)dataOut.writeFloat(log2[i%BLOCK]);\r
116                   else if(i<3*BLOCK)dataOut.writeFloat(log3[i%BLOCK]);\r
117                   try{Thread.sleep(4);} catch (InterruptedException e ){}\r
118                }\r
119                dataOut.flush();\r
120                dataOut.close();\r
121           }\r
122           catch(IOException e)  {LCD.drawString("write error",0,0); LCD.refresh();}\r
123           Sound.beepSequence();\r
124           LCD.clear();\r
125           LCD.drawString("sent",0,0);\r
126           LCD.drawInt(_indx, 8, 0);\r
127           LCD.drawString("Resend?", 0, 1);\r
128           LCD.refresh();\r
129           more = Button.waitForPress()==1;\r
130        }\r
131        try{dataOut.close();}catch(IOException e){}\r
132     }\r
133 \r
134        \r
135       \r
136           \r
137   /**\r
138    * to test the DL object\r
139    */  \r
140     public static void main(String[] args)\r
141     {\r
142        int size =600;\r
143        Datalogger dl = new Datalogger();\r
144        boolean more = true;\r
145        while(more)\r
146        {\r
147        for(int i = 0 ; i<size; i++)\r
148           {\r
149              float x = i*0.5f;\r
150              dl.writeLog(x);\r
151           }\r
152        dl.transmit(true); \r
153        dl.reset();\r
154        LCD.clear();\r
155        LCD.drawString("more?",0,2);\r
156        LCD.refresh();\r
157        more = 1 == Button.waitForPress();\r
158        }\r
159     }\r
160 }\r