ws_light 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/bin/ws_light +16 -16
- data/lib/ws_light/sd_logger.rb +1 -1
- data/lib/ws_light/set/strawberry_set.rb +2 -0
- data/lib/ws_light/set/watermelon_set.rb +3 -1
- data/lib/ws_light/strip.rb +13 -38
- data/lib/ws_light/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c759d2c4fc062deccebc4190aa531af5f388cdd1
|
4
|
+
data.tar.gz: 0d471ef1d1f9b3988187f26e3efa57283df1731b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c643c0a4992cb7310469cc5c7070d791906836267b0b24d1f2b3b5e1269902f6e626d4c687ad0a5cf0d0f05241504df7a8ad7872cb1cce5283fcb30dba71062
|
7
|
+
data.tar.gz: 78f81988a236233f7e64ad735f61a6edba4d9ddf952b2e564f3904bc9103ae910db20788acd12bee5aa2d9c22a921f7d9b23b18ec31637769ba0abb0fd047deb
|
data/.gitignore
CHANGED
data/bin/ws_light
CHANGED
@@ -24,15 +24,25 @@ require 'bundler'
|
|
24
24
|
require 'ws_light/strip'
|
25
25
|
require 'ws_light/sd_logger'
|
26
26
|
|
27
|
+
PIN_RIGHT = 23
|
28
|
+
PIN_LEFT = 24
|
29
|
+
|
27
30
|
logger = WSLight::SDLogger.new
|
28
31
|
logger.debug = DEBUG
|
29
|
-
logger.filename = 'motion.log'
|
32
|
+
logger.filename = '/var/log/motion.log'
|
30
33
|
logger.log 'Starting up'
|
31
34
|
|
35
|
+
def unregister_pins
|
36
|
+
[PIN_RIGHT, PIN_LEFT].each do |pin|
|
37
|
+
File.open('/sys/class/gpio/unexport', 'w') { |f| f.write("#{pin}") }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
32
41
|
# Trap ^C
|
33
42
|
Signal.trap('INT') {
|
34
43
|
logger.log 'Shutting down'
|
35
44
|
logger.write_log
|
45
|
+
unregister_pins
|
36
46
|
exit
|
37
47
|
}
|
38
48
|
|
@@ -40,31 +50,21 @@ Signal.trap('INT') {
|
|
40
50
|
Signal.trap('TERM') {
|
41
51
|
logger.log 'Shutting down'
|
42
52
|
logger.write_log
|
53
|
+
unregister_pins
|
43
54
|
exit
|
44
55
|
}
|
45
56
|
|
46
57
|
strip = WSLight::Strip.new
|
47
58
|
strip.debug = DEBUG
|
48
59
|
|
49
|
-
|
50
|
-
pin_left = PiPiper::Pin.new(:pin => 23, :direction => :in)
|
51
|
-
|
52
|
-
after :pin => 23, :goes => :high do
|
60
|
+
after :pin => PIN_RIGHT, :goes => :high do
|
53
61
|
logger.log('Motion detected: RIGHT')
|
54
|
-
strip.on(
|
55
|
-
while pin_right.on?
|
56
|
-
strip.on(WSLight::Strip::DIRECTION_RIGHT)
|
57
|
-
sleep 1
|
58
|
-
end
|
62
|
+
strip.on(:direction_right)
|
59
63
|
end
|
60
64
|
|
61
|
-
after :pin =>
|
65
|
+
after :pin => PIN_LEFT, :goes => :high do
|
62
66
|
logger.log('Motion detected: LEFT')
|
63
|
-
strip.on(
|
64
|
-
while pin_left.on?
|
65
|
-
strip.on(WSLight::Strip::DIRECTION_LEFT)
|
66
|
-
sleep 1
|
67
|
-
end
|
67
|
+
strip.on(:direction_left)
|
68
68
|
end
|
69
69
|
|
70
70
|
PiPiper.wait
|
data/lib/ws_light/sd_logger.rb
CHANGED
@@ -18,7 +18,7 @@ module WSLight
|
|
18
18
|
if i < length_red
|
19
19
|
set << Color.new((rand(25) < 1 ? 0 : 255), 0, 0)
|
20
20
|
elsif i < length_red + length_red_to_white
|
21
|
-
ratio = (i - length_red) /
|
21
|
+
ratio = (i - length_red) / length_red_to_white.to_f
|
22
22
|
set << red.mix(white, ratio)
|
23
23
|
elsif i < length_red + length_red_to_white + length_white
|
24
24
|
set << white
|
@@ -27,6 +27,8 @@ module WSLight
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
set.reverse! if rand(2) == 0
|
31
|
+
|
30
32
|
type == :double ? set + set.reverse : set
|
31
33
|
end
|
32
34
|
|
data/lib/ws_light/strip.rb
CHANGED
@@ -32,16 +32,8 @@ module WSLight
|
|
32
32
|
LENGTH = 160
|
33
33
|
TYPE = :double
|
34
34
|
|
35
|
-
DIRECTION_NONE = 0
|
36
|
-
DIRECTION_LEFT = 1
|
37
|
-
DIRECTION_RIGHT = 2
|
38
35
|
TIMEOUT = 12
|
39
|
-
|
40
|
-
STATE_OFF = :state_off
|
41
|
-
STATE_ON = :state_on
|
42
|
-
STATE_STARTING_UP = :state_starting_up
|
43
|
-
STATE_SHUTTING_DOWN = :state_shutting_down
|
44
|
-
|
36
|
+
|
45
37
|
WEATHER_URL = 'http://api.openweathermap.org/data/2.5/weather?q=Hannover,de'
|
46
38
|
|
47
39
|
FRAMES_PER_SECOND = 25
|
@@ -49,11 +41,10 @@ module WSLight
|
|
49
41
|
def initialize
|
50
42
|
WS2801.length(Strip::TYPE == :double ? Strip::LENGTH * 2 : Strip::LENGTH)
|
51
43
|
WS2801.autowrite(true)
|
52
|
-
update_daylight
|
53
44
|
self_test
|
54
45
|
@listen_thread = Thread.new { while true do check_timer; sleep 0.5; end }
|
55
46
|
@last_event = Time.now - 3600 # set last event to a longer time ago
|
56
|
-
@state =
|
47
|
+
@state = :state_off
|
57
48
|
@debug = false
|
58
49
|
@current_set = Set::ColorSet.new
|
59
50
|
@current_set.color = Color.new(0,0,0)
|
@@ -62,13 +53,13 @@ module WSLight
|
|
62
53
|
def on(direction)
|
63
54
|
@last_event = Time.now
|
64
55
|
puts "triggered event 'on': #{last_event.to_f} from state #{@state}" if @debug
|
65
|
-
@state =
|
66
|
-
return if @state !=
|
56
|
+
@state = :state_starting_up if @state == :state_shutting_down
|
57
|
+
return if @state != :state_off
|
67
58
|
|
68
59
|
puts 'Loading a new set...' if @debug
|
69
60
|
|
70
61
|
@direction = direction
|
71
|
-
@state =
|
62
|
+
@state = :state_starting_up
|
72
63
|
|
73
64
|
case rand(100)
|
74
65
|
when 0..3
|
@@ -96,7 +87,7 @@ module WSLight
|
|
96
87
|
animate(animation)
|
97
88
|
@current_set = set
|
98
89
|
|
99
|
-
@state =
|
90
|
+
@state = :state_on
|
100
91
|
|
101
92
|
# Move show() into background, so we can accept new events on the main thread
|
102
93
|
Thread.new { show(@current_set, animation.frames) }
|
@@ -104,9 +95,9 @@ module WSLight
|
|
104
95
|
|
105
96
|
def off(direction = nil)
|
106
97
|
puts "triggered event 'off': #{Time.now.to_f} during state #{@state}" if @debug
|
107
|
-
return if @state !=
|
98
|
+
return if @state != :state_on
|
108
99
|
|
109
|
-
@state =
|
100
|
+
@state = :state_shutting_down
|
110
101
|
sleep 0.2
|
111
102
|
@direction = direction if direction
|
112
103
|
|
@@ -116,10 +107,10 @@ module WSLight
|
|
116
107
|
animation = animation_for(@direction).new(@current_set, set)
|
117
108
|
|
118
109
|
if animate(animation)
|
119
|
-
@state =
|
110
|
+
@state = :state_off
|
120
111
|
@current_set = set
|
121
112
|
else
|
122
|
-
@state =
|
113
|
+
@state = :state_on
|
123
114
|
Thread.new { show(@current_set, animation.frames) }
|
124
115
|
end
|
125
116
|
|
@@ -129,7 +120,7 @@ module WSLight
|
|
129
120
|
def animation_for(direction)
|
130
121
|
return Animation::FadeAnimation if night?
|
131
122
|
|
132
|
-
if direction ==
|
123
|
+
if direction == :direction_left
|
133
124
|
Animation::SlideLeftAnimation
|
134
125
|
else
|
135
126
|
Animation::SlideRightAnimation
|
@@ -173,20 +164,7 @@ module WSLight
|
|
173
164
|
|
174
165
|
def night?
|
175
166
|
time = Time.now
|
176
|
-
time.
|
177
|
-
end
|
178
|
-
|
179
|
-
# Gets the sunset/sunrise data
|
180
|
-
# this might get out of sync when the clock is not set correctly
|
181
|
-
# anyway, one day off is not a problem :)
|
182
|
-
def update_daylight
|
183
|
-
data = JSON.parse(open(WEATHER_URL).read)
|
184
|
-
@daylight = {
|
185
|
-
start: data['sys']['sunrise'].to_i,
|
186
|
-
end: data['sys']['sunset'].to_i,
|
187
|
-
day: Time.now.day
|
188
|
-
}
|
189
|
-
pp @daylight
|
167
|
+
time.hour > 22 || time.hour < 6
|
190
168
|
end
|
191
169
|
|
192
170
|
def shutdown
|
@@ -204,10 +182,7 @@ module WSLight
|
|
204
182
|
end
|
205
183
|
|
206
184
|
def check_timer
|
207
|
-
WS2801.set(r: 0, g: 0, b: 0) if @state ==
|
208
|
-
# Test after 2 a.m. to make sure we can the correct date even if our time is slightly off
|
209
|
-
time = Time.now
|
210
|
-
update_daylight if @daylight[:day] != time.day && time.hour > 1
|
185
|
+
WS2801.set(r: 0, g: 0, b: 0) if @state == :state_off
|
211
186
|
off if timeout?
|
212
187
|
end
|
213
188
|
|
data/lib/ws_light/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ws_light
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerrit Visscher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
107
|
version: '0'
|
108
108
|
requirements: []
|
109
109
|
rubyforge_project:
|
110
|
-
rubygems_version: 2.4.5
|
110
|
+
rubygems_version: 2.4.5.1
|
111
111
|
signing_key:
|
112
112
|
specification_version: 4
|
113
113
|
summary: A lighting gem for WS2801 led strips.
|