UNPKG

zwack

Version:

Simulate an indoor bicycle trainer with BLE (Bluetooth Low Energy)

183 lines (158 loc) 4.81 kB
var ZwackBLE = require('../lib/zwack-ble-sensor'); const readline = require('readline'); // default parameters var cadence = 90; var power = 250; var runningCadence = 180; var runningSpeed = 10; // 6:00 minute mile var randomness = 5; var sensorName = 'Zwack'; var incr = 10; var runningIncr = 0.5; var stroke_count = 0; var notificationInterval = 1000; var watts = power; readline.emitKeypressEvents(process.stdin); process.stdin.setRawMode(true); var zwackBLE = new ZwackBLE({ name: sensorName, modelNumber: 'ZW-101', serialNumber: '1', }); process.stdin.on('keypress', (str, key) => { if (key.name === 'x' || key.name == 'q' || (key.ctrl && key.name == 'c')) { process.exit(); // eslint-disable-line no-process-exit } else if (key.name === 'l') { listKeys(); } else { if (key.shift) { factor = incr; runFactor = runningIncr; } else { factor = -incr; runFactor = -runningIncr; } switch (key.name) { case 'c': cadence += factor; break; if (cadence < 0) { cadence = 0; } if (cadence > 200) { cadence = 200; } case 'p': power += factor; break; if (power < 0) { power = 0; } if (power > 2500) { power = 2500; } case 'r': randomness += factor; break; if (randomness < 0) { randomness = 0; } case 's': runningSpeed += runFactor; break; if (runningSpeed < 0) { runningSpeed = 0; } case 'd': runningCadence += runFactor; break; if (runningCadence < 0) { runningCadence = 0; } case 'i': incr += Math.abs(factor) / factor; break; if (incr < 1) { incr = 1; } defaut: listKeys(); } listParams(); } }); var notifyPowerCSP = function () { watts = Math.floor(Math.random() * randomness + power); try { zwackBLE.notifyCSP({ watts: watts }); } catch (e) { console.error(e); } setTimeout(notifyPowerCSP, notificationInterval); }; var notifyCadenceCSP = function () { stroke_count += 1; if (cadence <= 0) { cadence = 0; setTimeout(notifyCadenceCSP, notificationInterval); return; } try { zwackBLE.notifyCSP({ watts: watts, rev_count: stroke_count }); } catch (e) { console.error(e); } setTimeout(notifyCadenceCSP, (60 * 1000) / (Math.random() * randomness + cadence)); }; var notifyRSC = function () { try { zwackBLE.notifyRSC({ speed: toMs(Math.random() + runningSpeed), cadence: Math.floor(Math.random() * 2 + runningCadence), }); } catch (e) { console.error(e); } setTimeout(notifyRSC, notificationInterval); }; function listParams() { console.log(`\nBLE Sensor parameters:`); console.log(`\nCycling:`); console.log(` Cadence: ${cadence} RPM`); console.log(` Power: ${power} W`); console.log('\nRunning:'); console.log(` Speed: ${runningSpeed} m/h, Pace: ${speedToPace(runningSpeed)} min/mi`); console.log(` Cadence: ${Math.floor(runningCadence)} steps/min`); console.log(`\nRandomness: ${randomness}`); console.log(`Increment: ${incr}`); console.log('\n'); } function listKeys() { console.log(`\nList of Available Keys`); console.log('c/C - Decrease/Increase cycling cadence'); console.log('p/P - Decrease/Increase cycling power'); console.log('s/S - Decrease/Increase running speed'); console.log('d/D - Decrease/Increase running cadence'); console.log('\nr/R - Decrease/Increase parameter variability'); console.log('i/I - Decrease/Increase parameter increment'); console.log('x/q - Exit'); console.log(); } function speedToPace(speed) { if (speed === 0) { return '00:00'; } let t = 60 / speed; let minutes = Math.floor(t); let seconds = Math.floor((t - minutes) * 60); return minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0'); } function toMs(speed) { return (speed * 1.60934) / 3.6; } // Main console.log(`[ZWack] Faking test data for sensor: ${sensorName}`); listKeys(); listParams(); notifyPowerCSP(); notifyCadenceCSP(); notifyRSC();