udooneorest 1.0.0
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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/bin/udooneorest +2 -0
- data/lib/udooneorest.rb +183 -0
- data/lib/udooneorest/accelerometer.rb +50 -0
- data/lib/udooneorest/barometer.rb +18 -0
- data/lib/udooneorest/direction.rb +109 -0
- data/lib/udooneorest/export.rb +67 -0
- data/lib/udooneorest/gyroscope.rb +50 -0
- data/lib/udooneorest/magnetometer.rb +50 -0
- data/lib/udooneorest/temperature.rb +18 -0
- data/lib/udooneorest/validators.rb +119 -0
- data/lib/udooneorest/value.rb +117 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9c05a465947a23bb721af3753d43b51e74349e64
|
4
|
+
data.tar.gz: 279e4c8a58466597bfc76e5eae1929353959d790
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8c7ad84f98bfec09920e7e7b0099666972f77767b90296350b273a777b44604502f6ae0ad429dec6ec5764b275bd8f158d0ea4d62fd1b021b39ddcd24102379c
|
7
|
+
data.tar.gz: b447bdc805ca0875b01aa90f8adf376bebff1e1ab78e105f34f9e83cebd59314e8b92c4f09817111381100f89499e574545963cd0a753a158a8b2ff71b9cfb9c
|
data/Gemfile
ADDED
data/bin/udooneorest
ADDED
data/lib/udooneorest.rb
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
require_relative 'udooneorest/validators'
|
4
|
+
require_relative 'udooneorest/export'
|
5
|
+
require_relative 'udooneorest/value'
|
6
|
+
require_relative 'udooneorest/direction'
|
7
|
+
require_relative 'udooneorest/gyroscope'
|
8
|
+
require_relative 'udooneorest/accelerometer'
|
9
|
+
require_relative 'udooneorest/magnetometer'
|
10
|
+
require_relative 'udooneorest/barometer'
|
11
|
+
require_relative 'udooneorest/temperature'
|
12
|
+
|
13
|
+
|
14
|
+
GPIOS = %w(106 107 180 181 172 173 182 124 25 22 14 15 16 17 18 19 20 21 203 202 177 176 175 174 119 124 127 116 7 6 5 4)
|
15
|
+
HELP_URL = 'http://github.com/marksull/udooneorest'
|
16
|
+
BASE_PATH = '/sys/class/gpio/'
|
17
|
+
VALUE_LOW = '0'
|
18
|
+
VALUE_HIGH = '1'
|
19
|
+
DIRECTION_IN = 'in'
|
20
|
+
DIRECTION_OUT = 'out'
|
21
|
+
FAILED_MESSAGE = 'failed'
|
22
|
+
SUCCESS_MESSAGE = 'success'
|
23
|
+
|
24
|
+
module UdooNeoRest
|
25
|
+
|
26
|
+
class Base < Sinatra::Application
|
27
|
+
|
28
|
+
# Have Sinatra listen on all interfaces
|
29
|
+
set :bind, '0.0.0.0'
|
30
|
+
|
31
|
+
#############################################################################
|
32
|
+
# Message constructor
|
33
|
+
#
|
34
|
+
# status : the status of the operation
|
35
|
+
# message : the message to be displayed
|
36
|
+
#
|
37
|
+
def self.status_message(status, message)
|
38
|
+
"{'status' : '#{status}', 'message' : '#{message}'}"
|
39
|
+
end
|
40
|
+
|
41
|
+
#############################################################################
|
42
|
+
# Construct the status message when no errors occurred
|
43
|
+
#
|
44
|
+
# message : the message to be displayed
|
45
|
+
#
|
46
|
+
def self.status_ok(message = '')
|
47
|
+
status_message(SUCCESS_MESSAGE, message)
|
48
|
+
end
|
49
|
+
|
50
|
+
#############################################################################
|
51
|
+
# Construct the status message when an error occurred
|
52
|
+
#
|
53
|
+
# message : the message to be displayed
|
54
|
+
#
|
55
|
+
def self.status_error(message)
|
56
|
+
status_message(FAILED_MESSAGE, message)
|
57
|
+
end
|
58
|
+
|
59
|
+
#############################################################################
|
60
|
+
# Echo a value to a file
|
61
|
+
#
|
62
|
+
# value : the value to echo to the file
|
63
|
+
# file : the file to echo the value too
|
64
|
+
#
|
65
|
+
def self.echo(value, file)
|
66
|
+
begin
|
67
|
+
File.write(file, value)
|
68
|
+
rescue Errno::EINVAL
|
69
|
+
# close always error on the udoo gpios - cause unknown
|
70
|
+
rescue Exception => e
|
71
|
+
return e.message
|
72
|
+
end
|
73
|
+
''
|
74
|
+
end
|
75
|
+
|
76
|
+
#############################################################################
|
77
|
+
# Cat a file
|
78
|
+
#
|
79
|
+
# file : the file to cat
|
80
|
+
#
|
81
|
+
def self.cat(file)
|
82
|
+
File.read(file).chomp
|
83
|
+
end
|
84
|
+
|
85
|
+
#############################################################################
|
86
|
+
# Calculate the Barometer/Temp value from raw and scale values
|
87
|
+
#
|
88
|
+
def self.sensor_calc(sensor)
|
89
|
+
raw = UdooNeoRest::Base.cat(UdooNeoRest::Base.sensor_path(sensor) + '_raw').to_i
|
90
|
+
scale = UdooNeoRest::Base.cat(UdooNeoRest::Base.sensor_path(sensor) + '_scale').to_f
|
91
|
+
UdooNeoRest::Base.status_ok(raw * scale)
|
92
|
+
end
|
93
|
+
|
94
|
+
#############################################################################
|
95
|
+
# Build the path to common sensors
|
96
|
+
#
|
97
|
+
# sensor : the sensor name
|
98
|
+
#
|
99
|
+
def self.sensor_path(sensor)
|
100
|
+
"/sys/class/i2c-dev/i2c-1/device/1-0060/iio:device0/in_#{sensor}"
|
101
|
+
end
|
102
|
+
|
103
|
+
#############################################################################
|
104
|
+
# Build the path to common axis sensors
|
105
|
+
#
|
106
|
+
# sensor : the sensor name
|
107
|
+
#
|
108
|
+
def self.axis_path(sensor)
|
109
|
+
"/sys/class/misc/Freescale#{sensor}"
|
110
|
+
end
|
111
|
+
|
112
|
+
#############################################################################
|
113
|
+
# Build the path to common axis sensors to enable/disable
|
114
|
+
#
|
115
|
+
# sensor : the sensor name
|
116
|
+
#
|
117
|
+
def self.axis_path_enable(sensor)
|
118
|
+
UdooNeoRest::Base.axis_path(sensor) + '/enable'
|
119
|
+
end
|
120
|
+
|
121
|
+
#############################################################################
|
122
|
+
# Build the path to common axis sensors to retrieve data
|
123
|
+
#
|
124
|
+
# sensor : the sensor name
|
125
|
+
#
|
126
|
+
def self.axis_path_data(sensor)
|
127
|
+
UdooNeoRest::Base.axis_path(sensor) + '/data'
|
128
|
+
end
|
129
|
+
|
130
|
+
#############################################################################
|
131
|
+
# Cat a file contents and return the status
|
132
|
+
#
|
133
|
+
# file : the file to cat
|
134
|
+
#
|
135
|
+
def self.cat_and_status(file)
|
136
|
+
UdooNeoRest::Base.status_ok(UdooNeoRest::Base.cat file)
|
137
|
+
end
|
138
|
+
|
139
|
+
#############################################################################
|
140
|
+
# Enable or disable one of the axis sensors
|
141
|
+
#
|
142
|
+
# Value : 0 disables the axis, 1 enables it
|
143
|
+
#
|
144
|
+
def self.change_state(file, value)
|
145
|
+
result = UdooNeoRest::Base.echo value, file
|
146
|
+
result.empty? ? UdooNeoRest::Base.status_ok : UdooNeoRest::Base.status_error(result)
|
147
|
+
end
|
148
|
+
|
149
|
+
#############################################################################
|
150
|
+
# Import all the Sinatra routes
|
151
|
+
#
|
152
|
+
use UdooNeoRest::Value
|
153
|
+
use UdooNeoRest::Accelerometer
|
154
|
+
use UdooNeoRest::Barometer
|
155
|
+
use UdooNeoRest::Gyroscope
|
156
|
+
use UdooNeoRest::Magnetometer
|
157
|
+
use UdooNeoRest::Temperature
|
158
|
+
use UdooNeoRest::Export
|
159
|
+
use UdooNeoRest::Direction
|
160
|
+
|
161
|
+
#############################################################################
|
162
|
+
# Show the help documentation
|
163
|
+
#
|
164
|
+
get '/help' do
|
165
|
+
UdooNeoRest::Base.status_ok("Help documentation can be found here: #{HELP_URL}")
|
166
|
+
end
|
167
|
+
|
168
|
+
#############################################################################
|
169
|
+
# Default route to catch incorrect API calls
|
170
|
+
#
|
171
|
+
not_found do
|
172
|
+
UdooNeoRest::Base.status_error("This API call is not know. Please refer to the documentation #{HELP_URL}")
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
UdooNeoRest::Base.run!
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Accelerometer < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
put '/accelerometer/enable' do
|
9
|
+
enable '1'
|
10
|
+
end
|
11
|
+
|
12
|
+
put '/accelerometer/disable' do
|
13
|
+
enable '0'
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/accelerometer/value' do
|
17
|
+
data
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/lazyrest/accelerometer/enable' do
|
21
|
+
enable '1'
|
22
|
+
end
|
23
|
+
|
24
|
+
get '/lazyrest/accelerometer/disable' do
|
25
|
+
enable '0'
|
26
|
+
end
|
27
|
+
|
28
|
+
get '/lazyrest/accelerometer/value' do
|
29
|
+
data
|
30
|
+
end
|
31
|
+
|
32
|
+
#############################################################################
|
33
|
+
# Enable/Disable the Accelerometer
|
34
|
+
#
|
35
|
+
# value : 0 = Disable, 1 = Enable
|
36
|
+
#
|
37
|
+
def enable(value)
|
38
|
+
UdooNeoRest::Base.change_state UdooNeoRest::Base.axis_path_enable('Accelerometer'), value
|
39
|
+
end
|
40
|
+
|
41
|
+
#############################################################################
|
42
|
+
# Get the value for the Accelerometer
|
43
|
+
#
|
44
|
+
def data
|
45
|
+
UdooNeoRest::Base.cat_and_status UdooNeoRest::Base.axis_path_data('Accelerometer')
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Barometer < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
get '/barometer/value' do
|
9
|
+
UdooNeoRest::Base.sensor_calc 'pressure'
|
10
|
+
end
|
11
|
+
|
12
|
+
get '/lazyrest/barometer/value' do
|
13
|
+
UdooNeoRest::Base.sensor_calc 'pressure'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Direction < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
put '/gpio/:gpio/direction/:direction' do
|
9
|
+
direction_set_gpio params[:gpio], params[:direction]
|
10
|
+
end
|
11
|
+
|
12
|
+
put '/pin/:pin/direction/:direction' do
|
13
|
+
direction_set_pin params[:pin], params[:direction]
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/gpio/:gpio/direction' do
|
17
|
+
direction_get_gpio params[:gpio]
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/pin/:pin/direction' do
|
21
|
+
direction_get_pin params[:pin]
|
22
|
+
end
|
23
|
+
|
24
|
+
get '/lazyrest/gpio/:gpio/direction/:direction' do
|
25
|
+
direction_set_gpio params[:gpio], params[:direction]
|
26
|
+
end
|
27
|
+
|
28
|
+
get '/lazyrest/pin/:pin/direction/:direction' do
|
29
|
+
direction_set_pin params[:pin], params[:direction]
|
30
|
+
end
|
31
|
+
|
32
|
+
get '/lazyrest/gpio/:gpio/direction' do
|
33
|
+
direction_get_gpio params[:gpio]
|
34
|
+
end
|
35
|
+
|
36
|
+
get '/lazyrest/pin/:pin/direction' do
|
37
|
+
direction_get_pin params[:pin]
|
38
|
+
end
|
39
|
+
|
40
|
+
#############################################################################
|
41
|
+
# Get the value for a specific pin
|
42
|
+
#
|
43
|
+
# pin : the pin to be set (will be translated to GPIO)
|
44
|
+
#
|
45
|
+
def direction_get_pin(pin)
|
46
|
+
|
47
|
+
# Validate the pin
|
48
|
+
pin_ = ValidatePin.new pin
|
49
|
+
return pin_.error_message unless pin_.valid?
|
50
|
+
|
51
|
+
# Get the value after translating to gpio
|
52
|
+
direction_get_gpio pin_.to_gpio
|
53
|
+
end
|
54
|
+
|
55
|
+
#############################################################################
|
56
|
+
# Get the direction for a specific gpio
|
57
|
+
#
|
58
|
+
# gpio : the gpio to get
|
59
|
+
#
|
60
|
+
def direction_get_gpio(gpio)
|
61
|
+
|
62
|
+
# validate the gpio
|
63
|
+
gpio_ = ValidateGpio.new gpio
|
64
|
+
return gpio_.error_message unless gpio_.valid?
|
65
|
+
|
66
|
+
# get the direction
|
67
|
+
UdooNeoRest::Base.status_ok(UdooNeoRest::Base.cat "#{BASE_PATH}gpio#{gpio}/direction")
|
68
|
+
end
|
69
|
+
|
70
|
+
#############################################################################
|
71
|
+
# Set a specific pin to the nominated direction
|
72
|
+
#
|
73
|
+
# pin : the pin to be set (will be translated to GPIO)
|
74
|
+
# direction : the direction to be used
|
75
|
+
#
|
76
|
+
def direction_set_pin(pin, direction)
|
77
|
+
|
78
|
+
# valide the pin
|
79
|
+
pin_ = ValidatePin.new pin
|
80
|
+
return pin_.error_message unless pin_.valid?
|
81
|
+
|
82
|
+
# Set the direction after translating to gpio
|
83
|
+
direction_set_gpio pin_.to_gpio, direction
|
84
|
+
end
|
85
|
+
|
86
|
+
#############################################################################
|
87
|
+
# Set a specific gpio to the nominated direction
|
88
|
+
#
|
89
|
+
# gpio : the gpio to be set
|
90
|
+
# direction : the direction to be used
|
91
|
+
#
|
92
|
+
def direction_set_gpio(gpio, direction)
|
93
|
+
|
94
|
+
# validate the gpio
|
95
|
+
gpio_ = ValidateGpio.new gpio
|
96
|
+
return gpio_.error_message unless gpio_.valid?
|
97
|
+
|
98
|
+
# validate the direction
|
99
|
+
direction_ = ValidateDirection.new direction
|
100
|
+
return direction_.error_message unless direction_.valid?
|
101
|
+
|
102
|
+
# Send the command and if no error return an OK result else return the error
|
103
|
+
result = UdooNeoRest::Base.echo direction, "#{BASE_PATH}gpio#{gpio}/direction"
|
104
|
+
result.empty? ? UdooNeoRest::Base.status_ok : UdooNeoRest::Base.status_error(result)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Export < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
post '/gpio/:gpio/export' do
|
9
|
+
export_gpio params[:gpio]
|
10
|
+
end
|
11
|
+
|
12
|
+
post '/pin/:pin/export' do
|
13
|
+
export_pin params[:pin]
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/lazyrest/gpio/:gpio/export' do
|
17
|
+
export_gpio params[:gpio]
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/lazyrest/pin/:pin/export' do
|
21
|
+
export_pin params[:pin]
|
22
|
+
end
|
23
|
+
|
24
|
+
#############################################################################
|
25
|
+
# Export using the pin
|
26
|
+
#
|
27
|
+
# pin : the pin to be exported
|
28
|
+
#
|
29
|
+
def export_pin(pin)
|
30
|
+
|
31
|
+
# Validate the pin
|
32
|
+
pin_ = ValidatePin.new pin
|
33
|
+
return pin_.error_message unless pin_.valid?
|
34
|
+
|
35
|
+
# Export the value after translating to gpio
|
36
|
+
export_gpio pin_.to_gpio
|
37
|
+
end
|
38
|
+
|
39
|
+
#############################################################################
|
40
|
+
# Export using the gpio
|
41
|
+
#
|
42
|
+
# gpio : the gpio to be exported
|
43
|
+
#
|
44
|
+
def export_gpio(gpio)
|
45
|
+
|
46
|
+
# lets make sure the gpio is good
|
47
|
+
gpio_ = ValidateGpio.new gpio
|
48
|
+
return gpio_.error_message unless gpio_.valid?
|
49
|
+
|
50
|
+
# send the command
|
51
|
+
result = UdooNeoRest::Base.echo gpio, "#{BASE_PATH}export"
|
52
|
+
|
53
|
+
# return ok if all is well
|
54
|
+
return UdooNeoRest::Base.status_ok if result.empty?
|
55
|
+
|
56
|
+
# provide some constructive feedback on the root cause of this specific error
|
57
|
+
if result =~ /resource busy/
|
58
|
+
return UdooNeoRest::Base.status_error('Resource Busy error occurred. Maybe the gpio has already been exported. It only needs to be exported once.')
|
59
|
+
end
|
60
|
+
|
61
|
+
# otherwise just return the error
|
62
|
+
UdooNeoRest::Base.status_error(result)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Gyroscope < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
put '/gyroscope/enable' do
|
9
|
+
enable '1'
|
10
|
+
end
|
11
|
+
|
12
|
+
put '/gyroscope/disable' do
|
13
|
+
enable '0'
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/gyroscope/value' do
|
17
|
+
data
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/lazyrest/gyroscope/enable' do
|
21
|
+
enable '1'
|
22
|
+
end
|
23
|
+
|
24
|
+
get '/lazyrest/gyroscope/disable' do
|
25
|
+
enable '0'
|
26
|
+
end
|
27
|
+
|
28
|
+
get '/lazyrest/gyroscope/value' do
|
29
|
+
data
|
30
|
+
end
|
31
|
+
|
32
|
+
#############################################################################
|
33
|
+
# Enable/Disable the Gyroscope
|
34
|
+
#
|
35
|
+
# value : 0 = Disable, 1 = Enable
|
36
|
+
#
|
37
|
+
def enable(value)
|
38
|
+
UdooNeoRest::Base.change_state UdooNeoRest::Base.axis_path_enable('Gyroscope'), value
|
39
|
+
end
|
40
|
+
|
41
|
+
#############################################################################
|
42
|
+
# Get the value for the Gyroscope
|
43
|
+
#
|
44
|
+
def data
|
45
|
+
UdooNeoRest::Base.cat_and_status UdooNeoRest::Base.axis_path_data('Gyroscope')
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Magnetometer < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
put '/magnetometer/enable' do
|
9
|
+
enable '1'
|
10
|
+
end
|
11
|
+
|
12
|
+
put '/magnetometer/disable' do
|
13
|
+
enable '0'
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/magnetometer/value' do
|
17
|
+
data
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/lazyrest/magnetometer/enable' do
|
21
|
+
enable '1'
|
22
|
+
end
|
23
|
+
|
24
|
+
get '/lazyrest/magnetometer/disable' do
|
25
|
+
enable '0'
|
26
|
+
end
|
27
|
+
|
28
|
+
get '/lazyrest/magnetometer/value' do
|
29
|
+
data
|
30
|
+
end
|
31
|
+
|
32
|
+
#############################################################################
|
33
|
+
# Enable/Disable the magnetometer
|
34
|
+
#
|
35
|
+
# value : 0 = Disable, 1 = Enable
|
36
|
+
#
|
37
|
+
def enable(value)
|
38
|
+
UdooNeoRest::Base.change_state UdooNeoRest::Base.axis_path_enable('Magnetometer'), value
|
39
|
+
end
|
40
|
+
|
41
|
+
#############################################################################
|
42
|
+
# Get the value for the magnetometer
|
43
|
+
#
|
44
|
+
def data
|
45
|
+
UdooNeoRest::Base.cat_and_status UdooNeoRest::Base.axis_path_data('Magnetometer')
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Temperature < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
get '/temperature/value' do
|
9
|
+
UdooNeoRest::Base.sensor_calc 'temp'
|
10
|
+
end
|
11
|
+
|
12
|
+
get '/lazyrest/temperature/value' do
|
13
|
+
UdooNeoRest::Base.sensor_calc 'temp'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
# Base validation class. Override the valid? method
|
5
|
+
#
|
6
|
+
# value : the value to be validated
|
7
|
+
#
|
8
|
+
class Validate
|
9
|
+
|
10
|
+
attr_reader :error_message
|
11
|
+
attr_accessor :value
|
12
|
+
|
13
|
+
def initialize(value)
|
14
|
+
@value = value
|
15
|
+
@error_message = nil
|
16
|
+
valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid?
|
20
|
+
raise 'SubclassShouldOverrideValid'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
#############################################################################
|
26
|
+
# Validate the Direction parameter
|
27
|
+
#
|
28
|
+
# value : the direction value to be validated
|
29
|
+
#
|
30
|
+
class ValidateDirection < Validate
|
31
|
+
|
32
|
+
def valid?
|
33
|
+
if (@value != DIRECTION_IN ) && (@value != DIRECTION_OUT)
|
34
|
+
@error_message = UdooNeoRest::Base.status_error("Direction value of '#{@value}' is invalid. Should only be 'in' or 'out'.")
|
35
|
+
return false
|
36
|
+
end
|
37
|
+
|
38
|
+
@error_message = nil
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
#############################################################################
|
45
|
+
# Validate the GPIO parameter
|
46
|
+
#
|
47
|
+
# value : the gpio value to be validated
|
48
|
+
#
|
49
|
+
class ValidateGpio < Validate
|
50
|
+
|
51
|
+
def valid?
|
52
|
+
unless GPIOS.include?(@value)
|
53
|
+
@error_message = UdooNeoRest::Base.status_error("GPIO value of '#{@value}' is invalid. Should be one of #{GPIOS.sort.join(',')}.")
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
|
57
|
+
@error_message = nil
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
#############################################################################
|
64
|
+
# Validate the Value parameter
|
65
|
+
#
|
66
|
+
# value : the value to be validated
|
67
|
+
#
|
68
|
+
class ValidateValue < Validate
|
69
|
+
|
70
|
+
def valid?
|
71
|
+
if (@value != VALUE_LOW ) && (@value != VALUE_HIGH)
|
72
|
+
@error_message = UdooNeoRest::Base.status_error("Value of '#{@value}' is invalid. Should be one of #{VALUE_LOW} or #{VALUE_HIGH}.")
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
|
76
|
+
@error_message = nil
|
77
|
+
true
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
#############################################################################
|
83
|
+
# Validate the Pin parameter
|
84
|
+
#
|
85
|
+
# value : the pin value to be validated
|
86
|
+
#
|
87
|
+
class ValidatePin < Validate
|
88
|
+
|
89
|
+
def initialize(value)
|
90
|
+
@value = value.to_i
|
91
|
+
@error_message = nil
|
92
|
+
valid?
|
93
|
+
end
|
94
|
+
|
95
|
+
def valid?
|
96
|
+
if (16 > @value || @value > 47)
|
97
|
+
@error_message = UdooNeoRest::Base.status_error("Pin value of '#{@value}' is invalid. Should be between >=16 and <=47.")
|
98
|
+
return false
|
99
|
+
end
|
100
|
+
|
101
|
+
@error_message = nil
|
102
|
+
true
|
103
|
+
end
|
104
|
+
|
105
|
+
###########################################################################
|
106
|
+
# Convert a PIN reference to a GPIO reference as all the commands use GPIO
|
107
|
+
#
|
108
|
+
def to_gpio
|
109
|
+
return nil unless valid?
|
110
|
+
GPIOS[@value-16]
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
@@ -0,0 +1,117 @@
|
|
1
|
+
module UdooNeoRest
|
2
|
+
|
3
|
+
class Value < Sinatra::Application
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
# Routes
|
7
|
+
#
|
8
|
+
put '/gpio/:gpio/value/:value' do
|
9
|
+
value_set_gpio params[:gpio], params[:value]
|
10
|
+
end
|
11
|
+
|
12
|
+
put '/pin/:pin/value/:value' do
|
13
|
+
value_set_pin params[:pin], params[:value]
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/gpio/:gpio/value' do
|
17
|
+
value_get_gpio params[:gpio]
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/pin/:pin/value' do
|
21
|
+
value_get_pin params[:pin]
|
22
|
+
end
|
23
|
+
|
24
|
+
get '/lazyrest/gpio/:gpio/value/:value' do
|
25
|
+
value_set_gpio params[:gpio], params[:value]
|
26
|
+
end
|
27
|
+
|
28
|
+
get '/lazyrest/pin/:pin/value/:value' do
|
29
|
+
value_set_pin params[:pin], params[:value]
|
30
|
+
end
|
31
|
+
|
32
|
+
get '/lazyrest/gpio/:gpio/value' do
|
33
|
+
value_get_gpio params[:gpio]
|
34
|
+
end
|
35
|
+
|
36
|
+
get '/lazyrest/pin/:pin/value' do
|
37
|
+
value_get_pin params[:pin]
|
38
|
+
end
|
39
|
+
|
40
|
+
#############################################################################
|
41
|
+
# Get the value for a specific pin
|
42
|
+
#
|
43
|
+
# pin : the pin to be set (will be translated to GPIO)
|
44
|
+
#
|
45
|
+
def value_get_pin(pin)
|
46
|
+
|
47
|
+
# Validate the pin
|
48
|
+
pin_ = ValidatePin.new pin
|
49
|
+
return pin_.error_message unless pin_.valid?
|
50
|
+
|
51
|
+
# Get the value after translating to gpio
|
52
|
+
value_get_gpio pin_.to_gpio
|
53
|
+
end
|
54
|
+
|
55
|
+
#############################################################################
|
56
|
+
# Get the value for a specific gpio
|
57
|
+
#
|
58
|
+
# gpio : the gpio to get
|
59
|
+
#
|
60
|
+
def value_get_gpio(gpio)
|
61
|
+
|
62
|
+
# Validate the gpio
|
63
|
+
gpio_ = ValidateGpio.new gpio
|
64
|
+
return gpio_.error_message unless gpio_.valid?
|
65
|
+
|
66
|
+
# Get the value
|
67
|
+
UdooNeoRest::Base.status_ok(UdooNeoRest::Base.cat "#{BASE_PATH}gpio#{gpio}/value")
|
68
|
+
end
|
69
|
+
|
70
|
+
#############################################################################
|
71
|
+
# Set a specific pin to the nominated value
|
72
|
+
#
|
73
|
+
# pin : the pin to be set (will be translated to GPIO)
|
74
|
+
# value : the value to be used
|
75
|
+
#
|
76
|
+
def value_set_pin(pin, value)
|
77
|
+
|
78
|
+
# Validate the pin
|
79
|
+
pin_ = ValidatePin.new pin
|
80
|
+
return pin_.error_message unless pin_.valid?
|
81
|
+
|
82
|
+
# Set the value after translating to gpio
|
83
|
+
value_set_gpio pin_.to_gpio, value
|
84
|
+
end
|
85
|
+
|
86
|
+
#############################################################################
|
87
|
+
# Set a specific gpio to the nominated value
|
88
|
+
#
|
89
|
+
# gpio : the gpio to be set
|
90
|
+
# value : the value to be used
|
91
|
+
#
|
92
|
+
def value_set_gpio(gpio, value)
|
93
|
+
|
94
|
+
# Validate the gpio
|
95
|
+
gpio_ = ValidateGpio.new gpio
|
96
|
+
return gpio_.error_message unless gpio_.valid?
|
97
|
+
|
98
|
+
# Validate the value
|
99
|
+
value = ValidateValue.new value
|
100
|
+
return value.error_message unless value.valid?
|
101
|
+
|
102
|
+
# Send the command and if no error return an OK result
|
103
|
+
result = UdooNeoRest::Base.echo value, "#{BASE_PATH}gpio#{gpio}/value"
|
104
|
+
return UdooNeoRest::Base.status_ok if result.empty?
|
105
|
+
|
106
|
+
# Check for a common error and provide some advice
|
107
|
+
if result =~ /not permitted/
|
108
|
+
return UdooNeoRest::Base.status_error('Operation not permitted error occurred. Has the gpio been set to output mode?')
|
109
|
+
end
|
110
|
+
|
111
|
+
# Otherwise just return the error
|
112
|
+
UdooNeoRest::Base.status_error result
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: udooneorest
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark Sullivan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sinatra
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Rest API for interacting with UDOO Neo GPIOs, motion sensors and brick
|
28
|
+
sensors
|
29
|
+
email: mark@sullivans.id.au
|
30
|
+
executables:
|
31
|
+
- udooneorest
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- Gemfile
|
36
|
+
- bin/udooneorest
|
37
|
+
- lib/udooneorest.rb
|
38
|
+
- lib/udooneorest/accelerometer.rb
|
39
|
+
- lib/udooneorest/barometer.rb
|
40
|
+
- lib/udooneorest/direction.rb
|
41
|
+
- lib/udooneorest/export.rb
|
42
|
+
- lib/udooneorest/gyroscope.rb
|
43
|
+
- lib/udooneorest/magnetometer.rb
|
44
|
+
- lib/udooneorest/temperature.rb
|
45
|
+
- lib/udooneorest/validators.rb
|
46
|
+
- lib/udooneorest/value.rb
|
47
|
+
homepage: http://rubygems.org/gems/udooneorest
|
48
|
+
licenses:
|
49
|
+
- MIT
|
50
|
+
metadata: {}
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 2.2.2
|
68
|
+
signing_key:
|
69
|
+
specification_version: 4
|
70
|
+
summary: Rest API for interacting with UDOO Neo
|
71
|
+
test_files: []
|