pi_driver 0.0.2 → 0.0.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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pi_driver.rb +3 -1
  3. data/lib/pi_driver/device.rb +6 -0
  4. data/lib/pi_driver/device/mcp23017.rb +129 -0
  5. data/lib/pi_driver/device/mcp23017/hardware_address.rb +37 -0
  6. data/lib/pi_driver/device/mcp23017/port.rb +23 -0
  7. data/lib/pi_driver/device/mcp23017/register.rb +98 -0
  8. data/lib/pi_driver/device/mcp23017/register/defval.rb +14 -0
  9. data/lib/pi_driver/device/mcp23017/register/gpinten.rb +14 -0
  10. data/lib/pi_driver/device/mcp23017/register/gpio.rb +14 -0
  11. data/lib/pi_driver/device/mcp23017/register/gppu.rb +14 -0
  12. data/lib/pi_driver/device/mcp23017/register/intcap.rb +14 -0
  13. data/lib/pi_driver/device/mcp23017/register/intcon.rb +14 -0
  14. data/lib/pi_driver/device/mcp23017/register/intf.rb +14 -0
  15. data/lib/pi_driver/device/mcp23017/register/iocon.rb +41 -0
  16. data/lib/pi_driver/device/mcp23017/register/iodir.rb +14 -0
  17. data/lib/pi_driver/device/mcp23017/register/ipol.rb +14 -0
  18. data/lib/pi_driver/device/mcp23017/register/olat.rb +14 -0
  19. data/lib/pi_driver/device/mcp23017/register/register_helper.rb +50 -0
  20. data/lib/pi_driver/i2c_master.rb +6 -15
  21. data/lib/pi_driver/pin.rb +25 -49
  22. data/lib/pi_driver/pin/board.rb +65 -0
  23. data/lib/pi_driver/pin/direction.rb +13 -0
  24. data/lib/pi_driver/pin/directory_helper.rb +32 -0
  25. data/lib/pi_driver/pin/file_helper.rb +32 -0
  26. data/lib/pi_driver/utils.rb +10 -0
  27. data/lib/pi_driver/utils/argument_helper.rb +19 -0
  28. data/lib/pi_driver/utils/byte.rb +21 -0
  29. data/lib/pi_driver/utils/edge.rb +17 -0
  30. data/lib/pi_driver/utils/interrupt.rb +60 -0
  31. data/lib/pi_driver/utils/state.rb +13 -0
  32. data/test/device/mcp23017/test_alias.rb +27 -0
  33. data/test/device/mcp23017/test_error.rb +37 -0
  34. data/test/device/mcp23017/test_hardware_address.rb +29 -0
  35. data/test/device/mcp23017/test_i2c_master.rb +10 -0
  36. data/test/device/mcp23017/test_read.rb +63 -0
  37. data/test/device/mcp23017/test_register.rb +118 -0
  38. data/test/device/mcp23017/test_write.rb +49 -0
  39. data/test/device/mcp23017_test_helper.rb +13 -0
  40. data/test/i2c_master/test_ack.rb +26 -0
  41. data/test/i2c_master/test_address.rb +15 -0
  42. data/test/i2c_master/test_alias.rb +7 -0
  43. data/test/i2c_master/test_clock_stretch.rb +26 -0
  44. data/test/i2c_master/test_read.rb +27 -0
  45. data/test/i2c_master/test_speed.rb +11 -0
  46. data/test/i2c_master/test_start.rb +11 -0
  47. data/test/i2c_master/test_stop.rb +24 -0
  48. data/test/i2c_master/test_write.rb +29 -0
  49. data/test/i2c_master_test_helper.rb +28 -0
  50. data/test/pin/test_alias.rb +23 -0
  51. data/test/pin/test_clear.rb +15 -0
  52. data/test/pin/test_clear_interrupt.rb +10 -0
  53. data/test/pin/test_error.rb +35 -0
  54. data/test/pin/test_input.rb +23 -0
  55. data/test/pin/test_interrupt.rb +51 -0
  56. data/test/pin/test_is_clear.rb +17 -0
  57. data/test/pin/test_is_input.rb +14 -0
  58. data/test/pin/test_is_output.rb +14 -0
  59. data/test/pin/test_is_set.rb +17 -0
  60. data/test/pin/test_output.rb +38 -0
  61. data/test/pin/test_set.rb +15 -0
  62. data/test/pin_test_helper.rb +45 -0
  63. data/test/test_helper.rb +14 -0
  64. data/test/utils/test_error.rb +31 -0
  65. data/test/utils/test_interrupt.rb +109 -0
  66. data/test/utils_test_helper.rb +6 -0
  67. metadata +73 -5
