2018-12-12 19:15:39 +00:00
|
|
|
const Gpio = require("pigpio").Gpio;
|
|
|
|
const schedule = require("./schedule.json");
|
2018-12-12 21:47:14 +00:00
|
|
|
const HZ = 40000;
|
2018-12-12 19:15:39 +00:00
|
|
|
|
2018-12-12 23:52:51 +00:00
|
|
|
let ledRed = new Gpio(12, {mode: Gpio.OUTPUT});
|
|
|
|
let ledGreen = new Gpio(13, {mode: Gpio.OUTPUT});
|
2018-12-12 19:15:39 +00:00
|
|
|
|
|
|
|
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"
|
|
|
|
}
|
|
|
|
|
2018-12-12 21:47:48 +00:00
|
|
|
updateState();
|
|
|
|
|
|
|
|
let updateStateInterval = setInterval(updateState, 1000);
|
|
|
|
|
|
|
|
let renderInterval = setInterval(render, 50);
|
|
|
|
|
|
|
|
function updateState() {
|
2018-12-12 19:15:39 +00:00
|
|
|
let time = getTime();
|
|
|
|
let timing = timings.find(x => x.start <= time && x.end > time);
|
|
|
|
if(timing.color !== state.color) {
|
|
|
|
state = {
|
|
|
|
color: timing.color
|
|
|
|
};
|
|
|
|
}
|
2018-12-12 21:47:48 +00:00
|
|
|
}
|
2018-12-12 19:15:39 +00:00
|
|
|
|
2018-12-12 21:47:48 +00:00
|
|
|
function render() {
|
2018-12-12 19:15:39 +00:00
|
|
|
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);
|
|
|
|
}
|
2018-12-12 20:23:44 +00:00
|
|
|
if(!ledGreen.digitalRead()) {
|
|
|
|
return ledGreen.digitalWrite(1);
|
|
|
|
}
|
|
|
|
//Commenting out. Probably don't need breathing on green leds
|
|
|
|
//return ledGreen.hardwarePwmWrite(HZ, getBrightness(Date.now()));
|
2018-12-12 19:15:39 +00:00
|
|
|
break;
|
|
|
|
}
|
2018-12-12 21:47:48 +00:00
|
|
|
}
|
2018-12-12 19:15:39 +00:00
|
|
|
|
|
|
|
function getBrightness(x) {
|
2018-12-12 21:47:14 +00:00
|
|
|
return Math.floor(breathingCurve(x, 6000, 100000, 1000000));
|
2018-12-12 19:15:39 +00:00
|
|
|
}
|
|
|
|
|
2018-12-12 20:23:44 +00:00
|
|
|
function breathingCurve(x, interval = 3000, min, max) {
|
|
|
|
let t = x * Math.PI/(interval/2);
|
|
|
|
let y = Math.sin(t + Math.sin(t) * 0.2);
|
|
|
|
let untranslatedY = Math.sin(t + Math.sin(t) * 0.25);
|
|
|
|
y = (untranslatedY + 1)/2;
|
|
|
|
return y * (max - min) + min;
|
2018-12-12 19:15:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|