Browse Source

Merge branch 'main' into development

pull/168/head
Andreas Schiffler 3 years ago
parent
commit
8ec4b8e5f4
  1. 4
      tools/esp8266/app.cpp
  2. 2
      tools/esp8266/app.h
  3. 3
      tools/esp8266/crc.cpp
  4. 7
      tools/esp8266/crc.h
  5. 3
      tools/esp8266/hmInverter.h
  6. 22
      tools/esp8266/hmRadio.h
  7. 7
      tools/esp8266/hmSystem.h

4
tools/esp8266/app.cpp

@ -317,12 +317,12 @@ bool app::buildPayload(uint8_t id) {
for(uint8_t i = 0; i < mPayload[id].maxPackId; i ++) { for(uint8_t i = 0; i < mPayload[id].maxPackId; i ++) {
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 = crc16(mPayload[id].data[i], mPayload[id].len[i] - 2, crc); crc = Hoymiles::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 = crc16(mPayload[id].data[i], mPayload[id].len[i], crc); crc = Hoymiles::crc16(mPayload[id].data[i], mPayload[id].len[i], crc);
} }
yield(); yield();
} }

2
tools/esp8266/app.h

@ -166,7 +166,7 @@ class app {
while(length > 0) { while(length > 0) {
len = (length < 32) ? length : 32; len = (length < 32) ? length : 32;
mEep->read(start, buf, len); mEep->read(start, buf, len);
crc = crc16(buf, len, crc); crc = Hoymiles::crc16(buf, len, crc);
start += len; start += len;
length -= len; length -= len;
} }

3
tools/esp8266/crc.cpp

@ -5,6 +5,8 @@
#include "crc.h" #include "crc.h"
namespace Hoymiles {
uint8_t crc8(uint8_t buf[], uint8_t len) { uint8_t crc8(uint8_t buf[], uint8_t len) {
uint8_t crc = CRC8_INIT; uint8_t crc = CRC8_INIT;
for(uint8_t i = 0; i < len; i++) { for(uint8_t i = 0; i < len; i++) {
@ -33,3 +35,4 @@ uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start) {
} }
return crc; return crc;
} }
} // namespace Hoymiles

7
tools/esp8266/crc.h

@ -14,7 +14,10 @@
#define CRC16_MODBUS_POLYNOM 0xA001 #define CRC16_MODBUS_POLYNOM 0xA001
uint8_t crc8(uint8_t buf[], uint8_t len); namespace Hoymiles {
uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start = 0xffff);
uint8_t crc8(uint8_t buf[], uint8_t len);
uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start = 0xffff);
}
#endif /*__CRC_H__*/ #endif /*__CRC_H__*/

3
tools/esp8266/hmInverter.h

