mirror of https://github.com/lumapu/ahoy.git
Browse Source
fix Prometheus and JSON endpoints (`config_override.h`) #561 publish MQTT with fixed interval even if inverter is not available #542 added JSON settings upload. NOTE: settings JSON download changed, so only settings should be uploaded starting from version `0.5.70` #551 MQTT topic and inverter name have more allowed characters: `[A-Za-z0-9./#$%&=+_-]+`, thx: @Mo Demman improved potential issue with `checkTicker`, thx @cbscpe MQTT option for reset values on midnight / not avail / communication stop #539 small fix in `tickIVCommunication` #534 add `YieldTotal` correction, eg. to have the option to zero at year start #512pull/566/head
lumapu
2 years ago
16 changed files with 344 additions and 216 deletions
@ -1,110 +0,0 @@ |
|||||
//-----------------------------------------------------------------------------
|
|
||||
// 2022 Ahoy, https://ahoydtu.de
|
|
||||
// Lukas Pusch, lukas@lpusch.de
|
|
||||
// Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
|
|
||||
//-----------------------------------------------------------------------------
|
|
||||
#ifndef __LIST_H__ |
|
||||
#define __LIST_H__ |
|
||||
|
|
||||
template<class T, class... Args> |
|
||||
struct node_s { |
|
||||
typedef T dT; |
|
||||
node_s *pre; |
|
||||
node_s *nxt; |
|
||||
uint8_t id; |
|
||||
dT d; |
|
||||
node_s() : pre(NULL), nxt(NULL), d() {} |
|
||||
node_s(Args... args) : id(0), pre(NULL), nxt(NULL), d(args...) {} |
|
||||
}; |
|
||||
|
|
||||
template<int MAX_NUM, class T, class... Args> |
|
||||
class llist { |
|
||||
typedef node_s<T, Args...> elmType; |
|
||||
typedef T dataType; |
|
||||
public: |
|
||||
llist() : root(mPool) { |
|
||||
root = NULL; |
|
||||
elmType *p = mPool; |
|
||||
for(uint32_t i = 0; i < MAX_NUM; i++) { |
|
||||
p->id = i; |
|
||||
p++; |
|
||||
} |
|
||||
mFill = mMax = 0; |
|
||||
} |
|
||||
|
|
||||
elmType *add(Args... args) { |
|
||||
elmType *p = root, *t; |
|
||||
if(NULL == (t = getFreeNode())) |
|
||||
return NULL; |
|
||||
if(++mFill > mMax) |
|
||||
mMax = mFill; |
|
||||
|
|
||||
if(NULL == root) { |
|
||||
p = root = t; |
|
||||
p->pre = p; |
|
||||
p->nxt = p; |
|
||||
} |
|
||||
else { |
|
||||
p = root->pre; |
|
||||
t->pre = p; |
|
||||
p->nxt->pre = t; |
|
||||
t->nxt = p->nxt; |
|
||||
p->nxt = t; |
|
||||
} |
|
||||
t->d = dataType(args...); |
|
||||
return p; |
|
||||
} |
|
||||
|
|
||||
elmType *getFront() { |
|
||||
return root; |
|
||||
} |
|
||||
|
|
||||
elmType *get(elmType *p) { |
|
||||
p = p->nxt; |
|
||||
return (p == root) ? NULL : p; |
|
||||
} |
|
||||
|
|
||||
elmType *rem(elmType *p) { |
|
||||
if(NULL == p) |
|
||||
return NULL; |
|
||||
elmType *t = p->nxt; |
|
||||
p->nxt->pre = p->pre; |
|
||||
p->pre->nxt = p->nxt; |
|
||||
if((root == p) && (p->nxt == p)) |
|
||||
root = NULL; |
|
||||
else |
|
||||
root = p->nxt; |
|
||||
p->nxt = NULL; |
|
||||
p->pre = NULL; |
|
||||
p = NULL; |
|
||||
mFill--; |
|
||||
return (NULL == root) ? NULL : ((t == root) ? NULL : t); |
|
||||
} |
|
||||
|
|
||||
uint16_t getFill(void) { |
|
||||
return mFill; |
|
||||
} |
|
||||
|
|
||||
uint16_t getMaxFill(void) { |
|
||||
return mMax; |
|
||||
} |
|
||||
|
|
||||
protected: |
|
||||
elmType *root; |
|
||||
|
|
||||
private: |
|
||||
elmType *getFreeNode(void) { |
|
||||
elmType *n = mPool; |
|
||||
for(uint32_t i = 0; i < MAX_NUM; i++) { |
|
||||
if(NULL == n->nxt) |
|
||||
return n; |
|
||||
n++; |
|
||||
} |
|
||||
return NULL; |
|
||||
} |
|
||||
|
|
||||
elmType mPool[MAX_NUM]; |
|
||||
uint16_t mFill, mMax; |
|
||||
}; |
|
||||
|
|
||||
#endif /*__LIST_H__*/ |
|
Loading…
Reference in new issue