| 
					
				 | 
			
			
				@@ -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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 |