Browse Source

* inverter dependent mqtt (is avail)

* implemented heap stats #58
* inserted 'break' in ISR while loop
pull/63/head
lumapu 3 years ago
parent
commit
df5a306bb2
  1. 52
      tools/esp8266/app.cpp
  2. 4
      tools/esp8266/app.h
  3. 2
      tools/esp8266/defines.h
  4. 1
      tools/esp8266/hmRadio.h
  5. 8
      tools/esp8266/main.cpp
  6. 10
      tools/esp8266/main.h

52
tools/esp8266/app.cpp

@ -14,7 +14,6 @@ app::app() : Main() {
mSerialTicker = 0xffff; mSerialTicker = 0xffff;
mSerialInterval = 0; mSerialInterval = 0;
mMqttActive = false; mMqttActive = false;
mMqttNewDataAvail = false;
mTicker = 0; mTicker = 0;
mRxTicker = 0; mRxTicker = 0;
@ -25,8 +24,9 @@ app::app() : Main() {
mSerialDebug = false; mSerialDebug = false;
memset(mPayload, 0, (MAX_NUM_INVERTERS * sizeof(invPayload_t))); memset(mPayload, 0, (MAX_NUM_INVERTERS * sizeof(invPayload_t)));
mRxFailed = 0; mRxFailed = 0;
mRxSuccess = 0; mRxSuccess = 0;
mLastPacketId = 0x00;
mSys = new HmSystemType(); mSys = new HmSystemType();
} }
@ -162,8 +162,11 @@ void app::loop(void) {
} }
if((*pid & 0x80) == 0x80) { if((*pid & 0x80) == 0x80) {
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);
if(*pid > 0x81)
mLastPacketId = *pid;
}
} }
} }
} }
@ -182,14 +185,14 @@ void app::loop(void) {
mMqtt.loop(); mMqtt.loop();
if(checkTicker(&mTicker, 1000)) { if(checkTicker(&mTicker, 1000)) {
if(mMqttNewDataAvail) { if(++mMqttTicker >= mMqttInterval) {
if(++mMqttTicker >= mMqttInterval) { mMqttTicker = 0;
mMqttTicker = 0; mMqtt.isConnected(true);
mMqtt.isConnected(true); char topic[30], val[10];
char topic[30], val[10]; for(uint8_t id = 0; id < mSys->getNumInverters(); id++) {
for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { Inverter<> *iv = mSys->getInverterByPos(id);
Inverter<> *iv = mSys->getInverterByPos(id); if(NULL != iv) {
if(NULL != iv) { if(iv->isAvailable(mTimestamp)) {
for(uint8_t i = 0; i < iv->listLen; i++) { for(uint8_t i = 0; i < iv->listLen; i++) {
snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, fields[iv->assign[i].fieldId]); snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, fields[iv->assign[i].fieldId]);
snprintf(val, 10, "%.3f", iv->getValue(i)); snprintf(val, 10, "%.3f", iv->getValue(i));
@ -199,10 +202,9 @@ void app::loop(void) {
} }
} }
} }
snprintf(val, 10, "%d", ESP.getFreeHeap());
mMqtt.sendMsg("free_heap", val);
mMqttNewDataAvail = false;
} }
snprintf(val, 10, "%d", ESP.getFreeHeap());
mMqtt.sendMsg("free_heap", val);
} }
if(mSerialValues) { if(mSerialValues) {
@ -212,13 +214,15 @@ void app::loop(void) {
for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { for(uint8_t id = 0; id < mSys->getNumInverters(); id++) {
Inverter<> *iv = mSys->getInverterByPos(id); Inverter<> *iv = mSys->getInverterByPos(id);
if(NULL != iv) { if(NULL != iv) {
for(uint8_t i = 0; i < iv->listLen; i++) { if(iv->isAvailable(mTimestamp)) {
if(0.0f != iv->getValue(i)) { for(uint8_t i = 0; i < iv->listLen; i++) {
snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); if(0.0f != iv->getValue(i)) {
snprintf(val, 10, "%.3f %s", iv->getValue(i), iv->getUnit(i)); snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i));
DPRINTLN(String(topic) + ": " + String(val)); snprintf(val, 10, "%.3f %s", iv->getValue(i), iv->getUnit(i));
DPRINTLN(String(topic) + ": " + String(val));
}
yield();
} }
yield();
} }
} }
} }
@ -318,7 +322,10 @@ void app::processPayload(bool retransmit) {
else { else {
if(mSerialDebug) if(mSerialDebug)
DPRINTLN(F("Error while retrieving data: last frame missing: Request Retransmit")); DPRINTLN(F("Error while retrieving data: last frame missing: Request Retransmit"));
mSys->Radio.sendTimePacket(iv->radioId.u64, mPayload[iv->id].ts); if(0x00 != mLastPacketId)
mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x15, mLastPacketId, true);
else
mSys->Radio.sendTimePacket(iv->radioId.u64, mPayload[iv->id].ts);
} }
mSys->Radio.switchRxCh(100); mSys->Radio.switchRxCh(100);
} }
@ -343,7 +350,6 @@ void app::processPayload(bool retransmit) {
iv->addValue(i, payload); iv->addValue(i, payload);
} }
iv->doCalculations(); iv->doCalculations();
mMqttNewDataAvail = true;
} }
} }
} }

