DevkitProで使われているdswifiについて(4)
いつも夜遅くなって、中々進みませんが、書いてみます。
とりあえず、例として、dswifiを使ってインターネット上のサーバからファイルをもらうプログラムを書きました。
//************************************************************************ // wifiテスト 2010.1.31 //************************************************************************ #include <nds.h> #include <stdio.h> //ファイル関係ヘッダ #include <fat.h> #include "tarosa_TouchPen03.h" //自作のペンとパッド入力 #include "tarosa_Graphic1410.h" //自作のグラフィック #include "tarosa_Shinofont03.h" //自作の日本語表示 #include "tarosa_image.h" #include "tarosa_Wifi20100131.h" //メインスクリーンとサブスクリーンの設定 extern uint16* MainScreenA; extern uint16* SubScreenA; //************************************************** //メイン関数 //************************************************** int main( void ) { VRAM_MODE5_INI(); //グラフィックをMode5に初期化する(自作関数) lcdMainOnTop(); //メイン画面を上にする DS_WifiIni(); //Wifiの初期化(自作関数) //ファイル関係の初期化 if( !fatInitDefault() ){ ShinoPrintCenter( SubScreenA, 128, 5*12, (u8 *)"FAT Init Error", RGB(31,0,0), RGB(31,31,31), 1 ); while( true ); } Wifi_EnableWifi(); //wifiを開始 if( !DS_WifiAutoConnect() ){ //APに自動接続(自作関数) ShinoPrintCenter( SubScreenA, 128, 5*12, (u8 *)"Auto Connect Error", RGB(31,0,0), RGB( 31,31,31 ), 1 ); while( true ); } //由杞さん作の「ももいろ」をピアプロサイトから取得します。 //http取り込み(自作) SimpleHttpGet( "c1.piapro.jp", "timg/3p4qcgbyyjshkw1v_20100130031227_0120_0120.jpg", "ruka.jpg" ); Wifi_DisconnectAP(); //APから切断 Wifi_DisableWifi(); //wifi停止 //jpeg表示(自作) jpgView( "ruka.jpg", MainScreenA, 68, 36, 120, 120, 0, 0 ); //文字表示(自作) ShinoPrintCenter( MainScreenA, 128, 13*12, (u8 *)"ももいろ 由杞さん作", RGB(31,31,31), RGB( 0,0,0 ), 1 ); //キー入力待ち(自作) anyNyuryoku(); //システムの電源を切ります powerOn(PM_SYSTEM_PWR); while(1){ swiWaitForVBlank(); } return( 0 ); }
自作関数が多いですが説明します。ヘッダは置いておいてmain()から説明します。
いろいろな初期化
VRAM_MODE5_INI(); //グラフィックをMode5に初期化する(自作関数) lcdMainOnTop(); //メイン画面を上にする DS_WifiIni(); //Wifiの初期化(自作関数) //ファイル関係の初期化 if( !fatInitDefault() ){ ShinoPrintCenter( SubScreenA, 128, 5*12, (u8 *)"FAT Init Error", RGB(31,0,0), RGB(31,31,31), 1 ); while( true ); }
これが初期化部です。VRAM_MODE5_INI();は、自作の画面初期化ルーチンです。メイン画面、サブ画面ともに32768色表示モードにします。lcdMainOnTop();メイン画面を上画面に指定するコマンドです。
DS_WifiIni();が自分で使いやすくしたWifiの初期化プログラムです。
//************************************************** // DSのWifi機能を初期化します。 //************************************************** void DS_WifiIni( void ) { Wifi_InitDefault( false ); //Wifiの初期化(falseで初期化するのみ) Wifi_DisableWifi(); //wifiを停止 }
これだけです。dswifiのもともとの初期化プログラムは、初期化すると直ぐWifiが動作するように作られていたので、必要なときまではwifiが動作しないように、初期化して直ぐに停止させるようにしました。こうしないと、電池がもったいないです。
次は、ファイルの初期化です。DLDIからメモリカードのファイルに読み書きできるようになります。
wifiの起動
初期化が終了したので、wifiを作動させます。
Wifi_EnableWifi(); //wifiを開始 if( !DS_WifiAutoConnect() ){ //APに自動接続(自作関数) ShinoPrintCenter( SubScreenA, 128, 5*12, (u8 *)"Auto Connect Error", RGB(31,0,0), RGB( 31,31,31 ), 1 ); while( true ); }
Wifi_EnableWifi();がwifiを動作させるコマンドです。この後、アクセスポインタ(AP)に自動接続します。DS_WifiAutoConnect()がそうです。自作です。
//************************************************** // DSのWifiアクセスポイントに自動接続に行きます // true:無事繋がった。flase:接続できなかった //************************************************** bool DS_WifiAutoConnect( void ) { bool ret = true; int i; //自動接続する Wifi_AutoConnect(); int status = ASSOCSTATUS_DISCONNECTED; //最大10秒待って、結果を返す for( i=0; i<600; i++ ){ if( status==ASSOCSTATUS_ASSOCIATED ){ break; } else if( status==ASSOCSTATUS_CANNOTCONNECT ){ ret = false; break; } status = Wifi_AssocStatus(); swiWaitForVBlank(); } return( ret ); }
Wifi_AutoConnect();コマンドで自動接続を動作させた後、10秒程度、接続に成功したか、失敗したかを待つプログラムになっています。Wifi_AssocStatus();でステータスが返ってきます。
これが成功したら、インターネットに通信に行けます。
webサーバとおしゃべりする
次に、サーバにアクセスします。
//由杞さん作の「ももいろ」をピアプロサイトから取得します。 //http取り込み(自作) SimpleHttpGet( "c1.piapro.jp", "timg/3p4qcgbyyjshkw1v_20100130031227_0120_0120.jpg", "ruka.jpg" );
試しに、ピアプロのサーバにアクセスして、サムネイル化してサーバに置かれているjpeg画像を取得してみます。由杞さん作の「ももいろ」という絵を取得させていただきました。SimpleHttpGet()というコマンドで、DSにhttpをしゃべらせてファイルを取得します。SimpleHttpGet()は、次回に説明したいと思います。
wifiの切断と停止
ファイルの取得が終われば、電池がもったいないので、wifiを止めます。
Wifi_DisconnectAP(); //APから切断 Wifi_DisableWifi(); //wifi停止
見ての通り、切断と停止を行います。dswifiのコマンドそのままです。
jpeg画像と文字の表示
取得したjpegファイルを画面に表示します。
//jpeg表示(自作) jpgView( "ruka.jpg", MainScreenA, 68, 36, 120, 120, 0, 0 ); //文字表示(自作) ShinoPrintCenter( MainScreenA, 128, 13*12, (u8 *)"ももいろ 由杞さん作", RGB(31,31,31), RGB( 0,0,0 ), 1 ); //キー入力待ち(自作) anyNyuryoku();
自作のjpeg表示と文字表示プログラムです。説明は割愛します。ソース見てね・・・。
電源オフ
//システムの電源を切ります powerOn(PM_SYSTEM_PWR); while(1){ swiWaitForVBlank(); } return( 0 ); }
powerOn( PM_SYSTEM_PWR );でシステムの電源が切れます。これはFifoSystemを使っています。powerOn()で電源が切れるというのは、無しですよね。ソース見てヒドイと思いました。電源切れるので、後ろのwhile(1)は何も意味を成しません。
こんな感じで、dswifiが使えます。最後にjpegを表示した画面を上げておきます。
明日の仕事にさしつかえるので寝ます。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム