rubyserial-with-blocking 0.2.3
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.
- checksums.yaml +7 -0
 - data/.gitignore +4 -0
 - data/.rspec +3 -0
 - data/.travis.yml +18 -0
 - data/Gemfile +5 -0
 - data/Guardfile +7 -0
 - data/LICENSE +13 -0
 - data/README.md +76 -0
 - data/Rakefile +2 -0
 - data/appveyor.yml +25 -0
 - data/lib/rubyserial.rb +21 -0
 - data/lib/rubyserial/linux_constants.rb +214 -0
 - data/lib/rubyserial/osx_constants.rb +181 -0
 - data/lib/rubyserial/posix.rb +140 -0
 - data/lib/rubyserial/version.rb +5 -0
 - data/lib/rubyserial/windows.rb +104 -0
 - data/lib/rubyserial/windows_constants.rb +275 -0
 - data/rubyserial.gemspec +21 -0
 - data/spec/lib/posix_spec.rb +150 -0
 - data/spec/rubyserial_spec.rb +138 -0
 - data/spec/spec_helper.rb +86 -0
 - metadata +95 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: d6381caf1cc6b6fcebd72e2c632a92bfbaa46f5c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0ec74868ab6b407eb1c6c85af4b910de845a55d7
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: adc8fcf13dce6cc2f6715a3cb0a0198754698ca45d7d53c98d0f37745c8d135b65a57c042aa889c43ac60664a7238d1735c628f4f0d9366d6dee45b9b2a05694
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: a06a5331e0b171e7995b5eff36b64e28b5209b4af8fc2778727f4a3666ecad446676a22cece19a5df99c6a97dc713bd00220be252ed8782fc470d95178fcd2bb
         
     | 
    
        data/.gitignore
    ADDED
    
    
    
        data/.rspec
    ADDED
    
    
    
        data/.travis.yml
    ADDED
    
    | 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            language: ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            rvm:
         
     | 
| 
      
 3 
     | 
    
         
            +
              - 1.9.3
         
     | 
| 
      
 4 
     | 
    
         
            +
              - 2.0.0
         
     | 
| 
      
 5 
     | 
    
         
            +
              - 2.1.0
         
     | 
| 
      
 6 
     | 
    
         
            +
              - ruby-head
         
     | 
| 
      
 7 
     | 
    
         
            +
              - jruby
         
     | 
| 
      
 8 
     | 
    
         
            +
              - jruby-head
         
     | 
| 
      
 9 
     | 
    
         
            +
              - rbx-2.2.10
         
     | 
| 
      
 10 
     | 
    
         
            +
            matrix:
         
     | 
| 
      
 11 
     | 
    
         
            +
              allow_failures:
         
     | 
| 
      
 12 
     | 
    
         
            +
                - rvm: jruby-head
         
     | 
| 
      
 13 
     | 
    
         
            +
                - rvm: ruby-head
         
     | 
| 
      
 14 
     | 
    
         
            +
            install:
         
     | 
| 
      
 15 
     | 
    
         
            +
                #- sudo apt-get update && sudo apt-get install --force-yes socat
         
     | 
| 
      
 16 
     | 
    
         
            +
            script:
         
     | 
| 
      
 17 
     | 
    
         
            +
              - bundle install
         
     | 
| 
      
 18 
     | 
    
         
            +
              - bundle exec rspec -fd
         
     | 
    
        data/Gemfile
    ADDED
    
    
    
        data/Guardfile
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #guard(:rspec, all_on_start: true) do #, cli: '--format nested --debug --color' do
         
     | 
| 
      
 2 
     | 
    
         
            +
            guard :rspec, cmd: "bundle exec rspec" do
         
     | 
| 
      
 3 
     | 
    
         
            +
              watch(%r{^spec/.+[_-]spec\.rb$})
         
     | 
| 
      
 4 
     | 
    
         
            +
              watch(%r{^lib/rubyserial/(.+)\.rb$})       { |m| "spec/lib/#{m[1]}_spec.rb" }
         
     | 
| 
      
 5 
     | 
    
         
            +
              watch('spec/spec_helper.rb')    { "spec" }
         
     | 
| 
      
 6 
     | 
    
         
            +
              watch('lib/rubyserial.rb')    { "spec" }
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
    
        data/LICENSE
    ADDED
    
    | 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Copyright (c) 2014 The Hybrid Group
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
      
 4 
     | 
    
         
            +
            you may not use this file except in compliance with the License.
         
     | 
| 
      
 5 
     | 
    
         
            +
            You may obtain a copy of the License at
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
               http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            Unless required by applicable law or agreed to in writing, software
         
     | 
| 
      
 10 
     | 
    
         
            +
            distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
      
 11 
     | 
    
         
            +
            WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
      
 12 
     | 
    
         
            +
            See the License for the specific language governing permissions and
         
     | 
| 
      
 13 
     | 
    
         
            +
            limitations under the License.
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,76 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # THIS IS ONLY THE FORK!
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            it is adding blocking read functionality. I added a config hash to the c'tor so
         
     | 
| 
      
 4 
     | 
    
         
            +
            that you can control VMIN & VTIME termio settings for the device. VMIN was fixed
         
     | 
| 
      
 5 
     | 
    
         
            +
            to 0 before resulting in effectively always returning immediatly from the read
         
     | 
| 
      
 6 
     | 
    
         
            +
            call and you could not just block wait for input. But polling is bad. The other
         
     | 
| 
      
 7 
     | 
    
         
            +
            thing i did was to add a getter for the file descriptor. This makes it possible
         
     | 
| 
      
 8 
     | 
    
         
            +
            to use the serial device in a select call. You can also use select to avoid
         
     | 
| 
      
 9 
     | 
    
         
            +
            polling but much more it is useful to use it to let the OS block wait on
         
     | 
| 
      
 10 
     | 
    
         
            +
            multiple IO sources simultaneously.
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            It made the changes in a way which will not break existing code. Old code just
         
     | 
| 
      
 13 
     | 
    
         
            +
            does what it did before. 
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            To block reading add vmin:  Serial.new(path, nil, nil, vmin: 1). This will block
         
     | 
