Floppy-rb232 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README CHANGED
@@ -45,10 +45,11 @@ You can provide alternative settings when you create a new port:
45
45
  :parity => true,
46
46
  :stop_bits => 2)
47
47
 
48
- If you are using a simple text protocol over RS232, you can use the TextProtocol
49
- class to help you out. It automatically monitors the port and splits messages
50
- up by detecting separator characters. See examples/listen.rb for an example of
51
- how to use this class.
52
-
53
- See http://github.com/Floppy/rb232/tree/master/spec/port_spec.rb for more
54
- details.
48
+ See http://github.com/Floppy/rb232/tree/master/spec/port_spec.rb or RB232::Port
49
+ documentation for more details.
50
+
51
+ If you are using a simple text protocol over RS232, you can use the
52
+ RB232::TextProtocol class to help you out. It automatically monitors the port
53
+ and splits messages up by detecting separator characters. See
54
+ http://github.com/Floppy/rb232/tree/master/examples/listen.rb for an example of
55
+ how to use this class.
@@ -3,18 +3,35 @@ require 'observer'
3
3
 
4
4
  module RB232
5
5
 
6
+ # A helper class for RB232::Port which implements a simple text-based
7
+ # protocol on top of a serial port. Data is read from the serial port and split
8
+ # into individual messages based on a separator character.
9
+ #
10
+ # This class is Observable. Client code should implement an update(string) function
11
+ # add call TextProtocol#add_observer(self). When a complete message is received,
12
+ # the update() function will be called with the message string.
6
13
  class TextProtocol
7
14
 
8
15
  include Observable
9
16
 
17
+ # Create a protocol object. _port_ should be a RB232::Port object.
18
+ # _separator_ is the character which separates messages in the text protocol,
19
+ # "\n" by default.
10
20
  def initialize(port, separator = "\n")
11
21
  @port = port
12
22
  @separator = separator
13
23
  end
14
24
 
25
+ # Separator character, as specified in TextProtocol#new
15
26
  attr_reader :separator
27
+
28
+ # Port object, as specified in TextProtocol#new
16
29
  attr_reader :port
17
30
 
31
+ # Begin processing incoming data from the serial port.
32
+ # A thread is started which monitors the port for data and detects
33
+ # complete messages.
34
+ # Call TextProtocol#stop to halt this process.
18
35
  def start
19
36
  @stop = false
20
37
  @reader_thread = Thread.new {
@@ -31,6 +48,7 @@ module RB232
31
48
  }
32
49
  end
33
50
 
51
+ # Stop processing incoming data from the serial port.
34
52
  def stop
35
53
  @stop = true
36
54
  @reader_thread.join
data/src/port.c CHANGED
@@ -169,10 +169,14 @@ VALUE rb232_port_initialize_with_options(VALUE self, VALUE port, VALUE options)
169
169
  }
170
170
 
171
171
  /*
172
- * This function implements a default argument for initialize().
173
- * Equivalent Ruby would be def initialize(port, options = {}).
174
- * This function calls the _with_options version, providing an empty
175
- * hash if one is not passed in.
172
+ * Create a Port object, using the port filename specified in _port_ (e.g. '/dev/ttyS0' or 'COM1').
173
+ *
174
+ * Valid options are :baud_rate (integer), :data_bits (integer), :parity
175
+ * (boolean), and :stop_bits (integer). Default values are 9600, 8, false, and 1 respectively.
176
+ *
177
+ * call-seq:
178
+ * new(port, options = {})
179
+ *
176
180
  */
