Last active
April 4, 2019 16:45
-
-
Save roelandp/cd897072052b40f76913bcf52a872a8a to your computer and use it in GitHub Desktop.
Steem Blockchain Baby Rocking Cradle - https://steemit.com/steemhacks/@roelandp/rocking-our-baby-daughter-to-sleep-on-the-blockchain-powered-cradle-rocker
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var noble = require('noble-mac'); | |
const control_service = "7d8f60dda0684320a05ffcb8c60d86bc"; | |
const battery_service = "180f"; | |
const state_characteristic = "88d3cea890bf40acae8d4ba145d6b009" | |
const speed_characteristic = "7653f4cc08594387a35789dfd4593a3c"; | |
const mode_characteristic = "d49d811f8acc4bd0b020b64b26d0b038"; | |
const battery_characteristic = "2a19"; | |
var char_state; | |
var char_speed; | |
var char_mode; | |
var peripheral_global; | |
var dsteem = require('dsteem') | |
var mode = 2; // available modes: 0 = stop, 1 = snooze, 2 = wave, 3 = swing | |
var modes = ['stop','snooze','wave','swing']; | |
function message(msg){ | |
process.stdout.write('\033c'); | |
process.stdout.clearLine(); | |
process.stdout.cursorTo(0); | |
process.stdout.write(msg); | |
} | |
function setSpeed(speed) { | |
var speeddata = new Uint8Array(1); | |
speeddata[0] = speed; // mode wave... (0 = stop) | |
char_speed.write(new Buffer(speeddata), false, function(char_mode_write_err){ | |
if(char_mode_write_err) { | |
message('char_speed_write_err', char_mode_write_err); | |
} else { | |
//message('wrote to characteristic and put the thing on speed: ',speed); | |
} | |
}); | |
} | |
function setMode(mode) { | |
var wavedata = new Uint8Array(1); | |
wavedata[0] = mode; // mode wave... (0 = stop) | |
char_mode.write(new Buffer(wavedata), false, function(char_mode_write_err){ | |
if(char_mode_write_err) { | |
message('char_mode_write_err', char_mode_write_err); | |
} else { | |
message('Started Cradle Wave'); | |
} | |
}); | |
} | |
noble.on('stateChange', function(state) { | |
if (state === 'poweredOn') { | |
(noble.startScanning(control_service, false, function(err) { | |
if(err) { | |
message('err',err); | |
} else { | |
message('started scanning for peripherals'); | |
} | |
})); | |
noble.on('discover', function(peripheral) { | |
//message(peripheral); | |
if(peripheral.id == "53aaf079d3784934b5deb7b3e143d26d"){ | |
//message((peripheral)) | |
message('peripheral found!'); | |
peripheral_global = peripheral; | |
var serviceUUIDs = [control_service]; | |
message('connecting to cradle...'); | |
peripheral.connect(function(err){ | |
if(err) { | |
message('connect err', err); | |
} | |
message(peripheral.state); | |
//peripheral.disconnect(); | |
if(peripheral.state == "connected") { | |
peripheral.discoverServices(serviceUUIDs, function(error, services){ | |
if(error) { | |
message('servdiscovery error',error); | |
} else { | |
message(':::::service found ::::'); | |
services[0].discoverCharacteristics([state_characteristic,speed_characteristic,mode_characteristic], function(charerr,characteristics){ | |
if(charerr) { | |
message('characteristics error',charerr); | |
} else { | |
message(':::::characteristics found, now mapping ::::', characteristics.length); | |
message("\n\n"); | |
for(var i = 0; i < characteristics.length; i++) { | |
if(characteristics[i].uuid == state_characteristic) { | |
char_state = characteristics[i]; | |
} | |
if(characteristics[i].uuid == speed_characteristic) { | |
char_speed = characteristics[i]; | |
} | |
if(characteristics[i].uuid == mode_characteristic) { | |
char_mode = characteristics[i]; | |
} | |
} | |
message('mapped characteristics'); | |
message('connecting to Steem chain'); | |
var currentspeed = 0 | |
var currenttxsize = 0 | |
var maxtxsize = 0 | |
var blockcount = 0; | |
var totaltx = 0; | |
var averagespeed = 2; | |
var client = new dsteem.Client('https://rpc.steemviz.com') | |
stream = client.blockchain.getBlockStream(); | |
var waving = false; | |
stream.on('data', function(block) { | |
if(!waving) { | |
setMode(mode); | |
waving = true; | |
} | |
//console.log(block); | |
// analyse tx length | |
var txsize = block.transactions.length | |
totaltx += txsize; | |
blockcount++; | |
var avgtx = totaltx / blockcount; | |
// if tx length > maxtxsize = maxtxsize = tx.length; | |
var modifier = (txsize - avgtx) / avgtx; | |
var speedmodifier = 4 * modifier; | |
var cradlespeed = ((averagespeed + speedmodifier)) | |
if(cradlespeed < 0){ | |
cradlespeed = 0; | |
} | |
if(cradlespeed > 4){ | |
cradlespeed = 4; | |
} | |
var swappedtxt = ''; | |
if(block.witness == "roelandp") { | |
// swap modes (!) | |
mode++; | |
if(mode > 3) { | |
mode = 1; | |
} | |
setMode(mode); | |
swappedtxt = 'OMG! Block signed by daddy! Swapping rocker mode to '+modes[mode]; | |
} | |
message(block.block_id + ' signed by '+ block.witness + ' on ' + block.timestamp + '\n\nTransactions in block: + '+ block.transactions.length + 'tx\nAverage transactions: '+ avgtx+'\nModifier:'+ modifier +'\n\nSetting cradle wave speed to: '+ cradlespeed+'\n\n'+swappedtxt); | |
setSpeed(cradlespeed); | |
}) | |
.on('end', function() { | |
// done | |
message('END STREAMING BLOCKS'); | |
}); | |
} | |
}); | |
} | |
}); // particular UUID's | |
} | |
}); | |
} | |
}); | |
} else { | |
message('stop scanning'); | |
noble.stopScanning(); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment