i2c 0.4.0 → 0.4.2.dev

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2254a2d32b8a0d9feb7e7718477e4bca157a521d
4
+ data.tar.gz: 918e34eca0c218eab8330efa1ee5b71426c91625
5
+ SHA512:
6
+ metadata.gz: 453ebbf2217f1ca9e105c95cd188b1c9d08c311d7a913927312ca7aabfaed490c0836052076e07425f5709a9409430f75626d1d064e3e40c047a0f20b8980c00
7
+ data.tar.gz: fbd3cd2ea165014d405a781591f13c88b96bc018c9a31cc223bdac2490c8859dc4a1969b2902d85a2546fe4a133b22a00280fcdd2fbe5730c25eef827b774890
@@ -1,30 +1,30 @@
1
- = I2C - Ruby I2C library
1
+ = I2C - Ruby I2C library
2
2
 
3
3
  == About
4
4
 
5
- Interface to Linux I2C (a.k.a. TWI) implementations. Right now targeted at the
5
+ Interface to Linux I2C (a.k.a. TWI) implementations. Right now targeted at the
6
6
  Raspberry Pi, but should work with any linux i2c-dev I2C-hardware.
7
7
 
8
8
  == Structure
9
9
 
10
- The library is split into two parts:
11
- * A backend for accessing the I2C bus (right now only through the i2c-dev
12
- in Linux, other impementations are possible).
13
- * Drivers for I2C enabled ICs.
10
+ The library is split into two parts:
11
+ * A backend for accessing the I2C bus (right now only through the i2c-dev
12
+ in Linux, other impementations are possible).
13
+ * Drivers for I2C enabled ICs.
14
14
 
15
15
  == Installation
16
16
 
17
17
  To use the i2c-dev backend it is necessary to load the "i2c-dev" linux
18
18
  kernel module. This is not done automatically even if the module for the
19
19
  underlying I2C-hardware is. To automatically load the i2c-dev driver on startup
20
- add it to /etc/modules. Also the device file (usually /dev/i2c-0) must be
21
- user accessible. A working (at least on a RaspberryPi running Raspbian) udev
20
+ add it to /etc/modules. Also the device file (usually /dev/i2c-0) must be
21
+ user accessible. A working (at least on a RaspberryPi running Raspbian) udev
22
22
  rule file is available (rules/88-i2c.rules) and can be installed to
23
23
  /etc/udev/rules.d/.
24
24
 
25
25
  == Backends
26
26
 
27
- The backends are instantiated through the #I2C::create method. depending
27
+ The backends are instantiated through the #I2C::create method. depending
28
28
  on the format of the passed bus descriptor the correct backend is invoked.
29
29
 
30
30
  Right now there is only a i2c-dev backend available
@@ -43,21 +43,21 @@ first I2c bus on the system.
43
43
 
44
44
  16 bit IO-Expander MCP23017 from Microchip. Provides a wiringpi-ruby compatible
45
45
  API and may therefore be used as a drop-in replacement for IO tasks on a
46
- Raspberry Pi.
46
+ Raspberry Pi.
47
47
  Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf
48
48
 
49
49
  === MCP23008
50
50
 
51
- 8 bit IO-Expander MCP23008 from Microchip. Basically a small version of the
52
- MCP23017.
51
+ 8 bit IO-Expander MCP23008 from Microchip. Basically a small version of the
52
+ MCP23017.
53
53
  Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21919e.pdf
54
54
 
55
55
  == Acknowledgements
56
56
 
