denko-piboard 0.13.2 → 0.14.0

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +154 -132
  4. data/Rakefile +0 -5
  5. data/board_maps/README.md +59 -0
  6. data/board_maps/orange_pi_zero_2w.yml +85 -0
  7. data/board_maps/radxa_zero3.yml +88 -0
  8. data/board_maps/raspberry_pi.yml +95 -0
  9. data/denko_piboard.gemspec +6 -7
  10. data/examples/digital_io/bench_out.rb +22 -0
  11. data/examples/digital_io/rotary_encoder.rb +31 -0
  12. data/examples/display/ssd1306.rb +43 -0
  13. data/examples/i2c/bitbang_aht10.rb +18 -0
  14. data/examples/i2c/bitbang_search.rb +24 -0
  15. data/examples/i2c/bitbang_ssd1306_bench.rb +29 -0
  16. data/examples/i2c/search.rb +24 -0
  17. data/examples/led/blink.rb +10 -0
  18. data/examples/led/fade.rb +22 -0
  19. data/examples/led/ws2812_bounce.rb +36 -0
  20. data/examples/motor/servo.rb +16 -0
  21. data/examples/pi_system_monitor.rb +10 -8
  22. data/examples/pulse_io/buzzer.rb +34 -0
  23. data/examples/pulse_io/infrared.rb +25 -0
  24. data/examples/sensor/aht10.rb +17 -0
  25. data/examples/sensor/dht.rb +24 -0
  26. data/examples/sensor/ds18b20.rb +59 -0
  27. data/examples/sensor/hcsr04.rb +16 -0
  28. data/examples/sensor/neat_tph_readings.rb +32 -0
  29. data/examples/spi/bb_loopback.rb +31 -0
  30. data/examples/spi/loopback.rb +37 -0
  31. data/examples/spi/output_register.rb +38 -0
  32. data/lib/denko/piboard.rb +11 -2
  33. data/lib/denko/piboard_base.rb +18 -64
  34. data/lib/denko/piboard_core.rb +148 -130
  35. data/lib/denko/piboard_core_optimize_lookup.rb +31 -0
  36. data/lib/denko/piboard_hardware_pwm.rb +27 -0
  37. data/lib/denko/piboard_i2c.rb +59 -82
  38. data/lib/denko/piboard_i2c_bb.rb +48 -0
  39. data/lib/denko/piboard_infrared.rb +7 -44
  40. data/lib/denko/piboard_led_array.rb +9 -0
  41. data/lib/denko/piboard_map.rb +121 -38
  42. data/lib/denko/piboard_one_wire.rb +42 -0
  43. data/lib/denko/piboard_pulse.rb +11 -68
  44. data/lib/denko/piboard_servo.rb +8 -7
  45. data/lib/denko/piboard_spi.rb +44 -74
  46. data/lib/denko/piboard_spi_bb.rb +41 -0
  47. data/lib/denko/piboard_tone.rb +15 -26
  48. data/lib/denko/piboard_version.rb +1 -1
  49. data/scripts/99-denko.rules +9 -0
  50. data/scripts/set_permissions.rb +131 -0
  51. metadata +45 -17
  52. data/ext/gpiod/extconf.rb +0 -9
  53. data/ext/gpiod/gpiod.c +0 -179
  54. data/lib/gpiod.rb +0 -6
@@ -1,100 +1,70 @@
1
1
  module Denko
2
2
  class PiBoard
3
+ def spi_flags(mode)
4
+ mode ||= 0
5
+ raise ArgumentError, "invalid SPI mode #{mode}" unless (0..3).include? mode
3
6
 
