ホーム > デベロッパ > BREW プログラミング入門 > BREW で GPS > - 1 / 2 -

BREW で GPS - 1 / 2 -

IPosDet

IPosDet は GPS を利用するための BREW インターフェースです。IPosDet を使うと、GPS から現在位置の緯度、経度、海抜高度、誤差などが取得できます。

アプリの概要

Push Select Key to get GPS information
最初に、"Push Select Key to get GPS information " を表示します。
現在の緯度と経度
セレクトキーが押されると、"SUCCESS" を表示し、暫くしてから現在の緯度と経度を表示します。

GPS エミュレーション

GPS を使う BREW アプリをエミュレータで起動すると、インターフェース作成には成功しますが、結果取得の際にエラーが発生します。エミュレータには GPS 機能がないからです。

この問題は BREW エミュレータの "GPS エミュレーション機能" によって解決できます。

BREW エミュレータ起動後、ドロップダウンメニューの [ツール] - [GPS エミュレーション...] を選択すると、GPS 情報を取得する 2 つの方法を選択するダイアログが表示されます。

ここでは、ファイル入力の例を説明します。

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 ファイルには「位置情報取得」の特権レベルを設定します。

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