From cd2198c4118bd409e1e49876fa32e86b2fad8fb2 Mon Sep 17 00:00:00 2001 From: John Shaver Date: Wed, 12 Dec 2018 11:15:39 -0800 Subject: [PATCH] initial commit. --- .gitignore | 2 ++ package-lock.json | 27 +++++++++++++++++ package.json | 14 +++++++++ runSchedule.js | 68 +++++++++++++++++++++++++++++++++++++++++++ schedule.json.example | 12 ++++++++ 5 files changed, 123 insertions(+) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 runSchedule.js create mode 100644 schedule.json.example diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..163bf88 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +schedule.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7e51955 --- /dev/null +++ b/package-lock.json @@ -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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a4c0b6e --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/runSchedule.js b/runSchedule.js new file mode 100644 index 0000000..c58544b --- /dev/null +++ b/runSchedule.js @@ -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 +} diff --git a/schedule.json.example b/schedule.json.example new file mode 100644 index 0000000..1ea302c --- /dev/null +++ b/schedule.json.example @@ -0,0 +1,12 @@ +{ + "times": [ + { + "time": 1915, + "color": "red" + }, + { + "time": 700, + "color": "green" + } + ] +}