Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Apr 11, 2023
1 parent f80890e commit f6675d1
Show file tree
Hide file tree
Showing 8 changed files with 229 additions and 29 deletions.
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[![Foo](https://img.shields.io/badge/ПОДПИСАТЬСЯ-НА%20ОБНОВЛЕНИЯ-brightgreen.svg?style=social&logo=telegram&color=blue)](https://t.me/GyverLibs)

# GyverPortal
### v3.6 (12.03.2023)
### v3.6.4 (11.04.2023)
Простой конструктор веб интерфейсов для ESP8266 и ESP32
![img](/docs/feature.png)

Expand Down Expand Up @@ -349,6 +349,16 @@
## v3.6.3
- Парсер удержания вынесен в отдельный файл для нужд других библиотек

## v3.6.4
- Добавлено
- system info в графе uptime выводит также дни
- GPlog настройка autoClear(bool), умолч. включена, можно выключить чтобы лог сохранялся
- Пофикшено
- Автоматическое открытие портала при подключении к ESP в режиме AP не работало на некоторых устройствах
- Улучшено
- Все copyStr() - если указана длина, теперь строка записывается, даже если входящая строка длиннее
- GPlog снова работает как кольцевой буфер

<a id="feedback"></a>
## Баги и обратная связь
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [[email protected]](mailto:[email protected])
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=GyverPortal
version=3.6.3
version=3.6.4
author=AlexGyver <[email protected]>
maintainer=AlexGyver <[email protected]>
sentence=Simple web interface builder for esp8266 and ESP32
Expand Down
2 changes: 1 addition & 1 deletion src/builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -1585,7 +1585,7 @@ struct Builder {
AREA_LOG_RAW("GP_log", rows, prd, w);
}
void AREA_LOG(GPlog& log, int rows = 5, int prd = 1000, const String& w = "") {
log.clear();
//log.clear();
AREA_LOG_RAW(log.name, rows, prd, w);
}

Expand Down
66 changes: 46 additions & 20 deletions src/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ class GPlog : public Print {
GPlog(const char* nname) : name(nname) {}

void start(int n = 64) {
if (buffer) delete [] buffer;
head = 0;
stop();
len = head = 0;
size = n;
buffer = new char [size];
}
Expand All @@ -28,45 +28,71 @@ class GPlog : public Print {

// запись в буфер
virtual size_t write(uint8_t n) {
if (buffer && head <= size - 2) {
if (newline) {
newline = 0;
buffer[head++] = '\r';
buffer[head++] = '\n';
}
buffer[head++] = n;
}
/*if (newline) {
newline = 0;
_write('\n');
}*/
_write(n);
return 1;
}

char* read() {
if (buffer[head - 2] == '\r') {
head -= 2;
newline = 1;
String read() {
String s;
if (!len) return s;
s.reserve(len + 1);
if (newline) {
newline = 0;
s += '\n';
}
buffer[head] = '\0';
head = 0;
return buffer;
for (int i = 0; i < len; i++) {
char c = read(i);
if (i == len - 2 && c == '\r') {
newline = 1;
break;
}
if (c == '\r') continue;
s += c;
}
if (clear_f) clear();
return s;
}

void clear() {
head = 0;
buffer[head] = '\0';
len = head = 0;
}

void autoClear(bool f) {
clear_f = f;
}

bool available() {
return (buffer && head);
return (buffer && len);
}

bool state() {
return buffer;
}

int length() {
return len;
}

const char* name = nullptr;
char* buffer = nullptr;

private:
void _write(uint8_t n) {
if (len < size) len++;
buffer[head] = n;
if (++head >= size) head = 0;
}
char read(int num) {
return buffer[(len < size) ? num : ((head + num) % size)];
}

bool newline = 0;
bool clear_f = 1;
int size;
int len = 0;
int head = 0;
};
66 changes: 62 additions & 4 deletions src/parsers.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,12 @@ class ArgParser {
bool clickTime(GPtime& t) {
return click() ? copyTime(t) : 0;
}
bool clickWeek(GPweek& t) {
return click() ? copyWeek(t) : 0;
}
bool clickFlags(GPflags& t) {
return click() ? copyFlags(t) : 0;
}
bool clickColor(GPcolor& t) {
return click() ? copyColor(t) : 0;
}
Expand Down Expand Up @@ -164,6 +170,12 @@ class ArgParser {
bool clickTime(const String& n, GPtime& t) {
return click() ? copyTime(n, t) : 0;
}
bool clickWeek(const String& n, GPweek& t) {
return click() ? copyWeek(n, t) : 0;
}
bool clickFlags(const String& n, GPflags& t) {
return click() ? copyFlags(n, t) : 0;
}
bool clickColor(const String& n, GPcolor& t) {
return click() ? copyColor(n, t) : 0;
}
Expand Down Expand Up @@ -218,6 +230,22 @@ class ArgParser {
GPtime getTime() {
return GPtime(arg());
}

// получить неделю с компонента
GPweek getWeek(const String& n) {
return GPweek(arg(n));
}
GPweek getWeek() {
return GPweek(arg());
}

// получить флаги с компонента
GPflags getFlags(const String& n) {
return GPflags(arg(n));
}
GPflags getFlags() {
return GPflags(arg());
}

// получить цвет с компонента
GPcolor getColor(const String& n) {
Expand All @@ -226,12 +254,18 @@ class ArgParser {
GPcolor getColor() {
return GPcolor(arg());
}


// ===================== COPY-ПАРСЕРЫ =====================
// ОПАСНЫЕ парсеры (не проверяют запрос). Использовать только в условии!
bool copyStr(char* t, uint16_t len = 0) {
return (args() && (!len || arg().length() < len)) ? (strcpy(t, arg().c_str()), 1) : 0;
//return (args() && (!len || arg().length() < len)) ? (strcpy(t, arg().c_str()), 1) : 0;
if (!args()) return 0;
if (!len || arg().length() < len) strcpy(t, arg().c_str());
else {
strncpy(t, arg().c_str(), len - 1);
t[len - 1] = '\0';
}
return 1;
}
bool copyString(String& t) {
return args() ? (t = arg(), 1) : 0;
Expand All @@ -254,6 +288,12 @@ class ArgParser {
bool copyTime(GPtime& t) {
return args() ? (t = getTime(), 1) : 0;
}
bool copyWeek(GPweek& t) {
return args() ? (t = getWeek(), 1) : 0;
}
bool copyFlags(GPflags& t) {
return args() ? (t = getFlags(), 1) : 0;
}
bool copyColor(GPcolor& t) {
return args() ? (t = getColor(), 1) : 0;
}
Expand Down Expand Up @@ -283,6 +323,12 @@ class ArgParser {
bool copyTime(const String& n, GPtime& t) {
return hasArg(n) ? (t = getTime(n), 1) : 0;
}
bool copyWeek(const String& n, GPweek& t) {
return hasArg(n) ? (t = getWeek(n), 1) : 0;
}
bool copyFlags(const String& n, GPflags& t) {
return hasArg(n) ? (t = getFlags(n), 1) : 0;
}
bool copyColor(const String& n, GPcolor& t) {
return hasArg(n) ? (t = getColor(n), 1) : 0;
}
Expand Down Expand Up @@ -425,6 +471,12 @@ class ArgParser {
bool answer(GPtime time) {
return answer(time.encode());
}
bool answer(GPweek week) {
return answer(week.encode());
}
bool answer(GPflags flags) {
return answer(flags.encode());
}
bool answer(GPcanvas& cv) {
return answer(cv._read());
}
Expand Down Expand Up @@ -452,6 +504,12 @@ class ArgParser {
bool updateTime(const String& n, GPtime f) {
return update(n) ? (answer(f), 1) : 0;
}
bool updateWeek(const String& n, GPweek f) {
return update(n) ? (answer(f), 1) : 0;
}
bool updateFlags(const String& n, GPflags f) {
return update(n) ? (answer(f), 1) : 0;
}
bool updateColor(const String& n, GPcolor f) {
return update(n) ? (answer(f), 1) : 0;
}
Expand Down Expand Up @@ -551,8 +609,8 @@ class ArgParser {

String *_answPtr = nullptr;
String *_updPtr = nullptr;
String *_argValPtr = nullptr;
String *_argNamePtr = nullptr;
const String *_argValPtr = nullptr;
const String *_argNamePtr = nullptr;
String _hold;
uint8_t _holdF = 0;

Expand Down
19 changes: 18 additions & 1 deletion src/portal.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,18 @@ class GyverPortal : public TimeTicker, public ArgParser {
#endif

server.onNotFound([this]() {
/*Serial.print(server.uri());
if (server.args()) {
Serial.print('?');
for (int i = 0; i < server.args(); i++) {
Serial.print(server.argName(i));
Serial.print('=');
Serial.print(server.arg(i));
if (i < server.args() - 1) Serial.print('&');
}
}
Serial.println();*/

_onlTmr = millis();
if (_auth && !server.authenticate(_login, _pass)) return server.requestAuthentication();
String valS = server.arg(0);
Expand All @@ -115,12 +127,15 @@ class GyverPortal : public TimeTicker, public ArgParser {
if (_holdF == 1) _hold = server.argName(0);
else _hold = "";
server.send(200);
} else if (_uri.startsWith(F("/hotspot-detect.html"))) { // AP
_showPage = 1;

#ifdef GP_NO_DOWNLOAD
} else if (_uri.startsWith(F("/favicon.ico"))) { // иконка
server.send(200);
return;
#endif

} else if (_uri.startsWith(F("/GP_ping"))) { // пинг
server.send(200);
return;
Expand Down Expand Up @@ -184,19 +199,21 @@ class GyverPortal : public TimeTicker, public ArgParser {
} else if (_uri.startsWith(F("/GP_upload"))) {
server.send(200, "text/html", F("<meta http-equiv='refresh' content='0; url=/'/>"));
return;

#if defined(FS_H) && !defined(GP_NO_DOWNLOAD)
} else if (downOn && !server.args() && _uri[0] == '/' && _uri.indexOf('.') > 0) { // файл
if (_autoD && _fs) sendFile(_fs->open(_uri, "r")); // авто скачивание
else _fileDF = 1; // ручное скачивание (в action)
#endif

} else if (server.argName(0).equals(F("GP_form"))) { // форма
_showPage = 1;
_formF = 1;
checkList();
} else { // любой другой запрос
_showPage = 1;
_reqF = 1;
if (log.available()) log.clear();
//if (log.available()) log.clear();
}

_gp_local_unix = getUnix() + getGMT() * 60;
Expand Down
Loading

0 comments on commit f6675d1

Please sign in to comment.