177
181
  VALUE rb232_port_initialize(int argc, VALUE* argv, VALUE self) {
178
182
  /* Only allow 1 or 2 arguments */
@@ -193,25 +197,33 @@ VALUE rb232_port_initialize(int argc, VALUE* argv, VALUE self) {
193
197
  return rb232_port_initialize_with_options(self, port, options);
194
198
  }
195
199
 
196
- /* def port_name */
200
+ /*
201
+ * Get the port name (for instance, '/dev/ttyS0' or 'COM1'), as set in Port#new.
202
+ */
197
203
  VALUE rb232_port_get_port_name(VALUE self) {
198
204
  /* Return baud rate */
199
205
  return rb_str_new2(get_port_data(self)->port_name);
200
206
  }
201
207
 
202
- /* def baud_rate */
208
+ /*
209
+ * Get the baud rate, as set in the _options_ argument to Port#new.
210
+ */
203
211
  VALUE rb232_port_get_baud_rate(VALUE self) {
204
212
  /* Return baud rate */
205
213
  return rb_uint_new(get_port_data(self)->baud_rate);
206
214
  }
207
215
 
208
- /* def data_bits */
216
+ /*
217
+ * Get the number of data bits, as set in the _options_ argument to Port#new.
218
+ */
209
219
  VALUE rb232_port_get_data_bits(VALUE self) {
210
220
  /* Return baud rate */
211
221
  return rb_uint_new(get_port_data(self)->data_bits);
212
222
  }
213
223
 
214
- /* def parity */
224
+ /*
225
+ * Get the parity setting, as set in the _options_ argument to Port#new.
226
+ */
215
227
  VALUE rb232_port_get_parity(VALUE self) {
216
228
  /* Return baud rate */
217
229
  if (get_port_data(self)->parity == TRUE)
@@ -220,13 +232,17 @@ VALUE rb232_port_get_parity(VALUE self) {
220
232
  return Qfalse;
221
233
  }
222
234
 
223
- /* def stop_bits */
235
+ /*
236
+ * Get the number of stop bits, as set in the _options_ argument to Port#new.
237
+ */
224
238
  VALUE rb232_port_get_stop_bits(VALUE self) {
225
239
  /* Return baud rate */
226
240
  return rb_uint_new(get_port_data(self)->stop_bits);
227
241
  }
228
242
 
229
- /* Read raw data from port */
243
+ /*
244
+ * Read raw data from port
245
+ */
230
246
  int rb232_port_read(VALUE self, char* buffer, VALUE count) {
231
247
  int bytes_to_read = NUM2INT(count);
232
248
  if (bytes_to_read > 255)
@@ -234,7 +250,13 @@ int rb232_port_read(VALUE self, char* buffer, VALUE count) {
234
250
  return read(get_port_data(self)->port_handle, buffer, bytes_to_read);
235
251
  }
236
252
 
237
- /* def read_bytes(count) */
253
+ /*
254
+ * Read _count_ raw byte values from the port.
255
+ * Returns an array of values. Useful for binary protocols.
256
+ * call-seq:
257
+ * read_bytes(count)
258
+ *
259
+ */
238
260
  VALUE rb232_port_read_bytes(VALUE self, VALUE count) {
239
261
  char buffer[256];
240
262
  int bytes_read = rb232_port_read(self, buffer, count);
@@ -245,7 +267,13 @@ VALUE rb232_port_read_bytes(VALUE self, VALUE count) {
245
267
  }
246
268
  }
247
269
 
248
- /* def read_string(count) */
270
+ /*
271
+ * Read _count_ characters from the port.
272
+ * Returns a string. Useful for text-based protocols.
273
+ * call-seq:
274
+ * read_string(count)
275
+ *
276
+ */
249
277
  VALUE rb232_port_read_string(VALUE self, VALUE count) {
250
278
  char buffer[256];
251
279
  int bytes_read = rb232_port_read(self, buffer, count);
data/src/port.h CHANGED
@@ -9,26 +9,57 @@ extern VALUE RB232_Port;
9
9
  /* Allocator for Port class */
10
10
  VALUE rb232_port_alloc(VALUE klass);
11
11
 
12
- /* def initialize(options = {}) */
12
+ /*
13
+ * Create a Port object, using the port filename specified in _port_ (e.g. '/dev/ttyS0' or 'COM1').
14
+ *
15
+ * Valid options are :baud_rate (integer), :data_bits (integer), :parity
16
+ * (boolean), and :stop_bits (integer). Default values are 9600, 8, false, and 1 respectively.
17
+ *
18
+ * call-seq:
19
+ * new(port, options = {})
20
+ *
21
+ */
13
22
  VALUE rb232_port_initialize(int argc, VALUE* argv, VALUE self);
14
23
 
15
- /* def port_name */
24
+ /*
25
+ * Get the port name (for instance, '/dev/ttyS0' or 'COM1'), as set in Port#new.
26
+ */
16
27
  VALUE rb232_port_get_port_name(VALUE self);
17
28
 
18
- /* def baud_rate */
29
+ /*
30
+ * Get the baud rate, as set in the _options_ argument to Port#new.
31
+ */
19
32
  VALUE rb232_port_get_baud_rate(VALUE self);
20
33
 
21
- /* def data_bits */
34
+ /*
35
+ * Get the number of data bits, as set in the _options_ argument to Port#new.
36
+ */
22
37
  VALUE rb232_port_get_data_bits(VALUE self);
23
38
 
24
- /* def parity */
39
+ /*
40
+ * Get the parity setting, as set in the _options_ argument to Port#new.
41
+ */
25
42
  VALUE rb232_port_get_parity(VALUE self);
26
43
 
27
- /* def stop_bits */
44
+ /*
45
+ * Get the number of stop bits, as set in the _options_ argument to Port#new.
46
+ */
28
47
  VALUE rb232_port_get_stop_bits(VALUE self);
29
48
 
30
- /* def read_bytes(count) */
49
+ /*
50
+ * Read _count_ raw byte values from the port.
51
+ * Returns an array of values. Useful for binary protocols.
52
+ * call-seq:
53
+ * read_bytes(count)
54
+ *
55
+ */
31
56
  VALUE rb232_port_read_bytes(VALUE self, VALUE count);
32
57
 
33
- /* def read_string(count) */
58
+ /*
59
+ * Read _count_ characters from the port.
60
+ * Returns a string. Useful for text-based protocols.
61
+ * call-seq:
62
+ * read_string(count)
63
+ *
64
+ */
34
65
  VALUE rb232_port_read_string(VALUE self, VALUE count);
data/src/rb232.c CHANGED
@@ -2,20 +2,19 @@
2
2
  #include "port.h"
3
3
 
4
4
  /*
5
- * Library initialization.
6
- * Registers all classes and methods with the Ruby interpreter.
7
- * Called automatically on require 'rb232'.
5
+ * Serial port communications. The class RB232::Port provides access to a hardware
6
+ * port on the local machine. Currently only Linux systems are supported.
8
7
  */
9
8
  void Init_rb232() {
10
9
  RB232 = rb_define_module("RB232");
11
10
  RB232_Port = rb_define_class_under(RB232, "Port", rb_cObject);
12
11
  rb_define_alloc_func(RB232_Port, rb232_port_alloc);
13
- rb_define_method(RB232_Port, "initialize", rb232_port_initialize, -1);
14
- rb_define_method(RB232_Port, "port_name", rb232_port_get_port_name, 0);
15
- rb_define_method(RB232_Port, "baud_rate", rb232_port_get_baud_rate, 0);
16
- rb_define_method(RB232_Port, "data_bits", rb232_port_get_data_bits, 0);
17
- rb_define_method(RB232_Port, "parity", rb232_port_get_parity, 0);
18
- rb_define_method(RB232_Port, "stop_bits", rb232_port_get_stop_bits, 0);
19
- rb_define_method(RB232_Port, "read_bytes", rb232_port_read_bytes, 1);
20
- rb_define_method(RB232_Port, "read_string", rb232_port_read_string, 1);
12
+ rb_define_method(RB232_Port, "initialize", rb232_port_initialize, -1); /* in port.c */
13
+ rb_define_method(RB232_Port, "port_name", rb232_port_get_port_name, 0); /* in port.c */
14
+ rb_define_method(RB232_Port, "baud_rate", rb232_port_get_baud_rate, 0); /* in port.c */
15
+ rb_define_method(RB232_Port, "data_bits", rb232_port_get_data_bits, 0); /* in port.c */
16
+ rb_define_method(RB232_Port, "parity", rb232_port_get_parity, 0); /* in port.c */
17
+ rb_define_method(RB232_Port, "stop_bits", rb232_port_get_stop_bits, 0); /* in port.c */
18
+ rb_define_method(RB232_Port, "read_bytes", rb232_port_read_bytes, 1); /* in port.c */
19
+ rb_define_method(RB232_Port, "read_string", rb232_port_read_string, 1); /* in port.c */
21
20
  }
data/src/utility.c CHANGED
@@ -1,5 +1,10 @@
1
1
  #include "utility.h"
2
2
 
3
+ /*
4
+ * Get a key from a hash, or if it's not there, use the default.
5
+ * A bit like doing hash[key] || default_val in Ruby.
6
+ * Integer version.
7
+ */
3
8
  int rbx_int_from_hash_or_default(VALUE hash, VALUE key, int default_val) {
4
9
  VALUE data = (rb_hash_aref(hash, key));
5
10
  if (data == Qnil)
@@ -8,6 +13,11 @@ int rbx_int_from_hash_or_default(VALUE hash, VALUE key, int default_val) {
8
13
  return NUM2INT(data);
9
14
  }
10
15
 
16
+ /*
17
+ * Get a key from a hash, or if it's not there, use the default.
18
+ * A bit like doing hash[key] || default_val in Ruby.
19
+ * Boolean version.
20
+ */
11
21
  BOOL rbx_bool_from_hash_or_default(VALUE hash, VALUE key, BOOL default_val) {
12
22
  VALUE data = (rb_hash_aref(hash, key));
13
23
  if (data == Qnil)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Floppy-rb232
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Smith
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-20 00:00:00 -07:00
12
+ date: 2008-08-21 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15