delete unneccessary ui elements
use uint_8 for all index types fix some minor errors
This commit is contained in:
parent
d44f3bbb06
commit
6d06bf103e
@ -13,8 +13,8 @@ build_flags =
|
|||||||
|
|
||||||
; Access point settings
|
; Access point settings
|
||||||
-D FACTORY_AP_PROVISION_MODE=AP_MODE_DISCONNECTED
|
-D FACTORY_AP_PROVISION_MODE=AP_MODE_DISCONNECTED
|
||||||
-D FACTORY_AP_SSID=\"ESP8266-React-#{unique_id}\" ; 1-64 characters, supports placeholders
|
-D FACTORY_AP_SSID=\"WordClock-#{unique_id}\" ; 1-64 characters, supports placeholders
|
||||||
-D FACTORY_AP_PASSWORD=\"esp-react\" ; 8-64 characters
|
-D FACTORY_AP_PASSWORD=\"wordclock\" ; 8-64 characters
|
||||||
-D FACTORY_AP_CHANNEL=1
|
-D FACTORY_AP_CHANNEL=1
|
||||||
-D FACTORY_AP_SSID_HIDDEN=false
|
-D FACTORY_AP_SSID_HIDDEN=false
|
||||||
-D FACTORY_AP_MAX_CLIENTS=4
|
-D FACTORY_AP_MAX_CLIENTS=4
|
||||||
@ -30,7 +30,7 @@ build_flags =
|
|||||||
|
|
||||||
; NTP settings
|
; NTP settings
|
||||||
-D FACTORY_NTP_ENABLED=true
|
-D FACTORY_NTP_ENABLED=true
|
||||||
-D FACTORY_NTP_TIME_ZONE_LABEL=\"Europe/London\"
|
-D FACTORY_NTP_TIME_ZONE_LABEL=\"Europe/Vienna\"
|
||||||
-D FACTORY_NTP_TIME_ZONE_FORMAT=\"GMT0BST,M3.5.0/1,M10.5.0\"
|
-D FACTORY_NTP_TIME_ZONE_FORMAT=\"GMT0BST,M3.5.0/1,M10.5.0\"
|
||||||
-D FACTORY_NTP_SERVER=\"time.google.com\"
|
-D FACTORY_NTP_SERVER=\"time.google.com\"
|
||||||
|
|
||||||
|
@ -8,9 +8,7 @@ import { MenuAppBar } from '../components';
|
|||||||
import { AuthenticatedRoute } from '../authentication';
|
import { AuthenticatedRoute } from '../authentication';
|
||||||
|
|
||||||
import DemoInformation from './DemoInformation';
|
import DemoInformation from './DemoInformation';
|
||||||
import LightStateRestController from './LightStateRestController';
|
|
||||||
import LightStateWebSocketController from './LightStateWebSocketController';
|
import LightStateWebSocketController from './LightStateWebSocketController';
|
||||||
import LightMqttSettingsController from './LightMqttSettingsController';
|
|
||||||
|
|
||||||
class DemoProject extends Component<RouteComponentProps> {
|
class DemoProject extends Component<RouteComponentProps> {
|
||||||
|
|
||||||
@ -20,18 +18,14 @@ class DemoProject extends Component<RouteComponentProps> {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<MenuAppBar sectionTitle="Demo Project">
|
<MenuAppBar sectionTitle="WordClock">
|
||||||
<Tabs value={this.props.match.url} onChange={this.handleTabChange} variant="fullWidth">
|
<Tabs value={this.props.match.url} onChange={this.handleTabChange} variant="fullWidth">
|
||||||
<Tab value={`/${PROJECT_PATH}/demo/information`} label="Information" />
|
<Tab value={`/${PROJECT_PATH}/demo/information`} label="Information" />
|
||||||
<Tab value={`/${PROJECT_PATH}/demo/rest`} label="REST Controller" />
|
<Tab value={`/${PROJECT_PATH}/demo/socket`} label="Settings" />
|
||||||
<Tab value={`/${PROJECT_PATH}/demo/socket`} label="WebSocket Controller" />
|
|
||||||
<Tab value={`/${PROJECT_PATH}/demo/mqtt`} label="MQTT Controller" />
|
|
||||||
</Tabs>
|
</Tabs>
|
||||||
<Switch>
|
<Switch>
|
||||||
<AuthenticatedRoute exact path={`/${PROJECT_PATH}/demo/information`} component={DemoInformation} />
|
<AuthenticatedRoute exact path={`/${PROJECT_PATH}/demo/information`} component={DemoInformation} />
|
||||||
<AuthenticatedRoute exact path={`/${PROJECT_PATH}/demo/rest`} component={LightStateRestController} />
|
|
||||||
<AuthenticatedRoute exact path={`/${PROJECT_PATH}/demo/socket`} component={LightStateWebSocketController} />
|
<AuthenticatedRoute exact path={`/${PROJECT_PATH}/demo/socket`} component={LightStateWebSocketController} />
|
||||||
<AuthenticatedRoute exact path={`/${PROJECT_PATH}/demo/mqtt`} component={LightMqttSettingsController} />
|
|
||||||
<Redirect to={`/${PROJECT_PATH}/demo/information`} />
|
<Redirect to={`/${PROJECT_PATH}/demo/information`} />
|
||||||
</Switch>
|
</Switch>
|
||||||
</MenuAppBar>
|
</MenuAppBar>
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
import React, { Component } from 'react';
|
|
||||||
import { ValidatorForm, TextValidator } from 'react-material-ui-form-validator';
|
|
||||||
|
|
||||||
import { Typography, Box } from '@material-ui/core';
|
|
||||||
import SaveIcon from '@material-ui/icons/Save';
|
|
||||||
|
|
||||||
import { ENDPOINT_ROOT } from '../api';
|
|
||||||
import { restController, RestControllerProps, RestFormLoader, RestFormProps, FormActions, FormButton, SectionContent } from '../components';
|
|
||||||
|
|
||||||
import { LightMqttSettings } from './types';
|
|
||||||
|
|
||||||
export const LIGHT_BROKER_SETTINGS_ENDPOINT = ENDPOINT_ROOT + "brokerSettings";
|
|
||||||
|
|
||||||
type LightMqttSettingsControllerProps = RestControllerProps<LightMqttSettings>;
|
|
||||||
|
|
||||||
class LightMqttSettingsController extends Component<LightMqttSettingsControllerProps> {
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.props.loadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<SectionContent title='MQTT Controller' titleGutter>
|
|
||||||
<RestFormLoader
|
|
||||||
{...this.props}
|
|
||||||
render={props => (
|
|
||||||
<LightMqttSettingsControllerForm {...props} />
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</SectionContent>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default restController(LIGHT_BROKER_SETTINGS_ENDPOINT, LightMqttSettingsController);
|
|
||||||
|
|
||||||
type LightMqttSettingsControllerFormProps = RestFormProps<LightMqttSettings>;
|
|
||||||
|
|
||||||
function LightMqttSettingsControllerForm(props: LightMqttSettingsControllerFormProps) {
|
|
||||||
const { data, saveData, handleValueChange } = props;
|
|
||||||
return (
|
|
||||||
<ValidatorForm onSubmit={saveData}>
|
|
||||||
<Box bgcolor="primary.main" color="primary.contrastText" p={2} mt={2} mb={2}>
|
|
||||||
<Typography variant="body1">
|
|
||||||
The LED is controllable via MQTT with the demo project designed to work with Home Assistant's auto discovery feature.
|
|
||||||
</Typography>
|
|
||||||
</Box>
|
|
||||||
<TextValidator
|
|
||||||
validators={['required']}
|
|
||||||
errorMessages={['Unique ID is required']}
|
|
||||||
name="unique_id"
|
|
||||||
label="Unique ID"
|
|
||||||
fullWidth
|
|
||||||
variant="outlined"
|
|
||||||
value={data.unique_id}
|
|
||||||
onChange={handleValueChange('unique_id')}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
<TextValidator
|
|
||||||
validators={['required']}
|
|
||||||
errorMessages={['Name is required']}
|
|
||||||
name="name"
|
|
||||||
label="Name"
|
|
||||||
fullWidth
|
|
||||||
variant="outlined"
|
|
||||||
value={data.name}
|
|
||||||
onChange={handleValueChange('name')}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
<TextValidator
|
|
||||||
validators={['required']}
|
|
||||||
errorMessages={['MQTT Path is required']}
|
|
||||||
name="mqtt_path"
|
|
||||||
label="MQTT Path"
|
|
||||||
fullWidth
|
|
||||||
variant="outlined"
|
|
||||||
value={data.mqtt_path}
|
|
||||||
onChange={handleValueChange('mqtt_path')}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
<FormActions>
|
|
||||||
<FormButton startIcon={<SaveIcon />} variant="contained" color="primary" type="submit">
|
|
||||||
Save
|
|
||||||
</FormButton>
|
|
||||||
</FormActions>
|
|
||||||
</ValidatorForm>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
import React, { Component } from 'react';
|
|
||||||
import { ValidatorForm } from 'react-material-ui-form-validator';
|
|
||||||
|
|
||||||
import { Typography, Box, Checkbox } from '@material-ui/core';
|
|
||||||
import SaveIcon from '@material-ui/icons/Save';
|
|
||||||
|
|
||||||
import { ENDPOINT_ROOT } from '../api';
|
|
||||||
import { restController, RestControllerProps, RestFormLoader, RestFormProps, FormActions, FormButton, SectionContent, BlockFormControlLabel } from '../components';
|
|
||||||
|
|
||||||
import { LightState } from './types';
|
|
||||||
|
|
||||||
export const LIGHT_SETTINGS_ENDPOINT = ENDPOINT_ROOT + "lightState";
|
|
||||||
|
|
||||||
type LightStateRestControllerProps = RestControllerProps<LightState>;
|
|
||||||
|
|
||||||
class LightStateRestController extends Component<LightStateRestControllerProps> {
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.props.loadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<SectionContent title='REST Controller' titleGutter>
|
|
||||||
<RestFormLoader
|
|
||||||
{...this.props}
|
|
||||||
render={props => (
|
|
||||||
<LightStateRestControllerForm {...props} />
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</SectionContent>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default restController(LIGHT_SETTINGS_ENDPOINT, LightStateRestController);
|
|
||||||
|
|
||||||
type LightStateRestControllerFormProps = RestFormProps<LightState>;
|
|
||||||
|
|
||||||
function LightStateRestControllerForm(props: LightStateRestControllerFormProps) {
|
|
||||||
const { data, saveData, handleValueChange } = props;
|
|
||||||
return (
|
|
||||||
<ValidatorForm onSubmit={saveData}>
|
|
||||||
<Box bgcolor="primary.main" color="primary.contrastText" p={2} mt={2} mb={2}>
|
|
||||||
<Typography variant="body1">
|
|
||||||
The form below controls the LED via the RESTful service exposed by the ESP device.
|
|
||||||
</Typography>
|
|
||||||
</Box>
|
|
||||||
<BlockFormControlLabel
|
|
||||||
control={
|
|
||||||
<Checkbox
|
|
||||||
checked={data.led_on}
|
|
||||||
onChange={handleValueChange('led_on')}
|
|
||||||
color="primary"
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
label="LED State?"
|
|
||||||
/>
|
|
||||||
<FormActions>
|
|
||||||
<FormButton startIcon={<SaveIcon />} variant="contained" color="primary" type="submit">
|
|
||||||
Save
|
|
||||||
</FormButton>
|
|
||||||
</FormActions>
|
|
||||||
</ValidatorForm>
|
|
||||||
);
|
|
||||||
}
|
|
@ -16,7 +16,7 @@ class ProjectMenu extends Component<RouteComponentProps> {
|
|||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
<SettingsRemoteIcon />
|
<SettingsRemoteIcon />
|
||||||
</ListItemIcon>
|
</ListItemIcon>
|
||||||
<ListItemText primary="Demo Project" />
|
<ListItemText primary="WordClock" />
|
||||||
</ListItem>
|
</ListItem>
|
||||||
</List>
|
</List>
|
||||||
)
|
)
|
||||||
|
@ -1,9 +1,3 @@
|
|||||||
export interface LightState {
|
export interface LightState {
|
||||||
led_on: boolean;
|
led_on: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LightMqttSettings {
|
|
||||||
unique_id : string;
|
|
||||||
name: string;
|
|
||||||
mqtt_path : string;
|
|
||||||
}
|
|
@ -13,7 +13,19 @@ void Clock::init() {
|
|||||||
strip.clear();
|
strip.clear();
|
||||||
strip.show();
|
strip.show();
|
||||||
|
|
||||||
refreshTicker.attach(10, [this]() { this->refreshTime(); });
|
turnOn();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clock::turnOff() {
|
||||||
|
strip.clear();
|
||||||
|
strip.show();
|
||||||
|
|
||||||
|
refreshTicker.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clock::turnOn() {
|
||||||
|
if (!refreshTicker.active())
|
||||||
|
refreshTicker.attach(10, [this]() { this->refreshTime(); });
|
||||||
this->refreshTime();
|
this->refreshTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,7 +34,7 @@ void Clock::paintAllwaysOnLeds() {
|
|||||||
printWord(types::ist, Adafruit_NeoPixel::Color(150, 0, 150));
|
printWord(types::ist, Adafruit_NeoPixel::Color(150, 0, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clock::printWord(std::vector<int> word, uint32_t color) {
|
void Clock::printWord(const std::vector<uint8_t>& word, uint32_t color) {
|
||||||
for (const int i : word) {
|
for (const int i : word) {
|
||||||
strip.setPixelColor(i, color);
|
strip.setPixelColor(i, color);
|
||||||
}
|
}
|
||||||
@ -46,12 +58,7 @@ void Clock::refreshTime() {
|
|||||||
paintAllwaysOnLeds();
|
paintAllwaysOnLeds();
|
||||||
setTime(hour, minute);
|
setTime(hour, minute);
|
||||||
strip.show();
|
strip.show();
|
||||||
|
Serial.printf("Time now: %sh %sM", &hour, &minute);
|
||||||
Serial.print("time now: ");
|
|
||||||
Serial.print(hour);
|
|
||||||
Serial.print("h ");
|
|
||||||
Serial.print(minute);
|
|
||||||
Serial.println("M");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clock::setTime(uint8_t hour, uint8_t minute) {
|
void Clock::setTime(uint8_t hour, uint8_t minute) {
|
||||||
@ -65,11 +72,10 @@ void Clock::setTime(uint8_t hour, uint8_t minute) {
|
|||||||
if (hour >= 12)
|
if (hour >= 12)
|
||||||
hour = hour - 12;
|
hour = hour - 12;
|
||||||
|
|
||||||
std::vector<int> hourWord;
|
std::vector<uint8_t> hourWord;
|
||||||
|
hourWord = hour == 1 ? (minuteselector == 0 ? types::ein : types::eins) // eins only on a full hour
|
||||||
hourWord = hour == 1 ? types::ein
|
|
||||||
: hour == 2 ? types::zwei
|
: hour == 2 ? types::zwei
|
||||||
: hour == 3 ? types::drei
|
: hour == 3 ? types::drei2
|
||||||
: hour == 4 ? types::vier
|
: hour == 4 ? types::vier
|
||||||
: hour == 5 ? types::fuenf2
|
: hour == 5 ? types::fuenf2
|
||||||
: hour == 6 ? types::sechs
|
: hour == 6 ? types::sechs
|
||||||
@ -84,7 +90,7 @@ void Clock::setTime(uint8_t hour, uint8_t minute) {
|
|||||||
printWord(hourWord, Adafruit_NeoPixel::Color(0, 150, 0));
|
printWord(hourWord, Adafruit_NeoPixel::Color(0, 150, 0));
|
||||||
|
|
||||||
// fuenf / zehn / viertl word
|
// fuenf / zehn / viertl word
|
||||||
std::vector<int> minuteWord;
|
std::vector<uint8_t> minuteWord;
|
||||||
if (minuteselector == 1 || minuteselector == 5 || minuteselector == 7 || minuteselector == 11)
|
if (minuteselector == 1 || minuteselector == 5 || minuteselector == 7 || minuteselector == 11)
|
||||||
minuteWord = types::fuenf;
|
minuteWord = types::fuenf;
|
||||||
else if (minuteselector == 2 || minuteselector == 4 || minuteselector == 8 || minuteselector == 10)
|
else if (minuteselector == 2 || minuteselector == 4 || minuteselector == 8 || minuteselector == 10)
|
||||||
@ -99,7 +105,7 @@ void Clock::setTime(uint8_t hour, uint8_t minute) {
|
|||||||
printWord(minuteWord, Adafruit_NeoPixel::Color(0, 150, 0));
|
printWord(minuteWord, Adafruit_NeoPixel::Color(0, 150, 0));
|
||||||
|
|
||||||
// vor / nach
|
// vor / nach
|
||||||
std::vector<int> vornachWord;
|
std::vector<uint8_t> vornachWord;
|
||||||
if (minuteselector == 1 || minuteselector == 2 || minuteselector == 3 || minuteselector == 7 || minuteselector == 8)
|
if (minuteselector == 1 || minuteselector == 2 || minuteselector == 3 || minuteselector == 7 || minuteselector == 8)
|
||||||
vornachWord = types::nach;
|
vornachWord = types::nach;
|
||||||
else if (minuteselector == 4 || minuteselector == 5 || minuteselector == 10 || minuteselector == 11)
|
else if (minuteselector == 4 || minuteselector == 5 || minuteselector == 10 || minuteselector == 11)
|
||||||
|
@ -18,13 +18,16 @@ class Clock {
|
|||||||
LoadAnimator animator;
|
LoadAnimator animator;
|
||||||
|
|
||||||
void paintAllwaysOnLeds();
|
void paintAllwaysOnLeds();
|
||||||
void printWord(std::vector<int> word, uint32_t color);
|
void printWord(const std::vector<uint8_t>& word, uint32_t color);
|
||||||
void setTime(uint8_t hour, uint8_t minute);
|
void setTime(uint8_t hour, uint8_t minute);
|
||||||
|
|
||||||
|
void refreshTime();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Clock();
|
Clock();
|
||||||
void init();
|
void init();
|
||||||
void refreshTime();
|
void turnOff();
|
||||||
|
void turnOn();
|
||||||
|
|
||||||
Ticker refreshTicker;
|
Ticker refreshTicker;
|
||||||
};
|
};
|
||||||
|
@ -5,34 +5,36 @@
|
|||||||
#include "ClockService.h"
|
#include "ClockService.h"
|
||||||
|
|
||||||
ClockService::ClockService(AsyncWebServer* server, SecurityManager* securityManager) :
|
ClockService::ClockService(AsyncWebServer* server, SecurityManager* securityManager) :
|
||||||
_httpEndpoint(LightState::read,
|
_httpEndpoint(WordClockState::read,
|
||||||
LightState::update,
|
WordClockState::update,
|
||||||
this,
|
this,
|
||||||
server,
|
server,
|
||||||
LIGHT_SETTINGS_ENDPOINT_PATH,
|
LIGHT_SETTINGS_ENDPOINT_PATH,
|
||||||
securityManager,
|
securityManager,
|
||||||
AuthenticationPredicates::IS_AUTHENTICATED),
|
AuthenticationPredicates::IS_AUTHENTICATED),
|
||||||
_webSocket(LightState::read,
|
_webSocket(WordClockState::read,
|
||||||
LightState::update,
|
WordClockState::update,
|
||||||
this,
|
this,
|
||||||
server,
|
server,
|
||||||
LIGHT_SETTINGS_SOCKET_PATH,
|
LIGHT_SETTINGS_SOCKET_PATH,
|
||||||
securityManager,
|
securityManager,
|
||||||
AuthenticationPredicates::IS_AUTHENTICATED),
|
AuthenticationPredicates::IS_AUTHENTICATED),
|
||||||
clock() {
|
clock() {
|
||||||
// configure led to be output
|
|
||||||
pinMode(LED_PIN, OUTPUT);
|
|
||||||
|
|
||||||
// configure settings service update handler to update LED state
|
// configure settings service update handler to update LED state
|
||||||
addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false);
|
addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockService::begin() {
|
void ClockService::begin() {
|
||||||
_state.ledOn = DEFAULT_LED_STATE;
|
_state.wordClockOn = DEFAULT_CLOCK_STATE;
|
||||||
onConfigUpdated();
|
onConfigUpdated();
|
||||||
clock.init();
|
clock.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockService::onConfigUpdated() {
|
void ClockService::onConfigUpdated() {
|
||||||
digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF);
|
// digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF);
|
||||||
|
if (_state.wordClockOn) {
|
||||||
|
clock.turnOn();
|
||||||
|
} else {
|
||||||
|
clock.turnOff();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,48 +9,39 @@
|
|||||||
#include <WebSocketTxRx.h>
|
#include <WebSocketTxRx.h>
|
||||||
#include "Clock.h"
|
#include "Clock.h"
|
||||||
|
|
||||||
#define LED_PIN 2
|
#define DEFAULT_CLOCK_STATE true
|
||||||
#define PRINT_DELAY 5000
|
|
||||||
|
|
||||||
#define DEFAULT_LED_STATE false
|
|
||||||
#define OFF_STATE "OFF"
|
#define OFF_STATE "OFF"
|
||||||
#define ON_STATE "ON"
|
#define ON_STATE "ON"
|
||||||
|
|
||||||
// Note that the built-in LED is on when the pin is low on most NodeMCU boards.
|
#define CLOCK_ON 0x1
|
||||||
// This is because the anode is tied to VCC and the cathode to the GPIO 4 (Arduino pin 2).
|
#define CLOCK_OFF 0x0
|
||||||
#ifdef ESP32
|
|
||||||
#define LED_ON 0x1
|
|
||||||
#define LED_OFF 0x0
|
|
||||||
#elif defined(ESP8266)
|
|
||||||
#define LED_ON 0x0
|
|
||||||
#define LED_OFF 0x1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LIGHT_SETTINGS_ENDPOINT_PATH "/rest/lightState"
|
#define LIGHT_SETTINGS_ENDPOINT_PATH "/rest/lightState"
|
||||||
#define LIGHT_SETTINGS_SOCKET_PATH "/ws/lightState"
|
#define LIGHT_SETTINGS_SOCKET_PATH "/ws/lightState"
|
||||||
|
|
||||||
class LightState {
|
class WordClockState {
|
||||||
public:
|
public:
|
||||||
bool ledOn;
|
bool wordClockOn;
|
||||||
|
|
||||||
static void read(LightState& settings, JsonObject& root) {
|
static void read(WordClockState& settings, JsonObject& root) {
|
||||||
root["led_on"] = settings.ledOn;
|
root["led_on"] = settings.wordClockOn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static StateUpdateResult update(JsonObject& root, LightState& lightState) {
|
static StateUpdateResult update(JsonObject& root, WordClockState& lightState) {
|
||||||
boolean newState = root["led_on"] | DEFAULT_LED_STATE;
|
boolean newState = root["led_on"] | DEFAULT_CLOCK_STATE;
|
||||||
if (lightState.ledOn != newState) {
|
if (lightState.wordClockOn != newState) {
|
||||||
lightState.ledOn = newState;
|
lightState.wordClockOn = newState;
|
||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
}
|
}
|
||||||
return StateUpdateResult::UNCHANGED;
|
return StateUpdateResult::UNCHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void haRead(LightState& settings, JsonObject& root) {
|
static void haRead(WordClockState& settings, JsonObject& root) {
|
||||||
root["state"] = settings.ledOn ? ON_STATE : OFF_STATE;
|
root["state"] = settings.wordClockOn ? ON_STATE : OFF_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static StateUpdateResult haUpdate(JsonObject& root, LightState& lightState) {
|
static StateUpdateResult haUpdate(JsonObject& root, WordClockState& lightState) {
|
||||||
String state = root["state"];
|
String state = root["state"];
|
||||||
// parse new led state
|
// parse new led state
|
||||||
boolean newState = false;
|
boolean newState = false;
|
||||||
@ -60,22 +51,22 @@ class LightState {
|
|||||||
return StateUpdateResult::ERROR;
|
return StateUpdateResult::ERROR;
|
||||||
}
|
}
|
||||||
// change the new state, if required
|
// change the new state, if required
|
||||||
if (lightState.ledOn != newState) {
|
if (lightState.wordClockOn != newState) {
|
||||||
lightState.ledOn = newState;
|
lightState.wordClockOn = newState;
|
||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
}
|
}
|
||||||
return StateUpdateResult::UNCHANGED;
|
return StateUpdateResult::UNCHANGED;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ClockService : public StatefulService<LightState> {
|
class ClockService : public StatefulService<WordClockState> {
|
||||||
public:
|
public:
|
||||||
ClockService(AsyncWebServer* server, SecurityManager* securityManager);
|
ClockService(AsyncWebServer* server, SecurityManager* securityManager);
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HttpEndpoint<LightState> _httpEndpoint;
|
HttpEndpoint<WordClockState> _httpEndpoint;
|
||||||
WebSocketTxRx<LightState> _webSocket;
|
WebSocketTxRx<WordClockState> _webSocket;
|
||||||
|
|
||||||
Clock clock;
|
Clock clock;
|
||||||
|
|
||||||
|
@ -4,32 +4,32 @@
|
|||||||
|
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
|
||||||
const std::vector<int> types::es = calcPixels(0, 0, 2);
|
const std::vector<uint8_t> types::es = calcPixels(0, 0, 2);
|
||||||
const std::vector<int> types::ist = calcPixels(3, 0, 3);
|
const std::vector<uint8_t> types::ist = calcPixels(3, 0, 3);
|
||||||
const std::vector<int> types::fuenf = calcPixels(8, 0, 4);
|
const std::vector<uint8_t> types::fuenf = calcPixels(8, 0, 4);
|
||||||
const std::vector<int> types::zehn = calcPixels(0, 1, 4);
|
const std::vector<uint8_t> types::zehn = calcPixels(0, 1, 4);
|
||||||
const std::vector<int> types::zwanzig = calcPixels(5, 1, 7);
|
const std::vector<uint8_t> types::zwanzig = calcPixels(5, 1, 7);
|
||||||
const std::vector<int> types::drei = calcPixels(1, 2, 3);
|
const std::vector<uint8_t> types::drei = calcPixels(1, 2, 4);
|
||||||
const std::vector<int> types::viertel = calcPixels(5, 2, 7);
|
const std::vector<uint8_t> types::viertel = calcPixels(5, 2, 7);
|
||||||
const std::vector<int> types::dreiviertel = calcPixels(1, 2, 11);
|
const std::vector<uint8_t> types::dreiviertel = calcPixels(1, 2, 11);
|
||||||
const std::vector<int> types::vor = calcPixels(0, 3, 3);
|
const std::vector<uint8_t> types::vor = calcPixels(0, 3, 3);
|
||||||
const std::vector<int> types::nach = calcPixels(3, 3, 4);
|
const std::vector<uint8_t> types::nach = calcPixels(3, 3, 4);
|
||||||
const std::vector<int> types::halb = calcPixels(8, 3, 4);
|
const std::vector<uint8_t> types::halb = calcPixels(8, 3, 4);
|
||||||
const std::vector<int> types::zwoelf = calcPixels(0, 4, 5);
|
const std::vector<uint8_t> types::zwoelf = calcPixels(0, 4, 5);
|
||||||
const std::vector<int> types::sieben = calcPixels(6, 4, 6);
|
const std::vector<uint8_t> types::sieben = calcPixels(6, 4, 6);
|
||||||
const std::vector<int> types::ein = calcPixels(0, 5, 3);
|
const std::vector<uint8_t> types::ein = calcPixels(0, 5, 3);
|
||||||
const std::vector<int> types::eins = calcPixels(0, 5, 4);
|
const std::vector<uint8_t> types::eins = calcPixels(0, 5, 4);
|
||||||
const std::vector<int> types::vier = calcPixels(4, 5, 4);
|
const std::vector<uint8_t> types::vier = calcPixels(4, 5, 4);
|
||||||
const std::vector<int> types::acht = calcPixels(8, 5, 4);
|
const std::vector<uint8_t> types::acht = calcPixels(8, 5, 4);
|
||||||
const std::vector<int> types::sechs = calcPixels(0, 6, 5);
|
const std::vector<uint8_t> types::sechs = calcPixels(0, 6, 5);
|
||||||
const std::vector<int> types::zwei = calcPixels(6, 6, 5);
|
const std::vector<uint8_t> types::zwei = calcPixels(6, 6, 4);
|
||||||
const std::vector<int> types::fuenf2 = calcPixels(1, 7, 5);
|
const std::vector<uint8_t> types::fuenf2 = calcPixels(1, 7, 4);
|
||||||
const std::vector<int> types::elf = calcPixels(5, 7, 3);
|
const std::vector<uint8_t> types::elf = calcPixels(5, 7, 3);
|
||||||
const std::vector<int> types::zehn2 = calcPixels(8, 7, 4);
|
const std::vector<uint8_t> types::zehn2 = calcPixels(8, 7, 4);
|
||||||
const std::vector<int> types::neun = calcPixels(0, 8, 4);
|
const std::vector<uint8_t> types::neun = calcPixels(0, 8, 4);
|
||||||
const std::vector<int> types::drei2 = calcPixels(4, 8, 4);
|
const std::vector<uint8_t> types::drei2 = calcPixels(4, 8, 4);
|
||||||
const std::vector<int> types::ein2 = calcPixels(6, 8, 3);
|
const std::vector<uint8_t> types::ein2 = calcPixels(6, 8, 3);
|
||||||
const std::vector<int> types::uhr = calcPixels(9, 8, 3);
|
const std::vector<uint8_t> types::uhr = calcPixels(9, 8, 3);
|
||||||
|
|
||||||
uint8_t types::convert(uint8_t x, uint8_t y) {
|
uint8_t types::convert(uint8_t x, uint8_t y) {
|
||||||
const bool upRow = (x % 2) == 0;
|
const bool upRow = (x % 2) == 0;
|
||||||
@ -42,8 +42,8 @@ uint8_t types::convert(uint8_t x, uint8_t y) {
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> types::calcPixels(uint8_t x, uint8_t y, uint8_t nrPixels) {
|
std::vector<uint8_t> types::calcPixels(uint8_t x, uint8_t y, uint8_t nrPixels) {
|
||||||
std::vector<int> vec;
|
std::vector<uint8_t> vec;
|
||||||
for (uint8_t i = 0; i < nrPixels; i++) {
|
for (uint8_t i = 0; i < nrPixels; i++) {
|
||||||
vec.push_back(convert(x + i, y));
|
vec.push_back(convert(x + i, y));
|
||||||
}
|
}
|
||||||
|
17
src/Types.h
17
src/Types.h
@ -8,7 +8,7 @@
|
|||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
|
||||||
struct types {
|
struct types {
|
||||||
static const std::vector<int>
|
static const std::vector<uint8_t>
|
||||||
es, ist, fuenf,
|
es, ist, fuenf,
|
||||||
zehn, zwanzig, drei,
|
zehn, zwanzig, drei,
|
||||||
viertel, dreiviertel, vor,
|
viertel, dreiviertel, vor,
|
||||||
@ -19,9 +19,22 @@ struct types {
|
|||||||
zehn2, neun, drei2,
|
zehn2, neun, drei2,
|
||||||
ein2, uhr;
|
ein2, uhr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert an x/y coordinate into the corresponding strip index value
|
||||||
|
* @param x x axis value
|
||||||
|
* @param y y axis value
|
||||||
|
* @return strip led index (zero beginning)
|
||||||
|
*/
|
||||||
static uint8_t convert(uint8_t x, uint8_t y);
|
static uint8_t convert(uint8_t x, uint8_t y);
|
||||||
|
|
||||||
static std::vector<int> calcPixels(uint8_t x, uint8_t y, uint8_t nrPixels);
|
/**
|
||||||
|
* calculate all pixels within a pixelrange for a word
|
||||||
|
* @param x x axis value
|
||||||
|
* @param y y axis value
|
||||||
|
* @param nrPixels number of pixels the word contains
|
||||||
|
* @return array of strip indexes
|
||||||
|
*/
|
||||||
|
static std::vector<uint8_t> calcPixels(uint8_t x, uint8_t y, uint8_t nrPixels);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LEDSTRIPINTERFACE_TYPES_H
|
#endif // LEDSTRIPINTERFACE_TYPES_H
|
||||||
|
Loading…
Reference in New Issue
Block a user