smalruby 0.0.6-x86-mingw32 → 0.0.7-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of smalruby might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -3
- data/lib/smalruby/canvas.rb +10 -12
- data/lib/smalruby/character.rb +45 -2
- data/lib/smalruby/color.rb +172 -167
- data/lib/smalruby/hardware/dino/fix_gets.rb +49 -0
- data/lib/smalruby/hardware/led.rb +19 -0
- data/lib/smalruby/hardware/pin.rb +51 -0
- data/lib/smalruby/hardware/rgb_led_anode.rb +58 -0
- data/lib/smalruby/hardware/rgb_led_cathode.rb +58 -0
- data/lib/smalruby/hardware/sensor.rb +46 -0
- data/lib/smalruby/hardware.rb +61 -0
- data/lib/smalruby/scene.rb +17 -0
- data/lib/smalruby/util.rb +27 -0
- data/lib/smalruby/version.rb +1 -1
- data/lib/smalruby/world.rb +11 -0
- data/lib/smalruby.rb +28 -1
- data/samples/hardware_led.rb +24 -0
- data/samples/hardware_rgb_led_anode.rb +29 -0
- data/samples/hardware_rgb_led_cathode.rb +29 -0
- data/samples/hardware_sensor.rb +24 -0
- data/smalruby.gemspec +1 -0
- data/spec/lib/smalruby/color_spec.rb +143 -143
- metadata +29 -2
@@ -0,0 +1,58 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'smalruby/hardware'
|
3
|
+
|
4
|
+
module Smalruby
|
5
|
+
module Hardware
|
6
|
+
# RGB LED(アノード)を表現するクラス
|
7
|
+
class RgbLedAnode < Dino::Components::BaseComponent
|
8
|
+
def initialize(options)
|
9
|
+
pin = Pin.smalruby_to_dino(options[:pin])
|
10
|
+
case pin
|
11
|
+
when 3..6
|
12
|
+
super(board: world.board, pin: [3, 5, 6, 4])
|
13
|
+
when 9..12
|
14
|
+
super(board: world.board, pin: [9, 10, 11, 12])
|
15
|
+
else
|
16
|
+
fail "RGB LED(anode)のピン番号が間違っています: {options[:pin]}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# RGB LEDをオンにする
|
21
|
+
def on(options = {})
|
22
|
+
defaults = {
|
23
|
+
color: 'white'
|
24
|
+
}
|
25
|
+
opts = Util.process_options(options, defaults)
|
26
|
+
|
27
|
+
color = Color.smalruby_to_dxruby(opts[:color])
|
28
|
+
analog_write(pins[0], calc_value(color[0]))
|
29
|
+
analog_write(pins[1], calc_value(color[1]))
|
30
|
+
analog_write(pins[2], calc_value(color[2]))
|
31
|
+
digital_write(pins[3], Dino::Board::HIGH)
|
32
|
+
end
|
33
|
+
|
34
|
+
# RGB LEDをオフにする
|
35
|
+
def off
|
36
|
+
digital_write(pins[3], Dino::Board::LOW)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def after_initialize(options = {})
|
42
|
+
set_pin_mode(pins[3], :out)
|
43
|
+
off
|
44
|
+
end
|
45
|
+
|
46
|
+
def calc_value(value)
|
47
|
+
v = Dino::Board::HIGH - value
|
48
|
+
if v < Dino::Board::LOW
|
49
|
+
Dino::Board::LOW
|
50
|
+
elsif v > Dino::Board::HIGH
|
51
|
+
Dino::Board::HIGH
|
52
|
+
else
|
53
|
+
v
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'smalruby/hardware'
|
3
|
+
|
4
|
+
module Smalruby
|
5
|
+
module Hardware
|
6
|
+
# RGB LED(カソード)を表現するクラス
|
7
|
+
class RgbLedCathode < Dino::Components::BaseComponent
|
8
|
+
def initialize(options)
|
9
|
+
pin = Pin.smalruby_to_dino(options[:pin])
|
10
|
+
case pin
|
11
|
+
when 3, 5, 6
|
12
|
+
super(board: world.board, pin: [3, 5, 6])
|
13
|
+
when 9..11
|
14
|
+
super(board: world.board, pin: [9, 10, 11])
|
15
|
+
else
|
16
|
+
fail "RGB LED(anode)のピン番号が間違っています: {options[:pin]}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# RGB LEDをオンにする
|
21
|
+
def on(options = {})
|
22
|
+
defaults = {
|
23
|
+
color: 'white'
|
24
|
+
}
|
25
|
+
opts = Util.process_options(options, defaults)
|
26
|
+
|
27
|
+
color = Color.smalruby_to_dxruby(opts[:color])
|
28
|
+
analog_write(pins[0], calc_value(color[0]))
|
29
|
+
analog_write(pins[1], calc_value(color[1]))
|
30
|
+
analog_write(pins[2], calc_value(color[2]))
|
31
|
+
end
|
32
|
+
|
33
|
+
# RGB LEDをオフにする
|
34
|
+
def off
|
35
|
+
color = Color.smalruby_to_dxruby('black')
|
36
|
+
analog_write(pins[0], calc_value(color[0]))
|
37
|
+
analog_write(pins[1], calc_value(color[1]))
|
38
|
+
analog_write(pins[2], calc_value(color[2]))
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def after_initialize(options = {})
|
44
|
+
off
|
45
|
+
end
|
46
|
+
|
47
|
+
def calc_value(value)
|
48
|
+
if value < Dino::Board::LOW
|
49
|
+
Dino::Board::LOW
|
50
|
+
elsif value > Dino::Board::HIGH
|
51
|
+
Dino::Board::HIGH
|
52
|
+
else
|
53
|
+
value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'smalruby/hardware'
|
3
|
+
|
4
|
+
module Smalruby
|
5
|
+
module Hardware
|
6
|
+
# 汎用的なセンサーを表現するクラス
|
7
|
+
class Sensor < Dino::Components::Sensor
|
8
|
+
# デフォルトのセンサーの値に変化があったかどうかをチェックする閾値
|
9
|
+
DEFAULT_THRESHOLD = 32
|
10
|
+
|
11
|
+
attr_reader :value
|
12
|
+
attr_accessor :threshold
|
13
|
+
|
14
|
+
def initialize(options)
|
15
|
+
super(board: world.board, pin: Pin.smalruby_to_dino(options[:pin]))
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def after_initialize(options = {})
|
21
|
+
super(options)
|
22
|
+
|
23
|
+
@value = 0
|
24
|
+
@threshold = options[:threshold] || DEFAULT_THRESHOLD
|
25
|
+
|
26
|
+
start_receiving_data
|
27
|
+
end
|
28
|
+
|
29
|
+
def start_receiving_data
|
30
|
+
prev_data = 0
|
31
|
+
when_data_received { |data|
|
32
|
+
begin
|
33
|
+
@value = data = data.to_i
|
34
|
+
if (data - prev_data).abs >= @threshold ||
|
35
|
+
(prev_data != data && (data == 0 || data >= 1023))
|
36
|
+
world.sensor_changed(pin, data)
|
37
|
+
prev_data = data
|
38
|
+
end
|
39
|
+
rescue
|
40
|
+
Util.print_exception($ERROR_INFO)
|
41
|
+
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'dino'
|
3
|
+
require 'mutex_m'
|
4
|
+
require_relative 'hardware/dino/fix_gets'
|
5
|
+
|
6
|
+
module Smalruby
|
7
|
+
# ハードウェアの名前空間
|
8
|
+
module Hardware
|
9
|
+
extend ActiveSupport::Autoload
|
10
|
+
|
11
|
+
autoload :Pin
|
12
|
+
autoload :Led
|
13
|
+
autoload :RgbLedAnode
|
14
|
+
autoload :RgbLedCathode
|
15
|
+
autoload :Sensor
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
# ハードウェアを準備する
|
20
|
+
#
|
21
|
+
# @param [Hash] options オプション
|
22
|
+
# @option options [String] :device シリアルポートのデバイス名。
|
23
|
+
# WindowsだとCOM1など
|
24
|
+
def init(options = {})
|
25
|
+
return if @initialized_hardware
|
26
|
+
fail 'already started.' if @started
|
27
|
+
|
28
|
+
defaults = {
|
29
|
+
device: nil
|
30
|
+
}
|
31
|
+
opt = Util.process_options(options, defaults)
|
32
|
+
|
33
|
+
txrx = Dino::TxRx.new
|
34
|
+
txrx.io = opt[:device] if opt[:device]
|
35
|
+
world.board = Dino::Board.new(txrx)
|
36
|
+
|
37
|
+
@initialized_hardware = true
|
38
|
+
end
|
39
|
+
|
40
|
+
# ハードウェアのインスタンスを生成する
|
41
|
+
#
|
42
|
+
# 作成したハードウェアのインスタンスはキャッシュする
|
43
|
+
#
|
44
|
+
# @param [Class] klass ハードウェアのクラス
|
45
|
+
# @param [String|Numeric] pin ピン番号
|
46
|
+
# @return [Object] ハードウェアのインスタンス
|
47
|
+
def create_hardware(klass, pin)
|
48
|
+
key = [klass, pin]
|
49
|
+
@hardware_cache.synchronize do
|
50
|
+
@hardware_cache[key] ||= klass.new(pin: pin)
|
51
|
+
end
|
52
|
+
@hardware_cache[key]
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
@initialized_hardware = false
|
58
|
+
@hardware_cache = {}
|
59
|
+
@hardware_cache.extend(Mutex_m)
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Smalruby
|
4
|
+
# シーンを表現するクラス
|
5
|
+
class Scene < Canvas
|
6
|
+
def initialize(options = {})
|
7
|
+
defaults = {
|
8
|
+
color: 'black'
|
9
|
+
}
|
10
|
+
opts = Util.process_options(options, defaults)
|
11
|
+
|
12
|
+
super(opts.reject { |k, v| defaults.keys.include?(k) })
|
13
|
+
|
14
|
+
fill(color: opts[:color])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module Smalruby
|
3
|
+
module Util
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def process_options(options, defaults)
|
7
|
+
unknown_keys = options.keys - defaults.keys
|
8
|
+
if unknown_keys.length > 0
|
9
|
+
s = unknown_keys.map { |k| "#{k}: #{options[k].inspect}" }.join(', ')
|
10
|
+
fail ArgumentError, "Unknown options: #{s}"
|
11
|
+
end
|
12
|
+
defaults.merge(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def print_exception(exception)
|
16
|
+
$stderr.puts("#{exception.class}: #{exception.message}")
|
17
|
+
$stderr.puts(" #{exception.backtrace.join("\n ")}")
|
18
|
+
end
|
19
|
+
|
20
|
+
# プラットフォームがWindowsかどうかを返す
|
21
|
+
#
|
22
|
+
# @return [Boolean] Windowsの場合はtrue、そうでない場合はfalseを返す
|
23
|
+
def windows?
|
24
|
+
/windows|mingw|cygwin/i =~ RbConfig::CONFIG['arch']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/smalruby/version.rb
CHANGED
data/lib/smalruby/world.rb
CHANGED
@@ -7,9 +7,20 @@ module Smalruby
|
|
7
7
|
include Singleton
|
8
8
|
|
9
9
|
attr_accessor :objects
|
10
|
+
attr_accessor :board
|
11
|
+
attr_reader :sensor_change_queue
|
10
12
|
|
11
13
|
def initialize
|
12
14
|
@objects = []
|
15
|
+
@board = nil
|
16
|
+
@sensor_change_queue = []
|
17
|
+
@sensor_change_queue.extend(Mutex_m)
|
18
|
+
end
|
19
|
+
|
20
|
+
def sensor_changed(pin, value)
|
21
|
+
@sensor_change_queue.synchronize do
|
22
|
+
@sensor_change_queue.push([pin, value])
|
23
|
+
end
|
13
24
|
end
|
14
25
|
end
|
15
26
|
end
|
data/lib/smalruby.rb
CHANGED
@@ -5,6 +5,7 @@ require 'dxruby'
|
|
5
5
|
require 'English'
|
6
6
|
require 'pathname'
|
7
7
|
|
8
|
+
require 'smalruby/util'
|
8
9
|
require 'smalruby/world'
|
9
10
|
require 'smalruby/color'
|
10
11
|
require 'smalruby/character'
|
@@ -15,6 +16,8 @@ module Smalruby
|
|
15
16
|
|
16
17
|
autoload :Console
|
17
18
|
autoload :Canvas
|
19
|
+
autoload :Scene
|
20
|
+
autoload :Hardware
|
18
21
|
|
19
22
|
module_function
|
20
23
|
|
@@ -44,6 +47,10 @@ module Smalruby
|
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
50
|
+
def init_hardware(options = {})
|
51
|
+
Hardware.init(options)
|
52
|
+
end
|
53
|
+
|
47
54
|
private
|
48
55
|
|
49
56
|
@started = false
|
@@ -88,6 +95,8 @@ module Smalruby
|
|
88
95
|
|
89
96
|
hit
|
90
97
|
|
98
|
+
sensor_change
|
99
|
+
|
91
100
|
world.objects.delete_if do |o|
|
92
101
|
if !o.alive?
|
93
102
|
o.join
|
@@ -123,7 +132,7 @@ module Smalruby
|
|
123
132
|
{
|
124
133
|
left: M_LBUTTON,
|
125
134
|
right: M_RBUTTON,
|
126
|
-
center: M_MBUTTON
|
135
|
+
center: M_MBUTTON
|
127
136
|
}.each do |sym, const|
|
128
137
|
if Input.mouse_down?(const)
|
129
138
|
buttons << sym
|
@@ -162,6 +171,24 @@ module Smalruby
|
|
162
171
|
end
|
163
172
|
end
|
164
173
|
end
|
174
|
+
|
175
|
+
def sensor_change
|
176
|
+
if world.sensor_change_queue.length > 0
|
177
|
+
sensor_change_queue = nil
|
178
|
+
world.sensor_change_queue.synchronize do
|
179
|
+
sensor_change_queue = world.sensor_change_queue.dup
|
180
|
+
world.sensor_change_queue.clear
|
181
|
+
end
|
182
|
+
|
183
|
+
world.objects.each do |o|
|
184
|
+
if o.respond_to?(:sensor_change)
|
185
|
+
sensor_change_queue.each do |pin, value|
|
186
|
+
o.sensor_change(pin, value)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
165
192
|
end
|
166
193
|
end
|
167
194
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
DESCRIPTION = <<EOS
|
4
|
+
LEDを1秒間隔で点滅させます
|
5
|
+
EOS
|
6
|
+
|
7
|
+
# デジタルの13番ピンに接続してください。
|
8
|
+
|
9
|
+
require 'smalruby'
|
10
|
+
|
11
|
+
init_hardware
|
12
|
+
|
13
|
+
scene1 = Scene.new(color: 'white')
|
14
|
+
|
15
|
+
scene1.on(:start) do
|
16
|
+
draw_font(string: DESCRIPTION, color: 'black')
|
17
|
+
|
18
|
+
loop do
|
19
|
+
led('D13').on
|
20
|
+
sleep(1)
|
21
|
+
led('D13').off
|
22
|
+
sleep(1)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
DESCRIPTION = <<EOS
|
4
|
+
RGB LED(アノードコモン)の色を変化させます
|
5
|
+
EOS
|
6
|
+
|
7
|
+
# デジタルの3番、4番、5番、6番ピンにそれぞれR、コモン、G、Bを接続してく
|
8
|
+
# ださい。
|
9
|
+
|
10
|
+
require 'smalruby'
|
11
|
+
|
12
|
+
init_hardware
|
13
|
+
|
14
|
+
scene1 = Scene.new(color: 'white')
|
15
|
+
|
16
|
+
scene1.on(:start) do
|
17
|
+
draw_font(string: DESCRIPTION, color: 'black')
|
18
|
+
|
19
|
+
loop do
|
20
|
+
rgb_led_anode('D3').on(color: 'red')
|
21
|
+
sleep(1)
|
22
|
+
rgb_led_anode('D3').on(color: 'green')
|
23
|
+
sleep(1)
|
24
|
+
rgb_led_anode('D3').on(color: 'blue')
|
25
|
+
sleep(1)
|
26
|
+
rgb_led_anode('D3').off
|
27
|
+
sleep(1)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
DESCRIPTION = <<EOS
|
4
|
+
RGB LED(カソードコモン)の色を変化させます
|
5
|
+
EOS
|
6
|
+
|
7
|
+
# デジタルの3番、4番、6番ピンにそれぞれR、G、Bを接続してく
|
8
|
+
# ださい。
|
9
|
+
|
10
|
+
require 'smalruby'
|
11
|
+
|
12
|
+
init_hardware
|
13
|
+
|
14
|
+
scene1 = Scene.new(color: 'white')
|
15
|
+
|
16
|
+
scene1.on(:start) do
|
17
|
+
draw_font(string: DESCRIPTION, color: 'black')
|
18
|
+
|
19
|
+
loop do
|
20
|
+
rgb_led_cathode('D3').on(color: 'red')
|
21
|
+
sleep(1)
|
22
|
+
rgb_led_cathode('D3').on(color: 'green')
|
23
|
+
sleep(1)
|
24
|
+
rgb_led_cathode('D3').on(color: 'blue')
|
25
|
+
sleep(1)
|
26
|
+
rgb_led_cathode('D3').off
|
27
|
+
sleep(1)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'smalruby'
|
4
|
+
|
5
|
+
init_hardware
|
6
|
+
|
7
|
+
scene1 = Scene.new(color: 'white')
|
8
|
+
|
9
|
+
scene1.on(:sensor_change, 'A0') do |value|
|
10
|
+
v = sensor('A0').value
|
11
|
+
if 0 <= v && v <= 255
|
12
|
+
fill(color: 'red')
|
13
|
+
end
|
14
|
+
|
15
|
+
if 256 <= v && v <= 511
|
16
|
+
fill(color: 'yellow')
|
17
|
+
end
|
18
|
+
|
19
|
+
if 512 <= v
|
20
|
+
fill(color: 'blue')
|
21
|
+
end
|
22
|
+
|
23
|
+
draw_font(string: "センサーの情報:#{v}", color: 'black')
|
24
|
+
end
|