4
- def spi_config(mode, bit_order)
5
- # Config is a 32-bit mask, where bits 0 and 1 are a 2-bit number equal to the SPI mode.
6
- # Default to SPI mode 0 when none given.
7
- config = mode || 0
8
- raise ArgumentError, "invalid SPI mode #{config}" unless (0..3).include? config
9
-
10
- # Default to :msbfirst when bit_order not given.
11
- bit_order ||= :msbfirst
12
- unless (bit_order == :msbfirst) || (bit_order == :lsbfirst)
13
- raise ArgumentError, "invalid bit order #{bitorder}"
14
- end
15
-
16
- # Bits 14 and 15 control MSBFIRST (0) or LSBFIRST (1) for MOSI and MISO respectively.
17
- # Use same order for both directions like Arduino does.
18
- config |= (0b11 << 14) if bit_order == :lsbfirst
19
-
20
- # Use SPI1 interface instead of SPI0.
21
- # Setting bit 8 means we're using SPI1.
22
- config |= (0b1 << 8)
23
-
24
- # Bits 5-7 set leaves all CE pins free, and allows any GPIO to be used for chip enable.
25
- # We toggle separately in #spi_transfer.
26
- config |= (0b111 << 5)
7
+ # Flags is a 32-bit mask. Bits [1..0] are the SPI mode. Default to 0.
8
+ config = mode
27
9
 
28
10
  return config
29
11
  end
30
12
 
