Implemented: led pages

pull/193/head
Karai Csaba 9 years ago committed by Thorsten von Eicken
parent 680edf931b
commit d2764573d2
  1. 99
      examples/arduino/EspLinkSample/EspLinkSample.ino
  2. 192
      examples/arduino/EspLinkSample/LedPage.ino
  3. 10
      examples/arduino/EspLinkSample/Pages.h
  4. 16
      examples/arduino/EspLinkSample/WebServer.cpp
  5. 1
      examples/arduino/EspLinkSample/WebServer.h

@ -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;
}
}
}
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;
ledLoop();
}
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;
}
}

@ -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;
}
}

@ -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);

Loading…
Cancel
Save