c++ - 将窗口或图像发送到 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 我不知道,我不知道,我一无所知这些东西。
解决方案
推荐阅读
- dart - Dart 编程语言中的自定义异常
- vuejs3 - 升级到 VueJs3 、 Vuex4 、 VueCli4.5 、 VueRouter4 后运行 vue 项目出现问题
- javascript - 如何在按钮单击时更改图表 js 数据
- swift - 错误 ITMS-90085:“二进制文件中没有架构
- gnome - 如何在 gjs 中使用“lang”?
- python - 如何将 python 多处理队列和进程与非常庞大的生成器一起使用?
- kubernetes - 如何防止重复的协调调用
- r - [[base R]] 添加T/F列是否为每组的最小值
- pyspark - 如何在 Databricks 笔记本中使用 Airflow 变量?
- java - 考虑在配置中定义“com.service.AdminService”类型的 bean