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.
- checksums.yaml +4 -4
- data/lib/pi_driver.rb +3 -1
- data/lib/pi_driver/device.rb +6 -0
- data/lib/pi_driver/device/mcp23017.rb +129 -0
- data/lib/pi_driver/device/mcp23017/hardware_address.rb +37 -0
- data/lib/pi_driver/device/mcp23017/port.rb +23 -0
- data/lib/pi_driver/device/mcp23017/register.rb +98 -0
- data/lib/pi_driver/device/mcp23017/register/defval.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/gpinten.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/gpio.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/gppu.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/intcap.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/intcon.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/intf.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/iocon.rb +41 -0
- data/lib/pi_driver/device/mcp23017/register/iodir.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/ipol.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/olat.rb +14 -0
- data/lib/pi_driver/device/mcp23017/register/register_helper.rb +50 -0
- data/lib/pi_driver/i2c_master.rb +6 -15
- data/lib/pi_driver/pin.rb +25 -49
- data/lib/pi_driver/pin/board.rb +65 -0
- data/lib/pi_driver/pin/direction.rb +13 -0
- data/lib/pi_driver/pin/directory_helper.rb +32 -0
- data/lib/pi_driver/pin/file_helper.rb +32 -0
- data/lib/pi_driver/utils.rb +10 -0
- data/lib/pi_driver/utils/argument_helper.rb +19 -0
- data/lib/pi_driver/utils/byte.rb +21 -0
- data/lib/pi_driver/utils/edge.rb +17 -0
- data/lib/pi_driver/utils/interrupt.rb +60 -0
- data/lib/pi_driver/utils/state.rb +13 -0
- data/test/device/mcp23017/test_alias.rb +27 -0
- data/test/device/mcp23017/test_error.rb +37 -0
- data/test/device/mcp23017/test_hardware_address.rb +29 -0
- data/test/device/mcp23017/test_i2c_master.rb +10 -0
- data/test/device/mcp23017/test_read.rb +63 -0
- data/test/device/mcp23017/test_register.rb +118 -0
- data/test/device/mcp23017/test_write.rb +49 -0
- data/test/device/mcp23017_test_helper.rb +13 -0
- data/test/i2c_master/test_ack.rb +26 -0
- data/test/i2c_master/test_address.rb +15 -0
- data/test/i2c_master/test_alias.rb +7 -0
- data/test/i2c_master/test_clock_stretch.rb +26 -0
- data/test/i2c_master/test_read.rb +27 -0
- data/test/i2c_master/test_speed.rb +11 -0
- data/test/i2c_master/test_start.rb +11 -0
- data/test/i2c_master/test_stop.rb +24 -0
- data/test/i2c_master/test_write.rb +29 -0
- data/test/i2c_master_test_helper.rb +28 -0
- data/test/pin/test_alias.rb +23 -0
- data/test/pin/test_clear.rb +15 -0
- data/test/pin/test_clear_interrupt.rb +10 -0
- data/test/pin/test_error.rb +35 -0
- data/test/pin/test_input.rb +23 -0
- data/test/pin/test_interrupt.rb +51 -0
- data/test/pin/test_is_clear.rb +17 -0
- data/test/pin/test_is_input.rb +14 -0
- data/test/pin/test_is_output.rb +14 -0
- data/test/pin/test_is_set.rb +17 -0
- data/test/pin/test_output.rb +38 -0
- data/test/pin/test_set.rb +15 -0
- data/test/pin_test_helper.rb +45 -0
- data/test/test_helper.rb +14 -0
- data/test/utils/test_error.rb +31 -0
- data/test/utils/test_interrupt.rb +109 -0
- data/test/utils_test_helper.rb +6 -0
- 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,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,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,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
|