1 | var Drawille = require('drawille')
|
2 | var prettybytes = require('pretty-bytes')
|
3 |
|
4 | module.exports.create = function(box) {
|
5 | var width = (box.width - 3) * 2
|
6 | var height = (box.height - 2) * 4
|
7 | var canvas = new Drawille(width, height)
|
8 | var values = []
|
9 | var chart = {
|
10 | chart: canvas,
|
11 | values: values,
|
12 | width: width,
|
13 | height: height,
|
14 | ready: false,
|
15 | min: 0,
|
16 | max: 0
|
17 | }
|
18 |
|
19 | return chart
|
20 | }
|
21 |
|
22 | module.exports.resize = function(chart, box) {
|
23 | var width = (box.width - 3) * 2
|
24 | var height = (box.height - 2) * 4
|
25 | chart.chart = new Drawille(width, height)
|
26 | chart.width = width
|
27 | chart.height = height
|
28 | }
|
29 |
|
30 | module.exports.draw = function(chart, position) {
|
31 | var c = chart.chart
|
32 | c.clear()
|
33 |
|
34 | if (!chart.ready) {
|
35 | return false
|
36 | }
|
37 |
|
38 | var dataPointsToKeep = 1000
|
39 |
|
40 | chart.values[position] = chart.value
|
41 |
|
42 | if (position > dataPointsToKeep) {
|
43 | delete chart.values[position - dataPointsToKeep]
|
44 | }
|
45 |
|
46 | chart.min = 0
|
47 | chart.max = 0
|
48 | chart.average = 0
|
49 |
|
50 | var avgCount = 0
|
51 |
|
52 | for (var i = 0; i < chart.width; i++) {
|
53 | var rawval = chart.values[chart.values.length - i]
|
54 | if (rawval > 0) {
|
55 | avgCount++
|
56 | chart.average += rawval
|
57 | if (rawval < chart.min) chart.min = rawval
|
58 | if (rawval > chart.max) chart.max = rawval
|
59 | }
|
60 | }
|
61 |
|
62 | chart.average = ~~(chart.average / avgCount)
|
63 |
|
64 | for (var pos in chart.values) {
|
65 | var p = parseInt(pos, 10) + (chart.width - chart.values.length)
|
66 | var pval = computeValue(chart.values[pos])
|
67 |
|
68 | if (p > 0 && chart.values[pos] > 0) {
|
69 | c.set(p, chart.height - 1)
|
70 | }
|
71 |
|
72 | for (var y = 0; y < pval; y++) {
|
73 | c.set(p, chart.height - y)
|
74 | }
|
75 | }
|
76 |
|
77 |
|
78 | var textOutput = c.frame().split("\n")
|
79 |
|
80 | var currentVal = prettybytes(chart.values[chart.values.length - 1])
|
81 | var msg = "current: " + currentVal + ", avg: " + prettybytes(chart.average) + ', max: ' + prettybytes(chart.max)
|
82 | textOutput[0] = textOutput[0].slice(0, textOutput[0].length - msg.length) + msg
|
83 |
|
84 | return textOutput.join("\n")
|
85 |
|
86 | function computeValue(input) {
|
87 | var max = chart.max
|
88 | if (max < 1000) max = 1000
|
89 | return ~~scale(input, chart.min, max, 0, chart.height)
|
90 | }
|
91 | }
|
92 |
|
93 | function scale( x, fromLow, fromHigh, toLow, toHigh ) {
|
94 | return ( x - fromLow ) * ( toHigh - toLow ) / ( fromHigh - fromLow ) + toLow
|
95 | }
|
96 |
|
97 | function stringRepeat(string, num) {
|
98 | if (num < 0) return ''
|
99 | return new Array(num + 1).join(string)
|
100 | }
|
101 |
|
102 |
|