lxi_rb 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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