/**
 * @file tst_sm_time_kinetis.c
 * @author NXP Semiconductors
 * @version 1.0
 * @par License
 *
 * Copyright 2017,2018 NXP
 * SPDX-License-Identifier: Apache-2.0
 *
 * @par Description
 * Utility functions for measurement of test execution time
 *
 */

#include "tst_sm_time.h"
#include <stdio.h>

extern volatile uint32_t gtimer_kinetis_msticks; // counter for 1ms SysTicks

long getMeasurement(
    axTimeMeasurement_t *mPair)
{
    if (mPair->tEnd >= mPair->tStart)
        return mPair->tEnd - mPair->tStart;
    else
        return 0;
}

void initMeasurement(
    axTimeMeasurement_t *mPair)
{
    mPair->tEnd = mPair->tStart = gtimer_kinetis_msticks;
}

void concludeMeasurement(
    axTimeMeasurement_t *mPair)
{
    mPair->tEnd = gtimer_kinetis_msticks;
}


void axSummarizeMeasurement(
    void *fHandle_NotUsed, char *szMessage, long *msArray, int nMeasurement, int reportMode)
{
    int i;
    long averaged = 0;
    long minValue = 0;
    long maxValue = 0;
    //int fEchoStdout = 0;
    //int fReportVerbose = 0;
    //int nOut;

    //fEchoStdout = ((reportMode & AX_MEASURE_ECHO_MASK) == AX_MEASURE_ECHO_STDOUT);
    //fReportVerbose = ((reportMode & AX_MEASURE_REPORT_MASK) == AX_MEASURE_REPORT_VERBOSE);

    if (nMeasurement > 0)
    {
        minValue = msArray[0];
        maxValue = msArray[0];
    }
    else
    {
        printf("%s: No valid amount of measurements (%d)\n", szMessage, nMeasurement);
        return;
    }

    for (i=0; i<nMeasurement; i++)
    {
        //printf("%s: %ld ms\n", szMessage, msArray[i]);
        averaged += msArray[i];
        minValue = (msArray[i] < minValue) ? msArray[i] : minValue;
        maxValue = (msArray[i] > maxValue) ? msArray[i] : maxValue;
    }
    averaged /= nMeasurement;

    printf("Exec Time: %s:\n\tAverage (%d measurements): %ld ms\n", szMessage, nMeasurement, averaged);
    printf("\tMinimum: %ld ms\n", minValue);
    printf("\tMaximum: %ld ms\n", maxValue);
    return;
}