129
129
return write((dev->fd_out != -1 ? dev->fd_out : dev->fd_in), buf, count);
132
#else /* !SKYEYE_UART_PIPE_SUPPORTED */
132
#else /* !SKYEYE_UART_PIPE_POSIX_SUPPORTED */
134
#if (defined(__MINGW32__) || defined(__CYGWIN__))
139
#define PIPE_BUFFER_SIZE 1
141
typedef struct uart_pipe_win32 {
147
unsigned char fBuffer[PIPE_BUFFER_SIZE];
150
CRITICAL_SECTION fLocker;
152
OVERLAPPED fOverlapped;
153
OVERLAPPED fOverlappedOut;
159
int uart_pipe_open(struct uart_device *uart_dev)
161
uart_pipe_win32 *dev = malloc(sizeof(uart_pipe_win32));
164
if(dev == NULL) return -1;
165
bzero(dev, sizeof(uart_pipe_win32));
167
if(strncmp(&uart_dev->desc_in[0], "/dev/ttyS", 9) == 0 &&
168
uart_dev->desc_in[9] >= '0' && uart_dev->desc_in[9] <= '8' &&
169
uart_dev->desc_in[10] == 0) {
170
memcpy(&uart_dev->desc_in[0], "COM\0", 5);
171
uart_dev->desc_in[3] = uart_dev->desc_in[9] + 1;
174
if(strncmp(&uart_dev->desc_out[0], "/dev/ttyS", 9) == 0 &&
175
uart_dev->desc_out[9] >= '0' && uart_dev->desc_out[9] <= '8' &&
176
uart_dev->desc_out[10] == 0) {
177
memcpy(&uart_dev->desc_out[0], "COM\0", 5);
178
uart_dev->desc_out[3] = uart_dev->desc_out[9] + 1;
181
if(uart_dev->desc_in[0] == '\0')
185
else if(uart_dev->desc_out[0] == '\0' || strcmp(uart_dev->desc_in, uart_dev->desc_out) == 0)
187
if((dev->fHandle = CreateFile(uart_dev->desc_in,
188
GENERIC_READ | GENERIC_WRITE,
189
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
191
FILE_FLAG_OVERLAPPED,
192
NULL)) == INVALID_HANDLE_VALUE)
195
fprintf(stderr, "Error when open device \"%s\" !!!\n", uart_dev->desc_in);
200
if((dev->fHandle = CreateFile(uart_dev->desc_in,
202
FILE_SHARE_READ, NULL,
204
FILE_FLAG_OVERLAPPED,
205
NULL)) == INVALID_HANDLE_VALUE)
208
fprintf(stderr, "Error when open device \"%s\" for input !!!\n", uart_dev->desc_in);
210
else if((dev->fHandleOut = CreateFile(uart_dev->desc_out,
212
FILE_SHARE_WRITE, NULL,
214
FILE_FLAG_OVERLAPPED,
215
NULL)) == INVALID_HANDLE_VALUE)
217
CloseHandle(dev->fHandle);
219
fprintf(stderr, "Error when open device \"%s\" for output !!!\n", uart_dev->desc_out);
229
InitializeCriticalSection(&dev->fLocker);
230
dev->fEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
231
dev->fEventOut = CreateEvent(NULL, FALSE, FALSE, NULL);
233
uart_dev->priv = (void*)dev;
239
int uart_pipe_close(struct uart_device *uart_dev)
241
uart_pipe_win32 *dev = (uart_dev ? (uart_pipe_win32*)(uart_dev->priv) : NULL);
242
if(dev == NULL) return -1;
244
CloseHandle(dev->fHandle);
245
if(dev->fHandleOut) CloseHandle(dev->fHandleOut);
246
CloseHandle(dev->fEvent);
247
CloseHandle(dev->fEventOut);
248
DeleteCriticalSection(&dev->fLocker);
250
uart_dev->priv = NULL;
256
static void CALLBACK uart_pipe_read_callback(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
258
uart_pipe_win32 *dev = (uart_pipe_win32*)lpOverlapped->hEvent;
259
if(dev == NULL) return;
261
EnterCriticalSection(&dev->fLocker);
263
dev->fReading = FALSE;
264
dev->fBufferLen = (dwErrorCode == 0 ? dwNumberOfBytesTransfered : 0);
265
SetEvent(dev->fEvent);
267
LeaveCriticalSection(&dev->fLocker);
271
static void CALLBACK uart_pipe_write_callback(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
273
uart_pipe_win32 *dev = (uart_pipe_win32*)lpOverlapped->hEvent;
274
if(dev == NULL) return;
276
dev->fWritten = (dwErrorCode == 0 ? dwNumberOfBytesTransfered : 0);
277
SetEvent(dev->fEventOut);
281
int uart_pipe_read(struct uart_device *uart_dev, void *buf, size_t count, struct timeval *tv)
283
uart_pipe_win32 *dev = (uart_dev ? (uart_pipe_win32*)(uart_dev->priv) : NULL);
284
int retVal = 0, flags = 1;
287
if(dev == NULL) return -1;
290
EnterCriticalSection(&dev->fLocker);
296
else if(dev->fBufferLen == 0)
300
dev->fReading = TRUE;
301
dev->fOverlapped.Internal = 0;
302
dev->fOverlapped.InternalHigh = 0;
303
dev->fOverlapped.Offset = 0;
304
dev->fOverlapped.OffsetHigh = 0;
305
dev->fOverlapped.hEvent = dev;
306
ResetEvent(dev->fEvent);
308
if(ReadFileEx(dev->fHandle, &dev->fBuffer[0], PIPE_BUFFER_SIZE,
309
&dev->fOverlapped, uart_pipe_read_callback) == 0)
311
dev->fReading = FALSE;
317
retVal = min((int)dev->fBufferLen, count);
318
memcpy(buf, &dev->fBuffer[0], (size_t)retVal);
320
if(count < dev->fBufferLen)
321
memmove(&dev->fBuffer[0], &dev->fBuffer[count], dev->fBufferLen - count);
323
dev->fBufferLen -= retVal;
326
LeaveCriticalSection(&dev->fLocker);
328
if(retVal == 0 && flags == 1)
330
DWORD timeout = (tv == NULL ? INFINITE : (DWORD)(tv->tv_sec * 1000UL + tv->tv_usec / 1000UL));
333
status = WaitForSingleObjectEx(dev->fEvent, timeout, TRUE);
334
if(status == WAIT_IO_COMPLETION && tv == NULL) continue;
335
if(status == WAIT_OBJECT_0)
348
int uart_pipe_write(struct uart_device *uart_dev, void *buf, size_t count)
350
uart_pipe_win32 *dev = (uart_dev ? (uart_pipe_win32*)(uart_dev->priv) : NULL);
351
DWORD written = 0, status;
354
if(dev == NULL) return -1;
356
handle = (dev->fHandleOut == NULL ? dev->fHandle : dev->fHandleOut);
358
dev->fOverlappedOut.Internal = 0;
359
dev->fOverlappedOut.InternalHigh = 0;
360
dev->fOverlappedOut.Offset = 0;
361
dev->fOverlappedOut.OffsetHigh = 0;
362
dev->fOverlappedOut.hEvent = dev;
365
if(WriteFileEx(handle, buf, (DWORD)count, &dev->fOverlappedOut, uart_pipe_write_callback) != 0)
369
status = WaitForSingleObjectEx(dev->fEventOut, INFINITE, TRUE);
370
if(status == WAIT_IO_COMPLETION) continue;
371
if(status == WAIT_OBJECT_0) written = dev->fWritten;
379
#else /* other system */
134
381
int uart_pipe_open(struct uart_device *uart_dev)