4
tools/esp8266/app.h

@ -87,6 +87,7 @@ class app : public Main {
invPayload_t mPayload[MAX_NUM_INVERTERS]; invPayload_t mPayload[MAX_NUM_INVERTERS];
uint32_t mRxFailed; uint32_t mRxFailed;
uint32_t mRxSuccess; uint32_t mRxSuccess;
uint8_t mLastPacketId;
// timer // timer
uint32_t mTicker; uint32_t mTicker;
@ -100,9 +101,10 @@ class app : public Main {
uint16_t mMqttTicker; uint16_t mMqttTicker;
uint16_t mMqttInterval; uint16_t mMqttInterval;
bool mMqttActive; bool mMqttActive;
// serial
uint16_t mSerialTicker; uint16_t mSerialTicker;
uint16_t mSerialInterval; uint16_t mSerialInterval;
bool mMqttNewDataAvail;
}; };
#endif /*__APP_H__*/ #endif /*__APP_H__*/

2
tools/esp8266/defines.h

@ -16,7 +16,7 @@
//------------------------------------- //-------------------------------------
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 4 #define VERSION_MINOR 4
#define VERSION_PATCH 10 #define VERSION_PATCH 11
//------------------------------------- //-------------------------------------

1
tools/esp8266/hmRadio.h

@ -123,6 +123,7 @@ class HmRadio {
bool tx_ok, tx_fail, rx_ready; bool tx_ok, tx_fail, rx_ready;
mNrf24.whatHappened(tx_ok, tx_fail, rx_ready); // reset interrupt status mNrf24.whatHappened(tx_ok, tx_fail, rx_ready); // reset interrupt status
mNrf24.flush_rx(); // drop the packet mNrf24.flush_rx(); // drop the packet
break;
} }
} }
RESTORE_IRQ; RESTORE_IRQ;

8
tools/esp8266/main.cpp

@ -32,6 +32,8 @@ Main::Main(void) {
mUptimeInterval = 1000; mUptimeInterval = 1000;
mTimestamp = 0; mTimestamp = 0;
mHeapStatCnt = 0;
} }
@ -102,6 +104,11 @@ void Main::loop(void) {
DPRINTLN("[NTP]: " + getDateTimeStr(mTimestamp)); DPRINTLN("[NTP]: " + getDateTimeStr(mTimestamp));
} }
} }
if(++mHeapStatCnt >= 10) {
mHeapStatCnt = 0;
stats();
}
} }
} }
@ -134,6 +141,7 @@ bool Main::getConfig(void) {
if(!mSettingsValid) { if(!mSettingsValid) {
DPRINTLN(F("Settings not valid, erasing ...")); DPRINTLN(F("Settings not valid, erasing ..."));
eraseSettings(); eraseSettings();
saveValues(false);
delay(100); delay(100);
DPRINTLN(F("... restarting ...")); DPRINTLN(F("... restarting ..."));
delay(100); delay(100);

10
tools/esp8266/main.h

@ -81,6 +81,15 @@ class Main {
return false; return false;
} }
void stats(void) {
uint32_t free;
uint16_t max;
uint8_t frag;
ESP.getHeapStats(&free, &max, &frag);
Serial.printf("free: 0x%x - max: 0x%x - frag: %d%%\n", free, max, frag);
}
char mStationSsid[SSID_LEN]; char mStationSsid[SSID_LEN];
char mStationPwd[PWD_LEN]; char mStationPwd[PWD_LEN];
bool mWifiSettingsValid; bool mWifiSettingsValid;
@ -115,6 +124,7 @@ class Main {
uint32_t mUptimeTicker; uint32_t mUptimeTicker;
uint16_t mUptimeInterval; uint16_t mUptimeInterval;
uint32_t mUptimeSecs; uint32_t mUptimeSecs;
uint8_t mHeapStatCnt;
DNSServer *mDns; DNSServer *mDns;
ESP8266HTTPUpdateServer *mUpdater; ESP8266HTTPUpdateServer *mUpdater;

Loading…
Cancel
Save