/*******************************************************************************
 *   Copyright (c) 2019 Dortmund University of Applied Sciences and Arts and others.
 *  
 *   This program and the accompanying materials are made
 *   available under the terms of the Eclipse Public License 2.0
 *   which is available at https://www.eclipse.org/legal/epl-2.0/
 *  
 *   SPDX-License-Identifier: EPL-2.0
 *  
 *   Contributors:
 *        Dortmund University of Applied Sciences and Arts - initial API and implementation
 *******************************************************************************/
#include "AmaltheaConverter.h"

#include "FreeRTOS.h"
#include "task.h"
#include <stdarg.h>
#include "debugFlags.h"




AmaltheaTask createAmaltheaTask(void *taskHandler,void *cInHandler,void *cOutHandler,unsigned int period,unsigned int deadline, unsigned int WCET){
	if (WCET >= period){
		AmaltheaTask retValNull = {0,0,NULL,0,0,0,NULL,NULL};
		return retValNull;
	}else{
		AmaltheaTask retVal = {0,0,taskHandler,WCET,deadline,period,cInHandler,cOutHandler};
		return retVal;
	}
}

unsigned int calculateStackSize(int labelBitCount, int labelCount){
	return ((labelBitCount*labelCount)/PLATFORM_WORD_LENGTH);
}

void createRTOSTask(AmaltheaTask* task, int priority, int argCount, ...){
	//cycle through the stack arguments and add the needed numbers to the stack
	int stack_size = 0;
	for (int i=3;i<=argCount+2;i+=2){
		stack_size = calculateStackSize(i,i+1);
	}
	//make sure the stack size is at least big enough to run the task.
	stack_size += configMINIMAL_STACK_SIZE;
	//create the RTOS task with the generalized form
	xTaskCreate(generalizedRTOSTask	,"Task"	,stack_size,	&(*task)	,priority,NULL);
}


#ifdef use_LET_COMM_SEMANTICS
void generalizedRTOSTask(AmaltheaTask task){
	TickType_t xLastWakeTime = xTaskGetTickCount();
	//task.cInHandler();
	for (;;){
		//execute cIn
		task.cInHandler();
		task.taskHandler();
		vTaskDelayUntil( &xLastWakeTime, task.period);
		task.cOutHandler();
	}
}
#else

void generalizedRTOSTask(AmaltheaTask task){
	TickType_t xLastWakeTime = xTaskGetTickCount();
	//task.cInHandler();
	for (;;){
		//execute cIn
		task.cInHandler();
		task.taskHandler();
		task.cOutHandler();
		vTaskDelayUntil( &xLastWakeTime, task.period);
	}
}

#endif











