smalruby-editor 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of smalruby-editor might be problematic. Click here for more details.

Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/Guardfile +2 -6
  4. data/LEGAL +6 -0
  5. data/README.rdoc +2 -0
  6. data/app/assets/javascripts/application.js +1 -0
  7. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +37 -0
  8. data/app/assets/javascripts/models/source_code.js +123 -0
  9. data/app/assets/javascripts/msg/en_us.js +2 -0
  10. data/app/assets/javascripts/msg/ja.js +2 -0
  11. data/app/assets/javascripts/smalruby.js.coffee.erb +1 -1
  12. data/app/assets/javascripts/views/character_modal_view.js.coffee +2 -0
  13. data/app/assets/javascripts/views/character_selector_view.js.coffee +2 -2
  14. data/app/assets/javascripts/views/load_modal_view.js.coffee.erb +2 -0
  15. data/app/assets/javascripts/views/reset_modal_view.js.coffee +2 -0
  16. data/app/assets/stylesheets/application.css +0 -0
  17. data/app/assets/stylesheets/editor.css.scss +0 -0
  18. data/app/assets/stylesheets/toolbox_raspberrypi.css.scss.erb +32 -0
  19. data/app/assets/stylesheets/toolbox_smalrubot_s1.css.scss.erb +1 -0
  20. data/app/controllers/editor_controller.rb +0 -0
  21. data/app/helpers/application_helper.rb +5 -0
  22. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_dc_motor_power_ratio.rb +26 -0
  23. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_dc_motor_set_power_ratio.rb +21 -0
  24. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_v3_motor_set_speed.rb +21 -0
  25. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_v3_motor_speed.rb +26 -0
  26. data/app/models/source_code.rb +0 -0
  27. data/app/views/editor/_toolbox_default.html.haml +7 -3
  28. data/app/views/editor/_toolbox_raspberrypi.html.haml +233 -0
  29. data/app/views/editor/_toolbox_smalrubot_s1.html.haml +75 -51
  30. data/app/views/editor/_toolbox_smalrubot_v3.html.haml +70 -55
  31. data/app/views/editor/index.html.haml +0 -6
  32. data/app/views/layouts/application.html.erb +1 -0
  33. data/db/schema.rb +23 -23
  34. data/lib/smalruby_editor.rb +5 -1
  35. data/lib/smalruby_editor/config.rb +2 -0
  36. data/lib/smalruby_editor/version.rb +1 -1
  37. data/smalruby-editor.gemspec +1 -1
  38. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_dc_motor_power_ratio.feature +116 -0
  39. data/spec/javascripts/models/source_code_spec.coffee +5 -0
  40. data/spec/models/concerns/ruby_to_block/block/hardware__smalrubot_s1_spec.rb +89 -1
  41. data/spec/models/concerns/ruby_to_block/block/hardware__smalrubot_v3_spec.rb +433 -0
  42. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +0 -338
  43. data/vendor/assets/javascripts/strftime-min.js +8 -0
  44. metadata +27 -14
  45. data/app/assets/javascripts/models/source_code.js.coffee +0 -80
@@ -35,42 +35,42 @@
35
35
  = toolbox_key_field
36
36
  = toolbox_pod_field
37
37
 
38
+ -# キャラクターがクリックされたとき
39
+ %block{:type => "#{category}_on_click"}
40
+
38
41
  - category = 'control'
39
42
  %category{:name => tt('.control')}
40
- -# ずっと
41
- %block{:type => "#{category}_loop"}
43
+ -# ( )秒待つ
44
+ %block{:type => "#{category}_sleep"}
45
+ = toolbox_number_value('SEC', 1)
46
+
47
+ -# ほんの少し待つ
48
+ %block{:type => "#{category}_await"}
42
49
 
43
50
  -# ( )回繰り返す
44
51
  %block{:type => "#{category}_times"}
45
52
  = toolbox_number_value('COUNT', 10)
46
53
 
