|  |  | @ -12,7 +12,7 @@ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | app::app() : Main() { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::app():Main")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::app():Main")); | 
			
		
	
		
			
				
					|  |  |  |     mSendTicker     = 0xffff; | 
			
		
	
		
			
				
					|  |  |  |     mSendInterval   = 0; | 
			
		
	
		
			
				
					|  |  |  |     mMqttTicker     = 0xffff; | 
			
		
	
	
		
			
				
					|  |  | @ -49,7 +49,7 @@ app::~app(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::setup(uint32_t timeout) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::setup")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::setup")); | 
			
		
	
		
			
				
					|  |  |  |     Main::setup(timeout); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     mWeb->on("/",          std::bind(&app::showIndex,      this)); | 
			
		
	
	
		
			
				
					|  |  | @ -78,7 +78,7 @@ void app::setup(uint32_t timeout) { | 
			
		
	
		
			
				
					|  |  |  |             if(0ULL != invSerial) { | 
			
		
	
		
			
				
					|  |  |  |                 iv = mSys->addInverter(name, invSerial, modPwr); | 
			
		
	
		
			
				
					|  |  |  |                 if(NULL != iv) { | 
			
		
	
		
			
				
					|  |  |  |                     DPRINTLN(F("add inverter: ") + String(name) + ", SN: " + String(invSerial, HEX)); | 
			
		
	
		
			
				
					|  |  |  |                     DPRINTLN(DBG_INFO, F("add inverter: ") + String(name) + ", SN: " + String(invSerial, HEX)); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     for(uint8_t j = 0; j < 4; j++) { | 
			
		
	
		
			
				
					|  |  |  |                         mEep->read(ADDR_INV_CH_NAME + (i * 4 * MAX_NAME_LENGTH) + j * MAX_NAME_LENGTH, name, MAX_NAME_LENGTH); | 
			
		
	
	
		
			
				
					|  |  | @ -167,11 +167,13 @@ void app::setup(uint32_t timeout) { | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     else { | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("Settings not valid, erasing ...")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_DEBUG, F("CRC pos: ") + String(ADDR_SETTINGS_CRC)); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_DEBUG, F("NXT pos: ") + String(ADDR_NEXT)); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_INFO, F("Settings not valid, erasing ...")); | 
			
		
	
		
			
				
					|  |  |  |         eraseSettings(); | 
			
		
	
		
			
				
					|  |  |  |         saveValues(false); | 
			
		
	
		
			
				
					|  |  |  |         delay(100); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("... restarting ...")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_INFO, F("... restarting ...")); | 
			
		
	
		
			
				
					|  |  |  |         delay(100); | 
			
		
	
		
			
				
					|  |  |  |         ESP.restart(); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  | @ -179,21 +181,21 @@ void app::setup(uint32_t timeout) { | 
			
		
	
		
			
				
					|  |  |  |     mSys->setup(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if(!mWifiSettingsValid) | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("Warn: your settings are not valid! check [IP]/setup")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_WARN, F("your settings are not valid! check [IP]/setup")); | 
			
		
	
		
			
				
					|  |  |  |     else { | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("\n\n----------------------------------------")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("Welcome to AHOY!")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINT(F("\npoint your browser to http://")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(WiFi.localIP()); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("to configure your device")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(F("----------------------------------------\n")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_INFO, F("\n\n----------------------------------------")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_INFO, F("Welcome to AHOY!")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINT(DBG_INFO, F("\npoint your browser to http://")); | 
			
		
	
		
			
				
					|  |  |  |         DBGPRINTLN(WiFi.localIP()); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_INFO, F("to configure your device")); | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_INFO, F("----------------------------------------\n")); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  |     //DBGAPP(F("app::loop"))
 | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::loop")); | 
			
		
	
		
			
				
					|  |  |  |     Main::loop(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     mSys->Radio.loop(); | 
			
		
	
	
		
			
				
					|  |  | @ -201,11 +203,10 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  |     yield(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if(checkTicker(&mRxTicker, 5)) { | 
			
		
	
		
			
				
					|  |  |  | #ifdef DEBUG_APP | 
			
		
	
		
			
				
					|  |  |  |         //DPRINTLN(F("app_loops =") + String(app_loops));
 | 
			
		
	
		
			
				
					|  |  |  |         //app_loops=0;
 | 
			
		
	
		
			
				
					|  |  |  |         //DPRINT(F("a"));
 | 
			
		
	
		
			
				
					|  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |         DPRINTLN(DBG_DEBUG, F("app_loops =") + String(app_loops)); | 
			
		
	
		
			
				
					|  |  |  |         app_loops=0; | 
			
		
	
		
			
				
					|  |  |  |         DPRINT(DBG_DEBUG, F("a")); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         bool rxRdy = mSys->Radio.switchRxCh(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if(!mSys->BufCtrl.empty()) { | 
			
		
	
	
		
			
				
					|  |  | @ -215,7 +216,7 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  |             if(mSys->Radio.checkPaketCrc(p->packet, &len, p->rxCh)) { | 
			
		
	
		
			
				
					|  |  |  |                 // process buffer only on first occurrence
 | 
			
		
	
		
			
				
					|  |  |  |                 if(mSerialDebug) { | 
			
		
	
		
			
				
					|  |  |  |                     DPRINT("Received " + String(len) + " bytes channel " + String(p->rxCh) + ": "); | 
			
		
	
		
			
				
					|  |  |  |                     DPRINT(DBG_DEBUG, "Received " + String(len) + " bytes channel " + String(p->rxCh) + ": "); | 
			
		
	
		
			
				
					|  |  |  |                     mSys->Radio.dumpBuf(NULL, p->packet, len); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 mFrameCnt++; | 
			
		
	
	
		
			
				
					|  |  | @ -287,7 +288,7 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  |                                 if(0.0f != iv->getValue(i)) { | 
			
		
	
		
			
				
					|  |  |  |                                     snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); | 
			
		
	
		
			
				
					|  |  |  |                                     snprintf(val, 10, "%.3f %s", iv->getValue(i), iv->getUnit(i)); | 
			
		
	
		
			
				
					|  |  |  |                                     DPRINTLN(String(topic) + ": " + String(val)); | 
			
		
	
		
			
				
					|  |  |  |                                     DPRINTLN(DBG_INFO, String(topic) + ": " + String(val)); | 
			
		
	
		
			
				
					|  |  |  |                                 } | 
			
		
	
		
			
				
					|  |  |  |                                 yield(); | 
			
		
	
		
			
				
					|  |  |  |                             } | 
			
		
	
	
		
			
				
					|  |  | @ -302,11 +303,11 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             if(0 != mTimestamp) { | 
			
		
	
		
			
				
					|  |  |  |                 if(mSerialDebug) | 
			
		
	
		
			
				
					|  |  |  |                     DPRINTLN(F("Free heap: 0x") + String(ESP.getFreeHeap(), HEX)); | 
			
		
	
		
			
				
					|  |  |  |                     DPRINTLN(DBG_DEBUG, F("Free heap: 0x") + String(ESP.getFreeHeap(), HEX)); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 if(!mSys->BufCtrl.empty()) { | 
			
		
	
		
			
				
					|  |  |  |                     if(mSerialDebug) | 
			
		
	
		
			
				
					|  |  |  |                         DPRINTLN(F("recbuf not empty! #") + String(mSys->BufCtrl.getFill())); | 
			
		
	
		
			
				
					|  |  |  |                         DPRINTLN(DBG_DEBUG, F("recbuf not empty! #") + String(mSys->BufCtrl.getFill())); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 int8_t maxLoop = MAX_NUM_INVERTERS; | 
			
		
	
	
		
			
				
					|  |  | @ -325,8 +326,8 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  |                     if(!mPayload[iv->id].complete) { | 
			
		
	
		
			
				
					|  |  |  |                         mRxFailed++; | 
			
		
	
		
			
				
					|  |  |  |                         if(mSerialDebug) { | 
			
		
	
		
			
				
					|  |  |  |                             DPRINT(F("Inverter #") + String(iv->id) + " "); | 
			
		
	
		
			
				
					|  |  |  |                             DPRINTLN(F("no Payload received! (retransmits: ") + String(mPayload[iv->id].retransmits) + ")"); | 
			
		
	
		
			
				
					|  |  |  |                             DPRINT(DBG_INFO, F("Inverter #") + String(iv->id) + " "); | 
			
		
	
		
			
				
					|  |  |  |                             DPRINTLN(DBG_INFO, F("no Payload received! (retransmits: ") + String(mPayload[iv->id].retransmits) + ")"); | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -340,13 +341,13 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     yield(); | 
			
		
	
		
			
				
					|  |  |  |                     if(mSerialDebug) | 
			
		
	
		
			
				
					|  |  |  |                         DPRINTLN(F("Requesting Inverter SN ") + String(iv->serial.u64, HEX)); | 
			
		
	
		
			
				
					|  |  |  |                         DPRINTLN(DBG_INFO, F("Requesting Inverter SN ") + String(iv->serial.u64, HEX)); | 
			
		
	
		
			
				
					|  |  |  |                     mSys->Radio.sendTimePacket(iv->radioId.u64, mPayload[iv->id].ts); | 
			
		
	
		
			
				
					|  |  |  |                     mRxTicker = 0; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             else if(mSerialDebug) | 
			
		
	
		
			
				
					|  |  |  |                 DPRINTLN(F("time not set, can't request inverter!")); | 
			
		
	
		
			
				
					|  |  |  |                 DPRINTLN(DBG_WARN, F("time not set, can't request inverter!")); | 
			
		
	
		
			
				
					|  |  |  |             yield(); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  | @ -355,14 +356,14 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::handleIntr(void) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::handleIntr")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::handleIntr")); | 
			
		
	
		
			
				
					|  |  |  |     mSys->Radio.handleIntr(); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | bool app::buildPayload(uint8_t id) { | 
			
		
	
		
			
				
					|  |  |  |     //DBGAPP(F("app::buildPayload"));
 | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::buildPayload")); | 
			
		
	
		
			
				
					|  |  |  |     uint16_t crc = 0xffff, crcRcv; | 
			
		
	
		
			
				
					|  |  |  |     if(mPayload[id].maxPackId > MAX_PAYLOAD_ENTRIES) | 
			
		
	
		
			
				
					|  |  |  |         mPayload[id].maxPackId = MAX_PAYLOAD_ENTRIES; | 
			
		
	
	
		
			
				
					|  |  | @ -387,7 +388,7 @@ bool app::buildPayload(uint8_t id) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::processPayload(bool retransmit) { | 
			
		
	
		
			
				
					|  |  |  |     //DBGAPP(F("app::processPayload"));
 | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::processPayload")); | 
			
		
	
		
			
				
					|  |  |  |     for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { | 
			
		
	
		
			
				
					|  |  |  |         Inverter<> *iv = mSys->getInverterByPos(id); | 
			
		
	
		
			
				
					|  |  |  |         if(NULL != iv) { | 
			
		
	
	
		
			
				
					|  |  | @ -401,7 +402,7 @@ void app::processPayload(bool retransmit) { | 
			
		
	
		
			
				
					|  |  |  |                                     for(uint8_t i = 0; i < (mPayload[iv->id].maxPackId-1); i ++) { | 
			
		
	
		
			
				
					|  |  |  |                                         if(mPayload[iv->id].len[i] == 0) { | 
			
		
	
		
			
				
					|  |  |  |                                             if(mSerialDebug) | 
			
		
	
		
			
				
					|  |  |  |                                                 DPRINTLN(F("Error while retrieving data: Frame ") + String(i+1) + F(" missing: Request Retransmit")); | 
			
		
	
		
			
				
					|  |  |  |                                                 DPRINTLN(DBG_ERROR, F("while retrieving data: Frame ") + String(i+1) + F(" missing: Request Retransmit")); | 
			
		
	
		
			
				
					|  |  |  |                                             mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x15, (0x81+i), true); | 
			
		
	
		
			
				
					|  |  |  |                                             break; // only retransmit one frame per loop
 | 
			
		
	
		
			
				
					|  |  |  |                                         } | 
			
		
	
	
		
			
				
					|  |  | @ -410,7 +411,7 @@ void app::processPayload(bool retransmit) { | 
			
		
	
		
			
				
					|  |  |  |                                 } | 
			
		
	
		
			
				
					|  |  |  |                                 else { | 
			
		
	
		
			
				
					|  |  |  |                                     if(mSerialDebug) | 
			
		
	
		
			
				
					|  |  |  |                                         DPRINTLN(F("Error while retrieving data: last frame missing: Request Retransmit")); | 
			
		
	
		
			
				
					|  |  |  |                                         DPRINTLN(DBG_ERROR, F("while retrieving data: last frame missing: Request Retransmit")); | 
			
		
	
		
			
				
					|  |  |  |                                     if(0x00 != mLastPacketId) | 
			
		
	
		
			
				
					|  |  |  |                                         mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x15, mLastPacketId, true); | 
			
		
	
		
			
				
					|  |  |  |                                     else | 
			
		
	
	
		
			
				
					|  |  | @ -433,7 +434,7 @@ void app::processPayload(bool retransmit) { | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     offs-=2; | 
			
		
	
		
			
				
					|  |  |  |                     if(mSerialDebug) { | 
			
		
	
		
			
				
					|  |  |  |                         DPRINT(F("Payload (") + String(offs) + "): "); | 
			
		
	
		
			
				
					|  |  |  |                         DPRINT(DBG_INFO, F("Payload (") + String(offs) + "): "); | 
			
		
	
		
			
				
					|  |  |  |                         mSys->Radio.dumpBuf(NULL, payload, offs); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     mRxSuccess++; | 
			
		
	
	
		
			
				
					|  |  | @ -453,7 +454,7 @@ void app::processPayload(bool retransmit) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showIndex(void) { | 
			
		
	
		
			
				
					|  |  |  |     //DBGAPP(F("app::showIndex"));
 | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showIndex")); | 
			
		
	
		
			
				
					|  |  |  |     String html = FPSTR(index_html); | 
			
		
	
		
			
				
					|  |  |  |     html.replace(F("{DEVICE}"), mDeviceName); | 
			
		
	
		
			
				
					|  |  |  |     html.replace(F("{VERSION}"), mVersion); | 
			
		
	
	
		
			
				
					|  |  | @ -465,7 +466,7 @@ void app::showIndex(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showSetup(void) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::showSetup")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showSetup")); | 
			
		
	
		
			
				
					|  |  |  |     // overrides same method in main.cpp
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     uint16_t interval; | 
			
		
	
	
		
			
				
					|  |  | @ -585,14 +586,14 @@ void app::showSetup(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showSave(void) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::showSave")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showSave")); | 
			
		
	
		
			
				
					|  |  |  |     saveValues(true); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showErase() { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::showErase")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showErase")); | 
			
		
	
		
			
				
					|  |  |  |     eraseSettings(); | 
			
		
	
		
			
				
					|  |  |  |     showReboot(); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -600,7 +601,7 @@ void app::showErase() { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showStatistics(void) { | 
			
		
	
		
			
				
					|  |  |  |     //DBGAPP(F("app::showStatistics"));
 | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showStatistics")); | 
			
		
	
		
			
				
					|  |  |  |     String content = F("Receive success: ") + String(mRxSuccess) + "\n"; | 
			
		
	
		
			
				
					|  |  |  |     content += F("Receive fail: ") + String(mRxFailed) + "\n"; | 
			
		
	
		
			
				
					|  |  |  |     content += F("Frames received: ") + String(mFrameCnt) + "\n"; | 
			
		
	
	
		
			
				
					|  |  | @ -648,7 +649,7 @@ void app::showStatistics(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showHoymiles(void) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::showHoymiles")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showHoymiles")); | 
			
		
	
		
			
				
					|  |  |  |     String html = FPSTR(hoymiles_html); | 
			
		
	
		
			
				
					|  |  |  |     html.replace(F("{DEVICE}"), mDeviceName); | 
			
		
	
		
			
				
					|  |  |  |     html.replace(F("{VERSION}"), mVersion); | 
			
		
	
	
		
			
				
					|  |  | @ -660,7 +661,7 @@ void app::showHoymiles(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::showLiveData(void) { | 
			
		
	
		
			
				
					|  |  |  |     //DBGAPP(F("app::showLiveData"));
 | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::showLiveData")); | 
			
		
	
		
			
				
					|  |  |  |     String modHtml; | 
			
		
	
		
			
				
					|  |  |  |     for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { | 
			
		
	
		
			
				
					|  |  |  |         Inverter<> *iv = mSys->getInverterByPos(id); | 
			
		
	
	
		
			
				
					|  |  | @ -738,7 +739,7 @@ void app::showLiveData(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::saveValues(bool webSend = true) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::saveValues")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::saveValues")); | 
			
		
	
		
			
				
					|  |  |  |     Main::saveValues(false); // general configuration
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if(mWeb->args() > 0) { | 
			
		
	
	
		
			
				
					|  |  | @ -822,8 +823,8 @@ void app::saveValues(bool webSend = true) { | 
			
		
	
		
			
				
					|  |  |  |         mEep->write(ADDR_SER_ENABLE, (uint8_t)((tmp) ? 0x01 : 0x00)); | 
			
		
	
		
			
				
					|  |  |  |         mSerialDebug = (mWeb->arg("serDbg") == "on"); | 
			
		
	
		
			
				
					|  |  |  |         mEep->write(ADDR_SER_DEBUG, (uint8_t)((mSerialDebug) ? 0x01 : 0x00)); | 
			
		
	
		
			
				
					|  |  |  |         DPRINT("Info: Serial debug is "); | 
			
		
	
		
			
				
					|  |  |  |         if(mSerialDebug) DPRINTLN("on"); else DPRINTLN("off"); | 
			
		
	
		
			
				
					|  |  |  |         DPRINT(DBG_INFO, "Serial debug is "); | 
			
		
	
		
			
				
					|  |  |  |         if(mSerialDebug) DPRINTLN(DBG_INFO, "on"); else DPRINTLN(DBG_INFO, "off"); | 
			
		
	
		
			
				
					|  |  |  |         mSys->Radio.mSerialDebug = mSerialDebug; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         updateCrc(); | 
			
		
	
	
		
			
				
					|  |  | @ -847,11 +848,11 @@ void app::saveValues(bool webSend = true) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::updateCrc(void) { | 
			
		
	
		
			
				
					|  |  |  |     DBGAPP(F("app::updateCrc")); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::updateCrc")); | 
			
		
	
		
			
				
					|  |  |  |     Main::updateCrc(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     uint16_t crc; | 
			
		
	
		
			
				
					|  |  |  |     crc = buildEEpCrc(ADDR_START_SETTINGS, (ADDR_NEXT - ADDR_START_SETTINGS)); | 
			
		
	
		
			
				
					|  |  |  |     //DPRINTLN("new CRC: " + String(crc, HEX));
 | 
			
		
	
		
			
				
					|  |  |  |     crc = buildEEpCrc(ADDR_START_SETTINGS, ((ADDR_NEXT) - (ADDR_START_SETTINGS))); | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_DEBUG, F("new CRC: ") + String(crc, HEX)); | 
			
		
	
		
			
				
					|  |  |  |     mEep->write(ADDR_SETTINGS_CRC, crc); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | 
 |