esp32-nmea2000-obp60/lib/statistics/GwStatistics.h

106 lines
2.3 KiB
C++

#pragma once
#include <Arduino.h>
class TimeAverage{
double factor=0.3;
double current=0;
unsigned long count=0;
unsigned long max=0;
bool init=false;
public:
TimeAverage(double factor){
this->factor=factor;
}
void add(unsigned long diff){
if (diff > max) max=diff;
count++;
if (! init){
current=(double)diff;
init=true;
}
else{
double add=((double)diff - current)*factor;
current+=add;
}
}
double getCurrent(){
return current;
}
unsigned long getCount(){
return count;
}
void resetMax(){
max=0;
}
unsigned long getMax(){
return max;
}
};
class TimeMonitor{
public:
TimeAverage **times=NULL;
unsigned long start=0;
unsigned long lastLog=0;
unsigned long lastLogCount=0;
unsigned long count=0;
size_t len;
TimeMonitor(size_t len,double factor=0.3){
this->len=len;
times=new TimeAverage*[len];
for (size_t i=0;i<len;i++){
times[i]=new TimeAverage(factor);
}
reset();
count=0;
}
void reset(){
start=millis();
count++;
}
double getMax(){
double rt=0;
for (size_t i=0;i<len;i++){
if (times[i]->getCurrent() == 0) continue;
if (times[i]->getCurrent() > rt) rt=times[i]->getCurrent();
}
return rt;
}
String getLog(){
unsigned long now=millis();
String log;
if (lastLog != 0){
unsigned long num=count-lastLogCount;
unsigned long tdif=now-lastLog;
if (tdif > 0){
log+=String((double)(num*1000)/(double)tdif);
log+="/s,";
log+=String(getMax());
log+="ms#";
}
}
lastLog=now;
lastLogCount=count;
for (size_t i=1;i<len;i++){
if (times[i]->getCount()){
log+=String(i);
log+=":";
log+=String(times[i]->getCurrent());
log+="[";
log+=String(times[i]->getMax());
log+="],";
}
}
for (size_t i=0;i<len;i++){
times[i]->resetMax();
}
return log;
}
void setTime(size_t index){
if (index < 1 || index >= len) return;
unsigned long current=millis()-start;
times[index-1]->add(current);
}
};