motel 0.2 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +35 -0
- data/Rakefile +48 -0
- data/bin/clients/simple/main.rb +131 -0
- data/bin/server/main.rb +61 -0
- data/conf/motel-schema.xml +72 -0
- data/lib/motel/common.rb +35 -11
- data/lib/motel/dsl.rb +12 -0
- data/lib/motel/exceptions.rb +14 -0
- data/lib/motel/location.rb +100 -0
- data/lib/motel/{models → movement_strategies}/elliptical.rb +51 -89
- data/lib/motel/movement_strategies/linear.rb +54 -0
- data/lib/motel/movement_strategies/stopped.rb +18 -0
- data/lib/motel/movement_strategy.rb +29 -0
- data/lib/motel/runner.rb +94 -108
- data/lib/motel/simrpc.rb +131 -0
- data/lib/motel/thread_pool.rb +51 -0
- data/lib/motel.rb +9 -5
- data/spec/common_spec.rb +77 -0
- data/spec/dsl_spec.rb +27 -0
- data/spec/location_spec.rb +109 -0
- data/spec/movement_strategies/elliptical_spec.rb +90 -0
- data/spec/movement_strategies/linear_spec.rb +51 -0
- data/spec/movement_strategies/stopped_spec.rb +39 -0
- data/spec/movement_strategy_spec.rb +24 -0
- data/spec/runner_spec.rb +45 -0
- data/spec/simrpc_spec.rb +85 -0
- data/spec/spec_helper.rb +26 -0
- metadata +36 -34
- data/README +0 -0
- data/conf/amqp.yml +0 -13
- data/conf/database.yml +0 -41
- data/db/migrate/001_create_locations_and_movement_strategies.rb +0 -45
- data/db/migrate/002_create_linear_movement_strategy.rb +0 -23
- data/db/migrate/003_create_elliptical_movement_strategy.rb +0 -52
- data/lib/motel/loader.rb +0 -47
- data/lib/motel/models/linear.rb +0 -76
- data/lib/motel/models/location.rb +0 -109
- data/lib/motel/models/movement_strategy.rb +0 -82
- data/lib/motel/models/stopped.rb +0 -16
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.3"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mohammed Morsi
|
@@ -9,67 +9,69 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-03-14 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: activerecord
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 2.1.1
|
24
|
-
version:
|
14
|
+
dependencies: []
|
15
|
+
|
25
16
|
description: Motel is a library to track and move the locations of objects in a 3D environment.
|
26
17
|
email: movitto@yahoo.com
|
27
18
|
executables: []
|
28
19
|
|
29
20
|
extensions: []
|
30
21
|
|
31
|
-
extra_rdoc_files:
|
32
|
-
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
33
24
|
files:
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
37
|
-
-
|
38
|
-
-
|
39
|
-
- lib/motel/
|
40
|
-
- lib/motel/
|
41
|
-
- lib/motel/
|
42
|
-
- lib/motel/
|
43
|
-
- lib/motel/models/elliptical.rb
|
25
|
+
- bin/server/main.rb
|
26
|
+
- bin/clients/simple/main.rb
|
27
|
+
- conf/motel-schema.xml
|
28
|
+
- lib/motel/movement_strategies/elliptical.rb
|
29
|
+
- lib/motel/movement_strategies/stopped.rb
|
30
|
+
- lib/motel/movement_strategies/linear.rb
|
31
|
+
- lib/motel/dsl.rb
|
32
|
+
- lib/motel/movement_strategy.rb
|
33
|
+
- lib/motel/location.rb
|
44
34
|
- lib/motel/common.rb
|
45
|
-
- lib/motel/loader.rb
|
46
|
-
- lib/motel/runner.rb
|
47
35
|
- lib/motel/semaphore.rb
|
36
|
+
- lib/motel/thread_pool.rb
|
37
|
+
- lib/motel/runner.rb
|
38
|
+
- lib/motel/exceptions.rb
|
39
|
+
- lib/motel/simrpc.rb
|
48
40
|
- lib/motel.rb
|
49
|
-
- LICENSE
|
50
41
|
- COPYING
|
51
|
-
-
|
42
|
+
- LICENSE
|
43
|
+
- Rakefile
|
44
|
+
- README.rdoc
|
45
|
+
- spec/movement_strategies/stopped_spec.rb
|
46
|
+
- spec/movement_strategies/elliptical_spec.rb
|
47
|
+
- spec/movement_strategies/linear_spec.rb
|
48
|
+
- spec/common_spec.rb
|
49
|
+
- spec/spec_helper.rb
|
50
|
+
- spec/movement_strategy_spec.rb
|
51
|
+
- spec/location_spec.rb
|
52
|
+
- spec/simrpc_spec.rb
|
53
|
+
- spec/runner_spec.rb
|
54
|
+
- spec/dsl_spec.rb
|
52
55
|
has_rdoc: true
|
53
56
|
homepage: http://morsi.org/projects/motel
|
54
57
|
licenses: []
|
55
58
|
|
56
59
|
post_install_message:
|
57
|
-
rdoc_options:
|
58
|
-
|
59
|
-
- --charset=UTF-8
|
60
|
+
rdoc_options: []
|
61
|
+
|
60
62
|
require_paths:
|
61
63
|
- lib
|
62
64
|
required_ruby_version: !ruby/object:Gem::Requirement
|
63
65
|
requirements:
|
64
66
|
- - ">="
|
65
67
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
68
|
+
version: 1.8.1
|
67
69
|
version:
|
68
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
71
|
requirements:
|
70
72
|
- - ">="
|
71
73
|
- !ruby/object:Gem::Version
|
72
|
-
version: 1.3.
|
74
|
+
version: 1.3.3
|
73
75
|
version:
|
74
76
|
requirements: []
|
75
77
|
|
data/README
DELETED
File without changes
|
data/conf/amqp.yml
DELETED
data/conf/database.yml
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# motel database config
|
2
|
-
#
|
3
|
-
# Fedora Install Instructions:
|
4
|
-
# sudo yum install ruby-postgres postgresql-server
|
5
|
-
# sudo /sbin/service postgresql initdb
|
6
|
-
# sudo /sbin/service postgresql start
|
7
|
-
# sudo su - postgres
|
8
|
-
# createdb motel
|
9
|
-
# $ psql motel
|
10
|
-
# $-# CREATE USER motel WITH PASSWORD 'motel';
|
11
|
-
# $-# GRANT ALL PRIVILEGES ON DATABASE motel to motel;
|
12
|
-
# $-# CREATE DATABASE motel_test;
|
13
|
-
# $-# GRANT ALL PRIVILEGES ON DATABASE motel_test to motel;
|
14
|
-
# $-# CREATE DATABASE motel_development;
|
15
|
-
# $-# GRANT ALL PRIVILEGES ON DATABASE motel_development to motel;
|
16
|
-
# $-# \q
|
17
|
-
# $ exit
|
18
|
-
|
19
|
-
production:
|
20
|
-
adapter: postgresql
|
21
|
-
database: motel
|
22
|
-
username: motel
|
23
|
-
password: motel
|
24
|
-
host: localhost
|
25
|
-
pool: 20
|
26
|
-
|
27
|
-
development:
|
28
|
-
adapter: postgresql
|
29
|
-
database: motel_development
|
30
|
-
username: motel
|
31
|
-
password: motel
|
32
|
-
host: localhost
|
33
|
-
pool: 20
|
34
|
-
|
35
|
-
test:
|
36
|
-
adapter: postgresql
|
37
|
-
database: motel_test
|
38
|
-
username: motel
|
39
|
-
password: motel
|
40
|
-
host: localhost
|
41
|
-
pool: 20
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# creates the locations and movement_strategies tables
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel'
|
7
|
-
|
8
|
-
# ActiveRecord::Migration 001
|
9
|
-
class CreateLocationsAndMovementStrategies < ActiveRecord::Migration
|
10
|
-
def self.up
|
11
|
-
|
12
|
-
create_table :movement_strategies do |t|
|
13
|
-
t.string :type, :null => false, :size => 50
|
14
|
-
t.float :step_delay, :null => false
|
15
|
-
end
|
16
|
-
|
17
|
-
create_table :locations do |t|
|
18
|
-
t.float :x, :default => nil
|
19
|
-
t.float :y, :default => nil
|
20
|
-
t.float :z, :default => nil
|
21
|
-
t.integer :movement_strategy_id, :null => false
|
22
|
-
|
23
|
-
t.integer :parent_id, :default => nil
|
24
|
-
end
|
25
|
-
|
26
|
-
execute "alter table locations add constraint fk_location_parent
|
27
|
-
foreign key(parent_id) references locations(id)"
|
28
|
-
|
29
|
-
execute "alter table locations add constraint fk_location_movement_strategy
|
30
|
-
foreign key(movement_strategy_id) references movement_strategies(id)"
|
31
|
-
|
32
|
-
execute "alter table locations add constraint root_or_child
|
33
|
-
check (parent_id IS NULL AND x IS NULL AND y IS NULL AND z IS NULL OR
|
34
|
-
parent_id IS NOT NULL AND x IS NOT NULL AND y IS NOT NULL AND z IS NOT NULL)"
|
35
|
-
|
36
|
-
|
37
|
-
# create the first / default movement strategy 'stopped'
|
38
|
-
Motel::Models::Stopped.new(:step_delay => 5).save!
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.down
|
42
|
-
drop_table :locations
|
43
|
-
drop_table :movement_strategies
|
44
|
-
end
|
45
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# creates the neccessary fields for the Linear MovementStrategy
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel'
|
7
|
-
|
8
|
-
# ActiveRecord::Migration 002
|
9
|
-
class CreateLinearMovementStrategy < ActiveRecord::Migration
|
10
|
-
def self.up
|
11
|
-
add_column :movement_strategies, :speed, :float
|
12
|
-
add_column :movement_strategies, :direction_vector_x, :float
|
13
|
-
add_column :movement_strategies, :direction_vector_y, :float
|
14
|
-
add_column :movement_strategies, :direction_vector_z, :float
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.down
|
18
|
-
remove_column :movement_strategies, :speed
|
19
|
-
remove_column :movement_strategies, :direction_vector_x
|
20
|
-
remove_column :movement_strategies, :direction_vector_y
|
21
|
-
remove_column :movement_strategies, :direction_vector_z
|
22
|
-
end
|
23
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# creates the neccessary fields for the Elliptical MovementStrategy
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel'
|
7
|
-
|
8
|
-
# ActiveRecord::Migration 003
|
9
|
-
class CreateEllipticalMovementStrategy < ActiveRecord::Migration
|
10
|
-
def self.up
|
11
|
-
# we already have speed from linear
|
12
|
-
#add_column :movement_strategies, :speed, :float
|
13
|
-
|
14
|
-
# relative_to field indicates what type of parent
|
15
|
-
# this movement stategy is relative to, for Ellilptical
|
16
|
-
# strategies, this can be 'center' indicating the parent
|
17
|
-
# is the center of the ellipse or 'foci' indicating the
|
18
|
-
# parent is on of the ellipse foci's
|
19
|
-
add_column :movement_strategies, :relative_to, :string, :size => 50
|
20
|
-
|
21
|
-
# eccentricity of the ellipse
|
22
|
-
add_column :movement_strategies, :eccentricity, :float
|
23
|
-
|
24
|
-
# semi_latus_rectum of the ellipse
|
25
|
-
add_column :movement_strategies, :semi_latus_rectum, :float
|
26
|
-
|
27
|
-
# unit direction vector of the major axis
|
28
|
-
add_column :movement_strategies, :direction_major_x, :float
|
29
|
-
add_column :movement_strategies, :direction_major_y, :float
|
30
|
-
add_column :movement_strategies, :direction_major_z, :float
|
31
|
-
|
32
|
-
# unit direction vector of the minor axis
|
33
|
-
add_column :movement_strategies, :direction_minor_x, :float
|
34
|
-
add_column :movement_strategies, :direction_minor_y, :float
|
35
|
-
add_column :movement_strategies, :direction_minor_z, :float
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.down
|
39
|
-
# remove in linear strategy
|
40
|
-
#remove_column :movement_strategies, :speed
|
41
|
-
|
42
|
-
remove_column :movement_strategies, :relative_to
|
43
|
-
remove_column :movement_strategies, :eccentricity
|
44
|
-
remove_column :movement_strategies, :semi_latus_rectum
|
45
|
-
remove_column :movement_strategies, :direction_major_x
|
46
|
-
remove_column :movement_strategies, :direction_major_y
|
47
|
-
remove_column :movement_strategies, :direction_major_z
|
48
|
-
remove_column :movement_strategies, :direction_minor_x
|
49
|
-
remove_column :movement_strategies, :direction_minor_y
|
50
|
-
remove_column :movement_strategies, :direction_minor_z
|
51
|
-
end
|
52
|
-
end
|
data/lib/motel/loader.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
# The Loader class definition
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel/runner'
|
7
|
-
|
8
|
-
module Motel
|
9
|
-
|
10
|
-
# A Loader loads instances of Location from the db
|
11
|
-
# according to any specified conditions, instantiates
|
12
|
-
# a new Runner for each of those locations and returns them
|
13
|
-
class Loader
|
14
|
-
|
15
|
-
public
|
16
|
-
|
17
|
-
# Default class constructor
|
18
|
-
def initialize
|
19
|
-
end
|
20
|
-
|
21
|
-
# Static member to load all locations that match a specified
|
22
|
-
# condition (ala activerecord) and add it to the singleton Runner
|
23
|
-
# instance using it to run the locations.
|
24
|
-
def self.Load(conditions = 'parent_id IS NULL')
|
25
|
-
locations = Location.find(:all, :conditions => conditions)
|
26
|
-
return nil if locations.size == 0
|
27
|
-
|
28
|
-
locations.each { |location|
|
29
|
-
run_location(location)
|
30
|
-
}
|
31
|
-
return locations.size
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
# Static internal helper method that adds a location and
|
37
|
-
# all its children to the Runner
|
38
|
-
def self.run_location(location)
|
39
|
-
Runner.get.run location
|
40
|
-
location.children.each { |child|
|
41
|
-
run_location child
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
data/lib/motel/models/linear.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
# The Linear MovementStrategy model definition
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel/common'
|
7
|
-
require 'motel/models/movement_strategy'
|
8
|
-
|
9
|
-
module Motel
|
10
|
-
module Models
|
11
|
-
|
12
|
-
# The Linear MovementStrategy moves a location
|
13
|
-
# in a linear manner as defined by a
|
14
|
-
# unit direction vector and a floating point
|
15
|
-
# speed
|
16
|
-
class Linear < MovementStrategy
|
17
|
-
|
18
|
-
# Linear MovementStrategy must specify x,y,z components of
|
19
|
-
# a unit direction vector
|
20
|
-
validates_presence_of [:direction_vector_x,
|
21
|
-
:direction_vector_y,
|
22
|
-
:direction_vector_z]
|
23
|
-
|
24
|
-
# make sure the unit direction vector is normal
|
25
|
-
before_validation :normalize_direction_vector
|
26
|
-
def normalize_direction_vector
|
27
|
-
dx, dy, dz =
|
28
|
-
normalize(direction_vector_x, direction_vector_y, direction_vector_z)
|
29
|
-
self.direction_vector_x, self.direction_vector_y, self.direction_vector_z = dx, dy, dz
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
# Linear MovementStrategy must specify the speed
|
34
|
-
# at which the location is moving
|
35
|
-
validates_presence_of :speed
|
36
|
-
validates_numericality_of :speed,
|
37
|
-
:greater_than_or_equal_to => 0
|
38
|
-
|
39
|
-
# Motel::Models::MovementStrategy::move
|
40
|
-
def move(location, elapsed_seconds)
|
41
|
-
unless valid?
|
42
|
-
Logger.warn "linear movement strategy not valid, not proceeding with move"
|
43
|
-
return
|
44
|
-
end
|
45
|
-
|
46
|
-
Logger.debug "moving location #{location.to_s} via linear movement strategy"
|
47
|
-
|
48
|
-
# calculate distance and update x,y,z accordingly
|
49
|
-
distance = speed * elapsed_seconds
|
50
|
-
|
51
|
-
location.x += distance * direction_vector_x
|
52
|
-
location.y += distance * direction_vector_y
|
53
|
-
location.z += distance * direction_vector_z
|
54
|
-
|
55
|
-
Logger.debug "moved location #{location} via linear movement strategy"
|
56
|
-
end
|
57
|
-
|
58
|
-
# convert non-nil linear movement strategy attributes to a hash
|
59
|
-
def to_h
|
60
|
-
result = {}
|
61
|
-
result[:speed] = speed unless speed.nil?
|
62
|
-
result[:direction_vector_x] = direction_vector_x unless direction_vector_x.nil?
|
63
|
-
result[:direction_vector_y] = direction_vector_y unless direction_vector_y.nil?
|
64
|
-
result[:direction_vector_z] = direction_vector_z unless direction_vector_z.nil?
|
65
|
-
return result
|
66
|
-
end
|
67
|
-
|
68
|
-
# convert linear movement strategy to a string
|
69
|
-
def to_s
|
70
|
-
super + "; speed: #{speed}; direction_vector_x:#{direction_vector_x}; " +
|
71
|
-
"direction_vector_y:#{direction_vector_y}; direction_vector_z:#{direction_vector_z}"
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
end # module Models
|
76
|
-
end # module Motel
|
@@ -1,109 +0,0 @@
|
|
1
|
-
# The Location model definition
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel/models/movement_strategy'
|
7
|
-
|
8
|
-
module Motel
|
9
|
-
module Models
|
10
|
-
|
11
|
-
# A Location defines an optional parent location and the x,y,z
|
12
|
-
# cartesian coordinates of the location relative to that parent.
|
13
|
-
# If parent is not specified x,y,z are ignored and this location
|
14
|
-
# is assumed to be the 'center' of the system to which it belongs
|
15
|
-
# Also is related to a movable object defining the parameters
|
16
|
-
# of the locations movement
|
17
|
-
class Location < ActiveRecord::Base
|
18
|
-
# a location may have a parent and/or act as a parent to others
|
19
|
-
belongs_to :location, :foreign_key => :parent_id
|
20
|
-
has_many :locations, :foreign_key => :parent_id, :dependent => :destroy
|
21
|
-
|
22
|
-
belongs_to :movement_strategy
|
23
|
-
|
24
|
-
# a generic association which this location can belong to
|
25
|
-
belongs_to :entity, :polymorphic => true
|
26
|
-
#validates_presense_of [ :entity_type, :entity_id ]
|
27
|
-
|
28
|
-
# FIXME add optional remote_location_server field
|
29
|
-
|
30
|
-
alias :parent :location
|
31
|
-
alias :parent= :location=
|
32
|
-
alias :children :locations
|
33
|
-
alias :children= :locations=
|
34
|
-
|
35
|
-
# return this location's root location
|
36
|
-
def root
|
37
|
-
return self if parent.nil?
|
38
|
-
return parent.root
|
39
|
-
end
|
40
|
-
|
41
|
-
# traverse all chilren recursively, calling block for each
|
42
|
-
def traverse_descendants(&bl)
|
43
|
-
children.each { |child|
|
44
|
-
bl.call child
|
45
|
-
child.traverse_descendants &bl
|
46
|
-
}
|
47
|
-
end
|
48
|
-
|
49
|
-
# default to the stopped movement strategy if not set on validation
|
50
|
-
before_validation :default_movement_strategy
|
51
|
-
def default_movement_strategy
|
52
|
-
self.movement_strategy = MovementStrategy.stopped if self.movement_strategy.nil?
|
53
|
-
end
|
54
|
-
|
55
|
-
public
|
56
|
-
validates_presence_of :movement_strategy
|
57
|
-
|
58
|
-
validates_presence_of [:x, :y, :z],
|
59
|
-
:unless => Proc.new { |location| location.location.nil? }
|
60
|
-
|
61
|
-
validates_presence_of :location,
|
62
|
-
:unless => Proc.new { |location| location.x.nil? &&
|
63
|
-
location.y.nil? &&
|
64
|
-
location.z.nil? }
|
65
|
-
|
66
|
-
public
|
67
|
-
|
68
|
-
# return non-nil attributes in hash
|
69
|
-
def to_h
|
70
|
-
result = {}
|
71
|
-
#result[:id] = id unless id.nil?
|
72
|
-
result[:parent_id] = parent_id unless parent_id.nil?
|
73
|
-
result[:x] = x unless x.nil?
|
74
|
-
result[:y] = y unless y.nil?
|
75
|
-
result[:z] = z unless z.nil?
|
76
|
-
return result
|
77
|
-
end
|
78
|
-
|
79
|
-
# convert location to a string
|
80
|
-
def to_s
|
81
|
-
"id:#{id}; parent_id:#{parent_id}; parent: #{parent.nil? ? "nil" : "notnil"}; entity type: #{entity_type}; x:#{x}; y:#{y}; z:#{z}; " +
|
82
|
-
"movement_strategy:#{movement_strategy.to_s}; children:#{locations.size}"
|
83
|
-
end
|
84
|
-
|
85
|
-
# return sum of the x values of this location and all its parents,
|
86
|
-
# eg the absolute 'x' of the location
|
87
|
-
def total_x
|
88
|
-
return 0 if location.nil?
|
89
|
-
return location.total_x + x
|
90
|
-
end
|
91
|
-
|
92
|
-
# return sum of the y values of this location and all its parents
|
93
|
-
# eg the absolute 'y' of the location
|
94
|
-
def total_y
|
95
|
-
return 0 if location.nil?
|
96
|
-
return location.total_y + y
|
97
|
-
end
|
98
|
-
|
99
|
-
# return sum of the z values of this location and all its parents
|
100
|
-
# eg the absolute 'z' of the location
|
101
|
-
def total_z
|
102
|
-
return 0 if location.nil?
|
103
|
-
return location.total_z + z
|
104
|
-
end
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
end # module Models
|
109
|
-
end # module Motel
|
@@ -1,82 +0,0 @@
|
|
1
|
-
# The MovementStrategy model definition
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel/common'
|
7
|
-
require 'motel/models/location'
|
8
|
-
|
9
|
-
module Motel
|
10
|
-
module Models
|
11
|
-
|
12
|
-
# MovementStrategy subclasses define the rules and params which
|
13
|
-
# a location changes its position.
|
14
|
-
class MovementStrategy < ActiveRecord::Base
|
15
|
-
# strategy is associated with location to move it
|
16
|
-
has_many :locations, :dependent => :destroy
|
17
|
-
|
18
|
-
# callbacks invoked when this object is moved
|
19
|
-
attr_accessor :movement_callbacks
|
20
|
-
|
21
|
-
# every movement strategy needs a type
|
22
|
-
validates_presence_of :type
|
23
|
-
|
24
|
-
# as more types are supported, add them here
|
25
|
-
validates_inclusion_of :type,
|
26
|
-
:in => %w( Stopped Linear Elliptical )
|
27
|
-
|
28
|
-
# step delay is recommended number of seconds
|
29
|
-
# a runner should sleep for between move invocations
|
30
|
-
validates_presence_of :step_delay
|
31
|
-
|
32
|
-
# default step_delay if not set
|
33
|
-
before_validation :default_step_delay
|
34
|
-
def default_step_delay
|
35
|
-
self.step_delay = 5 if step_delay.nil?
|
36
|
-
end
|
37
|
-
|
38
|
-
# use after_initialize instead of initialize
|
39
|
-
# http://blog.dalethatcher.com/2008/03/rails-dont-override-initialize-on.html
|
40
|
-
def after_initialize
|
41
|
-
@movement_callbacks = []
|
42
|
-
end
|
43
|
-
|
44
|
-
# default movement strategy is to do nothing
|
45
|
-
def move(location, elapsed_seconds)
|
46
|
-
end
|
47
|
-
|
48
|
-
# retreive the 'stopped' movement strategy
|
49
|
-
def self.stopped
|
50
|
-
ms = MovementStrategy.find(:first, :conditions => "type = 'Stopped'")
|
51
|
-
ms.nil? ? Stopped.new(:step_delay => 5) : ms
|
52
|
-
end
|
53
|
-
|
54
|
-
# return subclass corresponding to specified strategy type
|
55
|
-
def self.factory(strategy_type)
|
56
|
-
return MovementStrategy if strategy_type.nil?
|
57
|
-
|
58
|
-
if strategy_type.downcase == "stopped" || strategy_type == "Motel::Models::Stopped"
|
59
|
-
return Stopped
|
60
|
-
elsif strategy_type.downcase == "linear" || strategy_type == "Motel::Models::Linear"
|
61
|
-
return Linear
|
62
|
-
elsif strategy_type.downcase == "elliptical" || strategy_type == "Motel::Models::Elliptical"
|
63
|
-
return Elliptical
|
64
|
-
end
|
65
|
-
|
66
|
-
return MovementStrategy
|
67
|
-
end
|
68
|
-
|
69
|
-
# convert movement strategy to a hash
|
70
|
-
def to_h
|
71
|
-
{}
|
72
|
-
end
|
73
|
-
|
74
|
-
# convert movement strategy to a string
|
75
|
-
def to_s
|
76
|
-
"id:#{id}; type:#{self.class}" # XXX should be self.type but ruby will complain, this works for now
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
end # module Models
|
82
|
-
end # module Motel
|
data/lib/motel/models/stopped.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# The Stopped MovementStrategy model definition
|
2
|
-
#
|
3
|
-
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
-
# See COPYING for the License of this software
|
5
|
-
|
6
|
-
require 'motel/models/movement_strategy'
|
7
|
-
|
8
|
-
module Motel
|
9
|
-
module Models
|
10
|
-
|
11
|
-
# Stopped is the default MovementStrategy which does nothing
|
12
|
-
class Stopped < MovementStrategy
|
13
|
-
end
|
14
|
-
|
15
|
-
end # module Models
|
16
|
-
end # module Motel
|