Subversion Repositories FlightCtrl

Rev

Rev 210 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*********************************************************************************************************************************
 *                                                                                                                                *
 * minimal canvas to test Abstraction layer on various Phones                                                                     *
 *                                                                                                                                *
 * Author:        Marcus -LiGi- Bueschleb                                                                                         *
 * Project-Start: 9/2007                                                                                                          *
 * Mailto:        ligi@smart4mobile.de                                                                                            *
 * Licence:       Creative Commons / Non Commercial                                                                               *
 * Big Up:        Holger&Ingo                                                                                                     *
 *********************************************************************************************************************************/


import javax.microedition.lcdui.*;
import javax.microedition.rms.*;


public class MKMiniCanvas
        extends Canvas
        implements Runnable
{

   
    private BTSearcher bt_scanner;
    private MKCommunicator mk=null;
    private MKStatistics mk_stat=null;
    private String err="";
    private MKMiniMidlet root;

    private Image bg_img;
    private Image bt_img;
    private Image lcd_img;
    private Image load_img;


    public int[] nick_line_pos_data;
    public int[] roll_line_pos_data;

    public int[] accnick_line_pos_data;
    public int[] accroll_line_pos_data;


    public int frame_pos=0;
   
    int line_scaler=20;

    public int line_middle_y;

    public MKMiniCanvas(MKMiniMidlet _root)
        {

            root=_root;

            try
                {
                    lcd_img=Image.createImage("/lcd.png");
                    bt_img=Image.createImage("/bt.png");
                    bg_img=Image.createImage("/bg.jpg");                   
                    load_img=Image.createImage("/load.png");
                }
            catch (Exception e)
                {
                    err+=e.toString();
                }
           

            nick_line_pos_data=new int[bg_img.getWidth()];
            roll_line_pos_data=new int[bg_img.getWidth()];
            accnick_line_pos_data=new int[bg_img.getWidth()];
            accroll_line_pos_data=new int[bg_img.getWidth()];
           
            for (int c=0;c<bg_img.getWidth();c++)
                {
                    nick_line_pos_data[c]=-1;
                    roll_line_pos_data[c]=-1;
                    accnick_line_pos_data[c]=-1;
                    accroll_line_pos_data[c]=-1;
                }
           
       
            // mk = new MKCommunicator("btspp://000BCE016B5B:1");
            //connect_mk("btspp://000BCE016B4F:1");

           
                try
                    {
                        RecordStore recStore = RecordStore.openRecordStore("bturl", true );

                        if (recStore.getNumRecords()==1)
                            {
                                byte[] recData = new byte[recStore.getRecordSize(1)];
                                int len = recStore.getRecord(1, recData, 0);
                                rescan=false;
                                connect_mk(new String(recData, 0, len));
                            }
                    }
                catch (Exception e)
                    {
                        err+=e.toString();
                    }

            if (mk==null) bt_scanner = new BTSearcher();
                   
            new Thread(this).start();

        }

    boolean quit=false;
    boolean rescan=true;
    int bg_offset=0;
   


   
    /********************************************************** Thread ***********************************************************/
    // ticking runnable Section
    public void run()
    {

        while(true)
            {
                long loopStartTime = System.currentTimeMillis();
                long sleeptime=0;
                // ticked thing
       
                frame_pos++;

                try {
                nick_line_pos_data[-bg_offset] = mk.debug_data.nick_int();
                roll_line_pos_data[-bg_offset] = mk.debug_data.roll_int();
                accnick_line_pos_data[-bg_offset] = mk.debug_data.accnick();
                accroll_line_pos_data[-bg_offset] = mk.debug_data.accroll();
                }
                catch (Exception e)
                    {
                        err+=e.toString();
                    }

               

               
                if (quit)
                    {


                       
                        try
                            {
                                RecordStore recStore = RecordStore.openRecordStore("bturl", true );
                               
                                if (recStore.getNumRecords()==1)
                                    recStore.deleteRecord(1);
                                byte[] rec = mk.mk_url.getBytes();
                                recStore.addRecord(rec, 0, rec.length);

                            }
                        catch (Exception e)
                            {
                                err+=e.toString();
                            }

                        root.quit();
                    }
                if (rescan)
                    {
                    if (mk!=null) mk.close_connections(true);
                    mk=null;
                    bt_scanner.search_again();
                    }

                rescan=false;
                bg_offset--;
                if (bg_offset==-bg_img.getWidth())
                    bg_offset=0;
                com.nokia.mid.ui.DeviceControl.setLights(0,100);
                //bt.tick();
                // every state has sth to do in tick section
             

//                System.gc();
                repaint();
                serviceRepaints();
       
                       
                sleeptime=1000/ 15 - (int) (System.currentTimeMillis()- loopStartTime);
               
               
                if (sleeptime<0)
                        sleeptime=100; // everyone has fi sleep
               
                try { Thread.sleep(sleeptime); }
                catch (Exception e)
                    {
                         err="Problem Sleeping ";
                    }

            }
    }

     

       
    int local_max=-1;

    // drawing section
    public void paint(Graphics g) {
       
        if (mk!=null)
            {
                line_middle_y=this.getHeight()/2;
                if (local_max<Math.abs(mk.debug_data.nick_int()))
                    local_max=Math.abs(mk.debug_data.nick_int());
                if (local_max<Math.abs(mk.debug_data.roll_int()))
                    local_max=Math.abs(mk.debug_data.roll_int());
                if (local_max<Math.abs(mk.debug_data.accnick()))
                    local_max=Math.abs(mk.debug_data.accnick());
                if (local_max<Math.abs(mk.debug_data.accroll()))
                    local_max=Math.abs(mk.debug_data.accroll());
                line_scaler= local_max/(this.getHeight()/2)+1;
            }
        int spacer=(g.getFont().getHeight());
        g.setColor(0xFFFFFF);
        g.fillRect(0,0,this.getWidth(),this.getHeight());
        g.drawImage(bg_img,bg_offset,0, g.TOP | g.LEFT);
        if (bg_offset+bg_img.getWidth()<this.getWidth())
            g.drawImage(bg_img,bg_offset+bg_img.getWidth(),0, g.TOP | g.LEFT);

        g.setColor(0x000000);
       
        if (mk==null)
            {

               
                if (bt_scanner.searching)
                    {

                       
                        g.drawString("scanning for BT-Devices",this.getWidth()/2,this.getHeight()/2+load_img.getHeight()/8,Graphics.TOP | Graphics.HCENTER);

                        g.setClip(this.getWidth()/2-load_img.getWidth()/6,this.getHeight()/2-load_img.getHeight()/8, load_img.getWidth()/4,load_img.getHeight()/3);;
                        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);
                        g.drawImage(bt_img,this.getWidth()/2 ,this.getHeight()/2 , g.HCENTER | g.VCENTER);
                    }
                else
                    {
                        g.drawString("Press key 0-"+(bt_scanner.remote_device_count-1) + " to continue" ,0,0,Graphics.TOP | Graphics.LEFT);
                        for (int i=0;i<bt_scanner.remote_device_count;i++)
                            g.drawString("#"+i+">" + bt_scanner.remote_device_name[i]+"("+bt_scanner.remote_device_mac[i]+")",0,spacer+spacer*i,Graphics.TOP | Graphics.LEFT);
                       
                    }




            }
        else // MK is connected
            {
                int y_off=0;

                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);

                y_off+=spacer;

                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);
                y_off+=spacer;

       
                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);
                y_off+=spacer;

                if (mk.connected)
                    {
                        g.drawString("time conn:" +((System.currentTimeMillis()- mk.connection_start_time)/1000)+"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
                        y_off+=spacer;
                        g.drawString("time motor>15:" +(mk_stat.motor_on_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
                        y_off+=spacer;
                        g.drawString("time motor=15:" +(mk_stat.motor_stand_time/1000) +"s" ,0,y_off,Graphics.TOP | Graphics.LEFT);
                    }


                y_off=this.getHeight()-4*19;

                for ( int foo=0;foo<4;foo++)
                    {
                       
                        for (int x=0;x<20;x++)
                            {
                            g.setClip(12*x,y_off,12,19);
                            g.drawImage(lcd_img,12*x-(mk.LCD.LCD_str[foo].charAt(x)-' ')*(lcd_img.getWidth()/95),y_off, g.TOP | g.LEFT);

                            }
                        y_off+=19;

                       

                    }

                g.setClip(0,0,this.getWidth(),this.getHeight());

               


            }
        // draw lines

        for ( int x=0;x<this.getWidth();x++)

            {

                int p= (((-bg_offset+x-this.getWidth()-5)));
                if (p<1)
                    p+=bg_img.getWidth();
                p%=(bg_img.getWidth()-1);

                g.setColor(0x156315);          
                draw_graph_part(g,x,nick_line_pos_data[p]/line_scaler,nick_line_pos_data[p+1]/line_scaler);
                g.setColor(0xCC1315);
                draw_graph_part(g,x,roll_line_pos_data[p]/line_scaler,roll_line_pos_data[p+1]/line_scaler);
                g.setColor(0xf8ef02);          
                draw_graph_part(g,x,accnick_line_pos_data[p]/line_scaler,accnick_line_pos_data[p+1]/line_scaler);
                g.setColor(0x19194d);
                draw_graph_part(g,x,accroll_line_pos_data[p]/line_scaler,accroll_line_pos_data[p+1]/line_scaler);
               

           
            }
    }

    private void connect_mk(String url)
    {
        mk = new MKCommunicator(url);
        mk_stat= new MKStatistics(mk);

    }

    public void draw_graph_part(Graphics g,int x,int y1,int y2)
    {
        g.fillRect(x,line_middle_y-y1,2,2 );
        if (y1>y2)
            g.fillRect(x,line_middle_y-y1,2,y1-y2);
        else
            g.fillRect(x,line_middle_y-y2,2,y2-y1);
    }

    /*********************************************** input Section **********************************************/
    // keys
    public boolean fullscreen=false;

    public void keyPressed(int keyCode)
    {
       
        if ((mk==null)&&(keyCode >= this.KEY_NUM0) && (keyCode < this.KEY_NUM0+bt_scanner.remote_device_count))
            connect_mk("btspp://"+bt_scanner.remote_device_mac[keyCode-this.KEY_NUM0] + ":1");
        else
            {
                switch (keyCode)
                    {
                       
                    case KEY_STAR:
                        mk.other_data_count=23;
                        quit=true;
                        break;

                    case KEY_POUND:
                        //rescan=true;
                        fullscreen=!fullscreen;
                        setFullScreenMode(fullscreen);
                        break;
                    }
                switch (getGameAction (keyCode))
                    {
                    case UP:
                        mk.LCD.LCD_PREVPAGE();
                        break;
                       
                    case DOWN:
                        mk.LCD.LCD_NEXTPAGE();
                        break;
                    }
            }
       
       
        return;
    }

 






}