-
Notifications
You must be signed in to change notification settings - Fork 0
/
drone.js
76 lines (65 loc) · 2.57 KB
/
drone.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import ArDrone from "ar-drone"
import { log } from "./debug"
export default function createDrone(options) {
return new Drone(options)
}
class Drone {
constructor(options) {
const drone = this._drone = ArDrone.createClient(options)
drone.config("control:altitude_max", 3000)
}
async close() {
await this.stop()
await this.land()
await this.delay(800)
const drone = this._drone
drone._udpControl.close()
drone._udpNavdatasStream.destroy()
}
command(type, hasCb = false, args = []) {
return new Promise((resolve) => {
const drone = this._drone
const method = drone[type]
if (!hasCb) {
log(`Dispatch ${type} (no feedback)`)
resolve(method.apply(drone, args))
} else {
log(`Dispatch ${type}`)
const complete = (output) => {
log(`Completed ${type}`)
resolve(output)
}
method.apply(drone, args.concat([complete]))
}
})
}
delay(duration) {
return new Promise((resolve) => setTimeout(resolve, duration))
}
on(...args) {
return this._drone.on(...args)
}
async animate(animation, duration) { return this.command('animate', false, [animation, duration]) }
async animateLeds(animation, hz, duration) { return this.command('animateLeds', false, [animation, hz, duration]) }
async back(speed) { return this.command('back', false, [speed]) }
async battery() { return this._drone.battery() }
async calibrate(deviceNum) { return this.command('calibrate', false, [deviceNum]) }
async clockwise(speed) { return this.command('clockwise', false, [speed]) }
async config(key, value) { return this.command('config', true, [key, value]) }
async counterClockwise(speed) { return this.command('counterClockwise', false, [speed]) }
async createRepl() { return this.command('createRepl') }
async ctrl(mode, other) { return this.command('ctrl', false, [mode, other]) }
async disableEmergency() { return this.command('disableEmergency') }
async down(speed) { return this.command('down', false, [speed]) }
async front(speed) { return this.command('front', false, [speed]) }
async ftrim() { return this.command('ftrim') }
async getPngStream() { return this.command('getPngStream') }
async getVideoStream() { return this.command('getVideoStream') }
async land() { return this.command('land', true) }
async left(speed) { return this.command('left', false, [speed]) }
async resume() { return this.command('resume') }
async right(speed) { return this.command('right', false, [speed]) }
async stop() { return this.command('stop') }
async takeoff() { return this.command('takeoff', true) }
async up(speed) { return this.command('up', false, [speed]) }
}