@ -81,6 +81,7 @@ class Inverter {
RECORDTYPE *record; // pointer for values RECORDTYPE *record; // pointer for values
uint16_t chMaxPwr[4]; // maximum power of the modules (Wp) uint16_t chMaxPwr[4]; // maximum power of the modules (Wp)
char chName[4][MAX_NAME_LENGTH]; // human readable name for channel char chName[4][MAX_NAME_LENGTH]; // human readable name for channel
bool initialized; // needed to check if the inverter was correctly added (ESP32 specific - union types are never null)
Inverter() { Inverter() {
ts = 0; ts = 0;
@ -88,6 +89,7 @@ class Inverter {
powerLimit[1] = 0x0000; // powerLimit[1] = 0x0000; //
devControlRequest = false; devControlRequest = false;
devControlCmd = 0xff; devControlCmd = 0xff;
initialized = false;
fwVersion = 0; fwVersion = 0;
} }
@ -103,6 +105,7 @@ class Inverter {
memset(name, 0, MAX_NAME_LENGTH); memset(name, 0, MAX_NAME_LENGTH);
memset(chName, 0, MAX_NAME_LENGTH * 4); memset(chName, 0, MAX_NAME_LENGTH * 4);
memset(record, 0, sizeof(RECORDTYPE) * listLen); memset(record, 0, sizeof(RECORDTYPE) * listLen);
initialized = true;
} }
uint8_t getPosByChFld(uint8_t channel, uint8_t fieldId) { uint8_t getPosByChFld(uint8_t channel, uint8_t fieldId) {

22
tools/esp8266/hmRadio.h

@ -59,7 +59,12 @@ template <uint8_t CE_PIN, uint8_t CS_PIN, class BUFFER, uint64_t DTU_ID=DTU_RADI
class HmRadio { class HmRadio {
public: public:
HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) { HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) {
DPRINTLN(DBG_VERBOSE, F("hmRadio.h : HmRadio():mNrf24(CE_PIN: ") + String(CE_PIN) + F(", CS_PIN: ") + String(CS_PIN) + F(", SPI_SPEED: ") + String(SPI_SPEED) + ")"); DPRINT(DBG_VERBOSE, F("hmRadio.h : HmRadio():mNrf24(CE_PIN: "));
DPRINT(DBG_VERBOSE, String(CE_PIN));
DPRINT(DBG_VERBOSE, F(", CS_PIN: "));
DPRINT(DBG_VERBOSE, String(CS_PIN));
DPRINT(DBG_VERBOSE, F(", SPI_SPEED: "));
DPRINTLN(DBG_VERBOSE, String(SPI_SPEED) + ")");
// Depending on the program, the module can work on 2403, 2423, 2440, 2461 or 2475MHz. // Depending on the program, the module can work on 2403, 2423, 2440, 2461 or 2475MHz.
// Channel List 2403, 2423, 2440, 2461, 2475MHz // Channel List 2403, 2423, 2440, 2461, 2475MHz
@ -101,7 +106,8 @@ class HmRadio {
// enable only receiving interrupts // enable only receiving interrupts
mNrf24.maskIRQ(true, true, false); mNrf24.maskIRQ(true, true, false);
DPRINTLN(DBG_INFO, F("RF24 Amp Pwr: RF24_PA_") + String(rf24AmpPowerNames[config->amplifierPower])); DPRINT(DBG_INFO, F("RF24 Amp Pwr: RF24_PA_"));
DPRINTLN(DBG_INFO, String(rf24AmpPowerNames[config->amplifierPower]));
mNrf24.setPALevel(config->amplifierPower & 0x03); mNrf24.setPALevel(config->amplifierPower & 0x03);
mNrf24.startListening(); mNrf24.startListening();
@ -170,12 +176,12 @@ class HmRadio {
mTxBuf[10 + (++cnt)] = ((data[1] ) ) & 0xff; // setting for persistens handling mTxBuf[10 + (++cnt)] = ((data[1] ) ) & 0xff; // setting for persistens handling
} }
// crc control data // crc control data
uint16_t crc = crc16(&mTxBuf[10], cnt+1); uint16_t crc = Hoymiles::crc16(&mTxBuf[10], cnt+1);
mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff; mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff;
mTxBuf[10 + (++cnt)] = (crc ) & 0xff; mTxBuf[10 + (++cnt)] = (crc ) & 0xff;
// crc over all // crc over all
cnt +=1; cnt +=1;
mTxBuf[10 + cnt] = crc8(mTxBuf, 10 + cnt); mTxBuf[10 + cnt] = Hoymiles::crc8(mTxBuf, 10 + cnt);
sendPacket(invId, mTxBuf, 10 + (++cnt), true); sendPacket(invId, mTxBuf, 10 + (++cnt), true);
} }
@ -194,10 +200,10 @@ class HmRadio {
mTxBuf[18] = 0x00; mTxBuf[18] = 0x00;
mTxBuf[19] = 0x00; mTxBuf[19] = 0x00;
} }
uint16_t crc = crc16(&mTxBuf[10], 14); uint16_t crc = Hoymiles::crc16(&mTxBuf[10], 14);
mTxBuf[24] = (crc >> 8) & 0xff; mTxBuf[24] = (crc >> 8) & 0xff;
mTxBuf[25] = (crc ) & 0xff; mTxBuf[25] = (crc ) & 0xff;
mTxBuf[26] = crc8(mTxBuf, 26); mTxBuf[26] = Hoymiles::crc8(mTxBuf, 26);
sendPacket(invId, mTxBuf, 27, true); sendPacket(invId, mTxBuf, 27, true);
} }
@ -210,7 +216,7 @@ class HmRadio {
CP_U32_BigEndian(&mTxBuf[5], (DTU_ID >> 8)); CP_U32_BigEndian(&mTxBuf[5], (DTU_ID >> 8));
mTxBuf[9] = pid; mTxBuf[9] = pid;
if(calcCrc) { if(calcCrc) {
mTxBuf[10] = crc8(mTxBuf, 10); mTxBuf[10] = Hoymiles::crc8(mTxBuf, 10);
sendPacket(invId, mTxBuf, 11, false); sendPacket(invId, mTxBuf, 11, false);
} }
} }
@ -224,7 +230,7 @@ class HmRadio {
buf[i-1] = (buf[i] << 1) | (buf[i+1] >> 7); buf[i-1] = (buf[i] << 1) | (buf[i+1] >> 7);
} }
uint8_t crc = crc8(buf, *len-1); uint8_t crc = Hoymiles::crc8(buf, *len-1);
bool valid = (crc == buf[*len-1]); bool valid = (crc == buf[*len-1]);
return valid; return valid;

7
tools/esp8266/hmSystem.h

@ -52,7 +52,10 @@ class HmSystem {
case 0x21: p->type = INV_TYPE_1CH; break; case 0x21: p->type = INV_TYPE_1CH; break;
case 0x41: p->type = INV_TYPE_2CH; break; case 0x41: p->type = INV_TYPE_2CH; break;
case 0x61: p->type = INV_TYPE_4CH; break; case 0x61: p->type = INV_TYPE_4CH; break;
default: DPRINTLN(DBG_ERROR, F("unknown inverter type: 11") + String(p->serial.b[4], HEX)); break; default:
DPRINT(DBG_ERROR, F("unknown inverter type: 11"));
DPRINTLN(DBG_ERROR, String(p->serial.b[4], HEX));
break;
} }
} }
else else
@ -88,7 +91,7 @@ class HmSystem {
INVERTERTYPE *getInverterByPos(uint8_t pos, bool check = true) { INVERTERTYPE *getInverterByPos(uint8_t pos, bool check = true) {
DPRINTLN(DBG_VERBOSE, F("hmSystem.h:getInverterByPos")); DPRINTLN(DBG_VERBOSE, F("hmSystem.h:getInverterByPos"));
if((mInverter[pos].serial.u64 != 0ULL) || false == check) if((mInverter[pos].initialized && mInverter[pos].serial.u64 != 0ULL) || false == check)
return &mInverter[pos]; return &mInverter[pos];
else else
return NULL; return NULL;

Loading…
Cancel
Save