More detailed vdisplay driver state

This commit is contained in:
Yukino Song
2024-08-20 13:01:49 +08:00
parent bb88a3c314
commit 79c4b15b1a
6 changed files with 82 additions and 34 deletions

View File

@@ -102,7 +102,32 @@ bool setPrimaryDisplay(const wchar_t* primaryDeviceName) {
return true;
}
bool startPingThread() {
void closeVDisplayDevice() {
if (SUDOVDA_DRIVER_HANDLE == INVALID_HANDLE_VALUE) {
return;
}
CloseHandle(SUDOVDA_DRIVER_HANDLE);
SUDOVDA_DRIVER_HANDLE = INVALID_HANDLE_VALUE;
}
DRIVER_STATUS openVDisplayDevice() {
SUDOVDA_DRIVER_HANDLE = OpenDevice(&SUVDA_INTERFACE_GUID);
if (SUDOVDA_DRIVER_HANDLE == INVALID_HANDLE_VALUE) {
return DRIVER_STATUS::FAILED;
}
if (!CheckProtocolCompatible(SUDOVDA_DRIVER_HANDLE)) {
printf("[SUDOVDA] SUDOVDA protocol not compatible with driver!\n");
closeVDisplayDevice();
return DRIVER_STATUS::VERSION_INCOMPATIBLE;
}
return DRIVER_STATUS::OK;
}
bool startPingThread(std::function<void()> failCb) {
if (SUDOVDA_DRIVER_HANDLE == INVALID_HANDLE_VALUE) {
return false;
}
@@ -117,10 +142,17 @@ bool startPingThread() {
if (watchdogOut.Timeout) {
auto sleepInterval = watchdogOut.Timeout * 1000 / 2;
std::thread ping_thread([sleepInterval]{
std::thread ping_thread([sleepInterval, failCb = std::move(failCb)]{
uint8_t fail_count = 0;
for (;;) {
if (!sleepInterval) return;
if (!PingDriver(SUDOVDA_DRIVER_HANDLE)) return;
if (!PingDriver(SUDOVDA_DRIVER_HANDLE)) {
fail_count += 1;
if (fail_count > 3) {
failCb();
return;
}
};
Sleep(sleepInterval);
}
});
@@ -131,22 +163,6 @@ bool startPingThread() {
return true;
}
bool openVDisplayDevice() {
SUDOVDA_DRIVER_HANDLE = OpenDevice(&SUVDA_INTERFACE_GUID);
if (SUDOVDA_DRIVER_HANDLE == INVALID_HANDLE_VALUE) {
return false;
}
if (!CheckProtocolCompatible(SUDOVDA_DRIVER_HANDLE)) {
printf("[SUDOVDA] SUDOVDA protocol not compatible with driver!\n");
CloseHandle(SUDOVDA_DRIVER_HANDLE);
SUDOVDA_DRIVER_HANDLE = INVALID_HANDLE_VALUE;
return false;
}
return startPingThread();
}
std::wstring createVirtualDisplay(
const char* s_client_uid,
const char* s_client_name,

View File

@@ -1,5 +1,7 @@
#pragma once
#include <functional>
#ifndef FILE_DEVICE_UNKNOWN
#define FILE_DEVICE_UNKNOWN 0x00000022
#endif
@@ -9,6 +11,14 @@
#include <sudovda/sudovda.h>
namespace VDISPLAY {
enum class DRIVER_STATUS {
UNKNOWN = 1,
OK = 0,
FAILED = -1,
VERSION_INCOMPATIBLE = -2,
WATCHDOG_FAILED = -3
};
extern HANDLE SUDOVDA_DRIVER_HANDLE;
LONG getDeviceSettings(const wchar_t* deviceName, DEVMODEW& devMode);
@@ -16,8 +26,9 @@ namespace VDISPLAY {
std::wstring getPrimaryDisplay();
bool setPrimaryDisplay(const wchar_t* primaryDeviceName);
bool startPingThread();
bool openVDisplayDevice();
void closeVDisplayDevice();
DRIVER_STATUS openVDisplayDevice();
bool startPingThread(std::function<void()> failCb);
std::wstring createVirtualDisplay(
const char* s_client_uid,
const char* s_client_name,