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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a7911c66c972390a7e29125befb058062ca4843
|
4
|
+
data.tar.gz: 96117a7d39eb4ff1b0a391ee672a9c49b0460353
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b63ed0825623d485602850e0f70ae8ad2d5768a9a2145b11b1c97cd37698622e19ab5f14e2c61833e81fe3e7ca7fc6ddc5e65e9b4ca962b3c577d80828fa9db
|
7
|
+
data.tar.gz: 1d0249b62cf2f6e653178760dc17e3b8caf7d62a83bd22096b4b48ef38d211b1e0967bcea18f2cbfe5eccb3da0183418e23de228aea9481160ae8341b28d82b5
|
data/lib/pi_driver.rb
CHANGED
@@ -0,0 +1,129 @@
|
|
1
|
+
require_relative 'mcp23017/hardware_address'
|
2
|
+
require_relative 'mcp23017/port'
|
3
|
+
require_relative 'mcp23017/register'
|
4
|
+
require_relative 'mcp23017/register/iodir'
|
5
|
+
require_relative 'mcp23017/register/ipol'
|
6
|
+
require_relative 'mcp23017/register/gpinten'
|
7
|
+
require_relative 'mcp23017/register/defval'
|
8
|
+
require_relative 'mcp23017/register/intcon'
|
9
|
+
require_relative 'mcp23017/register/iocon'
|
10
|
+
require_relative 'mcp23017/register/gppu'
|
11
|
+
require_relative 'mcp23017/register/intf'
|
12
|
+
require_relative 'mcp23017/register/intcap'
|
13
|
+
require_relative 'mcp23017/register/gpio'
|
14
|
+
require_relative 'mcp23017/register/olat'
|
15
|
+
|
16
|
+
module PiDriver
|
17
|
+
class Device
|
18
|
+
class MCP23017
|
19
|
+
attr_reader :hardware_address
|
20
|
+
|
21
|
+
def initialize(options = {})
|
22
|
+
@argument_helper = Utils::ArgumentHelper.new prefix: "MCP23017"
|
23
|
+
@i2c_master = options[:i2c_master]
|
24
|
+
@hardware_address = HardwareAddress.new observer: self
|
25
|
+
update_opcodes
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_registers
|
29
|
+
bank = registers[:iocon].bank
|
30
|
+
registers.each do |_, register|
|
31
|
+
register.update_address bank
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_opcodes
|
36
|
+
bits = [0, 1, 0, 0, @hardware_address.a2, @hardware_address.a1, @hardware_address.a0]
|
37
|
+
base = Utils::Byte.bits_to_byte(bits)
|
38
|
+
@opcode_for_write = PiDriver::I2CMaster.prepare_address_for_write base
|
39
|
+
@opcode_for_read = PiDriver::I2CMaster.prepare_address_for_read base
|
40
|
+
end
|
41
|
+
|
42
|
+
def write(*register_array)
|
43
|
+
@i2c_master.start
|
44
|
+
|
45
|
+
register_array.each_with_index do |register, index|
|
46
|
+
@argument_helper.check(:register, register, registers.keys)
|
47
|
+
|
48
|
+
@i2c_master.write @opcode_for_write
|
49
|
+
@i2c_master.ack
|
50
|
+
@i2c_master.write registers[register].address
|
51
|
+
@i2c_master.ack
|
52
|
+
@i2c_master.write registers[register].byte
|
53
|
+
@i2c_master.ack
|
54
|
+
|
55
|
+
@i2c_master.restart unless index == register_array.length - 1
|
56
|
+
end
|
57
|
+
|
58
|
+
@i2c_master.stop
|
59
|
+
end
|
60
|
+
|
61
|
+
def read(*register_array)
|
62
|
+
@i2c_master.start
|
63
|
+
|
64
|
+
register_array.each_with_index do |register, index|
|
65
|
+
@argument_helper.check(:register, register, registers.keys)
|
66
|
+
|
67
|
+
@i2c_master.write @opcode_for_write
|
68
|
+
@i2c_master.ack
|
69
|
+
@i2c_master.write registers[register].address
|
70
|
+
@i2c_master.ack
|
71
|
+
|
72
|
+
@i2c_master.restart
|
73
|
+
|
74
|
+
@i2c_master.write @opcode_for_read
|
75
|
+
@i2c_master.ack
|
76
|
+
registers[register].byte = @i2c_master.read
|
77
|
+
|
78
|
+
@i2c_master.restart unless index == register_array.length - 1
|
79
|
+
end
|
80
|
+
|
81
|
+
@i2c_master.stop
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def self.register_reader(*register_array)
|
87
|
+
register_array.each do |register|
|
88
|
+
define_method register do
|
89
|
+
registers[register]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
register_reader :iodira, :iodirb
|
95
|
+
register_reader :ipola, :ipolb
|
96
|
+
register_reader :gpintena, :gpintenb
|
97
|
+
register_reader :defvala, :defvalb
|
98
|
+
register_reader :intcona, :intconb
|
99
|
+
register_reader :iocon
|
100
|
+
register_reader :gppua, :gppub
|
101
|
+
register_reader :intfa, :intfb
|
102
|
+
register_reader :intcapa, :intcapb
|
103
|
+
register_reader :gpioa, :gpiob
|
104
|
+
register_reader :olata, :olatb
|
105
|
+
|
106
|
+
def registers
|
107
|
+
@registers ||= initialize_registers
|
108
|
+
end
|
109
|
+
|
110
|
+
def initialize_registers
|
111
|
+
{
|
112
|
+
iodira: Iodir.new(port: :a), iodirb: Iodir.new(port: :b),
|
113
|
+
ipola: Ipol.new(port: :a), ipolb: Ipol.new(port: :b),
|
114
|
+
gpintena: Gpinten.new(port: :a), gpintenb: Gpinten.new(port: :b),
|
115
|
+
defvala: Defval.new(port: :a), defvalb: Defval.new(port: :b),
|
116
|
+
intcona: Intcon.new(port: :a), intconb: Intcon.new(port: :b),
|
117
|
+
|
118
|
+
iocon: Iocon.new(observer: self),
|
119
|
+
|
120
|
+
gppua: Gppu.new(port: :a), gppub: Gppu.new(port: :b),
|
121
|
+
intfa: Intf.new(port: :a), intfb: Intf.new(port: :b),
|
122
|
+
intcapa: Intcap.new(port: :a), intcapb: Intcap.new(port: :b),
|
123
|
+
gpioa: Gpio.new(port: :a), gpiob: Gpio.new(port: :b),
|
124
|
+
olata: Olat.new(port: :a), olatb: Olat.new(port: :b)
|
125
|
+
}
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module PiDriver
|
2
|
+
class Device
|
3
|
+
class MCP23017
|
4
|
+
class HardwareAddress
|
5
|
+
attr_reader :a0, :a1, :a2
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
@argument_helper = Utils::ArgumentHelper.new prefix: "MCP23017::HardwareAddress"
|
9
|
+
|
10
|
+
@observer = options.delete :observer
|
11
|
+
|
12
|
+
@a0 = Utils::State::LOW
|
13
|
+
@a1 = Utils::State::LOW
|
14
|
+
@a2 = Utils::State::LOW
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def self.address_writer(*addresses)
|
20
|
+
addresses.each do |address|
|
21
|
+
setter_symbol = "#{address}=".to_sym
|
22
|
+
getter_instance = "@#{address}"
|
23
|
+
|
24
|
+
define_method setter_symbol do |value|
|
25
|
+
@argument_helper.check(:hardware_address, value, Utils::State::VALID_STATES)
|
26
|
+
instance_variable_set(getter_instance, value)
|
27
|
+
@observer.update_opcodes
|
28
|
+
instance_variable_get getter_instance
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
address_writer :a0, :a1, :a2
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PiDriver
|
2
|
+
class Device
|
3
|
+
class MCP23017
|
4
|
+
class Port
|
5
|
+
A = :a
|
6
|
+
B = :b
|
7
|
+
|
8
|
+
VALID_PORTS = [
|
9
|
+
A,
|
10
|
+
B
|
11
|
+
]
|
12
|
+
|
13
|
+
def self.default(options)
|
14
|
+
if options[:register] == MCP23017::Register::RegisterHelper::IODIR
|
15
|
+
Utils::Byte::ALL_BITS_HIGH
|
16
|
+
else
|
17
|
+
Utils::Byte::ALL_BITS_LOW
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require_relative 'register/register_helper'
|
2
|
+
|
3
|
+
# for class level methods
|
4
|
+
require_relative '../../utils'
|
5
|
+
|
6
|
+
module PiDriver
|
7
|
+
class Device
|
8
|
+
class MCP23017
|
9
|
+
class Register
|
10
|
+
attr_reader :address, :byte
|
11
|
+
|
12
|
+
def initialize(options)
|
13
|
+
@argument_helper = Utils::ArgumentHelper.new prefix: "MCP23017::Register"
|
14
|
+
|
15
|
+
@register = options[:register]
|
16
|
+
@port = options[:port]
|
17
|
+
options[:bank] = Utils::State::LOW
|
18
|
+
|
19
|
+
@address = RegisterHelper.address options
|
20
|
+
@byte = Port.default options
|
21
|
+
|
22
|
+
mirror_bits_from_byte
|
23
|
+
end
|
24
|
+
|
25
|
+
def byte=(value)
|
26
|
+
@argument_helper.check(:register_byte, value, Utils::Byte::VALID_BYTES)
|
27
|
+
@byte = value
|
28
|
+
mirror_bits_from_byte
|
29
|
+
@byte
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_address(bank)
|
33
|
+
options = { register: @register, port: @port, bank: bank }
|
34
|
+
@address = RegisterHelper.address options
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def self.bit_accessors
|
40
|
+
Utils::Byte::NUM_BITS_PER_BYTE.times do |bit_number|
|
41
|
+
string = "bit#{bit_number}"
|
42
|
+
|
43
|
+
getter_symbol = string.to_sym
|
44
|
+
setter_symbol = "#{string}=".to_sym
|
45
|
+
|
46
|
+
getter_instance = "@#{getter_symbol}"
|
47
|
+
|
48
|
+
define_method getter_symbol do
|
49
|
+
instance_variable_get getter_instance
|
50
|
+
end
|
51
|
+
|
52
|
+
define_method setter_symbol do |value|
|
53
|
+
@argument_helper.check(:register_bit, value, Utils::State::VALID_STATES)
|
54
|
+
instance_variable_set(getter_instance, value)
|
55
|
+
mirror_byte_from_bits
|
56
|
+
instance_variable_get getter_instance
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
bit_accessors
|
62
|
+
|
63
|
+
def self.mirror_bit_accessors(prefix_symbol)
|
64
|
+
Utils::Byte::NUM_BITS_PER_BYTE.times do |bit_number|
|
65
|
+
bit_string = "bit#{bit_number}"
|
66
|
+
new_string = "#{prefix_symbol}#{bit_number}"
|
67
|
+
|
68
|
+
bit_getter_symbol = bit_string.to_sym
|
69
|
+
bit_setter_symbol = "#{bit_string}=".to_sym
|
70
|
+
|
71
|
+
new_getter_symbol = new_string.to_sym
|
72
|
+
new_setter_symbol = "#{new_string}=".to_sym
|
73
|
+
|
74
|
+
alias_method new_getter_symbol, bit_getter_symbol
|
75
|
+
alias_method new_setter_symbol, bit_setter_symbol
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def mirror_bits_from_byte
|
80
|
+
byte_bits = Utils::Byte::byte_to_bits(@byte)
|
81
|
+
|
82
|
+
@bit0 = byte_bits.pop
|
83
|
+
@bit1 = byte_bits.pop
|
84
|
+
@bit2 = byte_bits.pop
|
85
|
+
@bit3 = byte_bits.pop
|
86
|
+
@bit4 = byte_bits.pop
|
87
|
+
@bit5 = byte_bits.pop
|
88
|
+
@bit6 = byte_bits.pop
|
89
|
+
@bit7 = byte_bits.pop
|
90
|
+
end
|
91
|
+
|
92
|
+
def mirror_byte_from_bits
|
93
|
+
@byte = Utils::Byte::bits_to_byte [@bit7, @bit6, @bit5, @bit4, @bit3, @bit2, @bit1, @bit0]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module PiDriver
|
2
|
+
class Device
|
3
|
+
class MCP23017
|
4
|
+
class Iocon < Register
|
5
|
+
def initialize(options)
|
6
|
+
@observer = options.delete :observer
|
7
|
+
options[:register] = :iocon
|
8
|
+
# IOCON is a single register with two addresses, go with PORT A
|
9
|
+
options[:port] = :a
|
10
|
+
super(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def bit7=(value)
|
14
|
+
super
|
15
|
+
@observer.update_registers
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :bank, :bit7
|
19
|
+
alias_method :bank=, :bit7=
|
20
|
+
|
21
|
+
alias_method :mirror, :bit6
|
22
|
+
alias_method :mirror=, :bit6=
|
23
|
+
|
24
|
+
alias_method :seqop, :bit5
|
25
|
+
alias_method :seqop=, :bit5=
|
26
|
+
|
27
|
+
alias_method :disslw, :bit4
|
28
|
+
alias_method :disslw=, :bit4=
|
29
|
+
|
30
|
+
alias_method :haen, :bit3
|
31
|
+
alias_method :haen=, :bit3=
|
32
|
+
|
33
|
+
alias_method :odr, :bit2
|
34
|
+
alias_method :odr=, :bit2=
|
35
|
+
|
36
|
+
alias_method :intpol, :bit1
|
37
|
+
alias_method :intpol=, :bit1=
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|