artoo 1.4.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/Gemfile.lock +4 -2
- data/README.md +36 -17
- data/examples/hello_api.rb +18 -7
- data/lib/artoo/api/api.rb +25 -6
- data/lib/artoo/api/route_helpers.rb +6 -0
- data/lib/artoo/ext/timers.rb +41 -0
- data/lib/artoo/robot.rb +31 -4
- data/lib/artoo/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0431129b36962326980dd7276fd60800b83920a
|
4
|
+
data.tar.gz: aff806d943afefb360b34d6f4cb8eff004c432a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce7fca914d9a2ec16eb3ff84d8c933b4860d585d86574e7019e3fc9560b658790ce286a49ebb9a292c58063b6a5007707dc411e30ab1b15b9660c352a6d03b9c
|
7
|
+
data.tar.gz: aab84f30e836e8cd97ae429163374098680b38bb5424adef4687142e1caba8239ac9e359c93d7a7a0d214904e690c196bc61e2e3ac6de302f04ee5ec26e67668
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
artoo (1.
|
4
|
+
artoo (1.5.0)
|
5
5
|
celluloid (~> 0.15.0)
|
6
6
|
celluloid-io (~> 0.15.0)
|
7
7
|
multi_json (~> 1.6)
|
@@ -15,7 +15,7 @@ GEM
|
|
15
15
|
specs:
|
16
16
|
bootstrap-sass (2.3.2.2)
|
17
17
|
sass (~> 3.2)
|
18
|
-
celluloid (0.15.
|
18
|
+
celluloid (0.15.2)
|
19
19
|
timers (~> 1.1.0)
|
20
20
|
celluloid-io (0.15.0)
|
21
21
|
celluloid (>= 0.15.0)
|
@@ -60,6 +60,7 @@ GEM
|
|
60
60
|
http (0.5.0)
|
61
61
|
http_parser.rb
|
62
62
|
http_parser.rb (0.6.0.beta.2)
|
63
|
+
http_parser.rb (0.6.0.beta.2-java)
|
63
64
|
json (1.7.7)
|
64
65
|
json (1.7.7-java)
|
65
66
|
kramdown (1.2.0)
|
@@ -74,6 +75,7 @@ GEM
|
|
74
75
|
metaclass (~> 0.0.1)
|
75
76
|
multi_json (1.8.0)
|
76
77
|
nio4r (0.5.0)
|
78
|
+
nio4r (0.5.0-java)
|
77
79
|
pry (0.9.12.2)
|
78
80
|
coderay (~> 1.0.5)
|
79
81
|
method_source (~> 0.8)
|
data/README.md
CHANGED
@@ -6,6 +6,8 @@ Artoo is a micro-framework for robotics using Ruby.
|
|
6
6
|
|
7
7
|
Artoo provides a simple, yet powerful Domain-Specific Language (DSL) for robotics and physical computing.
|
8
8
|
|
9
|
+
Want to use JavaScript on robots? Check out our sister project Cylon.js (http://cylonjs.com)
|
10
|
+
|
9
11
|
[![Code Climate](https://codeclimate.com/github/hybridgroup/artoo.png)](https://codeclimate.com/github/hybridgroup/artoo) [![Build Status](https://travis-ci.org/hybridgroup/artoo.png?branch=master)](https://travis-ci.org/hybridgroup/artoo)
|
10
12
|
|
11
13
|
## Examples:
|
@@ -96,8 +98,9 @@ Artoo has a extensible system for connecting to hardware devices. The following
|
|
96
98
|
- [BeagleBone](http://beagleboard.org/) <=> [Adaptor](https://github.com/hybridgroup/artoo-beaglebone)
|
97
99
|
- [Crazyflie](http://www.bitcraze.se/) <=> [Adaptor](https://github.com/hybridgroup/artoo-crazyflie)
|
98
100
|
- [Digispark](http://digistump.com/products/1) <=> [Adaptor](https://github.com/hybridgroup/artoo-digispark)
|
99
|
-
- [Leap Motion](https://www.leapmotion.com/) <=> [Adaptor](https://github.com/hybridgroup/artoo-leapmotion)
|
100
101
|
- [Joystick](http://www.libsdl.org/) <=> [Adaptor](https://github.com/hybridgroup/artoo-joystick)
|
102
|
+
- [Leap Motion](https://www.leapmotion.com/) <=> [Adaptor](https://github.com/hybridgroup/artoo-leapmotion)
|
103
|
+
- [OpenCV](http://opencv.org/) <=> [Adaptor](https://github.com/hybridgroup/artoo-opencv)
|
101
104
|
- [Pebble](http://getpebble.com/) <=> [Adaptor](https://github.com/hybridgroup/artoo-pebble)
|
102
105
|
- [Raspberry Pi](http://www.raspberrypi.org/) <=> [Adaptor](https://github.com/hybridgroup/artoo-raspi)
|
103
106
|
- [Roomba](http://www.irobot.com/us/robots/Educators/Create.aspx) <=> [Adaptor](https://github.com/hybridgroup/artoo-roomba)
|
@@ -168,31 +171,44 @@ Once the robot or group is working, you can view the main API page at the host a
|
|
168
171
|
|
169
172
|
Artoo makes it easy to do Test Driven Development (TDD) of your robotic devices using your favorite Ruby test and mocking frameworks.
|
170
173
|
|
171
|
-
Here is an example that uses Minitest and
|
174
|
+
Here is an example that uses Minitest, Mocha, and Timecop:
|
172
175
|
|
173
176
|
```ruby
|
177
|
+
require './test_helper'
|
178
|
+
require './test_robot'
|
179
|
+
|
174
180
|
describe 'sphero' do
|
175
181
|
let(:robot) { Artoo::MainRobot.new }
|
176
|
-
|
177
|
-
|
182
|
+
let (:start) { Time.now }
|
183
|
+
|
184
|
+
before :each do
|
185
|
+
Timecop.travel(start)
|
178
186
|
robot.work
|
179
|
-
|
180
|
-
robot.has_work?(:every, 3.seconds).wont_be_nil
|
181
187
|
end
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
robot.work
|
187
|
-
sleep 6.1
|
188
|
+
|
189
|
+
after :each do
|
190
|
+
Timecop.return
|
188
191
|
end
|
189
|
-
|
192
|
+
|
193
|
+
it 'has work to do every 3 seconds' do
|
194
|
+
robot.has_work?(:every, 3.seconds).wont_be_nil
|
195
|
+
end
|
196
|
+
|
190
197
|
it 'receives collision event' do
|
191
198
|
robot.expects(:contact)
|
192
|
-
|
193
|
-
robot.work
|
194
199
|
robot.sphero.publish("collision", "clunk")
|
195
|
-
sleep 0.
|
200
|
+
sleep 0.05
|
201
|
+
end
|
202
|
+
|
203
|
+
it 'must roll every 3 seconds' do
|
204
|
+
Timecop.travel(start + 3.seconds) do
|
205
|
+
robot.sphero.expects(:roll)
|
206
|
+
sleep 0.05
|
207
|
+
end
|
208
|
+
Timecop.travel(start + 6.seconds) do
|
209
|
+
robot.sphero.expects(:roll)
|
210
|
+
sleep 0.05
|
211
|
+
end
|
196
212
|
end
|
197
213
|
end
|
198
214
|
```
|
@@ -214,12 +230,13 @@ work do
|
|
214
230
|
on sphero, :collision => :contact
|
215
231
|
|
216
232
|
every(3.seconds) do
|
217
|
-
puts "Rolling..."
|
218
233
|
sphero.roll 90, rand(360)
|
219
234
|
end
|
220
235
|
end
|
221
236
|
```
|
222
237
|
|
238
|
+
The repo with full example of using Artoo for test driven robotics is located at [https://github.com/hybridgroup/artoo-test-example](https://github.com/hybridgroup/artoo-test-example)
|
239
|
+
|
223
240
|
## CLI
|
224
241
|
|
225
242
|
Artoo has a Command Line Interface (CLI) so you can access important features right from the command line.
|
@@ -305,6 +322,8 @@ Done!
|
|
305
322
|
|
306
323
|
Check out our [documentation](http://artoo.io/documentation/) for lots of information about how to use Artoo.
|
307
324
|
|
325
|
+
If you want to help us with some documentation on the site, you can go to [artoo.io branch](https://github.com/hybridgroup/artoo/tree/artoo.io) and then, follow the instructions.
|
326
|
+
|
308
327
|
## IRC
|
309
328
|
|
310
329
|
Need more help? Just want to say "Hello"? Come visit us on IRC freenode #artoo
|
data/examples/hello_api.rb
CHANGED
@@ -1,9 +1,20 @@
|
|
1
|
-
require 'artoo'
|
1
|
+
require 'artoo/robot'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
class HelloRobot < Artoo::Robot
|
4
|
+
connection :loop
|
5
|
+
device :passthru
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
api :host => '127.0.0.1', :port => '4321'
|
8
|
+
|
9
|
+
work do
|
10
|
+
puts "Hello from the API running at #{api_host}:#{api_port}..."
|
11
|
+
end
|
12
|
+
|
13
|
+
def hello name
|
14
|
+
"hi #{name}!"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
robots = []
|
19
|
+
robots << HelloRobot.new(:name => "hello", :commands => [:hello])
|
20
|
+
HelloRobot.work!(robots)
|
data/lib/artoo/api/api.rb
CHANGED
@@ -36,6 +36,19 @@ module Artoo
|
|
36
36
|
master.robot(@params['robotid']).as_json
|
37
37
|
end
|
38
38
|
|
39
|
+
# Retrieve robot commands
|
40
|
+
# @return [JSON] commands
|
41
|
+
get '/robots/:robotid/commands' do
|
42
|
+
MultiJson.dump(master.robot(@params['robotid']).commands)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Execute robot command
|
46
|
+
# @return [JSON] command
|
47
|
+
any '/robots/:robotid/commands/:commandid' do
|
48
|
+
result = master.robot(@params['robotid']).command(@params['commandid'], *command_params)
|
49
|
+
return MultiJson.dump({'result' => result})
|
50
|
+
end
|
51
|
+
|
39
52
|
# Retrieve robot devices
|
40
53
|
# @return [JSON] devices
|
41
54
|
get '/robots/:robotid/devices' do
|
@@ -56,7 +69,7 @@ module Artoo
|
|
56
69
|
|
57
70
|
# Execute robot command
|
58
71
|
# @return [JSON] command
|
59
|
-
|
72
|
+
any '/robots/:robotid/devices/:deviceid/commands/:commandid' do
|
60
73
|
result = device(@params['robotid'], @params['deviceid']).command(@params['commandid'], *command_params)
|
61
74
|
return MultiJson.dump({'result' => result})
|
62
75
|
end
|
@@ -91,11 +104,17 @@ module Artoo
|
|
91
104
|
end
|
92
105
|
|
93
106
|
def command_params
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
107
|
+
if @req.body.to_s != ""
|
108
|
+
data = MultiJson.load(@req.body.to_s, :symbolize_keys => true)
|
109
|
+
if data
|
110
|
+
params = []
|
111
|
+
data.each {|key, value|
|
112
|
+
params << value
|
113
|
+
}
|
114
|
+
params
|
115
|
+
else
|
116
|
+
nil
|
117
|
+
end
|
99
118
|
end
|
100
119
|
end
|
101
120
|
end
|
@@ -124,6 +124,12 @@ module Artoo
|
|
124
124
|
def put(path, &block)
|
125
125
|
route 'PUT', path, &block
|
126
126
|
end
|
127
|
+
|
128
|
+
# Route function for put
|
129
|
+
def any(path, &block)
|
130
|
+
route 'GET', path, &block
|
131
|
+
route 'POST', path, &block
|
132
|
+
end
|
127
133
|
end
|
128
134
|
|
129
135
|
module InstanceMethods
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Monkeypatches for Timers & Timer classes used by Celluloid
|
2
|
+
class Timers
|
3
|
+
def initialize
|
4
|
+
@timers = SortedSet.new
|
5
|
+
@paused_timers = SortedSet.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def pause(timer = nil)
|
9
|
+
return pause_all if timer.nil?
|
10
|
+
raise TypeError, "not a Timers::Timer" unless timer.is_a? Timers::Timer
|
11
|
+
@timers.delete timer
|
12
|
+
@paused_timers.add timer
|
13
|
+
end
|
14
|
+
|
15
|
+
def pause_all
|
16
|
+
@timers.each {|timer| timer.pause}
|
17
|
+
end
|
18
|
+
|
19
|
+
def continue(timer = nil)
|
20
|
+
return continue_all if timer.nil?
|
21
|
+
raise TypeError, "not a Timers::Timer" unless timer.is_a? Timers::Timer
|
22
|
+
@paused_timers.delete timer
|
23
|
+
@timers.add timer
|
24
|
+
end
|
25
|
+
|
26
|
+
def continue_all
|
27
|
+
@paused_timers.each {|timer| timer.continue}
|
28
|
+
end
|
29
|
+
|
30
|
+
class Timer
|
31
|
+
# Pause this timer
|
32
|
+
def pause
|
33
|
+
@timers.pause self
|
34
|
+
end
|
35
|
+
|
36
|
+
# Continue this timer
|
37
|
+
def continue
|
38
|
+
@timers.continue self
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/artoo/robot.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'celluloid/autostart'
|
2
2
|
require 'celluloid/io'
|
3
3
|
require 'multi_json'
|
4
|
-
|
4
|
+
require 'artoo/ext/timers'
|
5
5
|
require 'artoo/ext/actor'
|
6
|
+
|
6
7
|
require 'artoo/robot_class_methods'
|
7
8
|
require 'artoo/basic'
|
8
9
|
require 'artoo/connection'
|
@@ -29,7 +30,7 @@ module Artoo
|
|
29
30
|
include Artoo::Utility
|
30
31
|
include Artoo::Events
|
31
32
|
|
32
|
-
attr_reader :connections, :devices, :name
|
33
|
+
attr_reader :connections, :devices, :name, :commands
|
33
34
|
|
34
35
|
exclusive :execute_startup
|
35
36
|
|
@@ -40,6 +41,7 @@ module Artoo
|
|
40
41
|
# @option params [Collection] :devices
|
41
42
|
def initialize(params={})
|
42
43
|
@name = params[:name] || "Robot #{random_string}"
|
44
|
+
@commands = params[:commands] || []
|
43
45
|
initialize_connections(params[:connections] || {})
|
44
46
|
initialize_devices(params[:devices] || {})
|
45
47
|
end
|
@@ -117,7 +119,8 @@ module Artoo
|
|
117
119
|
{
|
118
120
|
:name => name,
|
119
121
|
:connections => connections.each_value.collect {|c|c.to_hash},
|
120
|
-
:devices => devices.each_value.collect {|d|d.to_hash}
|
122
|
+
:devices => devices.each_value.collect {|d|d.to_hash},
|
123
|
+
:commands => commands
|
121
124
|
}
|
122
125
|
end
|
123
126
|
|
@@ -131,8 +134,31 @@ module Artoo
|
|
131
134
|
"#<Robot #{object_id}>"
|
132
135
|
end
|
133
136
|
|
137
|
+
def command(method_name, *arguments)
|
138
|
+
if known_command?(method_name)
|
139
|
+
if arguments.first
|
140
|
+
self.send(method_name, *arguments)
|
141
|
+
else
|
142
|
+
self.send(method_name)
|
143
|
+
end
|
144
|
+
else
|
145
|
+
"Unknown Command"
|
146
|
+
end
|
147
|
+
rescue Exception => e
|
148
|
+
Logger.error e.message
|
149
|
+
Logger.error e.backtrace.inspect
|
150
|
+
return nil
|
151
|
+
end
|
152
|
+
|
153
|
+
# @return [Boolean] True if command exists
|
154
|
+
def known_command?(method_name)
|
155
|
+
return commands.include?(method_name.intern)
|
156
|
+
end
|
157
|
+
|
158
|
+
|
134
159
|
private
|
135
160
|
|
161
|
+
|
136
162
|
def initialize_connections(params={})
|
137
163
|
@connections = {}
|
138
164
|
connection_types.each {|ct|
|
@@ -147,7 +173,8 @@ module Artoo
|
|
147
173
|
@devices = {}
|
148
174
|
device_types.each {|d|
|
149
175
|
Logger.info "Initializing device #{d[:name].to_s}..."
|
150
|
-
|
176
|
+
dp = params[d[:name]] || {}
|
177
|
+
d = Device.new(d.merge(dp).merge(:parent => current_instance))
|
151
178
|
instance_eval("def #{d.name}; return devices[:#{d.name}]; end")
|
152
179
|
@devices[d.name.intern] = d
|
153
180
|
}
|
data/lib/artoo/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: artoo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ron Evans
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-12-07 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: celluloid
|
@@ -226,6 +226,7 @@ files:
|
|
226
226
|
- lib/artoo/exceptions.rb
|
227
227
|
- lib/artoo/ext/actor.rb
|
228
228
|
- lib/artoo/ext/numeric.rb
|
229
|
+
- lib/artoo/ext/timers.rb
|
229
230
|
- lib/artoo/generators/adaptor.rb
|
230
231
|
- lib/artoo/generators/adaptor/Gemfile.tt
|
231
232
|
- lib/artoo/generators/adaptor/LICENSE
|