#include "../../tasks/TaskFactory.h"
#include "../../returnvalues/HasReturnvaluesIF.h"

#include "PeriodicTask.h"
#include "FixedTimeslotTask.h"


TaskFactory* TaskFactory::factoryInstance = new TaskFactory();

TaskFactory::~TaskFactory() {
}

TaskFactory* TaskFactory::instance() {
	return TaskFactory::factoryInstance;
}

PeriodicTaskIF* TaskFactory::createPeriodicTask(TaskName name_,
		TaskPriority taskPriority_, TaskStackSize stackSize_,
		TaskPeriod period_,
		TaskDeadlineMissedFunction deadLineMissedFunction_) {
	return dynamic_cast<PeriodicTaskIF*>(new PeriodicTask(name_, taskPriority_,
			stackSize_, period_, deadLineMissedFunction_));
}

/**
 * Keep in Mind that you need to call before this vTaskStartScheduler()!
 */
FixedTimeslotTaskIF* TaskFactory::createFixedTimeslotTask(TaskName name_,
		TaskPriority taskPriority_, TaskStackSize stackSize_,
		TaskPeriod period_,
		TaskDeadlineMissedFunction deadLineMissedFunction_) {
	return dynamic_cast<FixedTimeslotTaskIF*>(new FixedTimeslotTask(name_,
			taskPriority_,stackSize_, period_, deadLineMissedFunction_));
}

ReturnValue_t TaskFactory::deleteTask(PeriodicTaskIF* task) {
	if (task == nullptr) {
		//delete self
		vTaskDelete(nullptr);
		return HasReturnvaluesIF::RETURN_OK;
	} else {
		//TODO not implemented
		return HasReturnvaluesIF::RETURN_FAILED;
	}
}

ReturnValue_t TaskFactory::delayTask(uint32_t delayMs) {
	vTaskDelay(pdMS_TO_TICKS(delayMs));
	return HasReturnvaluesIF::RETURN_OK;
}

TaskFactory::TaskFactory() {
}