47
- -# < >まで繰り返す
48
- %block{:type => "#{category}_until"}
49
-
50
- -# 繰り返しから脱出する
51
- %block{:type => "#{category}_break"}
52
-
53
- -# 次の繰り返しにジャンプする
54
- %block{:type => "#{category}_next"}
54
+ -# ずっと
55
+ %block{:type => "#{category}_loop"}
55
56
 
56
- -# 現在の繰り返しをやり直す
57
- %block{:type => "#{category}_redo"}
57
+ -# もし< >なら
58
+ %block{:type => "#{category}_if"}
58
59
 
59
- -# ( )秒待つ
60
- %block{:type => "#{category}_sleep"}
61
- = toolbox_number_value('SEC', 1)
60
+ -# もし< >なら~でなければ
61
+ %block{:type => "#{category}_if_else"}
62
62
 
63
63
  -# < >まで待つ
64
64
  %block{:type => "#{category}_await_until"}
65
65
 
66
- -# ほんの少し待つ
67
- %block{:type => "#{category}_await"}
66
+ -# < >まで繰り返す
67
+ %block{:type => "#{category}_until"}
68
68
 
69
- -# もし< >なら
70
- %block{:type => "#{category}_if"}
69
+ -# 繰り返しから脱出する
70
+ %block{:type => "#{category}_break"}
71
71
 
72
- -# もし< >なら~でなければ
73
- %block{:type => "#{category}_if_else"}
72
+ -# 次の繰り返しにジャンプする
73
+ %block{:type => "#{category}_next"}
74
74
 
75
75
  - category = 'sensing'
76
76
  %category{:name => tt('.sensing')}
@@ -104,20 +104,47 @@
104
104
 
105
105
  - category = 'operators'
106
106
  %category{:name => tt('.operators')}
107
+ -# 数値
108
+ %block{:type => 'math_number'}
109
+ %field{:name => 'NUM'}<
110
+ 0
111
+
112
+ -# テキスト
113
+ %block{:type => 'text'}
114
+ %field{:name => 'TEXT'}<
115
+ = tt('.text')
116
+
117
+ -# 変数:( ) + ( )
118
+ %block{:type => "#{category}_add"}
119
+
120
+ -# 変数:( ) - ( )
121
+ %block{:type => "#{category}_minus"}
122
+
123
+ -# 変数:( ) * ( )
124
+ %block{:type => "#{category}_multiply"}
125
+
126
+ -# 変数:( ) / ( )
127
+ %block{:type => "#{category}_divide"}
128
+
129
+ -# 変数:( )から( )までの乱数
130
+ %block{:type => "#{category}_rand"}
131
+ = toolbox_number_value('A', 1)
132
+ = toolbox_number_value('B', 10)
133
+
107
134
  -# 条件:( ) < ( )
108
- %block{:type => "#{category}_compare_gt"}
135
+ %block{:type => "#{category}_compare_lt"}
109
136
 
110
137
  -# 条件:( ) <= ( )
111
- %block{:type => "#{category}_compare_gte"}
138
+ %block{:type => "#{category}_compare_lte"}
112
139
 
113
140
  -# 条件:( ) = ( )
114
141
  %block{:type => "#{category}_compare_eq"}
115
142
 
116
143
  -# 条件:( ) >= ( )
117
- %block{:type => "#{category}_compare_lte"}
144
+ %block{:type => "#{category}_compare_gte"}
118
145
 
119
146
  -# 条件:( ) > ( )
120
- %block{:type => "#{category}_compare_lt"}
147
+ %block{:type => "#{category}_compare_gt"}
121
148
 
122
149
  -# 条件:< > かつ < >
123
150
  %block{:type => "#{category}_and"}
@@ -128,35 +155,21 @@
128
155
  -# 条件:< > ではない
129
156
  %block{:type => "#{category}_negate"}
130
157
 
131
- -# 条件:真
132
- %block{:type => "#{category}_true"}
133
-
134
- -# 条件:偽
135
- %block{:type => "#{category}_false"}
136
-
137
- -# 変数:( ) + ( )
138
- %block{:type => "#{category}_add"}
158
+ -# 変数:( )の( )番目
159
+ %block{:type => "#{category}_index_of"}
160
+ = toolbox_text_value('A', tt('.world'))
161
+ = toolbox_number_value('INDEX', 1)
139
162
 
