首页 > 解决方案 > 将窗口或图像发送到 USB 显示设备 C++

问题描述

我正在尝试向 USB LCD 屏幕发送一个打开的窗口,由于我对 C++ 的了解,该屏幕的文档很少

这是 API 文档:http ://www.lcdinfo.com/usbd480/documentation/api_html/_u_s_b_d480__lib_8h.html ,但是当我创建 .def 以从 DLL 创建 .lib 时,我得到了这个定义,它具有他们的功能未在 API 或 Google 的任何地方记录:

USBD480_lib.def

EXPORTS
 ?USBD480_UpdateFPGA@@YAHPEAUDisplayInfo@@@Z
 ?USBD480_UpdateFW@@YAHPEAUDisplayInfo@@@Z
 USBD480_Close
 USBD480_DrawFromBuffer
 USBD480_DrawFullScreen
 USBD480_DrawFullScreenBGRA32
 USBD480_DrawFullScreenRGBA32
 USBD480_DrawLine
 USBD480_DrawRect
 USBD480_GetDisplayConfiguration
 USBD480_GetNumberOfDisplays
 USBD480_GetSWDRegisters
 USBD480_GetTouchPosition
 USBD480_GetTouchReport
 USBD480_LoadParameterStore
 USBD480_Open
 USBD480_ReadParameterStore
 USBD480_SaveParameterStore
 USBD480_SetAddress
 USBD480_SetBrightness
 USBD480_SetFrameStartAddress
 USBD480_SetLEDs
 USBD480_SetSWDRegisters
 USBD480_SetStartupImage
 USBD480_SetStreamDecoder
 USBD480_SetTouchMode
 USBD480_UpdateLEDs

我猜我的代码会一团糟,而且我可能没有做任何正确的事情,因为我实际上是一名 Web 开发人员,我真的不知道如何处理缓冲区、指针和这些 C++ 特性。在这段代码中,我尝试发送图像,当然没有成功,唯一有效的是它确实调整了屏幕的亮度,所以它连接正确,因此,我在发送图像时做错了。

USBD480_lib.h(由我创建)

#pragma once

#include <cstdint>

#define     USBD480_API                     _declspec(dllimport);
#define     USBD480_OK                      1;
#define     USBD480_ERROR                   0;
#define     USBD480_OPEN_WITH_USERNAME      0x01;

typedef struct {
    char Name;
    char SerialNumber;
    uint32_t Width;
    uint32_t Height;
    uint32_t PixelFormat;
    uint32_t Handle;
    uint32_t Version;
}DisplayInfo;

typedef struct {
    uint16_t y;
    uint16_t x;
    uint16_t z1;
    uint16_t z2;
    uint8_t pen;
    uint8_t pressure;
    uint8_t reserved;
}TouchReport;


enum PIXEL_FORMAT {
    PF_1BPP = 0, PF_1BPP_DS, PF_2BPP, PF_4BPP,
    PF_8BPP, PF_16BPP_RGB565, PF_16BPP_BGR565, PF_32BPP
};

extern "C" int USBD480_GetNumberOfDisplays(void);
extern "C" int USBD480_GetDisplayConfiguration(uint32_t index, DisplayInfo * di);
extern "C" int USBD480_Open(DisplayInfo * di, uint32_t flags);
extern "C" int USBD480_Close(DisplayInfo * di);
extern "C" int USBD480_DrawFullScreen(DisplayInfo * di, uint8_t * fb);
extern "C" int USBD480_DrawFullScreenRGBA32(DisplayInfo * di, uint32_t * fb);
extern "C" int USBD480_DrawFullScreenBGRA32(DisplayInfo * di, uint32_t * fb);
extern "C" int USBD480_SetBrightness(DisplayInfo * di, uint32_t brightness);
extern "C" int USBD480_SetTouchMode(DisplayInfo * di, uint32_t mode);
extern "C" int USBD480_SetAddress(DisplayInfo * di, uint32_t address);
extern "C" int USBD480_SetFrameStartAddress(DisplayInfo * di, uint32_t address);
extern "C" int USBD480_DrawFromBuffer(DisplayInfo * di, uint8_t * fb, uint32_t size);
extern "C" int USBD480_GetTouchReport(DisplayInfo * di, TouchReport * touch);
extern "C" int USBD480_GetTouchPosition(DisplayInfo * di, uint32_t * x, uint32_t * y);
extern "C" int USBD480_SetStartupImage(DisplayInfo * di, uint8_t * buffer, uint32_t size);
int USBD480_UpdateFPGA(DisplayInfo * di);
int USBD480_UpdateFW(DisplayInfo * di);

主程序.cpp

#pragma comment(lib, "USBD480_lib\\USBD480_lib.lib")


#include <iostream>
#include <fstream>
#include <vector>
#include "USBD480_lib.h"

DisplayInfo MyDisplay;

int main()
{
    int width = 480;    // Width device resolution
    int height = 272;   // Height device resolution
    
    std::ifstream myFile;
    std::streamsize size;
    
    myFile.open("D:\\windows-apps\\iracing-controller\\dev\\src\\assets\\general\\logo-100x100.png", std::ifstream::binary | std::ifstream::in);
    if (!myFile.is_open()) {
        std::cout << "No pudo abrisse la imagen";
        return 0;
    }
    const uint32_t BLOCK_SIZE = 16 * 1024;
    char buffer[BLOCK_SIZE];
    memset(buffer, 0, BLOCK_SIZE);
    myFile.read(buffer, BLOCK_SIZE);
    
    int displays = USBD480_GetNumberOfDisplays();
    if (displays < 1)
    {
        printf("No displays found\n\r");
        return 0;
    }
    
    // Obtenemos la configuración del display
    int ret = USBD480_GetDisplayConfiguration(0, &MyDisplay);
    
    // Abrimos el display
    ret = USBD480_Open(&MyDisplay, 0);
    if (ret != 1) {
        printf("Unable to open Display\n\r");
    }
    
    USBD480_SetAddress(&MyDisplay, 0);
    USBD480_SetFrameStartAddress(&MyDisplay, 0);
    USBD480_SetBrightness(&MyDisplay, 255);
    USBD480_DrawFullScreen(&MyDisplay, (uint8_t*)atoi(buffer));
    USBD480_UpdateFW(&MyDisplay);
    return 0;
}

我正在尝试发送图像,因为我想不出如何使用 API 为我提供的发送窗口的功能(我见过一个发送浏览器窗口的应用程序),所以我有另一个解决方案想出如果我不能发送窗口是捕获它并发送捕获的图像(窗口捕获将使用 C# 完成)每 50 毫秒。无论如何,我迷路了,我不知道如何通过 API 将数据发送到屏幕。

我想您应该使用其中一些功能:

USBD480_DrawFullScreen (DisplayInfo * di, uint8_t * fb)
USBD480_DrawFullScreenRGBA32 (DisplayInfo * di, uint32_t * fb)
USBD480_DrawFullScreenBGRA32 (DisplayInfo * di, uint32_t * fb)
USBD480_DrawFromBuffer (DisplayInfo * di, uint8_t * fb, uint32_t size)

我已经尝试了所有这些都没有,我什至尝试使用此功能设置启动映像

USBD480_SetStartupImage (DisplayInfo * di, uint8_t * buffer, uint32_t size)

另一个对我有用而不是上面描述的有趣选项是能够将此 USB 屏幕转换为第二台显示器,但我想作为 LCD 我不知道,我不知道,我一无所知这些东西。

标签: c++

解决方案


推荐阅读