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,13 @@
1
+ require_relative '../test_helper'
2
+
3
+ class MCP23017Test < TestCase
4
+ def setup
5
+ @clock_pin = PiDriver::Pin.new 1
6
+ @data_pin = PiDriver::Pin.new 2
7
+ @i2c_master = PiDriver::I2CMaster.new clock_pin: @clock_pin, data_pin: @data_pin
8
+ @mcp23017 = PiDriver::Device::MCP23017.new i2c_master: @i2c_master
9
+ @mcp23017.hardware_address.a0 = 1
10
+ @mcp23017.hardware_address.a1 = 1
11
+ @mcp23017.hardware_address.a2 = 1
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CAckTest < I2CMasterTest
4
+ def test_ack
5
+ @sequence = sequence('ack')
6
+ expect_sequence_ack true
7
+
8
+ assert @i2c_master.ack
9
+ end
10
+
11
+ def test_nack
12
+ @sequence = sequence('nack')
13
+ expect_sequence_ack false
14
+
15
+ refute @i2c_master.ack
16
+ end
17
+
18
+ private
19
+
20
+ def expect_sequence_ack(success)
21
+ expect_data_pin_to_be_released
22
+ expect_clock_pin_to_be_released
23
+ @data_pin.expects(:clear?).with(nil).returns(success).in_sequence(@sequence)
24
+ expect_clock_pin_to_be_driven
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CAddressTest < I2CMasterTest
4
+ def test_prepare_address_for_write
5
+ address_byte = 0b1010101
6
+ prepared_address = PiDriver::I2CMaster.prepare_address_for_write address_byte
7
+ assert_equal 0b10101010, prepared_address
8
+ end
9
+
10
+ def test_prepare_address_for_read
11
+ address_byte = 0b1010101
12
+ prepared_address = PiDriver::I2CMaster.prepare_address_for_read address_byte
13
+ assert_equal 0b10101011, prepared_address
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CAliasTest < I2CMasterTest
4
+ def test_start_aliases
5
+ assert_equal @i2c_master.method(:start), @i2c_master.method(:restart)
6
+ end
7
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CClockStretchTest < I2CMasterTest
4
+ def test_clock_stretch
5
+ @sequence = sequence('clock stretch')
6
+ @clock_pin.expects(:input).with(nil).in_sequence(@sequence)
7
+ @clock_pin.expects(:set?).with(nil).returns(false).times(3).in_sequence(@sequence)
8
+ @clock_pin.expects(:set?).with(nil).returns(true).in_sequence(@sequence)
9
+
10
+ @i2c_master.send(:release_clock_pin)
11
+ end
12
+
13
+ def test_clock_stretch_timeout
14
+ @sequence = sequence('clock stretch timeout')
15
+ @clock_pin.expects(:input).with(nil).in_sequence(@sequence)
16
+ @clock_pin.expects(:set?).with(nil).returns(false).at_least_once.in_sequence(@sequence)
17
+
18
+ test_began_at = Time.now
19
+ @i2c_master.send(:release_clock_pin)
20
+ test_ended_at = Time.now
21
+ time_delta = test_ended_at - test_began_at
22
+ one_millisecond = 0.001
23
+ two_milliseconds = 0.002
24
+ assert time_delta > one_millisecond && time_delta < two_milliseconds
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CReadTest < I2CMasterTest
4
+ def test_read
5
+ @sequence = sequence('read')
6
+ expect_data_pin_to_be_released
7
+ expect_bit_read 1
8
+ expect_bit_read 0
9
+ expect_bit_read 0
10
+ expect_bit_read 0
11
+ expect_bit_read 1
12
+ expect_bit_read 1
13
+ expect_bit_read 0
14
+ expect_bit_read 1
15
+
16
+ byte = @i2c_master.read
17
+ assert_equal 0b10001101, byte
18
+ end
19
+
20
+ private
21
+
22
+ def expect_bit_read(value)
23
+ expect_clock_pin_to_be_released
24
+ @data_pin.expects(:value).with(nil).returns(value).in_sequence(@sequence)
25
+ expect_clock_pin_to_be_driven
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CSpeedTest < I2CMasterTest
4
+ def test_speed
5
+ test_began_at = Time.now
6
+ @i2c_master.send(:release_clock_pin)
7
+ test_ended_at = Time.now
8
+ frequency = (1.0 / (test_ended_at - test_began_at))
9
+ assert frequency < 100_000
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CStartTest < I2CMasterTest
4
+ def test_start
5
+ @sequence = sequence('start')
6
+ expect_data_pin_to_be_driven
7
+ expect_clock_pin_to_be_driven
8
+
9
+ @i2c_master.start
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CStopTest < I2CMasterTest
4
+ def test_new_i2c_stop
5
+ @sequence = sequence('stop')
6
+ expect_sequence_stop
7
+
8
+ PiDriver::I2CMaster.new clock_pin: @clock_pin, data_pin: @data_pin
9
+ end
10
+
11
+ def test_stop
12
+ @sequence = sequence('stop')
13
+ expect_sequence_stop
14
+
15
+ @i2c_master.stop
16
+ end
17
+
18
+ private
19
+
20
+ def expect_sequence_stop
21
+ expect_clock_pin_to_be_released
22
+ expect_data_pin_to_be_released
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../i2c_master_test_helper'
2
+
3
+ class I2CWriteTest < I2CMasterTest
4
+ def test_write
5
+ @sequence = sequence('write')
6
+ expect_bit_write 1
7
+ expect_bit_write 0
8
+ expect_bit_write 1
9
+ expect_bit_write 1
10
+ expect_bit_write 0
11
+ expect_bit_write 0
12
+ expect_bit_write 0
13
+ expect_bit_write 1
14
+
15
+ @i2c_master.write(0b10110001)
16
+ end
17
+
18
+ private
19
+
20
+ def expect_bit_write(value)
21
+ if value == 0
22
+ expect_data_pin_to_be_driven
23
+ elsif value == 1
24
+ expect_data_pin_to_be_released
25
+ end
26
+ expect_clock_pin_to_be_released
27
+ expect_clock_pin_to_be_driven
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class I2CMasterTest < TestCase
4
+ def setup
5
+ @clock_pin = PiDriver::Pin.new 1
6
+ @data_pin = PiDriver::Pin.new 2
7
+ @i2c_master = PiDriver::I2CMaster.new clock_pin: @clock_pin, data_pin: @data_pin
8
+ end
9
+
10
+ private
11
+
12
+ def expect_clock_pin_to_be_released
13
+ @clock_pin.expects(:input).with(nil).in_sequence(@sequence)
14
+ @clock_pin.expects(:set?).with(nil).returns(true).in_sequence(@sequence)
15
+ end
16
+
17
+ def expect_clock_pin_to_be_driven
18
+ @clock_pin.expects(:output).with(0).in_sequence(@sequence)
19
+ end
20
+
21
+ def expect_data_pin_to_be_released
22
+ @data_pin.expects(:input).with(nil).in_sequence(@sequence)
23
+ end
24
+
25
+ def expect_data_pin_to_be_driven
26
+ @data_pin.expects(:output).with(0).in_sequence(@sequence)
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinAliasTest < PinTest
4
+ def test_output_clear_aliases
5
+ pin = PiDriver::Pin.new @pin_number
6
+ assert_equal pin.method(:clear), pin.method(:off)
7
+ end
8
+
9
+ def test_output_set_aliases
10
+ pin = PiDriver::Pin.new @pin_number
11
+ assert_equal pin.method(:set), pin.method(:on)
12
+ end
13
+
14
+ def test_output_is_clear_aliases
15
+ pin = PiDriver::Pin.new @pin_number
16
+ assert_equal pin.method(:clear?), pin.method(:off?)
17
+ end
18
+
19
+ def test_output_is_set_aliases
20
+ pin = PiDriver::Pin.new @pin_number
21
+ assert_equal pin.method(:set?), pin.method(:on?)
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinClearTest < PinTest
4
+ def test_clear_input
5
+ pin = PiDriver::Pin.new @pin_number
6
+ expect_value_write(0).never
7
+ pin.clear
8
+ end
9
+
10
+ def test_clear_output
11
+ pin = PiDriver::Pin.new @pin_number, direction: :out, state: 1
12
+ expect_value_write(0)
13
+ pin.clear
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinClearInterruptTest < PinTest
4
+ def test_clear_interrupt
5
+ pin = PiDriver::Pin.new @pin_number
6
+ interrupt_thread = pin.interrupt { }
7
+ interrupt_thread.expects(:kill)
8
+ pin.clear_interrupt
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinErrorTest < PinTest
4
+ def test_error_gpio_number
5
+ assert_raises ArgumentError do
6
+ PiDriver::Pin.new 17
7
+ end
8
+ end
9
+
10
+ def test_error_direction
11
+ assert_raises ArgumentError do
12
+ PiDriver::Pin.new direction: :invalid_direction
13
+ end
14
+ end
15
+
16
+ def test_error_value_new
17
+ assert_raises ArgumentError do
18
+ PiDriver::Pin.new direction: :out, state: 2
19
+ end
20
+ end
21
+
22
+ def test_error_value
23
+ pin = PiDriver::Pin.new @pin_number
24
+ assert_raises ArgumentError do
25
+ pin.output 2
26
+ end
27
+ end
28
+
29
+ def test_error_edge
30
+ pin = PiDriver::Pin.new @pin_number
31
+ assert_raises ArgumentError do
32
+ pin.interrupt(:invalid_edge) { }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinInputTest < PinTest
4
+ def test_input_new_default
5
+ expect_export_write
6
+ expect_direction_write(:in)
7
+ expect_value_read('0')
8
+ PiDriver::Pin.new @pin_number
9
+ end
10
+
11
+ def test_input_new_ignore_value
12
+ expect_export_write
13
+ expect_direction_write(:in)
14
+ expect_value_read('0')
15
+ PiDriver::Pin.new @pin_number, state: 1
16
+ end
17
+
18
+ def test_input
19
+ pin = PiDriver::Pin.new @pin_number, direction: :out
20
+ expect_direction_write(:in)
21
+ pin.input
22
+ end
23
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinInterruptTest < PinTest
4
+ def test_interrupt
5
+ pin = PiDriver::Pin.new @pin_number
6
+ interrupt = mock
7
+
8
+ [:rising, :falling, :both, :none].each do |edge|
9
+ begin
10
+ PiDriver::Utils::Interrupt.expects(:new).with(edge).returns(interrupt)
11
+ interrupt.expects(:start)
12
+ pin.interrupt(edge)
13
+ ensure
14
+ interrupt.expects(:clear)
15
+ pin.clear_interrupt
16
+ end
17
+ end
18
+ end
19
+
20
+ def test_interrupt_default
21
+ pin = PiDriver::Pin.new @pin_number
22
+
23
+ begin
24
+ interrupt_default = sequence('interrupt default')
25
+ expect_value_read(0).in_sequence(interrupt_default)
26
+ expect_value_read(1).at_least_once.in_sequence(interrupt_default)
27
+
28
+ interrupted = false
29
+ pin.interrupt { interrupted = true }
30
+ timeout { interrupted }
31
+ ensure
32
+ pin.clear_interrupt
33
+ end
34
+ end
35
+
36
+ def test_interrupt_argument
37
+ pin = PiDriver::Pin.new @pin_number
38
+
39
+ begin
40
+ interrupt_argument = sequence('interrupt argument')
41
+ expect_value_read(1).in_sequence(interrupt_argument)
42
+ expect_value_read(0).at_least_once.in_sequence(interrupt_argument)
43
+
44
+ interrupted = false
45
+ pin.interrupt(:falling) { interrupted = true }
46
+ timeout { interrupted }
47
+ ensure
48
+ pin.clear_interrupt
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinIsClearTest < PinTest
4
+ def test_is_clear_input
5
+ pin = PiDriver::Pin.new @pin_number
6
+ expect_value_read('0').twice
7
+ assert pin.clear?
8
+ refute pin.set?
9
+ end
10
+
11
+ def test_is_clear_output
12
+ pin = PiDriver::Pin.new @pin_number, direction: :out
13
+ expect_value_read('0').never
14
+ assert pin.clear?
15
+ refute pin.set?
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinIsInputTest < PinTest
4
+ def test_is_input_new_default
5
+ pin = PiDriver::Pin.new @pin_number
6
+ assert pin.input?
7
+ end
8
+
9
+ def test_is_input
10
+ pin = PiDriver::Pin.new @pin_number, direction: :out
11
+ pin.input
12
+ assert pin.input?
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../pin_test_helper'
2
+
3
+ class PinIsOutputTest < PinTest
4
+ def test_is_output_new
5
+ pin = PiDriver::Pin.new @pin_number, direction: :out
6
+ assert pin.output?
7
+ end
8
+
9
+ def test_is_output
10
+ pin = PiDriver::Pin.new @pin_number
11
+ pin.output
12
+ assert pin.output?
13
+ end
14
+ end