smalruby 0.0.6 → 0.0.7

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.

@@ -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
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Smalruby
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
5
5
  end
@@ -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
data/smalruby.gemspec CHANGED
@@ -42,4 +42,5 @@ Gem::Specification.new do |spec|
42
42
  else
43
43
  spec.add_runtime_dependency 'dxruby_sdl'
44
44
  end
45
+ spec.add_runtime_dependency 'dino'
45
46
  end