| 
      
 16 
     | 
    
         
            +
            until at least one character was read. 
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            To wait for multiple input sources use select:
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              sp = Serial.new(path)
         
     | 
| 
      
 21 
     | 
    
         
            +
              # combine some sources in1, in2, and the serial port
         
     | 
| 
      
 22 
     | 
    
         
            +
              result = IO.select([in1, in2, IO.new(sp.fd)])
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            The IO#select call returns and array of arrays with file descriptors ready for
         
     | 
| 
      
 25 
     | 
    
         
            +
            reading (it's more complex, see IO#select manual)
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            ----
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            # rubyserial
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            RubySerial is a simple Ruby gem for reading from and writing to serial ports. 
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            Unlike other Ruby serial port implementations, it supports all of the most popular Ruby implementations (MRI, JRuby, & Rubinius) on the most popular operating systems (OSX, Linux, & Windows). And it does not require any native compilation thanks to using RubyFFI [https://github.com/ffi/ffi](https://github.com/ffi/ffi).
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            The interface to RubySerial should be (mostly) compatible with other Ruby serialport gems, so you should be able to drop in the new gem, change the `require` and use it as a replacement. If not, please let us know so we can address any issues.
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            [](https://travis-ci.org/hybridgroup/rubyserial)
         
     | 
| 
      
 39 
     | 
    
         
            +
            [](https://ci.appveyor.com/project/zankich/rubyserial/branch/master)
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                $ gem install rubyserial
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            ## Usage
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 48 
     | 
    
         
            +
            require 'rubyserial'
         
     | 
| 
      
 49 
     | 
    
         
            +
            serialport = Serial.new '/dev/ttyACM0', 57600
         
     | 
| 
      
 50 
     | 
    
         
            +
            ```
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            ## Methods
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            **write(data : String) -> Int**
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            Returns the number of bytes written.
         
     | 
| 
      
 57 
     | 
    
         
            +
            Emits a `RubySerial::Exception` on error.
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            **read(length : Int) -> String**
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            Returns a string up to `length` long. It is not guaranteed to return the entire
         
     | 
| 
      
 62 
     | 
    
         
            +
            length specified, and will return an empty string if no data is
         
     | 
| 
      
 63 
     | 
    
         
            +
            available. Emits a `RubySerial::Exception` on error.
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
            **getbyte -> Fixnum or nil**
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            Returns an 8 bit byte or nil if no data is available. 
         
     | 
| 
      
 68 
     | 
    
         
            +
            Emits a `RubySerial::Exception` on error.
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            **RubySerial::Exception**
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            A wrapper exception type, that returns the underlying system error code.
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            ## License
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            Apache 2.0. See `LICENSE` for more details.
         
     | 
    
        data/Rakefile
    ADDED
    
    
    
        data/appveyor.yml
    ADDED
    
    | 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            platform:
         
     | 
| 
      
 2 
     | 
    
         
            +
              - x64
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            install:
         
     | 
| 
      
 5 
     | 
    
         
            +
              - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
         
     | 
| 
      
 6 
     | 
    
         
            +
              - ruby -v
         
     | 
| 
      
 7 
     | 
    
         
            +
              - gem install bundler
         
     | 
| 
      
 8 
     | 
    
         
            +
              - bundle install
         
     | 
| 
      
 9 
     | 
    
         
            +
              - ps: Start-FileDownload https://github.com/hybridgroup/rubyserial/raw/appveyor_deps/com0com.cer
         
     | 
| 
      
 10 
     | 
    
         
            +
              - ps: C:\"Program Files"\"Microsoft SDKs"\Windows\v7.1\Bin\CertMgr.exe /add com0com.cer /s /r localMachine root
         
     | 
| 
      
 11 
     | 
    
         
            +
              - ps: C:\"Program Files"\"Microsoft SDKs"\Windows\v7.1\Bin\CertMgr.exe /add com0com.cer /s /r localMachine trustedpublisher
         
     | 
| 
      
 12 
     | 
    
         
            +
              - ps: Start-FileDownload https://github.com/hybridgroup/rubyserial/raw/appveyor_deps/setup_com0com_W7_x64_signed.exe
         
     | 
| 
      
 13 
     | 
    
         
            +
              - ps: $env:CNC_INSTALL_CNCA0_CNCB0_PORTS="YES"
         
     | 
| 
      
 14 
     | 
    
         
            +
              - ps: .\setup_com0com_W7_x64_signed.exe /S
         
     | 
| 
      
 15 
     | 
    
         
            +
              - ps: sleep 60
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            test_script:
         
     | 
| 
      
 18 
     | 
    
         
            +
              - ps: rspec spec -fd
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            environment:
         
     | 
| 
      
 21 
     | 
    
         
            +
              matrix:
         
     | 
| 
      
 22 
     | 
    
         
            +
                - ruby_version: "200-x64"
         
     | 
| 
      
 23 
     | 
    
         
            +
                - ruby_version: "21-x64"
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            build: off
         
     | 
    
        data/lib/rubyserial.rb
    ADDED
    
    | 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $:.unshift(File.dirname(__FILE__))
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rbconfig'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'ffi'
         
     | 
| 
      
 4 
     | 
    
         
            +
            include RbConfig
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module RubySerial
         
     | 
| 
      
 7 
     | 
    
         
            +
              class Exception < Exception
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
            end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            if CONFIG['host_os'] =~ /mswin|windows|mingw/i
         
     | 
| 
      
 12 
     | 
    
         
            +
              require 'rubyserial/windows_constants'
         
     | 
| 
      
 13 
     | 
    
         
            +
              require 'rubyserial/windows'
         
     | 
| 
      
 14 
     | 
    
         
            +
            else
         
     | 
| 
      
 15 
     | 
    
         
            +
              if CONFIG['host_os'] =~ /linux/i
         
     | 
| 
      
 16 
     | 
    
         
            +
                require 'rubyserial/linux_constants'
         
     | 
| 
      
 17 
     | 
    
         
            +
              else
         
     | 
| 
      
 18 
     | 
    
         
            +
                require 'rubyserial/osx_constants'
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
              require 'rubyserial/posix'
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,214 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'ffi'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module RubySerial
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Posix
         
     | 
| 
      
 5 
     | 
    
         
            +
              extend FFI::Library
         
     | 
| 
      
 6 
     | 
    
         
            +
                ffi_lib FFI::Library::LIBC
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                O_NONBLOCK = 00004000
         
     | 
| 
      
 9 
     | 
    
         
            +
                O_NOCTTY = 00000400
         
     | 
| 
      
 10 
     | 
    
         
            +
                O_RDWR = 00000002
         
     | 
| 
      
 11 
     | 
    
         
            +
                F_GETFL = 3
         
     | 
| 
      
 12 
     | 
    
         
            +
                F_SETFL = 4
         
     | 
| 
      
 13 
     | 
    
         
            +
                VTIME = 5
         
     | 
| 
      
 14 
     | 
    
         
            +
                TCSANOW = 0
         
     | 
| 
      
 15 
     | 
    
         
            +
                TCSETS = 0x5402
         
     | 
| 
      
 16 
     | 
    
         
            +
                IGNPAR = 0000004
         
     | 
| 
      
 17 
     | 
    
         
            +
                CREAD = 0000200
         
     | 
| 
      
 18 
     | 
    
         
            +
                CLOCAL = 0004000
         
     | 
| 
      
 19 
     | 
    
         
            +
                VMIN = 6
         
     | 
| 
      
 20 
     | 
    
         
            +
                NCCS = 19
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                DATA_BITS = {
         
     | 
| 
      
 23 
     | 
    
         
            +
                  5 => 0000000,
         
     | 
| 
      
 24 
     | 
    
         
            +
                  6 => 0000020,
         
     | 
| 
      
 25 
     | 
    
         
            +
                  7 => 0000040,
         
     | 
| 
      
 26 
     | 
    
         
            +
                  8 => 0000060
         
     | 
| 
      
 27 
     | 
    
         
            +
                }
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                BAUDE_RATES = {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  0 => 0000000,
         
     | 
| 
      
 31 
     | 
    
         
            +
                  50 => 0000001,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  75 => 0000002,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  110 => 0000003,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  134 => 0000004,
         
     | 
| 
      
 35 
     | 
    
         
            +
                  150 => 0000005,
         
     | 
| 
      
 36 
     | 
    
         
            +
                  200 => 0000006,
         
     | 
| 
      
 37 
     | 
    
         
            +
                  300 => 0000007,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  600 => 0000010,
         
     | 
| 
      
 39 
     | 
    
         
            +
                  1200 => 0000011,
         
     | 
| 
      
 40 
     | 
    
         
            +
                  1800 => 0000012,
         
     | 
| 
      
 41 
     | 
    
         
            +
                  2400 => 0000013,
         
     | 
| 
      
 42 
     | 
    
         
            +
                  4800 => 0000014,
         
     | 
| 
      
 43 
     | 
    
         
            +
                  9600 => 0000015,
         
     | 
| 
      
 44 
     | 
    
         
            +
                  19200 => 0000016,
         
     | 
| 
      
 45 
     | 
    
         
            +
                  38400 => 0000017,
         
     | 
| 
      
 46 
     | 
    
         
            +
                  57600 => 0010001,
         
     | 
| 
      
 47 
     | 
    
         
            +
                  115200 => 0010002,
         
     | 
| 
      
 48 
     | 
    
         
            +
                  230400 => 0010003,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  460800 => 0010004,
         
     | 
| 
      
 50 
     | 
    
         
            +
                  500000 => 0010005,
         
     | 
| 
      
 51 
     | 
    
         
            +
                  576000 => 0010006,
         
     | 
| 
      
 52 
     | 
    
         
            +
                  921600 => 0010007,
         
     | 
| 
      
 53 
     | 
    
         
            +
                  1000000 => 0010010,
         
     | 
| 
      
 54 
     | 
    
         
            +
                  1152000 => 0010011,
         
     | 
| 
      
 55 
     | 
    
         
            +
                  1500000 => 0010012,
         
     | 
| 
      
 56 
     | 
    
         
            +
                  2000000 => 0010013,
         
     | 
| 
      
 57 
     | 
    
         
            +
                  2500000 => 0010014,
         
     | 
| 
      
 58 
     | 
    
         
            +
                  3000000 => 0010015,
         
     | 
| 
      
 59 
     | 
    
         
            +
                  3500000 => 0010016,
         
     | 
| 
      
 60 
     | 
    
         
            +
                  4000000 => 0010017
         
     | 
| 
      
 61 
     | 
    
         
            +
                }
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                ERROR_CODES = {
         
     | 
| 
      
 64 
     | 
    
         
            +
                  1 => "EPERM",
         
     | 
| 
      
 65 
     | 
    
         
            +
                  2 => "ENOENT",
         
     | 
| 
      
 66 
     | 
    
         
            +
                  3 => "ESRCH",
         
     | 
| 
      
 67 
     | 
    
         
            +
                  4 => "EINTR",
         
     | 
| 
      
 68 
     | 
    
         
            +
                  5 => "EIO",
         
     | 
| 
      
 69 
     | 
    
         
            +
                  6 => "ENXIO",
         
     | 
| 
      
 70 
     | 
    
         
            +
                  7 => "E2BIG",
         
     | 
| 
      
 71 
     | 
    
         
            +
                  8 => "ENOEXEC",
         
     | 
| 
      
 72 
     | 
    
         
            +
                  9 => "EBADF",
         
     | 
| 
      
 73 
     | 
    
         
            +
                  10 => "ECHILD",
         
     | 
| 
      
 74 
     | 
    
         
            +
                  11 => "EAGAIN",
         
     | 
| 
      
 75 
     | 
    
         
            +
                  12 => "ENOMEM",
         
     | 
| 
      
 76 
     | 
    
         
            +
                  13 => "EACCES",
         
     | 
| 
      
 77 
     | 
    
         
            +
                  14 => "EFAULT",
         
     | 
| 
      
 78 
     | 
    
         
            +
                  15 => "ENOTBLK",
         
     | 
| 
      
 79 
     | 
    
         
            +
                  16 => "EBUSY",
         
     | 
| 
      
 80 
     | 
    
         
            +
                  17 => "EEXIST",
         
     | 
| 
      
 81 
     | 
    
         
            +
                  18 => "EXDEV",
         
     | 
| 
      
 82 
     | 
    
         
            +
                  19 => "ENODEV",
         
     | 
| 
      
 83 
     | 
    
         
            +
                  20 => "ENOTDIR ",
         
     | 
| 
      
 84 
     | 
    
         
            +
                  21 => "EISDIR",
         
     | 
| 
      
 85 
     | 
    
         
            +
                  22 => "EINVAL",
         
     | 
| 
      
 86 
     | 
    
         
            +
                  23 => "ENFILE",
         
     | 
| 
      
 87 
     | 
    
         
            +
                  24 => "EMFILE",
         
     | 
| 
      
 88 
     | 
    
         
            +
                  25 => "ENOTTY",
         
     | 
| 
      
 89 
     | 
    
         
            +
                  26 => "ETXTBSY",
         
     | 
| 
      
 90 
     | 
    
         
            +
                  27 => "EFBIG",
         
     | 
| 
      
 91 
     | 
    
         
            +
                  28 => "ENOSPC",
         
     | 
| 
      
 92 
     | 
    
         
            +
                  29 => "ESPIPE",
         
     | 
| 
      
 93 
     | 
    
         
            +
                  30 => "EROFS",
         
     | 
| 
      
 94 
     | 
    
         
            +
                  31 => "EMLINK",
         
     | 
| 
      
 95 
     | 
    
         
            +
                  32 => "EPIPE",
         
     | 
| 
      
 96 
     | 
    
         
            +
                  33 => "EDOM",
         
     | 
| 
      
 97 
     | 
    
         
            +
                  34 => "ERANGE",
         
     | 
| 
      
 98 
     | 
    
         
            +
                  35 => "EDEADLK",
         
     | 
| 
      
 99 
     | 
    
         
            +
                  36 => "ENAMETOOLONG",
         
     | 
| 
      
 100 
     | 
    
         
            +
                  37 => "ENOLCK ",
         
     | 
| 
      
 101 
     | 
    
         
            +
                  38 => "ENOSYS",
         
     | 
| 
      
 102 
     | 
    
         
            +
                  39 => "ENOTEMPTY",
         
     | 
| 
      
 103 
     | 
    
         
            +
                  40 => "ELOOP",
         
     | 
| 
      
 104 
     | 
    
         
            +
                  42 => "ENOMSG",
         
     | 
| 
      
 105 
     | 
    
         
            +
                  43 => "EIDRM",
         
     | 
| 
      
 106 
     | 
    
         
            +
                  44 => "ECHRNG",
         
     | 
| 
      
 107 
     | 
    
         
            +
                  45 => "EL2NSYNC",
         
     | 
| 
      
 108 
     | 
    
         
            +
                  46 => "EL3HLT",
         
     | 
| 
      
 109 
     | 
    
         
            +
                  47 => "EL3RST",
         
     | 
| 
      
 110 
     | 
    
         
            +
                  48 => "ELNRNG",
         
     | 
| 
      
 111 
     | 
    
         
            +
                  49 => "EUNATCH",
         
     | 
| 
      
 112 
     | 
    
         
            +
                  50 => "ENOCSI",
         
     | 
| 
      
 113 
     | 
    
         
            +
                  51 => "EL2HLT",
         
     | 
| 
      
 114 
     | 
    
         
            +
                  52 => "EBADE",
         
     | 
| 
      
 115 
     | 
    
         
            +
                  53 => "EBADR",
         
     | 
| 
      
 116 
     | 
    
         
            +
                  54 => "EXFULL",
         
     | 
| 
      
 117 
     | 
    
         
            +
                  55 => "ENOANO",
         
     | 
| 
      
 118 
     | 
    
         
            +
                  56 => "EBADRQC",
         
     | 
| 
      
 119 
     | 
    
         
            +
                  57 => "EBADSLT",
         
     | 
| 
      
 120 
     | 
    
         
            +
                  59 => "EBFONT",
         
     | 
| 
      
 121 
     | 
    
         
            +
                  60 => "ENOSTR",
         
     | 
| 
      
 122 
     | 
    
         
            +
                  61 => "ENODATA",
         
     | 
| 
      
 123 
     | 
    
         
            +
                  62 => "ETIME",
         
     | 
| 
      
 124 
     | 
    
         
            +
                  63 => "ENOSR",
         
     | 
| 
      
 125 
     | 
    
         
            +
                  64 => "ENONET",
         
     | 
| 
      
 126 
     | 
    
         
            +
                  65 => "ENOPKG",
         
     | 
| 
      
 127 
     | 
    
         
            +
                  66 => "EREMOTE",
         
     | 
| 
      
 128 
     | 
    
         
            +
                  67 => "ENOLINK",
         
     | 
| 
      
 129 
     | 
    
         
            +
                  68 => "EADV",
         
     | 
| 
      
 130 
     | 
    
         
            +
                  69 => "ESRMNT",
         
     | 
| 
      
 131 
     | 
    
         
            +
                  70 => "ECOMM",
         
     | 
| 
      
 132 
     | 
    
         
            +
                  71 => "EPROTO",
         
     | 
| 
      
 133 
     | 
    
         
            +
                  72 => "EMULTIHOP",
         
     | 
| 
      
 134 
     | 
    
         
            +
                  73 => "EDOTDOT",
         
     | 
| 
      
 135 
     | 
    
         
            +
                  74 => "EBADMSG",
         
     | 
| 
      
 136 
     | 
    
         
            +
                  75 => "EOVERFLOW",
         
     | 
| 
      
 137 
     | 
    
         
            +
                  76 => "ENOTUNIQ",
         
     | 
| 
      
 138 
     | 
    
         
            +
                  77 => "EBADFD",
         
     | 
| 
      
 139 
     | 
    
         
            +
                  78 => "EREMCHG",
         
     | 
| 
      
 140 
     | 
    
         
            +
                  79 => "ELIBACC",
         
     | 
| 
      
 141 
     | 
    
         
            +
                  80 => "ELIBBAD",
         
     | 
| 
      
 142 
     | 
    
         
            +
                  81 => "ELIBSCN",
         
     | 
| 
      
 143 
     | 
    
         
            +
                  82 => "ELIBMAX",
         
     | 
| 
      
 144 
     | 
    
         
            +
                  83 => "ELIBEXEC",
         
     | 
| 
      
 145 
     | 
    
         
            +
                  84 => "EILSEQ",
         
     | 
| 
      
 146 
     | 
    
         
            +
                  85 => "ERESTART",
         
     | 
| 
      
 147 
     | 
    
         
            +
                  86 => "ESTRPIPE",
         
     | 
| 
      
 148 
     | 
    
         
            +
                  87 => "EUSERS",
         
     | 
| 
      
 149 
     | 
    
         
            +
                  88 => "ENOTSOCK",
         
     | 
| 
      
 150 
     | 
    
         
            +
                  89 => "EDESTADDRREQ",
         
     | 
| 
      
 151 
     | 
    
         
            +
                  90 => "EMSGSIZE",
         
     | 
| 
      
 152 
     | 
    
         
            +
                  91 => "EPROTOTYPE",
         
     | 
| 
      
 153 
     | 
    
         
            +
                  92 => "ENOPROTOOPT",
         
     | 
| 
      
 154 
     | 
    
         
            +
                  93 => "EPROTONOSUPPORT",
         
     | 
| 
      
 155 
     | 
    
         
            +
                  94 => "ESOCKTNOSUPPORT",
         
     | 
| 
      
 156 
     | 
    
         
            +
                  95 => "EOPNOTSUPP",
         
     | 
| 
      
 157 
     | 
    
         
            +
                  96 => "EPFNOSUPPORT",
         
     | 
| 
      
 158 
     | 
    
         
            +
                  97 => "EAFNOSUPPORT",
         
     | 
| 
      
 159 
     | 
    
         
            +
                  98 => "EADDRINUSE",
         
     | 
| 
      
 160 
     | 
    
         
            +
                  99 => "EADDRNOTAVAIL",
         
     | 
| 
      
 161 
     | 
    
         
            +
                  100 => "ENETDOWN",
         
     | 
| 
      
 162 
     | 
    
         
            +
                  101 => "ENETUNREACH",
         
     | 
| 
      
 163 
     | 
    
         
            +
                  102 => "ENETRESET",
         
     | 
| 
      
 164 
     | 
    
         
            +
                  103 => "ECONNABORTED",
         
     | 
| 
      
 165 
     | 
    
         
            +
                  104 => "ECONNRESET",
         
     | 
| 
      
 166 
     | 
    
         
            +
                  105 => "ENOBUFS",
         
     | 
| 
      
 167 
     | 
    
         
            +
                  106 => "EISCONN",
         
     | 
| 
      
 168 
     | 
    
         
            +
                  107 => "ENOTCONN",
         
     | 
| 
      
 169 
     | 
    
         
            +
                  108 => "ESHUTDOWN",
         
     | 
| 
      
 170 
     | 
    
         
            +
                  109 => "ETOOMANYREFS",
         
     | 
| 
      
 171 
     | 
    
         
            +
                  110 => "ETIMEDOUT",
         
     | 
| 
      
 172 
     | 
    
         
            +
                  111 => "ECONNREFUSED",
         
     | 
| 
      
 173 
     | 
    
         
            +
                  112 => "EHOSTDOWN",
         
     | 
| 
      
 174 
     | 
    
         
            +
                  113 => "EHOSTUNREACH",
         
     | 
| 
      
 175 
     | 
    
         
            +
                  114 => "EALREADY",
         
     | 
| 
      
 176 
     | 
    
         
            +
                  115 => "EINPROGRESS",
         
     | 
| 
      
 177 
     | 
    
         
            +
                  116 => "ESTALE",
         
     | 
| 
      
 178 
     | 
    
         
            +
                  117 => "EUCLEAN",
         
     | 
| 
      
 179 
     | 
    
         
            +
                  118 => "ENOTNAM",
         
     | 
| 
      
 180 
     | 
    
         
            +
                  119 => "ENAVAIL",
         
     | 
| 
      
 181 
     | 
    
         
            +
                  120 => "EISNAM",
         
     | 
| 
      
 182 
     | 
    
         
            +
                  121 => "EREMOTEIO",
         
     | 
| 
      
 183 
     | 
    
         
            +
                  122 => "EDQUOT",
         
     | 
| 
      
 184 
     | 
    
         
            +
                  123 => "ENOMEDIUM",
         
     | 
| 
      
 185 
     | 
    
         
            +
                  124 => "EMEDIUMTYPE",
         
     | 
| 
      
 186 
     | 
    
         
            +
                  125 => "ECANCELED",
         
     | 
| 
      
 187 
     | 
    
         
            +
                  126 => "ENOKEY",
         
     | 
| 
      
 188 
     | 
    
         
            +
                  127 => "EKEYEXPIRED",
         
     | 
| 
      
 189 
     | 
    
         
            +
                  128 => "EKEYREVOKED",
         
     | 
| 
      
 190 
     | 
    
         
            +
                  129 => "EKEYREJECTED",
         
     | 
| 
      
 191 
     | 
    
         
            +
                  130 => "EOWNERDEAD",
         
     | 
| 
      
 192 
     | 
    
         
            +
                  131 => "ENOTRECOVERABLE"
         
     | 
| 
      
 193 
     | 
    
         
            +
                }
         
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
                class Termios < FFI::Struct
         
     | 
| 
      
 196 
     | 
    
         
            +
                  layout  :c_iflag, :uint,
         
     | 
| 
      
 197 
     | 
    
         
            +
                          :c_oflag, :uint,
         
     | 
| 
      
 198 
     | 
    
         
            +
                          :c_cflag, :uint,
         
     | 
| 
      
 199 
     | 
    
         
            +
                          :c_lflag, :uint,
         
     | 
| 
      
 200 
     | 
    
         
            +
                          :c_line, :uchar,
         
     | 
| 
      
 201 
     | 
    
         
            +
                          :cc_c, [ :uchar, NCCS ],
         
     | 
| 
      
 202 
     | 
    
         
            +
                          :c_ispeed, :uint,
         
     | 
| 
      
 203 
     | 
    
         
            +
                          :c_ospeed, :uint
         
     | 
| 
      
 204 
     | 
    
         
            +
                end
         
     | 
| 
      
 205 
     | 
    
         
            +
             
     | 
| 
      
 206 
     | 
    
         
            +
                attach_function :ioctl, [ :int, :ulong, RubySerial::Posix::Termios], :int
         
     | 
| 
      
 207 
     | 
    
         
            +
                attach_function :tcsetattr, [ :int, :int, RubySerial::Posix::Termios ], :int
         
     | 
| 
      
 208 
     | 
    
         
            +
                attach_function :fcntl, [:int, :int, :varargs], :int
         
     | 
| 
      
 209 
     | 
    
         
            +
                attach_function :open, [:pointer, :int], :int
         
     | 
| 
      
 210 
     | 
    
         
            +
                attach_function :close, [:int], :int
         
     | 
| 
      
 211 
     | 
    
         
            +
                attach_function :write, [:int, :pointer,  :int],:int
         
     | 
| 
      
 212 
     | 
    
         
            +
                attach_function :read, [:int, :pointer,  :int],:int
         
     | 
| 
      
 213 
     | 
    
         
            +
              end
         
     | 
| 
      
 214 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,181 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'ffi'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module RubySerial
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Posix
         
     | 
| 
      
 5 
     | 
    
         
            +
              extend FFI::Library
         
     | 
| 
      
 6 
     | 
    
         
            +
                ffi_lib FFI::Library::LIBC
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                O_RDWR = 0x0002
         
     | 
| 
      
 9 
     | 
    
         
            +
                O_NOCTTY = 0x20000
         
     | 
| 
      
 10 
     | 
    
         
            +
                O_NONBLOCK = 0x0004
         
     | 
| 
      
 11 
     | 
    
         
            +
                F_GETFL = 3
         
     | 
| 
      
 12 
     | 
    
         
            +
                F_SETFL = 4
         
     | 
| 
      
 13 
     | 
    
         
            +
                IGNPAR = 0x00000004
         
     | 
| 
      
 14 
     | 
    
         
            +
                VMIN = 16
         
     | 
| 
      
 15 
     | 
    
         
            +
                VTIME = 17
         
     | 
| 
      
 16 
     | 
    
         
            +
                CLOCAL = 0x00008000
         
     | 
| 
      
 17 
     | 
    
         
            +
                CREAD = 0x00000800
         
     | 
| 
      
 18 
     | 
    
         
            +
                TCSANOW = 0
         
     | 
| 
      
 19 
     | 
    
         
            +
                NCCS = 20
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                DATA_BITS = {
         
     | 
| 
      
 22 
     | 
    
         
            +
                  5 => 0x00000000,
         
     | 
| 
      
 23 
     | 
    
         
            +
                  6 => 0x00000100,
         
     | 
| 
      
 24 
     | 
    
         
            +
                  7 => 0x00000200,
         
     | 
| 
      
 25 
     | 
    
         
            +
                  8 => 0x00000300
         
     | 
| 
      
 26 
     | 
    
         
            +
                }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                BAUDE_RATES = {
         
     | 
| 
      
 29 
     | 
    
         
            +
                  0 => 0,
         
     | 
| 
      
 30 
     | 
    
         
            +
                  50 => 50,
         
     | 
| 
      
 31 
     | 
    
         
            +
                  75 => 75,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  110 => 110,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  134 => 134,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  150 => 150,
         
     | 
| 
      
 35 
     | 
    
         
            +
                  200 => 200,
         
     | 
| 
      
 36 
     | 
    
         
            +
                  300 => 300,
         
     | 
| 
      
 37 
     | 
    
         
            +
                  600 => 600,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  1200 => 1200,
         
     | 
| 
      
 39 
     | 
    
         
            +
                  1800 => 1800,
         
     | 
| 
      
 40 
     | 
    
         
            +
                  2400 => 2400,
         
     | 
| 
      
 41 
     | 
    
         
            +
                  4800 => 4800,
         
     | 
| 
      
 42 
     | 
    
         
            +
                  9600 => 9600,
         
     | 
| 
      
 43 
     | 
    
         
            +
                  19200 => 19200,
         
     | 
| 
      
 44 
     | 
    
         
            +
                  38400 => 38400,
         
     | 
| 
      
 45 
     | 
    
         
            +
                  7200 =>  7200,
         
     | 
| 
      
 46 
     | 
    
         
            +
                  14400 => 14400,
         
     | 
| 
      
 47 
     | 
    
         
            +
                  28800 => 28800,
         
     | 
| 
      
 48 
     | 
    
         
            +
                  57600 => 57600,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  76800 => 76800,
         
     | 
| 
      
 50 
     | 
    
         
            +
                  115200 => 115200,
         
     | 
| 
      
 51 
     | 
    
         
            +
                  230400 => 230400
         
     | 
| 
      
 52 
     | 
    
         
            +
                }
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                ERROR_CODES = {
         
     | 
| 
      
 55 
     | 
    
         
            +
                  1 => "EPERM",
         
     | 
| 
      
 56 
     | 
    
         
            +
                  2 => "ENOENT",
         
     | 
| 
      
 57 
     | 
    
         
            +
                  3 => "ESRCH",
         
     | 
| 
      
 58 
     | 
    
         
            +
                  4 => "EINTR",
         
     | 
| 
      
 59 
     | 
    
         
            +
                  5 => "EIO",
         
     | 
| 
      
 60 
     | 
    
         
            +
                  6 => "ENXIO",
         
     | 
| 
      
 61 
     | 
    
         
            +
                  7 => "E2BIG",
         
     | 
| 
      
 62 
     | 
    
         
            +
                  8 => "ENOEXEC",
         
     | 
| 
      
 63 
     | 
    
         
            +
                  9 => "EBADF",
         
     | 
| 
      
 64 
     | 
    
         
            +
                  10 => "ECHILD",
         
     | 
| 
      
 65 
     | 
    
         
            +
                  11 => "EDEADLK",
         
     | 
| 
      
 66 
     | 
    
         
            +
                  12 => "ENOMEM",
         
     | 
| 
      
 67 
     | 
    
         
            +
                  13 => "EACCES",
         
     | 
| 
      
 68 
     | 
    
         
            +
                  14 => "EFAULT",
         
     | 
| 
      
 69 
     | 
    
         
            +
                  15 => "ENOTBLK",
         
     | 
| 
      
 70 
     | 
    
         
            +
                  16 => "EBUSY",
         
     | 
| 
      
 71 
     | 
    
         
            +
                  17 => "EEXIST",
         
     | 
| 
      
 72 
     | 
    
         
            +
                  18 => "EXDEV",
         
     | 
| 
      
 73 
     | 
    
         
            +
                  19 => "ENODEV",
         
     | 
| 
      
 74 
     | 
    
         
            +
                  20 => "ENOTDIR",
         
     | 
| 
      
 75 
     | 
    
         
            +
                  21 => "EISDIR",
         
     | 
| 
      
 76 
     | 
    
         
            +
                  22 => "EINVAL",
         
     | 
| 
      
 77 
     | 
    
         
            +
                  23 => "ENFILE",
         
     | 
| 
      
 78 
     | 
    
         
            +
                  24 => "EMFILE",
         
     | 
| 
      
 79 
     | 
    
         
            +
                  25 => "ENOTTY",
         
     | 
| 
      
 80 
     | 
    
         
            +
                  26 => "ETXTBSY",
         
     | 
| 
      
 81 
     | 
    
         
            +
                  27 => "EFBIG",
         
     | 
| 
      
 82 
     | 
    
         
            +
                  28 => "ENOSPC",
         
     | 
| 
      
 83 
     | 
    
         
            +
                  29 => "ESPIPE",
         
     | 
| 
      
 84 
     | 
    
         
            +
                  30 => "EROFS",
         
     | 
| 
      
 85 
     | 
    
         
            +
                  31 => "EMLINK",
         
     | 
| 
      
 86 
     | 
    
         
            +
                  32 => "EPIPE",
         
     | 
| 
      
 87 
     | 
    
         
            +
                  33 => "EDOM",
         
     | 
| 
      
 88 
     | 
    
         
            +
                  34 => "ERANGE",
         
     | 
| 
      
 89 
     | 
    
         
            +
                  35 => "EAGAIN",
         
     | 
| 
      
 90 
     | 
    
         
            +
                  36 => "EINPROGRESS",
         
     | 
| 
      
 91 
     | 
    
         
            +
                  37 => "EALREADY",
         
     | 
| 
      
 92 
     | 
    
         
            +
                  38 => "ENOTSOCK",
         
     | 
| 
      
 93 
     | 
    
         
            +
                  39 => "EDESTADDRREQ",
         
     | 
| 
      
 94 
     | 
    
         
            +
                  40 => "EMSGSIZE",
         
     | 
| 
      
 95 
     | 
    
         
            +
                  41 => "EPROTOTYPE",
         
     | 
| 
      
 96 
     | 
    
         
            +
                  42 => "ENOPROTOOPT",
         
     | 
| 
      
 97 
     | 
    
         
            +
                  43 => "EPROTONOSUPPORT",
         
     | 
| 
      
 98 
     | 
    
         
            +
                  44 => "ESOCKTNOSUPPORT",
         
     | 
| 
      
 99 
     | 
    
         
            +
                  45 => "ENOTSUP",
         
     | 
| 
      
 100 
     | 
    
         
            +
                  46 => "EPFNOSUPPORT",
         
     | 
| 
      
 101 
     | 
    
         
            +
                  47 => "EAFNOSUPPORT",
         
     | 
| 
      
 102 
     | 
    
         
            +
                  48 => "EADDRINUSE",
         
     | 
| 
      
 103 
     | 
    
         
            +
                  49 => "EADDRNOTAVAIL",
         
     | 
| 
      
 104 
     | 
    
         
            +
                  50 => "ENETDOWN",
         
     | 
| 
      
 105 
     | 
    
         
            +
                  51 => "ENETUNREACH",
         
     | 
| 
      
 106 
     | 
    
         
            +
                  52 => "ENETRESET",
         
     | 
| 
      
 107 
     | 
    
         
            +
                  53 => "ECONNABORTED",
         
     | 
| 
      
 108 
     | 
    
         
            +
                  54 => "ECONNRESET",
         
     | 
| 
      
 109 
     | 
    
         
            +
                  55 => "ENOBUFS",
         
     | 
| 
      
 110 
     | 
    
         
            +
                  56 => "EISCONN",
         
     | 
| 
      
 111 
     | 
    
         
            +
                  57 => "ENOTCONN",
         
     | 
| 
      
 112 
     | 
    
         
            +
                  58 => "ESHUTDOWN",
         
     | 
| 
      
 113 
     | 
    
         
            +
                  59 => "ETOOMANYREFS",
         
     | 
| 
      
 114 
     | 
    
         
            +
                  60 => "ETIMEDOUT",
         
     | 
| 
      
 115 
     | 
    
         
            +
                  61 => "ECONNREFUSED",
         
     | 
| 
      
 116 
     | 
    
         
            +
                  62 => "ELOOP",
         
     | 
| 
      
 117 
     | 
    
         
            +
                  63 => "ENAMETOOLONG",
         
     | 
| 
      
 118 
     | 
    
         
            +
                  64 => "EHOSTDOWN",
         
     | 
| 
      
 119 
     | 
    
         
            +
                  65 => "EHOSTUNREACH",
         
     | 
| 
      
 120 
     | 
    
         
            +
                  66 => "ENOTEMPTY",
         
     | 
| 
      
 121 
     | 
    
         
            +
                  67 => "EPROCLIM",
         
     | 
| 
      
 122 
     | 
    
         
            +
                  68 => "EUSERS",
         
     | 
| 
      
 123 
     | 
    
         
            +
                  69 => "EDQUOT",
         
     | 
| 
      
 124 
     | 
    
         
            +
                  70 => "ESTALE",
         
     | 
| 
      
 125 
     | 
    
         
            +
                  71 => "EREMOTE",
         
     | 
| 
      
 126 
     | 
    
         
            +
                  72 => "EBADRPC",
         
     | 
| 
      
 127 
     | 
    
         
            +
                  73 => "ERPCMISMATCH",
         
     | 
| 
      
 128 
     | 
    
         
            +
                  74 => "EPROGUNAVAIL",
         
     | 
| 
      
 129 
     | 
    
         
            +
                  75 => "EPROGMISMATCH",
         
     | 
| 
      
 130 
     | 
    
         
            +
                  76 => "EPROCUNAVAIL",
         
     | 
| 
      
 131 
     | 
    
         
            +
                  77 => "ENOLCK",
         
     | 
| 
      
 132 
     | 
    
         
            +
                  78 => "ENOSYS",
         
     | 
| 
      
 133 
     | 
    
         
            +
                  79 => "EFTYPE",
         
     | 
| 
      
 134 
     | 
    
         
            +
                  80 => "EAUTH",
         
     | 
| 
      
 135 
     | 
    
         
            +
                  81 => "ENEEDAUTH",
         
     | 
| 
      
 136 
     | 
    
         
            +
                  82 => "EPWROFF",
         
     | 
| 
      
 137 
     | 
    
         
            +
                  83 => "EDEVERR",
         
     | 
| 
      
 138 
     | 
    
         
            +
                  84 => "EOVERFLOW",
         
     | 
| 
      
 139 
     | 
    
         
            +
                  85 => "EBADEXEC",
         
     | 
| 
      
 140 
     | 
    
         
            +
                  86 => "EBADARCH",
         
     | 
| 
      
 141 
     | 
    
         
            +
                  87 => "ESHLIBVERS",
         
     | 
| 
      
 142 
     | 
    
         
            +
                  88 => "EBADMACHO",
         
     | 
| 
      
 143 
     | 
    
         
            +
                  89 => "ECANCELED",
         
     | 
| 
      
 144 
     | 
    
         
            +
                  90 => "EIDRM",
         
     | 
| 
      
 145 
     | 
    
         
            +
                  91 => "ENOMSG",
         
     | 
| 
      
 146 
     | 
    
         
            +
                  92 => "EILSEQ",
         
     | 
| 
      
 147 
     | 
    
         
            +
                  93 => "ENOATTR",
         
     | 
| 
      
 148 
     | 
    
         
            +
                  94 => "EBADMSG",
         
     | 
| 
      
 149 
     | 
    
         
            +
                  95 => "EMULTIHOP",
         
     | 
| 
      
 150 
     | 
    
         
            +
                  96 => "ENODATA",
         
     | 
| 
      
 151 
     | 
    
         
            +
                  97 => "ENOLINK",
         
     | 
| 
      
 152 
     | 
    
         
            +
                  98 => "ENOSR",
         
     | 
| 
      
 153 
     | 
    
         
            +
                  99 => "ENOSTR",
         
     | 
| 
      
 154 
     | 
    
         
            +
                  100 => "EPROTO",
         
     | 
| 
      
 155 
     | 
    
         
            +
                  101 => "ETIME",
         
     | 
| 
      
 156 
     | 
    
         
            +
                  102 => "EOPNOTSUPP",
         
     | 
| 
      
 157 
     | 
    
         
            +
                  103 => "ENOPOLICY",
         
     | 
| 
      
 158 
     | 
    
         
            +
                  104 => "ENOTRECOVERABLE",
         
     | 
| 
      
 159 
     | 
    
         
            +
                  105 => "EOWNERDEAD",
         
     | 
| 
      
 160 
     | 
    
         
            +
                  106 => "ELAST"
         
     | 
| 
      
 161 
     | 
    
         
            +
                }
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
                class Termios < FFI::Struct
         
     | 
| 
      
 164 
     | 
    
         
            +
                  layout  :c_iflag, :ulong,
         
     | 
| 
      
 165 
     | 
    
         
            +
                          :c_oflag, :ulong,
         
     | 
| 
      
 166 
     | 
    
         
            +
                          :c_cflag, :ulong,
         
     | 
| 
      
 167 
     | 
    
         
            +
                          :c_lflag, :ulong,
         
     | 
| 
      
 168 
     | 
    
         
            +
                          :c_line, :uchar,
         
     | 
| 
      
 169 
     | 
    
         
            +
                          :cc_c, [ :uchar, NCCS ],
         
     | 
| 
      
 170 
     | 
    
         
            +
                          :c_ispeed, :ulong,
         
     | 
| 
      
 171 
     | 
    
         
            +
                          :c_ospeed, :ulong
         
     | 
| 
      
 172 
     | 
    
         
            +
                end
         
     | 
| 
      
 173 
     | 
    
         
            +
             
     | 
| 
      
 174 
     | 
    
         
            +
                attach_function :tcsetattr, [ :int, :int, RubySerial::Posix::Termios ], :int
         
     | 
| 
      
 175 
     | 
    
         
            +
                attach_function :fcntl, [:int, :int, :varargs], :int
         
     | 
| 
      
 176 
     | 
    
         
            +
                attach_function :open, [:pointer, :int], :int
         
     | 
| 
      
 177 
     | 
    
         
            +
                attach_function :close, [:int], :int
         
     | 
| 
      
 178 
     | 
    
         
            +
                attach_function :write, [:int, :pointer,  :int],:int
         
     | 
| 
      
 179 
     | 
    
         
            +
                attach_function :read, [:int, :pointer,  :int],:int
         
     | 
| 
      
 180 
     | 
    
         
            +
              end
         
     | 
| 
      
 181 
     | 
    
         
            +
            end
         
     |