diff options
Diffstat (limited to 'lcmodule/source/cnh1606344_ldr_communication_module/source/measurement_tool.c')
-rw-r--r-- | lcmodule/source/cnh1606344_ldr_communication_module/source/measurement_tool.c | 658 |
1 files changed, 658 insertions, 0 deletions
diff --git a/lcmodule/source/cnh1606344_ldr_communication_module/source/measurement_tool.c b/lcmodule/source/cnh1606344_ldr_communication_module/source/measurement_tool.c new file mode 100644 index 0000000..29c678d --- /dev/null +++ b/lcmodule/source/cnh1606344_ldr_communication_module/source/measurement_tool.c @@ -0,0 +1,658 @@ +/******************************************************************************* + * Copyright (C) ST-Ericsson SA 2011 + * License terms: 3-clause BSD license + ******************************************************************************/ +/** + * @addtogroup ldr_communication_serv + * @{ + */ + +/******************************************************************************* + * Includes + ******************************************************************************/ +#include <string.h> +#include "t_basicdefinitions.h" +#include "r_communication_service.h" +#include "r_measurement_tool.h" +#include "r_time_utilities.h" +#include "r_serialization.h" +#include "r_debug_macro.h" +#include "r_memmory_utils.h" + +/******************************************************************************* + * File scope types, constants and variables + ******************************************************************************/ + +Measurement_t *Measurement_p; + +static ChunkMeasurement_t *GetLastChunkDataBlock(ChunkMeasurement_t *ChunkMeasurement_p); +static SessionMeasurement_t *GetLastSessionDataBlock(SessionMeasurement_t *SessionMeasurement_p); +static ChunkMeasurement_t *FindChunkDataBlock(ChunkMeasurement_t *Measurement_p, uint32 ChunkID); +static uint32 CalculateSizeOfResults(SessionMeasurement_t *DataMeasurement_p, uint32 Type, uint32 *SessionNr_pp); +static void SessionDataSerialize(uint8 **Data_pp, SessionMeasurement_t *SessData_p, uint32 *Length_p); +static void ChunkDataSerialize(uint8 **Data_pp, ChunkMeasurement_t *ChunkData_p, uint32 *Length_p); +static ErrorCode_e CompleteBulkFlashResults(Measurement_t *Measurement_p); +static void TimerMeasurmentHandler(void *Data_p, void *Timer_p, void *Param_p); + +/******************************************************************************* + * Definition of external functions + ******************************************************************************/ +/* + * Initialization of measurement module. + * + * @param [in] Measurement_p Pointer to curren measurement data block. + * + * @retval E_SUCCESS If initialization is done. + */ +ErrorCode_e Do_Measurement_Init(Measurement_t *Measurement_p) +{ + return E_SUCCESS; +} + +/* + * This function create general measurement data block. + * + * @param [in] Communication_p Communication module context. + * @param [in] Measurement_pp Pointer to the created measurement data block. + * @param [in] Type Type of measurement. + * + * @retval E_SUCCESS After successful execution. + * @retval E_ALLOCATE_FAILED If failed to allocate session measurement + * data block. + */ +ErrorCode_e Do_Measurement_CreateMeasurementData(Communication_t *Communication_p, Measurement_t **Measurement_pp, uint32 Type) +{ + ErrorCode_e ReturnValue = E_ALLOCATE_FAILED; + + if (NULL != *Measurement_pp) { + ReturnValue = Do_Measurement_DestroyMeasurementData(Measurement_pp); + + if (E_SUCCESS != ReturnValue) { + return ReturnValue; + } + } + + *Measurement_pp = (Measurement_t *)malloc(sizeof(Measurement_t)); + + if (NULL == *Measurement_pp) { + return E_ALLOCATE_FAILED; + } + + (*Measurement_pp)->MeasurementData_p = malloc(sizeof(MeasurementDataContext_t)); + + if (NULL == (*Measurement_pp)->MeasurementData_p) { + return E_ALLOCATE_FAILED; + } + + (*Measurement_pp)->MeasurementData_p->SessionNr = 0; + (*Measurement_pp)->MeasurementData_p->SessionMeasurement_p = NULL; + (*Measurement_pp)->MeasurementData_p->ProcesFileMeasurement_p = NULL; + (*Measurement_pp)->Timer.Time = 3600000; + (*Measurement_pp)->Timer.Time = 3600000; + (*Measurement_pp)->Timer.PeriodicalTime = 0; + (*Measurement_pp)->Timer.HandleFunction_p = TimerMeasurmentHandler; + (*Measurement_pp)->TimerId = Do_Timer_TimerGet(NULL, &(*Measurement_pp)->Timer); + (*Measurement_pp)->StartCommandTime = 0; + (*Measurement_pp)->EndCommandTime = 0; + (*Measurement_pp)->Type = Type; + (*Measurement_pp)->ResultLength = 0; + (*Measurement_pp)->Result_p = NULL; + return E_SUCCESS; +} + +/* + * This function create general measurement data block. + * + * @param [in] Communication_p Communication module context. + * @param [in] Data_pp Pointer to the data block. + * @param [in] DataLength_p Pointer to the data block length. + * + * @retval E_SUCCESS After successful execution. + * @retval E_ALLOCATE_FAILED If failed to allocate session measurement + * data block. + */ +uint32 Do_Measurement_GetMeasurementData(Communication_t *Communication_p, uint8 **Data_pp) +{ + if (NULL == Measurement_p || 0 == Measurement_p->ResultLength || NULL == Measurement_p->Result_p) { + return 0; + } + + *Data_pp = (uint8 *)malloc(Measurement_p->ResultLength); + ASSERT(NULL != *Data_pp); + memcpy((uint8 *)*Data_pp, Measurement_p->Result_p, Measurement_p->ResultLength); + return Measurement_p->ResultLength; +} + +/* + * This function create measurement data block for bulk session. + * + * @param [in] Communication_p Communication module context. + * @param [in] SessionMeasurement_pp Pointer to the created session + * measurement data block. + * @param [in] PreviousSessionDataBlock_p Pointer to the previouse session + * measurement data block. + * @param [in] ChunkNr Number of chunks in this session. + * @param [in] Session Session number. + * + * @retval E_SUCCESS After successful execution. + * @retval E_ALLOCATE_FAILED If failed to allocate session measurement + * data block. + */ +ErrorCode_e Do_Measurement_CreateSessionMeasurementData(Communication_t *Communication_p, + SessionMeasurement_t **SessionMeasurement_pp, + SessionMeasurement_t *PreviousSessionDataBlock_p, + uint32 ChunkNr, uint32 Session) +{ + ChunkMeasurement_t *ChunkDataBlock_p = NULL; + SessionMeasurement_t **NewSessionDataBlock_pp = NULL; + SessionMeasurement_t *LastSessionMeasurement_p = NULL; + uint32 i; + ErrorCode_e ReturnValue = E_ALLOCATE_FAILED; + + if (*SessionMeasurement_pp != NULL) { + LastSessionMeasurement_p = GetLastSessionDataBlock(*SessionMeasurement_pp); + NewSessionDataBlock_pp = &LastSessionMeasurement_p->NextDataBlock_p; + } else { + NewSessionDataBlock_pp = SessionMeasurement_pp; + } + + *NewSessionDataBlock_pp = (SessionMeasurement_t *)malloc(sizeof(SessionMeasurement_t)); + + if (NULL == *SessionMeasurement_pp) { + return ReturnValue; + } + + (*NewSessionDataBlock_pp)->PreviousDataBlock_p = LastSessionMeasurement_p; + (*NewSessionDataBlock_pp)->SessionId = Session; + (*NewSessionDataBlock_pp)->ChunkNr = ChunkNr; + (*NewSessionDataBlock_pp)->OpenSessionTime = 0; + (*NewSessionDataBlock_pp)->CloseSessionTime = 0; + (*NewSessionDataBlock_pp)->ChunkMeasurement_p = NULL; + (*NewSessionDataBlock_pp)->NextDataBlock_p = NULL; + + for (i = 0; i < ChunkNr; i++) { + ReturnValue = Do_Measurement_CreateChunkMeasurementData(Communication_p, &(*NewSessionDataBlock_pp)->ChunkMeasurement_p, ChunkDataBlock_p, i); + } + + return ReturnValue; +} + +/* + * This function create measurement data block for measure chunks transfer. + * + * @param [in] Communication_p Communication module context. + * @param [in] ChunkMeasurement_pp Pointer to the created chunk + * measurement data block. + * @param [in] PreviousChunkDataBlock_p Pointer to the previouse chunk + * measurement data block. + * @param [in] ChunkId Chunk ID. + * + * @retval E_SUCCESS After successful execution. + * @retval E_ALLOCATE_FAILED If failed to allocate session measurement + * data block. + */ +ErrorCode_e Do_Measurement_CreateChunkMeasurementData(Communication_t *Communication_p, + ChunkMeasurement_t **ChunkMeasurement_pp, + ChunkMeasurement_t *PreviousChunkDataBlock_p, + uint32 ChunkId) +{ + ChunkMeasurement_t **NewChunkDataBlock_pp = NULL; + ChunkMeasurement_t *LastChunkMeasurement_p = NULL; + + if (*ChunkMeasurement_pp != NULL) { + LastChunkMeasurement_p = GetLastChunkDataBlock(*ChunkMeasurement_pp); + NewChunkDataBlock_pp = &(LastChunkMeasurement_p)->NextDataBlock_p; + } else { + NewChunkDataBlock_pp = ChunkMeasurement_pp; + } + + *NewChunkDataBlock_pp = (ChunkMeasurement_t *)malloc(sizeof(ChunkMeasurement_t)); + + if (NULL == *NewChunkDataBlock_pp) { + return E_ALLOCATE_FAILED; + } + + (*NewChunkDataBlock_pp)->PreviousDataBlock_p = LastChunkMeasurement_p; + (*NewChunkDataBlock_pp)->ChunkId = ChunkId; + (*NewChunkDataBlock_pp)->ReceivedChunkTime = 0; + (*NewChunkDataBlock_pp)->StartFlashChunkTime = 0; + (*NewChunkDataBlock_pp)->EndFlashChunkTime = 0; + (*NewChunkDataBlock_pp)->NextDataBlock_p = NULL; + return E_SUCCESS; +} + +/* + * This function destroy measurement data block for bulk session. + * + * @param [in] Measurement_pp Pointer to the measurement data block. + * + * @retval E_SUCCESS After successful execution. + */ +ErrorCode_e Do_Measurement_DestroySessionMeasurementData(SessionMeasurement_t **SessionMeasurement_pp) +{ + ErrorCode_e ReturnValue; + SessionMeasurement_t *LastSessionDataBlock_p = NULL; + + if (*SessionMeasurement_pp != NULL) { + LastSessionDataBlock_p = GetLastSessionDataBlock(*SessionMeasurement_pp); + + do { + *SessionMeasurement_pp = LastSessionDataBlock_p->PreviousDataBlock_p; + /* free the all chunks in the session data block */ + ReturnValue = Do_Measurement_DestroyChunkMeasurementData(&LastSessionDataBlock_p->ChunkMeasurement_p); + + if (ReturnValue != E_SUCCESS) { + return ReturnValue; + } + + /* free the session data block */ + free(LastSessionDataBlock_p); + LastSessionDataBlock_p = *SessionMeasurement_pp; + } while (LastSessionDataBlock_p->PreviousDataBlock_p != NULL); + + /* free the all chunks in the last session data block */ + ReturnValue = Do_Measurement_DestroyChunkMeasurementData(&LastSessionDataBlock_p->ChunkMeasurement_p); + + if (ReturnValue != E_SUCCESS) { + return ReturnValue; + } + + /* free the last session data block */ + free(LastSessionDataBlock_p); + } + + return E_SUCCESS; +} + +/* + * This function destroy measurement data block for bulk chunks. + * + * @param [in] Measurement_pp Pointer to the main measurement data block. + * + * @retval E_SUCCESS After successful execution. + */ +ErrorCode_e Do_Measurement_DestroyChunkMeasurementData(ChunkMeasurement_t **ChunkMeasurement_pp) +{ + ChunkMeasurement_t *LastChunkDataBlock_p = NULL; + ChunkMeasurement_t *TmpLastChunkDataBlock_p = NULL; + + if (*ChunkMeasurement_pp != NULL) { + LastChunkDataBlock_p = GetLastChunkDataBlock(*ChunkMeasurement_pp); + TmpLastChunkDataBlock_p = LastChunkDataBlock_p->PreviousDataBlock_p; + free(LastChunkDataBlock_p); + + while (TmpLastChunkDataBlock_p != NULL) { + /* free the chunk data block */ + LastChunkDataBlock_p = TmpLastChunkDataBlock_p; + TmpLastChunkDataBlock_p = LastChunkDataBlock_p->PreviousDataBlock_p; + free(LastChunkDataBlock_p); + }//while(TmpLastChunkDataBlock_p != NULL); + + // while(LastChunkDataBlock_p->PreviousDataBlock_p != NULL) + // { + // *ChunkMeasurement_pp = LastChunkDataBlock_p->PreviousDataBlock_p; + // /* free the chunk data block */ + // free(LastChunkDataBlock_p); + // LastChunkDataBlock_p = *ChunkMeasurement_pp; + // } + /* free the last chunk data block */ + //free(*ChunkMeasurement_pp); + } + + return E_SUCCESS; +} + +/* + * This function destroy general measurement data block. + * + * @param [in] Measurement_pp Pointer to the main measurement data block. + * + * @retval E_SUCCESS After successful execution. + */ +ErrorCode_e Do_Measurement_DestroyMeasurementData(Measurement_t **Measurement_pp) +{ + ErrorCode_e ReturnValue = E_INVALID_INPUT_PARAMETERS; + + if (NULL == *Measurement_pp) { + return ReturnValue; + } + + switch ((*Measurement_pp)->Type) { + case FLASH_VIA_BULK_TRANSFER: + + /* free the all created session data blocks */ + if (NULL != (*Measurement_pp)->MeasurementData_p) { + if (NULL != (*Measurement_pp)->MeasurementData_p->SessionMeasurement_p) { + ReturnValue = Do_Measurement_DestroySessionMeasurementData(&(*Measurement_pp)->MeasurementData_p->SessionMeasurement_p); + (*Measurement_pp)->MeasurementData_p->SessionMeasurement_p = NULL; + } + + ReturnValue = E_SUCCESS; + //free((*Measurement_pp)->MeasurementData_p->ProcesFileMeasurement_p); + //free((*Measurement_pp)->MeasurementData_p); + } + + if (E_SUCCESS != ReturnValue) { + return ReturnValue; + } + + break; + + default: + //... + break; + } + + //free(*Measurement_pp); + return ReturnValue; +} + +/* + * This function make zero reference for all measured data. + * + * @param [in] Measurement_p Pointer to the main measurement data block. + * + * @retval E_SUCCESS After successful execution. + */ +ErrorCode_e Do_Measurement_ZeroReferenceMeasurementData(Measurement_t *Measurement_p) +{ + return E_SUCCESS; +} + +/* + * This function add measured time in specified measurement data block. + * + * @param [in] Measurement_p Pointer to the main measurement data block. + * @param [in] Time Measured time. + * @param [in] ChunkID Chunk ID + * @param [in] Parameter Parameter in the measurement data block. + * + * @retval E_SUCCESS After successful execution. + */ +ErrorCode_e Do_Measurement_AddMeasurementData(Measurement_t *Measurement_p, uint32 Time, uint32 ChunkID, MeasurementParameter_t Parameter) +{ + ErrorCode_e ReturnValue = E_FAILED_TO_FIND_CHUNK_DATA_BLOCK; + uint32 NewTime; + SessionMeasurement_t *SessionMeasurement_p = GetLastSessionDataBlock(Measurement_p->MeasurementData_p->SessionMeasurement_p); + ChunkMeasurement_t *ChankDataBlock_p = NULL; + NewTime = Measurement_p->Timer.Time - Time; + + switch (Parameter) { + case START_SESSION_TIME: + SessionMeasurement_p->OpenSessionTime = NewTime; + ReturnValue = E_SUCCESS; + break; + case END_SESSION_TIME: + SessionMeasurement_p->CloseSessionTime = NewTime; + ReturnValue = E_SUCCESS; + break; + case RECEIVED_CHUNK_TIME : + ChankDataBlock_p = FindChunkDataBlock(SessionMeasurement_p->ChunkMeasurement_p, ChunkID); + + if (ChankDataBlock_p != NULL) { + ChankDataBlock_p->ReceivedChunkTime = NewTime; + ReturnValue = E_SUCCESS; + } + + break; + case START_FLASH_CHUNK_TIME: + ChankDataBlock_p = FindChunkDataBlock(SessionMeasurement_p->ChunkMeasurement_p, ChunkID); + + if (ChankDataBlock_p != NULL) { + ChankDataBlock_p->StartFlashChunkTime = NewTime; + ReturnValue = E_SUCCESS; + } + + break; + case END_FLASH_CHUNK_TIME: + ChankDataBlock_p = FindChunkDataBlock(SessionMeasurement_p->ChunkMeasurement_p, ChunkID); + + if (ChankDataBlock_p != NULL) { + ChankDataBlock_p->EndFlashChunkTime = NewTime; + ReturnValue = E_SUCCESS; + } + + break; + case START_COMMAND_TIME: + Measurement_p->StartCommandTime = NewTime; + ReturnValue = E_SUCCESS; + break; + case END_COMMAND_TIME: + Measurement_p->EndCommandTime = NewTime; + ReturnValue = E_SUCCESS; + break; + default: + //… + break; + } + + return ReturnValue; +} + +/* + * + */ +ErrorCode_e Do_Measurement_CompleteResults(Measurement_t *Measurement_p) +{ + ErrorCode_e ReturnValue = E_FAILED_TO_FIND_CHUNK_DATA_BLOCK; + //SessionMeasurement_t * TmpSessData_p = NULL; + //uint8* Data_p = NULL; + uint32 Size = 0; + + switch (Measurement_p->Type) { + case FLASH_VIA_BULK_TRANSFER: + Size = CalculateSizeOfResults(Measurement_p->MeasurementData_p->SessionMeasurement_p, Measurement_p->Type, (uint32 *)&Measurement_p->MeasurementData_p->SessionNr); + + if (Size != 0) { + Size += 2 * sizeof(uint32); + BUFFER_FREE(Measurement_p->Result_p); + + Measurement_p->Result_p = (uint8 *)malloc(Size); + // ASSERT(NULL != Measurement_p->Result_p); + Measurement_p->ResultLength = Size; + + /* get result from the list of the session data blocks */ + ReturnValue = CompleteBulkFlashResults(Measurement_p); + } else { + Measurement_p->ResultLength = Size; + BUFFER_FREE(Measurement_p->Result_p); + + Measurement_p->Result_p = NULL; + ReturnValue = E_SUCCESS; + } + + break; + default: + //... + break; + } + + return ReturnValue; +} + +/******************************************************************************* + * Definition of internal functions + ******************************************************************************/ +/* + * This function create Timer callback. + * + * @param [in] Data_p Pointer to data. + * @param [in] Timer_p Pointer to timer. + * @param [in] Param_p Pointer to parameter. + * + */ +void TimerMeasurmentHandler(void *Data_p, void *Timer_p, void *Param_p) +{ + ASSERT(FALSE); +} + +/* + * This function search the requested chunk data block in the list of the chunk + * data blocks. + * + * @param [in] Measurement_p Pointer to the main measurement data block. + * @param [in] ChunkID Chunk ID for requested chunk data block. + * + * @retval pointer Pointer to the requested chunk data block. + * @retval NULL If the list of the chunk data blocks is empty. + */ +static ChunkMeasurement_t *FindChunkDataBlock(ChunkMeasurement_t *Measurement_p, uint32 ChunkID) +{ + ChunkMeasurement_t *TmpData_p = Measurement_p; + + if (TmpData_p != NULL) { + while ((TmpData_p->NextDataBlock_p != NULL) && (TmpData_p->ChunkId != ChunkID)) { + TmpData_p = TmpData_p->NextDataBlock_p; + } + } + + return TmpData_p; +} + +/* + * Get last chunk data block from the list of the chunk data blocks. + * + * @param [in] ChunkMeasurement_p Pointer to the main measurement data block. + * + * @retval pointer Pointer to the last chunk data block. + * @retval NULL If the list of the chunk data blocks is empty. + */ +static ChunkMeasurement_t *GetLastChunkDataBlock(ChunkMeasurement_t *ChunkMeasurement_p) +{ + ChunkMeasurement_t *TmpData_p = ChunkMeasurement_p; + + if (TmpData_p != NULL) { + while (TmpData_p->NextDataBlock_p != NULL) { + TmpData_p = TmpData_p->NextDataBlock_p; + } + } + + return TmpData_p; +} + +/* + * Get last session data block from the list of the chunk data blocks. + * + * @param [in] ChunkMeasurement_p Pointer to the main measurement data block. + * + * @retval pointer Pointer to the last chunk data block. + * @retval NULL If the list of the chunk data blocks is empty. + */ +static SessionMeasurement_t *GetLastSessionDataBlock(SessionMeasurement_t *SessionMeasurement_p) +{ + SessionMeasurement_t *TmpData_p = SessionMeasurement_p; + + if (TmpData_p != NULL) { + while (TmpData_p->NextDataBlock_p != NULL) { + TmpData_p = TmpData_p->NextDataBlock_p; + } + } + + return TmpData_p; +} + + +static ErrorCode_e CompleteBulkFlashResults(Measurement_t *Measurement_p) +{ + ErrorCode_e ReturnValue = E_SUCCESS; + SessionMeasurement_t *TmpSessData_p = Measurement_p->MeasurementData_p->SessionMeasurement_p; + ChunkMeasurement_t *TmpChunkData_p = NULL; + uint8 *Data_p = Measurement_p->Result_p; + + if (TmpSessData_p != NULL) { + memcpy(Data_p , (uint8 *)&Measurement_p->Type , sizeof(uint32)); + memcpy(Data_p + sizeof(uint32), (uint8 *)&Measurement_p->MeasurementData_p->SessionNr, sizeof(uint32)); + Data_p += 2 * sizeof(uint32); + //Measurement_p->ResultLength ++; + //SessionDataSerialize(&Data_p, TmpSessData_p, &Measurement_p->ResultLength); + TmpChunkData_p = TmpSessData_p->ChunkMeasurement_p; + + //while(TmpSessData_p->NextDataBlock_p != NULL) + while (TmpSessData_p != NULL) { + SessionDataSerialize(&Data_p, TmpSessData_p, &Measurement_p->ResultLength); + TmpChunkData_p = TmpSessData_p->ChunkMeasurement_p; + + if (TmpChunkData_p != NULL) { + ChunkDataSerialize(&Data_p, TmpChunkData_p, &Measurement_p->ResultLength); + + while (TmpChunkData_p->NextDataBlock_p != NULL) { + TmpChunkData_p = TmpChunkData_p->NextDataBlock_p; + ChunkDataSerialize(&Data_p, TmpChunkData_p, &Measurement_p->ResultLength); + } + } + + TmpSessData_p = TmpSessData_p->NextDataBlock_p; + } + } + + return ReturnValue; +} + + +static void SessionDataSerialize(uint8 **Data_pp, SessionMeasurement_t *SessData_p, uint32 *Length_p) +{ + put_uint32_le((void **)Data_pp, SessData_p->SessionId); + *Length_p++; + put_uint32_le((void **)Data_pp, SessData_p->OpenSessionTime); + *Length_p++; + put_uint32_le((void **)Data_pp, SessData_p->CloseSessionTime); + *Length_p++; + put_uint32_le((void **)Data_pp, SessData_p->ChunkNr); + *Length_p++; +} + + +static void ChunkDataSerialize(uint8 **Data_pp, ChunkMeasurement_t *ChunkData_p, uint32 *Length_p) +{ + put_uint32_le((void **)Data_pp, ChunkData_p->ChunkId); + *Length_p++; + put_uint32_le((void **)Data_pp, ChunkData_p->ReceivedChunkTime); + *Length_p++; + put_uint32_le((void **)Data_pp, ChunkData_p->StartFlashChunkTime); + *Length_p++; + put_uint32_le((void **)Data_pp, ChunkData_p->EndFlashChunkTime); + *Length_p++; +} + +/* + * Calculate size of the results. + * + * @param [in] DataMeasurement_p Pointer to the main measurement data block. + * @param [in] Type Type of measurement data block. + * + * @retval Size Size of the results. + * @retval 0 If the list of the chunk data blocks is empty. + */ +static uint32 CalculateSizeOfResults(SessionMeasurement_t *DataMeasurement_p, uint32 Type, uint32 *SessionNr_p) +{ + SessionMeasurement_t *TmpData_p = DataMeasurement_p; + uint32 Size = 0; + + switch (Type) { + case FLASH_VIA_BULK_TRANSFER: + + if (TmpData_p != NULL) { + *SessionNr_p = 0; + + //(SessionMeasurement_t*)TmpData_p = ((SessionMeasurement_t*)TmpData_p)->NextDataBlock_p; + //while(((SessionMeasurement_t*)TmpData_p)->NextDataBlock_p != NULL) + while (TmpData_p != NULL) { + Size = Size + (((SessionMeasurement_t *)TmpData_p)->ChunkNr * 4 * sizeof(uint32)); + Size += (4 * sizeof(uint32)); + //(SessionMeasurement_t*)TmpData_p = ((SessionMeasurement_t*)TmpData_p)->NextDataBlock_p; + TmpData_p = (SessionMeasurement_t *)TmpData_p->NextDataBlock_p; + (*SessionNr_p)++; + } + } + + break; + default: + Size = 0; + break; + + } + + return Size; +} + +/** @} */ |