lxi_rb 0.1.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79bb0d516f205bcdeeb9dd3e12d685fde5237c481b66ec02d80b54e22bd393ce
4
- data.tar.gz: f713c4887fae97699c9c26a9a42e7b7b8308b7d615529889c53e41a843bc2a6a
3
+ metadata.gz: 5e2583bda1cd48c51967b68e5b16f139c77f915cab04b8abbfd88165dba8b245
4
+ data.tar.gz: b4e21c0a5430cb59bcddfb8db0d4740da4a9368b0e695ed777083fb06b9d3bf4
5
5
  SHA512:
6
- metadata.gz: def303af335abcb996b9f88709a8901da0b298e7687f46e72dbee56d451ea033972672c6f4a17e19ae9ce30a14cf34d92e5891472769e735d22c22718c019b07
7
- data.tar.gz: c92a6342c28c3ba4d60d0480cd394d2ba6fa804c9abe0bf18b1327909fe43fa6ddc2edfb0ff3fd22abc66ac91b6ffeeaa72beea247ca08606c9bbc944e11753a
6
+ metadata.gz: 035f02d9942e7a270f0b3a4b3d4a1220e1ca0c01bd7a366e9a6ce39f635fdfc796a9df572856284fc6fcf12120142d8a87960cfa3d7abc55b2bcb682a007b8ec
7
+ data.tar.gz: ba12b510bc5f56cbd7ee5530c2d8c7119b2e6340c580ba84c0d863c175d74cbc596785ba63abc8aae958c9733f65c4731a17d6bfff1be81ad6968a72bcf11b6d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lxi_rb (0.1.0)
4
+ lxi_rb (0.2.1)
5
5
  ffi (~> 1.15)
6
6
 
7
7
  GEM
data/lib/lxi/device.rb CHANGED
@@ -17,10 +17,10 @@ module Lxi
17
17
  end
18
18
 
19
19
  def connect
20
- raise Error, 'LXI Library Initialisation Error' unless Lxi.lxi_init == Lxi::OK
20
+ raise Error, 'LXI Library Initialisation Error' unless Lxi.lxi_init == LXI_OK
21
21
 
22
22
  @id = Lxi.lxi_connect(@address, @port, @name, @timeout, @protocol)
23
- raise Error, 'LXI Connection Error' if @id == Lxi::ERROR
23
+ raise Error, 'LXI Connection Error' if @id == LXI_ERROR
24
24
 
25
25
  true
26
26
  end
@@ -42,7 +42,9 @@ module Lxi
42
42
 
43
43
  def read(length)
44
44
  message = FFI::MemoryPointer.new(:char, length)
45
- raise Error, 'LXI communications error' unless Lxi.lxi_receive(@id, message, length, @timeout).positive?
45
+ bytes_received = Lxi.lxi_receive(@id, message, length, @timeout)
46
+ raise Error, 'LXI communications error' unless bytes_received.positive?
47
+
46
48
  message.read_string
47
49
  end
48
50
  alias gets read
data/lib/lxi/ffi.rb CHANGED
@@ -7,27 +7,7 @@ module Lxi
7
7
  ffi_lib '/opt/homebrew/lib/liblxi.dylib'
8
8
  ffi_lib_flags :now, :global
9
9
 
10
- # Define the enums
11
- enum :lxi_protocol_type, %i[vxi11 raw hyslip]
12
- enum :lxi_discover_type, %i[vxi11 mdns]
13
-
14
- # Callbacks
15
- BroadcastCallback =
16
- FFI::Function.new(:void, %i[pointer pointer]) do |address, interface|
17
- puts "Broadcast: #{address.read_string}, #{interface.read_string}"
18
- end
19
-
20
- DeviceCallback =
21
- FFI::Function.new(:void, %i[pointer pointer]) do |address, id|
22
- puts "Device: #{address.read_string}, #{id.read_string}"
23
- end
24
-
25
- ServiceCallback =
26
- FFI::Function.new(:void, %i[pointer pointer pointer int]) do |address, id, service, port|
27
- puts "Service: #{address.read_string}, #{id.read_string}, #{service.read_string}, #{port}"
28
- end
29
-
30
- # Define the structs
10
+ # Define liblxi structs
31
11
  class LxiInfo < FFI::Struct
32
12
  layout :broadcast,
33
13
  callback(%i[pointer pointer], :void),
@@ -37,7 +17,15 @@ module Lxi
37
17
  callback(%i[pointer pointer pointer int], :void)
38
18
  end
39
19
 
40
- # Define the functions
20
+ # LXI Constants
21
+ LXI_OK = 0
22
+ LXI_ERROR = -1
23
+
24
+ # Define liblxi enums
25
+ enum :lxi_protocol_type, %i[vxi11 raw hyslip]
26
+ enum :lxi_discover_type, %i[vxi11 mdns]
27
+
28
+ # Expose liblxi functions
41
29
  attach_function :lxi_init, [], :int
42
30
  attach_function :lxi_discover_internal, :lxi_discover, [LxiInfo.ptr, :int, :lxi_discover_type], :int
43
31
  attach_function :lxi_discover_if, [LxiInfo.ptr, :string, :int, :lxi_discover_type], :int