140
- -# 変数:( ) - ( )
141
- %block{:type => "#{category}_minus"}
142
-
143
- -# 変数:( ) * ( )
144
- %block{:type => "#{category}_multiply"}
145
-
146
- -# 変数:( ) / ( )
147
- %block{:type => "#{category}_divide"}
148
-
149
- -# 変数:( )から( )までの乱数
150
- %block{:type => "#{category}_rand"}
151
- = toolbox_number_value('A', 1)
152
- = toolbox_number_value('B', 10)
163
+ -# 変数:( )の長さ
164
+ %block{:type => "#{category}_length"}
165
+ = toolbox_text_value('A', tt('.world'))
153
166
 
154
167
  -# 変数:( )を( )で割った余り
155
168
  %block{:type => "#{category}_modulo"}
156
169
  = toolbox_number_value('A', 5)
157
170
  = toolbox_number_value('B', 2)
158
171
 
159
- -# 変数:( )を丸める
172
+ -# 変数:( )を四捨五入
160
173
  %block{:type => "#{category}_round"}
161
174
  = toolbox_number_value('A', 0.5)
162
175
 
@@ -166,12 +179,14 @@
166
179
  %field{:name => 'METHOD'}<
167
180
  Math.sqrt(%num%)
168
181
 
169
- -# 数値
170
- %block{:type => 'math_number'}
171
- %field{:name => 'NUM'}<
172
- 0
182
+ -# 条件:真
183
+ %block{:type => "#{category}_true"}
173
184
 
174
- %category{:name => tt('.etc')}
175
- - category = 'hardware'
176
- -# ハードウェアを準備する
177
- %block{:type => "#{category}_init_hardware"}
185
+ -# 条件:偽
186
+ %block{:type => "#{category}_false"}
187
+
188
+ - if !SmalrubyEditor::Config.enabled?('auto_init_hardware')
189
+ %category{:name => tt('.etc')}
190
+ - category = 'hardware'
191
+ -# ハードウェアを準備する
192
+ %block{:type => "#{category}_init_hardware"}
@@ -125,12 +125,6 @@
125
125
  = render 'load_modal'
126
126
  = render 'reset_modal'
127
127
 
128
- - if raspberrypi?
129
- :javascript
130
- $(function() {
131
- $('div[aria-level="1"][aria-posinset="4"],div[aria-level="1"][aria-posinset="10"]').hide();
132
- });
133
-
134
128
  - if session[:username]
135
129
  :javascript
136
130
  window.Smalruby.username = '#{h session[:username]}';
@@ -16,6 +16,7 @@
16
16
  <%= stylesheet_link_tag "toolbox_#{toolbox_css_name}", media: "all" %>
17
17
  <%= javascript_include_tag "application" %>
18
18
  <%= javascript_include_tag "blockly/msg/js/#{blockly_message_locale_name}" %>
19
+ <%= javascript_include_tag "msg/#{blockly_message_default_locale_name}" %>
19
20
  <%= javascript_include_tag "msg/#{blockly_message_locale_name}" %>
20
21
  <%= csrf_meta_tags %>
21
22
  </head>
data/db/schema.rb CHANGED
@@ -1,23 +1,23 @@
1
- # encoding: UTF-8
2
- # This file is auto-generated from the current state of the database. Instead
3
- # of editing this file, please use the migrations feature of Active Record to
4
- # incrementally modify your database, and then regenerate this schema definition.
5
- #
6
- # Note that this schema.rb definition is the authoritative source for your
7
- # database schema. If you need to create the application database on another
8
- # system, you should be using db:schema:load, not running all the migrations
9
- # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
- # you'll amass, the slower it'll run and the greater likelihood for issues).
11
- #
12
- # It's strongly recommended that you check this file into your version control system.
13
-
14
- ActiveRecord::Schema.define(version: 20131219045113) do
15
-
16
- create_table "source_codes", force: true do |t|
17
- t.text "data"
18
- t.datetime "created_at"
19
- t.datetime "updated_at"
20
- t.string "filename"
21
- end
22
-
23
- end
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20131219045113) do
15
+
16
+ create_table "source_codes", force: true do |t|
17
+ t.text "data"
18
+ t.datetime "created_at"
19
+ t.datetime "updated_at"
20
+ t.string "filename"
21
+ end
22
+
23
+ end
@@ -128,9 +128,13 @@ standalone:
128
128
 
