Newer
Older
Ruby / 09-21 / tello.rb
@OKUYAMA Daiki OKUYAMA Daiki on 22 Sep 2024 1 KB 2024-09-22 09:35:41
require "socket"

class Tello
  def initialize(host="192.168.10.1", port=8889, bind=9000)
    @udps = UDPSocket.open
    @sockaddr = Socket.pack_sockaddr_in(port, host)
    @udps.bind('0.0.0.0', bind)
    @log = []

    @th = Thread.start do
      loop do
        begin
          sleep(0.1)
          #puts "#   response #{@udps.recv(1518)}"
          @udps.recv(1518)
        rescue StandardError => e
          puts "#   error #{e.message}"
        end
      end
    end
    @t2 = Thread.start do
      @stateudp = UDPSocket.open
      @stateudp.bind('0.0.0.0', 8890)
      loop do
        l = @stateudp.recv(65535)
        @status = l if l && l>""
        sleep 0.1
      end
    end
  end

  def close
    # puts '# close Tello'
    @udps.send('land', 0, @sockaddr)
    Thread.kill(@th)
    Thread.kill(@t2)
    @udps.close
    @stateudp.close
  end

  def send_command(message)
    # puts "# send #{message}"
    @udps.send(message, 0, @sockaddr)
  end
  def getlog
    @log.shift
  end
  def getstatus
    @status
  end
end

if __FILE__ == $0 then
  tello = Tello.new
  tello.send_command('command')
  tello.send_command('takeoff')
  sleep(3)
  tello.send_command('land')
  tello.close
end