accel-mma84
Advanced tools
Comparing version 0.2.0 to 0.2.1
260
index.js
@@ -37,3 +37,3 @@ var util = require('util'); | ||
// Interrupt pin for the data ready event | ||
self.dataInterrupt = self.hardware.gpio(2); | ||
self.dataInterrupt = self.hardware.digital[2]; | ||
// Address for i2C | ||
@@ -44,59 +44,64 @@ // TODO: Account for manual address changes? | ||
// Check that we can read the correct chip id | ||
self._getChipID(function IDRead(err, c) { | ||
if (err) { | ||
// Fail the init | ||
return self._failProcedure(err); | ||
} | ||
// should always return 0x2A | ||
if (c !== 0x2A) { | ||
// This is the wrong chip | ||
err = new Error("Could not connect to MMA8452Q, received " + c.toString() + ". Expected 0x2A."); | ||
// Fail the init | ||
return self._failProcedure(err); | ||
} | ||
// Set the scale range to standard | ||
self.setScaleRange(self.scaleRange, function(err) { | ||
self.queue.place(function one() { | ||
self._getChipID(function IDRead(err, c) { | ||
if (err) { | ||
return self._failProcedure(err, callback); | ||
// Fail the init | ||
return self._failProcedure(err); | ||
} | ||
else { | ||
// Set the output rate to standard | ||
self.setOutputRate(self.outputRate, function(err) { | ||
if (err) { | ||
return self._failProcedure(err, callback); | ||
} | ||
else { | ||
// Emit the ready event | ||
setImmediate(function emitReady() { | ||
self.emit('ready'); | ||
}); | ||
// Call the callback with object | ||
if (callback) callback(null, self); | ||
return; | ||
} | ||
}); | ||
// should always return 0x2A | ||
if (c !== 0x2A) { | ||
// This is the wrong chip | ||
err = new Error("Could not connect to MMA8452Q, received " + c.toString() + ". Expected 0x2A."); | ||
// Fail the init | ||
return self._failProcedure(err); | ||
} | ||
}); | ||
// Set up an interrupt handler for data ready | ||
self.dataInterrupt.watch('low', self._dataReady.bind(self)); | ||
// Set the scale range to standard | ||
self.setScaleRange(self.scaleRange, function(err) { | ||
if (err) { | ||
return self._failProcedure(err, callback); | ||
} | ||
else { | ||
// Set the output rate to standard | ||
self.setOutputRate(self.outputRate, function(err) { | ||
if (err) { | ||
return self._failProcedure(err, callback); | ||
} | ||
else { | ||
// Emit the ready event | ||
setImmediate(function emitReady() { | ||
self.emit('ready'); | ||
self.queue.next(); | ||
}); | ||
// Call the callback with object | ||
if (callback) callback(null, self); | ||
self.on('newListener', function(event) { | ||
// If we have a new sample listener | ||
if (event == 'data' || event == 'sample') { | ||
// Enable interrupts at whatever rate was previously set. | ||
self.enableDataInterrupts(true, queueNext); | ||
} | ||
}); | ||
return; | ||
} | ||
}); | ||
} | ||
}); | ||
self.on('removeListener', function(event) { | ||
// If we have a new || event == 'sample' listener | ||
if (event == 'data' || event == 'sample') { | ||
// Disable interrupt. | ||
self.enableDataInterrupts(false, queueNext); | ||
} | ||
// Set up an interrupt handler for data ready | ||
self.dataInterrupt.watch('low', self._dataReady.bind(self)); | ||
}); | ||
}); | ||
self.on('newListener', function(event) { | ||
// If we have a new sample listener | ||
if (event == 'data' || event == 'sample') { | ||
// Enable interrupts at whatever rate was previously set. | ||
self.enableDataInterrupts(true, queueNext); | ||
} | ||
}); | ||
self.on('removeListener', function(event) { | ||
// If we have a new || event == 'sample' listener | ||
if (event == 'data' || event == 'sample') { | ||
// Disable interrupt. | ||
self.enableDataInterrupts(false, queueNext); | ||
} | ||
}); | ||
self.queue.next(); | ||
} | ||
@@ -241,2 +246,79 @@ | ||
// Sets the accelerometer to read up to 2, 4, or 8 Gs of acceleration (smaller range = better precision) | ||
Accelerometer.prototype._unsafeSetScaleRange = function(scaleRange, callback) { | ||
var self = this; | ||
var fsr = scaleRange; | ||
if (fsr > 8) fsr = 8; //Easy error check | ||
fsr >>= 2; // Neat trick, see page 22. 00 = 2G, 01 = 4G, 10 = 8G | ||
// Go into standby to edit registers | ||
self._changeRegister(function change(complete) { | ||
if (err) { | ||
return complete(err); | ||
} | ||
else { | ||
// Write the new scale into the register | ||
self._writeRegister(XYZ_DATA_CFG, fsr, function wroteReg(err) { | ||
self.scaleRange = scaleRange; | ||
return complete(err); | ||
}); | ||
} | ||
}, function scaleSet(err) { | ||
if (callback) { | ||
callback(err); | ||
} | ||
setImmediate(self.queue.next); | ||
}); | ||
} | ||
// Sets the output rate of the data (1.56-800 Hz) | ||
Accelerometer.prototype._unsafeSetOutputRate = function (hz, callback) { | ||
var self = this; | ||
// Put accel into standby | ||
self._changeRegister( function setRegisters(finishChange) { | ||
// Find the closest available rate (rounded down) | ||
self._getClosestOutputRate(hz, function gotRequested(err, closest) { | ||
if (err) { | ||
return finishChange(new Error("Rate must be >= 1.56Hz")); | ||
} | ||
else { | ||
// Set our property | ||
self.outputRate = closest; | ||
// Get the binary representation of the rate (for the register) | ||
var bin = self.availableOutputRates().indexOf(closest); | ||
// If the binary rep could be found | ||
if (bin !== -1) { | ||
// Read the current register value | ||
self._readRegister(CTRL_REG1, function readComplete(err, regVal) { | ||
if (err) { | ||
return finishChange(err); | ||
} | ||
else { | ||
// Clear the three bits of output rate control (0b11000111 = 199) | ||
regVal &= 199; | ||
// Move the binary rep into place (bits 3:5) | ||
if (bin !== 0) regVal |= (bin << 3); | ||
// Write that value into the control register | ||
self._writeRegister(CTRL_REG1, regVal, finishChange); | ||
} | ||
}); | ||
} | ||
else { | ||
return finishChange(new Error("Invalid output rate.")); | ||
} | ||
} | ||
}) | ||
}, | ||
function rateSet(err) { | ||
if (callback) { | ||
callback(err); | ||
} | ||
setImmediate(self.queue.next); | ||
}); | ||
}; | ||
// Logs the available interrupt rates in Hz | ||
@@ -318,80 +400,10 @@ Accelerometer.prototype.availableOutputRates = function() { | ||
// Sets the output rate of the data (1.56-800 Hz) | ||
// Queueing version of Accelerometer#_unsafeSetOutputRate | ||
Accelerometer.prototype.setOutputRate = function (hz, callback) { | ||
var self = this; | ||
// Put accel into standby | ||
self.queue.place(function addedQueue() { | ||
self._changeRegister( function setRegisters(finishChange) { | ||
// Find the closest available rate (rounded down) | ||
self._getClosestOutputRate(hz, function gotRequested(err, closest) { | ||
if (err) { | ||
return finishChange(new Error("Rate must be >= 1.56Hz")); | ||
} | ||
else { | ||
// Set our property | ||
self.outputRate = closest; | ||
// Get the binary representation of the rate (for the register) | ||
var bin = self.availableOutputRates().indexOf(closest); | ||
// If the binary rep could be found | ||
if (bin !== -1) { | ||
// Read the current register value | ||
self._readRegister(CTRL_REG1, function readComplete(err, regVal) { | ||
if (err) { | ||
return finishChange(err); | ||
} | ||
else { | ||
// Clear the three bits of output rate control (0b11000111 = 199) | ||
regVal &= 199; | ||
// Move the binary rep into place (bits 3:5) | ||
if (bin !== 0) regVal |= (bin << 3); | ||
// Write that value into the control register | ||
self._writeRegister(CTRL_REG1, regVal, finishChange); | ||
} | ||
}); | ||
} | ||
else { | ||
return finishChange(new Error("Invalid output rate.")); | ||
} | ||
} | ||
}); | ||
}, | ||
function rateSet(err) { | ||
if (callback) { | ||
callback(err); | ||
} | ||
setImmediate(self.queue.next); | ||
}); | ||
}); | ||
this.queue.place(this._unsafeSetOutputRate.bind(this, hz, callback)); | ||
}; | ||
// Sets the accelerometer to read up to 2, 4, or 8 Gs of acceleration (smaller range = better precision) | ||
// Queueing version of Accelerometer#_unsafeSetScaleRange | ||
Accelerometer.prototype.setScaleRange = function(scaleRange, callback) { | ||
var self = this; | ||
var fsr = scaleRange; | ||
if (fsr > 8) fsr = 8; //Easy error check | ||
fsr >>= 2; // Neat trick, see page 22. 00 = 2G, 01 = 4G, 10 = 8G | ||
// Go into standby to edit registers | ||
self.queue.place( function queueScale() { | ||
self._changeRegister(function change(complete) { | ||
if (err) { | ||
return complete(err); | ||
} | ||
else { | ||
// Write the new scale into the register | ||
self._writeRegister(XYZ_DATA_CFG, fsr, function wroteReg(err) { | ||
self.scaleRange = scaleRange; | ||
return complete(err); | ||
}); | ||
} | ||
}, function scaleSet(err) { | ||
if (callback) { | ||
callback(err); | ||
} | ||
setImmediate(self.queue.next); | ||
}); | ||
}); | ||
this.queue.place(this._unsafeSetScaleRange.bind(this, scaleRange, callback)); | ||
}; | ||
@@ -398,0 +410,0 @@ |
{ | ||
"name": "accel-mma84", | ||
"version": "0.2.0", | ||
"version": "0.2.1", | ||
"description": "Library to run the MMA8452Q accelerometer.", | ||
"main": "index.js", | ||
"dependencies" : { | ||
"sync-queue" : "0.0.1" | ||
"scripts": { | ||
"test": "tinytap -e 'tessel run {} ${ACCEL_PORT}' test/*.js" | ||
}, | ||
"dependencies": { | ||
"sync-queue": "0.0.1" | ||
}, | ||
"hardware": { | ||
"./examples": false | ||
}, | ||
"scripts": { | ||
"test": "./testsuite.js" | ||
}, | ||
"devDependencies": { | ||
"tape": "~2.3.2", | ||
"tap": "git+https://github.com/tcr/node-tap.git#3cb76e", | ||
"shelljs": "~0.3.0" | ||
}, | ||
"repository": "https://github.com/tessel/accel-mma84", | ||
"author": "Tim Cameron Ryan <tim@timryan.org>", | ||
"license": "MIT" | ||
"license": "MIT", | ||
"devDependencies": { | ||
"tinytap": "~0.0.2" | ||
} | ||
} |
@@ -10,11 +10,9 @@ /* test rig */ var t = 1, tmax = 5 | ||
accel.on('ready', function () { | ||
accel.on('sample', function (xyz) { | ||
ok(Array.isArray(xyz), 'accelerometer data is array'); | ||
ok(xyz.length == 3, 'three samples'); | ||
ok(typeof xyz[0] == 'number', 'idx 0 is number'); | ||
ok(typeof xyz[1] == 'number', 'idx 1 is number'); | ||
ok(typeof xyz[2] == 'number', 'idx 2 is number'); | ||
process.exit(0); | ||
}); | ||
accel.on('sample', function (xyz) { | ||
ok(Array.isArray(xyz), 'accelerometer data is array'); | ||
ok(xyz.length == 3, 'three samples'); | ||
ok(typeof xyz[0] == 'number', 'idx 0 is number'); | ||
ok(typeof xyz[1] == 'number', 'idx 1 is number'); | ||
ok(typeof xyz[2] == 'number', 'idx 2 is number'); | ||
process.exit(0); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
31368
1
1
0
11
469