@@ -0,0 +1,17 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinIsSetTest < PinTest
4
+ def test_is_set_input
5
+ pin = PiDriver::Pin.new @pin_number
6
+ expect_value_read('1').twice
7
+ refute pin.clear?
8
+ assert pin.set?
9
+ end
10
+
11
+ def test_is_set_output
12
+ pin = PiDriver::Pin.new @pin_number, direction: :out, state: 1
13
+ expect_value_read('1').never
14
+ refute pin.clear?
15
+ assert pin.set?
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinOutputTest < PinTest
4
+ def test_output_new
5
+ expect_export_write
6
+ expect_direction_write(:out)
7
+ expect_value_write(0)
8
+ PiDriver::Pin.new @pin_number, direction: :out
9
+ end
10
+
11
+ def test_output_new_observe_value
12
+ expect_export_write
13
+ expect_direction_write(:out)
14
+ expect_value_write(1)
15
+ PiDriver::Pin.new @pin_number, direction: :out, state: 1
16
+ end
17
+
18
+ def test_output_low_default
19
+ pin = PiDriver::Pin.new @pin_number, direction: :out
20
+ expect_direction_write(:out)
21
+ expect_value_write(0)
22
+ pin.output
23
+ end
24
+
25
+ def test_output_low
26
+ pin = PiDriver::Pin.new @pin_number, direction: :out
27
+ expect_direction_write(:out)
28
+ expect_value_write(0)
29
+ pin.output 0
30
+ end
31
+
32
+ def test_output_high
33
+ pin = PiDriver::Pin.new @pin_number, direction: :out
34
+ expect_direction_write(:out)
35
+ expect_value_write(1)
36
+ pin.output 1
37
+ end
38
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinSetTest < PinTest
4
+ def test_set_input
5
+ pin = PiDriver::Pin.new @pin_number
6
+ expect_value_write(1).never
7
+ pin.clear
8
+ end
9
+
10
+ def test_set_output
11
+ pin = PiDriver::Pin.new @pin_number, direction: :out
12
+ expect_value_write(1)
13
+ pin.set
14
+ end
15
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ class PinTest < TestCase
4
+ def setup
5
+ @pin_number = 0
6
+ end
7
+
8
+ private
9
+
10
+ def expect_read(path, content)
11
+ File.expects(:read).with(path).returns(content)
12
+ end
13
+
14
+ def expect_write(path, content)
15
+ File.expects(:write).with(path, content)
16
+ end
17
+
18
+ def expect_export_write
19
+ expect_write(path_export, @pin_number)
20
+ end
21
+
22
+ def expect_direction_write(direction)
23
+ expect_write(path_pin_direction, direction)
24
+ end
25
+
26
+ def expect_value_read(value)
27
+ expect_read(path_pin_value, value)
28
+ end
29
+
30
+ def expect_value_write(value)
31
+ expect_write(path_pin_value, value)
32
+ end
33
+
34
+ def path_export
35
+ "#{PiDriver::Pin::DirectoryHelper::DIR_GPIO}/export"
36
+ end
37
+
38
+ def path_pin_direction
39
+ "#{PiDriver::Pin::DirectoryHelper::DIR_GPIO}/gpio#{@pin_number}/direction"
40
+ end
41
+
42
+ def path_pin_value
43
+ "#{PiDriver::Pin::DirectoryHelper::DIR_GPIO}/gpio#{@pin_number}/value"
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ require 'minitest/autorun'
2
+ require 'pi_driver'
3
+ require 'mocha/minitest'
4
+
5
+ class TestCase < Minitest::Test
6
+ def timeout(seconds = 0.5)
7
+ success = false
8
+ started_at = Time.now
9
+ while !(success = yield) do
10
+ break if Time.now - started_at > seconds
11
+ end
12
+ success
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../utils_test_helper'
2
+
3
+ class UtilsErrorTest < UtilsTest
4
+ def test_error_interrupt_new_block
5
+ assert_raises ArgumentError do
6
+ PiDriver::Utils::Interrupt.new(:rising)
7
+ timeout { false }
8
+ end
9
+ end
10
+
11
+ def test_error_interrupt_start_block
12
+ assert_raises ArgumentError do
13
+ interrupt = PiDriver::Utils::Interrupt.new(:rising) { [0, 1].sample }
14
+ interrupt.start
15
+ timeout { false }
16
+ end
17
+ end
18
+
19
+ def test_error_interrupt_yield_state
20
+ assert_raises ArgumentError do
21
+ begin
22
+ interrupt = PiDriver::Utils::Interrupt.new(:rising) { 2 }
23
+ interrupted = false
24
+ thread = interrupt.start { interrupted = true }
25
+ timeout { interrupted }
26
+ ensure
27
+ thread.kill
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,109 @@
1
+ require_relative '../utils_test_helper'
2
+
3
+ class UtilsInterruptTest < UtilsTest
4
+ def setup
5
+ super
6
+ end
7
+
8
+ def test_new_default
9
+ interrupt = PiDriver::Utils::Interrupt.new(:some_edge) { [0, 1].sample }
10
+ thread = mock
11
+ thread.stubs(:abort_on_exception=)
12
+ Thread.expects(:new).returns(thread)
13
+ interrupt.start { }
14
+ timeout 0.1 { false }
15
+ end
16
+
17
+ def test_rising
18
+ value_object = mock
19
+ interrupt = PiDriver::Utils::Interrupt.new(:rising) { value_object.value_method }
20
+
21
+ begin
22
+ rising = sequence('rising')
23
+ value_object.expects(:value_method).returns(0).in_sequence(rising)
24
+ value_object.expects(:value_method).returns(1).at_least_once.in_sequence(rising)
25
+
26
+ interrupted = false
27
+ interrupt.start do |edge|
28
+ assert :rising, edge
29
+ interrupted = true
30
+ end
31
+
32
+ timeout { interrupted }
33
+ assert interrupted
34
+ ensure
35
+ interrupt.clear
36
+ end
37
+ end
38
+
39
+ def test_falling
40
+ value_object = mock
41
+ interrupt = PiDriver::Utils::Interrupt.new(:falling) { value_object.value_method }
42
+
43
+ begin
44
+ falling = sequence('falling')
45
+ value_object.expects(:value_method).returns(1).in_sequence(falling)
46
+ value_object.expects(:value_method).returns(0).at_least_once.in_sequence(falling)
47
+
48
+ interrupted = false
49
+ interrupt.start do |edge|
50
+ assert :falling, edge
51
+ interrupted = true
52
+ end
53
+
54
+ timeout { interrupted }
55
+ assert interrupted
56
+ ensure
57
+ interrupt.clear
58
+ end
59
+ end
60
+
61
+ def test_both
62
+ value_object = mock
63
+ interrupt = PiDriver::Utils::Interrupt.new(:both) { value_object.value_method }
64
+
65
+ begin
66
+ both = sequence('both')
67
+ value_object.expects(:value_method).returns(0).in_sequence(both)
68
+ value_object.expects(:value_method).returns(1).in_sequence(both)
69
+ value_object.expects(:value_method).returns(0).at_least_once.in_sequence(both)
70
+
71
+ rising_detected = false
72
+ falling_detected = false
73
+ interrupt.start do |edge|
74
+ if !rising_detected
75
+ rising_detected = true
76
+ assert :rising, edge
77
+ elsif !falling_detected
78
+ falling_detected = true
79
+ assert :falling, edge
80
+ end
81
+ end
82
+
83
+ timeout { rising_detected && falling_detected }
84
+ assert rising_detected && falling_detected
85
+ ensure
86
+ interrupt.clear
87
+ end
88
+ end
89
+
90
+ def test_none
91
+ value_object = mock
92
+ interrupt = PiDriver::Utils::Interrupt.new(:none) { value_object.value_method }
93
+
94
+ begin
95
+ both = sequence('both')
96
+ value_object.expects(:value_method).returns(0).in_sequence(both)
97
+ value_object.expects(:value_method).returns(1).in_sequence(both)
98
+ value_object.expects(:value_method).returns(0).at_least_once.in_sequence(both)
99
+
100
+ interrupted = false
101
+ interrupt.start { interrupted = true }
102
+
103
+ timeout { }
104
+ refute interrupted
105
+ ensure
106
+ interrupt.clear
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,6 @@
1
+ require 'test_helper'
2
+
3
+ class UtilsTest < TestCase
4
+ def setup
5
+ end
6
+ end
metadata CHANGED
@@ -1,30 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pi_driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Winningham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-15 00:00:00.000000000 Z
11
+ date: 2018-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mocha
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 1.4.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - '='
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.4'
30
+ - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: 1.4.0
27
- description: Ruby driver for Raspberry Pi
33
+ description: Ruby driver for Raspberry Pi with device drivers
28
34
  email: lucas.winningham@gmail.com
