prologix_gpib 0.5.0 → 0.5.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.
- checksums.yaml +4 -4
- data/.tool-versions +1 -1
- data/Gemfile.lock +6 -6
- data/NetFinder_info.md +30 -0
- data/README.md +23 -9
- data/lib/prologix_gpib/cli.rb +22 -12
- data/lib/prologix_gpib/{usb/commands.rb → commands.rb} +18 -32
- data/lib/prologix_gpib/discovery.rb +14 -6
- data/lib/prologix_gpib/lan.rb +49 -4
- data/lib/prologix_gpib/usb.rb +21 -11
- data/lib/prologix_gpib/version.rb +1 -1
- data/lib/prologix_gpib.rb +7 -4
- metadata +5 -6
- data/lib/prologix_gpib/lan/commands.rb +0 -2
- data/udp_info.md +0 -30
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d9ad45cfaf230b41f26ec6102bb89f34b36f8a6f38439b96a578ae4f9b338a87
         | 
| 4 | 
            +
              data.tar.gz: 336106999abd44891bc67b872fe45c8bf222356725675b90321409aee3a0e751
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ee481f80d7bb2e9d3e62cdeb2c86e69b5a73422f93387e133c4837329ec08b3df429c92cc6cc2035ea2d3227b82d6d5a2b4858bb5af83f12358e988f8efe4173
         | 