129
129
  CONFIG_YML_TEMPLATE = <<-EOS
130
130
  #toolbox_name: default
131
+ #toolbox_name: raspberrypi
132
+ #toolbox_name: smalrubot_v3
133
+ #toolbox_name: smalrubot_s1
134
+ #toolbox_name: default
131
135
  #toolbox_css_name: default
132
136
  features:
133
- - add_character_from_beginning
137
+ #- disabled_add_character_from_beginning
134
138
  #- disabled_new_character
135
139
  #- auto_init_hardware
136
140
  #- readonly_ruby_mode
@@ -4,6 +4,8 @@ module SmalrubyEditor
4
4
  class Config < Settingslogic
5
5
  if Rails.env.test?
6
6
  source({})
7
+ load!
8
+ self['features'] = ['disabled_add_character_from_beginning']
7
9
  else
8
10
  path = SmalrubyEditor.home_directory.join('config', 'config.yml')
9
11
  if path.exist?
@@ -1,3 +1,3 @@
1
1
  module SmalrubyEditor
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.3'
3
3
  end
@@ -69,7 +69,7 @@ Gem::Specification.new do |spec|
69
69
  ['haml-rails'],
70
70
  ['nokogiri'],
71
71
  ['settingslogic'],
72
- ['smalruby', '~> 0.1.3'],
72
+ ['smalruby', '~> 0.1.4'],
73
73
  ]
74
74
  runtime_dependencies << ['therubyracer'] unless is_windows
75
75
  runtime_dependencies.each do |args|
