This repository was archived by the owner on Aug 7, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcontroller.js
More file actions
131 lines (108 loc) · 4.59 KB
/
Copy pathcontroller.js
File metadata and controls
131 lines (108 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var extend = require('extend');
var facedetector = require('./facedetector.js');
var FACEDETECTION_FPS = 0
var FACEDETECTION_HISTORY_SIZE = 3;
var FACEDETECTION_SIGNAL_THRESHOLD = 1;
var AUDIO_LEVEL_HISTORY = 30;
function randomInt (low, high) {
return Math.floor(Math.random() * (high - low) + low);
}
function Controller(leds, paletteMgr, drawers, startDrawerName, drawerChangeInterval, cam, enableAudio) {
this.leds = leds;
this.paletteMgr = paletteMgr;
this.drawers = drawers;
this.currDrawer = drawers[startDrawerName];
this.drawerChange = {interval: drawerChangeInterval, lastChange: Date.now()};
this.cam = cam;
this.drawerNames = Object.keys(this.drawers).filter(
function(name) { return name != "Off" && name != "Video"; });
if (enableAudio) {
var coreAudio = require("node-core-audio");
audioEngine = coreAudio.createNewAudioEngine();
audioEngine.setOptions({sampleRate: 11025, framesPerBuffer: 512, inputChannels: 1, outputChannels: 1})
var instance = this;
var func = function(buffer) { return instance.processAudio(buffer); };
audioEngine.addAudioCallback(func);
this.audioLevel = 0;
}
console.log('starting drawer ' + startDrawerName);
if (cam && FACEDETECTION_FPS > 0) {
this.facedetector = new facedetector.FaceDetector(cam, FACEDETECTION_HISTORY_SIZE);
this.facedetector.start(FACEDETECTION_FPS);
}
}
Controller.prototype.processAudio = function(buffer) {
var ss = 0;
for (var i = 0; i < buffer[0].length; i++)
ss += buffer[0][i] * buffer[0][i];
//console.log("processAudio: " + ss.toFixed(7));
// running moving average
this.audioLevel = ((AUDIO_LEVEL_HISTORY-1) * this.audioLevel + ss) / AUDIO_LEVEL_HISTORY;
this.currDrawer.setAudioLevel(this.audioLevel);
return buffer;
}
Controller.prototype.loop = function() {
if (Date.now() - this.drawerChange.lastChange > this.drawerChange.interval &&
this.currDrawer.name != "Off") {
// change the drawer every so often (but not to off or video) to keep things interesting
// except if we're on the 'video' drawer in which case only change the settings
if (this.currDrawer.name != "Video") {
var drawerNames = [];
for (var name in this.drawers) {
if (name != "Off" && name != "Video")
drawerNames.push(name);
}
var randDrawerName = drawerNames[randomInt(0, drawerNames.length)];
this.changeDrawer(this.drawers[randDrawerName]);
} else {
console.log('randomizing drawer settings');
}
this.randomizeSettings();
this.drawerChange.lastChange = Date.now();
} else if (this.currDrawer.name != "Video" && this.foundFaces(true)) {
console.log('found some faces nearby');
this.changeDrawer(this.drawers["Video"]);
} else if (this.currDrawer.name == "Video" && this.foundFaces(false)) {
console.log('no longer found any faces nearby');
this.changeDrawer(this.drawers["AlienBlob"]);
}
this.currDrawer.draw(this.leds, this.paletteMgr.getCurrent());
this.leds.update()
}
Controller.prototype.getSettings = function() {
var ranges = extend({}, this.currDrawer.ranges,
{palette: [1,this.paletteMgr.palettes.length]});
var values = extend({}, this.currDrawer.values,
{palette: this.paletteMgr.currPalette});
return {ranges: ranges, values: values};
}
Controller.prototype.setSettings = function(settingVals) {
for (setting in this.currDrawer.values) {
this.currDrawer.values[setting] = parseInt(settingVals[setting]);
}
this.paletteMgr.setCurrentIndex(parseInt(settingVals.palette));
}
Controller.prototype.randomizeSettings = function() {
var d = this.currDrawer
var pm = this.paletteMgr;
for (setting in d.values) {
d.values[setting] = randomInt(d.ranges[setting][0], d.ranges[setting][1]+1);
}
pm.setCurrentIndex(randomInt(1,pm.palettes.length));
d.reset();
}
Controller.prototype.foundFaces = function(present) {
if (this.facedetector)
return this.facedetector.foundFaces(present, FACEDETECTION_SIGNAL_THRESHOLD);
else
return false;
}
Controller.prototype.changeDrawer = function(drawer) {
//global.gc();
console.log("changing to drawer: " + drawer.name);
this.currDrawer = drawer;
this.randomizeSettings();
this.currDrawer.reset()
this.drawerChange.lastChange = Date.now();
}
module.exports.Controller = Controller;