Browse Source

add GetLossRate feature

HM only
pull/1284/head
rejoe2 2 years ago
committed by GitHub
parent
commit
ab69d13b2c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/defines.h
  2. 6
      src/hm/Communication.h
  3. 2
      src/hm/hmDefines.h
  4. 48
      src/hm/hmInverter.h
  5. 11
      src/hm/hmRadio.h
  6. 1
      src/hms/hmsRadio.h
  7. 5
      src/publisher/pubMqttIvData.h

2
src/defines.h

@ -13,7 +13,7 @@
//------------------------------------- //-------------------------------------
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 8 #define VERSION_MINOR 8
#define VERSION_PATCH 2708 #define VERSION_PATCH 2716
//------------------------------------- //-------------------------------------
typedef struct { typedef struct {

6
src/hm/Communication.h

@ -176,6 +176,7 @@ class Communication : public CommQueue<> {
if(validateIvSerial(&p->packet[1], q->iv)) { if(validateIvSerial(&p->packet[1], q->iv)) {
q->iv->radioStatistics.frmCnt++; q->iv->radioStatistics.frmCnt++;
q->iv->mDtuRxCnt++;
//q->iv->mRxChanIdx = mRxChanIdx; //q->iv->mRxChanIdx = mRxChanIdx;
if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command
@ -486,8 +487,13 @@ class Communication : public CommQueue<> {
record_t<> *rec = q->iv->getRecordStruct(q->cmd); record_t<> *rec = q->iv->getRecordStruct(q->cmd);
if(NULL == rec) { if(NULL == rec) {
if(GetLossRate == q->cmd) {
q->iv->parseGetLossRate(q->iv->id, mPayload, len);
closeRequest(q, true);
} else {
DPRINTLN(DBG_ERROR, F("record is NULL!")); DPRINTLN(DBG_ERROR, F("record is NULL!"));
closeRequest(q, false); closeRequest(q, false);
}
return; return;
} }
if((rec->pyldLen != len) && (0 != rec->pyldLen)) { if((rec->pyldLen != len) && (0 != rec->pyldLen)) {

2
src/hm/hmDefines.h

@ -139,6 +139,8 @@ const byteAssign_t AlarmDataAssignment[] = {
#define HMALARMDATA_PAYLOAD_LEN 0 // 0: means check is off #define HMALARMDATA_PAYLOAD_LEN 0 // 0: means check is off
#define ALARM_LOG_ENTRY_SIZE 12 #define ALARM_LOG_ENTRY_SIZE 12
#define HMGETLOSSRATE_PAYLOAD_LEN 4
#define AHOY_GET_LOSS_INTERVAL 10
//------------------------------------- //-------------------------------------
// HM300, HM350, HM400 // HM300, HM350, HM400

48
src/hm/hmInverter.h

@ -135,6 +135,7 @@ class Inverter {
bool mGotLastMsg; // shows if inverter has already finished transmission cycle bool mGotLastMsg; // shows if inverter has already finished transmission cycle
uint8_t mCmd; // holds the command to send uint8_t mCmd; // holds the command to send
uint8_t mRxChanIdx; // holds the index of the last used rx channel uint8_t mRxChanIdx; // holds the index of the last used rx channel
bool mRxChanSync; // indicates if last rx channel ist synced
bool mIsSingleframeReq; // indicates this is a missing single frame request bool mIsSingleframeReq; // indicates this is a missing single frame request
Radio *radio; // pointer to associated radio class Radio *radio; // pointer to associated radio class
statistics_t radioStatistics; // information about transmitted, failed, ... packets statistics_t radioStatistics; // information about transmitted, failed, ... packets
@ -142,6 +143,12 @@ class Inverter {
uint8_t curCmtFreq; // current used CMT frequency, used to check if freq. was changed during runtime uint8_t curCmtFreq; // current used CMT frequency, used to check if freq. was changed during runtime
bool commEnabled; // 'pause night communication' sets this field to false bool commEnabled; // 'pause night communication' sets this field to false
uint16_t mIvRxCnt; // last iv rx frames (from GetLossRate)
uint16_t mIvTxCnt; // last iv tx frames (from GetLossRate)
uint16_t mDtuRxCnt; // cur dtu rx frames (since last GetLossRate)
uint16_t mDtuTxCnt; // cur dtu tx frames (since last getLoassRate)
uint8_t mGetLossInterval; // request iv every AHOY_GET_LOSS_INTERVAL RealTimeRunData_Debug
static uint32_t *timestamp; // system timestamp static uint32_t *timestamp; // system timestamp
static cfgInst_t *generalConfig; // general inverter configuration from setup static cfgInst_t *generalConfig; // general inverter configuration from setup
@ -164,6 +171,7 @@ class Inverter {
mGotLastMsg = false; mGotLastMsg = false;
mCmd = InitDataState; mCmd = InitDataState;
mRxChanIdx = 1; mRxChanIdx = 1;
mRxChanSync = false;
mIsSingleframeReq = false; mIsSingleframeReq = false;
radio = NULL; radio = NULL;
commEnabled = true; commEnabled = true;
@ -180,6 +188,8 @@ class Inverter {
cb(devControlCmd, true); cb(devControlCmd, true);
mDevControlRequest = false; mDevControlRequest = false;
} else if (IV_MI != ivGen) { } else if (IV_MI != ivGen) {
mGetLossInterval++;
if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0))
cb(AlarmData, false); // get last alarms cb(AlarmData, false); // get last alarms
else if(0 == getFwVersion()) else if(0 == getFwVersion())
@ -191,9 +201,18 @@ class Inverter {
else if(InitDataState != devControlCmd) { else if(InitDataState != devControlCmd) {
cb(devControlCmd, false); // custom command which was received by API cb(devControlCmd, false); // custom command which was received by API
devControlCmd = InitDataState; devControlCmd = InitDataState;
} else if((0 == mGridLen) && generalConfig->readGrid) { // read grid profile mGetLossInterval = 1;
}
else if((0 == mGridLen) && generalConfig->readGrid) { // read grid profile
cb(GridOnProFilePara, false); cb(GridOnProFilePara, false);
} else }
else if (mGetLossInterval > AHOY_GET_LOSS_INTERVAL) {
mGetLossInterval = 1;
//DPRINTLN(DBG_INFO, F("enqueue GetLossRate"));
cb(GetLossRate, false);
}
else
cb(RealTimeRunData_Debug, false); // get live data cb(RealTimeRunData_Debug, false); // get live data
} else { } else {
if(0 == getFwVersion()) if(0 == getFwVersion())
@ -202,11 +221,13 @@ class Inverter {
record_t<> *rec = getRecordStruct(InverterDevInform_Simple); record_t<> *rec = getRecordStruct(InverterDevInform_Simple);
if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0)
cb(0x0f, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 cb(0x0f, false); // hard- and firmware version for missing HW part nr, delivered by frame 1
else else {
mGetLossInterval++;
cb(((type == INV_TYPE_4CH) ? MI_REQ_4CH : MI_REQ_CH1), false); cb(((type == INV_TYPE_4CH) ? MI_REQ_4CH : MI_REQ_CH1), false);
} }
} }
} }
}
void init(void) { void init(void) {
DPRINTLN(DBG_VERBOSE, F("hmInverter.h:init")); DPRINTLN(DBG_VERBOSE, F("hmInverter.h:init"));
@ -580,6 +601,27 @@ class Inverter {
memset(mLastYD, 0, sizeof(float) * 6); memset(mLastYD, 0, sizeof(float) * 6);
} }
bool parseGetLossRate(uint8_t id, uint8_t pyld[], uint8_t len) {
if (len == HMGETLOSSRATE_PAYLOAD_LEN) {
uint16_t rxCnt = (pyld[0] << 8) + pyld[1];
uint16_t txCnt = (pyld[2] << 8) + pyld[3];
if (mIvRxCnt || mIvTxCnt) { // there was successful GetLossRate in the past
DPRINT_IVID(DBG_INFO, id);
DBGPRINTLN("Inv loss: " + String (mDtuTxCnt - (rxCnt - mIvRxCnt)) + " of " +
String (mDtuTxCnt) + ", DTU loss: " +
String (txCnt - mIvTxCnt - mDtuRxCnt) + " of " +
String (txCnt - mIvTxCnt));
}
mIvRxCnt = rxCnt;
mIvTxCnt = txCnt;
mDtuRxCnt = 0; // start new interval
mDtuTxCnt = 0; // start new interval
return true;
}
return false;
}
uint16_t parseAlarmLog(uint8_t id, uint8_t pyld[], uint8_t len) { uint16_t parseAlarmLog(uint8_t id, uint8_t pyld[], uint8_t len) {
uint8_t startOff = 2 + id * ALARM_LOG_ENTRY_SIZE; uint8_t startOff = 2 + id * ALARM_LOG_ENTRY_SIZE;
if((startOff + ALARM_LOG_ENTRY_SIZE) > len) if((startOff + ALARM_LOG_ENTRY_SIZE) > len)

11
src/hm/hmRadio.h

@ -129,19 +129,23 @@ class HmRadio : public Radio {
//(mLastIv->mRxChanIdx + RF_MAX_CHANNEL_ID -1) % RF_MAX_CHANNEL_ID; // make sure, we start with last successfull channel (result will be increased in loop) //(mLastIv->mRxChanIdx + RF_MAX_CHANNEL_ID -1) % RF_MAX_CHANNEL_ID; // make sure, we start with last successfull channel (result will be increased in loop)
//mRxChannels - 1; // //mRxChannels - 1; //
//(mTxChIdx + mRxChannels) % RF_MAX_CHANNEL_ID; // start with a fixed offset //(mTxChIdx + mRxChannels) % RF_MAX_CHANNEL_ID; // start with a fixed offset
bool switchch = true;
while ((millis() - loopMillis) < mRxTmoOuterLoop) { while ((millis() - loopMillis) < mRxTmoOuterLoop) {
while ((micros() - startMicros) < mRxTmoInnerLoop) { // listen (4088us or?) 5110us to each channel while ((micros() - startMicros) < mRxTmoInnerLoop) { // listen (4088us or?) 5110us to each channel
if (mIrqRcvd) { if (mIrqRcvd) {
mIrqRcvd = false; mIrqRcvd = false;
if (getReceived()) { // everything received if (getReceived()) { // everything received
mLastIv->mRxChanIdx = mRxChIdx;
return; return;
} }
} }
yield(); yield();
} }
// switch to next RX channel // switch to next RX channel
/*if (mLastIv->mRxChanSync) {
switchch = !switchch;
mRxChIdx = mLastIv->mRxChanIdx - switchch;
}*/
if(++mRxChIdx >= RF_CHANNELS) if(++mRxChIdx >= RF_CHANNELS)
mRxChIdx = 0; mRxChIdx = 0;
@ -161,6 +165,7 @@ class HmRadio : public Radio {
//if(!mLastIv->mGotFragment) //if(!mLastIv->mGotFragment)
mLastIv->mRxChanIdx = mLastIv->mRxChanIdx +1; // + 2; mLastIv->mRxChanIdx = mLastIv->mRxChanIdx +1; // + 2;
//mLastIv->mRxChanIdx = ++mRxChIdx; //mLastIv->mRxChanIdx = ++mRxChIdx;
mLastIv->mRxChanSync = false;
return; return;
} }
@ -326,6 +331,9 @@ class HmRadio : public Radio {
return false; return false;
} }
mLastIv->mGotFragment = true; mLastIv->mGotFragment = true;
mLastIv->mRxChanIdx = mRxChIdx;
mLastIv->mRxChanSync = true;
mBufCtrl.push(p); mBufCtrl.push(p);
if (p.packet[0] == (TX_REQ_INFO + ALL_FRAMES)) // response from get information command if (p.packet[0] == (TX_REQ_INFO + ALL_FRAMES)) // response from get information command
isLastPackage = (p.packet[9] > ALL_FRAMES); // > ALL_FRAMES indicates last packet received isLastPackage = (p.packet[9] > ALL_FRAMES); // > ALL_FRAMES indicates last packet received
@ -378,6 +386,7 @@ class HmRadio : public Radio {
mMillis = millis(); mMillis = millis();
mLastIv = iv; mLastIv = iv;
iv->mDtuTxCnt++;
} }
uint64_t getIvId(Inverter<> *iv) { uint64_t getIvId(Inverter<> *iv) {

1
src/hms/hmsRadio.h

@ -111,6 +111,7 @@ class CmtRadio : public Radio {
if(CMT_ERR_RX_IN_FIFO == status) if(CMT_ERR_RX_IN_FIFO == status)
mIrqRcvd = true; mIrqRcvd = true;
} }
iv->mDtuTxCnt++;
} }
uint64_t getIvId(Inverter<> *iv) { uint64_t getIvId(Inverter<> *iv) {

5
src/publisher/pubMqttIvData.h

@ -127,6 +127,11 @@ class PubMqttIvData {
void stateSend() { void stateSend() {
record_t<> *rec = mIv->getRecordStruct(mCmd); record_t<> *rec = mIv->getRecordStruct(mCmd);
if(rec == NULL) {
if (mCmd != GetLossRate)
DPRINT(DBG_WARN, "unknown record to publish!");
return;
}
uint32_t lastTs = mIv->getLastTs(rec); uint32_t lastTs = mIv->getLastTs(rec);
bool pubData = (lastTs > 0); bool pubData = (lastTs > 0);
if (mCmd == RealTimeRunData_Debug) if (mCmd == RealTimeRunData_Debug)

Loading…
Cancel
Save