|
@@ -1,59 +1,86 @@
|
|
-let noble = require('noble');
|
|
|
|
-
|
|
|
|
-const ACCEL_OFF = Buffer.from([0x00]);
|
|
|
|
-const ACCEL_ON = Buffer.from([0x01]);
|
|
|
|
-
|
|
|
|
-// MAGIC CONSTANTS FOLLOW
|
|
|
|
-// these might be different for other devices, I wouldn't know
|
|
|
|
-const IDENTIFIER = 'CHSLEEV_00';
|
|
|
|
-const DEVICE_INFO_UUID = '180a';
|
|
|
|
-const ACCEL_UUID = 'ffa0';
|
|
|
|
-const TARE = 41690;
|
|
|
|
-const RATIO = 14;
|
|
|
|
-// MAGIC CONSTANTS END
|
|
|
|
-
|
|
|
|
-noble.on('stateChange', function(state) {
|
|
|
|
- if(state === 'poweredOn') {
|
|
|
|
- noble.startScanning();
|
|
|
|
|
|
+let device = require('./device');
|
|
|
|
+let blessed = require('blessed');
|
|
|
|
+
|
|
|
|
+let screen = blessed.screen({
|
|
|
|
+ smartCSR: true
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+screen.title = 'OpenPrepPad';
|
|
|
|
+
|
|
|
|
+let container = blessed.box({
|
|
|
|
+ top: 'center',
|
|
|
|
+ left: 'center',
|
|
|
|
+ width: 50,
|
|
|
|
+ height: 17,
|
|
|
|
+ border: {
|
|
|
|
+ type: 'line'
|
|
|
|
+ },
|
|
|
|
+ style: {
|
|
|
|
+ bg: 'cyan-bg'
|
|
}
|
|
}
|
|
- else {
|
|
|
|
- noble.stopScanning();
|
|
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+let box = blessed.BigText({
|
|
|
|
+ top: 0,
|
|
|
|
+ right: 0,
|
|
|
|
+ width: 'shrink',
|
|
|
|
+ height: 'shrink',
|
|
|
|
+ tags: true,
|
|
|
|
+ style: {
|
|
|
|
+ fg: 'white'
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
-noble.on('discover', function(peripheral) {
|
|
|
|
- if(peripheral.advertisement.localName === 'CHSLEEV_00') {
|
|
|
|
- noble.stopScanning();
|
|
|
|
-
|
|
|
|
- console.log('Prep Pad found with address '+peripheral.address);
|
|
|
|
-
|
|
|
|
- peripheral.on('disconnect', function() {
|
|
|
|
- console.log('Disconnecting from Prep Pad '+peripheral.address);
|
|
|
|
- process.exit(0);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- peripheral.connect(function(error) {
|
|
|
|
- console.log('Connected to Prep Pad');
|
|
|
|
- peripheral.discoverSomeServicesAndCharacteristics([DEVICE_INFO_UUID, ACCEL_UUID], [], function(error, services) {
|
|
|
|
- if(services.length != 2) {
|
|
|
|
- console.log('Could not find the relevant services. This might not actually be a Prep Pad');
|
|
|
|
- peripheral.disconnect();
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- let information = services[0];
|
|
|
|
- let accelerometer = services[1];
|
|
|
|
- information.characteristics[2].read(function(error, data) {
|
|
|
|
- console.log('Serial Number: '+data);
|
|
|
|
- });
|
|
|
|
- accelerometer.characteristics[0].write(ACCEL_ON);
|
|
|
|
- accelerometer.characteristics[2].subscribe();
|
|
|
|
- accelerometer.characteristics[2].on('data', function(data, isNotification) {
|
|
|
|
- let value = data[1] * 256 + data[0];
|
|
|
|
- let grams = Math.floor((TARE - value) / RATIO);
|
|
|
|
- console.log(grams+'g');
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- });
|
|
|
|
|
|
+container.append(box);
|
|
|
|
+screen.append(container);
|
|
|
|
+
|
|
|
|
+let statusLine = blessed.Text({
|
|
|
|
+ bottom: 0,
|
|
|
|
+ width: '100%',
|
|
|
|
+ height: 'shrink',
|
|
|
|
+ content: 'Connecting...',
|
|
|
|
+ style: {
|
|
|
|
+ fg: 'white',
|
|
|
|
+ bg: 'blue'
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+
|
|
|
|
+screen.append(statusLine);
|
|
|
|
+
|
|
|
|
+let helpBox = blessed.box({
|
|
|
|
+ top: 0,
|
|
|
|
+ left: 0,
|
|
|
|
+ width: 'shrink',
|
|
|
|
+ height: 'shrink',
|
|
|
|
+ content: 'q - Quit\nz - Zero/Tare'
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+screen.append(helpBox);
|
|
|
|
+
|
|
|
|
+screen.key(['escape', 'q', 'C-c'], function(ch, key) {
|
|
|
|
+ process.exit(0);
|
|
|
|
+});
|
|
|
|
+screen.key(['z'], function(ch, key) {
|
|
|
|
+ device.button$.onNext('');
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+// Focus our element.
|
|
|
|
+box.focus();
|
|
|
|
+
|
|
|
|
+// Render the screen.
|
|
|
|
+screen.render();
|
|
|
|
+
|
|
|
|
+device.weight$.subscribe(w => {
|
|
|
|
+ box.setContent(w+'g');
|
|
|
|
+ screen.render();
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+device.connStatus$.subscribe(s => {
|
|
|
|
+ if(s.state == 'connected') {
|
|
|
|
+ statusLine.setContent('Connected to Prep Pad '+s.serial);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ statusLine.setContent('Connecting...');
|
|
|
|
+ }
|
|
|
|
+ screen.render();
|
|
|
|
+})
|