Browse Source

* web-serial: added internal buffer which is transmitted every second if its fill state is different from 0

* added uptime to serial console
* time will be instantiated in ESP (was in in JS)
* fixed SerialDebug inside hmRadio.h (thx to klahus1)
pull/283/head
lumapu 2 years ago
parent
commit
0759bff4cd
  1. 9
      tools/esp8266/app.h
  2. 1
      tools/esp8266/hmRadio.h
  3. 6
      tools/esp8266/html/index.html
  4. 27
      tools/esp8266/html/serial.html
  5. 48
      tools/esp8266/web.cpp
  6. 10
      tools/esp8266/web.h

9
tools/esp8266/app.h

@ -94,6 +94,15 @@ class app {
return String(str); return String(str);
} }
String getTimeStr(void) {
char str[20];
if(0 == mTimestamp)
sprintf(str, "n/a");
else
sprintf(str, "%02d:%02d:%02d ", hour(mTimestamp), minute(mTimestamp), second(mTimestamp));
return String(str);
}
inline uint32_t getUptime(void) { inline uint32_t getUptime(void) {
return mUptimeSecs; return mUptimeSecs;
} }

1
tools/esp8266/hmRadio.h

@ -89,6 +89,7 @@ class HmRadio {
pinMode(config->pinIrq, INPUT_PULLUP); pinMode(config->pinIrq, INPUT_PULLUP);
mBufCtrl = ctrl; mBufCtrl = ctrl;
mSerialDebug = config->serialDebug;
mNrf24.begin(config->pinCe, config->pinCs); mNrf24.begin(config->pinCe, config->pinCs);
mNrf24.setRetries(0, 0); mNrf24.setRetries(0, 0);

6
tools/esp8266/html/index.html

@ -45,7 +45,7 @@
<p class="right"><a href="/api">REST API</a></p> <p class="right"><a href="/api">REST API</a></p>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var intervalSet = false; var mIntervalSet = false;
function parseSys(obj) { function parseSys(obj) {
document.getElementById("version").innerHTML = "Git SHA: " + obj["build"] + " :: " + obj["version"]; document.getElementById("version").innerHTML = "Git SHA: " + obj["build"] + " :: " + obj["version"];
@ -109,9 +109,9 @@
parseIv(obj["inverter"]); parseIv(obj["inverter"]);
parseWarnInfo(obj["warnings"], obj["infos"]); parseWarnInfo(obj["warnings"], obj["infos"]);
document.getElementById("refresh").innerHTML = obj["refresh_interval"]; document.getElementById("refresh").innerHTML = obj["refresh_interval"];
if(false == intervalSet) { if(false == mIntervalSet) {
window.setInterval("getAjax('/api/index', parse)", obj["refresh_interval"] * 1000); window.setInterval("getAjax('/api/index', parse)", obj["refresh_interval"] * 1000);
intervalSet = true; mIntervalSet = true;
} }
} }
else else

27
tools/esp8266/html/serial.html

@ -11,7 +11,7 @@
<div id="content" class="content"> <div id="content" class="content">
<div class="serial"> <div class="serial">
<textarea id="serial" cols="80" rows="20" readonly></textarea><br/> <textarea id="serial" cols="80" rows="20" readonly></textarea><br/>
conntected: <span class="dot" id="connected"></span><input type="button" value="clear" class="btn" id="clear"/> <input type="button" value="autoscroll" class="btn" id="scroll"/> conntected: <span class="dot" id="connected"></span> Uptime: <span id="uptime"></span><input type="button" value="clear" class="btn" id="clear"/> <input type="button" value="autoscroll" class="btn" id="scroll"/>
</div> </div>
</div> </div>
<div id="footer"> <div id="footer">
@ -20,12 +20,26 @@
<p class="right" id="version"></p> <p class="right" id="version"></p>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var mPrintTime = true;
var mAutoScroll = true; var mAutoScroll = true;
var con = document.getElementById("serial"); var con = document.getElementById("serial");
var mIntervalSet = false;
function parseSys(obj) { function parseSys(obj) {
var up = obj["ts_uptime"];
var days = parseInt(up / 86400) % 365;
var hrs = parseInt(up / 3600) % 24;
var min = parseInt(up / 60) % 60;
var sec = up % 60;
document.getElementById("uptime").innerHTML = days + " Days, "
+ ("0"+hrs).substr(-2) + ":"
+ ("0"+min).substr(-2) + ":"
+ ("0"+sec).substr(-2);
if(false == mIntervalSet) {
document.getElementById("version").innerHTML = "Git SHA: " + obj["build"] + " :: " + obj["version"]; document.getElementById("version").innerHTML = "Git SHA: " + obj["build"] + " :: " + obj["version"];
window.setInterval("getAjax('/api/system', parseSys)", 10000);
mIntervalSet = true;
}
} }
document.getElementById("clear").addEventListener("click", function() { document.getElementById("clear").addEventListener("click", function() {
@ -49,15 +63,6 @@
}, false); }, false);
source.addEventListener('serial', function(e) { source.addEventListener('serial', function(e) {
if(mPrintTime) {
var d = new Date();
con.value += d.toLocaleTimeString() + ": ";
mPrintTime = false;
}
if(e.data.includes('<rn>'))
mPrintTime = true;
con.value += e.data.replace(/\<rn\>/g, '\r\n'); con.value += e.data.replace(/\<rn\>/g, '\r\n');
if(mAutoScroll) if(mAutoScroll)
con.scrollTop = con.scrollHeight; con.scrollTop = con.scrollHeight;

48
tools/esp8266/web.cpp

@ -30,8 +30,13 @@ web::web(app *main, sysConfig_t *sysCfg, config_t *config, statistics_t *stat, c
mVersion = version; mVersion = version;
mWeb = new AsyncWebServer(80); mWeb = new AsyncWebServer(80);
mEvts = new AsyncEventSource("/events"); mEvts = new AsyncEventSource("/events");
mApi = new webApi(mWeb, main, sysCfg, config, stat, version); mApi = new webApi(mWeb, main, sysCfg, config, stat, version);
memset(mSerialBuf, 0, WEB_SERIAL_BUF_SIZE);
mSerialBufFill = 0;
mWebSerialTicker = 0;
mWebSerialInterval = 1000; // [ms]
mSerialAddTime = true;
} }
@ -45,7 +50,7 @@ void web::setup(void) {
mWeb->on("/api.js", HTTP_GET, std::bind(&web::onApiJs, this, std::placeholders::_1)); mWeb->on("/api.js", HTTP_GET, std::bind(&web::onApiJs, this, std::placeholders::_1));
mWeb->on("/favicon.ico", HTTP_GET, std::bind(&web::onFavicon, this, std::placeholders::_1)); mWeb->on("/favicon.ico", HTTP_GET, std::bind(&web::onFavicon, this, std::placeholders::_1));
mWeb->onNotFound ( std::bind(&web::showNotFound, this, std::placeholders::_1)); mWeb->onNotFound ( std::bind(&web::showNotFound, this, std::placeholders::_1));
mWeb->on("/reboot", HTTP_ANY, std::bind(&web::showReboot, this, std::placeholders::_1)); mWeb->on("/reboot", HTTP_ANY, std::bind(&web::onReboot, this, std::placeholders::_1));
mWeb->on("/erase", HTTP_ANY, std::bind(&web::showErase, this, std::placeholders::_1)); mWeb->on("/erase", HTTP_ANY, std::bind(&web::showErase, this, std::placeholders::_1));
mWeb->on("/factory", HTTP_ANY, std::bind(&web::showFactoryRst, this, std::placeholders::_1)); mWeb->on("/factory", HTTP_ANY, std::bind(&web::showFactoryRst, this, std::placeholders::_1));
@ -74,6 +79,14 @@ void web::setup(void) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void web::loop(void) { void web::loop(void) {
mApi->loop(); mApi->loop();
if(mMain->checkTicker(&mWebSerialTicker, mWebSerialInterval)) {
if(mSerialBufFill > 0) {
mEvts->send(mSerialBuf, "serial", millis());
memset(mSerialBuf, 0, WEB_SERIAL_BUF_SIZE);
mSerialBufFill = 0;
}
}
} }
@ -146,10 +159,9 @@ void web::showNotFound(AsyncWebServerRequest *request) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void web::showReboot(AsyncWebServerRequest *request) { void web::onReboot(AsyncWebServerRequest *request) {
request->send(200, F("text/html"), F("<!doctype html><html><head><title>Rebooting ...</title><meta http-equiv=\"refresh\" content=\"10; URL=/\"></head><body>rebooting ... auto reload after 10s</body></html>")); request->send(200, F("text/html"), F("<!doctype html><html><head><title>Rebooting ...</title><meta http-equiv=\"refresh\" content=\"10; URL=/\"></head><body>rebooting ... auto reload after 10s</body></html>"));
delay(1000); mMain->mShouldReboot = true;
ESP.restart();
} }
@ -157,7 +169,7 @@ void web::showReboot(AsyncWebServerRequest *request) {
void web::showErase(AsyncWebServerRequest *request) { void web::showErase(AsyncWebServerRequest *request) {
DPRINTLN(DBG_VERBOSE, F("showErase")); DPRINTLN(DBG_VERBOSE, F("showErase"));
mMain->eraseSettings(); mMain->eraseSettings();
showReboot(request); onReboot(request);
} }
@ -308,7 +320,7 @@ void web::showSave(AsyncWebServerRequest *request) {
mMain->saveValues(); mMain->saveValues();
if(request->arg("reboot") == "on") if(request->arg("reboot") == "on")
showReboot(request); onReboot(request);
else else
request->send(200, F("text/html"), F("<!doctype html><html><head><title>Setup saved</title><meta http-equiv=\"refresh\" content=\"0; URL=/setup\"></head><body>" request->send(200, F("text/html"), F("<!doctype html><html><head><title>Setup saved</title><meta http-equiv=\"refresh\" content=\"0; URL=/setup\"></head><body>"
"<p>saved</p></body></html>")); "<p>saved</p></body></html>"));
@ -463,5 +475,25 @@ void web::onSerial(AsyncWebServerRequest *request) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void web::serialCb(String msg) { void web::serialCb(String msg) {
msg.replace("\r\n", "<rn>"); msg.replace("\r\n", "<rn>");
mEvts->send(msg.c_str(), "serial", millis()); if(mSerialAddTime) {
if((9 + mSerialBufFill) <= WEB_SERIAL_BUF_SIZE) {
strncpy(&mSerialBuf[mSerialBufFill], mMain->getTimeStr().c_str(), 9);
mSerialBufFill += 9;
}
else
mEvts->send("webSerial, buffer overflow!", "serial", millis());
mSerialAddTime = false;
}
if(msg.endsWith("<rn>"))
mSerialAddTime = true;
uint16_t length = msg.length();
if((length + mSerialBufFill) <= WEB_SERIAL_BUF_SIZE) {
strncpy(&mSerialBuf[mSerialBufFill], msg.c_str(), length);
mSerialBufFill += length;
}
else
mEvts->send("webSerial, buffer overflow!", "serial", millis());
} }

10
tools/esp8266/web.h

@ -12,6 +12,8 @@
#include "app.h" #include "app.h"
#include "webApi.h" #include "webApi.h"
#define WEB_SERIAL_BUF_SIZE 1024
class app; class app;
class webApi; class webApi;
@ -30,7 +32,7 @@ class web {
void onApiJs(AsyncWebServerRequest *request); void onApiJs(AsyncWebServerRequest *request);
void onFavicon(AsyncWebServerRequest *request); void onFavicon(AsyncWebServerRequest *request);
void showNotFound(AsyncWebServerRequest *request); void showNotFound(AsyncWebServerRequest *request);
void showReboot(AsyncWebServerRequest *request); void onReboot(AsyncWebServerRequest *request);
void showErase(AsyncWebServerRequest *request); void showErase(AsyncWebServerRequest *request);
void showFactoryRst(AsyncWebServerRequest *request); void showFactoryRst(AsyncWebServerRequest *request);
void onSetup(AsyncWebServerRequest *request); void onSetup(AsyncWebServerRequest *request);
@ -57,6 +59,12 @@ class web {
char *mVersion; char *mVersion;
app *mMain; app *mMain;
webApi *mApi; webApi *mApi;
bool mSerialAddTime;
char mSerialBuf[WEB_SERIAL_BUF_SIZE];
uint16_t mSerialBufFill;
uint32_t mWebSerialTicker;
uint32_t mWebSerialInterval;
}; };
#endif /*__WEB_H__*/ #endif /*__WEB_H__*/

Loading…
Cancel
Save