ws2801 0.2 → 1.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.
- data/lib/ws2801.rb +54 -15
- metadata +1 -1
    
        data/lib/ws2801.rb
    CHANGED
    
    | @@ -1,9 +1,11 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # Controller for: RGB Pixel with WS2801 Chip
         | 
| 3 3 | 
             
            # build for Diffused Digital RGB LED Pixels from Adafruits on Raspberry Pi
         | 
| 4 | 
            -
            #  | 
| 5 | 
            -
             | 
| 6 | 
            -
            # | 
| 4 | 
            +
            # but should work on any device and the same led chip
         | 
| 5 | 
            +
            # (c) 2013 Roman Pramberger (roman@pramberger.ch)
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # WS2801 user-space driver
         | 
| 8 | 
            +
            #
         | 
| 7 9 | 
             
            module WS2801
         | 
| 8 10 | 
             
            	@@options = {
         | 
| 9 11 | 
             
            		:len => 25,
         | 
| @@ -89,37 +91,74 @@ module WS2801 | |
| 89 91 | 
             
            	# Set pixel to color
         | 
| 90 92 | 
             
            	#
         | 
| 91 93 | 
             
            	# Example:
         | 
| 92 | 
            -
            	#  >> WS2801.set { :r => 255, : | 
| 93 | 
            -
            	#  >> WS2801.set { :g => 128, : | 
| 94 | 
            -
            	#  >> WS2801.set { :r => 40, :g => 255, :b => 200, : | 
| 94 | 
            +
            	#  >> WS2801.set { :r => 255, :pixel => [1..10] }
         | 
| 95 | 
            +
            	#  >> WS2801.set { :g => 128, :pixel => :all }
         | 
| 96 | 
            +
            	#  >> WS2801.set { :r => 40, :g => 255, :b => 200, :pixel => 4 }
         | 
| 95 97 | 
             
            	#
         | 
| 96 98 | 
             
            	# Options:
         | 
| 97 | 
            -
            	#  : | 
| 99 | 
            +
            	#  :pixel => []      # array with pixel ids
         | 
| 98 100 | 
             
            	#	 :r => (Integer)
         | 
| 99 101 | 
             
            	#	 :g => (Integer)
         | 
| 100 102 | 
             
            	#	 :b => (Integer)
         | 
| 101 103 | 
             
            	def self.set options = {}
         | 
| 102 104 | 
             
            		self.generate if @@options[:strip].length == 0
         | 
| 103 | 
            -
            		options[: | 
| 104 | 
            -
            		options[: | 
| 105 | 
            -
            		options[: | 
| 105 | 
            +
            		options[:pixel] = (0..(self.length-1)).to_a if options[:pixel].nil? or options[:pixel] == :all
         | 
| 106 | 
            +
            		options[:pixel] = [options[:pixel]] if options[:pixel].is_a? Numeric
         | 
| 107 | 
            +
            		options[:pixel].each do |i|
         | 
| 106 108 | 
             
            			@@options[:strip][(i*3)]	 = options[:r] || 0
         | 
| 107 109 | 
             
            			@@options[:strip][(i*3)+1] = options[:g] || 0
         | 
| 108 110 | 
             
            			@@options[:strip][(i*3)+2] = options[:b] || 0
         | 
| 109 111 | 
             
            		end
         | 
| 110 | 
            -
            		self.write if @@options[:autowrite] | 
| 112 | 
            +
            		self.write if @@options[:autowrite]
         | 
| 111 113 | 
             
            	end
         | 
| 112 114 |  | 
| 113 | 
            -
            	# Fade to color
         | 
| 115 | 
            +
            	# Fade pixel to color
         | 
| 116 | 
            +
            	#
         | 
| 117 | 
            +
            	# Example:
         | 
| 118 | 
            +
            	#  >> WS2801.set { :r => 255, :pixel => [1..10], :timeout => 0.1 }
         | 
| 119 | 
            +
            	#  >> WS2801.set { :g => 128, :pixel => :all }
         | 
| 120 | 
            +
            	#  >> WS2801.set { :r => 40, :g => 255, :b => 200, :pixel => 4 }
         | 
| 114 121 | 
             
            	#
         | 
| 115 | 
            -
            	#  | 
| 122 | 
            +
            	# Options:
         | 
| 123 | 
            +
            	#  :pixel => []      # array with pixel ids
         | 
| 124 | 
            +
            	#  :timeout => (Float)
         | 
| 125 | 
            +
            	#	 :r => (Integer)
         | 
| 126 | 
            +
            	#	 :g => (Integer)
         | 
| 127 | 
            +
            	#	 :b => (Integer)
         | 
| 128 | 
            +
            	def self.fade options = {}
         | 
| 129 | 
            +
            		self.generate if @@options[:strip].length == 0
         | 
| 130 | 
            +
            		options[:pixel] = (0..(self.length-1)).to_a if options[:pixel].nil? or options[:pixel] == :all
         | 
| 131 | 
            +
            		options[:pixel] = [options[:pixel]] if options[:pixel].is_a? Numeric
         | 
| 132 | 
            +
            		options[:r] = 0 if options[:r].nil?
         | 
| 133 | 
            +
            		options[:g] = 0 if options[:g].nil?
         | 
| 134 | 
            +
            		options[:b] = 0 if options[:b].nil?
         | 
| 135 | 
            +
             | 
| 136 | 
            +
            		breakme = 0
         | 
| 137 | 
            +
            		while true
         | 
| 138 | 
            +
            			options[:pixel].each do |i|
         | 
| 139 | 
            +
            				next if @@options[:strip][(i*3+2)] == options[:b] and @@options[:strip][(i*3+1)] == options[:g] and @@options[:strip][(i*3)] == options[:r]
         | 
| 140 | 
            +
            				@@options[:strip][(i*3)]   -= 1 if @@options[:strip][(i*3)]   > options[:r]
         | 
| 141 | 
            +
            				@@options[:strip][(i*3)]   += 1 if @@options[:strip][(i*3)]   < options[:r]
         | 
| 142 | 
            +
            				@@options[:strip][(i*3+1)] -= 1 if @@options[:strip][(i*3+1)] > options[:g]
         | 
| 143 | 
            +
            				@@options[:strip][(i*3+1)] += 1 if @@options[:strip][(i*3+1)] < options[:g]
         | 
| 144 | 
            +
            				@@options[:strip][(i*3+2)] -= 1 if @@options[:strip][(i*3+2)] > options[:b]
         | 
| 145 | 
            +
            				@@options[:strip][(i*3+2)] += 1 if @@options[:strip][(i*3+2)] < options[:b]
         | 
| 146 | 
            +
            				breakme += 1 if @@options[:strip][(i*3+2)] == options[:b] and @@options[:strip][(i*3+1)] == options[:g] and @@options[:strip][(i*3)] == options[:r]
         | 
| 147 | 
            +
            			end
         | 
| 148 | 
            +
            			self.write if @@options[:autowrite]
         | 
| 149 | 
            +
            			break if breakme >= @@options[:len]
         | 
| 150 | 
            +
             | 
| 151 | 
            +
            			sleep(options[:timeout] || 0.01)
         | 
| 152 | 
            +
            		end
         | 
| 153 | 
            +
            	end
         | 
| 154 | 
            +
             | 
| 116 155 |  | 
| 117 | 
            -
            	# Set off | 
| 156 | 
            +
            	# Set off
         | 
| 118 157 | 
             
            	#
         | 
| 119 158 | 
             
            	# Example:
         | 
| 120 159 | 
             
            	#	 >> WS2801.off
         | 
| 121 160 | 
             
            	def self.off
         | 
| 122 161 | 
             
            		self.generate
         | 
| 123 | 
            -
            		self.write if @@options[:autowrite] | 
| 162 | 
            +
            		self.write if @@options[:autowrite]
         | 
| 124 163 | 
             
            	end
         | 
| 125 164 | 
             
            end
         |