@@ -46,36 +34,51 @@ module Lxi
46
34
  attach_function :lxi_receive, %i[int pointer int int], :int
47
35
  attach_function :lxi_disconnect, [:int], :int
48
36
 
49
- # Define the constants
50
- OK = 0
51
- ERROR = -1
37
+ # VXI11 Discovery Callbacks
38
+ BroadcastCallback =
39
+ FFI::Function.new(:void, %i[pointer pointer]) do |address, interface|
40
+ puts "Broadcast: #{address.read_string}, #{interface.read_string}"
41
+ end
52
42
 
53
- # Send and recieve scpi commands
54
- def self.scpi(address, port = 0, name = nil, protocol, command)
55
- response = FFI::MemoryPointer.new(:char, 65_536)
56
- timeout = 1000
43
+ DeviceCallback =
44
+ FFI::Function.new(:void, %i[pointer pointer]) do |address, id|
45
+ puts "Device: #{address.read_string}, #{id.read_string}"
46
+ end
57
47
 
58
- # Initialize LXI library
59
- lxi_init
48
+ ServiceCallback =
49
+ FFI::Function.new(:void, %i[pointer pointer pointer int]) do |address, id, service, port|
50
+ puts "Service: #{address.read_string}, #{id.read_string}, #{service.read_string}, #{port}"
51
+ end
60
52
 
61
- # Connect LXI device
62
- device = lxi_connect(address, port, name, timeout, protocol)
53
+ # Initialise the LXI library
54
+ def init_lxi_session
55
+ raise Error, 'LXI Library Initialisation Error' unless lxi_init == LXI_OK
56
+ end
63
57
 
64
- # Send SCPI command
65
- lxi_send(device, command, command.length, timeout)
58
+ # Search for LXI-11 devices on the specified interface and return hash of devices
59
+ def self.devices(interface: 'en0', timeout: 1000, type: :vxi11)
60
+ raise Error, 'LXI Library Initialisation Error' unless lxi_init == LXI_OK
66
61
 
67
- # Wait for response
68
- lxi_receive(device, response, response.size, timeout)
62
+ devices = []
63
+ callback =
64
+ FFI::Function.new(:void, %i[pointer pointer]) do |address, id|
65
+ devices << { address: address.read_string, id: id.read_string }
66
+ end
69
67
 
70
- puts response.read_string
68
+ info = LxiInfo.new
69
+ info[:broadcast] = BroadcastCallback
70
+ info[:device] = callback
71
71
 
72
- # Disconnect
73
- lxi_disconnect(device)
72
+ result = lxi_discover_internal(info, timeout, type)
73
+ sleep 0.1
74
+ puts "result: #{result}"
75
+ puts "info: #{info[:device].read_string}"
76
+ devices
74
77
  end
75
78
 
76
- # Discover LXI devices on the LAN
77
- def self.search(timeout: 1000, type: :vxi11)
78
- lxi_init
79
+ # Discover LXI-11 devices on the LAN
80
+ def self.discover_local(timeout: 1000, type: :vxi11)
81
+ init_lxi_session
79
82
 
80
83
  info = LxiInfo.new
81
84
  info[:broadcast] = BroadcastCallback
data/lib/lxi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lxi
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lxi_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Carruthers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-06 00:00:00.000000000 Z
11
+ date: 2023-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -44,7 +44,6 @@ files:
44
44
  - lib/lxi/ffi.rb
45
45
  - lib/lxi/version.rb
46
46
  - lib/lxi_rb.rb
47
- - lxi_rb.gemspec
48
47
  - sig/lxi_rb.rbs
49
48
  homepage: https://github.com/robcarruthers/lxi_rb
50
49
  licenses:
data/lxi_rb.gemspec DELETED
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'lib/lxi/version'
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = 'lxi_rb'
7
- spec.version = Lxi::VERSION
8
- spec.authors = ['Rob Carruthers']
9
- spec.email = ['robcarruthers@mac.com']
10
-
11
- spec.summary = 'Ruby wrapper for the liblxi library.'
12
- spec.description = 'The gem includes methods required for discovering and communicating with LXI compliant devices'
13
- spec.homepage = 'https://github.com/robcarruthers/lxi_rb'
14
- spec.license = 'MIT'
15
- spec.required_ruby_version = '>= 3.1.0'
16
-
17
- spec.metadata['homepage_uri'] = spec.homepage
18
- spec.metadata['source_code_uri'] = 'https://github.com/robcarruthers/lxi_rb'
19
- spec.metadata['changelog_uri'] = 'https://github.com/robcarruthers/lxi_rb/-/blob/master/CHANGELOG.md'
20
-
21
- # Specify which files should be added to the gem when it is released.
22
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files =
24
- Dir.chdir(__dir__) do
25
- `git ls-files -z`.split("\x0")
26
- .reject do |f|
27
- (File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor])
28
- end
29
- end
30
- spec.bindir = 'exe'
31
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
- spec.require_paths = ['lib']
33
-
34
- # Uncomment to register a new dependency of your gem
35
- # spec.add_dependency "example-gem", "~> 1.0"
36
- spec.add_dependency 'ffi', '~> 1.15'
37
-
38
- # For more information and examples about making a new gem, check out our
39
- # guide at: https://bundler.io/guides/creating_gem.html
40
- end