mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-17 02:46:11 +02:00
force Brace and Z550 make one line
This commit is contained in:
parent
add8dd9c0d
commit
ec83406628
3 changed files with 288 additions and 330 deletions
5
tools/esp8266/.vscode/settings.json
vendored
5
tools/esp8266/.vscode/settings.json
vendored
|
@ -19,8 +19,5 @@
|
||||||
"editor.detectIndentation": false,
|
"editor.detectIndentation": false,
|
||||||
|
|
||||||
// https://clang.llvm.org/docs/ClangFormatStyleOptions.html
|
// https://clang.llvm.org/docs/ClangFormatStyleOptions.html
|
||||||
"C_Cpp.vcFormat.newLine.closeBraceSameLine.emptyFunction": false,
|
"C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 0}",
|
||||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.block": "sameLine",
|
|
||||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.function": "sameLine",
|
|
||||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.lambda": "sameLine"
|
|
||||||
}
|
}
|
|
@ -9,8 +9,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include <ArduinoJson.h>
|
|
||||||
|
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
app::app() {
|
app::app() {
|
||||||
|
@ -26,7 +26,6 @@ app::app() {
|
||||||
mShouldReboot = false;
|
mShouldReboot = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::setup(uint32_t timeout) {
|
void app::setup(uint32_t timeout) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::setup"));
|
DPRINTLN(DBG_VERBOSE, F("app::setup"));
|
||||||
|
@ -81,22 +80,18 @@ void app::loop(void) {
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
mSys->Radio.loop();
|
mSys->Radio.loop();
|
||||||
|
|
||||||
yield();
|
yield();
|
||||||
|
|
||||||
if(checkTicker(&mRxTicker, 5))
|
if (checkTicker(&mRxTicker, 5)) {
|
||||||
{
|
|
||||||
bool rxRdy = mSys->Radio.switchRxCh();
|
bool rxRdy = mSys->Radio.switchRxCh();
|
||||||
|
|
||||||
if(!mSys->BufCtrl.empty())
|
if (!mSys->BufCtrl.empty()) {
|
||||||
{
|
|
||||||
uint8_t len;
|
uint8_t len;
|
||||||
packet_t *p = mSys->BufCtrl.getBack();
|
packet_t *p = mSys->BufCtrl.getBack();
|
||||||
|
|
||||||
if(mSys->Radio.checkPaketCrc(p->packet, &len, p->rxCh))
|
if (mSys->Radio.checkPaketCrc(p->packet, &len, p->rxCh)) {
|
||||||
{
|
|
||||||
// process buffer only on first occurrence
|
// process buffer only on first occurrence
|
||||||
if (mConfig.serialDebug) {
|
if (mConfig.serialDebug) {
|
||||||
DPRINT(DBG_INFO, "RX " + String(len) + "B Ch" + String(p->rxCh) + " | ");
|
DPRINT(DBG_INFO, "RX " + String(len) + "B Ch" + String(p->rxCh) + " | ");
|
||||||
|
@ -105,28 +100,23 @@ void app::loop(void) {
|
||||||
|
|
||||||
mStat.frmCnt++;
|
mStat.frmCnt++;
|
||||||
|
|
||||||
if(0 != len)
|
if (0 != len) {
|
||||||
{
|
|
||||||
Inverter<> *iv = mSys->findInverter(&p->packet[1]);
|
Inverter<> *iv = mSys->findInverter(&p->packet[1]);
|
||||||
if ((NULL != iv) && (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES))) // response from get information command
|
if ((NULL != iv) && (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES))) // response from get information command
|
||||||
{
|
{
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
mPayload[iv->id].txId = p->packet[0];
|
||||||
DPRINTLN(DBG_DEBUG, F("Response from info request received"));
|
DPRINTLN(DBG_DEBUG, F("Response from info request received"));
|
||||||
uint8_t *pid = &p->packet[9];
|
uint8_t *pid = &p->packet[9];
|
||||||
if (*pid == 0x00)
|
if (*pid == 0x00) {
|
||||||
{
|
|
||||||
DPRINT(DBG_DEBUG, F("fragment number zero received and ignored"));
|
DPRINT(DBG_DEBUG, F("fragment number zero received and ignored"));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
DPRINTLN(DBG_DEBUG, "PID: 0x" + String(*pid, HEX));
|
DPRINTLN(DBG_DEBUG, "PID: 0x" + String(*pid, HEX));
|
||||||
if ((*pid & 0x7F) < 5) {
|
if ((*pid & 0x7F) < 5) {
|
||||||
memcpy(mPayload[iv->id].data[(*pid & 0x7F) - 1], &p->packet[10], len - 11);
|
memcpy(mPayload[iv->id].data[(*pid & 0x7F) - 1], &p->packet[10], len - 11);
|
||||||
mPayload[iv->id].len[(*pid & 0x7F) - 1] = len - 11;
|
mPayload[iv->id].len[(*pid & 0x7F) - 1] = len - 11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*pid & ALL_FRAMES) == ALL_FRAMES)
|
if ((*pid & ALL_FRAMES) == ALL_FRAMES) {
|
||||||
{
|
|
||||||
// Last packet
|
// Last packet
|
||||||
if ((*pid & 0x7f) > mPayload[iv->id].maxPackId) {
|
if ((*pid & 0x7f) > mPayload[iv->id].maxPackId) {
|
||||||
mPayload[iv->id].maxPackId = (*pid & 0x7f);
|
mPayload[iv->id].maxPackId = (*pid & 0x7f);
|
||||||
|
@ -143,8 +133,7 @@ void app::loop(void) {
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
mPayload[iv->id].txId = p->packet[0];
|
||||||
iv->devControlRequest = false;
|
iv->devControlRequest = false;
|
||||||
|
|
||||||
if ((p->packet[12] == ActivePowerContr) && (p->packet[13] == 0x00))
|
if ((p->packet[12] == ActivePowerContr) && (p->packet[13] == 0x00)) {
|
||||||
{
|
|
||||||
String msg = (p->packet[10] == 0x00 && p->packet[11] == 0x00) ? "" : "NOT ";
|
String msg = (p->packet[10] == 0x00 && p->packet[11] == 0x00) ? "" : "NOT ";
|
||||||
DPRINTLN(DBG_INFO, F("Inverter ") + String(iv->id) + F(" has ") + msg + F("accepted power limit set point ") + String(iv->powerLimit[0]) + F(" with PowerLimitControl ") + String(iv->powerLimit[1]));
|
DPRINTLN(DBG_INFO, F("Inverter ") + String(iv->id) + F(" has ") + msg + F("accepted power limit set point ") + String(iv->powerLimit[0]) + F(" with PowerLimitControl ") + String(iv->powerLimit[1]));
|
||||||
}
|
}
|
||||||
|
@ -156,7 +145,6 @@ void app::loop(void) {
|
||||||
}
|
}
|
||||||
yield();
|
yield();
|
||||||
|
|
||||||
|
|
||||||
if (rxRdy) {
|
if (rxRdy) {
|
||||||
processPayload(true);
|
processPayload(true);
|
||||||
}
|
}
|
||||||
|
@ -262,39 +250,33 @@ void app::loop(void) {
|
||||||
DPRINTLN(DBG_INFO, F("Requesting Inverter SN ") + String(iv->serial.u64, HEX));
|
DPRINTLN(DBG_INFO, F("Requesting Inverter SN ") + String(iv->serial.u64, HEX));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(iv->devControlRequest)
|
if (iv->devControlRequest) {
|
||||||
{
|
|
||||||
if (mConfig.serialDebug)
|
if (mConfig.serialDebug)
|
||||||
DPRINTLN(DBG_INFO, F("Devcontrol request ") + String(iv->devControlCmd) + F(" power limit ") + String(iv->powerLimit[0]));
|
DPRINTLN(DBG_INFO, F("Devcontrol request ") + String(iv->devControlCmd) + F(" power limit ") + String(iv->powerLimit[0]));
|
||||||
mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit);
|
mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit);
|
||||||
mPayload[iv->id].txCmd = iv->devControlCmd;
|
mPayload[iv->id].txCmd = iv->devControlCmd;
|
||||||
iv->clearCmdQueue();
|
iv->clearCmdQueue();
|
||||||
iv->enqueCommand<InfoCommand>(SystemConfigPara);
|
iv->enqueCommand<InfoCommand>(SystemConfigPara);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
uint8_t cmd = iv->getQueuedCmd();
|
uint8_t cmd = iv->getQueuedCmd();
|
||||||
mSys->Radio.sendTimePacket(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex);
|
mSys->Radio.sendTimePacket(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex);
|
||||||
mPayload[iv->id].txCmd = cmd;
|
mPayload[iv->id].txCmd = cmd;
|
||||||
mRxTicker = 0;
|
mRxTicker = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (mConfig.serialDebug)
|
||||||
else if(mConfig.serialDebug)
|
|
||||||
DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!"));
|
DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!"));
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::handleIntr(void) {
|
void app::handleIntr(void) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::handleIntr"));
|
DPRINTLN(DBG_VERBOSE, F("app::handleIntr"));
|
||||||
mSys->Radio.handleIntr();
|
mSys->Radio.handleIntr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool app::buildPayload(uint8_t id) {
|
bool app::buildPayload(uint8_t id) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::buildPayload"));
|
DPRINTLN(DBG_VERBOSE, F("app::buildPayload"));
|
||||||
|
@ -306,10 +288,8 @@ bool app::buildPayload(uint8_t id) {
|
||||||
if (mPayload[id].len[i] > 0) {
|
if (mPayload[id].len[i] > 0) {
|
||||||
if (i == (mPayload[id].maxPackId - 1)) {
|
if (i == (mPayload[id].maxPackId - 1)) {
|
||||||
crc = ah::crc16(mPayload[id].data[i], mPayload[id].len[i] - 2, crc);
|
crc = ah::crc16(mPayload[id].data[i], mPayload[id].len[i] - 2, crc);
|
||||||
crcRcv = (mPayload[id].data[i][mPayload[id].len[i] - 2] << 8)
|
crcRcv = (mPayload[id].data[i][mPayload[id].len[i] - 2] << 8) | (mPayload[id].data[i][mPayload[id].len[i] - 1]);
|
||||||
| (mPayload[id].data[i][mPayload[id].len[i] - 1]);
|
} else
|
||||||
}
|
|
||||||
else
|
|
||||||
crc = ah::crc16(mPayload[id].data[i], mPayload[id].len[i], crc);
|
crc = ah::crc16(mPayload[id].data[i], mPayload[id].len[i], crc);
|
||||||
}
|
}
|
||||||
yield();
|
yield();
|
||||||
|
@ -318,10 +298,8 @@ bool app::buildPayload(uint8_t id) {
|
||||||
return (crc == crcRcv) ? true : false;
|
return (crc == crcRcv) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::processPayload(bool retransmit) {
|
void app::processPayload(bool retransmit) {
|
||||||
|
|
||||||
#ifdef __MQTT_AFTER_RX__
|
#ifdef __MQTT_AFTER_RX__
|
||||||
boolean doMQTT = false;
|
boolean doMQTT = false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -336,26 +314,19 @@ void app::processPayload(bool retransmit) {
|
||||||
mPayload[iv->id].complete = true;
|
mPayload[iv->id].complete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!mPayload[iv->id].complete )
|
if (!mPayload[iv->id].complete) {
|
||||||
{
|
|
||||||
if (!buildPayload(iv->id)) // payload not complete
|
if (!buildPayload(iv->id)) // payload not complete
|
||||||
{
|
{
|
||||||
if(mPayload[iv->id].requested)
|
if (mPayload[iv->id].requested) {
|
||||||
{
|
if (retransmit) {
|
||||||
if(retransmit)
|
|
||||||
{
|
|
||||||
if (iv->devControlCmd == Restart || iv->devControlCmd == CleanState_LockAndAlarm) {
|
if (iv->devControlCmd == Restart || iv->devControlCmd == CleanState_LockAndAlarm) {
|
||||||
// This is required to prevent retransmissions without answer.
|
// This is required to prevent retransmissions without answer.
|
||||||
DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm..."));
|
DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm..."));
|
||||||
mPayload[iv->id].retransmits = mConfig.maxRetransPerPyld;
|
mPayload[iv->id].retransmits = mConfig.maxRetransPerPyld;
|
||||||
}
|
} else {
|
||||||
else
|
if (mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld) {
|
||||||
{
|
|
||||||
if(mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld)
|
|
||||||
{
|
|
||||||
mPayload[iv->id].retransmits++;
|
mPayload[iv->id].retransmits++;
|
||||||
if(mPayload[iv->id].maxPackId != 0)
|
if (mPayload[iv->id].maxPackId != 0) {
|
||||||
{
|
|
||||||
for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId - 1); i++) {
|
for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId - 1); i++) {
|
||||||
if (mPayload[iv->id].len[i] == 0) {
|
if (mPayload[iv->id].len[i] == 0) {
|
||||||
if (mConfig.serialDebug)
|
if (mConfig.serialDebug)
|
||||||
|
@ -365,9 +336,7 @@ void app::processPayload(bool retransmit) {
|
||||||
}
|
}
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (mConfig.serialDebug)
|
if (mConfig.serialDebug)
|
||||||
DPRINTLN(DBG_WARN, F("while retrieving data: last frame missing: Request Retransmit"));
|
DPRINTLN(DBG_WARN, F("while retrieving data: last frame missing: Request Retransmit"));
|
||||||
if (0x00 != mLastPacketId)
|
if (0x00 != mLastPacketId)
|
||||||
|
@ -382,9 +351,7 @@ void app::processPayload(bool retransmit) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else { // payload complete
|
||||||
else
|
|
||||||
{ // payload complete
|
|
||||||
DPRINTLN(DBG_INFO, F("procPyld: cmd: ") + String(mPayload[iv->id].txCmd));
|
DPRINTLN(DBG_INFO, F("procPyld: cmd: ") + String(mPayload[iv->id].txCmd));
|
||||||
DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX));
|
DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX));
|
||||||
DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId));
|
DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId));
|
||||||
|
@ -410,8 +377,7 @@ void app::processPayload(bool retransmit) {
|
||||||
|
|
||||||
if (NULL == rec) {
|
if (NULL == rec) {
|
||||||
DPRINTLN(DBG_ERROR, F("record is NULL!"));
|
DPRINTLN(DBG_ERROR, F("record is NULL!"));
|
||||||
}
|
} else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) {
|
||||||
else if((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) {
|
|
||||||
if (mPayload[iv->id].txId == (TX_REQ_INFO + 0x80))
|
if (mPayload[iv->id].txId == (TX_REQ_INFO + 0x80))
|
||||||
mStat.rxSuccess++;
|
mStat.rxSuccess++;
|
||||||
|
|
||||||
|
@ -439,10 +405,18 @@ void app::processPayload(bool retransmit) {
|
||||||
if (recRealtime == rec) {
|
if (recRealtime == rec) {
|
||||||
if (CH0 == rec->assign[i].ch) {
|
if (CH0 == rec->assign[i].ch) {
|
||||||
switch (rec->assign[i].fieldId) {
|
switch (rec->assign[i].fieldId) {
|
||||||
case FLD_PAC: total[0] += iv->getValue(i, rec); break;
|
case FLD_PAC:
|
||||||
case FLD_YT: total[1] += iv->getValue(i, rec); break;
|
total[0] += iv->getValue(i, rec);
|
||||||
case FLD_YD: total[2] += iv->getValue(i, rec); break;
|
break;
|
||||||
case FLD_PDC: total[3] += iv->getValue(i, rec); break;
|
case FLD_YT:
|
||||||
|
total[1] += iv->getValue(i, rec);
|
||||||
|
break;
|
||||||
|
case FLD_YD:
|
||||||
|
total[2] += iv->getValue(i, rec);
|
||||||
|
break;
|
||||||
|
case FLD_PDC:
|
||||||
|
total[3] += iv->getValue(i, rec);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -464,7 +438,6 @@ void app::processPayload(bool retransmit) {
|
||||||
|
|
||||||
mMqtt.sendMsg(topic, val);
|
mMqtt.sendMsg(topic, val);
|
||||||
|
|
||||||
|
|
||||||
snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/last_success", iv->name);
|
snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/last_success", iv->name);
|
||||||
snprintf(val, 48, "%i", iv->getLastTs(rec) * 1000);
|
snprintf(val, 48, "%i", iv->getLastTs(rec) * 1000);
|
||||||
mMqtt.sendMsg(topic, val);
|
mMqtt.sendMsg(topic, val);
|
||||||
|
@ -481,10 +454,18 @@ void app::processPayload(bool retransmit) {
|
||||||
uint8_t fieldId = 0;
|
uint8_t fieldId = 0;
|
||||||
for (uint8_t i = 0; i < 4; i++) {
|
for (uint8_t i = 0; i < 4; i++) {
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 0: fieldId = FLD_PAC; break;
|
case 0:
|
||||||
case 1: fieldId = FLD_YT; break;
|
fieldId = FLD_PAC;
|
||||||
case 2: fieldId = FLD_YD; break;
|
break;
|
||||||
case 3: fieldId = FLD_PDC; break;
|
case 1:
|
||||||
|
fieldId = FLD_YT;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
fieldId = FLD_YD;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
fieldId = FLD_PDC;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
snprintf(topic, 32 + MAX_NAME_LENGTH, "total/%s", fields[fieldId]);
|
snprintf(topic, 32 + MAX_NAME_LENGTH, "total/%s", fields[fieldId]);
|
||||||
snprintf(val, 10, "%.3f", total[i]);
|
snprintf(val, 10, "%.3f", total[i]);
|
||||||
|
@ -493,8 +474,7 @@ void app::processPayload(bool retransmit) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes"));
|
DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes"));
|
||||||
mStat.rxFail++;
|
mStat.rxFail++;
|
||||||
}
|
}
|
||||||
|
@ -536,7 +516,6 @@ void app::processPayload(bool retransmit) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::cbMqtt(char *topic, byte *payload, unsigned int length) {
|
void app::cbMqtt(char *topic, byte *payload, unsigned int length) {
|
||||||
// callback handling on subscribed devcontrol topic
|
// callback handling on subscribed devcontrol topic
|
||||||
|
@ -544,24 +523,19 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
|
||||||
// subcribed topics are mTopic + "/devcontrol/#" where # is <inverter_id>/<subcmd in dec>
|
// subcribed topics are mTopic + "/devcontrol/#" where # is <inverter_id>/<subcmd in dec>
|
||||||
// eg. mypvsolar/devcontrol/1/11 with payload "400" --> inverter 1 active power limit 400 Watt
|
// eg. mypvsolar/devcontrol/1/11 with payload "400" --> inverter 1 active power limit 400 Watt
|
||||||
const char *token = strtok(topic, "/");
|
const char *token = strtok(topic, "/");
|
||||||
while (token != NULL)
|
while (token != NULL) {
|
||||||
{
|
if (strcmp(token, "devcontrol") == 0) {
|
||||||
if (strcmp(token,"devcontrol")==0)
|
|
||||||
{
|
|
||||||
token = strtok(NULL, "/");
|
token = strtok(NULL, "/");
|
||||||
uint8_t iv_id = std::stoi(token);
|
uint8_t iv_id = std::stoi(token);
|
||||||
|
|
||||||
if (iv_id >= 0 && iv_id <= MAX_NUM_INVERTERS)
|
if (iv_id >= 0 && iv_id <= MAX_NUM_INVERTERS) {
|
||||||
{
|
|
||||||
Inverter<> *iv = this->mSys->getInverterByPos(iv_id);
|
Inverter<> *iv = this->mSys->getInverterByPos(iv_id);
|
||||||
if(NULL != iv)
|
if (NULL != iv) {
|
||||||
{
|
|
||||||
if (!iv->devControlRequest) // still pending
|
if (!iv->devControlRequest) // still pending
|
||||||
{
|
{
|
||||||
token = strtok(NULL, "/");
|
token = strtok(NULL, "/");
|
||||||
|
|
||||||
switch ( std::stoi(token) )
|
switch (std::stoi(token)) {
|
||||||
{
|
|
||||||
// Active Power Control
|
// Active Power Control
|
||||||
case ActivePowerContr:
|
case ActivePowerContr:
|
||||||
token = strtok(NULL, "/"); // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string
|
token = strtok(NULL, "/"); // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string
|
||||||
|
@ -573,10 +547,12 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
|
||||||
if (iv->powerLimit[1] >= AbsolutNonPersistent && iv->powerLimit[1] <= RelativPersistent) {
|
if (iv->powerLimit[1] >= AbsolutNonPersistent && iv->powerLimit[1] <= RelativPersistent) {
|
||||||
iv->devControlCmd = ActivePowerContr;
|
iv->devControlCmd = ActivePowerContr;
|
||||||
iv->powerLimit[0] = std::stoi(std::string((char *)payload, (unsigned int)length)); // THX to @silversurfer
|
iv->powerLimit[0] = std::stoi(std::string((char *)payload, (unsigned int)length)); // THX to @silversurfer
|
||||||
if (iv->powerLimit[1] & 0x0001)
|
/*if (iv->powerLimit[1] & 0x0001)
|
||||||
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%"));
|
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%"));
|
||||||
else
|
else
|
||||||
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") );
|
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W"));*/
|
||||||
|
|
||||||
|
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F((iv->powerLimit[1] & 0x0001) ? "%" : "W"));
|
||||||
}
|
}
|
||||||
iv->devControlRequest = true;
|
iv->devControlRequest = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -645,19 +621,16 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
|
||||||
DPRINTLN(DBG_INFO, F("app::cbMqtt finished"));
|
DPRINTLN(DBG_INFO, F("app::cbMqtt finished"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool app::getWifiApActive(void) {
|
bool app::getWifiApActive(void) {
|
||||||
return mWifi->getApActive();
|
return mWifi->getApActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::getAvailNetworks(JsonObject obj) {
|
void app::getAvailNetworks(JsonObject obj) {
|
||||||
mWifi->getAvailNetworks(obj);
|
mWifi->getAvailNetworks(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::sendMqttDiscoveryConfig(void) {
|
void app::sendMqttDiscoveryConfig(void) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::sendMqttDiscoveryConfig"));
|
DPRINTLN(DBG_VERBOSE, F("app::sendMqttDiscoveryConfig"));
|
||||||
|
@ -716,7 +689,6 @@ void app::sendMqttDiscoveryConfig(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
const char *app::getFieldDeviceClass(uint8_t fieldId) {
|
const char *app::getFieldDeviceClass(uint8_t fieldId) {
|
||||||
uint8_t pos = 0;
|
uint8_t pos = 0;
|
||||||
|
@ -727,7 +699,6 @@ const char* app::getFieldDeviceClass(uint8_t fieldId) {
|
||||||
return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : deviceClasses[deviceFieldAssignment[pos].deviceClsId];
|
return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : deviceClasses[deviceFieldAssignment[pos].deviceClsId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
const char *app::getFieldStateClass(uint8_t fieldId) {
|
const char *app::getFieldStateClass(uint8_t fieldId) {
|
||||||
uint8_t pos = 0;
|
uint8_t pos = 0;
|
||||||
|
@ -738,7 +709,6 @@ const char* app::getFieldStateClass(uint8_t fieldId) {
|
||||||
return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : stateClasses[deviceFieldAssignment[pos].stateClsId];
|
return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : stateClasses[deviceFieldAssignment[pos].stateClsId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::resetSystem(void) {
|
void app::resetSystem(void) {
|
||||||
mUptimeSecs = 0;
|
mUptimeSecs = 0;
|
||||||
|
@ -770,13 +740,11 @@ void app::resetSystem(void) {
|
||||||
|
|
||||||
mShowRebootRequest = false;
|
mShowRebootRequest = false;
|
||||||
|
|
||||||
|
|
||||||
memset(mPayload, 0, (MAX_NUM_INVERTERS * sizeof(invPayload_t)));
|
memset(mPayload, 0, (MAX_NUM_INVERTERS * sizeof(invPayload_t)));
|
||||||
memset(&mStat, 0, sizeof(statistics_t));
|
memset(&mStat, 0, sizeof(statistics_t));
|
||||||
mLastPacketId = 0x00;
|
mLastPacketId = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::loadDefaultConfig(void) {
|
void app::loadDefaultConfig(void) {
|
||||||
memset(&mSysConfig, 0, sizeof(sysConfig_t));
|
memset(&mSysConfig, 0, sizeof(sysConfig_t));
|
||||||
|
@ -789,7 +757,6 @@ void app::loadDefaultConfig(void) {
|
||||||
snprintf(mSysConfig.stationSsid, SSID_LEN, "%s", FB_WIFI_SSID);
|
snprintf(mSysConfig.stationSsid, SSID_LEN, "%s", FB_WIFI_SSID);
|
||||||
snprintf(mSysConfig.stationPwd, PWD_LEN, "%s", FB_WIFI_PWD);
|
snprintf(mSysConfig.stationPwd, PWD_LEN, "%s", FB_WIFI_PWD);
|
||||||
|
|
||||||
|
|
||||||
// nrf24
|
// nrf24
|
||||||
mConfig.sendInterval = SEND_INTERVAL;
|
mConfig.sendInterval = SEND_INTERVAL;
|
||||||
mConfig.maxRetransPerPyld = DEF_MAX_RETRANS_PER_PYLD;
|
mConfig.maxRetransPerPyld = DEF_MAX_RETRANS_PER_PYLD;
|
||||||
|
@ -823,7 +790,6 @@ void app::loadDefaultConfig(void) {
|
||||||
mConfig.disclaimer = false;
|
mConfig.disclaimer = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::loadEEpconfig(void) {
|
void app::loadEEpconfig(void) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::loadEEpconfig"));
|
DPRINTLN(DBG_VERBOSE, F("app::loadEEpconfig"));
|
||||||
|
@ -866,7 +832,6 @@ void app::loadEEpconfig(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::saveValues(void) {
|
void app::saveValues(void) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::saveValues"));
|
DPRINTLN(DBG_VERBOSE, F("app::saveValues"));
|
||||||
|
@ -891,7 +856,6 @@ void app::saveValues(void) {
|
||||||
mLatestSunTimestamp = 0;
|
mLatestSunTimestamp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::setupMqtt(void) {
|
void app::setupMqtt(void) {
|
||||||
if (mSettingsValid) {
|
if (mSettingsValid) {
|
||||||
|
@ -906,7 +870,6 @@ void app::setupMqtt(void) {
|
||||||
mMqtt.setup(&mConfig.mqtt, mSysConfig.deviceName);
|
mMqtt.setup(&mConfig.mqtt, mSysConfig.deviceName);
|
||||||
mMqtt.setCallback(std::bind(&app::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
mMqtt.setCallback(std::bind(&app::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
|
|
||||||
|
|
||||||
if (mMqttActive) {
|
if (mMqttActive) {
|
||||||
mMqtt.sendMsg("version", mVersion);
|
mMqtt.sendMsg("version", mVersion);
|
||||||
if (mMqtt.isConnected()) {
|
if (mMqtt.isConnected()) {
|
||||||
|
|
|
@ -69,7 +69,6 @@ platform = espressif32
|
||||||
board = lolin_d32
|
board = lolin_d32
|
||||||
build_flags = -D RELEASE -std=gnu++14
|
build_flags = -D RELEASE -std=gnu++14
|
||||||
build_unflags = -std=gnu++11
|
build_unflags = -std=gnu++11
|
||||||
upload_port = /dev/cu.SLAB_USBtoUART
|
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
time ; Add timestamp with milliseconds for each new line
|
time ; Add timestamp with milliseconds for each new line
|
||||||
|
@ -81,7 +80,6 @@ board = lolin_d32
|
||||||
build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial -std=gnu++14
|
build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial -std=gnu++14
|
||||||
build_unflags = -std=gnu++11
|
build_unflags = -std=gnu++11
|
||||||
build_type = debug
|
build_type = debug
|
||||||
upload_port = /dev/cu.SLAB_USBtoUART
|
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
time ; Add timestamp with milliseconds for each new line
|
time ; Add timestamp with milliseconds for each new line
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue