From f11b4647e2638f302ccdd14eb27ae22792242c43 Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Mon, 18 Sep 2023 23:40:17 +0000 Subject: [PATCH 1/9] Add wake lock in BiteSelection --- .../Pages/Home/MealStates/BiteSelection.jsx | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx index 30a12441..7e570c43 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx @@ -6,6 +6,8 @@ import { View } from 'react-native' // PropTypes is used to validate that the used props are in fact passed to this // Component import PropTypes from 'prop-types' +// External Library Imports +import NoSleep from 'nosleep.js' // Local Imports import '../Home.css' @@ -55,6 +57,13 @@ const BiteSelection = (props) => { let textFontSize = isPortrait ? '2.5vh' : '2vw' // Indicator of how to arrange screen elements based on orientation let dimension = isPortrait ? 'column' : 'row' + // NoSleep object creation + let noSleep = useMemo(() => new NoSleep(), []) + // Define wake lock boolean + // let wakeLockEnabled = false + const [wakeLockEnabled, setWakeLockEnabled] = useState(false) + // Wake lock text + const [wakeLockText, setWakeLockText] = useState('Wake lock off') /** * Create a local state variable to store the detected masks, the @@ -415,6 +424,23 @@ const BiteSelection = (props) => { ) }, [moveToMouth, moveToMouthImage, textFontSize]) + /** + * Callback function for when the user clicks on the wake lock button. + */ + const wakeLockClicked = useCallback(() => { + if (!wakeLockEnabled) { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! + setWakeLockEnabled(true) + setWakeLockText('Wake lock on') + } else { + console.log('Wake Lock is disabled') + noSleep.disable() // let the screen turn off. + setWakeLockEnabled(false) + setWakeLockText('Wake lock off') + } + }, [setWakeLockEnabled, setWakeLockText, noSleep, wakeLockEnabled]) + /** Get the full page view * * @returns {JSX.Element} the the full page view @@ -432,7 +458,26 @@ const BiteSelection = (props) => { */} + + + { videoParentRef, imageClicked, props.debug, - debugButton + debugButton, + wakeLockClicked, + wakeLockEnabled, + wakeLockText ]) // Render the component From 3bc3cf06865e47129d44f4d2f52820a6d4d6618d Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Tue, 19 Sep 2023 00:00:27 +0000 Subject: [PATCH 2/9] Add NoSleep library --- .../src/Pages/Home/MealStates/NoSleep.js | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 feedingwebapp/src/Pages/Home/MealStates/NoSleep.js diff --git a/feedingwebapp/src/Pages/Home/MealStates/NoSleep.js b/feedingwebapp/src/Pages/Home/MealStates/NoSleep.js new file mode 100644 index 00000000..745d09df --- /dev/null +++ b/feedingwebapp/src/Pages/Home/MealStates/NoSleep.js @@ -0,0 +1,265 @@ +/*! NoSleep.js v0.12.0 - git.io/vfn01 - Rich Tibbett - MIT license */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["NoSleep"] = factory(); + else + root["NoSleep"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _require = __webpack_require__(1), + webm = _require.webm, + mp4 = _require.mp4; + +// Detect iOS browsers < version 10 + + +var oldIOS = function oldIOS() { + return typeof navigator !== "undefined" && parseFloat(("" + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ""])[1]).replace("undefined", "3_2").replace("_", ".").replace("_", "")) < 10 && !window.MSStream; +}; + +// Detect native Wake Lock API support +var nativeWakeLock = function nativeWakeLock() { + return "wakeLock" in navigator; +}; + +var NoSleep = function () { + function NoSleep() { + var _this = this; + + _classCallCheck(this, NoSleep); + + this.enabled = false; + if (nativeWakeLock()) { + this._wakeLock = null; + var handleVisibilityChange = function handleVisibilityChange() { + if (_this._wakeLock !== null && document.visibilityState === "visible") { + _this.enable(); + } + }; + document.addEventListener("visibilitychange", handleVisibilityChange); + document.addEventListener("fullscreenchange", handleVisibilityChange); + } else if (oldIOS()) { + this.noSleepTimer = null; + } else { + // Set up no sleep video element + this.noSleepVideo = document.createElement("video"); + + this.noSleepVideo.setAttribute("title", "No Sleep"); + this.noSleepVideo.setAttribute("playsinline", ""); + + this._addSourceToVideo(this.noSleepVideo, "webm", webm); + this._addSourceToVideo(this.noSleepVideo, "mp4", mp4); + + this.noSleepVideo.addEventListener("loadedmetadata", function () { + if (_this.noSleepVideo.duration <= 1) { + // webm source + _this.noSleepVideo.setAttribute("loop", ""); + } else { + // mp4 source + _this.noSleepVideo.addEventListener("timeupdate", function () { + if (_this.noSleepVideo.currentTime > 0.5) { + _this.noSleepVideo.currentTime = Math.random(); + } + }); + } + }); + } + } + + _createClass(NoSleep, [{ + key: "_addSourceToVideo", + value: function _addSourceToVideo(element, type, dataURI) { + var source = document.createElement("source"); + source.src = dataURI; + source.type = "video/" + type; + element.appendChild(source); + } + }, { + key: "enable", + value: function enable() { + var _this2 = this; + + if (nativeWakeLock()) { + return navigator.wakeLock.request("screen").then(function (wakeLock) { + _this2._wakeLock = wakeLock; + _this2.enabled = true; + console.log("Wake Lock active."); + _this2._wakeLock.addEventListener("release", function () { + // ToDo: Potentially emit an event for the page to observe since + // Wake Lock releases happen when page visibility changes. + // (https://web.dev/wakelock/#wake-lock-lifecycle) + console.log("Wake Lock released."); + }); + }).catch(function (err) { + _this2.enabled = false; + console.error(err.name + ", " + err.message); + throw err; + }); + } else if (oldIOS()) { + this.disable(); + console.warn("\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n "); + this.noSleepTimer = window.setInterval(function () { + if (!document.hidden) { + window.location.href = window.location.href.split("#")[0]; + window.setTimeout(window.stop, 0); + } + }, 15000); + this.enabled = true; + return Promise.resolve(); + } else { + var playPromise = this.noSleepVideo.play(); + return playPromise.then(function (res) { + _this2.enabled = true; + return res; + }).catch(function (err) { + _this2.enabled = false; + throw err; + }); + } + } + }, { + key: "disable", + value: function disable() { + if (nativeWakeLock()) { + if (this._wakeLock) { + this._wakeLock.release(); + } + this._wakeLock = null; + } else if (oldIOS()) { + if (this.noSleepTimer) { + console.warn("\n NoSleep now disabled for older iOS devices.\n "); + window.clearInterval(this.noSleepTimer); + this.noSleepTimer = null; + } + } else { + this.noSleepVideo.pause(); + } + this.enabled = false; + } + }, { + key: "isEnabled", + get: function get() { + return this.enabled; + } + }]); + + return NoSleep; +}(); + +module.exports = NoSleep; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = { + webm: "data:video/webm;base64,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", + mp4: "data:video/mp4;base64,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" +}; + +/***/ }) +/******/ ]); +}); \ No newline at end of file From f463b2c89b3f2a289072d226fef6f14b20724804 Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Tue, 19 Sep 2023 00:05:19 +0000 Subject: [PATCH 3/9] Avoid linting for NoSleep library --- feedingwebapp/.eslintignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feedingwebapp/.eslintignore b/feedingwebapp/.eslintignore index 9abbbc90..7fa0c595 100644 --- a/feedingwebapp/.eslintignore +++ b/feedingwebapp/.eslintignore @@ -6,6 +6,8 @@ .pnp.js # don't lint progressbar.js because it is a third-party /src/Pages/Home/MealStates/progressbar.js +# don't lint NoSleep.js because it is a third-party +/src/Pages/Home/MealStates/NoSleep.js # testing /coverage From ffa3ba92c90fc0db8950ba878d07e60aa6e07136 Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Tue, 19 Sep 2023 23:40:36 +0000 Subject: [PATCH 4/9] Remove nosleep source code --- feedingwebapp/.eslintignore | 2 - .../src/Pages/Home/MealStates/NoSleep.js | 265 ------------------ 2 files changed, 267 deletions(-) delete mode 100644 feedingwebapp/src/Pages/Home/MealStates/NoSleep.js diff --git a/feedingwebapp/.eslintignore b/feedingwebapp/.eslintignore index 7fa0c595..9abbbc90 100644 --- a/feedingwebapp/.eslintignore +++ b/feedingwebapp/.eslintignore @@ -6,8 +6,6 @@ .pnp.js # don't lint progressbar.js because it is a third-party /src/Pages/Home/MealStates/progressbar.js -# don't lint NoSleep.js because it is a third-party -/src/Pages/Home/MealStates/NoSleep.js # testing /coverage diff --git a/feedingwebapp/src/Pages/Home/MealStates/NoSleep.js b/feedingwebapp/src/Pages/Home/MealStates/NoSleep.js deleted file mode 100644 index 745d09df..00000000 --- a/feedingwebapp/src/Pages/Home/MealStates/NoSleep.js +++ /dev/null @@ -1,265 +0,0 @@ -/*! NoSleep.js v0.12.0 - git.io/vfn01 - Rich Tibbett - MIT license */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["NoSleep"] = factory(); - else - root["NoSleep"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var _require = __webpack_require__(1), - webm = _require.webm, - mp4 = _require.mp4; - -// Detect iOS browsers < version 10 - - -var oldIOS = function oldIOS() { - return typeof navigator !== "undefined" && parseFloat(("" + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ""])[1]).replace("undefined", "3_2").replace("_", ".").replace("_", "")) < 10 && !window.MSStream; -}; - -// Detect native Wake Lock API support -var nativeWakeLock = function nativeWakeLock() { - return "wakeLock" in navigator; -}; - -var NoSleep = function () { - function NoSleep() { - var _this = this; - - _classCallCheck(this, NoSleep); - - this.enabled = false; - if (nativeWakeLock()) { - this._wakeLock = null; - var handleVisibilityChange = function handleVisibilityChange() { - if (_this._wakeLock !== null && document.visibilityState === "visible") { - _this.enable(); - } - }; - document.addEventListener("visibilitychange", handleVisibilityChange); - document.addEventListener("fullscreenchange", handleVisibilityChange); - } else if (oldIOS()) { - this.noSleepTimer = null; - } else { - // Set up no sleep video element - this.noSleepVideo = document.createElement("video"); - - this.noSleepVideo.setAttribute("title", "No Sleep"); - this.noSleepVideo.setAttribute("playsinline", ""); - - this._addSourceToVideo(this.noSleepVideo, "webm", webm); - this._addSourceToVideo(this.noSleepVideo, "mp4", mp4); - - this.noSleepVideo.addEventListener("loadedmetadata", function () { - if (_this.noSleepVideo.duration <= 1) { - // webm source - _this.noSleepVideo.setAttribute("loop", ""); - } else { - // mp4 source - _this.noSleepVideo.addEventListener("timeupdate", function () { - if (_this.noSleepVideo.currentTime > 0.5) { - _this.noSleepVideo.currentTime = Math.random(); - } - }); - } - }); - } - } - - _createClass(NoSleep, [{ - key: "_addSourceToVideo", - value: function _addSourceToVideo(element, type, dataURI) { - var source = document.createElement("source"); - source.src = dataURI; - source.type = "video/" + type; - element.appendChild(source); - } - }, { - key: "enable", - value: function enable() { - var _this2 = this; - - if (nativeWakeLock()) { - return navigator.wakeLock.request("screen").then(function (wakeLock) { - _this2._wakeLock = wakeLock; - _this2.enabled = true; - console.log("Wake Lock active."); - _this2._wakeLock.addEventListener("release", function () { - // ToDo: Potentially emit an event for the page to observe since - // Wake Lock releases happen when page visibility changes. - // (https://web.dev/wakelock/#wake-lock-lifecycle) - console.log("Wake Lock released."); - }); - }).catch(function (err) { - _this2.enabled = false; - console.error(err.name + ", " + err.message); - throw err; - }); - } else if (oldIOS()) { - this.disable(); - console.warn("\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n "); - this.noSleepTimer = window.setInterval(function () { - if (!document.hidden) { - window.location.href = window.location.href.split("#")[0]; - window.setTimeout(window.stop, 0); - } - }, 15000); - this.enabled = true; - return Promise.resolve(); - } else { - var playPromise = this.noSleepVideo.play(); - return playPromise.then(function (res) { - _this2.enabled = true; - return res; - }).catch(function (err) { - _this2.enabled = false; - throw err; - }); - } - } - }, { - key: "disable", - value: function disable() { - if (nativeWakeLock()) { - if (this._wakeLock) { - this._wakeLock.release(); - } - this._wakeLock = null; - } else if (oldIOS()) { - if (this.noSleepTimer) { - console.warn("\n NoSleep now disabled for older iOS devices.\n "); - window.clearInterval(this.noSleepTimer); - this.noSleepTimer = null; - } - } else { - this.noSleepVideo.pause(); - } - this.enabled = false; - } - }, { - key: "isEnabled", - get: function get() { - return this.enabled; - } - }]); - - return NoSleep; -}(); - -module.exports = NoSleep; - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = { - webm: "data:video/webm;base64,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", - mp4: "data:video/mp4;base64,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" -}; - -/***/ }) -/******/ ]); -}); \ No newline at end of file From 8bd2f730684115eca7f10cbde098180de138ad59 Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Tue, 19 Sep 2023 23:50:01 +0000 Subject: [PATCH 5/9] Manually edited package.json --- feedingwebapp/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/feedingwebapp/package.json b/feedingwebapp/package.json index dfadddd3..17da2f27 100644 --- a/feedingwebapp/package.json +++ b/feedingwebapp/package.json @@ -26,6 +26,7 @@ "styled-components": "^5.3.9", "web-vitals": "^2.1.4", "webpack": "^5.82.1", + "nosleep.js" : "^0.12.0", "zustand": "^4.0.0-rc.1" }, "scripts": { From 4dd2164c6932c6737048e6cbe281d9c7580d9538 Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Mon, 25 Sep 2023 03:29:21 +0000 Subject: [PATCH 6/9] Add abort status --- feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx b/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx index d64f3135..4b1f9579 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx @@ -189,6 +189,7 @@ const RobotMotion = (props) => { */ return () => { destroyActionClient(robotMotionAction) + setActionStatus({ actionStatus: ROS_ACTION_STATUS_ABORT }) } }, [callRobotMotionAction, robotMotionAction, feedbackCallback, responseCallback]) From 2da70cfc1827fb560bfe170d7b0684d27dc66bae Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Mon, 25 Sep 2023 18:25:17 +0000 Subject: [PATCH 7/9] Add nosleep in robot motion --- .../Home/MealStates/BiteAcquisitionCheck.jsx | 9 +++ .../src/Pages/Home/MealStates/BiteDone.jsx | 9 +++ .../Pages/Home/MealStates/BiteSelection.jsx | 60 ++++--------------- .../src/Pages/Home/MealStates/PreMeal.jsx | 13 +++- .../src/Pages/Home/MealStates/RobotMotion.jsx | 8 ++- 5 files changed, 46 insertions(+), 53 deletions(-) diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx index 75b7a38f..3b4b3b4b 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx @@ -9,6 +9,9 @@ import '../Home.css' import { useGlobalState, MEAL_STATE } from '../../GlobalState' import { MOVING_STATE_ICON_DICT } from '../../Constants' +// External Library Imports +import NoSleep from 'nosleep.js' + /** * The BiteAcquisitionCheck component appears after the robot has attempted to * acquire a bite, and asks the user whether it succeeded at acquiring the bite. @@ -30,12 +33,16 @@ const BiteAcquisitionCheck = () => { let buttonHeight = isPortrait ? '20vh' : '20vw' let iconWidth = isPortrait ? '28vh' : '28vw' let iconHeight = isPortrait ? '18vh' : '18vw' + // NoSleep object creation + let noSleep = useMemo(() => new NoSleep(), []) /** * Callback function for when the user indicates that the bite acquisition * succeeded. */ const acquisitionSuccess = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! console.log('acquisitionSuccess') setMealState(MEAL_STATE.R_MovingToMouth) }, [setMealState]) @@ -45,6 +52,8 @@ const BiteAcquisitionCheck = () => { * failed. */ const acquisitionFailure = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! console.log('acquisitionFailure') setMealState(MEAL_STATE.R_MovingAbovePlate) }, [setMealState]) diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx index 5332d3ea..7e3fa3fe 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx @@ -9,6 +9,9 @@ import '../Home.css' import { useGlobalState, MEAL_STATE } from '../../GlobalState' import { MOVING_STATE_ICON_DICT } from '../../Constants' +// External Library Imports +import NoSleep from 'nosleep.js' + /** * The BiteDone component appears after the robot has moved to the user's mouth, * and waits for the user to specify that they have finished the bite before @@ -31,11 +34,15 @@ const BiteDone = () => { let buttonHeight = isPortrait ? '20vh' : '20vw' let iconWidth = isPortrait ? '28vh' : '28vw' let iconHeight = isPortrait ? '18vh' : '18vw' + // NoSleep object creation + let noSleep = useMemo(() => new NoSleep(), []) /** * Callback function for when the user wants to move above plate. */ const moveAbovePlate = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingFromMouthToAbovePlate) }, [setMealState]) @@ -43,6 +50,8 @@ const BiteDone = () => { * Callback function for when the user wants to move to resting position. */ const moveToRestingPosition = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingFromMouthToRestingPosition) }, [setMealState]) diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx index 7e570c43..c0d2f504 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx @@ -59,11 +59,6 @@ const BiteSelection = (props) => { let dimension = isPortrait ? 'column' : 'row' // NoSleep object creation let noSleep = useMemo(() => new NoSleep(), []) - // Define wake lock boolean - // let wakeLockEnabled = false - const [wakeLockEnabled, setWakeLockEnabled] = useState(false) - // Wake lock text - const [wakeLockText, setWakeLockText] = useState('Wake lock off') /** * Create a local state variable to store the detected masks, the @@ -109,9 +104,11 @@ const BiteSelection = (props) => { * meal. */ const doneEatingClicked = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! console.log('doneEatingClicked') setMealState(MEAL_STATE.R_StowingArm) - }, [setMealState]) + }, [setMealState, noSleep]) // Get current window size let windowSize = useWindowSize() @@ -120,8 +117,10 @@ const BiteSelection = (props) => { * Callback function for when the user wants to move to mouth position. */ const moveToMouth = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingToMouth) - }, [setMealState]) + }, [setMealState, noSleep]) /** * Callback function for when the user clicks the button for a food item. @@ -134,6 +133,8 @@ const BiteSelection = (props) => { camera_info: actionResult.camera_info, detected_food: actionResult.detected_items[food_i] }) + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_BiteAcquisition) }, [actionResult, setDesiredFoodItem, setMealState] @@ -424,23 +425,6 @@ const BiteSelection = (props) => { ) }, [moveToMouth, moveToMouthImage, textFontSize]) - /** - * Callback function for when the user clicks on the wake lock button. - */ - const wakeLockClicked = useCallback(() => { - if (!wakeLockEnabled) { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! - setWakeLockEnabled(true) - setWakeLockText('Wake lock on') - } else { - console.log('Wake Lock is disabled') - noSleep.disable() // let the screen turn off. - setWakeLockEnabled(false) - setWakeLockText('Wake lock off') - } - }, [setWakeLockEnabled, setWakeLockText, noSleep, wakeLockEnabled]) - /** Get the full page view * * @returns {JSX.Element} the the full page view @@ -458,26 +442,7 @@ const BiteSelection = (props) => { */} - - - { videoParentRef, imageClicked, props.debug, - debugButton, - wakeLockClicked, - wakeLockEnabled, - wakeLockText + debugButton ]) // Render the component @@ -674,4 +636,4 @@ BiteSelection.propTypes = { webVideoServerURL: PropTypes.string.isRequired } -export default BiteSelection +export default BiteSelection \ No newline at end of file diff --git a/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx b/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx index c8197c8a..6b1e16c6 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx @@ -1,5 +1,5 @@ // React Imports -import React, { useCallback } from 'react' +import React, { useCallback, useMemo } from 'react' import Button from 'react-bootstrap/Button' import Row from 'react-bootstrap/Row' @@ -7,6 +7,9 @@ import Row from 'react-bootstrap/Row' import '../Home.css' import { useGlobalState, MEAL_STATE } from '../../GlobalState' +// External Library Imports +import NoSleep from 'nosleep.js' + /** * The PreMeal component appears before the meal starts, and gives the user a * Start Feeding button to initiate feeding. Further, PreMeal is the only meal @@ -23,14 +26,18 @@ const PreMeal = () => { let buttonHeight = '10vh' // Margin let margin = '5vh' + // NoSleep object creation + let noSleep = useMemo(() => new NoSleep(), []) /** * Callback function for when the user decides to start feeding using the app. */ const startFeedingClicked = useCallback(() => { + console.log('Wake Lock is enabled') + noSleep.enable() // keep the screen on! console.log('startFeedingClicked') setMealState(MEAL_STATE.R_MovingAbovePlate) - }, [setMealState]) + }, [setMealState, noSleep]) // Render the component return ( @@ -52,4 +59,4 @@ const PreMeal = () => { ) } -export default PreMeal +export default PreMeal \ No newline at end of file diff --git a/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx b/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx index 4b1f9579..634a4cd3 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx @@ -5,6 +5,8 @@ import Button from 'react-bootstrap/Button' import { View } from 'react-native' // PropTypes is used to validate that the used props are in fact passed to this Component import PropTypes from 'prop-types' +// External Library Imports +import NoSleep from 'nosleep.js' // Local Imports import { useROS, createROSActionClient, callROSAction, cancelROSAction, destroyActionClient } from '../../../ros/ros_helpers' import Footer from '../../Footer/Footer' @@ -69,6 +71,8 @@ const RobotMotion = (props) => { let waitingTextFontSize = isPortrait ? '4.5vh' : '9vh' // Motion text font size let motionTextFontSize = isPortrait ? '3vh' : '6vh' + // NoSleep object creation + let noSleep = useMemo(() => new NoSleep(), []) /** * Create the ROS Action Client. This is re-created every time props.mealState @@ -103,9 +107,11 @@ const RobotMotion = (props) => { * location. */ const robotMotionDone = useCallback(() => { + console.log('Wake Lock is disabled') + noSleep.disable() // let the screen turn off. console.log('robotMotionDone') setMealState(props.nextMealState) - }, [setMealState, props.nextMealState]) + }, [setMealState, props.nextMealState, noSleep]) /** * Callback function for when the action sends a response. It updates the From 9d0727d6c876872b11a3e15f2bb9b2928888fe50 Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Mon, 25 Sep 2023 18:33:45 +0000 Subject: [PATCH 8/9] Add dependency and import for nosleep --- .../src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx | 6 +++--- feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx | 6 +++--- feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx index 3b4b3b4b..851fa31a 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx @@ -1,5 +1,5 @@ // React Imports -import React, { useCallback } from 'react' +import React, { useCallback, useMemo } from 'react' import Button from 'react-bootstrap/Button' import { useMediaQuery } from 'react-responsive' import { View } from 'react-native' @@ -45,7 +45,7 @@ const BiteAcquisitionCheck = () => { noSleep.enable() // keep the screen on! console.log('acquisitionSuccess') setMealState(MEAL_STATE.R_MovingToMouth) - }, [setMealState]) + }, [setMealState, noSleep]) /** * Callback function for when the user indicates that the bite acquisition @@ -56,7 +56,7 @@ const BiteAcquisitionCheck = () => { noSleep.enable() // keep the screen on! console.log('acquisitionFailure') setMealState(MEAL_STATE.R_MovingAbovePlate) - }, [setMealState]) + }, [setMealState, noSleep]) /** * Get the ready for bite text to render. diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx index 7e3fa3fe..f15ed52d 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx @@ -1,5 +1,5 @@ // React Imports -import React, { useCallback } from 'react' +import React, { useCallback, useMemo } from 'react' import Button from 'react-bootstrap/Button' import { useMediaQuery } from 'react-responsive' import { View } from 'react-native' @@ -44,7 +44,7 @@ const BiteDone = () => { console.log('Wake Lock is enabled') noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingFromMouthToAbovePlate) - }, [setMealState]) + }, [setMealState, noSleep]) /** * Callback function for when the user wants to move to resting position. @@ -53,7 +53,7 @@ const BiteDone = () => { console.log('Wake Lock is enabled') noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingFromMouthToRestingPosition) - }, [setMealState]) + }, [setMealState, noSleep]) /** * Get the bite finished text to render. diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx index c0d2f504..74ad6fff 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx @@ -137,7 +137,7 @@ const BiteSelection = (props) => { noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_BiteAcquisition) }, - [actionResult, setDesiredFoodItem, setMealState] + [actionResult, setDesiredFoodItem, setMealState, noSleep] ) /** From c2c9e6235e973ff1f71de801af27c97ea75cf4fa Mon Sep 17 00:00:00 2001 From: Raida Karim Date: Tue, 26 Sep 2023 00:01:48 +0000 Subject: [PATCH 9/9] Add nosleep in only RobotMotion.jsx --- .../Home/MealStates/BiteAcquisitionCheck.jsx | 15 +++------------ .../src/Pages/Home/MealStates/BiteDone.jsx | 15 +++------------ .../Pages/Home/MealStates/BiteSelection.jsx | 19 ++++--------------- .../src/Pages/Home/MealStates/PreMeal.jsx | 13 +++---------- .../src/Pages/Home/MealStates/RobotMotion.jsx | 8 ++++---- 5 files changed, 17 insertions(+), 53 deletions(-) diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx index 851fa31a..75b7a38f 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteAcquisitionCheck.jsx @@ -1,5 +1,5 @@ // React Imports -import React, { useCallback, useMemo } from 'react' +import React, { useCallback } from 'react' import Button from 'react-bootstrap/Button' import { useMediaQuery } from 'react-responsive' import { View } from 'react-native' @@ -9,9 +9,6 @@ import '../Home.css' import { useGlobalState, MEAL_STATE } from '../../GlobalState' import { MOVING_STATE_ICON_DICT } from '../../Constants' -// External Library Imports -import NoSleep from 'nosleep.js' - /** * The BiteAcquisitionCheck component appears after the robot has attempted to * acquire a bite, and asks the user whether it succeeded at acquiring the bite. @@ -33,30 +30,24 @@ const BiteAcquisitionCheck = () => { let buttonHeight = isPortrait ? '20vh' : '20vw' let iconWidth = isPortrait ? '28vh' : '28vw' let iconHeight = isPortrait ? '18vh' : '18vw' - // NoSleep object creation - let noSleep = useMemo(() => new NoSleep(), []) /** * Callback function for when the user indicates that the bite acquisition * succeeded. */ const acquisitionSuccess = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! console.log('acquisitionSuccess') setMealState(MEAL_STATE.R_MovingToMouth) - }, [setMealState, noSleep]) + }, [setMealState]) /** * Callback function for when the user indicates that the bite acquisition * failed. */ const acquisitionFailure = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! console.log('acquisitionFailure') setMealState(MEAL_STATE.R_MovingAbovePlate) - }, [setMealState, noSleep]) + }, [setMealState]) /** * Get the ready for bite text to render. diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx index f15ed52d..5332d3ea 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteDone.jsx @@ -1,5 +1,5 @@ // React Imports -import React, { useCallback, useMemo } from 'react' +import React, { useCallback } from 'react' import Button from 'react-bootstrap/Button' import { useMediaQuery } from 'react-responsive' import { View } from 'react-native' @@ -9,9 +9,6 @@ import '../Home.css' import { useGlobalState, MEAL_STATE } from '../../GlobalState' import { MOVING_STATE_ICON_DICT } from '../../Constants' -// External Library Imports -import NoSleep from 'nosleep.js' - /** * The BiteDone component appears after the robot has moved to the user's mouth, * and waits for the user to specify that they have finished the bite before @@ -34,26 +31,20 @@ const BiteDone = () => { let buttonHeight = isPortrait ? '20vh' : '20vw' let iconWidth = isPortrait ? '28vh' : '28vw' let iconHeight = isPortrait ? '18vh' : '18vw' - // NoSleep object creation - let noSleep = useMemo(() => new NoSleep(), []) /** * Callback function for when the user wants to move above plate. */ const moveAbovePlate = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingFromMouthToAbovePlate) - }, [setMealState, noSleep]) + }, [setMealState]) /** * Callback function for when the user wants to move to resting position. */ const moveToRestingPosition = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingFromMouthToRestingPosition) - }, [setMealState, noSleep]) + }, [setMealState]) /** * Get the bite finished text to render. diff --git a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx index 74ad6fff..3992f09c 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/BiteSelection.jsx @@ -6,9 +6,6 @@ import { View } from 'react-native' // PropTypes is used to validate that the used props are in fact passed to this // Component import PropTypes from 'prop-types' -// External Library Imports -import NoSleep from 'nosleep.js' - // Local Imports import '../Home.css' import { useROS, createROSActionClient, callROSAction, destroyActionClient } from '../../../ros/ros_helpers' @@ -57,8 +54,6 @@ const BiteSelection = (props) => { let textFontSize = isPortrait ? '2.5vh' : '2vw' // Indicator of how to arrange screen elements based on orientation let dimension = isPortrait ? 'column' : 'row' - // NoSleep object creation - let noSleep = useMemo(() => new NoSleep(), []) /** * Create a local state variable to store the detected masks, the @@ -104,11 +99,9 @@ const BiteSelection = (props) => { * meal. */ const doneEatingClicked = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! console.log('doneEatingClicked') setMealState(MEAL_STATE.R_StowingArm) - }, [setMealState, noSleep]) + }, [setMealState]) // Get current window size let windowSize = useWindowSize() @@ -117,10 +110,8 @@ const BiteSelection = (props) => { * Callback function for when the user wants to move to mouth position. */ const moveToMouth = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_MovingToMouth) - }, [setMealState, noSleep]) + }, [setMealState]) /** * Callback function for when the user clicks the button for a food item. @@ -133,11 +124,9 @@ const BiteSelection = (props) => { camera_info: actionResult.camera_info, detected_food: actionResult.detected_items[food_i] }) - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! setMealState(MEAL_STATE.R_BiteAcquisition) }, - [actionResult, setDesiredFoodItem, setMealState, noSleep] + [actionResult, setDesiredFoodItem, setMealState] ) /** @@ -636,4 +625,4 @@ BiteSelection.propTypes = { webVideoServerURL: PropTypes.string.isRequired } -export default BiteSelection \ No newline at end of file +export default BiteSelection diff --git a/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx b/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx index 6b1e16c6..c8197c8a 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/PreMeal.jsx @@ -1,5 +1,5 @@ // React Imports -import React, { useCallback, useMemo } from 'react' +import React, { useCallback } from 'react' import Button from 'react-bootstrap/Button' import Row from 'react-bootstrap/Row' @@ -7,9 +7,6 @@ import Row from 'react-bootstrap/Row' import '../Home.css' import { useGlobalState, MEAL_STATE } from '../../GlobalState' -// External Library Imports -import NoSleep from 'nosleep.js' - /** * The PreMeal component appears before the meal starts, and gives the user a * Start Feeding button to initiate feeding. Further, PreMeal is the only meal @@ -26,18 +23,14 @@ const PreMeal = () => { let buttonHeight = '10vh' // Margin let margin = '5vh' - // NoSleep object creation - let noSleep = useMemo(() => new NoSleep(), []) /** * Callback function for when the user decides to start feeding using the app. */ const startFeedingClicked = useCallback(() => { - console.log('Wake Lock is enabled') - noSleep.enable() // keep the screen on! console.log('startFeedingClicked') setMealState(MEAL_STATE.R_MovingAbovePlate) - }, [setMealState, noSleep]) + }, [setMealState]) // Render the component return ( @@ -59,4 +52,4 @@ const PreMeal = () => { ) } -export default PreMeal \ No newline at end of file +export default PreMeal diff --git a/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx b/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx index 634a4cd3..4f8008ed 100644 --- a/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx +++ b/feedingwebapp/src/Pages/Home/MealStates/RobotMotion.jsx @@ -107,11 +107,9 @@ const RobotMotion = (props) => { * location. */ const robotMotionDone = useCallback(() => { - console.log('Wake Lock is disabled') - noSleep.disable() // let the screen turn off. console.log('robotMotionDone') setMealState(props.nextMealState) - }, [setMealState, props.nextMealState, noSleep]) + }, [setMealState, props.nextMealState]) /** * Callback function for when the action sends a response. It updates the @@ -188,6 +186,7 @@ const RobotMotion = (props) => { */ useEffect(() => { callRobotMotionAction(feedbackCallback, responseCallback) + noSleep.enable() // keep the screen on! /** * In practice, because the values passed in in the second argument of * useEffect will not change on re-renders, this return statement will @@ -195,9 +194,10 @@ const RobotMotion = (props) => { */ return () => { destroyActionClient(robotMotionAction) + noSleep.disable() // let the screen turn off. setActionStatus({ actionStatus: ROS_ACTION_STATUS_ABORT }) } - }, [callRobotMotionAction, robotMotionAction, feedbackCallback, responseCallback]) + }, [callRobotMotionAction, robotMotionAction, feedbackCallback, responseCallback, noSleep]) /** * Callback function for when the resume button is pressed. It calls the