initial commit.

This commit is contained in:
John Shaver 2018-12-12 11:15:39 -08:00
commit cd2198c411
5 changed files with 123 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules
schedule.json

27
package-lock.json generated Normal file
View File

@ -0,0 +1,27 @@
{
"name": "sleeplight",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"bindings": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz",
"integrity": "sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew=="
},
"nan": {
"version": "2.11.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
"integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA=="
},
"pigpio": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pigpio/-/pigpio-1.2.0.tgz",
"integrity": "sha512-DGopuMdjmRguqydLZ3A16PYOiJWtl705aGF3a48Tnc6woLyts4Zj01FklJYgTqFMCZy4ZBHg49xe+W5yG5+jOw==",
"requires": {
"bindings": "^1.3.0",
"nan": "^2.11.1"
}
}
}
}

14
package.json Normal file
View File

@ -0,0 +1,14 @@
{
"name": "sleeplight",
"version": "1.0.0",
"description": "",
"main": "runSchedule.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"pigpio": "^1.2.0"
}
}

68
runSchedule.js Normal file
View File

@ -0,0 +1,68 @@
const Gpio = require("pigpio").Gpio;
const schedule = require("./schedule.json");
const HZ = 10000;
let ledRed = new Gpio(18, {mode: Gpio.OUTPUT});
let ledGreen = new Gpio(12, {mode: Gpio.OUTPUT});
let timings = schedule.times.reduce((result, time) => {
result.push({start: time.time, color: time.color});
return result;
}, []).sort((a, b) => a.start - b.start).map((timing, i, arr) => {
timing.end = arr[(i+1) % arr.length].start;
return timing;
});
splitAtMidnight(timings);
let state = {
color: "red"
}
let updateState = setInterval(() => {
let time = getTime();
let timing = timings.find(x => x.start <= time && x.end > time);
if(timing.color !== state.color) {
state = {
color: timing.color
};
}
}, 1000);
let render = setInterval(() => {
switch(state.color) {
case "red":
if(ledGreen.digitalRead()) {
return ledGreen.digitalWrite(0);
}
return ledRed.hardwarePwmWrite(HZ, getBrightness(Date.now()));
break;
case "green":
if(ledRed.digitalRead()) {
return ledRed.digitalWrite(0);
}
return ledGreen.hardwarePwmWrite(HZ, getBrightness(Date.now()));
break;
}
}, 50);
function getBrightness(x) {
return Math.floor(breathingCurve(x, 3000, 1000000, 100000));
}
function breathingCurve(x, interval = 3000, max, min) {
let t = (x)/interval;
let y = (Math.sin(t) + 1)/2;
return ((max-min) * y) + min;
}
function splitAtMidnight(arr) {
let last = arr[arr.length -1];
arr.unshift({ ...last, start: 0});
arr[arr.length - 1].end = 0;
}
function getTime() {
let date = new Date(Date.now());
return (date.getHours() * 100) + date.getMinutes() + 1
}

12
schedule.json.example Normal file
View File

@ -0,0 +1,12 @@
{
"times": [
{
"time": 1915,
"color": "red"
},
{
"time": 700,
"color": "green"
}
]
}