Subversion Repositories Projects

Rev

Rev 81 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
81 ligi 1
/***************************************************************
2
 *
3
 * User Interface ( Canvas ) of DUBwise
4
 *                                                          
5
 * Author:        Marcus -LiGi- Bueschleb                    
6
 *
7
 * see README for further Infos
8
 *
9
 ***************************************************************/
10
 
11
import javax.microedition.lcdui.*;
12
import javax.microedition.rms.*;
13
 
14
import javax.microedition.media.*;
15
import javax.microedition.media.control.*;
16
 
17
public class DUBwiseCanvas
18
    extends Canvas
19
    implements Runnable
20
{
21
 
22
    // name/handle for the recordStore to memorize some stuff
23
    private final static String RECORD_STORE_NAME="DUBSETT";
24
 
25
    private BTSearcher bt_scanner;
26
    public MKCommunicator mk=null;
27
    private MKStatistics mk_stat=null;
28
    private MKParamsEditor params_editor=null;
29
    public DUBwiseDebug debug=null;
30
 
31
//#if voice_mode!="no_voice"
32
    private MKStatusVoice status_voice;
33
//#endif
34
 
35
    private String err="";
36
    private DUBwise root;
37
 
38
    private UFOProber ufo_prober;
39
 
40
    byte[] settings_arr;
41
 
42
    public boolean do_vibra=true;
43
    public boolean do_sound=true;
44
    public boolean do_graph=true;
45
    public boolean keep_lighton=false;
46
 
47
    private Image bg_img;
48
    private Image bt_img;
49
    private Image lcd_img;
50
    private Image load_img;
51
 
52
 
53
    final static int SKINID_DARK= 0;
54
    final static int SKINID_LIGHT = 1;
55
 
56
    //holds id of actual skin
57
    byte act_skin=SKINID_DARK;
58
 
59
 
60
    public int[] nick_line_pos_data;
61
    public int[] roll_line_pos_data;
62
 
63
    public int[] accnick_line_pos_data;
64
    public int[] accroll_line_pos_data;
65
 
66
    public int lcd_char_width=0;
67
    public int lcd_char_height=0;
68
 
69
    public int frame_pos=0;
70
 
71
    int line_scaler=20;
72
 
73
    int rawdebug_cursor_y=0;    
74
    int rawdebug_off_y=0;
75
 
76
    public int line_middle_y;
77
 
78
    boolean quit=false;
79
    boolean rescan=true;
80
    int bg_offset=0;
81
 
82
    // variable to hold the current state
83
    public int state=-1;
84
 
85
    // id  for each state - must just be uniq - order isnt important
86
    public final static int STATEID_SCANNING         =0;
87
    public final static int STATEID_DEVICESELECT     =1;
88
    public final static int STATEID_MAINMENU         =2;
89
    public final static int STATEID_MOTORTEST        =3;
90
    public final static int STATEID_SELECT_PARAMSET  =4;
91
    public final static int STATEID_EDIT_PARAMS      =5;
92
    public final static int STATEID_HANDLE_PARAMS    =6;
93
    public final static int STATEID_FLIGHTVIEW       =7;
94
    public final static int STATEID_RAWDEBUG         =8;
95
    public final static int STATEID_KEYCONTROL       =9;
96
    public final static int STATEID_SETTINGSMENU     =10;
97
    public final static int STATEID_STICKVIEW        =11;
98
    public final static int STATEID_CAMMODE          =12;
99
 
100
 
101
    public boolean fullscreen=false;
102
    public int act_motor=0;
103
    public int act_motor_increase=0;
104
    public boolean motor_test_sel_all=false;
105
 
106
    public String[] main_menu_items={"Telemetry","Raw Debug", "view RC-data", "MK-KeyControl", "Motor Test" , "Flight Settings","Tool Settings","Remote Cam","Proxy","Change Device" , "Quit " };
107
    public final static int MAINMENU_TELEMETRY     =0;
108
    public final static int MAINMENU_RAWDEBUG      =1+MAINMENU_TELEMETRY;
109
    public final static int MAINMENU_STICKS        =1+MAINMENU_RAWDEBUG;
110
    public final static int MAINMENU_KEYCONTROL    =1+MAINMENU_STICKS;
111
    public final static int MAINMENU_MOTORTEST     =1+MAINMENU_KEYCONTROL;
112
    public final static int MAINMENU_PARAMS        =1+MAINMENU_MOTORTEST;
113
    public final static int MAINMENU_SETTINGSMENU  =1+MAINMENU_PARAMS;
114
    public final static int MAINMENU_CAMMODE       =1+MAINMENU_SETTINGSMENU;
115
    public final static int MAINMENU_PROXY         =1+MAINMENU_CAMMODE;
116
    public final static int MAINMENU_DEVICESELECT  =1+MAINMENU_PROXY;
117
    public final static int MAINMENU_QUIT          =1+MAINMENU_DEVICESELECT;
118
 
119
    public String[] settings_menu_items={"Skin ","Sound ","Vibra " ,"Graph ","FullScreen " ,"Keep BGLight " ,"Back" };
120
    public final static int SETTINGSMENU_CHANGESKIN   =0;
121
    public final static int SETTINGSMENU_SOUNDTOGGLE  =1;
122
    public final static int SETTINGSMENU_VIBRATOGGLE  =2;
123
    public final static int SETTINGSMENU_GRAPHTOGGLE  =3;
124
    public final static int SETTINGSMENU_FULLSCREENTOGGLE  =4;
125
    public final static int SETTINGSMENU_LIGHTTOGGLE  =5;
126
    public final static int SETTINGSMENU_BACK      =6;
127
 
128
 
129
 
130
    int local_max=-1;
131
 
132
    int y_off=0;
133
    int spacer=0;
134
    int spacer1=0;
135
 
136
    int[] motor_test = {0,0,0,0};
137
 
138
 
139
    String[] menu_items;
140
    int act_menu_select=0;
141
 
142
    String[] lcd_lines =null;
143
 
144
    public void paint_menu(Graphics g)
145
    {
146
        for ( int i=0;i<menu_items.length;i++)
147
            {
148
                if ((frame_pos%3)!=0)
149
                    {
150
                        lcd_lines[i]=(act_menu_select==i?">":" ") + menu_items[i];     
151
                        for ( int ii=0;ii<(18-menu_items[i].length());ii++)
152
                            lcd_lines[i]+=" ";
153
                        if (act_menu_select==i)
154
                            lcd_lines[i]+="<";
155
                    }
156
                else
157
                    lcd_lines[i]=" " + menu_items[i];  
158
 
159
 
160
            }
161
        paint_lcd(g,true);
162
    }
163
 
164
    public void menu_keypress(int keyCode)
165
    {
166
        switch (getGameAction (keyCode))
167
            {
168
            case UP:
169
                if (act_menu_select!=0) act_menu_select--;
170
                else
171
                    act_menu_select=menu_items.length-1;
172
                break;
173
 
174
            case DOWN:
175
                if (act_menu_select<(menu_items.length-1)) act_menu_select++;
176
                else act_menu_select=0;
177
                break;
178
 
179
            }
180
 
181
    }
182
 
183
    public boolean cam_condition()
184
    {
185
        return (mk.stick_data.stick[5]>100);
186
 
187
    }
188
 
189
    public void paint_lcd(Graphics g,boolean bottomup)
190
    {
191
 
192
        int y;
193
 
194
        for(int i=0;i<lcd_lines.length;i++)
195
            for (int pos=0;pos<20;pos++)
196
            {
197
                if (bottomup)
198
                    y=this.getHeight()-(lcd_lines.length-i)*lcd_char_height;
199
                else
200
                    y=i*lcd_char_height;
201
                g.setClip((lcd_img.getWidth()/222)*pos,y,(lcd_img.getWidth()/222),lcd_img.getHeight());
202
                g.drawImage(lcd_img,(lcd_img.getWidth()/222)*pos-((pos<lcd_lines[i].length()?lcd_lines[i].charAt(pos):' ')-' ')*(lcd_img.getWidth()/222),y,g.TOP | g.LEFT);
203
 
204
            }
205
    }
206
 
207
    public void load_images()
208
    {
209
        try
210
            {
211
                // load all needed images
212
                switch (act_skin)
213
                    {
214
                    case SKINID_DARK:
215
                        lcd_img=Image.createImage("/lcd_green.png");
216
                        bg_img=Image.createImage("/starfield.jpg");                                     break;
217
 
218
                    case SKINID_LIGHT:
219
                        lcd_img=Image.createImage("/lcd_blue.png");
220
                        bg_img=Image.createImage("/clouds.jpg");
221
                        break;
222
                    }
223
 
224
 
225
                bt_img=Image.createImage("/bt.png");
226
 
227
                load_img=Image.createImage("/load.png");
228
            }
229
        catch (Exception e)
230
            {
231
                err+=e.toString();
232
            }
233
 
234
        lcd_char_width=lcd_img.getWidth()/222;
235
        lcd_char_height=lcd_img.getHeight();
236
 
237
 
238
        nick_line_pos_data=new int[bg_img.getWidth()];
239
        roll_line_pos_data=new int[bg_img.getWidth()];
240
        accnick_line_pos_data=new int[bg_img.getWidth()];
241
        accroll_line_pos_data=new int[bg_img.getWidth()];
242
 
243
        for (int c=0;c<bg_img.getWidth();c++)
244
            {
245
                nick_line_pos_data[c]=-1;
246
                roll_line_pos_data[c]=-1;
247
                accnick_line_pos_data[c]=-1;
248
                accroll_line_pos_data[c]=-1;
249
            }
250
 
251
    }
252
 
253
    public DUBwiseCanvas(DUBwise _root)
254
    {
255
 
256
 
257
        root=_root;
258
 
259
        debug   = new DUBwiseDebug();
260
 
261
        bt_scanner = new BTSearcher();
262
        params_editor = new MKParamsEditor(this);
263
        ufo_prober = new UFOProber();
264
 
265
        mk      = new MKCommunicator(root,debug);
266
        mk_stat = new MKStatistics(mk);
267
 
268
 
269
//#if voice_mode!="no_voice"
270
        status_voice=new MKStatusVoice(mk,this);
271
//#endif
272
 
273
 
274
        try
275
            {
276
                RecordStore recStore = RecordStore.openRecordStore(RECORD_STORE_NAME , true );
277
 
278
                if (recStore.getNumRecords()==3)
279
                    {
280
 
281
                        //byte[] recData = new byte[recStore.getRecordSize(1)];
282
                        //int len = recStore.getRecord(1, recData, 0);
283
 
284
                        //byte[] recData2 = new byte[recStore.getRecordSize(2)];
285
                        //int len2 = recStore.getRecord(2, recData, 0);
286
 
287
                        byte[] url_data=recStore.getRecord(1);
288
                        byte[] name_data=recStore.getRecord(2);
289
                        settings_arr=recStore.getRecord(3);
290
 
291
                        act_skin=settings_arr[0];
292
                        do_sound=(settings_arr[1]==1);
293
                        do_vibra=(settings_arr[2]==1);
294
                        do_graph=(settings_arr[3]==1);
295
                        fullscreen=(settings_arr[4]==1);
296
                        keep_lighton=(settings_arr[5]==1);
297
 
298
                        connect_mk(new String(url_data, 0, url_data.length),new String(name_data, 0, name_data.length));
299
 
300
                    }
301
                recStore.closeRecordStore();
302
            }
303
        catch (Exception e)
304
            {
305
                settings_arr=new byte[10];
306
 
307
                err+=e.toString();
308
            }
309
 
310
 
311
        load_images();
312
 
313
        chg_state((mk.force_disconnect)?STATEID_SCANNING:STATEID_MAINMENU);
314
 
315
 
316
 
317
        new Thread(this).start();
318
 
319
    }
320
 
321
 
322
 
323
 
324
    /****************************** Thread ******************/
325
    // ticking runnable Section
326
    public void run()
327
    {
328
 
329
 
330
        while(true)
331
            {
332
                try {
333
 
334
 
335
                repaint();
336
                serviceRepaints();
337
 
338
                long loopStartTime = System.currentTimeMillis();
339
                long sleeptime=0;
340
                // ticked thing
341
 
342
                frame_pos++;
343
 
344
                switch(state)
345
                    {
346
                    case STATEID_CAMMODE:
347
 
348
                            try
349
                                {
350
                                    if(cam_condition())
351
                                        {
352
                                        cam_img=null;
353
                                        debug.log("get snap\n");
354
                                        cam_raw = mVideoControl.getSnapshot(null);
355
 
356
                                        try { Thread.sleep(4000); }
357
                                        catch (Exception e)
358
                                            {
359
                                                err="Problem Sleeping ";
360
                                            }
361
                                        }
362
                                    else
363
                                        {
364
                                            if (cam_img==null)
365
                                                cam_img = Image.createImage(cam_raw, 0, cam_raw.length);
366
                                        }
367
                                }
368
                            catch ( Exception e)
369
                                {
370
                                    debug.log(e.toString());
371
                                }
372
                        break;
373
                    case STATEID_KEYCONTROL:
374
                        mk.send_keys(keycontrol_bitfield);     
375
                        break;
376
 
377
                    case STATEID_MOTORTEST:
378
 
379
                        if (motor_test_sel_all)
380
                            for (int m=0;m<4;m++)
381
                                {
382
                                    motor_test[m]+=act_motor_increase;
383
                                    if (motor_test[m]<0)motor_test[m]=0;
384
                                    if (motor_test[m]>255)motor_test[m]=255;
385
                                }
386
                        else
387
                            {
388
                                motor_test[act_motor]+=act_motor_increase;
389
                                if (motor_test[act_motor]<0) motor_test[act_motor]=0;
390
                                if (motor_test[act_motor]>255) motor_test[act_motor]=255;
391
                            }
392
 
393
                        mk.motor_test(motor_test);
394
                        break;
395
 
396
                    case STATEID_SCANNING:
397
                        intro_str_delay--;
398
                        if (intro_str_delay<0)
399
                            {
400
                                intro_str_delay=1;
401
                                if (intro_str_pos>intro_str.length())
402
                                    intro_str_pos=0;
403
                                lcd_lines[3]=intro_str.substring(intro_str_pos,  (((intro_str_pos+20)>intro_str.length())?intro_str.length():intro_str_pos+20));
404
                                intro_str_pos++;
405
                            }
406
 
407
                        if (!bt_scanner.searching)
408
                                chg_state(STATEID_DEVICESELECT);
409
 
410
 
411
                        break;
412
 
413
 
414
 
415
                    }
416
 
417
                try {
418
                    nick_line_pos_data[-bg_offset] = mk.debug_data.nick_int();
419
                    roll_line_pos_data[-bg_offset] = mk.debug_data.roll_int();
420
                    accnick_line_pos_data[-bg_offset] = mk.debug_data.accnick();
421
                    accroll_line_pos_data[-bg_offset] = mk.debug_data.accroll();
422
                }
423
                catch (Exception e)
424
                    {
425
                        err+=e.toString();
426
                    }
427
 
428
 
429
 
430
 
431
                if (quit)
432
                    {
433
 
434
 
435
 
436
                        try
437
                            {
438
                                RecordStore.deleteRecordStore(RECORD_STORE_NAME);
439
                                RecordStore recStore = RecordStore.openRecordStore(RECORD_STORE_NAME, true );
440
                                recStore.addRecord(mk.mk_url.getBytes(), 0, mk.mk_url.getBytes().length);
441
                                recStore.addRecord(mk.name.getBytes(), 0, mk.name.getBytes().length);
442
                                settings_arr=new byte[10];
443
                                settings_arr[0]=(byte)act_skin;
444
                                settings_arr[1]=(byte)(do_sound?1:0);
445
                                settings_arr[2]=(byte)(do_vibra?1:0);
446
                                settings_arr[3]=(byte)(do_graph?1:0);
447
                                settings_arr[4]=(byte)(fullscreen?1:0);
448
                                settings_arr[5]=(byte)(keep_lighton?1:0);
449
 
450
                                recStore.addRecord(settings_arr, 0, settings_arr.length);
451
 
452
 
453
 
454
                                recStore.closeRecordStore();
455
 
456
                            }
457
                        catch (Exception e)
458
                            {
459
                                err+=e.toString();
460
                            }
461
 
462
                        root.quit();
463
                    }
464
                if (rescan)
465
                    {
466
 
467
                        rescan=false;
468
                    }
469
 
470
                try {
471
                    //rescan=false;
472
                    bg_offset--;
473
                    if (bg_offset==-bg_img.getWidth())
474
                        bg_offset=0;
475
                    if (keep_lighton) com.nokia.mid.ui.DeviceControl.setLights(0,100);
476
                    //bt.tick();
477
                    // every state has sth to do in tick section
478
                }
479
                catch (Exception e)
480
                    {
481
 
482
                    }
483
 
484
 
485
                //                System.gc();
486
 
487
 
488
 
489
 
490
                sleeptime=1000/ 15 - (int) (System.currentTimeMillis()- loopStartTime);
491
 
492
 
493
 
494
                if (sleeptime<0)
495
                    sleeptime=100; // everyone has fi sleep
496
 
497
                try { Thread.sleep(sleeptime); }
498
                catch (Exception e)
499
                    {
500
                        err="Problem Sleeping ";
501
                    }
502
 
503
                }
504
                catch (Exception e)
505
                    {
506
                        err+=e.toString();
507
                    }
508
            }
509
    }
510
 
511
 
512
 
513
    boolean firstrun=true;
514
 
515
 
516
    // drawing section
517
    public void paint(Graphics g) {
518
        if (debug.showing)
519
            {
520
                debug.paint(g);
521
                return;
522
            }
523
 
524
        if (firstrun)
525
            {
526
                if (fullscreen) setFullScreenMode(fullscreen);
527
                firstrun=false;
528
            }
529
        y_off=0;
530
        try {
531
 
532
            if (mk!=null)
533
                {
534
                    line_middle_y=this.getHeight()/2;
535
                    if (local_max<Math.abs(mk.debug_data.nick_int()))
536
                        local_max=Math.abs(mk.debug_data.nick_int());
537
                    if (local_max<Math.abs(mk.debug_data.roll_int()))
538
                        local_max=Math.abs(mk.debug_data.roll_int());
539
                    if (local_max<Math.abs(mk.debug_data.accnick()))
540
                        local_max=Math.abs(mk.debug_data.accnick());
541
                    if (local_max<Math.abs(mk.debug_data.accroll()))
542
                        local_max=Math.abs(mk.debug_data.accroll());
543
                    line_scaler= local_max/(this.getHeight()/2)+1;
544
                }
545
 
546
 
547
            Font f1 = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);  
548
            Font f2 = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);  
549
 
550
            spacer=(f1.getHeight());
551
            spacer1=(f2.getHeight());
552
 
553
            //default Font
554
            g.setFont(f1);
555
 
556
            if (state==STATEID_EDIT_PARAMS)
557
                {
558
                    g.setColor(0x000000);
559
                    g.fillRect(0,0,this.getWidth(),this.getHeight());
560
                }
561
                else
562
                {
563
                    g.setColor(0xFFFFFF);
564
                    g.fillRect(0,0,this.getWidth(),this.getHeight());
565
                    g.drawImage(bg_img,bg_offset,0, g.TOP | g.LEFT);
566
 
567
                    if (bg_offset+bg_img.getWidth()<this.getWidth())
568
                        g.drawImage(bg_img,bg_offset+bg_img.getWidth(),0, g.TOP | g.LEFT);
569
                }
570
 
571
            switch (act_skin)
572
                {
573
                case SKINID_DARK:
574
                    g.setColor(0x2dcf20);
575
 
576
                    break;
577
 
578
                case SKINID_LIGHT:
579
                    g.setColor(0x000000);
580
                    break;
581
                }
582
 
583
 
584
 
585
            switch(state)
586
                {
587
 
588
                case STATEID_CAMMODE:
589
 
590
                    if (cam_img!=null)
591
                        g.drawImage(cam_img,0,0,g.TOP | g.LEFT);
592
                        g.drawString("condition: " + cam_condition() ,0,y_off,Graphics.TOP | Graphics.LEFT);
593
                        y_off+=spacer;
594
                        g.drawString("width " + cam_img.getWidth(),0,y_off,Graphics.TOP | Graphics.LEFT);
595
                        y_off+=spacer;
596
                        g.drawString("height " + cam_img.getHeight(),0,y_off,Graphics.TOP | Graphics.LEFT);
597
                        y_off+=spacer;
598
                        break;
599
 
600
                case STATEID_STICKVIEW:
601
                    y_off=0;
602
                    for(int tmp_y=0;tmp_y<10;tmp_y++)
603
                        {
604
                            g.drawString(""+tmp_y+"=>"+mk.stick_data.stick[tmp_y],0,y_off,Graphics.TOP | Graphics.LEFT);
605
                            y_off+=spacer;
606
                        }
607
                    break;
608
 
609
                case STATEID_KEYCONTROL:
610
 
611
 
612
                    y_off+=spacer;
613
                    g.drawString("UP&DOWN => nick",0,y_off,Graphics.TOP | Graphics.LEFT);
614
                    y_off+=spacer;
615
                    g.drawString("LEFT&RIGHT => roll",0,y_off,Graphics.TOP | Graphics.LEFT);
616
                    y_off+=spacer;
617
                    g.drawString("1&4 => altitude",0,y_off,Graphics.TOP | Graphics.LEFT);
618
 
619
                    y_off+=spacer;
620
                    g.drawString("2&3 => gier",0,y_off,Graphics.TOP | Graphics.LEFT);
621
 
622
                    y_off+=spacer;
623
                    g.drawString("Press # and * at once",0,y_off,Graphics.TOP | Graphics.LEFT);
624
                    y_off+=spacer;
625
                    g.drawString("to quit KeyControl",0,y_off,Graphics.TOP | Graphics.LEFT);
626
                    y_off+=spacer;
627
                    g.drawString("bf1:"+ keycontrol_bitfield[0] ,0,y_off,Graphics.TOP | Graphics.LEFT);
628
                    g.drawString("bf2:"+ keycontrol_bitfield[1] ,this.getWidth()/2,y_off,Graphics.TOP | Graphics.LEFT);
629
 
630
                    break;
631
 
632
                case STATEID_MOTORTEST:
633
                    for (int bar=0;bar<4;bar++)
634
 
635
                        {
636
                            g.setColor(((bar==act_motor)|motor_test_sel_all)?0x44CC44:0x4444DD);  
637
                            g.fillRect(this.getWidth()/(8*2)+bar*2*this.getWidth()/8,10,this.getWidth()/8,20+motor_test[bar]);
638
                            g.setColor(0x000000);
639
                            g.drawString(""+motor_test[bar] ,this.getWidth()/8+bar*2*this.getWidth()/8,10,Graphics.TOP | Graphics.HCENTER);
640
                            if(bar!=4)                      g.drawString(""+mk.debug_data.motor_val(bar) ,this.getWidth()/8+bar*2*this.getWidth()/8,30,Graphics.TOP | Graphics.HCENTER);
641
                        }
642
                    break;
643
 
644
                case STATEID_EDIT_PARAMS:
645
                    params_editor.paint(g);
646
                    break;
647
 
648
                case STATEID_SCANNING:
649
                    paint_lcd(g,true);
650
 
651
                    g.setClip(this.getWidth()/2-load_img.getWidth()/6+1,this.getHeight()/2-load_img.getHeight()/8+1, load_img.getWidth()/4,load_img.getHeight()/3);;
652
                    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);
653
                    g.drawImage(bt_img,this.getWidth()/2 ,this.getHeight()/2 , g.HCENTER | g.VCENTER);
654
                    break;
655
 
656
                case STATEID_RAWDEBUG: 
657
                    g.setFont(f2);
658
                    rawdebug_off_y=0;
659
                    if ((rawdebug_cursor_y+2)*spacer1>this.getHeight())
660
                        rawdebug_off_y=((rawdebug_cursor_y+2)*spacer1-this.getHeight())/spacer1;
661
                    for (int i=0;i<(this.getHeight()/spacer1);i++)
662
                        {
663
                            if (i+rawdebug_off_y==rawdebug_cursor_y)
664
                                {
665
                                g.setColor(0x0000CC);
666
                                g.fillRect(0,y_off,this.getWidth(),spacer1);
667
 
668
                                switch (act_skin)
669
                                    {
670
                                    case SKINID_DARK:
671
                                        g.setColor(0x2dcf20);
672
 
673
                                        break;
674
 
675
                                    case SKINID_LIGHT:
676
                                        g.setColor(0x000000);
677
                                        break;
678
                                    }
679
                                }
680
                            if (i+rawdebug_off_y<32) //todo better style
681
                                g.drawString(mk.debug_data.names[i+rawdebug_off_y] + mk.debug_data.analog[i+rawdebug_off_y] ,0,y_off,Graphics.TOP | Graphics.LEFT);
682
 
683
                            y_off+=spacer1;
684
 
685
                        }
686
 
687
 
688
 
689
                    break;
690
 
691
 
692
                case STATEID_MAINMENU: 
693
                    g.drawString("probed_device" + ufo_prober.probe_result + " by " + ufo_prober.reply,0,y_off,Graphics.TOP | Graphics.LEFT);
694
                    y_off+=spacer;
695
                    g.drawString("MK-Connection(" + (mk.connected?("open"+((System.currentTimeMillis()- mk.connection_start_time)/1000)+"s"):"close")+"):",0,y_off,Graphics.TOP | Graphics.LEFT);
696
                    y_off+=spacer;
697
                    g.setFont(f2);
698
                    g.drawString(" Name:" + mk.name,0,y_off,Graphics.TOP | Graphics.LEFT);
699
                    y_off+=spacer1;
700
                    g.drawString(" URL:" + mk.mk_url,0,y_off,Graphics.TOP | Graphics.LEFT);
701
                    y_off+=spacer1;
702
                    g.drawString(" Version:" + mk.version.str,0,y_off,Graphics.TOP | Graphics.LEFT);
703
                    y_off+=spacer1;
704
 
705
                    g.setFont(f1);
706
                    g.drawString("Packet Traffic:",0,y_off,Graphics.TOP | Graphics.LEFT);
707
                    y_off+=spacer;
708
                    g.setFont(f2);
709
                    g.drawString( " debug:"+mk.debug_data_count+ " LCD:" + mk.lcd_data_count + " vers:" + mk.version_data_count,0,y_off,Graphics.TOP | Graphics.LEFT);
710
                    y_off+=spacer1;
711
                    g.drawString( " other:"+mk.other_data_count+" params:"+mk.params_data_count,0,y_off,Graphics.TOP | Graphics.LEFT);
712
 
713
 
714
 
715
                case STATEID_SETTINGSMENU:
716
                    // falltru wanted
717
                case STATEID_SELECT_PARAMSET:
718
                case STATEID_HANDLE_PARAMS:
719
 
720
                case STATEID_DEVICESELECT:
721
                    paint_menu(g);
722
                    break;
723
 
724
                case STATEID_FLIGHTVIEW:
725
 
726
 
727
                    // !!TODO!! check exactly which version those Datas where introduced
728
                    if (mk.version.compare(0,60)==mk.version.VERSION_PREVIOUS)
729
                        {
730
                            g.drawString("Voltage: " + (mk.debug_data.UBatt()/10) + "," +(mk.debug_data.UBatt()%10)+"V" ,0,y_off,Graphics.TOP | Graphics.LEFT);
731
                            g.drawString("Sender: " + mk.debug_data.SenderOkay(),this.getWidth()/2,y_off,Graphics.TOP | Graphics.LEFT);
732
                            y_off+=spacer;
733
                        }
734
 
735
                    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+"p"+mk.params_data_count+")",0,y_off,Graphics.TOP | Graphics.LEFT);
736
 
737
                    y_off+=spacer;
738
 
739
                    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);
740
                    y_off+=spacer;
741
 
742
 
743
                    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);
744
                    y_off+=spacer;
745
 
746
                    if (mk.connected)
747
                        {
748
                            g.drawString("time conn:" +((System.currentTimeMillis()- mk.connection_start_time)/1000)+"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
749
                            y_off+=spacer;
750
                            g.drawString("time motor>15:" +(mk_stat.motor_on_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
751
                            y_off+=spacer;
752
                            g.drawString("time motor=15:" +(mk_stat.motor_stand_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
753
                        }
754
 
755
 
756
                    y_off=this.getHeight()-4*lcd_img.getHeight();
757
 
758
                    for ( int foo=0;foo<4;foo++)
759
                        {
760
                            for (int x=0;x<20;x++)
761
                                {
762
                                    g.setClip((lcd_img.getWidth()/222)*x,y_off,(lcd_img.getWidth()/222),lcd_img.getHeight());
763
                                            g.drawImage(lcd_img,(lcd_img.getWidth()/222)*x-(mk.LCD.get_act_page()[foo].charAt(x)-' ')*(lcd_img.getWidth()/222),y_off, g.TOP | g.LEFT);
764
 
765
                                        }
766
                                    y_off+=lcd_img.getHeight();
767
                                }
768
 
769
                            g.setClip(0,0,this.getWidth(),this.getHeight());
770
 
771
 
772
 
773
 
774
 
775
                    // draw lines
776
 
777
                    if (do_graph) for ( int x=0;x<this.getWidth();x++)
778
 
779
                        {
780
 
781
                            int p= (((-bg_offset+x-this.getWidth()-5)));
782
                            if (p<1)
783
                                p+=bg_img.getWidth();
784
                            p%=(bg_img.getWidth()-1);
785
 
786
                            g.setColor(0x156315);              
787
                            draw_graph_part(g,x,nick_line_pos_data[p]/line_scaler,nick_line_pos_data[p+1]/line_scaler);
788
                            g.setColor(0xCC1315);
789
                            draw_graph_part(g,x,roll_line_pos_data[p]/line_scaler,roll_line_pos_data[p+1]/line_scaler);
790
                            g.setColor(0xf8ef02);              
791
                            draw_graph_part(g,x,accnick_line_pos_data[p]/line_scaler,accnick_line_pos_data[p+1]/line_scaler);
792
                            g.setColor(0x19194d);
793
                            draw_graph_part(g,x,accroll_line_pos_data[p]/line_scaler,accroll_line_pos_data[p+1]/line_scaler);
794
 
795
 
796
 
797
                        }
798
 
799
                }
800
 
801
 
802
 
803
        } catch (Exception e) {}
804
 
805
    }
806
    Player mPlayer;
807
    VideoControl        mVideoControl;
808
    Image cam_img;
809
    int cam_img_seq=0;
810
    byte[] cam_raw;
811
 
812
    private void connect_mk(String url,String name)
813
    {
814
        //      ufo_prober.bluetooth_probe(url);
815
        mk.connect_to(url,name);
816
 
817
 
818
    }
819
 
820
    public void draw_graph_part(Graphics g,int x,int y1,int y2)
821
    {
822
        if ( this.getWidth()>200)
823
            {
824
                g.fillRect(x,line_middle_y-y1,1,1 );
825
                if (y1>y2)
826
                    g.fillRect(x,line_middle_y-y1,1,y1-y2);
827
                else
828
                    g.fillRect(x,line_middle_y-y2,1,y2-y1);
829
 
830
            }
831
        else
832
            {
833
            g.fillRect(x,line_middle_y-y1,1,1 );
834
                if (y1>y2)
835
                    g.fillRect(x,line_middle_y-y1,1,y1-y2);
836
                else
837
                    g.fillRect(x,line_middle_y-y2,1,y2-y1);
838
            }
839
 
840
 
841
 
842
 
843
    }
844
 
845
 
846
    /*********************************************** input Section **********************************************/
847
 
848
 
849
    public final String intro_str="   Digital Ufo Broadcasting with intelligent service equipment by Marcus -LiGi- Bueschleb ; Big Up Holger&Ingo for the MikroKopter Project (http://www.mikrokopter.de) ";
850
 
851
    int intro_str_pos=0;
852
    int intro_str_delay=3;
853
 
854
    public void chg_state(int next_state)
855
    {
856
        if (next_state!=state)act_menu_select=0;
857
        // prepare next state
858
        switch(next_state)
859
            {
860
            case STATEID_CAMMODE:
861
 
862
                if (mVideoControl==null)
863
                    try
864
                        {
865
                            debug.log("creating player\n");
866
                            mPlayer = Manager.createPlayer("capture://video?encoding=png&width=2048&height=1536");
867
 
868
                            debug.log("realizing player\n");
869
                            mPlayer.realize();
870
 
871
                            debug.log("get_videocontrol\n");
872
 
873
                            mVideoControl = (VideoControl)mPlayer.getControl("VideoControl");
874
 
875
                            debug.log("switching Canvas\n");
876
                            mVideoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
877
 
878
                            debug.log("get snap\n");
879
                            byte[] raw = mVideoControl.getSnapshot(null);    
880
 
881
                        }
882
                    catch ( Exception e)
883
                        {
884
                            debug.log(e.toString());
885
                        }
886
 
887
 
888
                break;
889
            case STATEID_KEYCONTROL:
890
                keycontrol_exit=0;
891
                break;
892
 
893
            case STATEID_SCANNING:
894
                lcd_lines=new String[4];
895
                lcd_lines[0]="Scanning for Devices";
896
                lcd_lines[1]="                    ";
897
 
898
//#expand lcd_lines[2]="DUBwise v%VERSION%       ";
899
                lcd_lines[3]=intro_str.substring(0,20);
900
                mk.close_connections(true);
901
 
902
                bt_scanner.search();
903
                break;
904
 
905
            case STATEID_HANDLE_PARAMS:
906
                menu_items=new String[2];
907
                menu_items[0]="write to MK";
908
                menu_items[1]="Discard";
909
                lcd_lines=new String[2];
910
 
911
                break;
912
 
913
            case STATEID_SELECT_PARAMSET:
914
                menu_items=new String[5];
915
                for (int i=0;i<5;i++)
916
                    menu_items[i]=mk.params.names[i];
917
 
918
                lcd_lines=new String[5];
919
                break;
920
 
921
            case STATEID_DEVICESELECT:
922
                menu_items=new String[bt_scanner.remote_device_count+1];
923
                for (int i=0;i<bt_scanner.remote_device_count;i++)
924
                    menu_items[i]=bt_scanner.remote_device_name[i];
925
                menu_items[bt_scanner.remote_device_count]="scan again";
926
                lcd_lines=new String[bt_scanner.remote_device_count+1];
927
                break;
928
 
929
 
930
            case STATEID_MAINMENU:
931
                menu_items=main_menu_items;
932
                lcd_lines=new String[menu_items.length];
933
                break;
934
 
935
            case STATEID_SETTINGSMENU:
936
 
937
                menu_items=new String[settings_menu_items.length];
938
                for(int cnt=0;cnt<settings_menu_items.length;cnt++)
939
                    menu_items[cnt]=settings_menu_items[cnt];
940
 
941
                menu_items[0]+=(act_skin==SKINID_DARK)?"Dark":"Light";
942
                menu_items[1]+=(!do_sound)?"Off":"On";
943
                menu_items[2]+=(!do_vibra)?"Off":"On";
944
                menu_items[3]+=(!do_graph)?"Off":"On";
945
                menu_items[4]+=(!fullscreen)?"Off":"On";
946
                menu_items[5]+=(!keep_lighton)?"Off":"On";
947
 
948
                lcd_lines=new String[menu_items.length];
949
                break;
950
 
951
            }
952
 
953
        // switch state
954
        state=next_state;
955
    }
956
 
957
 
958
    public void keyReleased(int keyCode)
959
    {
960
 
961
        switch(state)
962
            {
963
            case STATEID_MOTORTEST:
964
                act_motor_increase=0;
965
                break;
966
 
967
            case STATEID_KEYCONTROL:
968
                if (keyCode==KEY_POUND)
969
                    keycontrol_exit &= 255^1;
970
                else
971
                if (keyCode==KEY_STAR)
972
                    keycontrol_exit &= 255^2;
973
                else
974
                if ((keyCode >= this.KEY_NUM0) && (keyCode < this.KEY_NUM8))
975
                    keycontrol_bitfield[0]&=255^( 1<<(keyCode-this.KEY_NUM0));
976
                else
977
                    if ((keyCode >= this.KEY_NUM8) && (keyCode <= this.KEY_NUM9))
978
                        keycontrol_bitfield[1]&=255^( 1<<(keyCode-this.KEY_NUM8));
979
                else
980
                    switch (getGameAction (keyCode))
981
                            {
982
                            case UP:
983
                                keycontrol_bitfield[1]&=255^4;
984
                                break;
985
 
986
                            case DOWN:
987
                                keycontrol_bitfield[1]&=255^8;
988
                                break;
989
 
990
 
991
                            case LEFT:
992
                                keycontrol_bitfield[1]&=255^16;
993
                                break;
994
 
995
                            case RIGHT:
996
                                keycontrol_bitfield[1]&=255^32;
997
                                break;
998
 
999
                            case FIRE:
1000
                                keycontrol_bitfield[1]&=255^64;
1001
                                break;
1002
 
1003
 
1004
                            }
1005
                mk.send_keys(keycontrol_bitfield);
1006
                break;
1007
            }
1008
 
1009
    }
1010
 
1011
 
1012
    byte keycontrol_exit=0;
1013
 
1014
    public final static int[] keycontrol_bitfield={0,0};
1015
 
1016
 
1017
    public void pointerPressed (int pointer_x, int pointer_y)
1018
    {
1019
        if (pointer_x<this.getWidth()/2)
1020
            {
1021
                if (state==STATEID_EDIT_PARAMS)
1022
                    {
1023
                        chg_state(STATEID_HANDLE_PARAMS);
1024
                        return;
1025
                    }
1026
 
1027
                else
1028
                    if (state!=STATEID_KEYCONTROL)
1029
                        {
1030
                            chg_state(STATEID_MAINMENU);
1031
                            return;
1032
                        }
1033
            }
1034
        else
1035
            {
1036
                fullscreen=!fullscreen;
1037
                setFullScreenMode(fullscreen);
1038
            }
1039
 
1040
    }
1041
 
1042
    public void keyPressed(int keyCode)
1043
    {
1044
        debug.process_key(keyCode);
1045
 
1046
 
1047
        if (keyCode==KEY_STAR)
1048
            {
1049
                if (state==STATEID_EDIT_PARAMS)
1050
                    {
1051
                        chg_state(STATEID_HANDLE_PARAMS);
1052
                        return;
1053
                    }
1054
                else
1055
                    if (state!=STATEID_KEYCONTROL)
1056
                        {
1057
                        chg_state(STATEID_MAINMENU);
1058
                        return;
1059
                        }
1060
 
1061
            }
1062
        if ((keyCode==KEY_POUND)&&(state!=STATEID_KEYCONTROL))
1063
            {
1064
                fullscreen=!fullscreen;
1065
                setFullScreenMode(fullscreen);
1066
                return;
1067
            }
1068
        switch(state)
1069
            {
1070
            case STATEID_RAWDEBUG:
1071
 
1072
                switch (getGameAction (keyCode))
1073
                            {
1074
                            case UP:
1075
                                if (rawdebug_cursor_y==0)
1076
                                    rawdebug_cursor_y=31;
1077
                                else
1078
                                    rawdebug_cursor_y--;
1079
                                break;
1080
 
1081
                            case DOWN:
1082
                                if (rawdebug_cursor_y==31)
1083
                                    rawdebug_cursor_y=0;
1084
                                else
1085
                                    rawdebug_cursor_y++;
1086
                                break;
1087
 
1088
                            }
1089
                break;
1090
            case STATEID_KEYCONTROL:
1091
                if (keyCode==KEY_POUND)
1092
                    keycontrol_exit |= 1;
1093
                else
1094
                if (keyCode==KEY_STAR)
1095
                    keycontrol_exit |= 2;
1096
                else
1097
                if ((keyCode >= this.KEY_NUM0) && (keyCode < this.KEY_NUM8))
1098
                    keycontrol_bitfield[0]|=1<<(keyCode-this.KEY_NUM0);
1099
                else
1100
                if ((keyCode >= this.KEY_NUM8) && (keyCode <= this.KEY_NUM9))
1101
                    keycontrol_bitfield[1]|=1<<(keyCode-this.KEY_NUM8);
1102
 
1103
                else
1104
                    switch (getGameAction (keyCode))
1105
                            {
1106
                            case UP:
1107
                                keycontrol_bitfield[1]|=4;
1108
                                break;
1109
 
1110
                            case DOWN:
1111
                                keycontrol_bitfield[1]|=8;
1112
                                break;
1113
 
1114
 
1115
                            case LEFT:
1116
                                keycontrol_bitfield[1]|=16;
1117
                                break;
1118
 
1119
                            case RIGHT:
1120
                                keycontrol_bitfield[1]|=32;
1121
                                break;
1122
 
1123
                            case FIRE:
1124
                                keycontrol_bitfield[1]|=64;
1125
                                break;
1126
 
1127
                            }
1128
                if (keycontrol_exit==3)
1129
                    chg_state(STATEID_MAINMENU);
1130
                else
1131
                    mk.send_keys(keycontrol_bitfield);
1132
                break;
1133
 
1134
 
1135
            case STATEID_MOTORTEST:
1136
                switch (getGameAction (keyCode))
1137
                            {
1138
                            case UP:
1139
                                act_motor_increase=-1;
1140
                                break;
1141
 
1142
                            case DOWN:
1143
                                act_motor_increase=1;
1144
                                break;
1145
 
1146
                            case FIRE:
1147
                                motor_test_sel_all=!motor_test_sel_all;
1148
                                break;
1149
 
1150
                            case LEFT:
1151
                                act_motor--;
1152
                                if (act_motor<0) {act_motor=0; chg_state(STATEID_MAINMENU); }
1153
                                break;
1154
 
1155
                            case RIGHT:
1156
                                act_motor++;
1157
                                act_motor%=4;
1158
                                break;
1159
                            }
1160
 
1161
                break;
1162
            case STATEID_HANDLE_PARAMS:
1163
                if ( getGameAction (keyCode)==FIRE )
1164
                    switch(act_menu_select)
1165
                        {
1166
                        case 0:
1167
                            mk.write_params();
1168
                        default:
1169
                            chg_state(STATEID_MAINMENU);
1170
                        }
1171
                else
1172
                    menu_keypress(keyCode);
1173
                break;
1174
 
1175
            case STATEID_SETTINGSMENU:
1176
                if ( getGameAction (keyCode)==FIRE )
1177
                    switch(act_menu_select)
1178
                        {
1179
                        case SETTINGSMENU_CHANGESKIN:
1180
                            act_skin++;
1181
                            act_skin=(byte)(act_skin%2);
1182
                            load_images();
1183
                            chg_state(STATEID_SETTINGSMENU);
1184
                            break;
1185
                        case SETTINGSMENU_SOUNDTOGGLE:
1186
                            do_sound=!do_sound;
1187
                            chg_state(STATEID_SETTINGSMENU);
1188
                            break;
1189
                        case SETTINGSMENU_VIBRATOGGLE:
1190
                            do_vibra=!do_vibra;
1191
                            chg_state(STATEID_SETTINGSMENU);
1192
                            break;
1193
 
1194
                        case SETTINGSMENU_GRAPHTOGGLE:
1195
                            do_graph=!do_graph;
1196
                            chg_state(STATEID_SETTINGSMENU);
1197
                            break;
1198
 
1199
 
1200
                        case SETTINGSMENU_FULLSCREENTOGGLE:
1201
                            fullscreen=!fullscreen;
1202
                            setFullScreenMode(fullscreen);
1203
                            chg_state(STATEID_SETTINGSMENU);
1204
                            break;
1205
 
1206
                        case SETTINGSMENU_LIGHTTOGGLE:
1207
                            keep_lighton =!keep_lighton;
1208
                            chg_state(STATEID_SETTINGSMENU);
1209
                            break;
1210
 
1211
                        case SETTINGSMENU_BACK:
1212
                            chg_state(STATEID_MAINMENU);
1213
                            break;
1214
 
1215
                        }
1216
                else menu_keypress(keyCode);
1217
                break;
1218
 
1219
            case STATEID_MAINMENU:
1220
                if ( getGameAction (keyCode)==FIRE )
1221
                    switch(act_menu_select)
1222
                        {
1223
                        case MAINMENU_CAMMODE:
1224
                            chg_state(STATEID_CAMMODE);
1225
                            break;
1226
 
1227
                        case MAINMENU_SETTINGSMENU:
1228
                            chg_state(STATEID_SETTINGSMENU);
1229
                            break;
1230
                        case MAINMENU_STICKS:
1231
                            chg_state(STATEID_STICKVIEW);
1232
                            break;
1233
 
1234
                        case MAINMENU_KEYCONTROL:
1235
                            chg_state(STATEID_KEYCONTROL);
1236
                            break;
1237
 
1238
                        case MAINMENU_TELEMETRY :
1239
                            chg_state(STATEID_FLIGHTVIEW);
1240
                            break;
1241
 
1242
                        case  MAINMENU_MOTORTEST :
1243
                            chg_state(STATEID_MOTORTEST);
1244
                            break;
1245
 
1246
                        case MAINMENU_PARAMS :
1247
                            chg_state(STATEID_SELECT_PARAMSET);
1248
                            break;
1249
 
1250
 
1251
                        case MAINMENU_PROXY:
1252
                            mk.do_proxy("socket://192.168.1.42:2323");
1253
                            break;
1254
 
1255
                        case MAINMENU_DEVICESELECT:
1256
                            chg_state(STATEID_SCANNING);
1257
                            break;
1258
 
1259
                        case MAINMENU_RAWDEBUG:
1260
                            chg_state(STATEID_RAWDEBUG);
1261
                            break;
1262
 
1263
                        case MAINMENU_QUIT:
1264
                            // set quit Flag
1265
                            quit=true;
1266
                            break;
1267
 
1268
                        }
1269
                else menu_keypress(keyCode);
1270
                break;
1271
 
1272
            case STATEID_SELECT_PARAMSET:
1273
                if ( getGameAction (keyCode)==FIRE )
1274
                    {              
1275
                        if ( mk.params.field[act_menu_select]!=null)
1276
                            {
1277
                                mk.params.act_paramset=act_menu_select;
1278
                                chg_state(STATEID_EDIT_PARAMS);
1279
                            }
1280
                    }
1281
                else menu_keypress(keyCode);
1282
                break;
1283
            case STATEID_DEVICESELECT:
1284
                /*
1285
                if ((keyCode >= this.KEY_NUM0) && (keyCode < this.KEY_NUM0+bt_scanner.remote_device_count))
1286
                    {
1287
                    connect_mk("btspp://"+bt_scanner.remote_device_mac[keyCode-this.KEY_NUM0] + ":1",bt_scanner.remote_device_name[keyCode-this.KEY_NUM0]);
1288
                    chg_state(STATEID_MAINMENU);
1289
                    }
1290
                else
1291
                */
1292
 
1293
                if ( getGameAction (keyCode)==FIRE )
1294
                    {              
1295
 
1296
                        if (bt_scanner.remote_device_count > act_menu_select)
1297
                            {
1298
                                connect_mk("btspp://"+bt_scanner.remote_device_mac[act_menu_select] + ":1",bt_scanner.remote_device_name[act_menu_select]);
1299
                                chg_state(STATEID_MAINMENU);
1300
                            }
1301
                        else
1302
                            chg_state(STATEID_SCANNING);
1303
                    }
1304
                else menu_keypress(keyCode);
1305
 
1306
                break;
1307
 
1308
            case STATEID_EDIT_PARAMS:
1309
                params_editor.keypress(keyCode,getGameAction (keyCode)) ;
1310
                break;
1311
 
1312
            case STATEID_FLIGHTVIEW:
1313
 
1314
                if ((keyCode >= this.KEY_NUM0) && (keyCode <= this.KEY_NUM9))              
1315
                        mk.LCD.set_page(keyCode-this.KEY_NUM0);
1316
                else
1317
                switch (getGameAction (keyCode))
1318
                    {
1319
                    case LEFT:
1320
                    case UP:
1321
                        mk.LCD.LCD_PREVPAGE();
1322
                        break;
1323
 
1324
                    case RIGHT:
1325
                    case DOWN:
1326
                        mk.LCD.LCD_NEXTPAGE();
1327
                        break;
1328
 
1329
 
1330
 
1331
                    }
1332
                break;
1333
            }
1334
 
1335
 
1336
 
1337
    }
1338
 
1339
 
1340
 
1341
 
1342
 
1343
 
1344
 
1345
 
1346
}
1347
 
1348