/*
 * 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:
 *    Hono interaction task for Rover
 *
 * Authors:
 *    M. Ozcelikors,            R.Hottger
 *    <mozcelikors@gmail.com>   <robert.hoettger@fh-dortmund.de>
 *
 */

#include "hono_interaction_task.h"

#include <wiringPi.h>
#include <ctime>
#include <unistd.h>
#include "../timing/timing.h"
#include "../api/basic_psys_rover.h"
#include "../interfaces.h"
#include <pthread.h>
#include "../RaspberryTest.h"
#include <softPwm.h>

#include "../pthread_monitoring/collect_thread_name.h"

#include "../hono_interaction/hono_interaction.h"

void *Hono_Interaction_Task(void * arg)
{
	timing hono_task_tmr;
	hono_task_tmr.setTaskID("HonoTsk");
	hono_task_tmr.setDeadline(1);
	hono_task_tmr.setPeriod(1);

	CollectThreadName("Hono_Interaction_Task");

	while (1)
	{
		hono_task_tmr.recordStartTime();
		hono_task_tmr.calculatePreviousSlackTime();

		//Task content starts here -----------------------------------------------

		// Send everything to Hono every second in this task using the following functions
		// TODO: This can be done with one curl command, probably a better way.
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverFront","value", distance_sr04_front_shared);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverFrontLeft","value",infrared_shared[3]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverFrontRight","value", infrared_shared[2]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverRear","value", distance_sr04_back_shared);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverRearLeft","value", infrared_shared[1]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverRearRight","value", infrared_shared[0]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverBearing","value", bearing_shared);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverUtilCpu1","value", cpu_util_shared[0]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverUtilCpu2","value", cpu_util_shared[1]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverUtilCpu3","value", cpu_util_shared[2]);
		sendTelemetryDataToHonoInstance("idial.institute",8080,"DEFAULT_TENANT", "roverUtilCpu4","value", cpu_util_shared[3]);

		//Task content ends here -------------------------------------------------

		hono_task_tmr.recordEndTime();
		hono_task_tmr.calculateExecutionTime();
		hono_task_tmr.calculateDeadlineMissPercentage();
		hono_task_tmr.incrementTotalCycles();
		pthread_mutex_lock(&hono_task_ti_l);
			hono_task_ti.deadline = hono_task_tmr.getDeadline();
			hono_task_ti.deadline_miss_percentage = hono_task_tmr.getDeadlineMissPercentage();
			hono_task_ti.execution_time = hono_task_tmr.getExecutionTime();
			hono_task_ti.period = hono_task_tmr.getPeriod();
			hono_task_ti.prev_slack_time = hono_task_tmr.getPrevSlackTime();
			hono_task_ti.task_id = hono_task_tmr.getTaskID();
			hono_task_ti.start_time = hono_task_tmr.getStartTime();
			hono_task_ti.end_time = hono_task_tmr.getEndTime();
		pthread_mutex_unlock(&hono_task_ti_l);
		hono_task_tmr.sleepToMatchPeriod();
	}

	/* the function must return something - NULL will do */
	return NULL;
}

