node-red-contrib-parrot-drones
Version:
A node that can be used in Node-Red to control Parrot drones
406 lines (366 loc) • 13.6 kB
JavaScript
var instance;
JumpingDroneClient.getInstance = function (settings, node) {
if (!instance) {
instance = new JumpingDroneClient(settings, node);
}
return instance;
};
function JumpingDroneClient(settings) {
var opts = {};
var self = this;
opts.ip = settings.ip;
var jumpingDrone = require('node-sumo').createClient(opts);
var jumpingDroneReady = false;
var connectionInProgress = false;
var videoStream = jumpingDrone.getVideoStream();
this.connect = function (callback) {
connectionInProgress = true;
jumpingDrone.connect(function (err) {
if (err) {
if (typeof callback === "function") {
callback(err);
}
connectionInProgress = false;
} else {
jumpingDrone.on("ready", function () {
jumpingDroneReady = true;
connectionInProgress = false;
jumpingDrone.forward(10);
jumpingDrone.videoStreaming();
if (typeof callback === "function") {
callback();
}
});
}
});
};
this.disconnect = function () {
jumpingDroneReady = false;
connectionInProgress = false;
jumpingDrone.disconnect();
};
this.isReady = function () {
return jumpingDroneReady;
};
this.isConnectionInProgress = function () {
return connectionInProgress;
};
this.handleDroneCommands = function (msg, node) {
var command = msg.command;
if (command) {
if (self.isReady()) {
switch (command) {
case 'forward':
{
if (msg.payload.speed && !isNaN(msg.payload.speed)) {
jumpingDrone.forward(msg.payload.speed);
} else {
node.error("msg.payload.speed isn't defined");
}
break;
}
case 'backward':
{
if (msg.payload.speed && !isNaN(msg.payload.speed)) {
jumpingDrone.backward(msg.payload.speed);
} else {
node.error("msg.payload.speed isn't defined");
}
break;
}
case 'right':
{
if (msg.payload.speed && !isNaN(msg.payload.speed)) {
jumpingDrone.right(msg.payload.speed);
} else {
node.error("msg.payload.speed isn't defined");
}
break;
}
case 'left':
{
if (msg.payload.speed && !isNaN(msg.payload.speed)) {
jumpingDrone.left(msg.payload.speed);
} else {
node.error("msg.payload.speed isn't defined");
}
break;
}
case 'stop':
{
jumpingDrone.stop();
break;
}
case 'posture-kicker':
{
jumpingDrone.postureKicker();
break;
}
case 'posture-jumper':
{
jumpingDrone.postureJumper();
break;
}
case 'posture-standing':
{
jumpingDrone.postureStanding();
break;
}
case 'animation-slalom':
{
jumpingDrone.animationsSlalom();
break;
}
case 'animation-spiral':
{
jumpingDrone.animationsSpiral();
break;
}
case 'animation-spin-to-posture':
{
jumpingDrone.animationsSpinToPosture();
break;
}
case 'animation-spin-jump':
{
jumpingDrone.animationsSpinJump();
break;
}
case 'animation-ondulation':
{
jumpingDrone.animationsOndulation();
break;
}
case 'animation-metronome':
{
jumpingDrone.animationsMetronome();
break;
}
case 'animation-slow-shake':
{
jumpingDrone.animationsSlowShake();
break;
}
case 'animation-tap':
{
jumpingDrone.animationsTap();
break;
}
case 'animation-spin':
{
jumpingDrone.animationsSpin();
break;
}
case 'animation-stop':
{
jumpingDrone.animationsStop();
break;
}
case 'animation-long-jump-kicker':
{
jumpingDrone.postureKicker();
jumpingDrone.on("postureKicker", function () {
setTimeout(function () {
jumpingDrone.stop();
jumpingDrone.animationsLongJump();
}, 5000);
});
break;
}
case 'animation-long-jump-jumper':
{
jumpingDrone.postureJumper();
jumpingDrone.on("postureJumper", function () {
setTimeout(function () {
jumpingDrone.stop();
jumpingDrone.animationsLongJump();
}, 5000);
});
break;
}
case 'animation-high-jump':
{
jumpingDrone.postureJumper();
jumpingDrone.on("postureJumper", function () {
setTimeout(function () {
jumpingDrone.stop();
jumpingDrone.animationsHighJump();
}, 5000);
});
break;
}
case 'take-picture':
{
jumpingDrone.takePicture();
break;
}
case 'get-video-stream':
{
videoStream.on("data", function (data) {
var object = {};
node.log("frame received");
object.payload = {};
object.payload.video = data;
node.send(object);
});
break;
}
default:
{
node.error("command isn't recognized");
break;
}
}
} else {
node.error("Jumping drone still not connected");
}
} else {
node.error("msg.command isn't defined");
}
};
this.handleDroneData = function (node) {
jumpingDrone.on("battery", function (battery) {
var object = {};
object.topic = "batteryPercentage";
object.payload = {};
object.payload.batteryPercentage = battery;
node.send(object);
});
jumpingDrone.on("batteryCritical", function () {
var object = {};
object.topic = "batteryStatus";
object.payload = {};
object.payload.batteryStatus = "critical";
node.send(object);
});
jumpingDrone.on("batteryLow", function () {
var object = {};
object.topic = "batteryStatus";
object.payload = {};
object.payload.batteryStatus = "low";
node.send(object);
});
jumpingDrone.on("ready", function () {
var object = {};
object.topic = "status";
object.payload = {};
object.payload.status = "ready";
node.send(object);
});
jumpingDrone.on("postureStanding", function () {
var object = {};
object.topic = "posture";
object.payload = {};
object.payload.posture = "standing";
node.send(object);
});
jumpingDrone.on("postureJumper", function () {
var object = {};
object.topic = "posture";
object.payload = {};
object.payload.posture = "jumper";
node.send(object);
});
jumpingDrone.on("postureKicker", function () {
var object = {};
object.topic = "posture";
object.payload = {};
object.payload.posture = "kicker";
node.send(object);
});
jumpingDrone.on("postureStuck", function () {
var object = {};
object.topic = "posture";
object.payload = {};
object.payload.posture = "stuck";
node.send(object);
});
jumpingDrone.on("postureUnknown", function () {
var object = {};
object.topic = "posture";
object.payload = {};
object.payload.posture = "unknown";
node.send(object);
});
jumpingDrone.on("jumpLoadUnknown", function () {
var object = {};
object.topic = "jumpLoad";
object.payload = {};
object.payload.jumpLoad = "unknown";
node.send(object);
});
jumpingDrone.on("jumpLoadUnloaded", function () {
var object = {};
object.topic = "jumpLoad";
object.payload = {};
object.payload.jumpLoad = "unloaded";
node.send(object);
});
jumpingDrone.on("jumpLoadLoaded", function () {
var object = {};
object.topic = "jumpLoad";
object.payload = {};
object.payload.jumpLoad = "loaded";
node.send(object);
});
jumpingDrone.on("jumpLoadBusy", function () {
var object = {};
object.topic = "jumpLoad";
object.payload = {};
object.payload.jumpLoad = "busy";
node.send(object);
});
jumpingDrone.on("jumpLoadLowBatteryUnloaded", function () {
var object = {};
object.topic = "jumpLoad";
object.payload = {};
object.payload.jumpLoad = "unloaded and no jump due to battery Low";
node.send(object);
});
jumpingDrone.on("jumpLoadLowBatteryLoaded", function () {
var object = {};
object.topic = "jumpLoad";
object.payload = {};
object.payload.jumpLoad = "loaded and no jump due to battery Low";
node.send(object);
});
jumpingDrone.on("jumpMotorOK", function () {
var object = {};
object.topic = "jumpMotor";
object.payload = {};
object.payload.jumpMotor = "ok";
node.send(object);
});
jumpingDrone.on("jumpMotorErrorBlocked", function () {
var object = {};
object.topic = "jumpMotor";
object.payload = {};
object.payload.jumpMotor = "blocked";
node.send(object);
});
jumpingDrone.on("jumpMotorErrorOverheated", function () {
var object = {};
object.topic = "jumpMotor";
object.payload = {};
object.payload.jumpMotor = "overheated";
node.send(object);
});
jumpingDrone.on("internalPicture", function () {
var object = {};
object.topic = "message";
object.payload = {};
object.payload.message = "image taken and stored internally";
node.send(object);
});
jumpingDrone.on("video", function (videoFrame) {
var object = {};
node.log("frame received");
object.topic = "message";
object.payload = {};
object.payload.message = "video frame received.";
object.payload.buf = videoFrame;
node.send(object);
});
}
}
module.exports = JumpingDroneClient;