попытки сделать crsf, не взлетела часть с пультом
This commit is contained in:
71
lib/port/win/uart.cpp
Normal file
71
lib/port/win/uart.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
#include "port/poller.h"
|
||||
#include "port/uart.h"
|
||||
#include <Windows.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <span>
|
||||
#include <stdexcept>
|
||||
|
||||
drivers::UartDriver::UartDriver(const std::string& path, int baud) {
|
||||
hCom = CreateFileA(path.c_str(),
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
0, nullptr,
|
||||
OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED,
|
||||
nullptr);
|
||||
if (hCom == INVALID_HANDLE_VALUE)
|
||||
throw std::runtime_error("Cannot open UART port");
|
||||
|
||||
// Настройка DCB
|
||||
DCB dcb{};
|
||||
dcb.DCBlength = sizeof(dcb);
|
||||
if (!GetCommState(hCom, &dcb))
|
||||
throw std::runtime_error("GetCommState failed");
|
||||
|
||||
dcb.BaudRate = baud;
|
||||
dcb.ByteSize = 8;
|
||||
dcb.Parity = EVENPARITY; // 8E2
|
||||
dcb.StopBits = TWOSTOPBITS;
|
||||
|
||||
if (!SetCommState(hCom, &dcb))
|
||||
throw std::runtime_error("SetCommState failed");
|
||||
|
||||
// Настройка событий
|
||||
winHandle = CreateEvent(nullptr, TRUE, FALSE, nullptr);
|
||||
if (!winHandle) throw std::runtime_error("CreateEvent failed");
|
||||
|
||||
if (!SetCommMask(hCom, EV_RXCHAR))
|
||||
throw std::runtime_error("SetCommMask failed");
|
||||
|
||||
// Первый вызов WaitCommEvent в асинхронном режиме
|
||||
memset(&overlapped, 0, sizeof(overlapped));
|
||||
overlapped.hEvent = winHandle;
|
||||
DWORD dummy;
|
||||
WaitCommEvent(hCom, &dummy, &overlapped);
|
||||
}
|
||||
bool drivers::UartDriver::writeData(std::span<const uint8_t> data) {
|
||||
DWORD written;
|
||||
OVERLAPPED ov{};
|
||||
ov.hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
|
||||
|
||||
bool ok = WriteFile(hCom, data.data(), (DWORD)data.size(), &written, &ov) ||
|
||||
GetOverlappedResult(hCom, &ov, &written, TRUE);
|
||||
CloseHandle(ov.hEvent);
|
||||
return ok && written == data.size();
|
||||
}
|
||||
size_t drivers::UartDriver::readChunk(std::vector<uint8_t>& out) {
|
||||
out.resize(512);
|
||||
DWORD read = 0;
|
||||
OVERLAPPED ov{};
|
||||
ov.hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
|
||||
bool ok = ReadFile(hCom, out.data(), (DWORD)out.size(), &read, &ov) ||
|
||||
GetOverlappedResult(hCom, &ov, &read, TRUE);
|
||||
CloseHandle(ov.hEvent);
|
||||
out.resize(read);
|
||||
return read;
|
||||
}
|
||||
drivers::UartDriver::~UartDriver() {
|
||||
if (hCom != INVALID_HANDLE_VALUE) CloseHandle(hCom);
|
||||
if (winHandle) CloseHandle(winHandle);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user