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

















