Subversion Repositories FlightCtrl

Rev

Rev 210 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 210 Rev 221
1
/*********************************************************************************************************************************
1
/*********************************************************************************************************************************
2
 *                                                                                                                                *
2
 *                                                                                                                                *
3
 * minimal canvas to test Abstraction layer on various Phones                                                                     *
3
 * minimal canvas to test Abstraction layer on various Phones                                                                     *
4
 *                                                                                                                                *
4
 *                                                                                                                                *
5
 * Author:        Marcus -LiGi- Bueschleb                                                                                         *
5
 * Author:        Marcus -LiGi- Bueschleb                                                                                         *
6
 * Project-Start: 9/2007                                                                                                          *
6
 * Project-Start: 9/2007                                                                                                          *
7
 * Mailto:        ligi@smart4mobile.de                                                                                            *
7
 * Mailto:        ligi@smart4mobile.de                                                                                            *
8
 * Licence:       Creative Commons / Non Commercial                                                                               *
8
 * Licence:       Creative Commons / Non Commercial                                                                               *
9
 * Big Up:        Holger&Ingo                                                                                                     *
9
 * Big Up:        Holger&Ingo                                                                                                     *
10
 *********************************************************************************************************************************/
10
 *********************************************************************************************************************************/
11
 
11
 
12
import javax.microedition.lcdui.*;
12
import javax.microedition.lcdui.*;
13
import javax.microedition.rms.*;
13
import javax.microedition.rms.*;
-
 
14
 
14
 
15
 
15
public class MKMiniCanvas
16
public class MKMiniCanvas
16
        extends Canvas
17
        extends Canvas
17
        implements Runnable
18
        implements Runnable
18
{
19
{
19
 
20
 
20
   
21
   
21
    private BTSearcher bt_scanner;
22
    private BTSearcher bt_scanner;
22
    private MKCommunicator mk=null;
23
    private MKCommunicator mk=null;
23
    private MKStatistics mk_stat=null;
24
    private MKStatistics mk_stat=null;
24
    private String err="";
25
    private String err="";
25
    private MKMiniMidlet root;
26
    private MKMiniMidlet root;
-
 
27
 
-
 
28
    private Image bg_img;
-
 
29
    private Image bt_img;
-
 
30
    private Image lcd_img;
-
 
31
    private Image load_img;
-
 
32
 
-
 
33
 
-
 
34
    public int[] nick_line_pos_data;
-
 
35
    public int[] roll_line_pos_data;
-
 
36
 
-
 
37
    public int[] accnick_line_pos_data;
-
 
38
    public int[] accroll_line_pos_data;
-
 
39
 
-
 
40
 
-
 
41
    public int frame_pos=0;
-
 
42
   
-
 
43
    int line_scaler=20;
-
 
44
 
-
 
45
    public int line_middle_y;
26
 
46
 
27
    public MKMiniCanvas(MKMiniMidlet _root)
47
    public MKMiniCanvas(MKMiniMidlet _root)
-
 
48
        {
28
        {
49
 
-
 
50
            root=_root;
-
 
51
 
-
 
52
            try
-
 
53
                {
-
 
54
                    lcd_img=Image.createImage("/lcd.png");
-
 
55
                    bt_img=Image.createImage("/bt.png");
-
 
56
                    bg_img=Image.createImage("/bg.jpg");                   
-
 
57
                    load_img=Image.createImage("/load.png");
-
 
58
                }
-
 
59
            catch (Exception e)
-
 
60
                {
-
 
61
                    err+=e.toString();
-
 
62
                }
-
 
63
           
-
 
64
 
-
 
65
            nick_line_pos_data=new int[bg_img.getWidth()];
-
 
66
            roll_line_pos_data=new int[bg_img.getWidth()];
-
 
67
            accnick_line_pos_data=new int[bg_img.getWidth()];
-
 
68
            accroll_line_pos_data=new int[bg_img.getWidth()];
-
 
69
           
-
 
70
            for (int c=0;c<bg_img.getWidth();c++)
-
 
71
                {
-
 
72
                    nick_line_pos_data[c]=-1;
-
 
73
                    roll_line_pos_data[c]=-1;
-
 
74
                    accnick_line_pos_data[c]=-1;
-
 
75
                    accroll_line_pos_data[c]=-1;
-
 
76
                }
29
            root=_root;
77
           
30
 
78
       
31
            // mk = new MKCommunicator("btspp://000BCE016B5B:1");
79
            // mk = new MKCommunicator("btspp://000BCE016B5B:1");
32
            //connect_mk("btspp://000BCE016B4F:1");
80
            //connect_mk("btspp://000BCE016B4F:1");
33
 
81
 
34
           
82
           
35
                try
83
                try
36
                    {
84
                    {
37
                        RecordStore recStore = RecordStore.openRecordStore("bturl", true );
85
                        RecordStore recStore = RecordStore.openRecordStore("bturl", true );
38
 
86
 
39
                        if (recStore.getNumRecords()==1)
87
                        if (recStore.getNumRecords()==1)
40
                            {
88
                            {
41
                                byte[] recData = new byte[recStore.getRecordSize(1)];
89
                                byte[] recData = new byte[recStore.getRecordSize(1)];
42
                                int len = recStore.getRecord(1, recData, 0);
90
                                int len = recStore.getRecord(1, recData, 0);
43
                                rescan=false;
91
                                rescan=false;
44
                                connect_mk(new String(recData, 0, len));
92
                                connect_mk(new String(recData, 0, len));
45
                            }
93
                            }
46
                    }
94
                    }
47
                catch (Exception e)
95
                catch (Exception e)
48
                    {
96
                    {
49
                        err+=e.toString();
97
                        err+=e.toString();
50
                    }
98
                    }
51
 
99
 
52
            if (mk==null) bt_scanner = new BTSearcher();
100
            if (mk==null) bt_scanner = new BTSearcher();
53
                   
101
                   
54
            new Thread(this).start();
102
            new Thread(this).start();
55
 
103
 
56
        }
104
        }
57
 
105
 
58
    boolean quit=false;
106
    boolean quit=false;
59
    boolean rescan=true;
107
    boolean rescan=true;
-
 
108
    int bg_offset=0;
-
 
109
   
-
 
110
 
60
 
111
 
61
 
112
   
62
    /********************************************************** Thread ***********************************************************/
113
    /********************************************************** Thread ***********************************************************/
63
    // ticking runnable Section
114
    // ticking runnable Section
64
    public void run()
115
    public void run()
65
    {
116
    {
66
 
117
 
67
        while(true)
118
        while(true)
68
            {
119
            {
69
                long loopStartTime = System.currentTimeMillis();
120
                long loopStartTime = System.currentTimeMillis();
70
                long sleeptime=0;
121
                long sleeptime=0;
71
                // ticked thing
122
                // ticked thing
-
 
123
       
-
 
124
                frame_pos++;
-
 
125
 
-
 
126
                try {
-
 
127
                nick_line_pos_data[-bg_offset] = mk.debug_data.nick_int();
-
 
128
                roll_line_pos_data[-bg_offset] = mk.debug_data.roll_int();
-
 
129
                accnick_line_pos_data[-bg_offset] = mk.debug_data.accnick();
-
 
130
                accroll_line_pos_data[-bg_offset] = mk.debug_data.accroll();
-
 
131
                }
-
 
132
                catch (Exception e)
-
 
133
                    {
-
 
134
                        err+=e.toString();
-
 
135
                    }
-
 
136
 
-
 
137
               
-
 
138
 
72
               
139
               
73
                if (quit)
140
                if (quit)
74
                    {
141
                    {
-
 
142
 
-
 
143
 
-
 
144
                       
75
                        try
145
                        try
76
                            {
146
                            {
77
                                RecordStore recStore = RecordStore.openRecordStore("bturl", true );
147
                                RecordStore recStore = RecordStore.openRecordStore("bturl", true );
78
                               
148
                               
79
                                if (recStore.getNumRecords()==1)
149
                                if (recStore.getNumRecords()==1)
80
                                    recStore.deleteRecord(1);
150
                                    recStore.deleteRecord(1);
81
                                byte[] rec = mk.mk_url.getBytes();
151
                                byte[] rec = mk.mk_url.getBytes();
82
                                recStore.addRecord(rec, 0, rec.length);
152
                                recStore.addRecord(rec, 0, rec.length);
83
 
153
 
84
                            }
154
                            }
85
                        catch (Exception e)
155
                        catch (Exception e)
86
                            {
156
                            {
87
                                err+=e.toString();
157
                                err+=e.toString();
88
                            }
158
                            }
89
 
159
 
90
                        root.quit();
160
                        root.quit();
91
                    }
161
                    }
92
                if (rescan)
162
                if (rescan)
93
                    {
163
                    {
94
                    if (mk!=null) mk.close_connections();
164
                    if (mk!=null) mk.close_connections(true);
95
                    mk=null;
165
                    mk=null;
96
                    bt_scanner.search_again();
166
                    bt_scanner.search_again();
97
                    }
167
                    }
98
 
168
 
99
                rescan=false;
169
                rescan=false;
100
 
170
                bg_offset--;
-
 
171
                if (bg_offset==-bg_img.getWidth())
-
 
172
                    bg_offset=0;
101
                com.nokia.mid.ui.DeviceControl.setLights(0,100);
173
                com.nokia.mid.ui.DeviceControl.setLights(0,100);
102
                //bt.tick();
174
                //bt.tick();
103
                // every state has sth to do in tick section
175
                // every state has sth to do in tick section
104
             
176
             
105
 
177
 
106
//                System.gc();
178
//                System.gc();
107
                repaint();
179
                repaint();
108
                serviceRepaints();
180
                serviceRepaints();
109
       
181
       
110
                       
182
                       
111
                sleeptime=1000/ 15 - (int) (System.currentTimeMillis()- loopStartTime);
183
                sleeptime=1000/ 15 - (int) (System.currentTimeMillis()- loopStartTime);
112
               
184
               
113
               
185
               
114
                if (sleeptime<0)
186
                if (sleeptime<0)
115
                        sleeptime=100; // everyone has fi sleep
187
                        sleeptime=100; // everyone has fi sleep
116
               
188
               
117
                try { Thread.sleep(sleeptime); }
189
                try { Thread.sleep(sleeptime); }
118
                catch (Exception e)
190
                catch (Exception e)
119
                    {
191
                    {
120
                         err="Problem Sleeping ";
192
                         err="Problem Sleeping ";
121
                    }
193
                    }
122
 
194
 
123
            }
195
            }
124
    }
196
    }
125
 
197
 
126
     
198
     
127
 
199
 
-
 
200
       
128
       
201
    int local_max=-1;
129
 
202
 
130
    // drawing section
203
    // drawing section
131
    public void paint(Graphics g) {
204
    public void paint(Graphics g) {
132
 
205
       
-
 
206
        if (mk!=null)
-
 
207
            {
-
 
208
                line_middle_y=this.getHeight()/2;
-
 
209
                if (local_max<Math.abs(mk.debug_data.nick_int()))
-
 
210
                    local_max=Math.abs(mk.debug_data.nick_int());
-
 
211
                if (local_max<Math.abs(mk.debug_data.roll_int()))
-
 
212
                    local_max=Math.abs(mk.debug_data.roll_int());
-
 
213
                if (local_max<Math.abs(mk.debug_data.accnick()))
-
 
214
                    local_max=Math.abs(mk.debug_data.accnick());
-
 
215
                if (local_max<Math.abs(mk.debug_data.accroll()))
-
 
216
                    local_max=Math.abs(mk.debug_data.accroll());
-
 
217
                line_scaler= local_max/(this.getHeight()/2)+1;
-
 
218
            }
133
        int spacer=(g.getFont().getHeight());
219
        int spacer=(g.getFont().getHeight());
134
        g.setColor(0xFFFFFF);
220
        g.setColor(0xFFFFFF);
135
        g.fillRect(0,0,this.getWidth(),this.getHeight());
221
        g.fillRect(0,0,this.getWidth(),this.getHeight());
-
 
222
        g.drawImage(bg_img,bg_offset,0, g.TOP | g.LEFT);
-
 
223
        if (bg_offset+bg_img.getWidth()<this.getWidth())
-
 
224
            g.drawImage(bg_img,bg_offset+bg_img.getWidth(),0, g.TOP | g.LEFT);
-
 
225
 
136
        g.setColor(0x000000);
226
        g.setColor(0x000000);
137
       
227
       
138
        if (mk==null)
228
        if (mk==null)
139
            {
229
            {
-
 
230
 
-
 
231
               
140
        if (bt_scanner.searching)
232
                if (bt_scanner.searching)
-
 
233
                    {
-
 
234
 
-
 
235
                       
141
            g.drawString("scanning for BT-Devices",0,0,Graphics.TOP | Graphics.LEFT);
236
                        g.drawString("scanning for BT-Devices",this.getWidth()/2,this.getHeight()/2+load_img.getHeight()/8,Graphics.TOP | Graphics.HCENTER);
-
 
237
 
-
 
238
                        g.setClip(this.getWidth()/2-load_img.getWidth()/6,this.getHeight()/2-load_img.getHeight()/8, load_img.getWidth()/4,load_img.getHeight()/3);;
-
 
239
                        g.drawImage(load_img,this.getWidth()/2-load_img.getWidth()/8 - ((((frame_pos/3)%12)%4)*(load_img.getWidth()/4)) ,this.getHeight()/2-load_img.getHeight()/6- ((((frame_pos/3)%12)/4)*(load_img.getHeight()/3)), g.TOP | g.LEFT);
-
 
240
                        g.drawImage(bt_img,this.getWidth()/2 ,this.getHeight()/2 , g.HCENTER | g.VCENTER);
142
        else
241
                    }
-
 
242
                else
143
            {
243
                    {
144
            g.drawString("Press key 0-"+(bt_scanner.remote_device_count-1) + " to continue" ,0,0,Graphics.TOP | Graphics.LEFT);
244
                        g.drawString("Press key 0-"+(bt_scanner.remote_device_count-1) + " to continue" ,0,0,Graphics.TOP | Graphics.LEFT);
145
            for (int i=0;i<bt_scanner.remote_device_count;i++)
245
                        for (int i=0;i<bt_scanner.remote_device_count;i++)
146
            g.drawString("#"+i+">" + bt_scanner.remote_device_name[i]+"("+bt_scanner.remote_device_mac[i]+")",0,spacer+spacer*i,Graphics.TOP | Graphics.LEFT);
246
                            g.drawString("#"+i+">" + bt_scanner.remote_device_name[i]+"("+bt_scanner.remote_device_mac[i]+")",0,spacer+spacer*i,Graphics.TOP | Graphics.LEFT);
147
           
247
                       
148
            }
248
                    }
-
 
249
 
-
 
250
 
-
 
251
 
-
 
252
 
149
            }
253
            }
150
        else // MK is connected
254
        else // MK is connected
151
            {
255
            {
152
                int y_off=0;
256
                int y_off=0;
153
 
257
 
154
                g.drawString(mk.version.str+"(d:"+mk.debug_data_count+ " l:" + mk.lcd_data_count+  " v:" + mk.version_data_count+" o:"+mk.other_data_count+")",0,y_off,Graphics.TOP | Graphics.LEFT);
258
                g.drawString(mk.version.str+"(d:"+mk.debug_data_count+ " l:" + mk.lcd_data_count+  " v:" + mk.version_data_count+" o:"+mk.other_data_count+")",0,y_off,Graphics.TOP | Graphics.LEFT);
155
 
259
 
156
                y_off+=spacer;
260
                y_off+=spacer;
157
                for ( int foo=0;foo<4;foo++)
-
 
158
                    {
-
 
159
                        g.drawString(mk.LCD.LCD_str[foo],0,y_off,Graphics.TOP | Graphics.LEFT);
-
 
160
                        y_off+=spacer;
-
 
161
                    }
-
 
162
                try {
261
 
163
                g.drawString("motor1:"+mk.debug_data.analog[12],0,y_off,Graphics.TOP | Graphics.LEFT);
-
 
164
                y_off+=spacer;
-
 
165
                g.drawString("motor2:"+mk.debug_data.analog[13],0,y_off,Graphics.TOP | Graphics.LEFT);
-
 
166
                y_off+=spacer;
-
 
167
                g.drawString("motor3:"+mk.debug_data.analog[14],0,y_off,Graphics.TOP | Graphics.LEFT);
262
                g.drawString("n:"+mk.debug_data.nick_int() + " r:"+mk.debug_data.roll_int() + " an:"+mk.debug_data.accnick() + " ar:"+mk.debug_data.accroll() ,0,y_off,Graphics.TOP | Graphics.LEFT);
168
                y_off+=spacer;
263
                y_off+=spacer;
-
 
264
 
-
 
265
       
169
                g.drawString("motor4:"+mk.debug_data.analog[15],0,y_off,Graphics.TOP | Graphics.LEFT);
266
                g.drawString("m1:"+mk.debug_data.motor_val(0) + " m2:"+mk.debug_data.motor_val(1)+" m3:"+mk.debug_data.motor_val(2) + " m4:"+mk.debug_data.motor_val(3) ,0,y_off,Graphics.TOP | Graphics.LEFT);
170
                y_off+=spacer;
267
                y_off+=spacer;
171
               
268
 
172
                }
-
 
173
                catch (Exception e) { }
-
 
174
                if (mk.connected)
269
                if (mk.connected)
175
                    {
270
                    {
176
                        g.drawString("time conn:" +((System.currentTimeMillis()- mk.connection_start_time)/1000)+"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
271
                        g.drawString("time conn:" +((System.currentTimeMillis()- mk.connection_start_time)/1000)+"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
177
                        y_off+=spacer;
272
                        y_off+=spacer;
178
                        g.drawString("time motor>15:" +(mk_stat.motor_on_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
273
                        g.drawString("time motor>15:" +(mk_stat.motor_on_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
179
                        y_off+=spacer;
274
                        y_off+=spacer;
180
                        g.drawString("time motor=15:" +(mk_stat.motor_stand_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
275
                        g.drawString("time motor=15:" +(mk_stat.motor_stand_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
181
                    }
276
                    }
-
 
277
 
-
 
278
 
-
 
279
                y_off=this.getHeight()-4*19;
-
 
280
 
-
 
281
                for ( int foo=0;foo<4;foo++)
-
 
282
                    {
-
 
283
                       
-
 
284
                        for (int x=0;x<20;x++)
-
 
285
                            {
-
 
286
                            g.setClip(12*x,y_off,12,19);
-
 
287
                            g.drawImage(lcd_img,12*x-(mk.LCD.LCD_str[foo].charAt(x)-' ')*(lcd_img.getWidth()/95),y_off, g.TOP | g.LEFT);
-
 
288
 
-
 
289
                            }
-
 
290
                        y_off+=19;
-
 
291
 
-
 
292
                       
-
 
293
 
-
 
294
                    }
-
 
295
 
-
 
296
                g.setClip(0,0,this.getWidth(),this.getHeight());
-
 
297
 
-
 
298
               
-
 
299
 
182
 
300
 
-
 
301
            }
-
 
302
        // draw lines
-
 
303
 
-
 
304
        for ( int x=0;x<this.getWidth();x++)
-
 
305
 
-
 
306
            {
-
 
307
 
-
 
308
                int p= (((-bg_offset+x-this.getWidth()-5)));
-
 
309
                if (p<1)
-
 
310
                    p+=bg_img.getWidth();
-
 
311
                p%=(bg_img.getWidth()-1);
-
 
312
 
-
 
313
                g.setColor(0x156315);          
-
 
314
                draw_graph_part(g,x,nick_line_pos_data[p]/line_scaler,nick_line_pos_data[p+1]/line_scaler);
-
 
315
                g.setColor(0xCC1315);
-
 
316
                draw_graph_part(g,x,roll_line_pos_data[p]/line_scaler,roll_line_pos_data[p+1]/line_scaler);
-
 
317
                g.setColor(0xf8ef02);          
-
 
318
                draw_graph_part(g,x,accnick_line_pos_data[p]/line_scaler,accnick_line_pos_data[p+1]/line_scaler);
-
 
319
                g.setColor(0x19194d);
-
 
320
                draw_graph_part(g,x,accroll_line_pos_data[p]/line_scaler,accroll_line_pos_data[p+1]/line_scaler);
-
 
321
               
-
 
322
 
183
            }
323
           
184
           
324
            }
185
    }
325
    }
186
 
326
 
187
    private void connect_mk(String url)
327
    private void connect_mk(String url)
188
    {
328
    {
189
        mk = new MKCommunicator(url);
329
        mk = new MKCommunicator(url);
190
        mk_stat= new MKStatistics(mk);
330
        mk_stat= new MKStatistics(mk);
-
 
331
 
-
 
332
    }
-
 
333
 
-
 
334
    public void draw_graph_part(Graphics g,int x,int y1,int y2)
-
 
335
    {
-
 
336
        g.fillRect(x,line_middle_y-y1,2,2 );
-
 
337
        if (y1>y2)
-
 
338
            g.fillRect(x,line_middle_y-y1,2,y1-y2);
-
 
339
        else
-
 
340
            g.fillRect(x,line_middle_y-y2,2,y2-y1);
191
    }
341
    }
192
 
342
 
193
    /*********************************************** input Section **********************************************/
343
    /*********************************************** input Section **********************************************/
194
    // keys
344
    // keys
-
 
345
    public boolean fullscreen=false;
-
 
346
 
195
    public void keyPressed(int keyCode)
347
    public void keyPressed(int keyCode)
196
    {
348
    {
197
       
349
       
198
        if ((mk==null)&&(keyCode >= this.KEY_NUM0) && (keyCode < this.KEY_NUM0+bt_scanner.remote_device_count))
350
        if ((mk==null)&&(keyCode >= this.KEY_NUM0) && (keyCode < this.KEY_NUM0+bt_scanner.remote_device_count))
199
            connect_mk("btspp://"+bt_scanner.remote_device_mac[keyCode-this.KEY_NUM0] + ":1");
351
            connect_mk("btspp://"+bt_scanner.remote_device_mac[keyCode-this.KEY_NUM0] + ":1");
200
        else
352
        else
201
            {
353
            {
202
                switch (keyCode)
354
                switch (keyCode)
203
                    {
355
                    {
-
 
356
                       
204
                    case KEY_STAR:
357
                    case KEY_STAR:
205
                        mk.other_data_count=23;
358
                        mk.other_data_count=23;
206
                        quit=true;
359
                        quit=true;
207
                        break;
360
                        break;
208
 
361
 
209
                    case KEY_POUND:
362
                    case KEY_POUND:
210
                        rescan=true;
363
                        //rescan=true;
-
 
364
                        fullscreen=!fullscreen;
-
 
365
                        setFullScreenMode(fullscreen);
211
                        break;
366
                        break;
212
                    }
367
                    }
213
                switch (getGameAction (keyCode))
368
                switch (getGameAction (keyCode))
214
                    {
369
                    {
215
                    case UP:
370
                    case UP:
216
                        mk.LCD.LCD_PREVPAGE();
371
                        mk.LCD.LCD_PREVPAGE();
217
                        break;
372
                        break;
218
                       
373
                       
219
                    case DOWN:
374
                    case DOWN:
220
                        mk.LCD.LCD_NEXTPAGE();
375
                        mk.LCD.LCD_NEXTPAGE();
221
                        break;
376
                        break;
222
                    }
377
                    }
223
            }
378
            }
224
       
379
       
225
       
380
       
226
        return;
381
        return;
227
    }
382
    }
228
 
383
 
229
 
384
 
230
 
385
 
231
 
386
 
232
 
387
 
233
 
388
 
234
 
389
 
235
 
390
 
236
}
391
}
237
 
392
 
238
 
393
 
239
 
394