tello 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ca4867953dcdcba813f0d05d3733334bff4ed3360906c3e3222232c117a8119
4
- data.tar.gz: 36945de880740202f27d70012d00871e8110c94a1312afbcf81190f000c8341d
3
+ metadata.gz: 5ab973b7f0a89ed6d888a5a24d6a4cd7feb5192e450f626fd65ccd4a7ee94d76
4
+ data.tar.gz: 235b92463fdf1af2521eda73b8d52c418e7b78468aa27b489530e5df541bbe73
5
5
  SHA512:
6
- metadata.gz: 36023abd6a254c66336196be4735e2f34df08703f21f079fcb5c72a827844f76d0608d87d20405fb00801c53e604f27d4ca439c10d92017dbc999b38b4a148cc
7
- data.tar.gz: 3b1b9f4dbe32a9f0d8a1e411b4abd8159969e7cc04328a20dfd3f8555a1b0914ef74db3d9f7fa2214176fb7322cb300b994d77fd837bf7a619830c3caff11ddd
6
+ metadata.gz: 5d76340288cb1a675daeb6ab6006ad77067d601c775a5cdeac8071b62508a47e5b845a94be6c16cbdaa91519a86ad949305856217bebd77110f9bfca91f297e5
7
+ data.tar.gz: 47346e4b18d8e7e5cfd6b78e36e11a9d9796e3c73b5ebd750a09b7c0cf91167de02fe3d9ebeac4482f6a495d450b220d172c0c411412fcf38256ca40ef42b6b2
data/bin/telloedu ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ require 'tello/colorize'
3
+ require 'tello/version'
4
+
5
+ # Check Command-line Arguments #################################################
6
+ $edu = 'EDU'
7
+ usage = "Fly the Tello#{$edu} drone with Ruby!".bold + "\n
8
+ Usage: tello#{$edu.to_s.downcase} <command> <options>
9
+ [-v|--version]
10
+
11
+ Summary of commands and options:
12
+ console Open an interactive Tello console
13
+ --test Start the console in test mode
14
+ server Start the test server
15
+ -v|--version Prints the installed version\n\n"
16
+
17
+ if ARGV.delete '--test' then $tello_testing = true end
18
+
19
+ case ARGV[0]
20
+ when 'console'
21
+ require 'tello/cli/console'
22
+ when 'server'
23
+ require 'tello/cli/server'
24
+ when '-v', '--version'
25
+ puts Tello::VERSION
26
+ else
27
+ puts usage
28
+ end
@@ -7,7 +7,7 @@ else
7
7
  r_module = 'tello'
8
8
  end
9
9
 
