Browse Source

further updates for MI

compiles... for the rest still untested
pull/664/head
rejoe2 2 years ago
committed by GitHub
parent
commit
4d0bac9267
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 144
      src/hm/miPayload.h

144
src/hm/miPayload.h

@ -50,6 +50,7 @@ class MiPayload {
reset(i); reset(i);
} }
mSerialDebug = false; mSerialDebug = false;
mHighPrioIv = NULL;
mCbMiPayload = NULL; mCbMiPayload = NULL;
} }
@ -64,8 +65,16 @@ class MiPayload {
void addAlarmListener(alarmListenerType cb) { void addAlarmListener(alarmListenerType cb) {
mCbMiAlarm = cb; mCbMiAlarm = cb;
} }
void loop() {} void loop() {
/*if(NULL != mHighPrioIv) {
iv->ivSend(mHighPrioIv, true); // should request firmware version etc.?
mHighPrioIv = NULL;
}*/
}
void ivSendHighPrio(Inverter<> *iv) {
mHighPrioIv = iv;
}
void ivSend(Inverter<> *iv) { void ivSend(Inverter<> *iv) {
reset(iv->id); reset(iv->id);
@ -114,6 +123,7 @@ class MiPayload {
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES); mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES);
} else { } else {
mPayload[iv->id].complete = true; mPayload[iv->id].complete = true;
//iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, CALC_YD_CH0);
iv->setQueuedCmdFinished(); iv->setQueuedCmdFinished();
} }
@ -247,10 +257,12 @@ class MiPayload {
} else if(iv->devControlCmd == ActivePowerContr) { } else if(iv->devControlCmd == ActivePowerContr) {
DPRINTLN(DBG_INFO, F("retransmit power limit")); DPRINTLN(DBG_INFO, F("retransmit power limit"));
mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true); mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true);
} /*else { } else {
if (mPayload[iv->id].retransmits < mMaxRetrans) { if (mPayload[iv->id].retransmits < mMaxRetrans) {
mPayload[iv->id].retransmits++; mPayload[iv->id].retransmits++;
if(false == mPayload[iv->id].gotFragment) { //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11);
mSys->Radio.sendCmdPacket(iv->radioId.u64, iv->getQueuedCmd(), 24, true);
/*if(false == mPayload[iv->id].gotFragment) {
DPRINTLN(DBG_WARN, F("(#") + String(iv->id) + F(") nothing received")); DPRINTLN(DBG_WARN, F("(#") + String(iv->id) + F(") nothing received"));
mPayload[iv->id].retransmits = mMaxRetrans; mPayload[iv->id].retransmits = mMaxRetrans;
} else { } else {
@ -262,9 +274,9 @@ class MiPayload {
} }
yield(); yield();
} }
} }*/
} }
}*/ }
} }
} else if(!crcPass && pyldComplete) { // crc error on complete Payload } else if(!crcPass && pyldComplete) { // crc error on complete Payload
if (mPayload[iv->id].retransmits < mMaxRetrans) { if (mPayload[iv->id].retransmits < mMaxRetrans) {
@ -343,92 +355,23 @@ class MiPayload {
(mCbMiPayload)(val); (mCbMiPayload)(val);
} }
void addMiValue(uint8_t pos, packet_t *p, record_t<> *rec, uint8_t ptr, uint8_t end) { void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t chan = 1) {
DPRINTLN(DBG_VERBOSE, F("miPAyload.h:addMiValue")); record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure
rec->ts = mPayload[iv->id].ts;
iv->setValue(iv->getPosByChFld(chan, FLD_YD, rec), rec, (int)((p->packet[11] << 8) + p->packet[12])); // most likely wrong!
/* if (INV_TYPE_1CH == iv->type)
pos = iv->getPosByChFld(ch, fld, rec); iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, (int)((p->packet[11] << 8) + p->packet[12]));
iv->setValue(pos, rec, 0.0f);
*/
/*if(NULL != rec) {
//uint8_t ptr = rec->assign[pos].start;
//uint8_t end = ptr + rec->assign[pos].num;
uint16_t div = rec->assign[pos].div;
if(NULL != rec) {
if(CMD_CALC != div) {
uint32_t val = 0;
do {
val <<= 8;
val |= p->[ptr];
} while(++ptr != end);
if (FLD_T == rec->assign[pos].fieldId) {
// temperature is a signed value!
rec->record[pos] = (REC_TYP)((int16_t)val) / (REC_TYP)(div);
} else if ((FLD_YT == rec->assign[pos].fieldId)
&& (config->yieldCor != 0)) {
rec->record[pos] = ((REC_TYP)(val) / (REC_TYP)(div)) - ((REC_TYP)config->yieldCor);
} else {
if ((REC_TYP)(div) > 1)
rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div);
else
rec->record[pos] = (REC_TYP)(val);
}
}
}
if(rec == &recordMeas) { //iv->setValue(iv->getPosByChFld(chan, FLD_EVT, rec), rec, (int)((p->packet[13] << 8) + p->packet[14]));
DPRINTLN(DBG_VERBOSE, "add real time");
// get last alarm message index and save it in the inverter object iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, (int)((p->packet[15] << 8) + p->packet[16]));
if (getPosByChFld(0, FLD_EVT, rec) == pos){ if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
if (alarmMesIndex < rec->record[pos]){ iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)];
alarmMesIndex = rec->record[pos];
//enqueCommand<InfoCommand>(AlarmUpdate); // What is the function of AlarmUpdate?
DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(alarmMesIndex)); DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(iv->alarmMesIndex));
enqueCommand<InfoCommand>(AlarmData); iv->enqueCommand<InfoCommand>(AlarmData);
}
}
}
else if (rec->assign == InfoAssignment) {
DPRINTLN(DBG_DEBUG, "add info");
// eg. fw version ...
isConnected = true;
}
else if (rec->assign == SystemConfigParaAssignment) {
DPRINTLN(DBG_DEBUG, "add config");
if (getPosByChFld(0, FLD_ACT_ACTIVE_PWR_LIMIT, rec) == pos){
actPowerLimit = rec->record[pos];
DPRINT(DBG_DEBUG, F("Inverter actual power limit: ") + String(actPowerLimit, 1));
}
}
else if (rec->assign == AlarmDataAssignment) {
DPRINTLN(DBG_DEBUG, "add alarm");
if (getPosByChFld(0, FLD_LAST_ALARM_CODE, rec) == pos){
lastAlarmMsg = getAlarmStr(rec->record[pos]);
}
}
else
DPRINTLN(DBG_WARN, F("add with unknown assginment"));
} }
else
DPRINTLN(DBG_ERROR, F("addValue: assignment not found with cmd 0x"));
*/
}
void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t chan = 1) {
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser
rec->ts = mPayload[iv->id].ts;
//addMiValue(uint8_t pos, packet_t *p, record_t<> *rec, uint8_t ptr, uint8_t end)
iv->setValue(iv->getPosByChFld(chan, FLD_YD, rec), rec, (int)((p->packet[11] << 8) + p->packet[12]));
//iv->setValue(iv->getPosByChFld(chan, FLD_EVT, rec), rec, (int)((p->packet[13] << 8) + p->packet[14]));
iv->setValue(iv->getPosByChFld(chan, FLD_EVT, rec), rec, (int)((p->packet[15] << 8) + p->packet[16]));
//addMiValue(FLD_EVT, p, rec, 11, 12);
/*
pos = iv->getPosByChFld(ch, fld, rec);
iv->setValue(pos, rec, 0.0f);
*/
/* for decoding see /* for decoding see
@ -456,39 +399,45 @@ class MiPayload {
4; 4;
// U_DC = (float) ((p->packet[11] << 8) + p->packet[12])/10; // U_DC = (float) ((p->packet[11] << 8) + p->packet[12])/10;
iv->setValue(iv->getPosByChFld(chan, FLD_UDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); iv->setValue(iv->getPosByChFld(chan, FLD_UDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10);
yield(); yield();
// I_DC = (float) ((p->packet[13] << 8) + p->packet[14])/10; // I_DC = (float) ((p->packet[13] << 8) + p->packet[14])/10;
iv->setValue(iv->getPosByChFld(chan, FLD_IDC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); iv->setValue(iv->getPosByChFld(chan, FLD_IDC, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/10);
yield(); yield();
// U_AC = (float) ((p->packet[15] << 8) + p->packet[16])/10; // U_AC = (float) ((p->packet[15] << 8) + p->packet[16])/10;
iv->setValue(iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[15] << 8) + p->packet[16])/10); iv->setValue(iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[21] << 8) + p->packet[22])/10);
yield(); yield();
// F_AC = (float) ((p->packet[17] << 8) + p->packet[18])/100; // F_AC = (float) ((p->packet[17] << 8) + p->packet[18])/100;
iv->setValue(iv->getPosByChFld(0, FLD_IAC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/100); iv->setValue(iv->getPosByChFld(0, FLD_IAC, rec), rec, (float)((p->packet[23] << 8) + p->packet[24])/100);
yield(); yield();
// P_DC = (float)((p->packet[19] << 8) + p->packet[20])/10; // P_DC = (float)((p->packet[19] << 8) + p->packet[20])/10;
iv->setValue(iv->getPosByChFld(chan, FLD_PDC, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/10); iv->setValue(iv->getPosByChFld(chan, FLD_PDC, rec), rec, (float)((p->packet[25] << 8) + p->packet[26])/10);
yield(); yield();
// Q_DC = (float)((p->packet[21] << 8) + p->packet[22])/1; // Q_DC = (float)((p->packet[21] << 8) + p->packet[22])/1;
iv->setValue(iv->getPosByChFld(chan, FLD_Q, rec), rec, (float)((p->packet[21] << 8) + p->packet[22])/1); iv->setValue(iv->getPosByChFld(chan, FLD_Q, rec), rec, (float)((p->packet[21] << 8) + p->packet[22])/1);
yield(); yield();
iv->setValue(iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[23] << 8) + p->packet[24])/10); iv->setValue(iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[29] << 8) + p->packet[30])/10);
iv->setValue(iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[23] << 8) + p->packet[24])/100);
yield(); yield();
//FLD_YD
if (p->packet[2] >= (0x36 + ALL_FRAMES) ) { if (p->packet[2] >= (0x36 + ALL_FRAMES) ) {
/*STAT = (uint8_t)(p->packet[25] ); /*STAT = (uint8_t)(p->packet[25] );
FCNT = (uint8_t)(p->packet[26]); FCNT = (uint8_t)(p->packet[26]);
FCODE = (uint8_t)(p->packet[27]); // MI300: (int)((p->packet[15] << 8) + p->packet[16]); */ FCODE = (uint8_t)(p->packet[27]); // MI300: (int)((p->packet[15] << 8) + p->packet[16]); */
iv->setValue(iv->getPosByChFld(chan, FLD_YD, rec), rec, (uint8_t)(p->packet[25])); //iv->setValue(iv->getPosByChFld(chan, FLD_YD, rec), rec, (uint8_t)(p->packet[25]));
//iv->setValue(iv->getPosByChFld(chan, FLD_EVT, rec), rec, (uint8_t)(p->packet[27]));
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, (uint8_t)(p->packet[27])); iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, (uint8_t)(p->packet[27]));
yield(); yield();
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)];
DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(iv->alarmMesIndex));
iv->enqueCommand<InfoCommand>(AlarmData);
}
} }
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, CALC_YD_CH0); // (getValue(iv->getPosByChFld(1, FLD_YD, rec), rec) + getValue(iv->getPosByChFld(2, FLD_YD, rec), rec)));
/* for (uint8_t i = 0; i < rec->length; i++) {
iv->addValue(i, payload, rec);
yield();
}*/
iv->doCalculations(); iv->doCalculations();
notify(mPayload[iv->id].txCmd); notify(mPayload[iv->id].txCmd);
/* /*
@ -603,6 +552,7 @@ class MiPayload {
miPayload_t mPayload[MAX_NUM_INVERTERS]; miPayload_t mPayload[MAX_NUM_INVERTERS];
bool mSerialDebug; bool mSerialDebug;
Inverter<> *mHighPrioIv;
alarmListenerType mCbMiAlarm; alarmListenerType mCbMiAlarm;
payloadListenerType mCbMiPayload; payloadListenerType mCbMiPayload;
}; };

Loading…
Cancel
Save