diff --git a/aqhome/data/storage.c b/aqhome/data/storage.c index 9afa0fc..722a89a 100644 --- a/aqhome/data/storage.c +++ b/aqhome/data/storage.c @@ -39,16 +39,26 @@ static GWEN_BUFFER *_getDataFilePathForValueId(const AQH_STORAGE *sto, uint64_t /* ------------------------------------------------------------------------------------------------ - * implementations + * GWEN macros * ------------------------------------------------------------------------------------------------ */ +GWEN_INHERIT_FUNCTIONS(AQH_STORAGE) + + + +/* ------------------------------------------------------------------------------------------------ + * implementations + * ------------------------------------------------------------------------------------------------ + */ AQH_STORAGE *AQH_Storage_new(void) { AQH_STORAGE *sto; GWEN_NEW_OBJECT(AQH_STORAGE, sto); + GWEN_INHERIT_INIT(AQH_STORAGE, sto); + sto->deviceList=AQH_Device_List_new(); sto->valueList=AQH_Value_List_new(); sto->dataFileList=AQH_DataFile_List_new(); @@ -61,6 +71,7 @@ AQH_STORAGE *AQH_Storage_new(void) void AQH_Storage_free(AQH_STORAGE *sto) { if (sto) { + GWEN_INHERIT_FINI(AQH_STORAGE, sto); AQH_DataFile_List_free(sto->dataFileList); AQH_Value_List_free(sto->valueList); AQH_Device_List_free(sto->deviceList); @@ -194,6 +205,116 @@ void AQH_Storage_SubRuntimeFlags(AQH_STORAGE *sto, uint32_t flags) +int AQH_Storage_WriteState(AQH_STORAGE *sto) +{ + int rv; + + rv=AQH_Storage_WriteStateFile(sto, sto->stateFile); + if (rv<0) { + DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); + return rv; + } + sto->runtimeFlags&=~AQH_STORAGE_RTFLAGS_MODIFIED; + return 0; +} + + + + +const char *AQH_Storage_GetDataFileFolder(const AQH_STORAGE *sto) +{ + return sto?sto->dataFileFolder:NULL; +} + + + +void AQH_Storage_SetDataFileFolder(AQH_STORAGE *sto, const char *s) +{ + if (sto) { + free(sto->dataFileFolder); + sto->dataFileFolder=s?strdup(s):NULL; + } +} + + + +AQH_STORAGE_INIT_FN AQH_Storage_SetInitFn(AQH_STORAGE *sto, AQH_STORAGE_INIT_FN fn) +{ + AQH_STORAGE_INIT_FN oldFn; + + oldFn=sto->initFn; + sto->initFn=fn; + return oldFn; +} + + + +AQH_STORAGE_FINI_FN AQH_Storage_SetFiniFn(AQH_STORAGE *sto, AQH_STORAGE_FINI_FN fn) +{ + AQH_STORAGE_FINI_FN oldFn; + + oldFn=sto->finiFn; + sto->finiFn=fn; + return oldFn; +} + + + +AQH_STORAGE_ADDDATAPOINT_FN AQH_Storage_SetAddDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_ADDDATAPOINT_FN fn) +{ + AQH_STORAGE_ADDDATAPOINT_FN oldFn; + + oldFn=sto->addDatapointFn; + sto->addDatapointFn=fn; + return oldFn; +} + + + +AQH_STORAGE_GETDATAPOINTS_FN AQH_Storage_SetGetDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETDATAPOINTS_FN fn) +{ + AQH_STORAGE_GETDATAPOINTS_FN oldFn; + + oldFn=sto->getDatapointsFn; + sto->getDatapointsFn=fn; + return oldFn; +} + + + +AQH_STORAGE_GETFIRSTDATAPOINT_FN AQH_Storage_SetGetFirstDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETFIRSTDATAPOINT_FN fn) +{ + AQH_STORAGE_GETFIRSTDATAPOINT_FN oldFn; + + oldFn=sto->getFirstDatapointFn; + sto->getFirstDatapointFn=fn; + return oldFn; +} + + + +AQH_STORAGE_GETLASTDATAPOINT_FN AQH_Storage_SetGetLastDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTDATAPOINT_FN fn) +{ + AQH_STORAGE_GETLASTDATAPOINT_FN oldFn; + + oldFn=sto->getLastDatapointFn; + sto->getLastDatapointFn=fn; + return oldFn; +} + + + +AQH_STORAGE_GETLASTNDATAPOINTS_FN AQH_Storage_SetGetLastNDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTNDATAPOINTS_FN fn) +{ + AQH_STORAGE_GETLASTNDATAPOINTS_FN oldFn; + + oldFn=sto->getLastNDatapointsFn; + sto->getLastNDatapointsFn=fn; + return oldFn; +} + + + int AQH_Storage_Init(AQH_STORAGE *sto) { int rv; @@ -244,39 +365,6 @@ int AQH_Storage_Fini(AQH_STORAGE *sto) -int AQH_Storage_WriteState(AQH_STORAGE *sto) -{ - int rv; - - rv=AQH_Storage_WriteStateFile(sto, sto->stateFile); - if (rv<0) { - DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); - return rv; - } - sto->runtimeFlags&=~AQH_STORAGE_RTFLAGS_MODIFIED; - return 0; -} - - - - -const char *AQH_Storage_GetDataFileFolder(const AQH_STORAGE *sto) -{ - return sto?sto->dataFileFolder:NULL; -} - - - -void AQH_Storage_SetDataFileFolder(AQH_STORAGE *sto, const char *s) -{ - if (sto) { - free(sto->dataFileFolder); - sto->dataFileFolder=s?strdup(s):NULL; - } -} - - - int AQH_Storage_AddDatapoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t timestamp, double dataPoint) { AQH_DATAFILE *df; @@ -471,6 +559,34 @@ int AQH_Storage_GetLastDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *p +int AQH_Storage_GetFirstDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue) +{ + AQH_DATAFILE *df; + uint64_t numEntries; + int rv; + + df=_getDataFileByValueId(sto, valueId); + if (df==NULL) { + DBG_ERROR(AQH_LOGDOMAIN, "No file for value id %lu", (unsigned long int) valueId); + return GWEN_ERROR_INVALID; + } + numEntries=AQH_DataFile_GetNumberOfEntries(df); + if (numEntries<2) { + DBG_INFO(AQH_LOGDOMAIN, "No data entries in file"); + return GWEN_ERROR_NO_DATA; + } + + rv=AQH_DataFile_ReadRecord(df, 1, pTimestamp, pValue); + if (rv<0) { + DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); + return rv; + } + + return 0; +} + + + AQH_DATAFILE *_getDataFileByValueId(AQH_STORAGE *sto, uint64_t valueId) { diff --git a/aqhome/data/storage.h b/aqhome/data/storage.h index 3dff203..1382ade 100644 --- a/aqhome/data/storage.h +++ b/aqhome/data/storage.h @@ -12,6 +12,8 @@ #include +#include + #ifdef __cplusplus @@ -20,6 +22,8 @@ extern "C" { typedef struct AQH_STORAGE AQH_STORAGE; +GWEN_INHERIT_FUNCTION_LIB_DEFS(AQH_STORAGE, AQHOME_API) + #ifdef __cplusplus @@ -40,6 +44,17 @@ typedef struct AQH_STORAGE AQH_STORAGE; extern "C" { #endif +typedef int (*AQH_STORAGE_INIT_FN)(AQH_STORAGE *sto); +typedef int (*AQH_STORAGE_FINI_FN)(AQH_STORAGE *sto); + +typedef int (*AQH_STORAGE_ADDDATAPOINT_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t timestamp, double dataPoint); +typedef uint64_t *(*AQH_STORAGE_GETDATAPOINTS_FN)(AQH_STORAGE *sto, uint64_t valueId, + uint64_t fromTime, uint64_t toTime, + uint64_t maxArrayLen); +typedef int (*AQH_STORAGE_GETFIRSTDATAPOINT_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue); +typedef int (*AQH_STORAGE_GETLASTDATAPOINT_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue); +typedef uint64_t *(*AQH_STORAGE_GETLASTNDATAPOINTS_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t maxDataPointsRequested); + /** @@ -74,14 +89,23 @@ AQHOME_API int AQH_Storage_Fini(AQH_STORAGE *sto); AQHOME_API int AQH_Storage_WriteState(AQH_STORAGE *sto); + AQHOME_API int AQH_Storage_AddDatapoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t timestamp, double dataPoint); AQHOME_API uint64_t *AQH_Storage_GetDataPoints(AQH_STORAGE *sto, uint64_t valueId, uint64_t fromTime, uint64_t toTime, uint64_t maxArrayLen); +AQHOME_API int AQH_Storage_GetFirstDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue); AQHOME_API int AQH_Storage_GetLastDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue); AQHOME_API uint64_t *AQH_Storage_GetLastNDataPoints(AQH_STORAGE *sto, uint64_t valueId, uint64_t maxDataPointsRequested); +AQHOME_API AQH_STORAGE_INIT_FN AQH_Storage_SetInitFn(AQH_STORAGE *sto, AQH_STORAGE_INIT_FN fn); +AQHOME_API AQH_STORAGE_FINI_FN AQH_Storage_SetFiniFn(AQH_STORAGE *sto, AQH_STORAGE_FINI_FN fn); +AQHOME_API AQH_STORAGE_ADDDATAPOINT_FN AQH_Storage_SetAddDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_ADDDATAPOINT_FN fn); +AQHOME_API AQH_STORAGE_GETDATAPOINTS_FN AQH_Storage_SetGetDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETDATAPOINTS_FN fn); +AQHOME_API AQH_STORAGE_GETFIRSTDATAPOINT_FN AQH_Storage_SetGetFirstDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETFIRSTDATAPOINT_FN fn); +AQHOME_API AQH_STORAGE_GETLASTDATAPOINT_FN AQH_Storage_SetGetLastDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTDATAPOINT_FN fn); +AQHOME_API AQH_STORAGE_GETLASTNDATAPOINTS_FN AQH_Storage_SetGetLastNDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTNDATAPOINTS_FN fn); #ifdef __cplusplus diff --git a/aqhome/data/storage_p.h b/aqhome/data/storage_p.h index 9c76b55..2ad7bc7 100644 --- a/aqhome/data/storage_p.h +++ b/aqhome/data/storage_p.h @@ -25,6 +25,8 @@ struct AQH_STORAGE { + GWEN_INHERIT_ELEMENT(AQH_STORAGE) + AQH_VALUE_LIST *valueList; AQH_DEVICE_LIST *deviceList; @@ -37,6 +39,14 @@ struct AQH_STORAGE { AQH_DATAFILE_LIST *dataFileList; uint32_t runtimeFlags; + + AQH_STORAGE_INIT_FN initFn; + AQH_STORAGE_FINI_FN finiFn; + AQH_STORAGE_ADDDATAPOINT_FN addDatapointFn; + AQH_STORAGE_GETDATAPOINTS_FN getDatapointsFn; + AQH_STORAGE_GETFIRSTDATAPOINT_FN getFirstDatapointFn; + AQH_STORAGE_GETLASTDATAPOINT_FN getLastDatapointFn; + AQH_STORAGE_GETLASTNDATAPOINTS_FN getLastNDatapointsFn; };