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";
+
+const valueToPercentage = (value) => `${Math.round(value / 255 * 100)}%`;
class DemoController extends Component {
-
- render() {
+ 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.
+
+
+
)
}
-
}
-export default withStyles(styles)(DemoController);
+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 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();
}