46 :
rp::hal::serial_rxtx(), _serial_handle(nullptr), _baudrate(0), _flags(0)
55 CloseHandle(
_ro.hEvent);
56 CloseHandle(
_wo.hEvent);
74 portname, GENERIC_READ | GENERIC_WRITE, 0,
nullptr, OPEN_EXISTING,
75 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
86 _dcb.BaudRate = baudrate;
88 _dcb.Parity = NOPARITY;
89 _dcb.StopBits = ONESTOPBIT;
90 _dcb.fDtrControl = DTR_CONTROL_ENABLE;
112 PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))
141 DWORD w_len = 0, o_len = -1;
144 if (
data ==
nullptr ||
size == 0)
return 0;
150 if (GetLastError() != ERROR_IO_PENDING) w_len =
ANS_DEV_ERR;
162 if (GetLastError() == ERROR_IO_PENDING)
166 if (GetLastError() != ERROR_IO_INCOMPLETE) r_len = 0;
180 PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
187 _word_size_t ans = 0;
189 if (WaitForSingleObject(
_wo.hEvent, timeout) == WAIT_TIMEOUT)
199 if (returned_size) *returned_size = w_len;
207 _word_size_t ans = 0;
209 if (WaitForSingleObject(
_ro.hEvent, timeout) == WAIT_TIMEOUT)
217 if (returned_size) *returned_size = r_len;
222 size_t data_count,
_u32 timeout,
size_t* returned_size)
229 if (returned_size ==
nullptr) returned_size = (
size_t*)&dummy_length;
234 if (rxqueue_remaining >= data_count)
236 *returned_size = rxqueue_remaining;
247 if (GetLastError() == ERROR_IO_PENDING)
249 if (WaitForSingleObject(
_wait_o.hEvent, timeout) ==
263 *returned_size = stat.cbInQue;
277 if (stat.cbInQue >= data_count)
279 *returned_size = stat.cbInQue;
300 return com_stat.cbInQue;
322 memset(&
_co, 0,
sizeof(
_co));
323 _co.ReadIntervalTimeout = 0;
324 _co.ReadTotalTimeoutMultiplier = 0;
325 _co.ReadTotalTimeoutConstant = 0;
326 _co.WriteTotalTimeoutMultiplier = 0;
327 _co.WriteTotalTimeoutConstant = 0;
329 memset(&
_ro, 0,
sizeof(
_ro));
330 memset(&
_wo, 0,
sizeof(
_wo));
333 _ro.hEvent = CreateEvent(
nullptr,
TRUE,
FALSE,
nullptr);
334 _wo.hEvent = CreateEvent(
nullptr,
TRUE,
FALSE,
nullptr);
size_t rxqueue_count() override
bool bind(const char *portname, uint32_t baudrate, uint32_t flags=0) override
static serial_rxtx * CreateRxTx()
static void ReleaseRxTx(serial_rxtx *)
volatile bool _is_serial_opened
int waitforsent(_u32 timeout=-1, size_t *returned_size=nullptr) override
int waitfordata(size_t data_count, _u32 timeout=-1, size_t *returned_size=nullptr) override
int senddata(const unsigned char *data, size_t size) override
void flush(_u32 flags) override
GLuint GLsizei GLsizei * length
int waitforrecv(_u32 timeout=-1, size_t *returned_size=nullptr) override
volatile HANDLE _serial_handle
GLsizei GLsizei GLenum GLenum const GLvoid * data
int recvdata(unsigned char *data, size_t size) override