lib/rs_232.rb in rs_232-2.3.2.pre vs lib/rs_232.rb in rs_232-3.0.0.pre2

- old
+ new

@@ -1,6 +1,98 @@ require 'rs_232/version' -require 'rs_232.so' +require 'rs_232_native.so' +require 'forwardable' module Rs232 - # see 'examples' folder in order to use existent or decorate your own adapter. + # public accessible factory method + # + # @example + # + # > port = Rs232.new('/dev/tty.ACM0', baud_rate: 9600) + # #=> <#Rs232::Impl @port='/dev/tty.ACM0'> + # > port.open? + # #=> false + # > port.connect + # #=> <#Rs232::Impl @port='/dev/tty.ACM0'> + # port.pending_bytes + # #=> 15 + # port.read(15) + # #=> 'Hello, World!!!' + # + def new_serial_port(port, opts = {}, &block) + Impl.new(port, opts, &block) + end + + # the following class represents ruby public interface + # to native Rs232 implementation + # + # There no public instantiation, can be instantiate through + # the factory method @see Rs232.new + # + class Impl + include Rs232::Constants + + STD_OPTS = { + baud_rate: BAUD_115200, + parity: PAR_NONE, + data_bits: DATA_BITS_8, + stop_bits: STOP_BITS_1, + flow_control: FLOW_OFF, + timeout: 10 + }.freeze + + extend Forwardable + + def_delegators :@impl, + :read, + :write, + :flush, + :close, + :open?, + :set_rts, + :set_dtr + + def initialize(name, opts = {}) + @impl = Rs232::Native.new(name) + @opts = STD_OPTS.merge(opts).freeze + freeze + yield self if block_given? + end + + # @raise RuntimeError in case of open error + def connect + return self if open? + @impl.open.tap do |io| + io.baud_rate = @opts[:baud_rate] + io.parity = @opts[:parity] + io.data_bits = @opts[:data_bits] + io.stop_bits = @opts[:stop_bits] + io.flow_control = @opts[:flow_control] + io.timeout = @opts[:timeout] + end + self + end + + def settings + {}.tap do |o| + o[:baud_rate] = @impl.baud_rate + o[:parity] = @impl.parity + o[:data_bits] = @impl.data_bits + o[:stop_bits] = @impl.stop_bits + o[:flow_control] = @impl.flow_control + o[:timeout] = @impl.timeout + o[:line_status] = @impl.line_status + end.freeze + end + + def open? + @impl.open? + end + + def close + return !open unless open? + 0 == @impl.close + end + end + + private_constant :Impl end