@@ -0,0 +1,116 @@
1
+ # encoding: utf-8
2
+ # language: en
3
+ @javascript
4
+ Feature: hardware_smalrubot_s1_dc_motor_{,set_}power_ratio block
5
+ Background:
6
+ Given "ブロック" タブを表示する
7
+ And キャラクターcar1を追加する
8
+
9
+ Scenario: ブロックのみ配置する
10
+ When 次のブロックを配置する:
11
+ """
12
+ %block{:type => "hardware_smalrubot_s1_dc_motor_power_ratio"}
13
+ %field{:name => "LOR"}<
14
+ right
15
+ """
16
+ And ブロックからソースコードを生成する
17
+
18
+ Then テキストエディタのプログラムは "" であること
19
+
20
+ Scenario: 文とブロックを配置する
21
+ When 次のブロックを配置する:
22
+ """
23
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
24
+ %value{:name => "ARG"}
25
+ %block{:type => "hardware_smalrubot_s1_dc_motor_power_ratio"}
26
+ %field{:name => "LOR"}<
27
+ right
28
+ %next
29
+ %block{:type => "hardware_smalrubot_s1_dc_motor_set_power_ratio"}
30
+ %field{:name => "LOR"}<
31
+ left
32
+ %value{:name => "SPEED"}
33
+ %block{:type => "math_number"}
34
+ %field{:name => "NUM"}<
35
+ 50
36
+ """
37
+ And ブロックからソースコードを生成する
38
+
39
+ Then テキストエディタのプログラムは以下であること:
40
+ """
41
+ require "smalruby"
42
+
43
+ p("")
44
+
45
+ """
46
+
47
+ Scenario: キャラクターとブロックを配置する
48
+ When 次のブロックを配置する:
49
+ """
50
+ %block{:type => "character_new", :x => "21", :y => "15"}
51
+ %field{:name => "NAME"}<
52
+ car1
53
+ %statement{:name => "DO"}
54
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
55
+ %value{:name => "ARG"}
56
+ %block{:type => "hardware_smalrubot_s1_dc_motor_power_ratio"}
57
+ %field{:name => "LOR"}<
58
+ right
59
+ %next
60
+ %block{:type => "hardware_smalrubot_s1_dc_motor_set_power_ratio"}
61
+ %field{:name => "LOR"}<
62
+ left
63
+ %value{:name => "SPEED"}
64
+ %block{:type => "math_number"}
65
+ %field{:name => "NUM"}<
66
+ 50
67
+ """
68
+ And ブロックからソースコードを生成する
69
+
70
+ Then テキストエディタのプログラムは以下であること:
71
+ """
72
+ require "smalruby"
73
+
74
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
75
+ p(car1.smalrubot_s1.right_dc_motor_power_ratio)
76
+ car1.smalrubot_s1.left_dc_motor_power_ratio = 50
77
+
78
+ """
79
+
80
+ Scenario: キャラクターとイベントとブロックを配置する
81
+ When 次のブロックを配置する:
82
+ """
83
+ %block{:type => "character_new", :x => "21", :y => "15"}
84
+ %field{:name => "NAME"}<
85
+ car1
86
+ %statement{:name => "DO"}
87
+ %block{:type => "events_on_start"}
88
+ %statement{:name => "DO"}
89
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
90
+ %value{:name => "ARG"}
91
+ %block{:type => "hardware_smalrubot_s1_dc_motor_power_ratio"}
92
+ %field{:name => "LOR"}<
93
+ right
94
+ %next
95
+ %block{:type => "hardware_smalrubot_s1_dc_motor_set_power_ratio"}
96
+ %field{:name => "LOR"}<
97
+ left
98
+ %value{:name => "SPEED"}
99
+ %block{:type => "math_number"}
100
+ %field{:name => "NUM"}<
101
+ 50
102
+ """
103
+ And ブロックからソースコードを生成する
104
+
105
+ Then テキストエディタのプログラムは以下であること:
106
+ """
107
+ require "smalruby"
108
+
109
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
110
+
111
+ car1.on(:start) do
112
+ p(smalrubot_s1.right_dc_motor_power_ratio)
113
+ self.smalrubot_s1.left_dc_motor_power_ratio = 50
114
+ end
115
+
116
+ """
@@ -38,3 +38,8 @@ describe 'Smalruby.SourceCode', ->
38
38
 
39
39
  it '01.rb.xmlを返すこと', ->
40
40
  expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
41
+
42
+ describe '.defaultFilename', ->
43
+ it 'program_<日付>.rbを返すこと', ->
44
+ now = new Date(2015, 2 - 1, 10, 12, 10, 59)
45
+ expect(Smalruby.SourceCode.defaultFilename(now)).to.equal('program_150210_121059.rb')
@@ -4,7 +4,7 @@ require_relative 'shared/block_examples'
4
4
 
5
5
  # rubocop:disable EmptyLines, LineLength
6
6
 
7
- describe RubyToBlock::Block, 'Smalrubot S1 blocks', to_blocks: true do
7
+ describe RubyToBlock::Block, 'Smalrubot s1 blocks', to_blocks: true do
8
8
  parts = <<-EOS
9
9
  require "smalruby"
10
10
 
@@ -29,6 +29,12 @@ car1.on(:start) do
29
29
 
30
30
  smalrubot_s1.turn_on_white_led
31
31
  smalrubot_s1.turn_off_blue_led
32
+
33
+ p(smalrubot_s1.left_dc_motor_power_ratio)
34
+ p(smalrubot_s1.right_dc_motor_power_ratio)
35
+
36
+ smalrubot_s1.left_dc_motor_power_ratio = 10
37
+ smalrubot_s1.right_dc_motor_power_ratio = 90
32
38
  end
33
39
  car1.smalrubot_s1.forward
34
40
  car1.smalrubot_s1.backward
@@ -47,6 +53,12 @@ p(car1.smalrubot_s1.right_ir_photoreflector_value)
47
53
 
