|
|
@ -130,7 +130,6 @@ class Inverter { |
|
|
|
record_t<REC_TYP> recordHwInfo; // structure for simple (hardware) info values
|
|
|
|
record_t<REC_TYP> recordConfig; // structure for system config values
|
|
|
|
record_t<REC_TYP> recordAlarm; // structure for alarm values
|
|
|
|
bool isConnected; // shows if inverter was successfully identified (fw version and hardware info)
|
|
|
|
InverterStatus status; // indicates the current inverter status
|
|
|
|
std::array<alarm_t, 10> lastAlarm; // holds last 10 alarms
|
|
|
|
uint8_t rxOffset; // holds the default channel offset between tx and rx channel (nRF only)
|
|
|
@ -166,7 +165,6 @@ class Inverter { |
|
|
|
mDevControlRequest = false; |
|
|
|
devControlCmd = InitDataState; |
|
|
|
alarmMesIndex = 0; |
|
|
|
isConnected = false; |
|
|
|
status = InverterStatus::OFF; |
|
|
|
alarmCnt = 0; |
|
|
|
alarmLastId = 0; |
|
|
@ -186,7 +184,10 @@ class Inverter { |
|
|
|
|
|
|
|
void tickSend(std::function<void(uint8_t cmd, bool isDevControl)> cb) { |
|
|
|
if(mDevControlRequest) { |
|
|
|
cb(devControlCmd, true); |
|
|
|
if(InverterStatus::PRODUCING == status) |
|
|
|
cb(devControlCmd, true); |
|
|
|
else |
|
|
|
DPRINTLN(DBG_WARN, F("Inverter is not avail")); |
|
|
|
mDevControlRequest = false; |
|
|
|
} else if (IV_MI != ivGen) { // HM / HMS / HMT
|
|
|
|
mGetLossInterval++; |
|
|
@ -262,8 +263,7 @@ class Inverter { |
|
|
|
break; |
|
|
|
} |
|
|
|
return (pos >= rec->length) ? 0xff : pos; |
|
|
|
} |
|
|
|
else |
|
|
|
} else |
|
|
|
return 0xff; |
|
|
|
} |
|
|
|
|
|
|
@ -290,18 +290,18 @@ class Inverter { |
|
|
|
} |
|
|
|
|
|
|
|
bool setDevControlRequest(uint8_t cmd) { |
|
|
|
if(isConnected) { |
|
|
|
if(InverterStatus::PRODUCING == status) { |
|
|
|
mDevControlRequest = true; |
|
|
|
devControlCmd = cmd; |
|
|
|
//app->triggerTickSend(); // done in RestApi.h, because of "chicken-and-egg problem ;-)"
|
|
|
|
} |
|
|
|
return isConnected; |
|
|
|
return (InverterStatus::PRODUCING == status); |
|
|
|
} |
|
|
|
|
|
|
|
bool setDevCommand(uint8_t cmd) { |
|
|
|
if(isConnected) |
|
|
|
if(InverterStatus::PRODUCING == status) |
|
|
|
devControlCmd = cmd; |
|
|
|
return isConnected; |
|
|
|
return (InverterStatus::PRODUCING == status); |
|
|
|
} |
|
|
|
|
|
|
|
void addValue(uint8_t pos, uint8_t buf[], record_t<> *rec) { |
|
|
@ -318,6 +318,7 @@ class Inverter { |
|
|
|
val <<= 8; |
|
|
|
val |= buf[ptr]; |
|
|
|
} while(++ptr != end); |
|
|
|
|
|
|
|
if ((FLD_T == rec->assign[pos].fieldId) || (FLD_Q == rec->assign[pos].fieldId) || (FLD_PF == rec->assign[pos].fieldId)) { |
|
|
|
// temperature, Qvar, and power factor are a signed values
|
|
|
|
rec->record[pos] = ((REC_TYP)((int16_t)val)) / (REC_TYP)(div); |
|
|
@ -350,12 +351,10 @@ class Inverter { |
|
|
|
DBGPRINTLN(String(alarmMesIndex)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
} else { |
|
|
|
if (rec->assign == InfoAssignment) { |
|
|
|
DPRINTLN(DBG_DEBUG, "add info"); |
|
|
|
// eg. fw version ...
|
|
|
|
isConnected = true; |
|
|
|
} else if (rec->assign == SimpleInfoAssignment) { |
|
|
|
DPRINTLN(DBG_DEBUG, "add simple info"); |
|
|
|
// eg. hw version ...
|
|
|
@ -371,8 +370,7 @@ class Inverter { |
|
|
|
} else |
|
|
|
DPRINTLN(DBG_WARN, F("add with unknown assignment")); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
} else |
|
|
|
DPRINTLN(DBG_ERROR, F("addValue: assignment not found with cmd 0x")); |
|
|
|
|
|
|
|
// update status state-machine
|
|
|
@ -396,12 +394,12 @@ class Inverter { |
|
|
|
if((rec->assign[pos].ch == channel) && (rec->assign[pos].fieldId == fieldId)) |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if(pos >= rec->length) |
|
|
|
return 0; |
|
|
|
|
|
|
|
return rec->record[pos]; |
|
|
|
} |
|
|
|
else |
|
|
|
} else |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@ -477,6 +475,7 @@ class Inverter { |
|
|
|
else if(InverterStatus::PRODUCING == status) |
|
|
|
status = InverterStatus::WAS_PRODUCING; |
|
|
|
} |
|
|
|
|
|
|
|
return producing; |
|
|
|
} |
|
|
|
|
|
|
|