diff --git a/data/config/demoSettings.json b/data/config/demoSettings.json new file mode 100644 index 0000000..a003cd0 --- /dev/null +++ b/data/config/demoSettings.json @@ -0,0 +1,3 @@ +{ + "blink_speed": 100 +} \ No newline at end of file diff --git a/interface/.env.development b/interface/.env.development index ce8e236..ee3479d 100644 --- a/interface/.env.development +++ b/interface/.env.development @@ -1 +1 @@ -REACT_APP_ENDPOINT_ROOT=http://192.168.0.19/rest/ +REACT_APP_ENDPOINT_ROOT=http://192.168.0.20/rest/ diff --git a/interface/src/components/LoadingNotification.js b/interface/src/components/LoadingNotification.js new file mode 100644 index 0000000..5765412 --- /dev/null +++ b/interface/src/components/LoadingNotification.js @@ -0,0 +1,57 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { makeStyles } from '@material-ui/core/styles'; +import Button from '@material-ui/core/Button'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import Typography from '@material-ui/core/Typography'; + +const useStyles = makeStyles(theme => ({ + loadingSettings: { + margin: theme.spacing(0.5), + }, + loadingSettingsDetails: { + margin: theme.spacing(4), + textAlign: "center" + }, + button: { + marginRight: theme.spacing(2), + marginTop: theme.spacing(2), + } +})); + +export default function LoadingNotification(props) { + const classes = useStyles(); + const { fetched, errorMessage, onReset, children } = props; + return ( +
+ { + fetched ? + errorMessage ? +
+ + {errorMessage} + + +
+ : + children + : +
+ + + Loading... + +
+ } +
+ ); +} + +LoadingNotification.propTypes = { + fetched: PropTypes.bool.isRequired, + onReset: PropTypes.func.isRequired, + errorMessage: PropTypes.string +}; diff --git a/interface/src/components/RestComponent.js b/interface/src/components/RestComponent.js index 5fee544..d633761 100644 --- a/interface/src/components/RestComponent.js +++ b/interface/src/components/RestComponent.js @@ -1,6 +1,7 @@ import React from 'react'; import { withSnackbar } from 'notistack'; import { redirectingAuthorizedFetch } from '../authentication/Authentication'; + /* * It is unlikely this application will grow complex enough to require redux. * @@ -86,9 +87,9 @@ export const restComponent = (endpointUrl, FormComponent) => { }); } - handleValueChange = name => event => { + handleValueChange = name => (event, newValue) => { const { data } = this.state; - data[name] = event.target.value; + data[name] = newValue; this.setState({ data }); }; diff --git a/interface/src/containers/SecuritySettings.js b/interface/src/containers/SecuritySettings.js index f6adb11..0ceb890 100644 --- a/interface/src/containers/SecuritySettings.js +++ b/interface/src/containers/SecuritySettings.js @@ -12,16 +12,16 @@ class SecuritySettings extends Component { } render() { - const { data, fetched, errorMessage } = this.props; + const { data, fetched, errorMessage, saveData, loadData, handleValueChange } = this.props; return ( ) diff --git a/interface/src/project/DemoController.js b/interface/src/project/DemoController.js index ea25d31..4a711c5 100644 --- a/interface/src/project/DemoController.js +++ b/interface/src/project/DemoController.js @@ -1,22 +1,78 @@ import React, { Component } from 'react'; - -import { withStyles } from '@material-ui/core/styles'; import SectionContent from '../components/SectionContent'; +import { restComponent } from '../components/RestComponent'; +import LoadingNotification from '../components/LoadingNotification'; -const styles = theme => ({ +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; +import Slider from '@material-ui/core/Slider'; +import { makeStyles } from '@material-ui/core/styles'; +import { ValidatorForm } from 'react-material-ui-form-validator'; -}); +export const DEMO_SETTINGS_ENDPOINT = process.env.REACT_APP_ENDPOINT_ROOT + "demoSettings"; -class DemoController extends Component { +const valueToPercentage = (value) => `${Math.round(value / 255 * 100)}%`; - render() { +class DemoController extends Component { + componentDidMount() { + this.props.loadData(); + } + + render() { + const { data, fetched, errorMessage, saveData, loadData, handleValueChange } = this.props; return ( - TODO - This will contain a form which controls the speed of the built in LED. + + + ) } +} +const useStyles = makeStyles(theme => ({ + button: { + marginRight: theme.spacing(2), + marginTop: theme.spacing(2), + }, + blinkSpeedLabel:{ + marginBottom: theme.spacing(5), + } +})); + +function DemoControllerForm(props) { + const { demoSettings, onSubmit, onReset, handleValueChange } = props; + const classes = useStyles(); + return ( + + + Blink Speed + + + + + + ); } -export default withStyles(styles)(DemoController); +export default restComponent(DEMO_SETTINGS_ENDPOINT, DemoController); diff --git a/interface/src/project/DemoInformation.js b/interface/src/project/DemoInformation.js index 4f59bbf..6d7749e 100644 --- a/interface/src/project/DemoInformation.js +++ b/interface/src/project/DemoInformation.js @@ -7,6 +7,7 @@ import TableCell from '@material-ui/core/TableCell'; import TableBody from '@material-ui/core/TableBody'; import TableRow from '@material-ui/core/TableRow'; import Typography from '@material-ui/core/Typography'; + import SectionContent from '../components/SectionContent'; const styles = theme => ({ diff --git a/interface/src/project/ProjectMenu.js b/interface/src/project/ProjectMenu.js index 9a806b3..721c799 100644 --- a/interface/src/project/ProjectMenu.js +++ b/interface/src/project/ProjectMenu.js @@ -8,7 +8,6 @@ import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; import SettingsRemoteIcon from '@material-ui/icons/SettingsRemote'; -import Divider from '@material-ui/core/Divider'; class ProjectMenu extends Component { diff --git a/platformio.ini b/platformio.ini index 44ee3cf..2bb437d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -7,9 +7,10 @@ ; ; Please visit documentation for the other options and examples ; http://docs.platformio.org/page/projectconf.html -[env:node32s] -platform = espressif32 -board = node32s +[env:esp12e] +platform = espressif8266 +board = esp12e +board_build.f_cpu = 160000000L extra_scripts = pre:timelib_fix.py diff --git a/src/DemoProject.cpp b/src/DemoProject.cpp index e73a1fa..20fc953 100644 --- a/src/DemoProject.cpp +++ b/src/DemoProject.cpp @@ -1,9 +1,25 @@ #include -void DemoProject::begin() { - +void DemoProject::init(AsyncWebServer* server) { + AdminSettingsService::init(server); + pinMode(BLINK_LED, OUTPUT); } void DemoProject::loop() { + unsigned delay = MAX_DELAY / 255 * (255 - _blinkSpeed); + unsigned long currentMillis = millis(); + if (!_lastBlink || (unsigned long)(currentMillis - _lastBlink) >= delay) { + _lastBlink = currentMillis; + digitalWrite(BLINK_LED, !digitalRead(BLINK_LED)); + } +} +void DemoProject::readFromJsonObject(JsonObject& root) { + _blinkSpeed = root["blink_speed"] | DEFAULT_BLINK_SPEED; } + +void DemoProject::writeToJsonObject(JsonObject& root) { + // connection settings + root["blink_speed"] = _blinkSpeed; +} + diff --git a/src/DemoProject.h b/src/DemoProject.h index 81d0f47..7b85111 100644 --- a/src/DemoProject.h +++ b/src/DemoProject.h @@ -1,23 +1,35 @@ #ifndef DemoProject_h #define DemoProject_h -#include -#include +#include -class DemoProject { +#define BLINK_LED 2 +#define MAX_DELAY 1000 + +#define DEFAULT_BLINK_SPEED 100 +#define DEMO_SETTINGS_FILE "/config/demoSettings.json" +#define DEMO_SETTINGS_PATH "/rest/demoSettings" + +class DemoProject : public AdminSettingsService { public: - DemoProject(AsyncWebServer *server, SecurityManager* securityManager) : _server(server), _securityManager(securityManager) {} + DemoProject(FS* fs, SecurityManager* securityManager) : AdminSettingsService(fs, securityManager, DEMO_SETTINGS_PATH, DEMO_SETTINGS_FILE) {} + ~DemoProject() {} - void begin(); + void init(AsyncWebServer* server); void loop(); private: - AsyncWebServer* _server; - SecurityManager* _securityManager; + unsigned long _lastBlink = 0; + uint8_t _blinkSpeed = 255; + + protected: + void readFromJsonObject(JsonObject& root); + void writeToJsonObject(JsonObject& root); + }; #endif diff --git a/src/main.cpp b/src/main.cpp index ddddba7..cda4d75 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,9 +7,10 @@ AsyncWebServer server(80); ESP8266React espServer(&SPIFFS); -DemoProject demoProject = DemoProject(&server, espServer.getSecurityManager()); +DemoProject demoProject = DemoProject(&SPIFFS, espServer.getSecurityManager()); void setup() { + // start serial and filesystem Serial.begin(SERIAL_BAUD_RATE); SPIFFS.begin(); @@ -17,15 +18,16 @@ void setup() { espServer.init(&server); // begin the demo project - demoProject.begin(); + demoProject.init(&server); + // start the server server.begin(); } void loop() { - // run the framework loop + // run the framework's loop function espServer.loop(); - // run the demo project loop + // run the demo project's loop function demoProject.loop(); }