diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 871c9ca7..acfddbb2 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -107,6 +107,8 @@ class RestApi { getIvAlarms(root, request->url().substring(20).toInt()); else if(path.substring(0, 17) == "inverter/version/") getIvVersion(root, request->url().substring(22).toInt()); + else if(path.substring(0, 17) == "inverter/radiostat/") + getIvStatistis(root, request->url().substring(24).toInt()); else getNotFound(root, F("http://") + request->host() + F("/api/")); } @@ -245,7 +247,6 @@ class RestApi { getRadioCmtInfo(obj.createNestedObject(F("radioCmt"))); #endif getMqttInfo(obj.createNestedObject(F("mqtt"))); - getStatistics(obj.createNestedArray(F("statistics"))); #if defined(ESP32) obj[F("chip_revision")] = ESP.getChipRevision(); @@ -310,23 +311,18 @@ class RestApi { obj[F("html")] = F("reboot. Autoreload after 10 seconds"); } - void getStatistics(JsonArray arr) { - statistics_t *stat; - #if defined(ESP32) - for(uint8_t i = 0; i < 2; i++) { - stat = (0 == i) ? mApp->getNrfStatistics() : mApp->getCmtStatistics(); - #else - { - stat = mApp->getNrfStatistics(); - #endif - JsonObject obj = arr.createNestedObject(); - obj[F("rx_success")] = stat->rxSuccess; - obj[F("rx_fail")] = stat->rxFail; - obj[F("rx_fail_answer")] = stat->rxFailNoAnser; - obj[F("frame_cnt")] = stat->frmCnt; - obj[F("tx_cnt")] = stat->txCnt; - obj[F("retransmits")] = stat->retransmits; + void getIvStatistis(JsonObject obj, uint8_t id) { + Inverter<> *iv = mSys->getInverterByPos(id); + if(NULL == iv) { + obj[F("error")] = F("inverter not found!"); + return; } + obj[F("rx_success")] = iv->radioStatistics.rxSuccess; + obj[F("rx_fail")] = iv->radioStatistics.rxFail; + obj[F("rx_fail_answer")] = iv->radioStatistics.rxFailNoAnser; + obj[F("frame_cnt")] = iv->radioStatistics.frmCnt; + obj[F("tx_cnt")] = iv->radioStatistics.txCnt; + obj[F("retransmits")] = iv->radioStatistics.retransmits; } void getInverterList(JsonObject obj) { diff --git a/src/web/html/api.js b/src/web/html/api.js index 82405a71..c9590d89 100644 --- a/src/web/html/api.js +++ b/src/web/html/api.js @@ -172,6 +172,15 @@ function getAjax(url, ptr, method="GET", json=null) { * CREATE DOM FUNCTIONS */ +function tr(val1, val2) { + if(typeof val2 == "number") + val2 = String(val2); + return ml("tr", {}, [ + ml("th", {style: "width: 50%"}, val1), + ml("td", {}, val2) + ]); +} + function des(val) { e = document.createElement('p'); e.classList.add("subdes"); diff --git a/src/web/html/system.html b/src/web/html/system.html index 071ddb1d..27ad1801 100644 --- a/src/web/html/system.html +++ b/src/web/html/system.html @@ -48,26 +48,6 @@ return ml("div", {class: "head p-2 mt-3"}, ml("div", {class: "row"}, ml("div", {class: "col a-c"}, text))) } - function tr(val1, val2) { - if(typeof val2 == "number") - val2 = String(val2); - return ml("tr", {}, [ - ml("th", {style: "width: 50%"}, val1), - ml("td", {}, val2) - ]); - } - - function parseStat(stat) { - return [ - tr("TX count", stat.tx_cnt), - tr("RX success", stat.rx_success), - tr("RX fail", stat.rx_fail), - tr("RX no answer", stat.rx_fail_answer), - tr("RX fragments", stat.frame_cnt), - tr("TX retransmits", stat.retransmits) - ]; - } - function parseRadio(obj) { const pa = ["MIN (recommended)", "LOW", "HIGH", "MAX"]; const dr = ["1 M", "2 M", "250 k"] @@ -78,7 +58,6 @@ tr("NRF24 Power Level", pa[obj.radioNrf.power_level]), tr("NRF24 Data Rate", dr[obj.radioNrf.dataRate] + "bps") ]; - Array.prototype.push.apply(lines, parseStat(obj.statistics[0])); } else lines = [tr("NRF24L01", badge(false, "not enabled"))]; @@ -92,7 +71,6 @@ /*IF_ESP32*/ if(obj.radioCmt.en) { cmt = [tr("CMT2300A", badge(obj.radioCmt.isconnected, ((obj.radioCmt.isconnected) ? "" : "not ") + "connected"))]; - Array.prototype.push.apply(cmt, parseStat(obj.statistics[1])); } else cmt = [tr("CMT2300A", badge(false, "not enabled"))]; diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html index b4119450..48d34211 100644 --- a/src/web/html/visualization.html +++ b/src/web/html/visualization.html @@ -198,7 +198,9 @@ ml("div", {class: "col"}, "") ), ml("div", {class: "row p-2 ts-bg mx-2"}, - ml("div", {class: "col mx-2"}, ageInfo) + ml("div", { class: "pointer col mx-2", onclick: function() { + getAjax("/api/inverter/radiostat/" + obj.id, parseIvRadioStats); + }}, ageInfo) ) ]); } @@ -279,26 +281,25 @@ var html = ml("table", {class: "table"}, [ ml("tbody", {}, [ - ml("tr", {}, [ - ml("th", {}, "Model"), - ml("td", {}, model) - ]), - ml("tr", {}, [ - ml("th", {}, "Firmware Version / Build"), - ml("td", {}, String(obj.fw_ver) + " (build: " + String(obj.fw_date) + " " + String(obj.fw_time) + ")") - ]), - ml("tr", {}, [ - ml("th", {}, "Hardware Version / Build"), - ml("td", {}, (obj.hw_ver/100).toFixed(2) + " (build: " + String(obj.prod_cw) + "/" + String(obj.prod_year) + ")") - ]), - ml("tr", {}, [ - ml("th", {}, "Hardware Number"), - ml("td", {}, obj.part_num.toString(16)) - ]), - ml("tr", {}, [ - ml("th", {}, "Bootloader Version"), - ml("td", {}, (obj.boot_ver/100).toFixed(2)) - ]) + tr("Model", model), + tr("Firmware Version / Build", String(obj.fw_ver) + " (build: " + String(obj.fw_date) + " " + String(obj.fw_time) + ")"), + tr("Hardware Version / Build", (obj.hw_ver/100).toFixed(2) + " (build: " + String(obj.prod_cw) + "/" + String(obj.prod_year) + ")"), + tr("Hardware Number", obj.part_num.toString(16)), + tr("Bootloader Version", (obj.boot_ver/100).toFixed(2)) + ]) + ]); + modal("Info for inverter " + obj.name, ml("div", {}, html)); + } + + function parseIvRadioStats(obj) { + var html = ml("table", {class: "table"}, [ + ml("tbody", {}, [ + tr("TX count", obj.tx_cnt), + tr("RX success", obj.rx_success), + tr("RX fail", obj.rx_fail), + tr("RX no answer", obj.rx_fail_answer), + tr("RX fragments", obj.frame_cnt), + tr("TX retransmits", obj.retransmits) ]) ]); modal("Info for inverter " + obj.name, ml("div", {}, html));