57
- The low-level IO (mainly in i2c-dev.rb) was extracted from Ruby-I2C
58
- (http://rubyforge.org/projects/i2c/) by Jonas Bähr <jonas.baehr@fs.ei.tum.de>
57
+ The low-level IO (mainly in i2c-dev.rb) was extracted from Ruby-I2C
58
+ (http://rubyforge.org/projects/i2c/) by Jonas Bähr <jonas.baehr@fs.ei.tum.de>
59
59
 
60
- === Contributions
60
+ === Contributions
61
61
  * [Gaëtan Duchaussois](https://github.com/gaetronik) I2C::Dev.read_byte.
62
62
 
63
63
  === Bugfixes
@@ -67,6 +67,6 @@ The low-level IO (mainly in i2c-dev.rb) was extracted from Ruby-I2C
67
67
 
68
68
  This code may be used under the terms of the GNU General Public Licence, Version 2.
69
69
 
70
+ Copyright (c) 2018 David Bailey <davidbailey.2889@gmail.com>
70
71
  Copyright (c) 2012 Christoph Anderegg <christoph@christoph-anderegg.ch>
71
72
  Copyright (c) 2008 Jonas Bähr <jonas.baehr@fs.ei.tum.de>
72
-
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
- # I2C - Linux i2c-dev backend.
2
+ # I2C - Linux i2c-dev backend.
3
3
  #
4
4
  # Copyright (c) 2012 Christoph Anderegg <christoph@christoph-anderegg.ch>
5
- # Copyright (c) 2008 Jonas Bähr, jonas.baehr@fs.ei.tum.de
5
+ # Copyright (c) 2008 Jonas Bähr, jonas.baehr@fs.ei.tum.de
6
6
  # This file may be distributed under the terms of the GNU General Public
7
7
  # License Version 2.
8
8
  #
@@ -18,43 +18,82 @@ module I2C
18
18
  @instances[device_path]
19
19
  end
20
20
 
21
- # sends every param, begining with +params[0]+
21
+ attr_reader :comsMutex
22
+
23
+ # this tries to lock the coms mutex, unless already held,
24
+ # then sends every param, begining with +params[0]+
22
25
  # If the current param is a Fixnum, it is treated as one byte.
23
- # If the param is a String, this string will be send byte by byte.
26
+ # If the param is a String, this string will be sent byte by byte.
24
27
  # You can use Array#pack to create a string from an array
25
- # For Fixnum there is a convinient function to_short which transforms
28
+ # For Fixnum there is a convenient function to_short which transforms
26
29
  # the number to a string this way: 12345.to_short == [12345].pack("s")
27
30
  def write(address, *params)
28
- data = String.new
29
- data.force_encoding("US-ASCII")
30
- params.each do |value|
31
- data << value
32
- end
33
- @device.ioctl(I2C_SLAVE, address)
34
- @device.syswrite(data)
31
+ if(@comsMutex.owned?)
32
+ keepLock = true;
33
+ else
34
+ @comsMutex.lock;
35
+ end
36
+
37
+ setup_device(address);
38
+ raw_write(params);
39
+
40
+ @comsMutex.unlock() unless keepLock;
35
41
  end
36
42
 
37
- # this sends *params as the write function and then tries to read
43
+ # this tries to lock the coms mutex (unless already held),
44
+ # then sends *params, if given, and then tries to read
38
45
  # +size+ bytes. The result is a String which can be treated with
39
46
  # String#unpack afterwards
40
47
  def read(address, size, *params)
41
- ret = ""
42
- write(address, *params)
43
- ret = @device.sysread(size)
44
- return ret
48
+ if(@comsMutex.owned?)
49
+ keepLock = true;
50
+ else
51
+ @comsMutex.lock;
52
+ end
53
+
54
+ setup_device(address);
55
+ raw_write(params) unless params.empty?
56
+ result = raw_read(size);
57
+
58
+ @comsMutex.unlock() unless keepLock;
59
+ return result;
45
60
  end
46
-
61
+
47
62
  # Read a byte from the current address. Return a one char String which
48
63
  # can be treated with String#unpack
49
64
  def read_byte(address)
50
- ret=""
51
- @device.ioctl(I2C_SLAVE,address)
52
- ret=@device.sysread(1)
53
- return ret
65
+ read(address, 1);
54
66
  end
55
-
67
+
56
68
  private
69
+ # Set up @device for a I2C communication to address
70
+ def setup_device(address)
71
+ @device.ioctl(I2C_SLAVE, address);
72
+ end
73
+
74
+ # Read size bytes from @device, if possible. Raise an error otherwise
75
+ def raw_read(size)
76
+ return @device.sysread(size)
77
+ end
78
+
79
+ # Write "params" to @device, unrolling them first should they be an array.
80
+ # params should be a string, formatted with Array.pack as explained for write()
81
+ def raw_write(params)
82
+ data = String.new();
83
+ data.force_encoding("US-ASCII")
84
+
85
+ if(params.is_a? Array)
86
+ params.each do |i| data << i; end
87
+ else
88
+ data << params;
89
+ end
90
+
91
+ @device.syswrite(data);
92
+ end
93
+
57
94
  def initialize(device_path)
95
+ @comsMutex = Mutex.new();
96
+
58
97
  @device = File.new(device_path, 'r+')
59
98
  # change the sys* functions of the file object to meet our requirements
60
99
  class << @device
@@ -62,7 +101,7 @@ module I2C
62
101
  def syswrite(var)
63
102
  begin
64
103
  syswrite_orig var
65
- rescue Errno::EREMOTEIO
104
+ rescue Errno::EREMOTEIO, Errno::EIO
66
105
  raise AckError, "No acknowledge received"
67
106
  end
68
107
  end
@@ -70,7 +109,7 @@ module I2C
70
109
  def sysread(var)
71
110
  begin
72
111
  sysread_orig var
73
- rescue Errno::EREMOTEIO
112
+ rescue Errno::EREMOTEIO, Errno::EIO
74
113
  raise AckError, "No acknowledge received"
75
114
  end
76
115
  end
@@ -53,7 +53,7 @@ module I2C
53
53
 
54
54
  @iodir = Array.new
55
55
  max_port_no.times { @iodir << 0xFF } # Direction is input initially
56
- @device.write(@address, port_count, iodir[0], @iodir)
56
+ @device.write(@address, port_count, iodir[0], *@iodir)
57
57
 
58
58
  @data = Array.new
59
59
  max_port_no.times { @data << 0xFF }
metadata CHANGED
@@ -1,53 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i2c
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
5
- prerelease:
4
+ version: 0.4.2.dev
6
5
  platform: ruby
7
6
  authors:
8
7
  - Christoph Anderegg
8
+ - David Bailey
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-15 00:00:00.000000000 Z
12
+ date: 2018-06-12 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Interface to I2C (aka TWI) implementations. Also provides abstractions
15
15
  for some I2c-devices. Created with the Raspberry Pi in mind.
16
- email: christoph@christoph-anderegg.ch
16
+ email:
17
+ - davidbailey.2889@gmail.com
18
+ - christoph@christoph-anderegg.ch
17
19
  executables: []
18
20
  extensions: []
19
21
  extra_rdoc_files:
20
22
  - README.rdoc
21
23
  files:
24
+ - README.rdoc
22
25
  - lib/i2c.rb
23
- - lib/i2c/i2c.rb
24
26
  - lib/i2c/backends/i2c-dev.rb
25
27
  - lib/i2c/drivers/mcp230xx.rb
26
- - test//mcp230xx_spec.rb
28
+ - lib/i2c/i2c.rb
27
29
  - rules/88-i2c.rules
28
- - README.rdoc
30
+ - test//mcp230xx_spec.rb
29
31
  homepage: https://github.com/andec/i2c
30
- licenses: []
32
+ licenses:
33
+ - GPL-3.0
34
+ metadata: {}
31
35
  post_install_message:
32
36
  rdoc_options: []
33
37
  require_paths:
34
38
  - lib
35
39
  required_ruby_version: !ruby/object:Gem::Requirement
36
- none: false
37
40
  requirements:
38
- - - ! '>='
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '0'
41
44
  required_rubygems_version: !ruby/object:Gem::Requirement
42
- none: false
43
45
  requirements:
44
- - - ! '>='
46
+ - - ">"
45
47
  - !ruby/object:Gem::Version
46
- version: '0'
48
+ version: 1.3.1
47
49
  requirements: []
48
50
  rubyforge_project:
49
- rubygems_version: 1.8.23
51
+ rubygems_version: 2.6.14.1
50
52
  signing_key:
51
- specification_version: 3
53
+ specification_version: 4
52
54
  summary: I2C access library (for Linux).
53
55
  test_files: []