/*
 * Copyright (c) 2017 FH Dortmund and others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Description:
 *    Timing class created for thread performance analysis.
 *
 * Authors:
 *    M. Ozcelikors,
 *    <mozcelikors@gmail.com>
 *
 * Contributors:
 *
 * Update History:
 *    23.03.2017 - initial revision
 *
 */

#include "timing.h"

timing::timing() {
	this->_TASK_ID = "None";
	this->_DEADLINE_MISS_PERCENTAGE = 0;
	this->_START_TIME = (clock_t) 0.0;
	this->_END_TIME = (clock_t) 0.0;
	this->_DEADLINE = 0.0;
	this->_PERIOD = 0.0;
	this->_EXECUTION_TIME=0.0;
	this->_TOTAL_CYCLES=0;
	this->_MISSED_CYCLES=0;
	this->_PREV_SLACK_TIME=0.0;
}

timing::~timing() {
	// TODO Auto-generated destructor stub
}

void timing::setDeadline(double deadline)
{
	this->_DEADLINE = deadline;
}

void timing::setPeriod(double period)
{
	this->_PERIOD  = period;
}

void timing::recordStartTime(void)
{
	this->_START_TIME = std::clock();
}

void timing::recordEndTime(void)
{
	this->_END_TIME = std::clock();
}

void timing::calculateExecutionTime(void)
{
	this->_EXECUTION_TIME = ( this->_END_TIME - this->_START_TIME ) / (double) CLOCKS_PER_SEC;
}

void timing::calculatePreviousSlackTime(void)
{
	this->_PREV_SLACK_TIME = ( this->_START_TIME - this->_END_TIME ) / (double) CLOCKS_PER_SEC;
}

void timing::calculateDeadlineMissPercentage(void)
{
	this->_DEADLINE_MISS_PERCENTAGE =  (int)   (this->_MISSED_CYCLES  / (double) this->_TOTAL_CYCLES)*100;
}

int timing::getTotalCycles(void)
{
	return this->_TOTAL_CYCLES;
}
int timing::getMissedCycles(void)
{
	return this->_MISSED_CYCLES;
}
double timing::getDeadline(void)
{
	return this->_DEADLINE;
}
double timing::getPeriod(void)
{
	return this->_PERIOD;
}
double timing::getStartTime(void)
{
	return this->_START_TIME / (double) CLOCKS_PER_SEC;
}
double timing::getEndTime(void)
{
	return this->_END_TIME / (double) CLOCKS_PER_SEC;
}
double timing::getPrevSlackTime(void)
{
	return this->_PREV_SLACK_TIME;
}
double timing::getExecutionTime(void)
{
	return this->_EXECUTION_TIME;
}
double timing::getDeadlineMissPercentage(void)
{
	return this->_DEADLINE_MISS_PERCENTAGE;
}
void timing::setTaskID(char * taskid)
{
	this->_TASK_ID = taskid;
}
char * timing::getTaskID(void)
{
	return this->_TASK_ID;
}
void timing::incrementTotalCycles(void)
{
	this->_TOTAL_CYCLES = this->_TOTAL_CYCLES + 1;
}
void timing::incrementMissedCycles(void)
{
	this->_MISSED_CYCLES = this->_MISSED_CYCLES + 1;
}
void timing::sleepToMatchPeriod(void)
{
	if (this->_EXECUTION_TIME > this->_DEADLINE)
	{
		this->_MISSED_CYCLES = this -> _MISSED_CYCLES + 1;
	}
	else
	{
		delayMicroseconds(getPeriod() * SECONDS_TO_MICROSECONDS);
	}
}
