bb8
Version:
Force control Sphero BB8 w/ Xbox controller or Myo armband
107 lines (87 loc) • 2.56 kB
JavaScript
// deps
import { throttle } from 'lodash';
import CONSTANTS from '../../constants';
//
// BB8 COMMANDS
//
export default function (bb8) {
// get device interface
const { device } = bb8;
// due to some sphero limitations,
// it's better to throttle delay and not spam skill BB8 droid
const { BLUETOOTH_THROTTLE_DELAY } = bb8.config;
//
// SET MOVEMENT SPEED
//
bb8.setSpeed = (factor) => {
bb8.speed = factor;
};
//
// STOP
//
bb8.stop = () => {
console.log('[BB8] Stop movement');
device.roll(0, bb8.orientation, 0);
};
//
// MOVE / ROLL
//
bb8.move = (speed = bb8.speed, heading = bb8.orientation, state = 0, callback = null) => {
console.log('[BB8] Move @ ', speed, heading);
// move it
device.roll(speed, heading, state, callback);
// emit movement event
bb8.emit('move', { speed, heading });
};
//
// TURN
//
bb8.turn = (heading) => {
if (bb8.orientation === heading) { return void 0; }
console.log('[BB8] Setting new course @ ', heading);
// @TODO: add device rotation rate/speed fine control
// device.setRotationRate(0-255, cb);
// set new heading
device.roll(0, heading, 0); // turn in place?
};
//
// BOOST
// @TODO
//
// bb8.toggleBoost = (toggle = !bb8.boost) => {
// console.log('boost @ ', toggle);
// device.boost(toggle, (err, data) => {
// if (err) { return void 0; }
//
// // update internal flag
// bb8.boost = toggle;
// });
// };
//
// DRIVE Mode
//
bb8.toggleDriveMode = (mode = !bb8.driveMode) => {
// drive modes
const { DRIVE_MODE } = CONSTANTS.BB8;
const FLAG = mode ? DRIVE_MODE.VECTOR : DRIVE_MODE.NORMAL;
bb8.setPermFlags(FLAG, (err, data) => {
if (err) { return void 0; }
console.log('[BB8] Vector drive @ ', mode);
// update internal flag
bb8.driveMode = mode;
});
};
//
// THROTTLED helpers (till BLE packets spam fix)
// STOP / MOVEMENT / TURN
//
bb8.throttleStop = throttle(() => {
bb8.stop();
}, BLUETOOTH_THROTTLE_DELAY);
bb8.throttleMove = throttle(() => {
bb8.move(bb8.speed, bb8.orientation, () => {});
}, BLUETOOTH_THROTTLE_DELAY);
bb8.throttleTurn = throttle((angle) => {
bb8.turn(angle);
}, BLUETOOTH_THROTTLE_DELAY);
}