メイン・コンテンツまでスキップ

デバッグ

TouchGFXアプリケーションは、TouchGFX DesignerやTouchGFX Generatorによって生成され、開発者によって記述されるC++ファイルのセットなので、他のC++アプリケーションと同じようにデバッグすることができます。

ターゲットのデバッグ

IAR Workbench、Keil μVision、またはSTM32CubeIDEなどのIDEを使用している場合、ターゲット上でのデバッグは、そのIDEの利用可能なメカニズムを使用して簡単に実行できます。 TouchGFX Generatorによって生成された、あるいはTouchGFX Board Setupから直接生成されたTouchGFXプロジェクトは、選択したツール・チェーンを使用してすぐにデバッグを実行できます。

評価ボードの立ち上げコードとTouchGFX ALは、ターゲット・ボード上でのみ実行されるので、そこでデバッグする必要があります。 アプリケーションのUI部分は、ターゲット上で、またはシミュレータを使用してデバッグできます。 ターゲット上では、通常はアニメーション速度、更新頻度、応答性などのパフォーマンス問題のような内容をデバッグします。 他のUI固有の問題もターゲット上でデバッグできますが、多くの場合、シミュレータを使用したデバッグの方が高速です。

シミュレータのデバッグ

アニメーションの動き、遷移、要素の更新、プログラム・ロジックといったUI関連の問題のデバッグは、ほとんどの場合、毎回ボードの書き込みではなく、シミュレータを使用してテストおよびデバッグした方が効率的です。

TouchGFXアプリケーションはVisual Studioをサポートしており、このためのプロジェクト・ファイルを維持しています。 Visual Studioを使用して、シミュレータをデバッグ・モードで実行し、IDEのすべてのデバッグ機能を利用することができます。

シミュレータを使用してデバッグする場合、Visual Studioに制限されるわけではありません。 アプリケーションはGCCでコンパイルできるので、別のIDEを使用しているのなら、そのIDEを、GCCでコンパイルされたプロジェクトをデバッグするために設定する可能性が最も高いでしょう。 ただしこのためには、ユーザ自身でIDEを設定する必要があります。

Visual Studioでのデバッグ

DebugPrinterの使用

DebugPrinterクラスは画面上にデバッグ・メッセージを簡単に出力する方法で、TextAreaやその他のウィジェットをスクリーンに追加する必要がありません。 たとえば、バックエンドからのイベント、あるいはFPSやレンダリング時間などの測定値を表示するために使用できます。

DebugPrinterを使用するには、インスタンスを割当てて、Applicationクラスに渡す必要があります。 これは、FrontendApplicationのコンストラクタなどで実行できます。

デバッグ・プリンタは、フレームバッファのフォーマットと互換性を持つ必要があります。 次の表に、使用可能なクラス名を示します。 次の例では、gui/src/common/FrontendApplication.cppに(LCD16bppと互換性がある)16 bppのデバッグ・プリンタを追加しています。

#include <gui/common/FrontendApplication.hpp>
#include <touchgfx/lcd/LCD16DebugPrinter.hpp>

LCD16DebugPrinter lcd16DebugPrinter; // Global object

FrontendApplication::FrontendApplication(Model& m, FrontendHeap& heap)
: FrontendApplicationBase(m, heap)
{
lcd16DebugPrinter.setPosition(0, 0, 240, 40);
lcd16DebugPrinter.setScale(2);
lcd16DebugPrinter.setColor(0x00); //black
Application::setDebugPrinter(&lcd16DebugPrinter);
}

ここでは、左上の240 x 40ピクセルにDebugPrinterを書き込むように設定しました。 このアプリケーションでは、以下を使用して文字列を出力できるようになりました。

#include <stdio.h>

char debugStringBuffer[30];
void updateDebugString()
{
static int count = 0;
count++;
snprintf(debugStringBuffer, sizeof(debugStringBuffer), "tick: %d", count);
Application::getDebugPrinter()->setString(debugStringBuffer);
Application::invalidateDebugRegion();
}

DebugPrinter::setStringメソッドを、アプリケーションで何度も呼び出す必要はありません。 ただし、バッファの内容を変更した場合には、invalidateDebugRegionを呼び出してください。 これにより、DebugPrinterが新しい内容を描画します。 DebugPrinterがカバーする領域内の通常のウィジェットが再描画された場合にも、DebugPrinterは再描画を行います。

Note
ASCII 32(スペース)からASCII 126(~)までの文字を使用できます。

DebugPrinterの使用

DebugPrinterクラス

DebugPrinterインスタンスは、使用するLCDクラスと互換性を持つ必要があります。 次のテーブルには、DebugPrinterクラス名がリストされています。

LCDクラスDebugPrinterクラス
LCD1bppLCD1DebugPrinter
LCD2bppLCD2DebugPrinter
LCD4bppLCD4DebugPrinter
LCD8bpp_ARGB2222LCD8ARGB2222DebugPrinter
LCD8bpp_ABGR2222LCD8ABGR2222DebugPrinter
LCD8bpp_RGBA2222LCD8RGBA2222DebugPrinter
LCD8bpp_BGRA2222LCD8BGRA2222DebugPrinter
LCD16bppLCD16DebugPrinter
LCD16bppSerialFlashLCD16DebugPrinter
LCD24bppLCD24DebugPrinter
LCD32bppLCD32DebugPrinter

使用するLCDクラスと一致するDebugPrinterクラスを使用してください。

シミュレータ・プロジェクトでは、generated/simulator/src/mainBase.cpp内にLCDインスタンスが作成されます。 ターゲット・プロジェクトでは、このインスタンスはTouchGFX/target/generated/TouchGFXConfiguration.cpp内に作成されます。

TouchGFX/target/generated/TouchGFXConfiguration.cpp
...
static LCD16bpp display;
...

これらのファイルをチェックすることで、LCDクラス名を確認できます。