BREW で GPS - 1 / 2 -
IPosDet
IPosDet は GPS を利用するための BREW インターフェースです。IPosDet を使うと、GPS から現在位置の緯度、経度、海抜高度、誤差などが取得できます。
アプリの概要
- 最初に、"Push Select Key to get GPS information " を表示します。
- セレクトキーが押されると、"SUCCESS" を表示し、暫くしてから現在の緯度と経度を表示します。
GPS エミュレーション
GPS を使う BREW アプリをエミュレータで起動すると、インターフェース作成には成功しますが、結果取得の際にエラーが発生します。エミュレータには GPS 機能がないからです。
この問題は BREW エミュレータの "GPS エミュレーション機能" によって解決できます。
BREW エミュレータ起動後、ドロップダウンメニューの [ツール] - [GPS エミュレーション...] を選択すると、GPS 情報を取得する 2 つの方法を選択するダイアログが表示されます。
- ファイル入力:GPS 情報をファイルから取得します。コールバックが通知されるまでの時間を設定すると GPS 測定の遅延エミュレーションもできます。
- シリアルポート入力:GPS 情報をパソコンにシリアル接続された GPS 端末から取得します。
ここでは、ファイル入力の例を説明します。
BREW エミュレータで使える GPS 情報は、NMEA メッセージの書かれた拡張子が BGP のテキストファイルです。このファイルを BGP ファイルと呼びます。
BGP ファイルのパスにはスペースや全角文字を含まないようにし、先のダイアログから選択します。
NMEAsample.bgp (BGP ファイルの例)
$GPRMC,021803.751,A,3501.5666,N,13546.9457,E,0.00,212.31,110604,,*07 $GPGGA,021804.751,3501.7100,N,13546.6200,E,1,08,1.0,118.5,M,34.6,M,0.0,0000*76
NMEA メッセージの詳細は "BREW SDK ユーザードキュメント" もしくは "BREW ユーティリティガイド" をご参照ください。
MIF ファイルの設定
MIF ファイルには「位置情報取得」の特権レベルを設定します。
関連情報:" 第 11 回 TCP / IP ネットワークプログラミング − MIF ファイルの設定 − "
準備
アプレット構造体には、AEEGPSInfo 構造体の変数を追加します。
■ アプレット構造体の宣言
typedef struct GPSApp { AEEApplet a; // アプレット構造体の先頭メンバは必ず AEEApplet 型にすること。 Common common; //描画用 IPosDet* posdet; //アプリ起動時にインスタンス生成を行う AEEGPSInfo gpsinfo; // AEEGPSInfo 構造体の変数 ( GPS から取得したデータを保存) AEECallback callback; } GPSApp;
GPS 情報の取得
セレクトキーが押されたときに、次の関数が実行されるようにします。
// 位置情報の取得 static void GetGPS(GPSApp* app) { int ret; char buffer[80]; IPosDet* posdet; // コールバック関数の設定 CALLBACK_Init(&app->callback, (PFNNOTIFY)OnGPSNotify, (void*)app); // 位置情報の取得 ret = IPOSDET_GetGPSInfo(app->posdet, AEEGPS_GETINFO_LOCATION, AEEGPS_ACCURACY_LEVEL6, &app->gpsinfo, &app->callback); // 上記関数の戻り値をチェック switch (ret) { case EPRIVLEVEL: STRCPY(buffer, "EPRIVLEVEL"); break; case EBADPARM: STRCPY(buffer, "EBADPARM"); break; case EUNSUPPORTED: STRCPY(buffer, "EUNSUPPORTED"); break; case EFAILED: STRCPY(buffer, "EFAILED"); break; case SUCCESS: STRCPY(buffer, "SUCCESS"); break; default: STRCPY(buffer, "DEFAULT"); break; } // 失敗していたらコールバックをキャンセル if (ret != SUCCESS) { CALLBACK_Cancel(&app->callback); } // 位置情報取得関数の戻り値を出力 COMMON_WriteString(&app->common, buffer); COMMON_WriteString(&app->common, "\n"); COMMON_Draw(&app->common); return; }
IPosDet インターフェースを作成し、AEECallback 構造体 pApp->callback を初期化後、IPOSDET_GetGPSInfo 関数を呼び出します。この関数がエラー値を返したときは、コールバックをキャンセルします。
IPOSDET_GetGPSInfo 関数の引数について説明しましょう。
AEEGPS_GETINFO_LOCATION は、位置情報を取得する際のパラメータです。AEEGPS_ACCURACY_LEVEL6 は、GPS 情報を取得するときの精度レベルで、これがもっとも詳細なレベルです。
gpsinfo は 結果を取得するための AEEGPSInfo 構造体です。
AEEGPSInfo 構造体からの位置情報の取得
コールバック関数が呼び出されて、GPS 情報取得が成功していれば、AEEGPSInfo 構造体に位置情報が書き込まれます。
位置情報は WGS84 回転楕円形式になっています。10 進数度数形式に変換するには、WGS84_TO_DEGREES 関数を使います。
// 位置情報を取得後の処理 static void OnGPSNotify(GPSApp* app) { char szLat[32]; char szLon[32]; char szBuf[64]; char latchar[64]; char lonchar[64]; AECHAR latwchar[64]; AECHAR lonwchar[64]; double lat; double lon; lat = WGS84_TO_DEGREES(app->gpsinfo.dwLat); lon = WGS84_TO_DEGREES(app->gpsinfo.dwLon); FLOATTOWSTR(lat, latwchar, 64); FLOATTOWSTR(lon, lonwchar, 64); WSTRTOSTR(latwchar, latchar, 64); WSTRTOSTR(lonwchar, lonchar, 64); // 緯度の取得 SPRINTF(szLat, "Latitude = %d", app->gpsinfo.dwLat); // 経度の取得 SPRINTF(szLon, "Longitude = %d", app->gpsinfo.dwLon); // 緯度の描画 COMMON_WriteString(&app->common, szLat); COMMON_WriteString(&app->common, "\n"); COMMON_WriteString(&app->common, latchar); COMMON_WriteString(&app->common, "\n"); // 経度の描画 COMMON_WriteString(&app->common, szLon); COMMON_WriteString(&app->common, "\n"); COMMON_WriteString(&app->common, lonchar); COMMON_WriteString(&app->common, "\n"); // レスポンスのエラーチェック switch (app->gpsinfo.status) { case AEEGPS_ERR_NO_ERR: STRCPY(szBuf, "SUCCESS !"); break; case AEEGPS_ERR_GENERAL_FAILURE: STRCPY(szBuf, "AEEGPS_ERR_GENERAL_FAILURE"); break; case AEEGPS_ERR_TIMEOUT: STRCPY(szBuf, "AEEGPS_ERR_TIMEOUT"); break; case AEEGPS_ERR_ACCURACY_UNAVAIL: STRCPY(szBuf, "AEEGPS_ERR_ACCURACY_UNAVAIL"); break; case AEEGPS_ERR_INFO_UNAVAIL: STRCPY(szBuf, "AEEGPS_ERR_INFO_UNAVAIL"); break; default: STRCPY(szBuf, "DEFAULT"); break; } // レスポンスのステータスを描画 COMMON_WriteString(&app->common, szBuf); COMMON_WriteString(&app->common, "\n"); COMMON_Draw(&app->common); return; }