mirror of
https://github.com/lumapu/ahoy.git
synced 2025-08-06 01:48:19 +02:00
further updates for MI
compiles... for the rest still untested
This commit is contained in:
parent
f53d6fd142
commit
4d0bac9267
1 changed files with 50 additions and 100 deletions
|
@ -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) {
|
|
||||||
DPRINTLN(DBG_VERBOSE, F("miPAyload.h:addMiValue"));
|
|
||||||
|
|
||||||
/*
|
|
||||||
pos = iv->getPosByChFld(ch, fld, rec);
|
|
||||||
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) {
|
|
||||||
DPRINTLN(DBG_VERBOSE, "add real time");
|
|
||||||
|
|
||||||
// get last alarm message index and save it in the inverter object
|
|
||||||
if (getPosByChFld(0, FLD_EVT, rec) == pos){
|
|
||||||
if (alarmMesIndex < rec->record[pos]){
|
|
||||||
alarmMesIndex = rec->record[pos];
|
|
||||||
//enqueCommand<InfoCommand>(AlarmUpdate); // What is the function of AlarmUpdate?
|
|
||||||
|
|
||||||
DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(alarmMesIndex));
|
|
||||||
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) {
|
void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t chan = 1) {
|
||||||
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser
|
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure
|
||||||
rec->ts = mPayload[iv->id].ts;
|
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])); // most likely wrong!
|
||||||
iv->setValue(iv->getPosByChFld(chan, FLD_YD, rec), rec, (int)((p->packet[11] << 8) + p->packet[12]));
|
|
||||||
|
if (INV_TYPE_1CH == iv->type)
|
||||||
|
iv->setValue(iv->getPosByChFld(0, 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[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);
|
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, (int)((p->packet[15] << 8) + p->packet[16]));
|
||||||
/*
|
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
||||||
pos = iv->getPosByChFld(ch, fld, rec);
|
iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)];
|
||||||
iv->setValue(pos, rec, 0.0f);
|
|
||||||
*/
|
DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(iv->alarmMesIndex));
|
||||||
|
iv->enqueCommand<InfoCommand>(AlarmData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* 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…
Add table
Add a link
Reference in a new issue