diff --git a/src/lib/aqdiagram/data/date.c b/src/lib/aqdiagram/data/date.c index 8684ed6..3527663 100644 --- a/src/lib/aqdiagram/data/date.c +++ b/src/lib/aqdiagram/data/date.c @@ -15,6 +15,8 @@ #include #include +#include + AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DaySums(const AQDG_GRAPH_DATAPAIR_LIST *dpList) @@ -97,7 +99,6 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(lastDate)); AQDG_Graph_DataPair_SetValueY(newDp, AQDG_Graph_DataPair_GetValueY(dp)); AQDG_Graph_DataPair_List_Add(newDp, newList); - DBG_ERROR(NULL, "Added first value: %.2f", AQDG_Graph_DataPair_GetValueY(dp)); } else { GWEN_DATE *dt; @@ -114,7 +115,6 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(lastDate)); AQDG_Graph_DataPair_SetValueY(newDp, AQDG_Graph_DataPair_GetValueY(dp)); AQDG_Graph_DataPair_List_Add(newDp, newList); - DBG_ERROR(NULL, "Added value: %.2f", AQDG_Graph_DataPair_GetValueY(dp)); } else { double v2; @@ -122,7 +122,6 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp /* add to existing date value */ v2=AQDG_Graph_DataPair_GetValueY(newDp); AQDG_Graph_DataPair_SetValueY(newDp, v2+v); - DBG_ERROR(NULL, "Added %.2f to existing value: %.2f", v, v2); GWEN_Date_free(newDate); } } @@ -136,3 +135,132 @@ AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dp +AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DayAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList) +{ + if (dpList && AQDG_Graph_DataPair_List_GetCount(dpList)) { + AQDG_GRAPH_DATAPAIR_LIST *newList; + const AQDG_GRAPH_DATAPAIR *dp; + GWEN_DATE *currentDate=NULL; + double currentSum; + int currentCount; + + newList=AQDG_Graph_DataPair_List_new(); + dp=AQDG_Graph_DataPair_List_First(dpList); + while(dp) { + if (currentDate==NULL) { + /* first value */ + currentDate=GWEN_Date_fromLocalTime(AQDG_Graph_DataPair_GetValueX(dp)); + currentSum=AQDG_Graph_DataPair_GetValueY(dp); + currentCount=1; + } + else { + GWEN_DATE *newDate; + + newDate=GWEN_Date_fromLocalTime(AQDG_Graph_DataPair_GetValueX(dp)); + if (GWEN_Date_Compare(newDate, currentDate)!=0) { + AQDG_GRAPH_DATAPAIR *newDp; + + /* new date */ + newDp=AQDG_Graph_DataPair_new(); + AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(currentDate)); + AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount); + AQDG_Graph_DataPair_List_Add(newDp, newList); + + currentSum=AQDG_Graph_DataPair_GetValueY(dp); + currentCount=1; + GWEN_Date_free(currentDate); + currentDate=newDate; + } + else { + /* add to existing date value */ + currentSum+=AQDG_Graph_DataPair_GetValueY(dp); + currentCount++; + GWEN_Date_free(newDate); + } + } + dp=AQDG_Graph_DataPair_List_Next(dp); + } + if (currentCount && currentDate) { + AQDG_GRAPH_DATAPAIR *newDp; + + /* store data for last value */ + newDp=AQDG_Graph_DataPair_new(); + AQDG_Graph_DataPair_SetValueX(newDp, GWEN_Date_toLocalTime(currentDate)); + AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount); + AQDG_Graph_DataPair_List_Add(newDp, newList); + } + GWEN_Date_free(currentDate); + return newList; + } + return NULL; +} + + + +AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MinutesAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList, int minutes) +{ + if (dpList && AQDG_Graph_DataPair_List_GetCount(dpList)) { + AQDG_GRAPH_DATAPAIR_LIST *newList; + const AQDG_GRAPH_DATAPAIR *dp; + double currentTimeMinutes=0; + double currentTimeValue; + double currentSum; + int currentCount=0; + + newList=AQDG_Graph_DataPair_List_new(); + dp=AQDG_Graph_DataPair_List_First(dpList); + while(dp) { + if (currentCount==0) { + + /* first value */ + currentTimeValue=AQDG_Graph_DataPair_GetValueX(dp); + currentTimeMinutes=floor(currentTimeValue/60.0); + currentSum=AQDG_Graph_DataPair_GetValueY(dp); + currentCount=1; + } + else { + double newTimeValue; + double newTimeMinutes; + + newTimeValue=AQDG_Graph_DataPair_GetValueX(dp); + newTimeMinutes=floor(newTimeValue/60.0); + if ((newTimeMinutes-currentTimeMinutes)<(double)minutes) { + /* add to existing sum */ + currentSum+=AQDG_Graph_DataPair_GetValueY(dp); + currentCount++; + } + else { + AQDG_GRAPH_DATAPAIR *newDp; + + /* new date */ + newDp=AQDG_Graph_DataPair_new(); + AQDG_Graph_DataPair_SetValueX(newDp, (floor(currentTimeMinutes/(double) minutes)*(double) minutes)*60.0); +// AQDG_Graph_DataPair_SetValueX(newDp, floor(currentTimeMinutes*60.0)); + AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount); + AQDG_Graph_DataPair_List_Add(newDp, newList); + + currentSum=AQDG_Graph_DataPair_GetValueY(dp); + currentCount=1; + currentTimeValue=newTimeValue; + currentTimeMinutes=newTimeMinutes; + } + } + dp=AQDG_Graph_DataPair_List_Next(dp); + } + if (currentCount) { + AQDG_GRAPH_DATAPAIR *newDp; + + /* store data for last value */ + newDp=AQDG_Graph_DataPair_new(); + AQDG_Graph_DataPair_SetValueX(newDp, (floor(currentTimeMinutes/(double) minutes)*(double) minutes)*60.0); +// AQDG_Graph_DataPair_SetValueX(newDp, floor(currentTimeMinutes*60.0)); + AQDG_Graph_DataPair_SetValueY(newDp, currentSum/(double)currentCount); + AQDG_Graph_DataPair_List_Add(newDp, newList); + } + return newList; + } + return NULL; +} + + + diff --git a/src/lib/aqdiagram/data/date.h b/src/lib/aqdiagram/data/date.h index 5a66d17..8418166 100644 --- a/src/lib/aqdiagram/data/date.h +++ b/src/lib/aqdiagram/data/date.h @@ -16,6 +16,9 @@ AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DaySums(const AQDG_GRAPH_DATAPAIR_LIST *dpList); AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MonthSums(const AQDG_GRAPH_DATAPAIR_LIST *dpList); +AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_DayAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList); + +AQDG_API AQDG_GRAPH_DATAPAIR_LIST *AQDG_Data_MinutesAverage(const AQDG_GRAPH_DATAPAIR_LIST *dpList, int minutes);