/*********************************************/
/* SampleDc.java                             */
/* Copyright(c) 2002 Connect Corporation     */
/* All rights reserved.                      */
/* Target : MIDP(JSCL1.0)                    */
/*===========================================*/
/*       デヴァイスコントロールサンプル      */
/* Desc. :                                   */
/*   デバイスコントロールの機能を使ってみる  */
/*********************************************/
/*  Version    Date      Author              */
//  Ver. 1.00  02/05/02  K.Iguchi            */
/*********************************************/


//===========================================================//
//=====  インポート  ========================================//
//===========================================================//
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
import com.j_phone.system.*;

//===========================================================//
//=====  メインクラス  ======================================//
//===========================================================//
public class SampleDc extends MIDlet
{
    private EC ec;
    private Display dp;

    private DeviceControl dc;

    //=====  エントリ =====//
    public void startApp()
    {
        ec = new EC();

        dp = Display.getDisplay( this );
        dp.setCurrent( ec );

        //-----  デバイスコントロールインスタンス取得  -----//
        dc = DeviceControl.getDefaultDeviceControl();

        (new Thread( ec )).start();
    }
    
    public void pauseApp() {}

    public void destroyApp( boolean u ) {}


    //===========================================================//
    //=====  拡張描画クラス  ====================================//
    //===========================================================//
    private class EC extends Canvas implements Runnable
    {
        private int WI = getWidth(), HE = getHeight();
        private int lat, lon, ints, batt;
        private String place = "";
        private boolean ints_low = false, batt_low = false;
        private Calendar cal;
        
        public EC(){}

        //=====  描画処理  =====//
        public void paint(Graphics g)
        {
            int deg, min, sec;
            String st;
        
        
            g.setColor( 0x00ffffff );
            g.fillRect( 0, 0, WI, HE );
            
            g.setColor( 0x00000000 );

            //-----  位置情報表示  -----//
            deg = lat/3600;
            min = (lat%3600)/60;
            sec = (lat%3600)%60;
            g.drawString( "経度："+deg+"度"+min+"分"+sec+"秒", 0,  0, 4|16 );
            deg = lon/3600;
            min = (lon%3600)/60;
            sec = (lon%3600)%60;
            g.drawString( "緯度："+deg+"度"+min+"分"+sec+"秒", 0, 12, 4|16 );
            g.drawString( place,        0, 24, 4|16 );

            //-----  電気的情報表示  -----//
            g.drawString( "電界強度：" + ints, 0, 36, 4|16 );
            g.drawString( "バッテリー：" + batt, 0, 48, 4|16 );

            //-----  時計表示  -----//
            cal = Calendar.getInstance();
            if( cal.get( cal.AM_PM ) == cal.AM ) st = "午前";
            else                                 st = "午後";
            g.drawString( st + cal.get( cal.HOUR ) + "時  "
                + cal.get( cal.MINUTE )+"分",  0, HE-12, 4|16 );
        }


        //=====   フレーム  =====//
        public void run()
        {
            //-----  メインループ  -----//
            while( true ){
                //---  情報監視  ---//
                lat = dc.getLatitude();
                lon = dc.getLongitude();
                try{
                    place = dc.getPlaceName();
                } catch( IllegalStateException ise ){
                    place = "取得できません";
                }
                ints = dc.getDeviceState( dc.FIELD_INTENSITY );
                batt = dc.getDeviceState( dc.BATTERY );

                //---  電界強度チェック  ---//
                if( ints < 50 && ints_low == false ) {
                    //-  強度が低下してきたときはデバイスコントロールを
                    //-  用いてバックライトを点滅させる
                    try{
                        // ノンブロックなメソッドであることに注意
                        dc.blink( 200, 200, 6 );
                    } catch( Exception e ){}
                    ints_low = true;
                }
                if( ints >= 50 ) {
                    ints_low = false;
                }

                //---  バッテリーチェック  ---//
                if( batt < 50 && batt_low == false ) {
                    //-  バッテリが減ってきたらデバイスコントロールを
                    //-  利用してバイブレーターを振動させる
                    try{
                        dc.setDeviceActive( dc.VIBRATION, true );//振動開始
                        sleep( 1000 );
                        dc.setDeviceActive( dc.VIBRATION, false );//振動終了
                    } catch( Exception e ){}
                    batt_low = true;
                }
                if( batt >= 50 ) {
                    batt_low = false;
                }

                repaint();
                sleep( 200 );
            }
        }

    }//=====  End of ExtendCanvas

    //=====  便利ツール  =====//
    private void sleep( int t )
    {
        try{
            Thread.sleep( t );
        } catch( Exception e ) {}
    }

    private void log( String s ){ System.out.println( s ); }

}
