38 namespace rp{
namespace arch{
namespace net{
41 :
rp::hal::serial_rxtx()
42 , _serial_handle(NULL)
49 raw_serial::~raw_serial()
53 CloseHandle(_ro.hEvent);
54 CloseHandle(_wo.hEvent);
55 CloseHandle(_wait_o.hEvent);
58 bool raw_serial::open()
60 return open(_portName, _baudrate, _flags);
63 bool raw_serial::bind(
const char * portname,
_u32 baudrate,
_u32 flags)
65 strncpy(_portName, portname,
sizeof(_portName));
71 bool raw_serial::open(
const char * portname,
_u32 baudrate,
_u32 flags)
73 if (isOpened()) close();
75 _serial_handle = CreateFileA(
77 GENERIC_READ | GENERIC_WRITE,
81 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
85 if (_serial_handle == INVALID_HANDLE_VALUE)
return false;
87 if (!SetupComm(_serial_handle, SERIAL_RX_BUFFER_SIZE, SERIAL_TX_BUFFER_SIZE))
93 _dcb.BaudRate = baudrate;
95 _dcb.Parity = NOPARITY;
96 _dcb.StopBits = ONESTOPBIT;
97 _dcb.fDtrControl = DTR_CONTROL_ENABLE;
99 if (!SetCommState(_serial_handle, &_dcb))
105 if (!SetCommTimeouts(_serial_handle, &_co))
111 if (!SetCommMask(_serial_handle, EV_RXCHAR | EV_ERR ))
117 if (!PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ))
124 _is_serial_opened =
true;
132 void raw_serial::close()
134 SetCommMask(_serial_handle, 0);
135 ResetEvent(_wait_o.hEvent);
137 CloseHandle(_serial_handle);
138 _serial_handle = INVALID_HANDLE_VALUE;
140 _is_serial_opened =
false;
143 int raw_serial::senddata(
const unsigned char *
data,
size_t size)
146 DWORD w_len = 0, o_len = -1;
147 if (!isOpened())
return ANS_DEV_ERR;
149 if (
data == NULL ||
size ==0)
return 0;
151 if(ClearCommError(_serial_handle, &
error, NULL) &&
error > 0)
152 PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_TXCLEAR);
154 if(!WriteFile(_serial_handle,
data,
size, &w_len, &_wo))
155 if(GetLastError() != ERROR_IO_PENDING)
161 int raw_serial::recvdata(
unsigned char *
data,
size_t size)
163 if (!isOpened())
return 0;
167 if(!ReadFile(_serial_handle,
data,
size, &r_len, &_ro))
169 if(GetLastError() == ERROR_IO_PENDING)
171 if(!GetOverlappedResult(_serial_handle, &_ro, &r_len,
FALSE))
173 if(GetLastError() != ERROR_IO_INCOMPLETE)
184 void raw_serial::flush(
_u32 flags)
186 PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
189 int raw_serial::waitforsent(
_u32 timeout,
size_t * returned_size)
191 if (!isOpened() )
return ANS_DEV_ERR;
195 if (WaitForSingleObject(_wo.hEvent, timeout) == WAIT_TIMEOUT)
200 if(!GetOverlappedResult(_serial_handle, &_wo, &w_len,
FALSE))
205 if (returned_size) *returned_size = w_len;
209 int raw_serial::waitforrecv(
_u32 timeout,
size_t * returned_size)
211 if (!isOpened() )
return -1;
215 if (WaitForSingleObject(_ro.hEvent, timeout) == WAIT_TIMEOUT)
219 if(!GetOverlappedResult(_serial_handle, &_ro, &r_len,
FALSE))
223 if (returned_size) *returned_size = r_len;
227 int raw_serial::waitfordata(
size_t data_count,
_u32 timeout,
size_t * returned_size)
234 if (returned_size==NULL) returned_size=(
size_t *)&dummy_length;
238 size_t rxqueue_remaining = rxqueue_count();
239 if (rxqueue_remaining >= data_count) {
240 *returned_size = rxqueue_remaining;
248 SetCommMask(_serial_handle, EV_RXCHAR | EV_ERR );
249 if(!WaitCommEvent(_serial_handle, &msk, &_wait_o))
251 if(GetLastError() == ERROR_IO_PENDING)
253 if (WaitForSingleObject(_wait_o.hEvent, timeout) == WAIT_TIMEOUT)
259 GetOverlappedResult(_serial_handle, &_wait_o, &
length,
TRUE);
261 ::ResetEvent(_wait_o.hEvent);
264 ClearCommError(_serial_handle, &
error, &stat);
265 *returned_size = stat.cbInQue;
272 ClearCommError(_serial_handle, &
error, &stat);
276 ClearCommError(_serial_handle, &
error, &stat);
277 if(stat.cbInQue >= data_count)
279 *returned_size = stat.cbInQue;
288 size_t raw_serial::rxqueue_count()
290 if ( !isOpened() )
return 0;
295 if(ClearCommError(_serial_handle, &
error, &com_stat) &&
error > 0)
297 PurgeComm(_serial_handle, PURGE_RXABORT | PURGE_RXCLEAR);
300 return com_stat.cbInQue;
303 void raw_serial::setDTR()
305 if ( !isOpened() )
return;
307 EscapeCommFunction(_serial_handle, SETDTR);
310 void raw_serial::clearDTR()
312 if ( !isOpened() )
return;
314 EscapeCommFunction(_serial_handle, CLRDTR);
318 void raw_serial::_init()
320 memset(&_dcb, 0,
sizeof(_dcb));
321 _dcb.DCBlength =
sizeof(_dcb);
322 _serial_handle = INVALID_HANDLE_VALUE;
323 memset(&_co, 0,
sizeof(_co));
324 _co.ReadIntervalTimeout = 0;
325 _co.ReadTotalTimeoutMultiplier = 0;
326 _co.ReadTotalTimeoutConstant = 0;
327 _co.WriteTotalTimeoutMultiplier = 0;
328 _co.WriteTotalTimeoutConstant = 0;
330 memset(&_ro, 0,
sizeof(_ro));
331 memset(&_wo, 0,
sizeof(_wo));
332 memset(&_wait_o, 0,
sizeof(_wait_o));
334 _ro.hEvent = CreateEvent(NULL,
TRUE,
FALSE, NULL);
335 _wo.hEvent = CreateEvent(NULL,
TRUE,
FALSE, NULL);
336 _wait_o.hEvent = CreateEvent(NULL,
TRUE,
FALSE, NULL);
345 namespace rp{
namespace hal{
static serial_rxtx * CreateRxTx()
static void ReleaseRxTx(serial_rxtx *)
GLsizei GLsizei GLenum GLenum const GLvoid * data
GLuint GLsizei GLsizei * length
typedef _word_size_t(THREAD_PROC *thread_proc_t)(void *)