bluetest/lib/index.js

165 lines
3.6 KiB
JavaScript
Raw Normal View History

2016-07-06 12:58:51 +00:00
/**
*
* User: Martin Donnelly
* Date: 2016-07-06
* Time: 13:37
*
*/
2016-07-06 13:26:22 +00:00
var cp = require('child_process');
var spawn = cp.spawn;
var fork = cp.fork;
2016-07-06 15:15:40 +00:00
var spawnP = require('child-process-promise').spawn;
2016-07-06 12:58:51 +00:00
var EventEmitter = require('events');
var busEmitter = new EventEmitter();
var util = require('util');
var logger = require('log4js').getLogger();
2016-07-07 09:58:40 +00:00
var bluetest;
bluetest = module.exports = function(options) {
2016-07-06 12:58:51 +00:00
'use strict';
2016-07-06 13:23:38 +00:00
var core = {
2016-07-07 09:58:40 +00:00
mac: '', gatt: null
2016-07-06 13:23:38 +00:00
};
2016-07-07 09:58:40 +00:00
core.processLuxData = function(data) {
2016-07-07 10:59:42 +00:00
console.log('+ processLuxData');
2016-07-07 09:58:40 +00:00
var m, e, lux;
2016-07-07 10:23:03 +00:00
var p = data.lastIndexOf(10);
var l = data.length - (p + 1);
2016-07-07 11:06:42 +00:00
2016-07-07 10:26:07 +00:00
//var _data = data.toString('ascii',p + 1, l);
var _data = data.toString('ascii');
2016-07-07 11:02:43 +00:00
//logger.debug('buffer:', data);
2016-07-07 11:05:22 +00:00
//logger.warn('ascii:', _data);
2016-07-07 10:26:07 +00:00
2016-07-07 13:00:43 +00:00
logger.debug(_data);
2016-07-07 10:26:07 +00:00
/* var wH = _data.slice(-5).split(' ');
2016-07-07 09:58:40 +00:00
var wB = [];
wB[0] = parseInt(wH[0], 16);
wB[1] = parseInt(wH[1], 16);
logger.debug(wH);
logger.debug(wB);
2016-07-06 13:50:09 +00:00
2016-07-07 09:58:40 +00:00
var word = (wB[1] << 16) + wB[0];
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
var raw = new Uint16Array(1);
raw[0] = word;
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
logger.debug(word);
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
m = raw & 0x0FFF;
e = (raw & 0xF000) >> 12;
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
lux = m * (0.01 * Math.pow(2.0, e));
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
logger.info('Lux: ', lux);
2016-07-07 10:26:07 +00:00
*/
2016-07-07 10:59:42 +00:00
console.log('- processLuxData');
2016-07-07 09:58:40 +00:00
};
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
core.enableLuxNotification = function() {
logger.info('Enable Luxomity Notifications...');
core.gatt.stdin.write('char-write-req 0x0042 0100\n');
core.gatt.stdin.write('char-write-req 0x0044 01\n');
};
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
core.gattConnected = function() {
logger.debug('Gatt connected!!!!!');
2016-07-06 15:15:40 +00:00
2016-07-07 09:58:40 +00:00
core.enableLuxNotification();
// Core.gatt.stdin.write('primary\n');
2016-07-06 15:15:40 +00:00
};
2016-07-06 13:13:26 +00:00
core.connectGatt = function() {
logger.info('trying to connect using gatttool');
2016-07-07 09:58:40 +00:00
core.gatt = spawn('gatttool', ['-I']);
2016-07-06 13:24:59 +00:00
var cStr;
2016-07-06 13:50:09 +00:00
core.gatt.on('error', function(err) {
2016-07-06 13:15:57 +00:00
logger.error(err);
});
2016-07-06 13:50:09 +00:00
core.gatt.on('exit', function(code) {
2016-07-06 13:13:26 +00:00
logger.debug('gatt exit code', code);
});
2016-07-06 13:50:09 +00:00
core.gatt.on('message', function(m) {
2016-07-07 11:05:22 +00:00
logger.info('message:', m);
2016-07-06 13:36:09 +00:00
});
2016-07-06 13:50:09 +00:00
core.gatt.stdout.on('data', (data) => {
2016-07-06 13:38:01 +00:00
2016-07-07 10:55:02 +00:00
//logger.info(`stdout: ${data}`);
2016-07-06 13:50:09 +00:00
if (data.indexOf('Connection successful') > -1) {
2016-07-06 13:58:05 +00:00
2016-07-06 13:50:09 +00:00
busEmitter.emit('connected');
}
2016-07-07 09:58:40 +00:00
if (data.indexOf('Notification handle = 0x0041') > -1) {
busEmitter.emit('processLux', data);
}
2016-07-06 13:38:01 +00:00
});
2016-07-06 13:50:09 +00:00
core.gatt.stderr.on('data', (data) => {
2016-07-06 13:38:01 +00:00
logger.info(`stderr: ${data}`);
});
2016-07-06 13:50:09 +00:00
core.gatt.on('close', (code) => {
2016-07-06 13:38:01 +00:00
logger.warn(`child process exited with code ${code}`);
});
2016-07-06 13:23:38 +00:00
logger.info('Trying to connect to ', core.mac);
2016-07-06 13:34:53 +00:00
cStr = 'connect ' + core.mac + '\n';
2016-07-06 13:50:09 +00:00
core.gatt.stdin.write(cStr);
2016-07-06 13:13:26 +00:00
};
2016-07-06 12:58:51 +00:00
core.init = function(options) {
2016-07-06 13:01:04 +00:00
var tool_path = '';
2016-07-06 13:02:16 +00:00
var hcidev = 'hvi0';
2016-07-06 12:58:51 +00:00
2016-07-06 13:06:21 +00:00
if (typeof options.mac !== 'undefined') {
2016-07-06 13:23:38 +00:00
core.mac = options.mac;
2016-07-07 10:23:03 +00:00
} else {
2016-07-06 13:06:21 +00:00
console.log('You need to pass a mac address.');
process.exit(1);
}
2016-07-07 09:58:40 +00:00
logger.info('Working with:', options);
2016-07-06 12:58:51 +00:00
var hciconfig = spawn(tool_path + 'hciconfig', [hcidev, 'up']);
hciconfig.on('exit', function(code) {
2016-07-07 09:58:40 +00:00
logger.debug('code', code);
2016-07-06 13:06:21 +00:00
if (code !== 0) {
// Could not get the device UP, maybe due to permissions, should run with sudo.
2016-07-07 09:58:40 +00:00
busEmitter.emit('error',
'hciconfig: failed to bring up device ' + hcidev + '. Try running with sudo.');
2016-07-06 13:06:21 +00:00
return;
2016-07-07 10:23:03 +00:00
} else {
2016-07-06 13:06:21 +00:00
2016-07-06 15:16:35 +00:00
core.connectGatt();
2016-07-06 13:13:26 +00:00
2016-07-06 13:06:21 +00:00
}
2016-07-06 12:58:51 +00:00
});
};
2016-07-06 13:58:05 +00:00
busEmitter.on('connected', core.gattConnected);
2016-07-07 09:58:40 +00:00
busEmitter.on('processLux', core.processLuxData);
2016-07-06 12:58:51 +00:00
core.init(options);
};
util.inherits(bluetest, EventEmitter);