| 7 | 
            +
              data.tar.gz: e21355fd8937ebfbbf368838b84fe6143bf0e08c82c05a98b035e897277bdb3ceabe7a78d075b780d70fe48dcb3c9ab16806dade3bcd14e9b597d336f3b65767
         | 
    
        data/.tool-versions
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            ruby 3.1. | 
| 1 | 
            +
            ruby 3.1.2
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                prologix_gpib (0. | 
| 4 | 
            +
                prologix_gpib (0.5.0)
         | 
| 5 5 | 
             
                  activesupport (~> 7.0.1)
         | 
| 6 6 | 
             
                  bindata (~> 2.4.10)
         | 
| 7 7 | 
             
                  rubyserial (~> 0.6.0)
         | 
| @@ -11,19 +11,19 @@ PATH | |
| 11 11 | 
             
            GEM
         | 
| 12 12 | 
             
              remote: https://rubygems.org/
         | 
| 13 13 | 
             
              specs:
         | 
| 14 | 
            -
                activesupport (7.0. | 
| 14 | 
            +
                activesupport (7.0.3)
         | 
| 15 15 | 
             
                  concurrent-ruby (~> 1.0, >= 1.0.2)
         | 
| 16 16 | 
             
                  i18n (>= 1.6, < 2)
         | 
| 17 17 | 
             
                  minitest (>= 5.1)
         | 
| 18 18 | 
             
                  tzinfo (~> 2.0)
         | 
| 19 19 | 
             
                bindata (2.4.10)
         | 
| 20 20 | 
             
                coderay (1.1.3)
         | 
| 21 | 
            -
                concurrent-ruby (1.1. | 
| 21 | 
            +
                concurrent-ruby (1.1.10)
         | 
| 22 22 | 
             
                ffi (1.15.5)
         | 
| 23 | 
            -
                i18n (1. | 
| 23 | 
            +
                i18n (1.10.0)
         | 
| 24 24 | 
             
                  concurrent-ruby (~> 1.0)
         | 
| 25 25 | 
             
                method_source (1.0.0)
         | 
| 26 | 
            -
                minitest (5. | 
| 26 | 
            +
                minitest (5.16.1)
         | 
| 27 27 | 
             
                pry (0.14.1)
         | 
| 28 28 | 
             
                  coderay (~> 1.1)
         | 
| 29 29 | 
             
                  method_source (~> 1.0)
         | 
| @@ -47,4 +47,4 @@ DEPENDENCIES | |
| 47 47 | 
             
              rake (~> 10.0)
         | 
| 48 48 |  | 
| 49 49 | 
             
            BUNDLED WITH
         | 
| 50 | 
            -
               2. | 
| 50 | 
            +
               2.3.16
         | 
    
        data/NetFinder_info.md
    ADDED
    
    | @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            # Net Finder
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            NetFinder, uses UDP broadcast to locate and configure GPIB-ETH controllers on a network.
         | 
| 4 | 
            +
            You can find an implementation of the protocol in the nfcli utility
         | 
| 5 | 
            +
            http://prologix.biz/downloads/nfcli.tar.gz
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ### Discovery
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            - Create NF_IDENTIFY packet.
         | 
| 10 | 
            +
            - Set sequence to a random value
         | 
| 11 | 
            +
            - Set eth_addr to all ones
         | 
| 12 | 
            +
            - Broadcast NF_IDENTIFY datagram to port 3040/UDP.
         | 
| 13 | 
            +
            - Listen for NF_IDENTIFY_REPLY datagrams.
         | 
| 14 | 
            +
            - Verify sequence matches NF_IDENTIFY packet
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ### Configuration
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            - Create NF_ASSIGNMENT packet
         | 
| 19 | 
            +
            - Set sequence to a random value
         | 
| 20 | 
            +
            - Set eth_addr to MAC address of desired device Set ip_type to NF_IP_DYNAMIC or NF_IP_STATIC If ip_type is NF_IP_DYNAMIC specify ip, mask and gateway addresses.
         | 
| 21 | 
            +
            - Broadcast NF\* ASSIGNMENT datagram to port 3040/UDP.
         | 
| 22 | 
            +
            - Listen for NF_ASSIGNMENT_REPLY datagrams.
         | 
| 23 | 
            +
            - Verify sequence matches that of NF_ASSIGNMENT packet Check result field for NF_SUCCESS
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            Notes:
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            1. You may get multiple replies. Discard duplicate replies.
         | 
| 28 | 
            +
            2. All multi-byte values are in network order (big-endian)
         | 
| 29 | 
            +
            3. On multi-homed hosts, make sure broadcasts go out over all interfaces.
         | 
| 30 | 
            +
            4. NetFinder protocol only works within the same subnet as routers will not forward UDP broadcast packets.
         | 
    
        data/README.md
    CHANGED
    
    | @@ -28,14 +28,16 @@ The gem comes with a simple cli for finding controllers: | |
| 28 28 |  | 
| 29 29 | 
             
            ```bash
         | 
| 30 30 | 
             
            $ plx list
         | 
| 31 | 
            -
             | 
| 32 | 
            -
            | | 
| 33 | 
            -
             | 
| 34 | 
            -
            | index | Controller | 
| 35 | 
            -
             | 
| 36 | 
            -
            | 0     | Prologix GPIB-USB Controller | 
| 37 | 
            -
            | 1     | Prologix GPIB-USB Controller | 
| 38 | 
            -
             | 
| 31 | 
            +
            +-----------------------------------------------------------------------------------------+
         | 
| 32 | 
            +
            |                                   Prologix Controllers                                  |
         | 
| 33 | 
            +
            +-------+------------------------------------+--------------+-----------------------------+
         | 
| 34 | 
            +
            | index | Controller                         | Version      | Location                    |
         | 
| 35 | 
            +
            +-------+------------------------------------+--------------+-----------------------------+
         | 
| 36 | 
            +
            | 0     | Prologix GPIB-USB Controller       |  6.101       | /dev/tty.usbserial-PX9HPBMB |
         | 
| 37 | 
            +
            | 1     | Prologix GPIB-USB Controller       |  6.107       | /dev/tty.usbserial-PXEGWA9A |
         | 
| 38 | 
            +
            | 2     | Prologix GPIB-LAN Controller       |  01.03.00.00 | 192.168.10.161              |
         | 
| 39 | 
            +
            | 3     | Prologix GPIB-ETHERNET Controller  |  01.06.06.00 | 192.168.10.127              |
         | 
| 40 | 
            +
            +-------+------------------------------------+--------------+-----------------------------+
         | 
| 39 41 |  | 
| 40 42 | 
             
            $ plx info 0
         | 
| 41 43 |  | 
| @@ -50,6 +52,18 @@ $ plx info 0 | |
| 50 52 | 
             
            	EOS: Append CR+LF
         | 
| 51 53 | 
             
            	EOT: Enabled
         | 
| 52 54 |  | 
| 55 | 
            +
            plx info 3
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              Prologix gpib-ethernet controller
         | 
| 58 | 
            +
            	Path: 192.168.10.127
         | 
| 59 | 
            +
            	Firmware: 01.06.06.00
         | 
| 60 | 
            +
            	Mode: Controller
         | 
| 61 | 
            +
            	Device Address: 5
         | 
| 62 | 
            +
            	Auto Read: Enabled
         | 
| 63 | 
            +
            	Read Timeout: 500
         | 
| 64 | 
            +
            	Eoi Assertion: Enabled
         | 
| 65 | 
            +
            	Eos: Append CR+LF
         | 
| 66 | 
            +
            	Eot: Disabled
         | 
| 53 67 | 
             
            ```
         | 
| 54 68 |  | 
| 55 69 | 
             
            ### Finding Controllers
         | 
| @@ -67,7 +81,7 @@ irb(main):002:0> controllers = f.avaliable_controllers | |
| 67 81 |  | 
| 68 82 | 
             
            ### Working with Controllers
         | 
| 69 83 |  | 
| 70 | 
            -
            I'm not enamoured by this interface, I'd like a more ruby like way of finding and connecting controllers thats less clunky. It works for now, but may change as we refine  | 
| 84 | 
            +
            I'm not enamoured by this interface, I'd like a more ruby like way of finding and connecting controllers thats less clunky. It works for now, but may change as we refine things.
         | 
| 71 85 |  | 
| 72 86 | 
             
            ```ruby
         | 
| 73 87 | 
             
            irb(main):003:0> device = PrologixGpib::UsbController.new(controllers[:usb][0])
         | 
    
        data/lib/prologix_gpib/cli.rb
    CHANGED
    
    | @@ -2,28 +2,34 @@ require 'thor' | |
| 2 2 | 
             
            require 'pp'
         | 
| 3 3 | 
             
            require 'prologix_gpib'
         | 
| 4 4 | 
             
            require 'terminal-table'
         | 
| 5 | 
            +
            require 'resolv'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module PrologixGpib
         | 
| 7 8 | 
             
              class CLI < Thor
         | 
| 9 | 
            +
                def initialize(*args)
         | 
| 10 | 
            +
                  super
         | 
| 11 | 
            +
                  @controllers = PrologixGpib::Finder.new.avaliable_controllers
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 8 14 | 
             
                desc 'list', 'List all connected controllers'
         | 
| 9 15 |  | 
| 10 16 | 
             
                def list
         | 
| 11 | 
            -
                  puts controller_table( | 
| 17 | 
            +
                  puts controller_table(@controllers)
         | 
| 12 18 | 
             
                end
         | 
| 13 19 |  | 
| 14 | 
            -
                desc 'info', 'Display Controller information'
         | 
| 15 | 
            -
                option :path,  | 
| 16 | 
            -
                def info
         | 
| 20 | 
            +
                desc 'info [INDEX]', 'Display Controller information'
         | 
| 21 | 
            +
                option :path, aliases: :p
         | 
| 22 | 
            +
                def info(index)
         | 
| 17 23 | 
             
                  return unless controllers_connected?
         | 
| 18 24 |  | 
| 19 | 
            -
                   | 
| 25 | 
            +
                  controller_paths = @controllers.map { |k, v| v }.flatten
         | 
| 20 26 |  | 
| 21 | 
            -
                   | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                   | 
| 27 | 
            +
                  path = controller_paths[index.to_i]
         | 
| 28 | 
            +
                  hash = ip_address?(path) ? PrologixGpib::LanController.new(path).config : PrologixGpib::UsbController.new(path).config
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  puts "\n  #{titleise hash.delete(:device_name)}"
         | 
| 31 | 
            +
                  puts "\tPath: #{path}"
         | 
| 32 | 
            +
                  hash.each { |k, v| puts "\t#{titleise(k)}: #{v}" }
         | 
| 27 33 | 
             
                end
         | 
| 28 34 |  | 
| 29 35 | 
             
                private
         | 
| @@ -59,11 +65,15 @@ module PrologixGpib | |
| 59 65 | 
             
                end
         | 
| 60 66 |  | 
| 61 67 | 
             
                def controllers_connected?
         | 
| 62 | 
            -
                   | 
| 68 | 
            +
                  @controllers[:usb].any? || @controllers[:lan].any?
         | 
| 63 69 | 
             
                end
         | 
| 64 70 |  | 
| 65 71 | 
             
                def titleise(string)
         | 
| 66 72 | 
             
                  string.to_s.split('_').map(&:capitalize).join(' ')
         | 
| 67 73 | 
             
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                def ip_address?(string)
         | 
| 76 | 
            +
                  string =~ Resolv::IPv4::Regex ? true : false
         | 
| 77 | 
            +
                end
         | 
| 68 78 | 
             
              end
         | 
| 69 79 | 
             
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            module PrologixGpib:: | 
| 1 | 
            +
            module PrologixGpib::Commands
         | 
| 2 2 | 
             
              def config
         | 
| 3 3 | 
             
                error_message = 'Error'
         | 
| 4 4 | 
             
                device_version = version.split('version').map(&:strip)
         | 
| @@ -40,7 +40,7 @@ module PrologixGpib::Usb::Commands | |
| 40 40 | 
             
                conf
         | 
| 41 41 | 
             
              end
         | 
| 42 42 |  | 
| 43 | 
            -
              #  This command configures the Prologix GPIB-USB controller to be a :controller or :device.
         | 
| 43 | 
            +
              #   #  This command configures the Prologix GPIB-USB controller to be a :controller or :device.
         | 
| 44 44 | 
             
              def mode=(op_mode)
         | 
| 45 45 | 
             
                mode =
         | 
| 46 46 | 
             
                  case op_mode
         | 
| @@ -60,8 +60,8 @@ module PrologixGpib::Usb::Commands | |
| 60 60 | 
             
              end
         | 
| 61 61 | 
             
              alias operation_mode mode
         | 
| 62 62 |  | 
| 63 | 
            -
              # Timeout value, in milliseconds, used in the read command and spoll command.
         | 
| 64 | 
            -
              # Any value between 1 and 3000 milliseconds.
         | 
| 63 | 
            +
              # # Timeout value, in milliseconds, used in the read command and spoll command.
         | 
| 64 | 
            +
              # # Any value between 1 and 3000 milliseconds.
         | 
| 65 65 | 
             
              def timeout=(milliseconds)
         | 
| 66 66 | 
             
                return unless connected? || milliseconds.class != Integer
         | 
| 67 67 |  | 
| @@ -72,8 +72,8 @@ module PrologixGpib::Usb::Commands | |
| 72 72 | 
             
                device_query('++read_tmo_ms')
         | 
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
| 75 | 
            -
              # PrologixGPIB-USB controller can be configured to automatically address instruments to 'talk' after sending a command in order to read the response.
         | 
| 76 | 
            -
              # *** Avaliable in Controller mode. When enabled can cause the prologix controller to lockup. ***
         | 
| 75 | 
            +
              # # PrologixGPIB-USB controller can be configured to automatically address instruments to 'talk' after sending a command in order to read the response.
         | 
| 76 | 
            +
              # # *** Avaliable in Controller mode. When enabled can cause the prologix controller to lockup. ***
         | 
| 77 77 | 
             
              def auto=(auto_mode)
         | 
| 78 78 | 
             
                mode =
         | 
| 79 79 | 
             
                  case auto_mode
         | 
| @@ -93,8 +93,8 @@ module PrologixGpib::Usb::Commands | |
| 93 93 | 
             
              end
         | 
| 94 94 | 
             
              alias auto_read_after_write auto
         | 
| 95 95 |  | 
| 96 | 
            -
              # In :controller mode, address refers to the GPIB address of the instrument being controlled.
         | 
| 97 | 
            -
              # In :device mode, it is the address of the GPIB peripheral that Prologix GPIB-USB controller is emulating.
         | 
| 96 | 
            +
              # # In :controller mode, address refers to the GPIB address of the instrument being controlled.
         | 
| 97 | 
            +
              # # In :device mode, it is the address of the GPIB peripheral that Prologix GPIB-USB controller is emulating.
         | 
| 98 98 | 
             
              def address=(addr)
         | 
| 99 99 | 
             
                write("++addr #{addr}")
         | 
| 100 100 | 
             
              end
         | 
| @@ -104,8 +104,8 @@ module PrologixGpib::Usb::Commands | |
| 104 104 | 
             
                device_query('++addr')
         | 
| 105 105 | 
             
              end
         | 
| 106 106 |  | 
| 107 | 
            -
              # This command enables or disables the assertion of the EOI signal with the last character of any command sent over GPIB port.
         | 
| 108 | 
            -
              # Some instruments require EOI signal to be asserted in order to properly detect the end of a command.
         | 
| 107 | 
            +
              # # This command enables or disables the assertion of the EOI signal with the last character of any command sent over GPIB port.
         | 
| 108 | 
            +
              # # Some instruments require EOI signal to be asserted in order to properly detect the end of a command.
         | 
| 109 109 | 
             
              def eoi=(eoi_mode)
         | 
| 110 110 | 
             
                mode =
         | 
| 111 111 | 
             
                  case eoi_mode
         | 
| @@ -123,13 +123,13 @@ module PrologixGpib::Usb::Commands | |
| 123 123 | 
             
                device_query('++eoi')
         | 
| 124 124 | 
             
              end
         | 
| 125 125 |  | 
| 126 | 
            -
              # This command specifies GPIB termination characters. When data from host is received over USB, all non-escaped LF, CR and ESC characters are removed and GPIB terminators, as specified by this command, are appended before sending the data to instruments.
         | 
| 127 | 
            -
              # This command does not affect data from instruments received over GPIB port.
         | 
| 128 | 
            -
              # EXAMPLES:
         | 
| 129 | 
            -
              # 0 Append CR+LF
         | 
| 130 | 
            -
              # 1 Append CR to instrument commands
         | 
| 131 | 
            -
              # 2 Append LF to instrument commands
         | 
| 132 | 
            -
              # 3 Do not append anything to instrument commands
         | 
| 126 | 
            +
              # # This command specifies GPIB termination characters. When data from host is received over USB, all non-escaped LF, CR and ESC characters are removed and GPIB terminators, as specified by this command, are appended before sending the data to instruments.
         | 
| 127 | 
            +
              # # This command does not affect data from instruments received over GPIB port.
         | 
| 128 | 
            +
              # # EXAMPLES:
         | 
| 129 | 
            +
              # # 0 Append CR+LF
         | 
| 130 | 
            +
              # # 1 Append CR to instrument commands
         | 
| 131 | 
            +
              # # 2 Append LF to instrument commands
         | 
| 132 | 
            +
              # # 3 Do not append anything to instrument commands
         | 
| 133 133 | 
             
              def eos=(eos_mode)
         | 
| 134 134 | 
             
                error_message = "Invalid arg: '#{eos_mode}'"
         | 
| 135 135 | 
             
                raise ArgumentError, error_message unless [0, 1, 2, 3].include? eos_mode
         | 
| @@ -141,7 +141,7 @@ module PrologixGpib::Usb::Commands | |
| 141 141 | 
             
                device_query('++eos')
         | 
| 142 142 | 
             
              end
         | 
| 143 143 |  | 
| 144 | 
            -
              # This command enables or disables the appending of a user specified character (see eot_char) to USB output whenever EOI is detected while reading a character from the GPIBport.
         | 
| 144 | 
            +
              # # This command enables or disables the appending of a user specified character (see eot_char) to USB output whenever EOI is detected while reading a character from the GPIBport.
         | 
| 145 145 | 
             
              def eot=(eot_mode)
         | 
| 146 146 | 
             
                mode =
         | 
| 147 147 | 
             
                  case eot_mode
         | 
| @@ -186,18 +186,4 @@ module PrologixGpib::Usb::Commands | |
| 186 186 | 
             
              def reset
         | 
| 187 187 | 
             
                write('++rst')
         | 
| 188 188 | 
             
              end
         | 
| 189 | 
            -
             | 
| 190 | 
            -
              def flush
         | 
| 191 | 
            -
                return unless connected?
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                loop until serial_port.getbyte.nil?
         | 
| 194 | 
            -
              end
         | 
| 195 | 
            -
             | 
| 196 | 
            -
              private
         | 
| 197 | 
            -
             | 
| 198 | 
            -
              def device_query(command)
         | 
| 199 | 
            -
                flush
         | 
| 200 | 
            -
                write(command)
         | 
| 201 | 
            -
                readline
         | 
| 202 | 
            -
              end
         | 
| 203 189 | 
             
            end
         | 
| @@ -60,7 +60,6 @@ module PrologixGpib::Discovery | |
| 60 60 | 
             
                string :app_ver, read_length: 4
         | 
| 61 61 | 
             
                string :boot_ver, read_length: 4
         | 
| 62 62 | 
             
                string :hw_ver, read_length: 4
         | 
| 63 | 
            -
                stringz :name
         | 
| 64 63 | 
             
              end
         | 
| 65 64 |  | 
| 66 65 | 
             
              NF_MAGIC = 0x5a
         | 
| @@ -69,7 +68,7 @@ module PrologixGpib::Discovery | |
| 69 68 | 
             
              NF_IDENTIFY_REPLY = 1
         | 
| 70 69 | 
             
              BROADCAST_PORT = 3040
         | 
| 71 70 | 
             
              BROADCAST_ADDRESS = '255.255.255.255'
         | 
| 72 | 
            -
              TIMEOUT =  | 
| 71 | 
            +
              TIMEOUT = 0.5
         | 
| 73 72 |  | 
| 74 73 | 
             
              private
         | 
| 75 74 |  | 
| @@ -90,16 +89,25 @@ module PrologixGpib::Discovery | |
| 90 89 |  | 
| 91 90 | 
             
                sock.send(data.to_binary_s, 0, BROADCAST_ADDRESS, BROADCAST_PORT)
         | 
| 92 91 | 
             
                array = []
         | 
| 92 | 
            +
                replies = []
         | 
| 93 93 | 
             
                begin
         | 
| 94 94 | 
             
                  Timeout.timeout(TIMEOUT) do
         | 
| 95 95 | 
             
                    while true
         | 
| 96 | 
            -
                      data, addr = sock.recvfrom( | 
| 97 | 
            -
                       | 
| 98 | 
            -
                      next if array.include?(reply.addr)
         | 
| 99 | 
            -
                      array << reply.addr if reply.header.seq == seq && reply.header.identify == NF_IDENTIFY_REPLY
         | 
| 96 | 
            +
                      data, addr = sock.recvfrom(1000)
         | 
| 97 | 
            +
                      replies << data
         | 
| 100 98 | 
             
                    end
         | 
| 101 99 | 
             
                  end
         | 
| 102 100 | 
             
                rescue Timeout::Error
         | 
| 101 | 
            +
                  replies.each do |data|
         | 
| 102 | 
            +
                    begin
         | 
| 103 | 
            +
                      reply = NFIdentifyReply.read(data)
         | 
| 104 | 
            +
                    rescue EOFError
         | 
| 105 | 
            +
                      # About 1% of responses are not always as expected from the controller
         | 
| 106 | 
            +
                      next
         | 
| 107 | 
            +
                    end
         | 
| 108 | 
            +
                    next if array.include?(reply.addr)
         | 
| 109 | 
            +
                    array << reply.addr if reply.header.seq == seq && reply.header.identify == NF_IDENTIFY_REPLY
         | 
| 110 | 
            +
                  end
         | 
| 103 111 | 
             
                  sock.close
         | 
| 104 112 | 
             
                  array
         | 
| 105 113 | 
             
                end
         | 
    
        data/lib/prologix_gpib/lan.rb
    CHANGED
    
    | @@ -1,12 +1,14 @@ | |
| 1 | 
            +
            require 'timeout'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module PrologixGpib::Lan
         | 
| 2 4 | 
             
              class Error < StandardError
         | 
| 3 5 | 
             
              end
         | 
| 4 6 |  | 
| 5 7 | 
             
              DEVICE_PORT = 1234
         | 
| 6 | 
            -
              EOL = "\r\n"
         | 
| 8 | 
            +
              EOL = "\r\n".freeze
         | 
| 7 9 |  | 
| 8 10 | 
             
              def initialize(ip, mode: :controller, address: 9)
         | 
| 9 | 
            -
                 | 
| 11 | 
            +
                open_socket(ip)
         | 
| 10 12 |  | 
| 11 13 | 
             
                # open_serial_port(paths)
         | 
| 12 14 | 
             
                # flush
         | 
| @@ -18,8 +20,51 @@ module PrologixGpib::Lan | |
| 18 20 | 
             
                yield self if block_given?
         | 
| 19 21 | 
             
              end
         | 
| 20 22 |  | 
| 21 | 
            -
              def  | 
| 22 | 
            -
                 | 
| 23 | 
            +
              def write(command)
         | 
| 24 | 
            +
                return unless connected?
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                @socket.send "#{command}#{EOL}", 0
         | 
| 27 | 
            +
                sleep 0.1
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def read
         | 
| 31 | 
            +
                return unless connected?
         | 
| 32 | 
            +
             | 
| 23 33 | 
             
                @socket.gets.chomp
         | 
| 24 34 | 
             
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              private
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              def open_socket(ip)
         | 
| 39 | 
            +
                @socket = TCPSocket.new ip, DEVICE_PORT
         | 
| 40 | 
            +
                write('++ver')
         | 
| 41 | 
            +
                return if getline.include? 'Prologix'
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                raise Error, 'No Prologix LAN controllers found.'
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              def connected?
         | 
| 47 | 
            +
                raise Error, 'ConnectionError: No open Prologix device connections.' if @socket.nil?
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                true
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              def readline
         | 
| 53 | 
            +
                return unless connected?
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                t = Timeout.timeout(1, Timeout::Error, "No response from device at #{@socket.peeraddr[3]}") { getline }
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              # This method will block until the EOL terminator is received
         | 
| 59 | 
            +
              # The lower level gets method is pure ruby, so can be safely used with Timeout.
         | 
| 60 | 
            +
              def getline
         | 
| 61 | 
            +
                return unless connected?
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                @socket.gets(EOL).chomp
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              def device_query(command)
         | 
| 67 | 
            +
                write(command)
         | 
| 68 | 
            +
                readline
         | 
| 69 | 
            +
              end
         | 
| 25 70 | 
             
            end
         | 
    
        data/lib/prologix_gpib/usb.rb
    CHANGED
    
    | @@ -9,8 +9,7 @@ module PrologixGpib::Usb | |
| 9 9 | 
             
              attr_reader :serial_port
         | 
| 10 10 |  | 
| 11 11 | 
             
              def initialize(path, mode: :controller, address: 9)
         | 
| 12 | 
            -
                 | 
| 13 | 
            -
                open_serial_port(paths)
         | 
| 12 | 
            +
                open_serial_port(path)
         | 
| 14 13 | 
             
                flush
         | 
| 15 14 | 
             
                self.mode = mode
         | 
| 16 15 | 
             
                self.address = address
         | 
| @@ -28,10 +27,10 @@ module PrologixGpib::Usb | |
| 28 27 | 
             
                @serial_port.nil?
         | 
| 29 28 | 
             
              end
         | 
| 30 29 |  | 
| 31 | 
            -
              def write( | 
| 30 | 
            +
              def write(string)
         | 
| 32 31 | 
             
                return unless connected?
         | 
| 33 32 |  | 
| 34 | 
            -
                @serial_port.write("#{ | 
| 33 | 
            +
                @serial_port.write("#{string}#{EOL}")
         | 
| 35 34 | 
             
              end
         | 
| 36 35 |  | 
| 37 36 | 
             
              def read(bytes)
         | 
| @@ -43,7 +42,7 @@ module PrologixGpib::Usb | |
| 43 42 | 
             
              def readline
         | 
| 44 43 | 
             
                return unless connected?
         | 
| 45 44 |  | 
| 46 | 
            -
                t = Timeout.timeout(1, Timeout::Error, 'No response from  | 
| 45 | 
            +
                t = Timeout.timeout(1, Timeout::Error, 'No response from device') { getline }
         | 
| 47 46 | 
             
              end
         | 
| 48 47 |  | 
| 49 48 | 
             
              def sr(register = nil)
         | 
| @@ -57,12 +56,11 @@ module PrologixGpib::Usb | |
| 57 56 |  | 
| 58 57 | 
             
              private
         | 
| 59 58 |  | 
| 60 | 
            -
              def open_serial_port( | 
| 61 | 
            -
                 | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
                end
         | 
| 59 | 
            +
              def open_serial_port(path)
         | 
| 60 | 
            +
                @serial_port = Serial.new(path)
         | 
| 61 | 
            +
                write('++ver')
         | 
| 62 | 
            +
                return if getline.include? 'Prologix'
         | 
| 63 | 
            +
             | 
| 66 64 | 
             
                raise Error, 'No Prologix USB controllers found.'
         | 
| 67 65 | 
             
              end
         | 
| 68 66 |  | 
| @@ -72,6 +70,12 @@ module PrologixGpib::Usb | |
| 72 70 | 
             
                true
         | 
| 73 71 | 
             
              end
         | 
| 74 72 |  | 
| 73 | 
            +
              def flush
         | 
| 74 | 
            +
                return unless connected?
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                loop until serial_port.getbyte.nil?
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 75 79 | 
             
              # This method will block until the EOL terminator is received
         | 
| 76 80 | 
             
              # The lower level gets method is pure ruby, so can be safely used with Timeout.
         | 
| 77 81 | 
             
              def getline
         | 
| @@ -79,4 +83,10 @@ module PrologixGpib::Usb | |
| 79 83 |  | 
| 80 84 | 
             
                @serial_port.gets(EOL).chomp
         | 
| 81 85 | 
             
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              def device_query(command)
         | 
| 88 | 
            +
                flush
         | 
| 89 | 
            +
                write(command)
         | 
| 90 | 
            +
                readline
         | 
| 91 | 
            +
              end
         | 
| 82 92 | 
             
            end
         | 
    
        data/lib/prologix_gpib.rb
    CHANGED
    
    | @@ -3,21 +3,24 @@ | |
| 3 3 | 
             
            require 'rubyserial'
         | 
| 4 4 | 
             
            require 'prologix_gpib/version'
         | 
| 5 5 | 
             
            require 'prologix_gpib/lan'
         | 
| 6 | 
            -
            require 'prologix_gpib/lan/commands'
         | 
| 7 6 | 
             
            require 'prologix_gpib/usb'
         | 
| 8 | 
            -
            require 'prologix_gpib/ | 
| 7 | 
            +
            require 'prologix_gpib/commands'
         | 
| 9 8 | 
             
            require 'prologix_gpib/discovery'
         | 
| 10 9 | 
             
            require 'prologix_gpib/cli'
         | 
| 11 10 |  | 
| 12 11 | 
             
            module PrologixGpib
         | 
| 13 12 | 
             
              class UsbController
         | 
| 13 | 
            +
                def test
         | 
| 14 | 
            +
                  puts 'testing'
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 14 17 | 
             
                include PrologixGpib::Usb
         | 
| 15 | 
            -
                include PrologixGpib:: | 
| 18 | 
            +
                include PrologixGpib::Commands
         | 
| 16 19 | 
             
              end
         | 
| 17 20 |  | 
| 18 21 | 
             
              class LanController
         | 
| 19 22 | 
             
                include PrologixGpib::Lan
         | 
| 20 | 
            -
                include PrologixGpib:: | 
| 23 | 
            +
                include PrologixGpib::Commands
         | 
| 21 24 | 
             
              end
         | 
| 22 25 |  | 
| 23 26 | 
             
              class Finder
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: prologix_gpib
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.5. | 
| 4 | 
            +
              version: 0.5.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Rob Carruthers
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022- | 
| 11 | 
            +
            date: 2022-06-23 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activesupport
         | 
| @@ -121,6 +121,7 @@ files: | |
| 121 121 | 
             
            - ".tool-versions"
         | 
| 122 122 | 
             
            - Gemfile
         | 
| 123 123 | 
             
            - Gemfile.lock
         | 
| 124 | 
            +
            - NetFinder_info.md
         | 
| 124 125 | 
             
            - PrologixGpibEthernetManual.pdf
         | 
| 125 126 | 
             
            - PrologixGpibUsbManual-6.0.pdf
         | 
| 126 127 | 
             
            - README.md
         | 
| @@ -131,18 +132,16 @@ files: | |
| 131 132 | 
             
            - lan_test.rb
         | 
| 132 133 | 
             
            - lib/prologix_gpib.rb
         | 
| 133 134 | 
             
            - lib/prologix_gpib/cli.rb
         | 
| 135 | 
            +
            - lib/prologix_gpib/commands.rb
         | 
| 134 136 | 
             
            - lib/prologix_gpib/discovery.rb
         | 
| 135 137 | 
             
            - lib/prologix_gpib/lan.rb
         | 
| 136 | 
            -
            - lib/prologix_gpib/lan/commands.rb
         | 
| 137 138 | 
             
            - lib/prologix_gpib/usb.rb
         | 
| 138 | 
            -
            - lib/prologix_gpib/usb/commands.rb
         | 
| 139 139 | 
             
            - lib/prologix_gpib/version.rb
         | 
| 140 140 | 
             
            - package.json
         | 
| 141 141 | 
             
            - prologix_gpib.gemspec
         | 
| 142 142 | 
             
            - test_broadcast.rb
         | 
| 143 143 | 
             
            - test_script.rb
         | 
| 144 144 | 
             
            - test_server.rb
         | 
| 145 | 
            -
            - udp_info.md
         | 
| 146 145 | 
             
            - yarn.lock
         | 
| 147 146 | 
             
            homepage: https://github.com/robcarruthers/prologix_gpib
         | 
| 148 147 | 
             
            licenses:
         | 
| @@ -166,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 166 165 | 
             
                - !ruby/object:Gem::Version
         | 
| 167 166 | 
             
                  version: '0'
         | 
| 168 167 | 
             
            requirements: []
         | 
| 169 | 
            -
            rubygems_version: 3.3. | 
| 168 | 
            +
            rubygems_version: 3.3.7
         | 
| 170 169 | 
             
            signing_key:
         | 
| 171 170 | 
             
            specification_version: 4
         | 
| 172 171 | 
             
            summary: Prologix GPIB controller ruby wrapper.
         | 
    
        data/udp_info.md
    DELETED
    
    | @@ -1,30 +0,0 @@ | |
| 1 | 
            -
            Hello Rob,
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            NetFinder uses UDP broadcast to locate and configure GPIB-ETH controllers on a network.
         | 
| 4 | 
            -
            You can find an implementation of the protocol in the nfcli utility
         | 
| 5 | 
            -
            http://prologix.biz/downloads/nfcli.tar.gz
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            Discovery
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            Create NF_IDENTIFY packet.
         | 
| 10 | 
            -
            Set sequence to a random value
         | 
| 11 | 
            -
            Set eth_addr to all ones
         | 
| 12 | 
            -
            Broadcast NF_IDENTIFY datagram to port 3040/UDP.
         | 
| 13 | 
            -
            Listen for NF_IDENTIFY_REPLY datagrams.
         | 
| 14 | 
            -
            Verify sequence matches NF_IDENTIFY packet
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            Configuration
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            Create NF*ASSIGNMENT packet
         | 
| 19 | 
            -
            Set sequence to a random value
         | 
| 20 | 
            -
            Set eth_addr to MAC address of desired device Set ip_type to NF_IP_DYNAMIC or NF_IP_STATIC If ip_type is NF_IP_DYNAMIC specify ip, mask and gateway addresses.
         | 
| 21 | 
            -
            Broadcast NF* ASSIGNMENT datagram to port 3040/UDP.
         | 
| 22 | 
            -
            Listen for NF_ASSIGNMENT_REPLY datagrams.
         | 
| 23 | 
            -
            Verify sequence matches that of NF_ASSIGNMENT packet Check result field for NF_SUCCESS
         | 
| 24 | 
            -
             | 
| 25 | 
            -
            Notes:
         | 
| 26 | 
            -
             | 
| 27 | 
            -
            1. You may get multiple replies. Discard duplicate replies.
         | 
| 28 | 
            -
            2. All multi-byte values are in network order (big-endian)
         | 
| 29 | 
            -
            3. On multi-homed hosts, make sure broadcasts go out over all interfaces.
         | 
| 30 | 
            -
            4. NetFinder protocol only works within the same subnet as routers will not forward UDP broadcast packets.
         |