29
35
  executables:
30
36
  - pin.rb
@@ -33,8 +39,70 @@ extra_rdoc_files: []
33
39
  files:
34
40
  - bin/pin.rb
35
41
  - lib/pi_driver.rb
42
+ - lib/pi_driver/device.rb
43
+ - lib/pi_driver/device/mcp23017.rb
44
+ - lib/pi_driver/device/mcp23017/hardware_address.rb
45
+ - lib/pi_driver/device/mcp23017/port.rb
46
+ - lib/pi_driver/device/mcp23017/register.rb
47
+ - lib/pi_driver/device/mcp23017/register/defval.rb
48
+ - lib/pi_driver/device/mcp23017/register/gpinten.rb
49
+ - lib/pi_driver/device/mcp23017/register/gpio.rb
50
+ - lib/pi_driver/device/mcp23017/register/gppu.rb
51
+ - lib/pi_driver/device/mcp23017/register/intcap.rb
52
+ - lib/pi_driver/device/mcp23017/register/intcon.rb
53
+ - lib/pi_driver/device/mcp23017/register/intf.rb
54
+ - lib/pi_driver/device/mcp23017/register/iocon.rb
55
+ - lib/pi_driver/device/mcp23017/register/iodir.rb
56
+ - lib/pi_driver/device/mcp23017/register/ipol.rb
57
+ - lib/pi_driver/device/mcp23017/register/olat.rb
58
+ - lib/pi_driver/device/mcp23017/register/register_helper.rb
36
59
  - lib/pi_driver/i2c_master.rb
