mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-10 07:26:38 +02:00
0.8.74
* reduced cppcheck linter warnings significantly
This commit is contained in:
parent
6b5435a246
commit
3740a09d2a
31 changed files with 375 additions and 413 deletions
|
@ -81,12 +81,12 @@ enum class InverterStatus : uint8_t {
|
|||
|
||||
template<class T=float>
|
||||
struct record_t {
|
||||
byteAssign_t* assign; // assignment of bytes in payload
|
||||
uint8_t length; // length of the assignment list
|
||||
T *record; // data pointer
|
||||
uint32_t ts; // timestamp of last received payload
|
||||
uint8_t pyldLen; // expected payload length for plausibility check
|
||||
MqttSentStatus mqttSentStatus; // indicates the current MqTT sent status
|
||||
byteAssign_t* assign = nullptr; // assignment of bytes in payload
|
||||
uint8_t length = 0; // length of the assignment list
|
||||
T *record = nullptr; // data pointer
|
||||
uint32_t ts = 0; // timestamp of last received payload
|
||||
uint8_t pyldLen = 0; // expected payload length for plausibility check
|
||||
MqttSentStatus mqttSentStatus = MqttSentStatus:: NEW_DATA; // indicates the current MqTT sent status
|
||||
};
|
||||
|
||||
struct alarm_t {
|
||||
|
@ -113,42 +113,42 @@ const calcFunc_t<T> calcFunctions[] = {
|
|||
template <class REC_TYP>
|
||||
class Inverter {
|
||||
public:
|
||||
uint8_t ivGen; // generation of inverter (HM / MI)
|
||||
uint8_t ivRadioType; // refers to used radio (nRF24 / CMT)
|
||||
cfgIv_t *config; // stored settings
|
||||
uint8_t id; // unique id
|
||||
uint8_t type; // integer which refers to inverter type
|
||||
uint16_t alarmMesIndex; // Last recorded Alarm Message Index
|
||||
uint16_t powerLimit[2]; // limit power output (multiplied by 10)
|
||||
float actPowerLimit; // actual power limit
|
||||
bool powerLimitAck; // acknowledged power limit (default: false)
|
||||
uint8_t devControlCmd; // carries the requested cmd
|
||||
serial_u radioId; // id converted to modbus
|
||||
uint8_t channels; // number of PV channels (1-4)
|
||||
record_t<REC_TYP> recordMeas; // structure for measured values
|
||||
record_t<REC_TYP> recordInfo; // structure for info values
|
||||
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
|
||||
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)
|
||||
int8_t rssi; // RSSI
|
||||
uint16_t alarmCnt; // counts the total number of occurred alarms
|
||||
uint16_t alarmLastId; // lastId which was received
|
||||
uint8_t mCmd; // holds the command to send
|
||||
bool mGotFragment; // shows if inverter has sent at least one fragment
|
||||
uint8_t miMultiParts; // helper info for MI multiframe msgs
|
||||
uint8_t outstandingFrames; // helper info to count difference between expected and received frames
|
||||
uint8_t curFrmCnt; // count received frames in current loop
|
||||
bool mGotLastMsg; // shows if inverter has already finished transmission cycle
|
||||
bool mIsSingleframeReq; // indicates this is a missing single frame request
|
||||
Radio *radio; // pointer to associated radio class
|
||||
statistics_t radioStatistics; // information about transmitted, failed, ... packets
|
||||
HeuristicInv heuristics; // heuristic information / logic
|
||||
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
|
||||
uint32_t tsMaxAcPower; // holds the timestamp when the MaxAC power was seen
|
||||
uint8_t ivGen = IV_UNKNOWN; // generation of inverter (HM / MI)
|
||||
uint8_t ivRadioType = INV_RADIO_TYPE_UNKNOWN; // refers to used radio (nRF24 / CMT)
|
||||
cfgIv_t *config = nullptr; // stored settings
|
||||
uint8_t id = 0; // unique id
|
||||
uint8_t type = INV_TYPE_1CH; // integer which refers to inverter type
|
||||
uint16_t alarmMesIndex = 0; // Last recorded Alarm Message Index
|
||||
uint16_t powerLimit[2] = {0xffff, AbsolutNonPersistent}; // limit power output (multiplied by 10)
|
||||
float actPowerLimit = -1; // actual power limit
|
||||
bool powerLimitAck = false; // acknowledged power limit
|
||||
uint8_t devControlCmd = InitDataState; // carries the requested cmd
|
||||
serial_u radioId; // id converted to modbus
|
||||
uint8_t channels = 1; // number of PV channels (1-4)
|
||||
record_t<REC_TYP> recordMeas; // structure for measured values
|
||||
record_t<REC_TYP> recordInfo; // structure for info values
|
||||
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
|
||||
InverterStatus status = InverterStatus::OFF; // indicates the current inverter status
|
||||
std::array<alarm_t, 10> lastAlarm; // holds last 10 alarms
|
||||
uint8_t rxOffset = 0; // holds the default channel offset between tx and rx channel (nRF only)
|
||||
int8_t rssi = 0; // RSSI
|
||||
uint16_t alarmCnt = 0; // counts the total number of occurred alarms
|
||||
uint16_t alarmLastId = 0; // lastId which was received
|
||||
uint8_t mCmd = InitDataState; // holds the command to send
|
||||
bool mGotFragment = false; // shows if inverter has sent at least one fragment
|
||||
uint8_t miMultiParts = 0; // helper info for MI multiframe msgs
|
||||
uint8_t outstandingFrames = 0; // helper info to count difference between expected and received frames
|
||||
uint8_t curFrmCnt = 0; // count received frames in current loop
|
||||
bool mGotLastMsg = false; // shows if inverter has already finished transmission cycle
|
||||
bool mIsSingleframeReq = false; // indicates this is a missing single frame request
|
||||
Radio *radio = nullptr; // pointer to associated radio class
|
||||
statistics_t radioStatistics; // information about transmitted, failed, ... packets
|
||||
HeuristicInv heuristics; // heuristic information / logic
|
||||
uint8_t curCmtFreq = 0; // current used CMT frequency, used to check if freq. was changed during runtime
|
||||
uint32_t tsMaxAcPower = 0; // holds the timestamp when the MaxAC power was seen
|
||||
bool commEnabled = true; // 'pause night communication' sets this field to false
|
||||
|
||||
static uint32_t *timestamp; // system timestamp
|
||||
static cfgInst_t *generalConfig; // general inverter configuration from setup
|
||||
|
@ -156,29 +156,10 @@ class Inverter {
|
|||
public:
|
||||
|
||||
Inverter() {
|
||||
ivGen = IV_HM;
|
||||
powerLimit[0] = 0xffff; // 6553.5 W Limit -> unlimited
|
||||
powerLimit[1] = AbsolutNonPersistent; // default power limit setting
|
||||
powerLimitAck = false;
|
||||
actPowerLimit = 0xffff; // init feedback from inverter to -1
|
||||
mDevControlRequest = false;
|
||||
devControlCmd = InitDataState;
|
||||
alarmMesIndex = 0;
|
||||
status = InverterStatus::OFF;
|
||||
alarmCnt = 0;
|
||||
alarmLastId = 0;
|
||||
rssi = -127;
|
||||
miMultiParts = 0;
|
||||
mGotLastMsg = false;
|
||||
mCmd = InitDataState;
|
||||
mIsSingleframeReq = false;
|
||||
radio = NULL;
|
||||
commEnabled = true;
|
||||
tsMaxAcPower = 0;
|
||||
|
||||
memset(&radioStatistics, 0, sizeof(statistics_t));
|
||||
memset(mOffYD, 0, sizeof(float) * 6);
|
||||
memset(mLastYD, 0, sizeof(float) * 6);
|
||||
mGridProfile.fill(0);
|
||||
}
|
||||
|
||||
void tickSend(std::function<void(uint8_t cmd, bool isDevControl)> cb) {
|
||||
|
@ -255,8 +236,8 @@ class Inverter {
|
|||
|
||||
uint8_t getPosByChFld(uint8_t channel, uint8_t fieldId, record_t<> *rec) {
|
||||
DPRINTLN(DBG_VERBOSE, F("hmInverter.h:getPosByChFld"));
|
||||
uint8_t pos = 0;
|
||||
if(NULL != rec) {
|
||||
uint8_t pos = 0;
|
||||
for(; pos < rec->length; pos++) {
|
||||
if((rec->assign[pos].ch == channel) && (rec->assign[pos].fieldId == fieldId))
|
||||
break;
|
||||
|
@ -303,7 +284,7 @@ class Inverter {
|
|||
return (InverterStatus::OFF != status);
|
||||
}
|
||||
|
||||
void addValue(uint8_t pos, uint8_t buf[], record_t<> *rec) {
|
||||
void addValue(uint8_t pos, const uint8_t buf[], record_t<> *rec) {
|
||||
DPRINTLN(DBG_VERBOSE, F("hmInverter.h:addValue"));
|
||||
if(NULL != rec) {
|
||||
uint8_t ptr = rec->assign[pos].start;
|
||||
|
@ -387,8 +368,8 @@ class Inverter {
|
|||
}
|
||||
|
||||
REC_TYP getChannelFieldValue(uint8_t channel, uint8_t fieldId, record_t<> *rec) {
|
||||
uint8_t pos = 0;
|
||||
if(NULL != rec) {
|
||||
uint8_t pos = 0;
|
||||
for(; pos < rec->length; pos++) {
|
||||
if((rec->assign[pos].ch == channel) && (rec->assign[pos].fieldId == fieldId))
|
||||
break;
|
||||
|
@ -529,11 +510,11 @@ class Inverter {
|
|||
if (INV_TYPE_1CH == type) {
|
||||
if((IV_HM == ivGen) || (IV_MI == ivGen)) {
|
||||
rec->length = (uint8_t)(HM1CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hm1chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hm1chAssignment));
|
||||
rec->pyldLen = HM1CH_PAYLOAD_LEN;
|
||||
} else if(IV_HMS == ivGen) {
|
||||
rec->length = (uint8_t)(HMS1CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hms1chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hms1chAssignment));
|
||||
rec->pyldLen = HMS1CH_PAYLOAD_LEN;
|
||||
}
|
||||
channels = 1;
|
||||
|
@ -541,11 +522,11 @@ class Inverter {
|
|||
else if (INV_TYPE_2CH == type) {
|
||||
if((IV_HM == ivGen) || (IV_MI == ivGen)) {
|
||||
rec->length = (uint8_t)(HM2CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hm2chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hm2chAssignment));
|
||||
rec->pyldLen = HM2CH_PAYLOAD_LEN;
|
||||
} else if(IV_HMS == ivGen) {
|
||||
rec->length = (uint8_t)(HMS2CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hms2chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hms2chAssignment));
|
||||
rec->pyldLen = HMS2CH_PAYLOAD_LEN;
|
||||
}
|
||||
channels = 2;
|
||||
|
@ -553,18 +534,18 @@ class Inverter {
|
|||
else if (INV_TYPE_4CH == type) {
|
||||
if((IV_HM == ivGen) || (IV_MI == ivGen)) {
|
||||
rec->length = (uint8_t)(HM4CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hm4chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hm4chAssignment));
|
||||
rec->pyldLen = HM4CH_PAYLOAD_LEN;
|
||||
} else if(IV_HMS == ivGen) {
|
||||
rec->length = (uint8_t)(HMS4CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hms4chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hms4chAssignment));
|
||||
rec->pyldLen = HMS4CH_PAYLOAD_LEN;
|
||||
}
|
||||
channels = 4;
|
||||
}
|
||||
else if (INV_TYPE_6CH == type) {
|
||||
rec->length = (uint8_t)(HMT6CH_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)hmt6chAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hmt6chAssignment));
|
||||
rec->pyldLen = HMT6CH_PAYLOAD_LEN;
|
||||
channels = 6;
|
||||
}
|
||||
|
@ -577,22 +558,22 @@ class Inverter {
|
|||
break;
|
||||
case InverterDevInform_All:
|
||||
rec->length = (uint8_t)(HMINFO_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)InfoAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(InfoAssignment));
|
||||
rec->pyldLen = HMINFO_PAYLOAD_LEN;
|
||||
break;
|
||||
case InverterDevInform_Simple:
|
||||
rec->length = (uint8_t)(HMSIMPLE_INFO_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)SimpleInfoAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(SimpleInfoAssignment));
|
||||
rec->pyldLen = HMSIMPLE_INFO_PAYLOAD_LEN;
|
||||
break;
|
||||
case SystemConfigPara:
|
||||
rec->length = (uint8_t)(HMSYSTEM_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)SystemConfigParaAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(SystemConfigParaAssignment));
|
||||
rec->pyldLen = HMSYSTEM_PAYLOAD_LEN;
|
||||
break;
|
||||
case AlarmData:
|
||||
rec->length = (uint8_t)(HMALARMDATA_LIST_LEN);
|
||||
rec->assign = (byteAssign_t *)AlarmDataAssignment;
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(AlarmDataAssignment));
|
||||
rec->pyldLen = HMALARMDATA_PAYLOAD_LEN;
|
||||
break;
|
||||
default:
|
||||
|
@ -616,7 +597,7 @@ class Inverter {
|
|||
memset(mLastYD, 0, sizeof(float) * 6);
|
||||
}
|
||||
|
||||
bool parseGetLossRate(uint8_t pyld[], uint8_t len) {
|
||||
bool parseGetLossRate(const 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];
|
||||
|
@ -815,7 +796,7 @@ class Inverter {
|
|||
|
||||
void addGridProfile(uint8_t buf[], uint8_t length) {
|
||||
mGridLen = (length > MAX_GRID_LENGTH) ? MAX_GRID_LENGTH : length;
|
||||
std::copy(buf, &buf[mGridLen], mGridProfile);
|
||||
std::copy(buf, &buf[mGridLen], mGridProfile.data());
|
||||
}
|
||||
|
||||
String getGridProfile(void) {
|
||||
|
@ -847,9 +828,9 @@ class Inverter {
|
|||
|
||||
private:
|
||||
float mOffYD[6], mLastYD[6];
|
||||
bool mDevControlRequest; // true if change needed
|
||||
bool mDevControlRequest = false; // true if change needed
|
||||
uint8_t mGridLen = 0;
|
||||
uint8_t mGridProfile[MAX_GRID_LENGTH];
|
||||
std::array<uint8_t, MAX_GRID_LENGTH> mGridProfile;
|
||||
uint8_t mAlarmNxtWrPos = 0; // indicates the position in array (rolling buffer)
|
||||
|
||||
public:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue