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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db8ff0ea07f81396952ed0e32dcb93568789b07b
4
- data.tar.gz: f9bbf070326600cc2baa2af12753a71660f0924c
3
+ metadata.gz: 3a7911c66c972390a7e29125befb058062ca4843
4
+ data.tar.gz: 96117a7d39eb4ff1b0a391ee672a9c49b0460353
5
5
  SHA512:
6
- metadata.gz: 305c2726c2f1063ebb0159f7ff50d99a1655e94cdd6c812c2801c80bb155f7b7c45a66aadc9cdff1389efa5bd009c862757b876610961a82603bccebc373458d
7
- data.tar.gz: 6e50dda35d0213b347ddc5fb0ae5577cdaa8256bd9d1fb341fc99732fb8a0dadc311d63c3073fae83b3b2207b94a17acf448cca6a2dc3d5e85ffdfaf55fee4a0
6
+ metadata.gz: 4b63ed0825623d485602850e0f70ae8ad2d5768a9a2145b11b1c97cd37698622e19ab5f14e2c61833e81fe3e7ca7fc6ddc5e65e9b4ca962b3c577d80828fa9db
7
+ data.tar.gz: 1d0249b62cf2f6e653178760dc17e3b8caf7d62a83bd22096b4b48ef38d211b1e0967bcea18f2cbfe5eccb3da0183418e23de228aea9481160ae8341b28d82b5
data/lib/pi_driver.rb CHANGED
@@ -1,5 +1,7 @@
1
- require_relative 'pi_driver/pin'
1
+ require_relative 'pi_driver/device'
2
2
  require_relative 'pi_driver/i2c_master'
3
+ require_relative 'pi_driver/pin'
4
+ require_relative 'pi_driver/utils'
3
5
 
4
6
  module PiDriver
5
7
  end
@@ -0,0 +1,6 @@
1
+ require_relative 'device/mcp23017'
2
+
3
+ module PiDriver
4
+ class Device
5
+ end
6
+ end
@@ -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,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Defval < Register
5
+ def initialize(options)
6
+ options[:register] = :defval
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :def
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Gpinten < Register
5
+ def initialize(options)
6
+ options[:register] = :gpinten
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :gpint
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Gpio < Register
5
+ def initialize(options)
6
+ options[:register] = :gpio
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :gp
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Gppu < Register
5
+ def initialize(options)
6
+ options[:register] = :gppu
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :pu
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Intcap < Register
5
+ def initialize(options)
6
+ options[:register] = :intcap
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :icp
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Intcon < Register
5
+ def initialize(options)
6
+ options[:register] = :intcon
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :ioc
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PiDriver
2
+ class Device
3
+ class MCP23017
4
+ class Intf < Register
5
+ def initialize(options)
6
+ options[:register] = :intf
7
+ super(options)
8
+ end
9
+
10
+ mirror_bit_accessors :int
11
+ end
12
+ end
13
+ end
14
+ 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