Skip to content

Commit

Permalink
refactor: move perfMonitor to own module
Browse files Browse the repository at this point in the history
resolve Klathmon#3
  • Loading branch information
PartyLich committed Jul 28, 2020
1 parent 677e5be commit 31c16f7
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 46 deletions.
47 changes: 1 addition & 46 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,9 @@
const hid = require("node-hid");
const os = require("os-utils");
const request = require("request");
const batteryLevel = require("battery-level");
const loudness = require("loudness");

// the node-audio-windows version is much faster on windows, but loudness handles other os's better,
// so let's get the best of both worlds
let winAudio;
try {
winAudio = require("node-audio-windows").volume;
} catch (err) {
// do nothing
}

const { wait } = require("./util");
const perfStream = require("./perfMonitor").stream;


// Keyboard info
Expand All @@ -26,7 +16,6 @@ const KEYBOARD_USAGE_PAGE = 0xFF60;
const KEYBOARD_UPDATE_TIME = 1000;

// Info screen types
const SCREEN_PERF = 0;
const SCREEN_STOCK = 1;
const SCREEN_WEATHER = 2;
const screens = ["", "", ""];
Expand All @@ -36,40 +25,6 @@ let keyboard = null;
let screenBuffer = null;
let screenLastUpdate = null;

async function startPerfMonitor() {
while (true) {
const [
cpuUsagePercent,
usedMemoryPercent,
volumeLevelPercent,
batteryPercent,
] = await Promise.all([
new Promise((resolve) => os.cpuUsage((usage) => resolve(usage * 100))),
100 - (os.freememPercentage() * 100),
(os.platform() === "darwin" ? loudness.getVolume() : winAudio.getVolume() * 100),
(await batteryLevel()) * 100,
]);

const screen = [
["CPU:", cpuUsagePercent],
["RAM:", usedMemoryPercent],
["VOL:", volumeLevelPercent],
["BAT:", batteryPercent],
];

const maxTitleSize = Math.max(...screen.map(([header]) => header.length));
const barGraphSize = 21 - maxTitleSize - 3;

// Set this to be the latest performance info
screens[SCREEN_PERF] = screen.map(([header, percent], index) => {
const numBlackTiles = barGraphSize * (percent / 100);
return `${ header } ${ "\u0008".repeat(Math.ceil(numBlackTiles)) }${ " ".repeat(barGraphSize - numBlackTiles) }|${ title(index, 0) }`;
}).join("");

await wait(KEYBOARD_UPDATE_TIME);
}
}

async function startStockMonitor() {
// Set the stocks that we want to show
const stocks = new Map();
Expand Down
87 changes: 87 additions & 0 deletions src/perfMonitor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const os = require("os-utils");
const batteryLevel = require("battery-level");
const loudness = require("loudness");

const { title } = require("./util");


// the node-audio-windows version is much faster on windows, but loudness handles other os's better,
// so let's get the best of both worlds
let winAudio;
try {
winAudio = require("node-audio-windows").volume;
} catch (err) {
// do nothing
}

/**
* Get the system volume
*/
async function getVolume() {
return os.platform() === "win32" ? winAudio.getVolume() * 100 : await loudness.getVolume();
}

/**
* Get OS performance statistics
* @return {array}
*/
async function getPerf() {
return await Promise.all([
new Promise((resolve) => os.cpuUsage((usage) => resolve(usage * 100))),
100 - (os.freememPercentage() * 100),
getVolume(),
(await batteryLevel()) * 100,
]);
}

/**
* @param {array} perfStats
* @return {string}
*/
function formatScreen( perfStats) {
console.log(perfStats);
const maxTitleSize = Math.max(...perfStats.map(([header]) => header.length));
const barGraphSize = 21 - maxTitleSize - 3;

// Set this to be the latest performance info
return perfStats.map(([header, percent], index) => {
const numBlackTiles = barGraphSize * (percent / 100);
return `${ header } ${ "\u0008".repeat(Math.ceil(numBlackTiles)) }${ " ".repeat(barGraphSize - numBlackTiles) }|${ title(index, 0) }`;
}).join("");
}

/**
* Generate an endless stream of screens for the system performance metrics
*/
async function* perfStream() {
while (true) {
const [
cpuUsagePercent,
usedMemoryPercent,
volumeLevelPercent,
batteryPercent,
] = await getPerf();

const perfStats = [
["CPU:", cpuUsagePercent],
["RAM:", usedMemoryPercent],
["VOL:", volumeLevelPercent],
["BAT:", batteryPercent],
];

yield formatScreen(
// cpuUsagePercent,
// usedMemoryPercent,
// volumeLevelPercent,
// batteryPercent,
perfStats,
);
}
}

module.exports = {
getPerf,
getVolume,
formatScreen,
stream: perfStream,
};

0 comments on commit 31c16f7

Please sign in to comment.