rs_232 2.3.2.pre → 3.0.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +2 -2
- data/Rakefile +29 -7
- data/ext/rs_232/Constants.c +50 -0
- data/ext/rs_232/Constants.h +97 -0
- data/ext/rs_232/{initializer.c → Rs232.cpp} +111 -144
- data/ext/rs_232/{initializer.h → Rs232.h} +45 -36
- data/ext/rs_232/Structs.h +63 -0
- data/ext/rs_232/extconf.rb +10 -6
- data/ext/rs_232/posix/{port.c → Port.c} +94 -150
- data/ext/rs_232/posix/{port.h → Port.h} +39 -30
- data/ext/rs_232/windows/{port.c → Port.c} +99 -102
- data/ext/rs_232/windows/{port.h → Port.h} +39 -30
- data/lib/rs_232/version.rb +1 -1
- data/lib/rs_232.rb +94 -2
- data/rs_232.gemspec +12 -3
- metadata +52 -38
- data/ext/rs_232/constants.c +0 -49
- data/ext/rs_232/constants.h +0 -95
- data/ext/rs_232/structs.h +0 -62
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c) 2013,
|
2
|
+
* Copyright (c) 2013, Roman Lishtaba.
|
3
3
|
*
|
4
4
|
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
|
5
5
|
* provided that the above copyright notice and this permission notice appear in all copies.
|
@@ -12,43 +12,52 @@
|
|
12
12
|
*
|
13
13
|
**/
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
|
15
|
+
/*
|
16
|
+
* @author Roman Lishtaba
|
17
|
+
*/
|
19
18
|
|
20
|
-
#
|
19
|
+
#pragma once
|
21
20
|
|
21
|
+
#ifdef __cplusplus
|
22
|
+
extern "C" {
|
23
|
+
#endif
|
24
|
+
|
25
|
+
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
|
26
|
+
|
27
|
+
# include "windows/Port.h"
|
28
|
+
|
22
29
|
#else
|
23
|
-
|
24
|
-
# include "posix/
|
25
|
-
|
30
|
+
|
31
|
+
# include "posix/Port.h"
|
32
|
+
|
26
33
|
#endif
|
27
|
-
|
28
|
-
#include "
|
29
|
-
|
30
|
-
VALUE initializeStruct(VALUE, VALUE);
|
31
|
-
|
32
|
-
void updateSettings(PortDescriptor *port);
|
33
|
-
|
34
|
-
VALUE
|
35
|
-
|
36
|
-
VALUE openIO(VALUE);
|
37
|
-
|
38
|
-
VALUE closeIO(VALUE);
|
39
|
-
|
40
|
-
VALUE bytesAvailableIO(VALUE);
|
41
|
-
|
42
|
-
VALUE flushIO(VALUE);
|
43
|
-
|
44
|
-
VALUE writeIO(VALUE, VALUE);
|
45
|
-
|
46
|
-
VALUE readIO(VALUE, VALUE);
|
47
|
-
|
48
|
-
VALUE lineStatusIO(VALUE);
|
49
|
-
|
50
|
-
VALUE setRtsIO(VALUE, VALUE);
|
51
|
-
|
52
|
-
VALUE setDtrIO(VALUE, VALUE);
|
53
|
-
|
34
|
+
|
35
|
+
#include "Structs.h"
|
36
|
+
|
37
|
+
VALUE initializeStruct(VALUE, VALUE);
|
38
|
+
|
39
|
+
void updateSettings(PortDescriptor *port);
|
40
|
+
|
41
|
+
VALUE isOpenIO(VALUE);
|
42
|
+
|
43
|
+
VALUE openIO(VALUE);
|
44
|
+
|
45
|
+
VALUE closeIO(VALUE);
|
46
|
+
|
47
|
+
VALUE bytesAvailableIO(VALUE);
|
48
|
+
|
49
|
+
VALUE flushIO(VALUE);
|
50
|
+
|
51
|
+
VALUE writeIO(VALUE, VALUE);
|
52
|
+
|
53
|
+
VALUE readIO(VALUE, VALUE);
|
54
|
+
|
55
|
+
VALUE lineStatusIO(VALUE);
|
56
|
+
|
57
|
+
VALUE setRtsIO(VALUE, VALUE);
|
58
|
+
|
59
|
+
VALUE setDtrIO(VALUE, VALUE);
|
60
|
+
|
61
|
+
#ifdef __cplusplus
|
62
|
+
}
|
54
63
|
#endif
|
@@ -0,0 +1,63 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2013, Roman Lishtaba.
|
3
|
+
*
|
4
|
+
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
|
5
|
+
* provided that the above copyright notice and this permission notice appear in all copies.
|
6
|
+
*
|
7
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
8
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
9
|
+
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
|
10
|
+
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
11
|
+
* PERFORMANCE OF THIS SOFTWARE.
|
12
|
+
*
|
13
|
+
**/
|
14
|
+
|
15
|
+
/*
|
16
|
+
* @author Roman Lishtaba
|
17
|
+
*/
|
18
|
+
|
19
|
+
#pragma once
|
20
|
+
|
21
|
+
#ifdef __cplusplus
|
22
|
+
extern "C" {
|
23
|
+
#endif
|
24
|
+
|
25
|
+
#include "Constants.h"
|
26
|
+
|
27
|
+
/*
|
28
|
+
* structure to contain port settings
|
29
|
+
*/
|
30
|
+
typedef struct PortSettings_T
|
31
|
+
{
|
32
|
+
char ComPort[40];
|
33
|
+
enum BaudRateType BaudRate;
|
34
|
+
enum DataBitsType DataBits;
|
35
|
+
enum ParityType Parity;
|
36
|
+
enum StopBitsType StopBits;
|
37
|
+
enum FlowType FlowControl;
|
38
|
+
long Timeout_Millisec;
|
39
|
+
} PortSettings;
|
40
|
+
|
41
|
+
|
42
|
+
/*
|
43
|
+
* port descriptor structure
|
44
|
+
*/
|
45
|
+
typedef struct portDescriptor_T
|
46
|
+
{
|
47
|
+
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
|
48
|
+
HANDLE fd;
|
49
|
+
COMMCONFIG commConfig;
|
50
|
+
COMMTIMEOUTS commTimeouts;
|
51
|
+
#else
|
52
|
+
int fd;
|
53
|
+
struct termios posixConfig;
|
54
|
+
struct termios previousPosixConfig;
|
55
|
+
#endif
|
56
|
+
int status;
|
57
|
+
PortSettings settings;
|
58
|
+
int toBeUpdated;
|
59
|
+
} PortDescriptor;
|
60
|
+
|
61
|
+
#ifdef __cplusplus
|
62
|
+
}
|
63
|
+
#endif
|
data/ext/rs_232/extconf.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
require 'rbconfig'
|
3
3
|
|
4
|
-
|
4
|
+
EXTENSION_NAME = 'rs_232_native'.freeze
|
5
|
+
dir_config(EXTENSION_NAME)
|
6
|
+
|
7
|
+
if ENV['DEBUG']
|
5
8
|
$CFLAGS << ' -DDEBUG'
|
6
|
-
$CFLAGS << ' -g
|
9
|
+
$CFLAGS << ' -g'
|
7
10
|
$stdout.puts "compiling in debug mode... flags: #{$CFLAGS}"
|
8
11
|
end
|
9
12
|
|
10
|
-
|
13
|
+
$CFLAGS << ' -Wall -g'
|
11
14
|
|
12
15
|
$warnflags = '-Wall'
|
13
16
|
|
@@ -30,6 +33,7 @@ OS = case RbConfig::CONFIG['host_os'].downcase
|
|
30
33
|
|
31
34
|
have_header('ruby.h')
|
32
35
|
have_header('stdio.h')
|
36
|
+
have_library( 'stdc++' )
|
33
37
|
|
34
38
|
if OS == 'windows'
|
35
39
|
$VPATH << '$(srcdir)/windows'
|
@@ -49,10 +53,10 @@ elsif %w(linux darwin).include? OS
|
|
49
53
|
have_header('errno.h')
|
50
54
|
have_header('sys/ioctl.h')
|
51
55
|
else
|
52
|
-
fail "RS-233 implementation
|
56
|
+
fail "RS-233 implementation wasn't been tested for #{OS} platform."
|
53
57
|
end
|
54
58
|
|
55
|
-
$objs = %w(
|
59
|
+
$objs = %w(Constants.o Port.o Rs232.o).freeze
|
56
60
|
|
57
61
|
$CFLAGS += " -DOS_#{OS.upcase}"
|
58
62
|
|
@@ -62,4 +66,4 @@ Extending with: #{$CFLAGS}
|
|
62
66
|
|
63
67
|
MSG
|
64
68
|
|
65
|
-
create_makefile(
|
69
|
+
create_makefile(EXTENSION_NAME)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c) 2013,
|
2
|
+
* Copyright (c) 2013, Roman Lishtaba.
|
3
3
|
*
|
4
4
|
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
|
5
5
|
* provided that the above copyright notice and this permission notice appear in all copies.
|
@@ -12,66 +12,57 @@
|
|
12
12
|
*
|
13
13
|
**/
|
14
14
|
|
15
|
-
|
15
|
+
/*
|
16
|
+
* @author Roman Lishtaba
|
17
|
+
*/
|
16
18
|
|
17
|
-
|
18
|
-
{
|
19
|
-
{
|
20
|
-
Check_Type(rb_int, T_FIXNUM);
|
21
|
-
}
|
19
|
+
#include "Port.h"
|
22
20
|
|
23
|
-
int boolean = FIX2INT(rb_int);
|
24
21
|
|
22
|
+
VALUE setDtrIO(VALUE self, VALUE rb_int)
|
23
|
+
{
|
24
|
+
Check_Type(rb_int, T_FIXNUM);
|
25
|
+
const int boolean = FIX2INT(rb_int);
|
26
|
+
int status;
|
25
27
|
PortDescriptor *port = NULL;
|
26
|
-
|
27
28
|
Data_Get_Struct(self, PortDescriptor, port);
|
28
|
-
|
29
|
-
int status;
|
29
|
+
|
30
30
|
ioctl(port->fd, TIOCMGET, &status);
|
31
31
|
if (boolean == 1)
|
32
32
|
status |= TIOCM_DTR;
|
33
33
|
else
|
34
34
|
status &= ~TIOCM_DTR;
|
35
35
|
ioctl(port->fd, TIOCMSET, &status);
|
36
|
-
|
36
|
+
|
37
37
|
return INT2FIX(status);
|
38
|
-
|
39
38
|
}
|
40
39
|
|
41
40
|
|
42
41
|
VALUE setRtsIO(VALUE self, VALUE rb_int)
|
43
42
|
{
|
44
|
-
|
45
|
-
|
46
|
-
}
|
47
|
-
|
48
|
-
int boolean = FIX2INT(rb_int);
|
49
|
-
|
43
|
+
Check_Type(rb_int, T_FIXNUM);
|
44
|
+
const int boolean = FIX2INT(rb_int);
|
50
45
|
PortDescriptor *port = NULL;
|
51
|
-
|
52
46
|
Data_Get_Struct(self, PortDescriptor, port);
|
53
|
-
|
54
47
|
int status;
|
48
|
+
|
55
49
|
ioctl(port->fd, TIOCMGET, &status);
|
56
50
|
if (boolean == 1)
|
57
51
|
status |= TIOCM_RTS;
|
58
52
|
else
|
59
|
-
status &=
|
60
|
-
~TIOCM_RTS;
|
53
|
+
status &= ~TIOCM_RTS;
|
61
54
|
ioctl(port->fd, TIOCMSET, &status);
|
62
|
-
|
55
|
+
|
63
56
|
return INT2FIX(status);
|
64
57
|
}
|
65
58
|
|
66
59
|
|
67
60
|
VALUE lineStatusIO(VALUE self)
|
68
61
|
{
|
69
|
-
|
70
62
|
PortDescriptor *port = NULL;
|
71
|
-
|
72
63
|
Data_Get_Struct(self, PortDescriptor, port);
|
73
|
-
|
74
64
|
unsigned long Status = 0, Temp = 0;
|
65
|
+
|
75
66
|
ioctl(port->fd, TIOCMGET, &Temp);
|
76
67
|
if (Temp & TIOCM_CTS) Status |= LS_CTS;
|
77
68
|
if (Temp & TIOCM_DSR) Status |= LS_DSR;
|
@@ -81,7 +72,7 @@ VALUE lineStatusIO(VALUE self)
|
|
81
72
|
if (Temp & TIOCM_RTS) Status |= LS_RTS;
|
82
73
|
if (Temp & TIOCM_ST ) Status |= LS_ST;
|
83
74
|
if (Temp & TIOCM_SR ) Status |= LS_SR;
|
84
|
-
|
75
|
+
|
85
76
|
return LONG2FIX(Status);
|
86
77
|
}
|
87
78
|
|
@@ -89,7 +80,7 @@ VALUE lineStatusIO(VALUE self)
|
|
89
80
|
static void platformInitIO(PortDescriptor *port)
|
90
81
|
{
|
91
82
|
port->fd = -1;
|
92
|
-
port->status =
|
83
|
+
port->status = PORT_CLOSED;
|
93
84
|
}
|
94
85
|
|
95
86
|
|
@@ -107,19 +98,18 @@ static void setPosixBaudRate(PortDescriptor *port)
|
|
107
98
|
|
108
99
|
void updateSettings(PortDescriptor *port)
|
109
100
|
{
|
110
|
-
|
111
|
-
if (port->status != 0)
|
101
|
+
if (PORT_OPEN != port->status)
|
112
102
|
rb_raise(rb_eException, "Can not set due to comport is not open, status: %d\n", port->status);
|
113
|
-
|
103
|
+
|
114
104
|
/*
|
115
|
-
|
116
|
-
|
105
|
+
* BaudRate clause
|
106
|
+
*/
|
117
107
|
if (port->toBeUpdated & T_BaudRate)
|
118
108
|
setPosixBaudRate(port);
|
119
|
-
|
109
|
+
|
120
110
|
/*
|
121
|
-
|
122
|
-
|
111
|
+
* Parity clause
|
112
|
+
*/
|
123
113
|
if (port->toBeUpdated & T_Parity)
|
124
114
|
{
|
125
115
|
switch (port->settings.Parity)
|
@@ -136,11 +126,10 @@ void updateSettings(PortDescriptor *port)
|
|
136
126
|
break;
|
137
127
|
}
|
138
128
|
}
|
139
|
-
|
129
|
+
|
140
130
|
/*
|
141
|
-
|
142
|
-
|
143
|
-
|
131
|
+
* Data Bits clause
|
132
|
+
*/
|
144
133
|
if (port->toBeUpdated & T_DataBits)
|
145
134
|
{
|
146
135
|
port->posixConfig.c_cflag &= (~CSIZE);
|
@@ -160,11 +149,11 @@ void updateSettings(PortDescriptor *port)
|
|
160
149
|
break;
|
161
150
|
}
|
162
151
|
}
|
163
|
-
|
152
|
+
|
164
153
|
/*
|
165
|
-
|
166
|
-
|
167
|
-
|
154
|
+
* StopBits clause
|
155
|
+
*/
|
156
|
+
|
168
157
|
if (port->toBeUpdated & T_StopBits)
|
169
158
|
{
|
170
159
|
switch (port->settings.StopBits)
|
@@ -177,11 +166,11 @@ void updateSettings(PortDescriptor *port)
|
|
177
166
|
break;
|
178
167
|
}
|
179
168
|
}
|
180
|
-
|
169
|
+
|
181
170
|
/*
|
182
|
-
|
183
|
-
|
184
|
-
|
171
|
+
* FlowControl clause
|
172
|
+
*/
|
173
|
+
|
185
174
|
if (port->toBeUpdated & T_Flow)
|
186
175
|
{
|
187
176
|
switch (port->settings.FlowControl)
|
@@ -201,25 +190,25 @@ void updateSettings(PortDescriptor *port)
|
|
201
190
|
break;
|
202
191
|
}
|
203
192
|
}
|
204
|
-
|
205
|
-
|
193
|
+
|
194
|
+
|
206
195
|
/*
|
207
|
-
|
208
|
-
|
209
|
-
|
196
|
+
* In case of update flush IO
|
197
|
+
*/
|
198
|
+
|
210
199
|
if (port->toBeUpdated & T_SettingsDone)
|
211
200
|
{
|
212
201
|
tcsetattr(port->fd, TCSAFLUSH, &port->posixConfig);
|
213
202
|
}
|
214
|
-
|
203
|
+
|
215
204
|
/*
|
216
|
-
|
217
|
-
|
218
|
-
|
205
|
+
* Timeout clause
|
206
|
+
*/
|
207
|
+
|
219
208
|
if (port->toBeUpdated & T_TimeOut)
|
220
209
|
{
|
221
210
|
int timeout = port->settings.Timeout_Millisec;
|
222
|
-
|
211
|
+
|
223
212
|
if (timeout == -1)
|
224
213
|
{
|
225
214
|
fcntl(port->fd, F_SETFL, O_NDELAY); /* O_NDELAY should release if no any data here */
|
@@ -230,148 +219,116 @@ void updateSettings(PortDescriptor *port)
|
|
230
219
|
}
|
231
220
|
tcgetattr(port->fd, &port->posixConfig);
|
232
221
|
port->posixConfig.c_cc[VTIME] = (timeout / 100);
|
233
|
-
|
222
|
+
|
234
223
|
tcsetattr(port->fd, TCSAFLUSH, &port->posixConfig);
|
235
224
|
}
|
236
|
-
|
225
|
+
|
237
226
|
port->toBeUpdated = 0;
|
238
|
-
|
239
227
|
}
|
240
228
|
|
241
229
|
|
242
230
|
int queryStatusIO(VALUE self)
|
243
231
|
{
|
244
232
|
PortDescriptor *port = NULL;
|
245
|
-
|
246
233
|
Data_Get_Struct(self, PortDescriptor, port);
|
247
|
-
|
234
|
+
|
248
235
|
return port->status;
|
249
236
|
}
|
250
237
|
|
251
238
|
|
252
|
-
VALUE
|
239
|
+
VALUE isOpenIO(VALUE self)
|
253
240
|
{
|
254
|
-
return queryStatusIO(self) ==
|
241
|
+
return queryStatusIO(self) == PORT_OPEN ? Qtrue : Qfalse;
|
255
242
|
}
|
256
243
|
|
257
244
|
|
258
245
|
VALUE flushIO(VALUE self)
|
259
246
|
{
|
260
247
|
PortDescriptor *port = NULL;
|
261
|
-
|
262
248
|
Data_Get_Struct(self, PortDescriptor, port);
|
263
|
-
|
249
|
+
|
264
250
|
return INT2FIX( tcdrain(port->fd) );
|
265
251
|
}
|
266
252
|
|
267
253
|
|
268
254
|
VALUE bytesAvailableIO(VALUE self)
|
269
255
|
{
|
270
|
-
|
271
256
|
PortDescriptor *port = NULL;
|
272
|
-
|
273
257
|
Data_Get_Struct(self, PortDescriptor, port);
|
274
|
-
|
275
258
|
int bytesQueued;
|
276
|
-
|
259
|
+
|
277
260
|
if (ioctl(port->fd, FIONREAD, &bytesQueued) == -1)
|
278
|
-
{
|
279
261
|
return INT2FIX(0);
|
280
|
-
|
262
|
+
|
281
263
|
return INT2FIX(bytesQueued);
|
282
264
|
}
|
283
265
|
|
284
266
|
|
285
267
|
VALUE openIO(VALUE self)
|
286
268
|
{
|
287
|
-
|
288
269
|
PortDescriptor *port = NULL;
|
289
|
-
|
290
270
|
Data_Get_Struct(self, PortDescriptor, port);
|
291
|
-
|
292
|
-
if ((port->fd = open(port->settings.ComPort, O_RDWR | O_NOCTTY |
|
271
|
+
|
272
|
+
if ((port->fd = open(port->settings.ComPort, O_RDWR | O_NOCTTY | O_NDELAY)) != -1)
|
293
273
|
{
|
294
|
-
|
295
|
-
port->status
|
296
|
-
|
297
|
-
{
|
298
|
-
rb_iv_set(self, "@open", INT2FIX(port->status));
|
299
|
-
}
|
300
|
-
|
274
|
+
port->status = PORT_OPEN;
|
275
|
+
rb_iv_set(self, "@open", INT2FIX(port->status));
|
276
|
+
|
301
277
|
tcgetattr(port->fd, &port->previousPosixConfig);
|
302
278
|
port->posixConfig = port->previousPosixConfig;
|
303
279
|
cfmakeraw(&port->posixConfig);
|
304
|
-
|
305
|
-
|
280
|
+
|
306
281
|
port->posixConfig.c_cflag |= CREAD | CLOCAL;
|
307
|
-
port->posixConfig.c_lflag &= (~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG));
|
308
|
-
port->posixConfig.c_iflag &= (~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY));
|
282
|
+
port->posixConfig.c_lflag &= (~(ICANON| ECHO| ECHOE| ECHOK| ECHONL| ISIG));
|
283
|
+
port->posixConfig.c_iflag &= (~(INPCK| IGNPAR| PARMRK| ISTRIP| ICRNL| IXANY));
|
309
284
|
port->posixConfig.c_oflag &= (~OPOST);
|
310
285
|
port->posixConfig.c_cc[VMIN] = 0;
|
311
286
|
port->posixConfig.c_cc[VTIME] = 0;
|
312
|
-
|
287
|
+
|
313
288
|
port->toBeUpdated = T_ALL;
|
314
|
-
|
289
|
+
|
315
290
|
setSettings(self);
|
316
|
-
|
317
291
|
} else
|
318
292
|
{
|
319
|
-
port->status =
|
320
|
-
rb_raise(
|
293
|
+
port->status = PORT_CLOSED;
|
294
|
+
rb_raise(rb_eRuntimeError, "Unable to open comport: `%s`", port->settings.ComPort);
|
321
295
|
}
|
322
|
-
|
323
|
-
return
|
296
|
+
|
297
|
+
return self;
|
324
298
|
}
|
325
299
|
|
326
300
|
|
327
301
|
VALUE writeIO(VALUE self, VALUE message)
|
328
302
|
{
|
329
|
-
|
330
|
-
{
|
331
|
-
Check_Type(message, T_STRING);
|
332
|
-
}
|
333
|
-
|
334
|
-
int recv;
|
335
|
-
int len;
|
336
|
-
|
303
|
+
Check_Type(message, T_STRING);
|
337
304
|
PortDescriptor *port = NULL;
|
338
|
-
|
339
305
|
Data_Get_Struct(self, PortDescriptor, port);
|
340
|
-
|
341
|
-
len = (int) RSTRING_LEN(message);
|
306
|
+
|
307
|
+
const int len = (int) RSTRING_LEN(message);
|
342
308
|
char cStr[len];
|
343
309
|
strcpy(cStr, RSTRING_PTR(message));
|
344
|
-
|
345
|
-
recv = (int) write(port->fd, cStr, (size_t) sizeof(cStr));
|
346
|
-
|
347
|
-
if (recv < 0)
|
310
|
+
|
311
|
+
const int recv = (int) write(port->fd, cStr, (size_t) sizeof(cStr));
|
312
|
+
|
313
|
+
if (recv < 0)
|
348
314
|
rb_raise(rb_eEOFError, "TX: writing of the %d bytes has failed", len);
|
349
|
-
|
350
|
-
|
315
|
+
|
351
316
|
return INT2FIX(recv);
|
352
317
|
}
|
353
318
|
|
354
319
|
|
355
320
|
VALUE readIO(VALUE self, VALUE rb_int)
|
356
321
|
{
|
357
|
-
|
358
|
-
{
|
359
|
-
Check_Type(rb_int, T_FIXNUM);
|
360
|
-
}
|
361
|
-
|
322
|
+
Check_Type(rb_int, T_FIXNUM);
|
362
323
|
int recv;
|
363
|
-
|
364
324
|
PortDescriptor *port = NULL;
|
365
|
-
|
366
325
|
Data_Get_Struct(self, PortDescriptor, port);
|
367
|
-
|
368
|
-
int len = FIX2INT(rb_int);
|
369
|
-
|
326
|
+
const int len = FIX2INT(rb_int);
|
370
327
|
char in[len];
|
371
|
-
|
328
|
+
|
372
329
|
recv = (int) read(port->fd, in, sizeof(in));
|
373
330
|
if (recv > 0)
|
374
|
-
|
331
|
+
return rb_str_new(in, recv);
|
375
332
|
|
376
333
|
return Qnil;
|
377
334
|
}
|
@@ -379,51 +336,38 @@ VALUE readIO(VALUE self, VALUE rb_int)
|
|
379
336
|
|
380
337
|
VALUE closeIO(VALUE self)
|
381
338
|
{
|
382
|
-
|
383
|
-
int closed;
|
384
|
-
|
385
339
|
PortDescriptor *port = NULL;
|
386
|
-
|
387
340
|
Data_Get_Struct(self, PortDescriptor, port);
|
388
|
-
|
389
341
|
flushIO(self);
|
390
|
-
|
391
342
|
tcsetattr(port->fd, TCSAFLUSH | TCSANOW, &port->previousPosixConfig);
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
343
|
+
|
344
|
+
const int state = close(port->fd);
|
345
|
+
|
346
|
+
port->status = (state == 0 ? PORT_CLOSED : PORT_OPEN);
|
347
|
+
|
396
348
|
rb_iv_set(self, "@open", INT2FIX(port->status));
|
397
349
|
rb_iv_set(self, "@fd", INT2FIX(port->fd));
|
398
|
-
|
399
|
-
return INT2FIX(
|
400
|
-
|
350
|
+
|
351
|
+
return INT2FIX(state);
|
401
352
|
}
|
402
353
|
|
403
354
|
|
404
355
|
VALUE initializeStruct(VALUE self, VALUE portName)
|
405
356
|
{
|
406
|
-
|
407
|
-
{
|
408
|
-
Check_Type(portName, T_STRING);
|
409
|
-
}
|
410
|
-
|
357
|
+
Check_Type(portName, T_STRING);
|
411
358
|
PortDescriptor *port = NULL;
|
412
|
-
|
413
359
|
Data_Get_Struct(self, PortDescriptor, port);
|
414
|
-
|
360
|
+
|
415
361
|
port->settings.BaudRate = BAUD115200;
|
416
362
|
port->settings.Parity = PAR_NONE;
|
417
363
|
port->settings.FlowControl = FLOW_OFF;
|
418
364
|
port->settings.DataBits = DATA_8;
|
419
365
|
port->settings.StopBits = STOP_1;
|
420
366
|
port->settings.Timeout_Millisec = 0;
|
421
|
-
|
367
|
+
|
422
368
|
strcpy(port->settings.ComPort, RSTRING_PTR(portName));
|
423
|
-
|
424
369
|
platformInitIO(port);
|
425
|
-
|
426
370
|
rb_iv_set(self, "@port", portName);
|
427
|
-
|
371
|
+
|
428
372
|
return self;
|
429
|
-
}
|
373
|
+
}
|