Module: Serial::Windows
- Defined in:
- lib/ffi-serial/windows.rb
Overview
:nodoc:
Class Method Summary collapse
Instance Method Summary collapse
-
#baud ⇒ Object
:nodoc:.
-
#data_bits ⇒ Object
:nodoc:.
-
#getc ⇒ Object
:nodoc:.
-
#inspect ⇒ Object
:nodoc:.
-
#parity ⇒ Object
:nodoc:.
-
#read_nonblock(maxlen, outbuf = nil, options = nil) ⇒ Object
:nodoc:.
- #read_timeout ⇒ Object
- #read_timeout=(val) ⇒ Object
-
#readbyte ⇒ Object
:nodoc:.
-
#readchar ⇒ Object
:nodoc:.
-
#readpartial(maxlen, outbuf = nil) ⇒ Object
:nodoc:.
-
#stop_bits ⇒ Object
:nodoc:.
-
#to_s ⇒ Object
:nodoc:.
Class Method Details
.new(com_port, baud, data_bits, stop_bits, parity) ⇒ Object
:nodoc:
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/ffi-serial/windows.rb', line 3 def self.new(com_port, baud, data_bits, stop_bits, parity) #:nodoc: # Either specify as 'COM1' or a number. eg 1 for 'COM1' begin as_int = Integer(com_port) com_port = '\\\\.\\COM' + as_int.to_s rescue StandardError com_port = '\\\\.\\' + com_port.to_s.strip.chomp.upcase end dcb = Kernel32::DCB.new dcb.baud = baud dcb.data_bits = data_bits dcb.stop_bits = stop_bits dcb.parity = parity io = File.open(com_port, IO::RDWR|IO::BINARY) begin io.sync = true io.instance_variable_set(:@__serial__port__, com_port[4..-1].to_s.freeze) # Sane defaults dcb[:Flags] = dcb[:Flags] | (Kernel32::CONSTANTS['FLAGS'].fetch('fDtrControl').fetch(:enable)) dcb[:XonChar] = 17 dcb[:XoffChar] = 19 Kernel32.SetCommState(io, dcb) Kernel32.ClearCommError(io) # Blocking io commtimeouts = Kernel32::COMMTIMEOUTS.new commtimeouts[:ReadIntervalTimeout] = Kernel32::CONSTANTS['MAXDWORD'] commtimeouts[:ReadTotalTimeoutMultiplier] = Kernel32::CONSTANTS['MAXDWORD'] commtimeouts[:ReadTotalTimeoutConstant] = Kernel32::CONSTANTS['MAXDWORD'] - 1 commtimeouts[:WriteTotalTimeoutMultiplier] = 0 commtimeouts[:WriteTotalTimeoutConstant] = Kernel32::CONSTANTS['MAXDWORD'] - 1 Kernel32.SetCommTimeouts(io, commtimeouts) io.extend(self) rescue Exception begin; io.close; rescue Exception; end raise end io end |
Instance Method Details
#baud ⇒ Object
:nodoc:
79 80 81 |
# File 'lib/ffi-serial/windows.rb', line 79 def baud #:nodoc: Kernel32.GetCommState(self).baud end |
#data_bits ⇒ Object
:nodoc:
83 84 85 |
# File 'lib/ffi-serial/windows.rb', line 83 def data_bits #:nodoc: Kernel32.GetCommState(self).data_bits end |
#getc ⇒ Object
:nodoc:
119 120 121 |
# File 'lib/ffi-serial/windows.rb', line 119 def getc #:nodoc: Kernel32.nonblock_io(self) { super } end |
#inspect ⇒ Object
:nodoc:
131 132 133 |
# File 'lib/ffi-serial/windows.rb', line 131 def inspect #:nodoc: self.to_s end |
#parity ⇒ Object
:nodoc:
91 92 93 |
# File 'lib/ffi-serial/windows.rb', line 91 def parity #:nodoc: Kernel32.GetCommState(self).parity end |
#read_nonblock(maxlen, outbuf = nil, options = nil) ⇒ Object
:nodoc:
95 96 97 98 99 100 101 102 103 104 |
# File 'lib/ffi-serial/windows.rb', line 95 def read_nonblock(maxlen, outbuf = nil, = nil) #:nodoc: result = Kernel32.nonblock_io(self) { outbuf.nil? ? self.read(maxlen) : self.read(maxlen, outbuf) } if result.nil? || (0 == result.length) if ((!.nil?) && (false == [:exception])) return :wait_readable end raise Errno::EWOULDBLOCK.new end result end |
#read_timeout ⇒ Object
49 50 51 52 53 54 |
# File 'lib/ffi-serial/windows.rb', line 49 def read_timeout commtimeouts = Kernel32.GetCommTimeouts(self) return -1 if (0 == commtimeouts[:ReadTotalTimeoutConstant]) return 0 if (Kernel32::CONSTANTS['MAXDWORD'] == commtimeouts[:ReadIntervalTimeout]) Float(commtimeouts[:ReadTotalTimeoutConstant])/1000.0 end |
#read_timeout=(val) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/ffi-serial/windows.rb', line 56 def read_timeout=(val) val = Float(val) commtimeouts = Kernel32.GetCommTimeouts(self) if (0 > val) commtimeouts[:ReadIntervalTimeout] = Kernel32::CONSTANTS['MAXDWORD'] commtimeouts[:ReadTotalTimeoutMultiplier] = 0 commtimeouts[:ReadTotalTimeoutConstant] = 0 val = -1 elsif (0 == val) commtimeouts[:ReadIntervalTimeout] = Kernel32::CONSTANTS['MAXDWORD'] commtimeouts[:ReadTotalTimeoutMultiplier] = Kernel32::CONSTANTS['MAXDWORD'] commtimeouts[:ReadTotalTimeoutConstant] = Kernel32::CONSTANTS['MAXDWORD'] - 1 val = 0 else val = (val * 1000.0).to_i commtimeouts[:ReadIntervalTimeout] = val commtimeouts[:ReadTotalTimeoutMultiplier] = 0 commtimeouts[:ReadTotalTimeoutConstant] = val val = (val / 1000.0) end Kernel32.SetCommTimeouts(self, commtimeouts); val end |
#readbyte ⇒ Object
:nodoc:
115 116 117 |
# File 'lib/ffi-serial/windows.rb', line 115 def readbyte #:nodoc: Kernel32.nonblock_io(self) { super } end |
#readchar ⇒ Object
:nodoc:
123 124 125 |
# File 'lib/ffi-serial/windows.rb', line 123 def readchar #:nodoc: Kernel32.nonblock_io(self) { super } end |
#readpartial(maxlen, outbuf = nil) ⇒ Object
:nodoc:
106 107 108 109 110 111 112 113 |
# File 'lib/ffi-serial/windows.rb', line 106 def readpartial(maxlen, outbuf = nil) #:nodoc: ch = self.read(1) if (ch.nil? || (0 == ch.length)) return ch end self.ungetc(ch) Kernel32.nonblock_io(self) { outbuf.nil? ? self.read(maxlen) : self.read(maxlen, outbuf) } end |
#stop_bits ⇒ Object
:nodoc:
87 88 89 |
# File 'lib/ffi-serial/windows.rb', line 87 def stop_bits #:nodoc: Kernel32.GetCommState(self).stop_bits end |
#to_s ⇒ Object
:nodoc:
127 128 129 |
# File 'lib/ffi-serial/windows.rb', line 127 def to_s #:nodoc: ['#<Serial:', @__serial__port__, '>'].join.to_s end |