シミュレータ
TouchGFX UIの作成では、UIの仕様に合致させるために、多くのグラフィック詳細部の微調整が必要になることがよくあります。
開発プロセスをスピードアップするためには、アプリケーションのテストとデバッグのターンアラウンド・タイムを短縮することが重要です。 ボードのプログラムの書き換えには長い時間がかかることが多いので、アプリケーションへのわずかな変更のたびにこれを行うと、開発速度が確実に低下します。 これを緩和するために、TouchGFX PCシミュレータはお使いの開発ツールへの優れた追加機能です。
ユーザは使用するPC向けに単純にアプリケーションをコンパイルし、そこでアプリケーションを実行します。 ボードではなくPC用に作成された評価ボードの立ち上げコードおよび抽象化レイヤを除いて、実行されるコードはターゲット・ハードウェア上とまったく同じです。 つまり、ウィジェットの配置、インタラクション、アニメーション、ステート・マシンなどを、ターゲット・ハードウェア上とまったく同じくらい正確にテストできるのです。 必要な場合は、Visual StudioなどのIDEを使用してコードをデバッグすることもできます。 当然ながら、パフォーマンス解析や実際のバックエンド・システムとのインタラクションなどは、ユーザのボード上で実行する必要があります。
シミュレータの例
実行方法
TouchGFX Designerの使用
TouchGFX Designerからシミュレータを起動するには、単純に右上隅の"Run Simulator"ボタンを押すか、キーボード上の F5
キーを押します。
TouchGFX環境の使用
TouchGFX環境を使用してシミュレータを起動するには、次の手順を実行します。
- TouchGFX環境を開く。
- TouchGFXアプリケーションの場所に移動。
- シミュレータのみのプロジェクトの例:
C:/TouchGFXProjects/MyApplication_1
- ターゲット・プロジェクトの例:
C:/TouchGFXProjects/MyApplication_1/TouchGFX/
- シミュレータのみのプロジェクトの例:
make -f simulator/gcc/Makefile -j6
コマンドを実行して、シミュレータをコンパイル。./build/bin/simulator.exe
コマンドを実行して、シミュレータを起動。
手順の3と4は、TouchGFXアプリケーションを変更したら必ず実行します。
シミュレータの機能
マウス入力のキャプチャの他にも、TouchGFXシミュレータには以下に示すような便利な機能が含まれています。
ショートカット | 機能 |
---|---|
F1 | ポインタ座標とその座標のピクセルのRGBカラーの表示(16進数)を有効化 / 無効化します。 |
F2 | 無効化領域のハイライトを有効化 / 無効化します。 |
F3 | スクリーンショットを撮り、screenshots フォルダにその画像を置きます。 |
Ctrl + F3 | 次の50フレームのスクリーンショットを撮り、screenshots フォルダにその画像を置きます。 |
Shift + F3 | スクリーンショットを撮り、クリップボードにその画像を置きます。 |
F4 | シミュレータ・スキンが使用されている場合、そのシミュレータ・スキンを有効化 / 無効化します。 シミュレータ・スキンが使用されていない場合は、ウィンドウ境界を有効化 / 無効化します。 |
F5 | FrontendApplication::changeToStartScreen()を呼び出すことで、アプリケーションを起動画面に直接戻します。 |
F9 | ティックがアプリケーションに送信されないようにすることで、シミュレータを一時停止します。 F9キーをもう一度押すと、通常の実行が再開されます。 |
F10 | シミュレータの一時停止中(F9キーの押下後)、F10キーを押すことでアプリケーションに1ティックだけ送信し、それによってアプリケーションを"1ステップ"進めることができます。 |
ESC | シミュレータを閉じます。 |
シミュレータのみのユーザ・コード
TouchGFXシミュレータの使用時にのみ実行が必要なコードがある場合は、C++コード内で#ifdef SIMULATOR
を次のように使用します。
#ifdef SIMULATOR
// Your simulator specific user code here
#endif
シミュレータからの出力
シミュレータの実行時にデバッグ・テキストをコンソールに出力する場合は、touchgfx_printf
関数を使用します。
#include <touchgfx/Utils.hpp>
int i = 0;
touchgfx_printf("Application is running through simulator! \n");
touchgfx_printf("Print our value for integer i = %i \n", i);
関数の宣言を取得するために、Utils.hppファイルを忘れずにインクルードしてください。
実際のアプリケーション(Cortex-Mの場合)では、touchgfx_printf
は空のマクロとして定義されます。 したがって、コードは生成されず、必要に応じてターゲット・コードで使用できます。 ここでは、#ifdef
シミュレータを使用する必要はありません。
フレームバッファのロックとロック解除
フレームバッファを直接操作するコードを作成する場合は、フレームバッファ・メモリにピクセルを書き込む前にフレームバッファのロックが必要です。さらに、フレームバッファへの書込み完了後にフレームバッファのロック解除を忘れないでください。
フレームバッファのロック
フレームバッファをロックするには、次のコード・スニペットを使用します。
uint16_t* RESTRICT buf = HAL::getInstance()->lockFrameBuffer();
一般的に、フレームバッファへの戻り値は16ビットのポインタになります。 このポインタを適切なポインタ・タイプにキャストして、フレームバッファにアクセスしやすくします。
フレームバッファのロック解除
使用後にフレームバッファをロック解除するには、次のコードを使用します。
HAL::getInstance()->unlockFrameBuffer();
フレームバッファのロック解除を忘れた場合
フレームバッファのロック解除を忘れると、ハードウェアがフリーズし、フレームバッファが使用可能になるまで永遠に待ち続けます。 この状況を検出できるようにするため、フ、フレームバッファがTouchGFXフレームワークによってロックされている間にロックされるように要求された場合、警告の通知が表示されます。 Microsoft Visual Studioから表示されるエラーは次のようになります。
コンソール・プログラムの場合、エラーは次のようになります。
ディスプレイと異なるサイズのハードウェア・フレームバッファのシミュレーション
設定によっては、実際のハードウェアのフレームバッファよりもディスプレイ・サイズが小さくなる場合があります。 この場合でもシミュレータによる処理が可能で、これは、simulator/main.cppファイル内でtouchgfx_generic_init()の呼び出しの直後に設定します。
touchgfx_generic_init()に渡される幅と高さがディスプレイとフレームバッファのサイズを決定しますが、ハードウェア・フレームバッファのサイズが異なる場合は、単純に、touchgfx_generic_init()の呼び出しの後にsetFrameBufferSize()を呼び出して、実際のフレームバッファのサイズを指定します。たとえば、以下であれば、SIM_WIDTH=800、SIM_HEIGHT=480です。
touchgfx::HAL& hal = touchgfx::touchgfx_generic_init<touchgfx::HALSDL2>(dma, lcd, tc, SIM_WIDTH, SIM_HEIGHT, 0, 0);
hal.setFrameBufferSize(832, 480); // Hardware framebuffer is wider
異なるフレームレートでのハードウェアのシミュレーション
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
...
setupSimulator(argc, argv, hal);
((touchgfx::HALSDL2*)&hal)->setVsyncInterval(25);
...
}
setVsyncInterval( interval )
は2つのフレーム間の間隔を変更し、1000/YOUR_FRAME_RATE=intervalを実行して適切な値を見つけます。
40fpsの場合は、(1000/40)=25msになります。
デフォルトでは60fpsなので、(1000/60) ~16.66 msになります。