olliejs
Version:
A javascript (node.js) API to control Ollie with Noble
394 lines (348 loc) • 11.8 kB
JavaScript
/* jshint node:true */
var packetBuilder = require('../packet-builder').spheroCommandPacketBuilder;
var _createPacket = require('../toolbelt').createPacket;
var DID = 0x02;
var createPacket = function(cid, options) {
return _createPacket(DID, cid, options);
};
exports.setHeading = function(heading, options) {
var packet = createPacket(0x01, options);
packet.DATA = new Buffer(2);
packet.DATA.writeUInt16BE(heading, 0);
var result = packetBuilder(packet);
return result;
};
exports.setStabilization = function(enable, options) {
var packet = createPacket(0x02, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(enable?0x01:0x00, 0);
var result = packetBuilder(packet);
return result;
};
exports.setRotationRate = function(rate, options) {
var packet = createPacket(0x03, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(rate, 0);
var result = packetBuilder(packet);
return result;
};
exports.setApplicationConfigurationBlock = function(data, options) {
var packet = createPacket(0x04, options);
packet.DATA = new Buffer(0x20);
data.copy(packet.DATA);
var result = packetBuilder(packet);
return result;
};
exports.getApplicationConfigurationBlock = function(options) {
var packet = createPacket(0x05, options);
var result = packetBuilder(packet);
return result;
};
exports.getChassisID = function(options) {
var packet = createPacket(0x07, options);
var result = packetBuilder(packet);
return result;
};
exports._setChassisID = function(chassisId, options) {
console.warn('commands.api#_setChassisID() only works in the factory');
var packet = createPacket(0x08, options);
packet.DATA = new Buffer(2);
packet.DATA.writeUInt16BE(chassisId, 0);
var result = packetBuilder(packet);
return result;
};
exports.selfLevel = function(angleLimit, timeout, trueTime, levelOptions, options) {
/*
levelOptions = {
start: {Boolean} // true=start, false=abort
rotate: {Boolean} // Rotate to start heading after leveling
sleep: {Boolean} // true=Sleep after leveling, false=stay awake
controlSystem: {Boolean} // true=leave control system on after leveling, false=turn it off
}
*/
if (typeof(levelOptions) === 'undefined') {
/* I think this is sane:
bit 0 = 1 ; Start the routine
bit 1 = 1 ; Rotate to start heading
bit 2 = 0 ; Stay awake
bit 3 = 1 ; Leave control system on after levelling
*/
levelOptions = {
start:true,
rotate:true,
sleep:false,
controlSystem:true
};
}
angleLimit = angleLimit || 0;
timeout = timeout || 0;
trueTime = trueTime || 0;
var _levelOptions = (levelOptions && 0x01) | (levelOptions.rotate && 0x02) | (levelOptions.sleep && 0x04) | (levelOptions.controlSystem && 0x08);
var packet = createPacket(0x09, options);
packet.DATA = new Buffer(4);
packet.DATA.writeUInt8(_levelOptions, 0);
packet.DATA.writeUInt8(angleLimit, 1);
packet.DATA.writeUInt8(timeout, 2);
packet.DATA.writeUInt8(trueTime, 3);
var result = packetBuilder(packet);
return result;
};
exports.setDataStreaming = function(sensorRateDivisor, frames, mask, packetCount, mask2, options) {
//TODO : Create a mask object somewhere for ease of use
var packet = createPacket(0x11, options);
packet.DATA = new Buffer(mask2 ? 0x0D : 0x09);
packet.DATA.writeUInt16BE(sensorRateDivisor, 0);
packet.DATA.writeUInt16BE(frames, 2);
packet.DATA.writeUInt32BE(mask, 4);
packet.DATA.writeUInt8(packetCount, 8);
if (mask2) {
packet.DATA.writeUInt32BE(mask2, 9);
}
var result = packetBuilder(packet);
return result;
};
exports.configureCollisionDetection = function(method, thresholdX, thresholdY, speedX, speedY, deadTime, options) {
var packet = createPacket(0x12, options);
packet.DATA = new Buffer(0x06);
packet.DATA.writeUInt8(method, 0);
packet.DATA.writeUInt8(thresholdX, 1);
packet.DATA.writeUInt8(thresholdY, 2);
packet.DATA.writeUInt8(speedX, 3);
packet.DATA.writeUInt8(speedY, 4);
packet.DATA.writeUInt8(deadTime, 5);
var result = packetBuilder(packet);
return result;
};
exports.configureLocator = function(flags, x, y, yawTare, options) {
var packet = createPacket(0x13, options);
packet.DATA = new Buffer(7);
packet.DATA.writeUInt8(flags, 0);
packet.DATA.writeUInt16BE(x, 1);
packet.DATA.writeUInt16BE(y, 3);
packet.DATA.writeUInt16BE(yawTare, 5);
var result = packetBuilder(packet);
return result;
};
exports.setAccelerometerRange = function(rangeIndex, options) {
var packet = createPacket(0x14, options);
packet.DATA = new Buffer(0x01);
packet.DATA.writeUInt8(rangeIndex, 0);
var result = packetBuilder(packet);
return result;
};
exports.readLocator = function(options) {
var packet = createPacket(0x15, options);
var result = packetBuilder(packet);
return result;
};
exports.setRGB = function(color, persist, options) {
var packet = createPacket(0x20, options);
packet.DATA = new Buffer([
(color >> 16) & 0xFF,
(color >> 8) & 0xFF,
color & 0xFF,
persist?0x01:0x00
]);
var result = packetBuilder(packet);
return result;
};
exports.setBackLED = function(intensity, options) {
var packet = createPacket(0x21, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(intensity, 0);
var result = packetBuilder(packet);
return result;
};
exports.getRGB = function(options) {
var packet = createPacket(0x22, options);
var result = packetBuilder(packet);
return result;
};
exports.roll = function(speed, heading, state, options) {
var packet = createPacket(0x30, options);
packet.DATA = new Buffer(4);
packet.DATA.writeUInt8(speed, 0);
packet.DATA.writeUInt16BE(heading, 1);
packet.DATA.writeUInt8(state, 3);
var result = packetBuilder(packet);
return result;
};
exports.setBoostWithTime = function(time, heading, options) {
console.warn('commands.api#setBoostWithTime() not currently supported in the Sphero firmware');
var packet = createPacket(0x31, options);
packet.DATA = new Buffer(3);
packet.DATA.writeUInt8(time, 0);
packet.DATA.writeUInt16BE(heading, 1);
var result = packetBuilder(packet);
return result;
};
exports.setRawMotorValues = function(leftMode, leftPower, rightMode, rightPower, options) {
var packet = createPacket(0x33, options);
packet.DATA = new Buffer(4);
packet.DATA.writeUInt8(leftMode, 0);
packet.DATA.writeUInt8(leftPower, 1);
packet.DATA.writeUInt8(rightMode, 2);
packet.DATA.writeUInt8(rightPower, 3);
var result = packetBuilder(packet);
return result;
};
exports.setMotionTimeout = function(time, options) {
var packet = createPacket(0x34, options);
packet.DATA = new Buffer(2);
packet.DATA.writeUInt16BE(time, 0);
var result = packetBuilder(packet);
return result;
};
exports.setPermanentOptionFlags = function(flags, options) {
var packet = createPacket(0x35, options);
packet.DATA = new Buffer(4);
packet.DATA.writeUInt32BE(flags, 0);
var result = packetBuilder(packet);
return result;
};
exports.getPermanentOptionFlags = function(options) {
var packet = createPacket(0x36, options);
var result = packetBuilder(packet);
return result;
};
exports.setTemporaryOptionFlags = function(flags, options) {
var packet = createPacket(0x37, options);
packet.DATA = new Buffer(4);
packet.DATA.writeUInt32BE(flags, 0);
var result = packetBuilder(packet);
return result;
};
exports.getTemporaryOptionFlags = function(options) {
var packet = createPacket(0x38, options);
var result = packetBuilder(packet);
return result;
};
exports.getConfigurationBlock = function(configurationBlockId, options) {
var packet = createPacket(0x40, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(configurationBlockId, 0);
var result = packetBuilder(packet);
return result;
};
exports.setDeviceMode = function(mode, options) {
var packet = createPacket(0x42, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(mode, 0);
var result = packetBuilder(packet);
return result;
};
exports.setConfigurationBlock = function(data, options) {
var packet = createPacket(0x43, options);
packet.DATA = new Buffer(0xFE);
data.copy(packet.DATA);
var result = packetBuilder(packet);
return result;
};
exports.getDeviceMode = function(options) {
var packet = createPacket(0x44, options);
var result = packetBuilder(packet);
return result;
};
exports.runMacro = function(macroId, options) {
var packet = createPacket(0x50, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(macroId, 0);
var result = packetBuilder(packet);
return result;
};
exports.saveTemporaryMacro = function(macro, options) {
if (macro.length > 254) {
throw new Error('Macro length is greater than 254 bytes');
}
var packet = createPacket(0x51, options);
packet.DATA = new Buffer(macro.length);
macro.copy(packet.DATA);
var result = packetBuilder(packet);
return result;
};
exports.saveMacro = function(macro, options) {
if (macro.length > 254) {
throw new Error('Macro length is greater than 254 bytes');
}
var packet = createPacket(0x52, options);
packet.DATA = new Buffer(macro.length);
macro.copy(packet.DATA);
var result = packetBuilder(packet);
return result;
};
exports.reInitializeMacroExecutive = function(options) {
var packet = createPacket(0x54, options);
var result = packetBuilder(packet);
return result;
};
exports.abortMacro = function(options) {
var packet = createPacket(0x55, options);
var result = packetBuilder(packet);
return result;
};
exports.getMacroStatus = function(options) {
var packet = createPacket(0x56, options);
var result = packetBuilder(packet);
return result;
};
exports.setMacroParameter = function(parameter, value, options) {
var packet = createPacket(0x57, options);
packet.DATA = new Buffer(3);
packet.DATA.writeUInt8(parameter, 0);
if (parameter > 0x01) {
packet.DATA.writeUInt8(value, 1);
packet.DATA.writeUInt8(0, 2);
} else {
packet.DATA.writeUInt16BE(value, 1);
}
var result = packetBuilder(packet);
return result;
};
exports.appendMacroChunck = function(macro, options) { // ömer buna ben karısmadım ama bi hata var bunda Chunck yazıo Chunk yerine
if (macro.length > 254) {
throw new Error('Macro length is greater than 254 bytes');
}
var packet = createPacket(0x58, options);
packet.DATA = new Buffer(macro.length);
macro.copy(packet.DATA);
var result = packetBuilder(packet);
return result;
};
exports.eraseOrbBasicStorage = function(area, options) {
var packet = createPacket(0x60, options);
packet.DATA = new Buffer(1);
packet.DATA.writeUInt8(area, 0);
var result = packetBuilder(packet);
return result;
};
exports.appendOrbBasicFragment = function(area, fragment, options) {
if (fragment.length > 253) {
throw new Error('ORB Basic fragment length is greater than 253 bytes');
}
var packet = createPacket(0x61, options);
packet.DATA = new Buffer(fragment.length+1);
packet.DATA.writeUInt8(area, 0);
fragment.copy(packet.DATA, 1);
var result = packetBuilder(packet);
return result;
};
exports.executeOrbBasicProgram = function(area, startLine, options) {
var packet = createPacket(0x62, options);
packet.DATA = new Buffer(3);
packet.DATA.writeUInt8(area, 0);
packet.DATA.writeUInt16BE(startLine, 1);
var result = packetBuilder(packet);
return result;
};
exports.abortOrbBasicProgram = function(options) {
var packet = createPacket(0x63, options);
var result = packetBuilder(packet);
return result;
};
exports.submitValueToInputStatement = function(value, options) {
var packet = createPacket(0x64, options);
packet.DATA = new Buffer(4);
packet.DATA.writeInt32BE(value, 0);
var result = packetBuilder(packet);
return result;
};