TrickPalace
  1. http://www.trickpalace.net/
  2. windows/
  3. logicool/
  4. lcdsdk/
  5. tutorial.htm

logitech/logicool LCDSDK

チュートリアル

STEP1

 まずは LCD を利用する際の一連の流れを理解する為に次のコードに目を通してください。
Wraith the Trickster このコードのオリジナルは logitech/logicool LCDSDK の SDK/Samples/Simple/simple.cpp です。 実際のコードの挙動を確認するにはオリジナルのソースファイルをご利用ください。
    // LCDライブラリの初期化
    DWORD res = lgLcdInit();
    
    //
    // LCD Monitor への接続
    //
    
    // lgLcdConnectContext構造体の初期化
    lgLcdConnectContext connectContext;
    ZeroMemory(&connectContext, sizeof(connectContext)); // 構造体のサイズを設定
    connectContext.appFriendlyName = _T("simple sample"); // アプリケーション名の設定
    connectContext.isAutostartable = FALSE; //  自動起動の設定
    connectContext.isPersistent = FALSE; // パーシステントの設定
    connectContext.connection = LGLCD_INVALID_CONNECTION; // 現在の接続ステータスを"無効な接続"に設定
    // LCD Monitor のへの接続を実行
    res = lgLcdConnect(&connectContext);

    //
    // LCD Device の列挙
    //
    
    lgLcdDeviceDesc deviceDescription;
    while(ERROR_SUCCESS == (res = lgLcdEnumerate(connectContext.connection, 0, &deviceDescription)))
    {
        // ここでの目的は, LCD デバイスを一つ取得することです。
        _tprintf(_T("%dx%d ピクセル、 %d ビットカラーで %d 個のソフトボタンを持つ LCD デバイスを見つけました。\n"),
            deviceDescription.Width, deviceDescription.Height, deviceDescription.Bpp,
            deviceDescription.NumSoftButtons);
    }

    //
    // LCD Device を開く
    //
    
    // 見つけた LCD を開きます...
    lgLcdOpenContext openContext;
    ZeroMemory(&openContext, sizeof(openContext));
    openContext.connection = connectContext.connection;
    openContext.index = 0;
    // コールバックは利用しない
    openContext.onSoftbuttonsChanged.softbuttonsChangedCallback = NULL;
    openContext.onSoftbuttonsChanged.softbuttonsChangedContext = NULL;
    // lgLcdOpen() の呼び出し後、"device" メンバーは上書きされます。
    openContext.device = LGLCD_INVALID_DEVICE;
    res = lgLcdOpen(&openContext);

    // lgLcdOpen() から戻るとプログラムが終了するまで使用するデバイスハンドルが
    // 手に入ります。( openContext.device 格納されます。 )

    
    //
    // LCD Device にビットマップを表示
    //
    
    // LCD Device への描画はビットマップイメージの転送という形でのみ行われ、直接
    // 文字や図形等を描画する API は提供されていません。
    
    lgLcdBitmap160x43x1 bmp;
    bmp.hdr.Format = LGLCD_BMP_FORMAT_160x43x1;
    memcpy(&bmp.pixels, samplebitmap, sizeof(bmp.pixels));
    res = lgLcdUpdateBitmap(openContext.device, &bmp.hdr, LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_NORMAL));

    _tprintf(_T("ビットマップの更新に成功したら、[Enter]キーを押下して処理を続行させてください。\n"));
    _gettchar();

    //
    // LCD Device の表示をクリア
    //
    
    ZeroMemory(&bmp.pixels, sizeof(bmp.pixels));
    res = lgLcdUpdateBitmap(openContext.device, &bmp.hdr, LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_NORMAL));

    //
    // LCD Device の close
    //
    
    res = lgLcdClose(openContext.device);

    //
    // LCD Monitor の切断
    //
    
    res = lgLcdDisconnect(connectContext.connection);

    // LCDライブラリの終了処理
    res = lgLcdDeInit();
...ここではわかりやすくする為にエラー処理を記述していませんが、各関数の戻り値は Win32API の GetLastError() の戻り値と同じエラーコードを返しますので、res 変数に格納されたのが ERROR_SUCCESS 以外の場合はそれぞれ適切に処理する必要があります。

STEP2

ソフトボタンが押下された際にコールバック関数を呼び出してもらうには...
DWORD WINAPI on_button_callback(IN int device, IN DWORD dwButtons, IN const PVOID pContext)
{
    printf
    (
        "on button : [%c] [%c] [%c] [%c]\r",
        (dwButtons &LGLCDBUTTON_BUTTON0) ? '*': ' ',
        (dwButtons &LGLCDBUTTON_BUTTON1) ? '*': ' ',
        (dwButtons &LGLCDBUTTON_BUTTON2) ? '*': ' ',
        (dwButtons &LGLCDBUTTON_BUTTON3) ? '*': ' '
    );
    return ERROR_SUCCESS;
}
...のようなコードを用意して、LCD デバイス を開くパラメータで...
        openContext.onSoftbuttonsChanged.softbuttonsChangedCallback = on_button_callback; // コールバック関数のアドレス
        openContext.onSoftbuttonsChanged.softbuttonsChangedContext = NULL; // コールバック関数の pContext で受け取るユーザデータのポインタ
...のようにコールバック関数を指定します。