48
54
  car1.smalrubot_s1.turn_on_white_led
49
55
  car1.smalrubot_s1.turn_off_blue_led
56
+
57
+ p(car1.smalrubot_s1.left_dc_motor_power_ratio)
58
+ p(car1.smalrubot_s1.right_dc_motor_power_ratio)
59
+
60
+ car1.smalrubot_s1.left_dc_motor_power_ratio = 10
61
+ car1.smalrubot_s1.right_dc_motor_power_ratio = 90
50
62
  EOS
51
63
  describe compact_source_code(parts) do
52
64
  _parts = parts
@@ -137,6 +149,44 @@ car1.smalrubot_s1.turn_off_blue_led
137
149
  <block type="hardware_smalrubot_s1_led_turn_on_or_off" inline="true">
138
150
  <field name="COLOUR">blue</field>
139
151
  <field name="OOO">turn_off</field>
152
+ <next>
153
+ <block type="ruby_p" inline="true">
154
+ <value name="ARG">
155
+ <block type="hardware_smalrubot_s1_dc_motor_power_ratio">
156
+ <field name="LOR">left</field>
157
+ </block>
158
+ </value>
159
+ <next>
160
+ <block type="ruby_p" inline="true">
161
+ <value name="ARG">
162
+ <block type="hardware_smalrubot_s1_dc_motor_power_ratio">
163
+ <field name="LOR">right</field>
164
+ </block>
165
+ </value>
166
+ <next>
167
+ <block type="hardware_smalrubot_s1_dc_motor_set_power_ratio" inline="true">
168
+ <field name="LOR">left</field>
169
+ <value name="SPEED">
170
+ <block type="math_number">
171
+ <field name="NUM">10</field>
172
+ </block>
173
+ </value>
174
+ <next>
175
+ <block type="hardware_smalrubot_s1_dc_motor_set_power_ratio" inline="true">
176
+ <field name="LOR">right</field>
177
+ <value name="SPEED">
178
+ <block type="math_number">
179
+ <field name="NUM">90</field>
180
+ </block>
181
+ </value>
182
+ </block>
183
+ </next>
184
+ </block>
185
+ </next>
186
+ </block>
187
+ </next>
188
+ </block>
189
+ </next>
140
190
  </block>
141
191
  </next>
142
192
  </block>
@@ -242,6 +292,44 @@ car1.smalrubot_s1.turn_off_blue_led
242
292
  <block type="hardware_smalrubot_s1_led_turn_on_or_off" inline="true">
243
293
  <field name="COLOUR">blue</field>
244
294
  <field name="OOO">turn_off</field>
295
+ <next>
296
+ <block type="ruby_p" inline="true">
297
+ <value name="ARG">
298
+ <block type="hardware_smalrubot_s1_dc_motor_power_ratio">
299
+ <field name="LOR">left</field>
300
+ </block>
301
+ </value>
302
+ <next>
303
+ <block type="ruby_p" inline="true">
304
+ <value name="ARG">
305
+ <block type="hardware_smalrubot_s1_dc_motor_power_ratio">
306
+ <field name="LOR">right</field>
307
+ </block>
308
+ </value>
309
+ <next>
310
+ <block type="hardware_smalrubot_s1_dc_motor_set_power_ratio" inline="true">
311
+ <field name="LOR">left</field>
312
+ <value name="SPEED">
313
+ <block type="math_number">
314
+ <field name="NUM">10</field>
315
+ </block>
316
+ </value>
317
+ <next>
318
+ <block type="hardware_smalrubot_s1_dc_motor_set_power_ratio" inline="true">
319
+ <field name="LOR">right</field>
320
+ <value name="SPEED">
321
+ <block type="math_number">
322
+ <field name="NUM">90</field>
323
+ </block>
324
+ </value>
325
+ </block>
326
+ </next>
327
+ </block>
328
+ </next>
329
+ </block>
330
+ </next>
331
+ </block>
332
+ </next>
245
333
  </block>
246
334
  </next>
247
335
  </block>