improve statistics

This commit is contained in:
wellenvogel 2021-12-05 20:45:49 +01:00
parent b089ae2a39
commit 2e5b3b37d7
4 changed files with 117 additions and 97 deletions

View File

@ -21,13 +21,16 @@ void GwLog::logString(const char *fmt,...){
va_list args; va_list args;
va_start(args,fmt); va_start(args,fmt);
xSemaphoreTake(locker, portMAX_DELAY); xSemaphoreTake(locker, portMAX_DELAY);
vsnprintf(buffer,99,fmt,args); vsnprintf(buffer,bufferSize-1,fmt,args);
buffer[99]=0; buffer[bufferSize-1]=0;
if (! writer) { if (! writer) {
xSemaphoreGive(locker); xSemaphoreGive(locker);
return; return;
} }
writer->write(prefix.c_str()); writer->write(prefix.c_str());
char buf[20];
snprintf(buf,20,"%lu:",millis());
writer->write(buf);
writer->write(buffer); writer->write(buffer);
writer->write("\n"); writer->write("\n");
xSemaphoreGive(locker); xSemaphoreGive(locker);
@ -37,8 +40,8 @@ void GwLog::logDebug(int level,const char *fmt,...){
va_list args; va_list args;
va_start(args,fmt); va_start(args,fmt);
xSemaphoreTake(locker, portMAX_DELAY); xSemaphoreTake(locker, portMAX_DELAY);
vsnprintf(buffer,99,fmt,args); vsnprintf(buffer,bufferSize-1,fmt,args);
buffer[99]=0; buffer[bufferSize-1]=0;
if (! writer) { if (! writer) {
xSemaphoreGive(locker); xSemaphoreGive(locker);
return; return;

View File

@ -10,7 +10,8 @@ class GwLogWriter{
}; };
class GwLog{ class GwLog{
private: private:
char buffer[100]; static const size_t bufferSize=200;
char buffer[bufferSize];
int logLevel=1; int logLevel=1;
GwLogWriter *writer; GwLogWriter *writer;
SemaphoreHandle_t locker; SemaphoreHandle_t locker;

View File

@ -0,0 +1,105 @@
#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);
}
};

View File

@ -72,6 +72,7 @@ const unsigned long HEAP_REPORT_TIME=2000; //set to 0 to disable heap reporting
#include "GwXDRMappings.h" #include "GwXDRMappings.h"
#include "GwSynchronized.h" #include "GwSynchronized.h"
#include "GwUserCode.h" #include "GwUserCode.h"
#include "GwStatistics.h"
//NMEA message channels //NMEA message channels
@ -845,90 +846,8 @@ class NMEAMessageReceiver : public GwMessageFetcher{
return true; return true;
} }
}; };
class TimeMonitor{
public:
unsigned long *times=NULL;
size_t len;
TimeMonitor(size_t len){
this->len=len;
times=new unsigned long[len];
reset();
}
void reset(){
if (len>0) times[0]=millis();
for (size_t i=1;i<len;i++){
times[i]=0;
}
}
unsigned long getMax(){
unsigned long maxTime=0;
for (size_t i=1;i< len;i++){
if (times[i] != 0){
if (times[i] > maxTime) maxTime=times[i];
}
}
if (maxTime > 0) return maxTime-times[0];
return 0;
}
void writeLog(unsigned long minTime){
unsigned long maxTime=getMax();
if (maxTime == 0 || maxTime < minTime) return;
String log;
for (size_t i=1;i<len;i++){
if (times[i] != 0){
log+=String(i);
log+=":";
log+=String((times[i]-times[0]));
log+=",";
}
}
logger.logDebug(GwLog::LOG,"times: %s",log.c_str());
}
void setTime(size_t index){
if (index < 1 || index >= len) return;
times[index]=millis();
}
};
class TimeAverage{
size_t len;
size_t wp=0;
size_t filled=0;
unsigned long *diffs=NULL;
unsigned long count=0;
unsigned long sum=0;
public:
TimeAverage(size_t len){
this->len=len;
wp=0;
filled=0;
diffs=new unsigned long[len];
}
void add(unsigned long diff){
count++;
sum+=diff;
diffs[wp]=diff;
wp++;
if (filled < len){
filled++;
}
else{
if (wp >= len) wp=0;
sum-=diffs[wp];
}
}
unsigned long current(){
if (filled == 0) return 0;
return sum*1000/filled;
}
unsigned long getCount(){ TimeMonitor monitor(20,0.2);
return count;
}
};
TimeMonitor monitor(20);
TimeAverage average(50);
unsigned long lastReportCount=0;
NMEAMessageReceiver receiver; NMEAMessageReceiver receiver;
unsigned long lastHeapReport=0; unsigned long lastHeapReport=0;
void loop() { void loop() {
@ -946,11 +865,7 @@ void loop() {
(long)xPortGetFreeHeapSize(), (long)xPortGetFreeHeapSize(),
(long)xPortGetMinimumEverFreeHeapSize() (long)xPortGetMinimumEverFreeHeapSize()
); );
logger.logDebug(GwLog::DEBUG,"Main loop count=%d, average=%dus", logger.logDebug(GwLog::DEBUG,"Main loop %s",monitor.getLog().c_str());
(int)(average.getCount()-lastReportCount),
(int)average.current()
);
lastReportCount=average.getCount();
} }
} }
monitor.setTime(3); monitor.setTime(3);
@ -999,8 +914,4 @@ void loop() {
msg->unref(); msg->unref();
} }
monitor.setTime(15); monitor.setTime(15);
average.add(monitor.getMax());
if (logger.isActive(GwLog::LOG)){
monitor.writeLog(6);
}
} }