10
- puts "Ready to receive Tello commands. Type \"exit\" to quit."
10
+ puts %Q(Ready to receive Tello#{$edu} commands. Type "exit" to quit.)
11
11
 
12
12
  if system('pry -v &>/dev/null')
13
13
  system("pry -r #{r_module}")
@@ -9,7 +9,8 @@ server.bind('localhost', PORT)
9
9
 
10
10
  puts "Starting Tello test server...".bold, "Listening on udp://localhost:#{PORT}"
11
11
 
12
- loop do
12
+ bye = false
13
+ while (not bye) do
13
14
  msg, addr = server.recvfrom(100)
14
15
  puts "#{"==>".green} Received: \"#{msg}\", from #{addr[3]}:#{addr[1]}"
15
16
 
@@ -44,8 +45,9 @@ loop do
44
45
  when 'wifi?'
45
46
  #=> snr
46
47
  res = "90\r\n"
47
- when 'whatever'
48
- res = "unknown command: whatever"
48
+ when 'bye!'
49
+ res = 'good bye!'
50
+ bye = true
49
51
  else
50
52
  #=> 'ok' or 'error'
51
53
  res = 'ok'
data/lib/tello/client.rb CHANGED
@@ -8,13 +8,21 @@ module Tello
8
8
 
9
9
  class << self
10
10
 
11
- # Create a Tello UDP connection
12
- def connect(ssid = nil)
11
+ # Create a UDP connection
12
+ def connect(ssid = nil, ip = nil, bind_port=8890)
13
13
 
14
14
  # Connect to Tello wifi
15
- unless Tello::Wifi.connect(ssid)
16
- puts "#{'Error:'.error} Could not connect to Tello 😢"
17
- return false
15
+ if ssid.to_s.upcase == 'AP'
16
+ unless valid_ipv4?(ip)
17
+ puts "Error: Cannot connect to Tello#{$edu} in AP mode due to invalid IPv4: '#{ip}'"
18
+ return false
19
+ end
20
+ else
21
+ if !Tello::Wifi.connect(ssid)
22
+ puts "Error: Could not connect to Tello#{$edu} 😢"
23
+ return false
24
+ end
25
+ ip = '192.168.10.1'
18
26
  end
19
27
 
20
28
  # If already connected, disconnect
@@ -23,13 +31,16 @@ module Tello
23
31
  disconnect
24
32
  end
25
33
 
34
+ p({ssid: ssid, ip: ip})
35
+
26
36
  # Set IP and port numbers
27
- @ip = Tello.testing ? 'localhost' : '192.168.10.1'
37
+ @ip = (Tello.testing ? 'localhost' : ip)
28
38
  @port = 8889
29
39
 
30
40
  # Create UDP client, bind to a previous source IP and port if availble
31
41
  @client = UDPSocket.new unless @client
32
42
  if @source_ip && @source_port
43
+ p({source_ip: @source_ip, source_port: @source_port})
33
44
  @client.bind(@source_ip, @source_port)
34
45
  end
35
46
 
@@ -41,7 +52,7 @@ module Tello
41
52
  # Create server to get Tello state
42
53
  unless @state_server
43
54
  @state_server = UDPSocket.new
44
- @state_server.bind('0.0.0.0', 8890)
55
+ @state_server.bind('0.0.0.0', bind_port)
45
56
  end
46
57
 
47
58
  # Check to see if test server is up
@@ -50,8 +61,8 @@ module Tello
50
61
  @client.send('command', 0)
51
62
  sleep 0.5
52
63
  unless read_nonblock
53
- puts "\n#{'Error:'.error} Could not find Tello test server.",
54
- "Did you run `tello server` in another terminal window?"
64
+ puts "\n#{'Error:'.error} Could not find Tello#{$edu} test server.",
65
+ "Did you run `tello#{$edu.to_s.downcase} server` in another terminal window?"
55
66
  return false
56
67
  end
57
68
  puts "connected!"
@@ -69,10 +80,10 @@ module Tello
69
80
  begin
70
81
  @client.send('command', 0)
71
82
  rescue Errno::EADDRNOTAVAIL
72
- puts "#{'Error:'.error} No response from Tello! Try reconnecting."
83
+ puts "#{'Error:'.error} No response from Tello#{$edu}! Try reconnecting."
73
84
  @ping.exit
74
85
  end
75
- sleep 15
86
+ sleep(14.5)
76
87
  end
77
88
  end
78
89
 
@@ -85,7 +96,8 @@ module Tello
85
96
  end
86
97
  end
87
98
 
88
- puts "Ready to fly! 🚁"; true
99
+ puts "Ready to fly! 🚁"
100
+ true
89
101
  end
90
102
 
91
103
  # Get Tello connection status
@@ -93,7 +105,7 @@ module Tello
93
105
  if @connected
94
106
  true
95
107
  else
96
- puts "Tello is not yet connected. Run `connect` first."
108
+ puts "Tello#{$edu} is not yet connected. Run `connect` first."
97
109
  false
98
110
  end
99
111
  end
@@ -146,7 +158,11 @@ module Tello
146
158
  if res then res.to_i else res end
147
159
  end
148
160
 
149
- end
161
+ def valid_ipv4?(ip)
162
+ ## May be improved further
163
+ (ip.to_s) =~ /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$/
164
+ end
150
165
 
166
+ end
151
167
  end
152
168
  end
data/lib/tello/dsl.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  # Tello::DSL
2
2
  # Define Tello domain-specific language
3
+ require 'timeout'
3
4
 
4
5
  module Tello
5
6
  module DSL
7
+ TIMEOUT_SEC = 6 # Needs to be tweaked after more testing
6
8
 
7
9
  # Warn Linux and Windows users to manually connect to Wi-Fi, for now
8
10
  unless Tello.os == :macos
@@ -11,8 +13,8 @@ module Tello
11
13
  end
12
14
 
13
15
  # Connect to the drone
14
- def connect
15
- Tello::Client.connect
16
+ def connect(ssid=nil, ip=nil, bind_port=nil)
17
+ Tello::Client.connect(ssid, ip, bind_port)
16
18
  end
17
19
 
18
20
  # Is the drone connected?
@@ -27,7 +29,24 @@ module Tello
27
29
 
28
30
  # Send a native Tello command to the drone
29
31
  def send(s)
30
- Tello::Client.send(s)
32
+ puts s
33
+ begin
34
+ ### WARNING: Ruby Timeout considered harmful (according to Dr. Google)
35
+ Timeout::timeout(TIMEOUT_SEC) { Tello::Client.send(s) }
36
+ rescue
37
+ err = $!.to_s
38
+ puts err unless err == 'execution expired'
39
+ puts "timeout after #{TIMEOUT_SEC} seconds"
40
+ end
41
+ end
42
+
43
+ def ap_mode(ssid, passwd)
44
+ if ssid.to_s.strip.size == 0
45
+ puts 'Cannot set AP mode when SSID is empty'
46
+ return false
47
+ end
48
+ cmd = "ap #{ssid.to_s} #{passwd.to_s}"
49
+ send(cmd)
31
50
  end
32
51
 
33
52
  # Check if value is within the common movement range
@@ -36,14 +55,14 @@ module Tello
36
55
  end
37
56
 
38
57
  # Takeoff and land
39
- [:takeoff, :land].each do |cmd|
58
+ [:takeoff, :land, :streamon, :streamoff].each do |cmd|
40
59
  define_method cmd do
41
60
  Tello::Client.return_bool send("#{cmd.to_s}")
42
61
  end
43
62
  end
44
63
 
45
64
  # Move in a given direction
46
- [:up, :down, :left, :right, :forward, :backward].each do |cmd|
65
+ [:up, :down, :left, :right, :forward, :back].each do |cmd|
47
66
  define_method cmd do |x|
48
67
  if in_move_range? x
49
68
  Tello::Client.return_bool send("#{cmd.to_s} #{x}")
@@ -52,6 +71,8 @@ module Tello
52
71
  end
53
72
  end
54
73
  end
74
+ alias_method :front, :forward
75
+ alias_method :backward, :back
55
76
 
56
77
  # Turn clockwise or counterclockwise
57
78
  [:cw, :ccw].each do |cmd|
@@ -189,6 +210,23 @@ module Tello
189
210
  send('temp?')
190
211
  end
191
212
 
213
+ def sdk
214
+ send('sdk?')
215
+ end
216
+
217
+ def sn
218
+ send('sn?')
219
+ end
220
+
221
+ def bye!
222
+ ## Tell the server to exit gracefully.
223
+ ## Only applicable in test mode.
224
+ if Tello.testing
225
+ send('bye!')
226
+ exit(0) if connected?
227
+ end
228
+ end
229
+
192
230
  # Get Wi-Fi signal-to-noise ratio (SNR); if parameters, set SSID and password
193
231
  def wifi(ssid: nil, pass: nil)
194
232
  if ssid && pass
@@ -198,8 +236,14 @@ module Tello
198
236
  end
199
237
  end
200
238
 
201
- # Stop all motors immediately
239
+ # stop: hovers in the air per Tello SDK 2.0 User Guide
202
240
  def stop
241
+ Tello::Client.return send('stop')
242
+ end
243
+ alias_method :hover, :stop
244
+
245
+ # Halt all motors immediately
246
+ def halt
203
247
  Tello::Client.return_bool send('emergency')
204
248
  end
205
249
 
data/lib/tello/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # version.rb
2
2
 
3
3
  module Tello
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,23 +1,25 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tello
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Black
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-21 00:00:00.000000000 Z
11
+ date: 2021-12-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fly the Tello drone with Ruby!
14
14
  email: tom@blacktm.com
15
15
  executables:
16
16
  - tello
17
+ - telloedu
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
20
  files:
20
21
  - bin/tello
22
+ - bin/telloedu
21
23
  - lib/tello.rb
22
24
  - lib/tello/cli/console.rb
23
25
  - lib/tello/cli/server.rb
@@ -32,7 +34,7 @@ homepage: https://github.com/blacktm/tello
32
34
  licenses:
33
35
  - MIT
34
36
  metadata: {}
35
- post_install_message:
37
+ post_install_message:
36
38
  rdoc_options: []
37
39
  require_paths:
38
40
  - lib
@@ -47,9 +49,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
49
  - !ruby/object:Gem::Version
48
50
  version: '0'
49
51
  requirements: []
50
- rubyforge_project:
51
- rubygems_version: 2.7.8
52
- signing_key:
52
+ rubygems_version: 3.2.32
53
+ signing_key:
53
54
  specification_version: 4
54
55
  summary: Tello
55
56
  test_files: []