mirror of
https://github.com/jeelabs/esp-link.git
synced 2026-03-08 02:06:48 +01:00
Implemented: led pages
This commit is contained in:
committed by
Thorsten von Eicken
parent
680edf931b
commit
d2764573d2
@@ -1,16 +1,6 @@
|
||||
|
||||
#include "WebServer.h"
|
||||
|
||||
#define LED_PIN 13
|
||||
|
||||
int8_t blinking = 0;
|
||||
int8_t frequency = 10;
|
||||
uint8_t pattern = 2;
|
||||
uint16_t elapse = 100;
|
||||
uint16_t elapse_delta = 200;
|
||||
uint32_t next_ts = 0;
|
||||
|
||||
void ledHtmlCallback(WebServerCommand command, char * data, int dataLen);
|
||||
#include "Pages.h"
|
||||
|
||||
const char ledURL[] PROGMEM = "/LED.html.json";
|
||||
|
||||
@@ -26,96 +16,13 @@ void setup()
|
||||
Serial.begin(57600);
|
||||
webServer.init();
|
||||
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
digitalWrite(LED_PIN, false);
|
||||
ledInit();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
webServer.loop();
|
||||
|
||||
if( blinking )
|
||||
{
|
||||
if( next_ts <= millis() )
|
||||
{
|
||||
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
|
||||
next_ts += elapse;
|
||||
elapse = elapse_delta - elapse;
|
||||
}
|
||||
}
|
||||
|
||||
ledLoop();
|
||||
}
|
||||
|
||||
|
||||
void ledHtmlCallback(WebServerCommand command, char * data, int dataLen)
|
||||
{
|
||||
switch(command)
|
||||
{
|
||||
case BUTTON_PRESS:
|
||||
if( strcmp_P(data, PSTR("btn_on") ) == 0 )
|
||||
{
|
||||
blinking = 0;
|
||||
digitalWrite(LED_PIN, true);
|
||||
} else if( strcmp_P(data, PSTR("btn_off") ) == 0 )
|
||||
{
|
||||
blinking = 0;
|
||||
digitalWrite(LED_PIN, false);
|
||||
} else if( strcmp_P(data, PSTR("btn_blink") ) == 0 )
|
||||
{
|
||||
blinking = 1;
|
||||
next_ts = millis() + elapse;
|
||||
}
|
||||
break;
|
||||
case SET_FIELD:
|
||||
if( strcmp_P(data, PSTR("frequency") ) == 0 )
|
||||
{
|
||||
frequency = webServer.getArgInt();
|
||||
digitalWrite(LED_PIN, false);
|
||||
elapse_delta = 2000 / frequency;
|
||||
elapse = pattern * elapse_delta / 4;
|
||||
}
|
||||
else if( strcmp_P(data, PSTR("pattern") ) == 0 )
|
||||
{
|
||||
char * arg = webServer.getArgString();
|
||||
|
||||
if( strcmp_P(arg, PSTR("25_75")) == 0 )
|
||||
pattern = 1;
|
||||
else if( strcmp_P(arg, PSTR("50_50")) == 0 )
|
||||
pattern = 2;
|
||||
else if( strcmp_P(arg, PSTR("75_25")) == 0 )
|
||||
pattern = 3;
|
||||
|
||||
digitalWrite(LED_PIN, false);
|
||||
elapse = pattern * elapse_delta / 4;
|
||||
}
|
||||
break;
|
||||
case LOAD:
|
||||
webServer.setArgNum(3);
|
||||
webServer.setArgInt("frequency", frequency);
|
||||
|
||||
switch(pattern)
|
||||
{
|
||||
case 1:
|
||||
webServer.setArgStringP("pattern", PSTR("25_75"));
|
||||
break;
|
||||
case 2:
|
||||
webServer.setArgStringP("pattern", PSTR("50_50"));
|
||||
break;
|
||||
case 3:
|
||||
webServer.setArgStringP("pattern", PSTR("75_25"));
|
||||
break;
|
||||
}
|
||||
case REFRESH:
|
||||
if( command == REFRESH )
|
||||
webServer.setArgNum(1);
|
||||
|
||||
if( blinking )
|
||||
webServer.setArgStringP("text", PSTR("LED is blinking"));
|
||||
else
|
||||
webServer.setArgStringP("text", digitalRead(LED_PIN) ? PSTR("LED is turned on") : PSTR("LED is turned off"));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
192
examples/arduino/EspLinkSample/LedPage.ino
Normal file
192
examples/arduino/EspLinkSample/LedPage.ino
Normal file
@@ -0,0 +1,192 @@
|
||||
#include "WebServer.h"
|
||||
|
||||
#define LED_PIN 13
|
||||
|
||||
int8_t blinking = 0;
|
||||
int8_t frequency = 10;
|
||||
uint8_t pattern = 2;
|
||||
uint16_t elapse = 100;
|
||||
uint16_t elapse_delta = 200;
|
||||
uint32_t next_ts = 0;
|
||||
|
||||
#define MAX_LOGS 5
|
||||
uint32_t log_ts[MAX_LOGS];
|
||||
uint8_t log_msg[MAX_LOGS];
|
||||
uint8_t log_ptr = 0;
|
||||
|
||||
void ledInit()
|
||||
{
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
digitalWrite(LED_PIN, false);
|
||||
}
|
||||
|
||||
void ledLoop()
|
||||
{
|
||||
if( blinking )
|
||||
{
|
||||
if( next_ts <= millis() )
|
||||
{
|
||||
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
|
||||
next_ts += elapse;
|
||||
elapse = elapse_delta - elapse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ledAddLog(uint8_t msg)
|
||||
{
|
||||
if( log_ptr >= MAX_LOGS )
|
||||
log_ptr = MAX_LOGS - 1;
|
||||
|
||||
for(int8_t i=log_ptr-1; i >= 0; i--)
|
||||
{
|
||||
log_ts[i+1] = log_ts[i];
|
||||
log_msg[i+1] = log_msg[i];
|
||||
}
|
||||
log_msg[0] = msg;
|
||||
log_ts[0] = millis();
|
||||
log_ptr++;
|
||||
}
|
||||
|
||||
void ledHistoryToLog(char * buf)
|
||||
{
|
||||
buf[0] = 0;
|
||||
strcat(buf, "[");
|
||||
for(uint8_t i=0; i < log_ptr; i++)
|
||||
{
|
||||
if( i != 0 )
|
||||
strcat(buf, ",");
|
||||
|
||||
char bf[20];
|
||||
sprintf(bf, "\"%lds: ", log_ts[i] / 1000);
|
||||
strcat(buf, bf);
|
||||
|
||||
uint8_t msg = log_msg[i];
|
||||
if( msg == 0xE1 )
|
||||
{
|
||||
strcat_P(buf, PSTR("set pattern to 25%-75%"));
|
||||
}
|
||||
else if( msg == 0xE2 )
|
||||
{
|
||||
strcat_P(buf, PSTR("set pattern to 50%-50%"));
|
||||
}
|
||||
else if( msg == 0xE3 )
|
||||
{
|
||||
strcat_P(buf, PSTR("set pattern to 75%-25%"));
|
||||
}
|
||||
else if( msg == 0xF0 )
|
||||
{
|
||||
strcat_P(buf, PSTR("set led on"));
|
||||
}
|
||||
else if( msg == 0xF1 )
|
||||
{
|
||||
strcat_P(buf, PSTR("set led blinking"));
|
||||
}
|
||||
else if( msg == 0xF2 )
|
||||
{
|
||||
strcat_P(buf, PSTR("set led off"));
|
||||
}
|
||||
else
|
||||
{
|
||||
strcat_P(buf, PSTR("set frequency to "));
|
||||
sprintf(bf, "%d Hz", msg);
|
||||
strcat(buf, bf);
|
||||
}
|
||||
strcat(buf, "\"");
|
||||
}
|
||||
strcat(buf, "]");
|
||||
}
|
||||
|
||||
|
||||
void ledHtmlCallback(WebServerCommand command, char * data, int dataLen)
|
||||
{
|
||||
switch(command)
|
||||
{
|
||||
case BUTTON_PRESS:
|
||||
if( strcmp_P(data, PSTR("btn_on") ) == 0 )
|
||||
{
|
||||
if( blinking || digitalRead(LED_PIN) == false )
|
||||
ledAddLog(0xF0);
|
||||
blinking = 0;
|
||||
digitalWrite(LED_PIN, true);
|
||||
} else if( strcmp_P(data, PSTR("btn_off") ) == 0 )
|
||||
{
|
||||
if( blinking || digitalRead(LED_PIN) == true )
|
||||
ledAddLog(0xF2);
|
||||
blinking = 0;
|
||||
digitalWrite(LED_PIN, false);
|
||||
} else if( strcmp_P(data, PSTR("btn_blink") ) == 0 )
|
||||
{
|
||||
if( !blinking )
|
||||
ledAddLog(0xF1);
|
||||
blinking = 1;
|
||||
next_ts = millis() + elapse;
|
||||
}
|
||||
break;
|
||||
case SET_FIELD:
|
||||
if( strcmp_P(data, PSTR("frequency") ) == 0 )
|
||||
{
|
||||
int8_t oldf = frequency;
|
||||
frequency = webServer.getArgInt();
|
||||
digitalWrite(LED_PIN, false);
|
||||
elapse_delta = 2000 / frequency;
|
||||
elapse = pattern * elapse_delta / 4;
|
||||
if( oldf != frequency )
|
||||
ledAddLog(frequency);
|
||||
}
|
||||
else if( strcmp_P(data, PSTR("pattern") ) == 0 )
|
||||
{
|
||||
int8_t oldp = pattern;
|
||||
char * arg = webServer.getArgString();
|
||||
|
||||
if( strcmp_P(arg, PSTR("25_75")) == 0 )
|
||||
pattern = 1;
|
||||
else if( strcmp_P(arg, PSTR("50_50")) == 0 )
|
||||
pattern = 2;
|
||||
else if( strcmp_P(arg, PSTR("75_25")) == 0 )
|
||||
pattern = 3;
|
||||
|
||||
digitalWrite(LED_PIN, false);
|
||||
elapse = pattern * elapse_delta / 4;
|
||||
|
||||
if( oldp != pattern )
|
||||
ledAddLog(0xE0 + pattern);
|
||||
}
|
||||
break;
|
||||
case LOAD:
|
||||
webServer.setArgNum(4);
|
||||
webServer.setArgInt("frequency", frequency);
|
||||
|
||||
switch(pattern)
|
||||
{
|
||||
case 1:
|
||||
webServer.setArgStringP("pattern", PSTR("25_75"));
|
||||
break;
|
||||
case 2:
|
||||
webServer.setArgStringP("pattern", PSTR("50_50"));
|
||||
break;
|
||||
case 3:
|
||||
webServer.setArgStringP("pattern", PSTR("75_25"));
|
||||
break;
|
||||
}
|
||||
case REFRESH:
|
||||
{
|
||||
if( command == REFRESH )
|
||||
webServer.setArgNum(2);
|
||||
|
||||
if( blinking )
|
||||
webServer.setArgStringP("text", PSTR("LED is blinking"));
|
||||
else
|
||||
webServer.setArgStringP("text", digitalRead(LED_PIN) ? PSTR("LED is turned on") : PSTR("LED is turned off"));
|
||||
|
||||
char buf[255];
|
||||
ledHistoryToLog(buf);
|
||||
webServer.setArgJson("led_history", buf);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
10
examples/arduino/EspLinkSample/Pages.h
Normal file
10
examples/arduino/EspLinkSample/Pages.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef PAGES_H
|
||||
#define PAGES_H
|
||||
|
||||
void ledHtmlCallback(WebServerCommand command, char * data, int dataLen);
|
||||
void ledLoop();
|
||||
void ledInit();
|
||||
|
||||
#endif /* PAGES_H */
|
||||
|
||||
|
||||
@@ -162,6 +162,22 @@ void WebServer::setArgStringP(const char * name, const char * value)
|
||||
args_to_send--;
|
||||
}
|
||||
|
||||
void WebServer::setArgJson(const char * name, const char * value)
|
||||
{
|
||||
if( args_to_send <= 0 )
|
||||
return;
|
||||
|
||||
uint8_t nlen = strlen(name);
|
||||
uint8_t vlen = strlen(value);
|
||||
char buf[nlen + vlen + 3];
|
||||
buf[0] = WEB_JSON;
|
||||
strcpy(buf+1, name);
|
||||
strcpy(buf+2+nlen, value);
|
||||
espLink.sendPacketArg(nlen+vlen+2, (uint8_t *)buf);
|
||||
|
||||
args_to_send--;
|
||||
}
|
||||
|
||||
void WebServer::setArgInt(const char * name, int32_t value)
|
||||
{
|
||||
if( args_to_send <= 0 )
|
||||
|
||||
@@ -73,6 +73,7 @@ class WebServer
|
||||
|
||||
void setArgNum(uint8_t num);
|
||||
void setArgInt(const char * name, int32_t value);
|
||||
void setArgJson(const char * name, const char * value);
|
||||
void setArgString(const char * name, const char * value);
|
||||
void setArgStringP(const char * name, const char * value);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user