C
デバイスリンク通信の移植
デバイスリンクコンポーネントは、ホストとデバイス間の通信を可能にします。これにより、デバッグやテスト目的で、タッチ、スクリーンショット、パフォーマンス、ログデータを交換することができます。
カスタムデバイスリンク
Platform::DeviceLinkInterface は、プロトコル機能とハードウェア間のインターフェースを提供します。以下の関数を実装する必要があります:
- DeviceLinkInterface::platformInit データを受信するハードウェア(シリアル・ポートなど)を初期化します。
- DeviceLinkInterface::transmitChars シリアル・ポートに送信可能なデータを書き込みます。
- DeviceLinkInterface::framebufferFormat 指定されたレイヤーのフレームバッファに関する情報を取得する。
以下は、上記の関数の実装例です:
struct ExampleDeviceLinkInterface : Qul::Platform::DeviceLinkInterface
{
void platformInit()
{
// Enable and start actual transfer and reception of the serial port,
// eg. enabling interrupts
}
void transmitChars(const uint8_t *data, uint32_t size)
{
QUL_UNUSED(data);
QUL_UNUSED(size);
// Use the serial port to transfer the data to the host
// HAL_UART_Transmit(&uartHandle, (uint8_t *) data, size, 0xFFFF);
}
Qul::Platform::FramebufferFormat framebufferFormat(const Qul::PlatformInterface::LayerEngine::ItemLayer *layer)
QUL_DECL_OVERRIDE
{
// Assuming we use 32bpp framebuffers
static const int BytesPerPixel = 4;
static const int ScreenWidth = QUL_PLATFORM_DEFAULT_SCREEN_WIDTH;
static const int ScreenHeight = QUL_PLATFORM_DEFAULT_SCREEN_HEIGHT;
Qul::Platform::FramebufferFormat format;
format.address = frontBuffer();
format.width = ScreenWidth;
format.height = ScreenHeight;
format.bytesPerLine = ScreenWidth * BytesPerPixel;
format.bitsPerPixel = BytesPerPixel * 4;
format.redChannel.offset = 16;
format.redChannel.length = 8;
format.greenChannel.offset = 8;
format.greenChannel.length = 8;
format.blueChannel.offset = 0;
format.blueChannel.length = 8;
format.swapBytes = 0;
return format;
}
};移植先のプラットフォームにレイヤーエンジンがある場合、framebufferFormat 関数はこれを考慮して別の実装にする必要があります:
Qul::Platform::FramebufferFormat framebufferFormat(const PlatformInterface::LayerEngine::ItemLayer *layer)
{
const ExampleItemLayerBase *base = static_cast<const ExampleItemLayerBase *>(layer);
Qul::Platform::FramebufferFormat format;
format.address = base->drawingDevice.bits();
format.width = base->drawingDevice.width();
format.height = base->drawingDevice.height();
format.bytesPerLine = base->drawingDevice.bytesPerLine();
format.bitsPerPixel = base->drawingDevice.bitsPerPixel();
switch (format.bitsPerPixel) {
case 16:
format.redChannel.offset = 0;
format.redChannel.length = 5;
format.greenChannel.offset = 5;
format.greenChannel.length = 6;
format.blueChannel.offset = 11;
format.blueChannel.length = 5;
format.swapBytes = 2;
break;
case 32:
format.redChannel.offset = 16;
format.redChannel.length = 8;
format.greenChannel.offset = 8;
format.greenChannel.length = 8;
format.blueChannel.offset = 0;
format.blueChannel.length = 8;
format.swapBytes = 0;
break;
default:
QUL_ASSERT(false, QulError_LayerEngine_UnsupportedColorDepth, format.bitsPerPixel);
}
return format;
}Qt Quick Ultralite でカスタムのデバイスリンク実装を使用できるようにするには、デバイスのデバイスリンクインターフェースを返す関数を作成します。
DeviceLinkInterface *getDeviceLinkInterface()
{
static ExampleDeviceLinkInterface deviceLink;
return &deviceLink;
}QUL_PLATFORM_DEVICELINK_ENABLED も参照してください。
ハードウェアのセットアップ
PlatformContext::initializeHardware の実装では、目的のチャネル(通常はシリアル・ポート)のハードウェ アを初期化した後に、デバイス・リンク・ライブラリの初期化を追加します、
if (Qul::Platform::DeviceLink::instance())
Qul::Platform::DeviceLink::instance()->init();これにより、上記で実装したplatformInit 関数も呼び出され、データ受信が開始されます。
シリアル受信関数で、受信データをデコードのためにデバイスリンクコンポーネントに転送します:
void UART_ReceiveInterrupt()
{
Qul::PlatformInterface::deviceLinkBytesReceived(&receivedByte, 1);
}シリアル・ポートに他のデータを書き込まないようにしてください。念のため、printfなどが使用する低レベル書き込み関数を再実装し、その内容をデバイス・リンク・プロトコルを介して転送するようにしてください。
ほとんどのプラットフォームで、再実装が必要な低レベル書き込み関数は以下の通りである:
void putChar(char &character);
int _write(int file, char *ptr, int len);以下の実装例は、それぞれに合わせてください。Qt Quick Ultraliteロギング・システムを通してプリントされるすべてのメッセージは、アクティブになると自動的にデバイスリンク経由で転送されます。
int _write(char *message, int len) {
auto deviceLink = Qul::Platform::DeviceLink::instance();
if (deviceLink)
deviceLink->printMessage(message, len);
else
sendDataDirectlyToSerialPort();
}プラットフォーム・ライブラリがCMakeでビルドされている場合、$<TARGET_PROPERTY:Qul::Platform,QUL_PLATFORM_UART_BAUD_RATE> を使用して設定されたボーレートを取得するか、QUL_PLATFORM_UART_BAUD_RATE コンパイル定義が設定されている platform_config.h をインクルードし、それに応じてUARTシリアルポートを設定します。
QUL_PLATFORM_UART_BAUD_RATE も参照してください。
ロギング実装の更新
先のステップで実装したconsoleWrite 関数を、デバイスリンク転送も使用するように変更します。
void ExamplePlatform::consoleWrite(char character) {
if (deviceLink) {
// You should think about collecting several characters and send them in chunks
// instead of 1 by 1 because this will be slow.
deviceLink->printMessage(&character, 1);
} else {
// Write the charactor to your boards output device
sendDataDirectlyToSerialPort();
}
}プラットフォームを再構築するための要件
デバイス・リンクを有効にしてプラットフォームを再構築するために、protobuf およびgrpcio-tools Python パッケージをインストールします:
pip install protobuf==4.23.4 grpcio-tools==1.60.0 "setuptools<80"特定の Qt ライセンスの下で利用可能です。
詳細はこちら。