1010#include "common/sys.h"
1111#include "common/device.h"
1212#include "common/pproc.h"
13-
14- #include <errno.h>
15- #include <dirent.h>
13+ #include "common/fs_stream.h"
14+ #include "common/fs_serial.h"
1615
1716#if USE_TERM_IO
1817#include <sys/time.h>
1918#include <termios.h>
2019#include <unistd.h>
21- #endif
22-
23- typedef int FileHand ;
24-
25- #include "common/fs_stream.h"
26- #include "common/fs_serial.h"
20+ #include <sys/select.h>
21+ #include <errno.h>
2722
28- /*
29- */
30- int serial_open (dev_file_t * f ) {
31- #if USE_TERM_IO
32- // /////////////////////////////////////////////////////////////////////////////////////////
33- // Unix
23+ int serial_open (dev_file_t * f ) {
3424 sprintf (f -> name , "/dev/ttyS%d" , f -> port );
3525
3626 f -> handle = open (f -> name , O_RDWR | O_NOCTTY );
37- if (f -> handle < 0 )
38- err_file ((f -> last_error = errno ));
39-
40- tcgetattr (f -> handle , & f -> oldtio ); /* save current port settings */
27+ if (f -> handle < 0 ) {
28+ err_file ((f -> last_error = errno ));
29+ }
30+ // save current port settings
31+ tcgetattr (f -> handle , & f -> oldtio );
4132 bzero (& f -> newtio , sizeof (f -> newtio ));
4233 f -> newtio .c_cflag = f -> devspeed | CRTSCTS | CS8 | CLOCAL | CREAD ;
4334 f -> newtio .c_iflag = IGNPAR ;
4435 f -> newtio .c_oflag = 0 ;
4536
46- /*
47- * set input mode (non-canonical, no echo,...)
48- */
37+ // set input mode (non-canonical, no echo,...)
4938 f -> newtio .c_lflag = 0 ;
50- f -> newtio .c_cc [VTIME ] = 0 ; /* inter-character timer unused */
51- f -> newtio .c_cc [VMIN ] = 1 ; /* blocking read until 1 char received */
39+ f -> newtio .c_cc [VTIME ] = 0 ; // inter-character timer unused
40+ f -> newtio .c_cc [VMIN ] = 1 ; // blocking read until 1 char received
5241 tcflush (f -> handle , TCIFLUSH );
5342 tcsetattr (f -> handle , TCSANOW , & f -> newtio );
5443 return (f -> handle >= 0 );
44+ }
5545
56- #elif defined(_Win32 ) || defined(__CYGWIN__ )
57- // /////////////////////////////////////////////////////////////////////////////////////////
58- // Win32
46+ int serial_close (dev_file_t * f ) {
47+ tcsetattr (f -> handle , TCSANOW , & f -> oldtio );
48+ close (f -> handle );
49+ f -> handle = -1 ;
50+ return 1 ;
51+ }
52+
53+ int serial_write (dev_file_t * f , byte * data , dword size ) {
54+ return stream_write (f , data , size );
55+ }
56+
57+ int serial_read (dev_file_t * f , byte * data , dword size ) {
58+ return stream_read (f , data , size );
59+ }
60+
61+ // Returns the number of the available data on serial port
62+ dword serial_length (dev_file_t * f ) {
63+ fd_set readfs ;
64+ struct timeval tv ;
65+
66+ FD_ZERO (& readfs );
67+ FD_SET (f -> handle , & readfs );
68+
69+ tv .tv_usec = 250 ; // milliseconds
70+ tv .tv_sec = 0 ; // seconds
71+
72+ select (f -> handle + 1 , & readfs , NULL , NULL , & tv );
73+ if (FD_ISSET (f -> handle , & readfs )) {
74+ return 1 ;
75+ }
76+ return 0 ;
77+ }
78+
79+ #elif defined(_Win32 )
80+ typedef int FileHand ;
81+
82+ int serial_open (dev_file_t * f ) {
5983 DCB dcb ;
6084 HANDLE hCom ;
6185 DWORD dwer ;
6286
6387 sprintf (f -> name , "COM%d" , f -> port );
6488
6589 hCom = CreateFile (f -> name , GENERIC_READ | GENERIC_WRITE ,
66- 0 , NULL , OPEN_EXISTING , 0 , NULL );
90+ 0 , NULL , OPEN_EXISTING , 0 , NULL );
6791
6892 if (hCom == INVALID_HANDLE_VALUE ) {
6993 dwer = GetLastError ();
70- if (dwer != 5 )
71- rt_raise ("SERIALFS: CreateFile() failed (%d)" , dwer );
72- else
73- rt_raise ("SERIALFS: ACCESS DENIED" );
94+ if (dwer != 5 ) {
95+ rt_raise ("SERIALFS: CreateFile() failed (%d)" , dwer );
96+ } else {
97+ rt_raise ("SERIALFS: ACCESS DENIED" );
98+ }
7499 return 0 ;
75100 }
76101
@@ -91,96 +116,60 @@ int serial_open(dev_file_t * f) {
91116
92117 f -> handle = (FileHand ) hCom ;
93118 return 1 ;
94- #else
95- // /////////////////////////////////////////////////////////////////////////////////////////
96- // ERROR
97- err_unsup ();
98- return 0 ; // failed
99- #endif
100119}
101120
102- /*
103- */
104- int serial_close (dev_file_t * f ) {
105- #if USE_TERM_IO
106- tcsetattr (f -> handle , TCSANOW , & f -> oldtio );
107- close (f -> handle );
108- f -> handle = -1 ;
109- return 1 ;
110-
111- #elif defined(_Win32 ) || defined(__CYGWIN__ ) || defined(__MINGW32__ )
121+ int serial_close (dev_file_t * f ) {
112122 CloseHandle ((HANDLE ) f -> handle );
113123 f -> handle = -1 ;
114124 return 1 ;
115-
116- #else
117- return 0 ;
118- #endif
119125}
120126
121- /*
122- */
123- int serial_write (dev_file_t * f , byte * data , dword size ) {
124- #if defined(_UnixOS )
125- return stream_write (f , data , size );
126- #elif defined(_Win32 )
127+ int serial_write (dev_file_t * f , byte * data , dword size ) {
127128 DWORD bytes ;
128-
129129 f -> last_error = !WriteFile ((HANDLE ) f -> handle , data , size , & bytes , NULL );
130130 return bytes ;
131- #else
132- return 0 ;
133- #endif
134131}
135132
136- /*
137- */
138- int serial_read (dev_file_t * f , byte * data , dword size ) {
139- #if defined(_UnixOS )
140- return stream_read (f , data , size );
141- #elif defined(_Win32 )
133+ int serial_read (dev_file_t * f , byte * data , dword size ) {
142134 DWORD bytes ;
143-
144135 f -> last_error = !ReadFile ((HANDLE ) f -> handle , data , size , & bytes , NULL );
145136 return bytes ;
146- #else
147- return 0 ;
148- #endif
149137}
150138
151- /*
152- * Returns the number of the available data on serial port
153- */
154- dword serial_length (dev_file_t * f ) {
155- #if defined(_UnixOS ) && !defined(SERIAL_UNSUP )
156- fd_set readfs ;
157- struct timeval tv ;
139+ dword serial_length (dev_file_t * f ) {
140+ COMSTAT cs ;
141+ DWORD de = CE_BREAK ;
142+ ClearCommError ((HANDLE ) f -> handle , & de , & cs );
143+ return cs .cbInQue ;
144+ }
158145
159- FD_ZERO (& readfs );
160- FD_SET (f -> handle , & readfs );
146+ #else
161147
162- tv .tv_usec = 250 ; /* milliseconds */
163- tv .tv_sec = 0 ; /* seconds */
148+ int serial_open (dev_file_t * f ) {
149+ err_unsup ();
150+ }
164151
165- select ( f -> handle + 1 , & readfs , NULL , NULL , & tv );
166- if ( FD_ISSET ( f -> handle , & readfs ))
167- return 1 ;
152+ int serial_close ( dev_file_t * f ) {
153+ return 0 ;
154+ }
168155
156+ int serial_write (dev_file_t * f , byte * data , dword size ) {
169157 return 0 ;
170- #elif defined(_Win32 )
171- COMSTAT cs ;
172- DWORD de = CE_BREAK ;
158+ }
173159
174- ClearCommError ((HANDLE ) f -> handle , & de , & cs );
175- return cs .cbInQue ;
176- #else
160+ int serial_read (dev_file_t * f , byte * data , dword size ) {
161+ return 0 ;
162+ }
163+
164+ dword serial_length (dev_file_t * f ) {
177165 return 0 ;
178- #endif
179166}
180167
168+ #endif
169+
181170/*
182- * Returns true (EOF) if the connection is broken
171+ * Returns true (EOF) if the connection is broken
183172 */
184- dword serial_eof (dev_file_t * f ) {
173+ dword serial_eof (dev_file_t * f ) {
185174 return f -> last_error ;
186175}
0 commit comments