37
60
  - lib/pi_driver/pin.rb
61
+ - lib/pi_driver/pin/board.rb
62
+ - lib/pi_driver/pin/direction.rb
63
+ - lib/pi_driver/pin/directory_helper.rb
64
+ - lib/pi_driver/pin/file_helper.rb
65
+ - lib/pi_driver/utils.rb
66
+ - lib/pi_driver/utils/argument_helper.rb
67
+ - lib/pi_driver/utils/byte.rb
68
+ - lib/pi_driver/utils/edge.rb
69
+ - lib/pi_driver/utils/interrupt.rb
70
+ - lib/pi_driver/utils/state.rb
71
+ - test/device/mcp23017/test_alias.rb
72
+ - test/device/mcp23017/test_error.rb
73
+ - test/device/mcp23017/test_hardware_address.rb
74
+ - test/device/mcp23017/test_i2c_master.rb
75
+ - test/device/mcp23017/test_read.rb
76
+ - test/device/mcp23017/test_register.rb
77
+ - test/device/mcp23017/test_write.rb
78
+ - test/device/mcp23017_test_helper.rb
79
+ - test/i2c_master/test_ack.rb
80
+ - test/i2c_master/test_address.rb
81
+ - test/i2c_master/test_alias.rb
82
+ - test/i2c_master/test_clock_stretch.rb
83
+ - test/i2c_master/test_read.rb
84
+ - test/i2c_master/test_speed.rb
85
+ - test/i2c_master/test_start.rb
86
+ - test/i2c_master/test_stop.rb
87
+ - test/i2c_master/test_write.rb
88
+ - test/i2c_master_test_helper.rb
89
+ - test/pin/test_alias.rb
90
+ - test/pin/test_clear.rb
91
+ - test/pin/test_clear_interrupt.rb
92
+ - test/pin/test_error.rb
93
+ - test/pin/test_input.rb
94
+ - test/pin/test_interrupt.rb
95
+ - test/pin/test_is_clear.rb
96
+ - test/pin/test_is_input.rb
97
+ - test/pin/test_is_output.rb
98
+ - test/pin/test_is_set.rb
99
+ - test/pin/test_output.rb
100
+ - test/pin/test_set.rb
101
+ - test/pin_test_helper.rb
102
+ - test/test_helper.rb
103
+ - test/utils/test_error.rb
104
+ - test/utils/test_interrupt.rb
105
+ - test/utils_test_helper.rb
38
106
  homepage: http://rubygems.org/gems/pi_driver
39
107
  licenses:
40
108
  - MIT