31
- # CMD = 26
32
- def spi_transfer(select_pin, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
33
- # Default to 1MHz SPI frequency.
34
- frequency ||= 1000000
35
-
36
- # Make SPI config mask.
37
- config = spi_config(mode, bit_order)
13
+ def spi_transfer(index, select, write:[], read:0, frequency: 1_000_000, mode: 0, bit_order: nil)
14
+ # Default frequency. Flags just has mode.
15
+ frequency ||= 1_000_000
16
+ flags = spi_flags(mode)
17
+ handle = spi_open(index, frequency, flags)
38
18
 
39
- # Open SPI handle.
40
- spi_open(frequency, config)
41
-
42
- # Chip enable low. select_pin == 255 means no chip enable (mostly for APA102 LEDs).
43
- digital_write(select_pin, 0) unless select_pin == 255
19
+ # Handle select_pin unless it's same as CS0 for this interface.
20
+ digital_write(select, 0) if select && (select != map[:spis][index][:cs0])
21
+ bytes = LGPIO.spi_xfer(handle, write, read)
22
+ spi_close(handle)
23
+ digital_write(select, 1) if select && (select != map[:spis][index][:cs0])
44
24
 
45
- # Do the SPI transfer.
46
- write_bytes = write.pack("C*")
47
- read_bytes = Pigpio::IF.spi_xfer(pi_handle, spi_handle, write_bytes)
25
+ spi_c_error("xfer", bytes, index) if bytes.class == Integer
48
26
 
49
- # Close SPI handle.
50
- spi_close
51
-
52
- # Chip enable high. select_pin == 255 means no chip enable (mostly for APA102 LEDs).
53
- digital_write(select_pin, 1) unless select_pin == 255
54
-
55
- # Handle spi_xfer errors.
56
- raise StandardError, "spi_xfer error, code #{read_bytes}" if read_bytes.class == Integer
57
-
58
- # Handle read bytes.
59
- if read > 0
60
- message = ""
61
-
62
- # Format like a microcontrolelr would. Limit to number of bytes requested.
63
- i = 0
64
- while i < read
65
- message = "#{message},#{read_bytes[i].ord}"
66
- end
27
+ # Update component attached to select pin with read bytes.
28
+ self.update(select, bytes) if (read > 0 && select)
29
+ end
67
30
 
68
- # Call update with the message as if coming from select_pin.
69
- self.update(select_pin, message)
70
- end
31
+ def spi_listen(*arg, **kwargs)
32
+ raise NotImplementedError, "PiBoard#spi_listen not implemented yet"
71
33
  end
72
34
 
73
- # CMD = 27
74
- def spi_listen
35
+ def spi_stop(pin)
75
36
  end
76
37
 
77
- # CMD = 28
78
- def spi_stop
38
+ def spi_listeners
39
+ @spi_listeners ||= Array.new
79
40
  end
80
41
 
81
42
  private
82
43
 
83
- attr_reader :spi_handle
84
-
85
- def spi_open(frequency, config)
86
- # Give SPI channel as 0 (SPI CE0), even though we are toggling chip enable separately.
87
- @spi_handle = Pigpio::IF.spi_open(pi_handle, 0, frequency, config)
88
- raise StandardError, "SPI error, code #{@spi_handle}" if @spi_handle < 0
44
+ def spi_mutex(index)
45
+ spi_mutexes[index] ||= Mutex.new
89
46
  end
90
47
 
91
- def spi_close
92
- Pigpio::IF.spi_close(pi_handle, spi_handle)
93
- @spi_handle = nil
48
+ def spi_mutexes
49
+ @spi_mutexes ||= []
94
50
  end
95
51
 
96
- def spi_listeners
97
- @spi_listeners ||= Array.new
52
+ def spi_open(index, frequency, flags=0x00)
53
+ # Always use 0 (SPI CS0) for channel. We are toggling chip enable separately.
54
+ handle = LGPIO.spi_open(index, 0, frequency, flags)
55
+ spi_c_error("open", handle, index) if handle < 0
56
+ handle
57
+ end
58
+
59
+ def spi_close(handle)
60
+ result = LGPIO.spi_close(handle)
61
+ if result < 0
62
+ raise StandardError, "lgpio C SPI close error: #{result} for handle #{handle}"
63
+ end
64
+ end
65
+
66
+ def spi_c_error(name, error, index)
67
+ raise StandardError, "lgpio C SPI #{name} error: #{error} for /dev/spidev#{index}"
98
68
  end
99
69
  end
100
70
  end
@@ -0,0 +1,41 @@
1
+ module Denko
2
+ class PiBoard
3
+ attr_reader :spi_bbs
4
+
5
+ def spi_bbs
6
+ @spi_bbs ||= []
7
+ end
8
+
9
+ def spi_bb_interface(clock, input, output)
10
+ # Convert the pins into a config array to check.
11
+ ch, cl = gpio_tuple(clock)
12
+ ih, il = input ? gpio_tuple(input) : [nil, nil]
13
+ oh, ol = output ? gpio_tuple(output) : [nil, nil]
14
+ config = [ch, cl, ih, il, oh, ol]
15
+
16
+ # Check if any already exists with that array and return it.
17
+ spi_bbs.each { |bb| return bb if (config == bb.config) }
18
+
19
+ # If not, create one.
20
+ hash = { clock: { handle: ch, line: cl },
21
+ input: { handle: ih, line: il },
22
+ output: { handle: oh, line: ol } }
23
+
24
+ spi_bb = LGPIO::SPIBitBang.new(hash)
25
+ spi_bbs << spi_bb
26
+ spi_bb
27
+ end
28
+
29
+ def spi_bb_transfer(select, clock:, input: nil, output: nil, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
30
+ interface = spi_bb_interface(clock, input, output)
31
+ select_hash = select ? { handle: gpio_tuple(select)[0], line: gpio_tuple(select)[0] } : nil
32
+
33
+ bytes = interface.transfer(write: write, read: read, select: select_hash, order: bit_order, mode: mode)
34
+ self.update(select, bytes) if (read > 0 && select)
35
+ end
36
+
37
+ def spi_bb_listen(*arg, **kwargs)
38
+ raise NotImplementedError, "PiBoard#spi_bb_listen not implemented yet"
39
+ end
40
+ end
41
+ end
@@ -2,38 +2,27 @@ module Denko
2
2
  class PiBoard
3
3
  # CMD = 17
4
4
  def tone(pin, frequency, duration=nil)
5
- # 32-bit mask where only the bit corresponding to the GPIO in use is set.
6
- pin_mask = 1 << pin
7
-
8
- if @aarch64
9
- # pigpio doubles wave times on 64-bit systems for some reason. Halve it to compensate.
10
- half_wave_time = (250000.0 / frequency).round
5
+ if @hardware_pwms[pin]
6
+ @hardware_pwms[pin].frequency = frequency
7
+ @hardware_pwms[pin].duty_percent = 33
8
+ sleep duration if duration
11
9
  else
12
- # This is the true halve wave time.
13
- half_wave_time = (500000.0 / frequency).round
14
- end
15
-
16
- # Standard wave setup.
17
- new_wave
18
- wave.tx_stop
19
- wave.clear
20
- wave.add_new
21
-
22
- # Build wave with a single cycle that will repeat.
23
- wave.add_generic [
24
- wave.pulse(pin_mask, 0x00, half_wave_time),
25
- wave.pulse(0x00, pin_mask, half_wave_time)
26
- ]
27
- wave_id = wave.create
10
+ raise ArgumentError, "maximum software PWM frequency is 10 kHz" if frequency > 10_000
11
+ cycles = 0
12
+ cycles = (frequency * duration).round if duration
28
13
 
29
- # Temporary workaround while Wave#send_repeat gets fixed.
30
- Pigpio::IF.wave_send_repeat(@pi_handle, wave_id)
31
- # wave.send_repeat(wave_id)
14
+ sleep 0.05 while (LGPIO.tx_room(@gpio_handle, pin, LGPIO::TX_PWM) == 0)
15
+ LGPIO.tx_pwm(@gpio_handle, pin, frequency, 33, 0, cycles)
16
+ end
32
17
  end
33
18
 
34
19
  # CMD = 18
35
20
  def no_tone(pin)
36
- stop_wave
21
+ digital_write(pin, HIGH)
22
+ end
23
+
24
+ def tone_busy(pin)
25
+ LGPIO.tx_busy(@gpio_handle, pin, LGPIO::TX_PWM)
37
26
  end
38
27
  end
39
28
  end
@@ -1,5 +1,5 @@
1
1
  module Denko
2
2
  class PiBoard
3
- VERSION = '0.13.2'
3
+ VERSION = '0.14.0'
4
4
  end
5
5
  end
@@ -0,0 +1,9 @@
1
+ #
2
+ # A system ruby must be installed at /usr/bin/ruby
3
+ # Change path/to/set_permissions.rb to the full path where you saved the permissions script
4
+ # Ensure the USERNAME constant, in that copy of the script, is set to your Linux username as a string literal.
5
+ #
6
+ SUBSYSTEM=="gpio*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb gpio"
7
+ SUBSYSTEM=="i2c*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb i2c"
8
+ SUBSYSTEM=="spidev*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb spi"
9
+ SUBSYSTEM=="pwm*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb pwm"
@@ -0,0 +1,131 @@
1
+ require 'yaml'
2
+
3
+ # `whoami` returns the name of the user running this script.
4
+ #
5
+ # If you automate this to run on startup (as root), you must put
6
+ # your literal Linux username here instead. If not, it will attempt
7
+ # to load a map from root's home, and root will get permissions, not you.
8
+ #
9
+ USERNAME = `whoami`.strip
10
+
11
+ GPIO_GROUP_NAME = "gpio"
12
+ I2C_GROUP_NAME = "i2c"
13
+ SPI_GROUP_NAME = "spi"
14
+ PWM_GROUP_NAME = "pwm"
15
+
16
+ MAP_FILENAME = ".denko_piboard_map.yml"
17
+ $added_to_group = false
18
+
19
+ # Create groups and add the user to them as needed.
20
+ def group_setup(group_name)
21
+ group_line = `egrep -i "^#{group_name}" /etc/group`
22
+
23
+ if group_line.empty?
24
+ `sudo groupadd #{group_name}`
25
+ end
26
+
27
+ unless group_line.match(/#{USERNAME}/)
28
+ `sudo usermod -aG #{group_name} #{USERNAME}`
29
+ puts "Added user #{USERNAME} to group #{group_name}. "
30
+ $added_to_group = true
31
+ else
32
+ puts "User #{USERNAME} already in group #{group_name}. "
33
+ end
34
+ end
35
+
36
+ # Change gpiochip ownership and permissions.
37
+ def setup_gpio
38
+ gpiochips = $map["pins"].each_value.map { |pin_def| pin_def["chip"] }.uniq
39
+ group_setup(GPIO_GROUP_NAME) unless gpiochips.empty?
40
+ gpiochips.each do |chip_index|
41
+ `sudo chgrp #{GPIO_GROUP_NAME} /dev/gpiochip#{chip_index}*`
42
+ `sudo chmod g+rw /dev/gpiochip#{chip_index}*`
43
+ puts "Set permissions for /dev/gpiochip#{chip_index}"
44
+ end
45
+ end
46
+
47
+ # Change I2C ownership and permissions
48
+ def setup_i2c
49
+ i2cs = $map["i2cs"].keys
50
+ group_setup(I2C_GROUP_NAME) unless i2cs.empty?
51
+ i2cs.each do |i2c_index|
52
+ dev = "/dev/i2c-#{i2c_index}"
53
+ `sudo chgrp #{I2C_GROUP_NAME} #{dev}`
54
+ `sudo chmod g+rw #{dev}`
55
+ puts "Set permissions for #{dev}"
56
+ end
57
+ end
58
+
59
+ # Change SPI ownership and permissions
60
+ def setup_spi
61
+ spis = $map["spis"].keys
62
+ group_setup(SPI_GROUP_NAME) unless spis.empty?
63
+ spis.each do |spi_index|
64
+ dev = "/dev/spidev#{spi_index}"
65
+ `sudo chgrp #{SPI_GROUP_NAME} #{dev}*`
66
+ `sudo chmod g+rw #{dev}*`
67
+ puts "Set permissions for #{dev}.*"
68
+ end
69
+ end
70
+
71
+ def setup_pwm
72
+ # Change PWM ownership and permissions
73
+ pwms = $map["pwms"]
74
+ unless pwms.empty?
75
+ group_setup(PWM_GROUP_NAME)
76
+ print "Exported and set permissions for: /sys/class/pwm/{"
77
+ end
78
+
79
+ i = 0
80
+ pwms.each_value do |hash|
81
+ i += 1
82
+ chip = hash["pwmchip"]
83
+ chan = hash["channel"]
84
+ chip_dir = "/sys/class/pwm/pwmchip#{chip}"
85
+ channel_dir = "/sys/class/pwm/pwmchip#{chip}/pwm#{chan}"
86
+
87
+ # Chip dir permissions
88
+ `sudo chgrp -RH #{PWM_GROUP_NAME} #{chip_dir}`
89
+ `sudo chmod -R g+rw #{chip_dir}`
90
+
91
+ # Export
92
+ `sudo echo #{chan} > #{chip_dir}/export` unless Dir.exist?(channel_dir)
93
+
94
+ # Channel dir permissions
95
+ `sudo chgrp -RH #{PWM_GROUP_NAME} #{channel_dir}`
96
+ `sudo chmod -R g+rw #{channel_dir}`
97
+
98
+ print channel_dir.gsub("/sys/class/pwm/", "")
99
+ print ", " unless i == pwms.length
100
+ end
101
+ puts "}"
102
+ end
103
+
104
+ # Load map
105
+ home = Dir.home(USERNAME)
106
+ yaml_path = home +"/#{MAP_FILENAME}"
107
+ $map = YAML.load_file(yaml_path)
108
+ puts
109
+
110
+ case ARGV[0]
111
+ when "gpio"
112
+ setup_gpio
113
+ when "i2c"
114
+ setup_i2c
115
+ when "spi"
116
+ setup_spi
117
+ when "pwm"
118
+ setup_pwm
119
+ else
120
+ setup_gpio
121
+ setup_i2c
122
+ setup_spi
123
+ setup_pwm
124
+ end
125
+
126
+ # Notify user
127
+ if $added_to_group
128
+ puts
129
+ puts "User #{USERNAME} has been added to new group(s). Log out, then log back in for this to take effect."
130
+ end
131
+ puts
metadata CHANGED
@@ -1,70 +1,98 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: denko-piboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.2
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - vickash
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-27 00:00:00.000000000 Z
11
+ date: 2024-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: pigpio
14
+ name: lgpio
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.12
19
+ version: '0.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.1.12
26
+ version: '0.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: denko
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.13'
33
+ version: '0.14'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.13'
41
- description: Denko::PiBoard is a drop-in replacement for Denko::Board. Use denko features
42
- and component classes to be used directly on a Raspberry Pi.
40
+ version: '0.14'
41
+ description: Use Linux single-board-computer GPIO, I2C, SPI and PWM in Ruby
43
42
  email: mail@vickash.com
44
43
  executables: []
45
- extensions:
46
- - ext/gpiod/extconf.rb
44
+ extensions: []
47
45
  extra_rdoc_files: []
48
46
  files:
49
47
  - LICENSE
50
48
  - README.md
51
49
  - Rakefile
50
+ - board_maps/README.md
51
+ - board_maps/orange_pi_zero_2w.yml
52
+ - board_maps/radxa_zero3.yml
53
+ - board_maps/raspberry_pi.yml
52
54
  - denko_piboard.gemspec
55
+ - examples/digital_io/bench_out.rb
56
+ - examples/digital_io/rotary_encoder.rb
57
+ - examples/display/ssd1306.rb
58
+ - examples/i2c/bitbang_aht10.rb
59
+ - examples/i2c/bitbang_search.rb
60
+ - examples/i2c/bitbang_ssd1306_bench.rb
61
+ - examples/i2c/search.rb
62
+ - examples/led/blink.rb
63
+ - examples/led/fade.rb
64
+ - examples/led/ws2812_bounce.rb
65
+ - examples/motor/servo.rb
53
66
  - examples/pi_system_monitor.rb
54
- - ext/gpiod/extconf.rb
55
- - ext/gpiod/gpiod.c
67
+ - examples/pulse_io/buzzer.rb
68
+ - examples/pulse_io/infrared.rb
69
+ - examples/sensor/aht10.rb
70
+ - examples/sensor/dht.rb
71
+ - examples/sensor/ds18b20.rb
72
+ - examples/sensor/hcsr04.rb
73
+ - examples/sensor/neat_tph_readings.rb
74
+ - examples/spi/bb_loopback.rb
75
+ - examples/spi/loopback.rb
76
+ - examples/spi/output_register.rb
56
77
  - lib/denko/piboard.rb
57
78
  - lib/denko/piboard_base.rb
58
79
  - lib/denko/piboard_core.rb
80
+ - lib/denko/piboard_core_optimize_lookup.rb
81
+ - lib/denko/piboard_hardware_pwm.rb
59
82
  - lib/denko/piboard_i2c.rb
83
+ - lib/denko/piboard_i2c_bb.rb
60
84
  - lib/denko/piboard_infrared.rb
85
+ - lib/denko/piboard_led_array.rb
61
86
  - lib/denko/piboard_map.rb
87
+ - lib/denko/piboard_one_wire.rb
62
88
  - lib/denko/piboard_pulse.rb
63
89
  - lib/denko/piboard_servo.rb
64
90
  - lib/denko/piboard_spi.rb
91
+ - lib/denko/piboard_spi_bb.rb
65
92
  - lib/denko/piboard_tone.rb
66
93
  - lib/denko/piboard_version.rb
67
- - lib/gpiod.rb
94
+ - scripts/99-denko.rules
95
+ - scripts/set_permissions.rb
68
96
  homepage: https://github.com/denko-rb/denko-piboard
69
97
  licenses:
70
98
  - MIT
@@ -78,15 +106,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
78
106
  requirements:
79
107
  - - ">="
80
108
  - !ruby/object:Gem::Version
81
- version: '0'
109
+ version: '3'
82
110
  required_rubygems_version: !ruby/object:Gem::Requirement
83
111
  requirements:
84
112
  - - ">="
85
113
  - !ruby/object:Gem::Version
86
114
  version: '0'
87
115
  requirements: []
88
- rubygems_version: 3.4.13
116
+ rubygems_version: 3.5.20
89
117
  signing_key:
90
118
  specification_version: 4
91
- summary: Use Raspberry Pi built-in GPIO as a Board class with the denko gem
119
+ summary: Linux SBC GPIO in Ruby
92
120
  test_files: []
data/ext/gpiod/extconf.rb DELETED
@@ -1,9 +0,0 @@
1
- require 'mkmf'
2
-
3
- #
4
- # Need libgpiod-dev installed.
5
- # sudo apt install libgpiod-dev
6
- #
7
- $libs += " -lgpiod"
8
-
9
- create_makefile('gpiod/gpiod')