- Chart: linear average improved (performance)
- Chart: gaussian average implemented git-svn-id: file:///home/jan/tmp/wetterstation/trunk@225 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
parent
022071a473
commit
85fd3d1859
|
|
@ -3,7 +3,7 @@ LD = gcc
|
||||||
RM = rm
|
RM = rm
|
||||||
CFLAGS = $(PackageFlags) -c
|
CFLAGS = $(PackageFlags) -c
|
||||||
LDFLAS = $(PackageFlags) -o
|
LDFLAS = $(PackageFlags) -o
|
||||||
LD_LIBS = -lm -lpq -lgd -lpng -lz -lfreetype
|
LD_LIBS = -lm -lpq -lgd -lpng -lz -lfreetype -lefence
|
||||||
#INCL = -I$$(pg_config --includedir)
|
#INCL = -I$$(pg_config --includedir)
|
||||||
|
|
||||||
BIN_NAME = weather_chart
|
BIN_NAME = weather_chart
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,9 @@
|
||||||
#define DEFAULT_Y_AX_DESC "Y-Axis"
|
#define DEFAULT_Y_AX_DESC "Y-Axis"
|
||||||
#define DEFAULT_X_FORMAT "%H:%M"
|
#define DEFAULT_X_FORMAT "%H:%M"
|
||||||
#define DEFAULT_X_FORMAT_EXTRA "%d.%m.%y| %H:%M"
|
#define DEFAULT_X_FORMAT_EXTRA "%d.%m.%y| %H:%M"
|
||||||
|
#define DEFAULT_USE_GAUSS_AVERAGE "no"
|
||||||
|
#define DEFAULT_AVERAGE_LOOK_WIDTH "30"
|
||||||
|
#define DEFAULT_GAUSS_WIDTH "12"
|
||||||
|
|
||||||
/* Image-Default-Farben ---------------------------------------------- */
|
/* Image-Default-Farben ---------------------------------------------- */
|
||||||
#define DEFAULT_BG_COLOR "DF:DF:EF:00"
|
#define DEFAULT_BG_COLOR "DF:DF:EF:00"
|
||||||
|
|
@ -97,7 +100,7 @@
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#define IMG_FONT "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
|
#define IMG_FONT "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
|
||||||
#define CRON_INTERVAL 15 //Minuten
|
#define CRON_INTERVAL 15 //Minuten
|
||||||
|
#define PI 3.14159265358979323846264
|
||||||
|
|
||||||
/* Debug --------------------------------------------------------------- */
|
/* Debug --------------------------------------------------------------- */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ x_format_extra %d.%m.%y| %H:%M # Das ersre und das letzte Label
|
||||||
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
||||||
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
||||||
show_average yes
|
show_average yes
|
||||||
|
# Wieviele Pixel Links und rechts für den durchschnitt genommen werden sollen
|
||||||
|
average_look_width 30
|
||||||
|
# Anstatt eines Linear gewichtetem Durchschnittes die werte mit einer Gausschen
|
||||||
|
# Glockenkurve falten
|
||||||
|
use_gauss_average no
|
||||||
|
# Breite der Glockenkurve
|
||||||
|
gauss_width 13
|
||||||
|
|
||||||
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
||||||
show_min yes
|
show_min yes
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ x_format_extra %d.%m.%y| %H:%M # Das ersre und das letzte Label
|
||||||
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
||||||
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
||||||
show_average yes
|
show_average yes
|
||||||
|
# Wieviele Pixel Links und rechts für den durchschnitt genommen werden sollen
|
||||||
|
average_look_width 30
|
||||||
|
# Anstatt eines Linear gewichtetem Durchschnittes die werte mit einer Gausschen
|
||||||
|
# Glockenkurve falten
|
||||||
|
use_gauss_average no
|
||||||
|
# Breite der Glockenkurve
|
||||||
|
gauss_width 13
|
||||||
|
|
||||||
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
||||||
show_min yes
|
show_min yes
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ x_format_extra %d.%m.%y| %H:%M # Das ersre und das letzte Label
|
||||||
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
||||||
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
||||||
show_average yes
|
show_average yes
|
||||||
|
# Wieviele Pixel Links und rechts für den durchschnitt genommen werden sollen
|
||||||
|
average_look_width 30
|
||||||
|
# Anstatt eines Linear gewichtetem Durchschnittes die werte mit einer Gausschen
|
||||||
|
# Glockenkurve falten
|
||||||
|
use_gauss_average no
|
||||||
|
# Breite der Glockenkurve
|
||||||
|
gauss_width 13
|
||||||
|
|
||||||
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
||||||
show_min yes
|
show_min yes
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ x_format_extra %d.%m.%y| %H:%M # Das ersre und das letzte Label
|
||||||
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
||||||
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
||||||
show_average no
|
show_average no
|
||||||
|
# Wieviele Pixel Links und rechts für den durchschnitt genommen werden sollen
|
||||||
|
average_look_width 30
|
||||||
|
# Anstatt eines Linear gewichtetem Durchschnittes die werte mit einer Gausschen
|
||||||
|
# Glockenkurve falten
|
||||||
|
use_gauss_average no
|
||||||
|
# Breite der Glockenkurve
|
||||||
|
gauss_width 13
|
||||||
|
|
||||||
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
||||||
show_min no
|
show_min no
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ x_format_extra %d.%m.%y| %H:%M # Das ersre und das letzte Label
|
||||||
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
||||||
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
||||||
show_average yes
|
show_average yes
|
||||||
|
# Wieviele Pixel Links und rechts für den durchschnitt genommen werden sollen
|
||||||
|
average_look_width 30
|
||||||
|
# Anstatt eines Linear gewichtetem Durchschnittes die werte mit einer Gausschen
|
||||||
|
# Glockenkurve falten
|
||||||
|
use_gauss_average no
|
||||||
|
# Breite der Glockenkurve
|
||||||
|
gauss_width 13
|
||||||
|
|
||||||
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
||||||
show_min yes
|
show_min yes
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,17 @@ use_dflt_img_dir yes
|
||||||
headline Temparatur - Innensensor
|
headline Temparatur - Innensensor
|
||||||
manual_table no
|
manual_table no
|
||||||
manual_table_name auss2_data
|
manual_table_name auss2_data
|
||||||
table_field temp
|
table_field geschw
|
||||||
|
#table_field temp
|
||||||
#table_field press
|
#table_field press
|
||||||
gen_interval 1
|
gen_interval 1
|
||||||
show_interval 200d
|
show_interval 20d
|
||||||
label_interval 20d
|
label_interval 2d
|
||||||
fixed_timepoint no
|
fixed_timepoint no
|
||||||
timepoint 2006-12-17-13-00
|
timepoint 2006-12-17-13-00
|
||||||
width 800
|
width 800
|
||||||
height 300
|
height 300
|
||||||
sensor_id 4
|
sensor_id 2
|
||||||
value_koeffizient 0.1
|
value_koeffizient 0.1
|
||||||
#value_koeffizient 1.0
|
#value_koeffizient 1.0
|
||||||
unit °C
|
unit °C
|
||||||
|
|
@ -28,7 +29,10 @@ show_min yes
|
||||||
show_max yes
|
show_max yes
|
||||||
invert_min yes
|
invert_min yes
|
||||||
invert_max yes
|
invert_max yes
|
||||||
|
#use_gauss_average no
|
||||||
|
use_gauss_average yes
|
||||||
|
average_look_width 20
|
||||||
|
gauss_width 7
|
||||||
|
|
||||||
|
|
||||||
#bg_color DF:DF:EF:00
|
#bg_color DF:DF:EF:00
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ x_format_extra %d.%m.%y| %H:%M # Das ersre und das letzte Label
|
||||||
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
# Gibt an, ob eine Linie mit den Durchschnittswerten gezeichnet werden soll
|
||||||
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
# Funktioniert NICHT in Verbindung mit Balkendiagrammen
|
||||||
show_average yes
|
show_average yes
|
||||||
|
# Wieviele Pixel Links und rechts für den durchschnitt genommen werden sollen
|
||||||
|
average_look_width 30
|
||||||
|
# Anstatt eines Linear gewichtetem Durchschnittes die werte mit einer Gausschen
|
||||||
|
# Glockenkurve falten
|
||||||
|
use_gauss_average no
|
||||||
|
# Breite der Glockenkurve
|
||||||
|
gauss_width 13
|
||||||
|
|
||||||
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
# Zeigt in der rechten oberen Ecke die Minimal- bzw. Maximal-Werte an
|
||||||
show_min no
|
show_min no
|
||||||
|
|
|
||||||
|
|
@ -55,10 +55,13 @@ typedef struct image_cfg {
|
||||||
int zero_min; /* Nullinie auf jeden Fall anzeigen */
|
int zero_min; /* Nullinie auf jeden Fall anzeigen */
|
||||||
int bars; /* Balken malen statt einer Linie */
|
int bars; /* Balken malen statt einer Linie */
|
||||||
int show_average; /* Durchschnittslinie zeichnen */
|
int show_average; /* Durchschnittslinie zeichnen */
|
||||||
int show_min;
|
int gauss_width; /* 'Breite' der Gauss-Glocke */
|
||||||
int show_max;
|
int average_look_width; /* wieviele Pixel sollen 'links und rechts' angeschaut werden */
|
||||||
int invert_min;
|
int use_gauss_average; /* Gaussche Glockenkurve statt einer linearen Wichtung fuer den Durchschnitt bebutzen */
|
||||||
int invert_max;
|
int show_min; /* Minimum in der oberen ecke einblenden */
|
||||||
|
int show_max; /* maximum in der oberen ecke einblenden */
|
||||||
|
int invert_min; /* minimum invertiert anzeigen */
|
||||||
|
int invert_max; /* maximum invertiert anzeigen */
|
||||||
int dflt_dir; /* Standart - Verzeichnis fuer die Bilder */
|
int dflt_dir; /* Standart - Verzeichnis fuer die Bilder */
|
||||||
|
|
||||||
/* Farben */
|
/* Farben */
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,9 @@ static const config_keyword keywords[] = {
|
||||||
{"zero_min", read_yn, &(img_cfg.zero_min), DEFAULT_ZERO_MIN},
|
{"zero_min", read_yn, &(img_cfg.zero_min), DEFAULT_ZERO_MIN},
|
||||||
{"as_bars", read_yn, &(img_cfg.bars), DEFAULT_AS_BARS},
|
{"as_bars", read_yn, &(img_cfg.bars), DEFAULT_AS_BARS},
|
||||||
{"show_average", read_yn, &(img_cfg.show_average), DEFAULT_SHOW_AVERAGE},
|
{"show_average", read_yn, &(img_cfg.show_average), DEFAULT_SHOW_AVERAGE},
|
||||||
|
{"use_gauss_average", read_yn, &(img_cfg.use_gauss_average), DEFAULT_USE_GAUSS_AVERAGE},
|
||||||
|
{"average_look_width", read_int, &(img_cfg.average_look_width), DEFAULT_AVERAGE_LOOK_WIDTH},
|
||||||
|
{"gauss_width", read_int, &(img_cfg.gauss_width), DEFAULT_GAUSS_WIDTH},
|
||||||
{"show_min", read_yn, &(img_cfg.show_min), DEFAULT_SHOW_MIN},
|
{"show_min", read_yn, &(img_cfg.show_min), DEFAULT_SHOW_MIN},
|
||||||
{"show_max", read_yn, &(img_cfg.show_max), DEFAULT_SHOW_MAX},
|
{"show_max", read_yn, &(img_cfg.show_max), DEFAULT_SHOW_MAX},
|
||||||
{"invert_min", read_yn, &(img_cfg.invert_min), DEFAULT_INVERT_MIN},
|
{"invert_min", read_yn, &(img_cfg.invert_min), DEFAULT_INVERT_MIN},
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ static char *get_conn_string();
|
||||||
static PGconn *pg_check_connect(char *);
|
static PGconn *pg_check_connect(char *);
|
||||||
static PGresult *pg_check_exec(PGconn *, char *, int);
|
static PGresult *pg_check_exec(PGconn *, char *, int);
|
||||||
static char *get_type_table_by_id(PGconn *, int );
|
static char *get_type_table_by_id(PGconn *, int );
|
||||||
|
static inline double * build_koeff_array(int, int , int);
|
||||||
|
|
||||||
|
|
||||||
/* Gibt die Liste mit den y-Labels zurueck */
|
/* Gibt die Liste mit den y-Labels zurueck */
|
||||||
|
|
@ -496,7 +497,7 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
int field_size = c_width + 10; /* Array-Groeße (sollte nicht groeßer sein als die Breite in Pixel) */
|
int field_size = c_width + 10; /* Array-Groeße (sollte nicht groeßer sein als die Breite in Pixel) */
|
||||||
int i,j,m; /* Zaehlvariablen */
|
int i,j,m; /* Zaehlvariablen */
|
||||||
double sum = 0; /* Summe der berechneten Werte */
|
double sum = 0; /* Summe der berechneten Werte */
|
||||||
double koeff = 0; /* Momentan zu bearbeitener Koeffizient */
|
double *koeff = 0; /* Momentan zu bearbeitener Koeffizient */
|
||||||
double count = 0; /* Summe der Koeffizienten */
|
double count = 0; /* Summe der Koeffizienten */
|
||||||
|
|
||||||
pix_list_ptr old_temp = real_list; /* Liste mit den 'echten' Werten */
|
pix_list_ptr old_temp = real_list; /* Liste mit den 'echten' Werten */
|
||||||
|
|
@ -534,6 +535,9 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
list_count++;
|
list_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Koeffizienten bauen */
|
||||||
|
koeff = build_koeff_array(img_cfg.use_gauss_average, img_cfg.average_look_width, img_cfg.gauss_width);
|
||||||
|
|
||||||
/* Array durchgehen und neue Werte berechnen.
|
/* Array durchgehen und neue Werte berechnen.
|
||||||
* Es werden immer 30 Werte Link und 30 Werte rechts mit
|
* Es werden immer 30 Werte Link und 30 Werte rechts mit
|
||||||
* sich jeweils um 0.03 veringernden koeffizienten
|
* sich jeweils um 0.03 veringernden koeffizienten
|
||||||
|
|
@ -543,18 +547,15 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
if(old_ptr_field[i] != NULL){
|
if(old_ptr_field[i] != NULL){
|
||||||
|
|
||||||
/* Aktueller Wert aus der 'realen' Liste */
|
/* Aktueller Wert aus der 'realen' Liste */
|
||||||
sum = ((double)old_ptr_field[i]->value_sum) / ((double)old_ptr_field[i]->value_count);
|
sum = ((double)old_ptr_field[i]->value_sum) / ((double)old_ptr_field[i]->value_count) * koeff[0];
|
||||||
|
|
||||||
/* Summe der Koeffizienten.
|
/* Summe der Koeffizienten.
|
||||||
* Aktueller Wert hat die Wichtung 1,
|
* Aktueller Wert hat die Wichtung 1,
|
||||||
* daher mit 1 initialisiert */
|
* daher mit 1 initialisiert */
|
||||||
count = 1;
|
count = koeff[0];
|
||||||
|
|
||||||
/* 30 (29) Links ind rechts durchgehen */
|
/* 30 (29) Links ind rechts durchgehen */
|
||||||
for(j = 1; j < 30; j++){
|
for(j = 1; j < img_cfg.average_look_width; j++){
|
||||||
|
|
||||||
/* aktueller Koeffizient */
|
|
||||||
koeff = 0.9 - (0.01 * (3*j));
|
|
||||||
|
|
||||||
/* Anzahl, wie viele Werte mit dem Aktuellem
|
/* Anzahl, wie viele Werte mit dem Aktuellem
|
||||||
* Koeffizienten zur Summe addiert wurden */
|
* Koeffizienten zur Summe addiert wurden */
|
||||||
|
|
@ -563,7 +564,7 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
/* j Werte 'links' vom aktuellem Wert */
|
/* j Werte 'links' vom aktuellem Wert */
|
||||||
if( (i - j) >= 0){
|
if( (i - j) >= 0){
|
||||||
if(old_ptr_field[i-j] != NULL){
|
if(old_ptr_field[i-j] != NULL){
|
||||||
sum += (((double)old_ptr_field[i-j]->value_sum) / ((double)old_ptr_field[i-j]->value_count)) * koeff;
|
sum += (((double)old_ptr_field[i-j]->value_sum) / ((double)old_ptr_field[i-j]->value_count)) * koeff[j];
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -571,7 +572,7 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
/* j Werte rechts vom aktuellem Wert */
|
/* j Werte rechts vom aktuellem Wert */
|
||||||
if( (i + j) < list_count){
|
if( (i + j) < list_count){
|
||||||
if(old_ptr_field[i+j] != NULL){
|
if(old_ptr_field[i+j] != NULL){
|
||||||
sum += (((double)old_ptr_field[i+j]->value_sum) / ((double)old_ptr_field[i+j]->value_count)) * koeff;
|
sum += (((double)old_ptr_field[i+j]->value_sum) / ((double)old_ptr_field[i+j]->value_count)) * koeff[j];
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -581,7 +582,8 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
* multipliziert mit dem aktuellem
|
* multipliziert mit dem aktuellem
|
||||||
* koeffizienten und das ganze auf
|
* koeffizienten und das ganze auf
|
||||||
* den gesammtkoeffizienten addiert */
|
* den gesammtkoeffizienten addiert */
|
||||||
count += m * koeff;
|
count += m * koeff[j];
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -596,6 +598,9 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Koeffizienten freigeben */
|
||||||
|
free(koeff);
|
||||||
|
|
||||||
/* Array freigeben */
|
/* Array freigeben */
|
||||||
free(old_ptr_field);
|
free(old_ptr_field);
|
||||||
|
|
||||||
|
|
@ -604,6 +609,33 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Array mit koeffizienten bauen
|
||||||
|
* gibt als rueckgabewert die koeffizienten
|
||||||
|
* Typ: 0=linear, 1=gauss*/
|
||||||
|
static inline double* build_koeff_array(int type, int look_width, int gauss_width){
|
||||||
|
int j; /* Laufvariable */
|
||||||
|
double div;
|
||||||
|
int o = gauss_width;
|
||||||
|
double * koeff_array = malloc((sizeof(double) * (look_width+1)));
|
||||||
|
|
||||||
|
for(j = 0; j < look_width; j++){
|
||||||
|
if(type){
|
||||||
|
/* GAUSS!!!*/
|
||||||
|
koeff_array[j] = (1/ (sqrt(2*PI) * o))*exp(-(j*j)/(o*o));
|
||||||
|
} else {
|
||||||
|
/* LINEAR*/
|
||||||
|
if (j == 0){
|
||||||
|
koeff_array[0] = 1;
|
||||||
|
} else {
|
||||||
|
div = 0.9 / ((double)look_width);
|
||||||
|
koeff_array[j] = 0.9 - (div * j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return koeff_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* baut den String fuer die Postgres-Verbindung zusammen */
|
/* baut den String fuer die Postgres-Verbindung zusammen */
|
||||||
static char *get_conn_string(){
|
static char *get_conn_string(){
|
||||||
char *conn_string = malloc(sizeof(char)*BUFFSIZE);
|
char *conn_string = malloc(sizeof(char)*BUFFSIZE);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue