From a29701e6eb2b8fdf333eb7835d73177fb7bf636f Mon Sep 17 00:00:00 2001 From: Skylar Grant Date: Sat, 3 Dec 2022 19:42:47 -0500 Subject: [PATCH] Finish moving and testing functions file, Promises --- functions.js | 130 ++++++++++++++++++++++++++++++++++----------------- main.js | 50 +++++++++++--------- 2 files changed, 115 insertions(+), 65 deletions(-) diff --git a/functions.js b/functions.js index 5851963..601c112 100644 --- a/functions.js +++ b/functions.js @@ -2,8 +2,16 @@ const dotenv = require('dotenv').config(); // Module for working with files const fs = require('fs'); +const { resolve } = require('path'); // Setup for use with the Pi's GPIO pins -const gpio = require('rpi-gpio'); +if (process.env.ONPI == 'true') { + console.log('Running on a Raspberry Pi.'); + const gpio = require('rpi-gpio'); +} else if (process.env.ONPI == 'false') { + console.log('Not running on a Raspberry Pi.'); +} else { + console.log('Problem with ENV file.'); +} // The functions we'll export to be used in other files const functions = { @@ -15,63 +23,90 @@ const functions = { }, // Turns the auger on (Pin 7 high) on() { - gpio.write(7, true, function(err) { - if (err) throw err; - if (process.env.DEBUG == "true") console.log('Auger turned on.'); + return new Promise((resolve) => { + if (process.env.ONPI == 'true') { + gpio.write(7, true, function(err) { + if (err) throw err; + if (process.env.DEBUG == "true") console.log('Auger turned on.'); + }); + } else { + console.log('Auger turned on.'); + resolve('Auger turned on.'); + } }); + }, // Turns the auger off (pin 7 low) off() { - gpio.write(7, false, function(err) { - if (err) throw err; - if (process.env.DEBUG == "true") console.log('Auger turned off.'); + return new Promise((resolve) => { + if (process.env.ONPI == 'true') { + gpio.write(7, false, function(err) { + if (err) throw err; + if (process.env.DEBUG == "true") console.log('Auger turned off.'); + }); + } else { + console.log('Auger turned off.'); + resolve('Auger turned off.'); + } }); + }, // Cycles the auger using the two functions above this one (functions.auger.on() and functions.auger.off()) // Sleeps in between cycles using functions.sleep() cycle() { - this.on(); - functions.sleep(process.env.ONTIME); - this.off(); - functions.sleep(process.env.OFFTIME); - return; + return new Promise((resolve) => { + this.on().then(() => { + functions.sleep(process.env.ONTIME).then(() => { + this.off().then(() => { + functions.sleep(process.env.OFFTIME).then(() => { + resolve("Cycle complete."); + }); + }); + }); + }); + }); }, }, files: { - async check() { - // TODO this code needs to be finished from migration - // Check for pause file existing, then sleep for preset time, then run the function again. - if (fs.existsSync('./pause')) { - return "pause"; - } + check() { + return new Promise((resolve, reject) => { + // TODO this code needs to be finished from migration + // Check for pause file existing, then sleep for preset time, then run the function again. + if (fs.existsSync('./pause')) { + resolve("pause"); + } - // Check for reload file existing, then reload environment variables, then delete the file. - if (fs.existsSync('./reload')) { - return "reload"; - } + // Check for reload file existing, then reload environment variables, then delete the file. + if (fs.existsSync('./reload')) { + resolve("reload"); + } - // Check for quit file existing, then delete it, then quit the program - if (fs.existsSync('./quit')) { - return "quit"; - } - return "none"; + // Check for quit file existing, then delete it, then quit the program + if (fs.existsSync('./quit')) { + resolve("quit"); + } + resolve("none"); + }); }, }, commands: { pause() { - console.log('Paused...'); - this.sleep(process.env.PAUSETIME).then(() => { return; }); - return; - }, - reload() { - dotenv.config({ override: true }) - fs.unlink('./reload', (err) => { - if (err) throw err; - console.log('Deleted reload file.'); + return new Promise((resolve) => { + functions.sleep(process.env.PAUSETIME).then(() => { resolve(); }); }); - console.log('Reloaded environment variables.'); - console.log(`ONTIME=${process.env.ONTIME}\nOFFTIME=${process.env.OFFTIME}\nPAUSETIME=${process.env.PAUSETIME}\nDEBUG=${process.env.DEBUG}`); - return; + }, + reload(envs) { + return new Promise((resolve) => { + const dotenv = require('dotenv').config({ override: true }); + fs.unlink('./reload', (err) => { + if (err) throw err; + console.log('Deleted reload file.'); + }); + console.log('Reloaded environment variables.'); + console.log(`ONTIME=${process.env.ONTIME}\nOFFTIME=${process.env.OFFTIME}\nPAUSETIME=${process.env.PAUSETIME}\nDEBUG=${process.env.DEBUG}\nONPI=${process.env.ONPI}`); + resolve(); + }); + }, quit() { fs.unlink('./quit', (err) => { @@ -85,19 +120,26 @@ const functions = { // Sleeps for any given milliseconds, call with await sleep(ms) { return new Promise((resolve) => { - setTimeout(resolve, ms); - if (process.env.DEBUG == "true") console.log(`Slept for ${ms}ms`); + if (process.env.DEBUG == "true") console.log(`Sleeping for ${ms}ms`); + const finish = () => { + if (process.env.DEBUG == "true") console.log(`Slept for ${ms}ms`); + resolve(); + } + setTimeout(finish, ms); + }); }, init() { // Write the current env vars to console console.log('Environment variables:'); - console.log(`ONTIME=${process.env.ONTIME}\nOFFTIME=${process.env.OFFTIME}\nPAUSETIME=${process.env.PAUSETIME}\nDEBUG=${process.env.DEBUG}`); + console.log(`ONTIME=${process.env.ONTIME}\nOFFTIME=${process.env.OFFTIME}\nPAUSETIME=${process.env.PAUSETIME}\nDEBUG=${process.env.DEBUG}\nONPI=${process.env.ONPI}`); return true; }, } // Set up GPIO 4 (pysical pin 7) as output, then call functions.auger.ready() -gpio.setup(7, gpio.DIR_OUT, functions.auger.ready()); +if (process.env.ONPI == 'true') { + gpio.setup(7, gpio.DIR_OUT, functions.auger.ready()); +} -module.exports = { functions } \ No newline at end of file +module.exports = { functions }; \ No newline at end of file diff --git a/main.js b/main.js index 7b38518..e22792a 100644 --- a/main.js +++ b/main.js @@ -1,32 +1,40 @@ // Custom functions module to keep main script clean -const fn = require('./functions').functions; +const fn = require('./functions.js').functions; // Environment Variables Importing const dotenv = require('dotenv').config(); // TODO Add logic for other sensors -while (true) { - main(); -} +main(fn); // Main function, turns the auger on, sleeps for the time given in environment variables, then turns the auger off, sleeps, repeats. -async function main() { - switch (fn.files.check()) { - case "pause": - fn.commands.pause(); +async function main(fn) { + fn.files.check().then((res,rej) => { + console.log('File Check: ' + res); + switch (res) { + case "pause": + fn.commands.pause().then(() => { + main(fn); + }); + break; + case "reload": + fn.commands.reload().then(() => { + main(fn); + }); + break; + case "quit": + fn.commands.quit(); + break; + case "none": + fn.auger.cycle().then(() => { + main(fn); + }); + break; + + default: + main(fn); break; - case "reload": - fn.commands.reload(); - break; - case "quit": - fn.commands.quit(); - break; - case "none": - fn.auger.cycle(); - break; - - default: - break; - } + } + }); } \ No newline at end of file