DSで1分毎に時計画像を表示してみた
jpegのデコーダができたので、1分毎に画像をインターネットから取ってきて画面表示するプログラムを作ってみました。
とりあえず、テストのため画像データを1440枚用意して、サイトにアップしました。アップに時間が掛かったです。
1分おき画像表示
1分おきに画像を取得するのですが、0分で画像が入れ替わるように、1分先の画像を先読みしています。
HttpHeader構造体をセットして、HttpFileGet()を呼び出せばファイルを取得します。画像データは時分.jpgというファイル名で、http://momoonga.michikusa.jp/tokei/0000.jpgという風に置いています。
//************************************************** // 1分おき画像表示開始 //************************************************** void TokeiStart( void ) { FILE *fpd = NULL; char *jpgfilename = "tokei.jpg"; char *binfilename = "tokei.bin"; char *ppmfilename = "tokei.ppm"; char getfilename[64]; time_t unixTime; struct tm *timeStruct; int ret = true; int key = 0; int hr0, min0; int hr1, min1; JpegIni(); //Jpegの展開パラーメータの初期化 JpegSetup.scale_denom = 1; HttpFileGetIni(); //http取得パラメータの初期化 //今の時間の時計画像ゲット unixTime = time( NULL ); timeStruct = gmtime((const time_t *)&unixTime); hr0 = timeStruct->tm_hour; min0 = timeStruct->tm_min; sprintf( getfilename, "/tokei/%02d%02d.jpg", hr0, min0 ); HttpHeader.RecvTime = 2000000L; HttpHeader.Portnum = 80; HttpHeader.Get = getfilename; HttpHeader.Host = "momoonga.michikusa.jp"; HttpHeader.UserAgent = "Nintendo DS"; HttpHeader.Referer = "http://momoonga.michikusa.jp/"; ret = false; while( ret==false ){ fpd = fpOpen( "", jpgfilename, 1 ); if( fpd==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)jpgfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); continue; } ret = HttpFileGet( fpd, NULL, NULL ); fclose( fpd ); if( ret==false ) continue; ret = DecodeJpegFile( MainScreenB, jpgfilename, ppmfilename ); } fpd = fpOpen( "", binfilename, 1 ); if( fpd==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)binfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); while( 1 ); } fwrite( MainScreenB, 1, 0x18000, fpd ); fclose( fpd ); hr0 = -1; min0 = -1; while( true ){ while( true ){ unixTime = time( NULL ); timeStruct = gmtime((const time_t *)&unixTime); if( min0!=timeStruct->tm_min ){ break; } scanKeys(); key = keysDown(); if( (key&KEY_SELECT)!=0 ){ //SELECTボタンで終了 return; } } //分が変わったときに抜けてくる //画面入れ替え ChangePicture( binfilename ); hr0 = timeStruct->tm_hour; min0 = timeStruct->tm_min; hr1 = hr0; min1 = min0 + 1; if( min1>=60 ){ min1 = 0; hr1++; if( hr1>=24 ){ hr1 = 0; } } sprintf( getfilename, "/tokei/%02d%02d.jpg", hr1, min1 ); ret = false; while( ret==false ){ fpd = fpOpen( "", jpgfilename, 1 ); if( fpd==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)jpgfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); continue; } ret = HttpFileGet( fpd, NULL, NULL ); fclose( fpd ); if( ret==false ) continue; ret = DecodeJpegFile( MainScreenB, jpgfilename, ppmfilename ); } fpd = fpOpen( "", binfilename, 1 ); if( fpd==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)binfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); while( 1 ); } fwrite( MainScreenB, 1, 0x18000, fpd ); fclose( fpd ); } }
Httpのヘッダ設定用構造体
httpヘッダ設定用の構造体は、下記のように作りました。この構造体を使わない場合は、ヘッダファイルを用意して、読み込む方法も選択できるようにしています。その説明は次回にでも。
//Httpのヘッダ設定用構造体 typedef struct HttpHeaderPara{ long RecvTime; //ソケットの受信待ち時間 long Portnum; //ポート番号 char *Get; //取得ファイル名(例 /abc/dfg.jpg) char *Host; //ホスト名(例 www.xyz.com ) char *UserAgent; //User-Agent(例 Nintendo DS) char *Referer; //参照元(例 www.xyz.com/ ) } HttpHeaderParam;
httpで取得したJpeg画像をデコードする
httpで取得したJpeg画像をデコードするプログラムです。 Jpeg2Ppm()を呼んでいます。この関数でJpegファイルをPPMファイルに変換して、PpmCompView()でPPMファイルをDSの画像形式に変換しています。今回は、画面の入れ替わり効果を出すために、裏画面に描いています。
//************************************************** // httpで取得したJpeg画像をデコードします //************************************************** int DecodeJpegFile( uint16 *screen, char *jpgfilename, char *ppmfilename ) { FILE *fps = NULL; FILE *fpd = NULL; int ret; fps = fpOpen( "",jpgfilename, 0 ); if( fps==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)jpgfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); return( false ); } fpd = fpOpen( "", ppmfilename, 1 ); if( fpd==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)ppmfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); fclose( fps ); return( false ); } ret = Jpeg2Ppm( fps, fpd ); fclose( fps ); fclose( fpd ); if( ret==false ){ return( ret ); } fps = fpOpen( "",ppmfilename, 0 ); if( fps==NULL ){ ShinoUpPrint( SubScreenA, (u8 *)ppmfilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( SubScreenA, (u8 *)"↑ fopen Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); return( false ); } ret = PpmCompView( fps, screen, 0, 0, 256, 192, NULL ); fclose( fps ); return( ret ); }
応用として
このプログラムを改造すると一定時間毎に画像を取得するプログラムが簡単に作れると思います。試しに、気象衛星「ひまわり」の画像を一時間毎に取得するプログラムを作ってみました。
ppmファイルを縦て表示するオプションも作りました。
早めにプログラムをアップしたいと思います。
今日はこの辺で・・・・。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム