#include "Service9TimeManagement.h"
#include "servicepackets/Service9Packets.h"

#include "../timemanager/CCSDSTime.h"
#include "../events/EventManagerIF.h"
#include "../serviceinterface/ServiceInterfaceStream.h"


Service9TimeManagement::Service9TimeManagement(object_id_t objectId,
		uint16_t apid, uint8_t serviceId) :
	PusServiceBase(objectId, apid , serviceId) {
}

Service9TimeManagement::~Service9TimeManagement() {}

ReturnValue_t Service9TimeManagement::performService() {
	return RETURN_OK;
}

ReturnValue_t Service9TimeManagement::handleRequest(uint8_t subservice) {
	switch(subservice){
		case SUBSERVICE::SET_TIME:{
			return setTime();
		}
		default:
			return AcceptsTelecommandsIF::INVALID_SUBSERVICE;
		}
}

ReturnValue_t Service9TimeManagement::setTime() {
	Clock::TimeOfDay_t timeToSet;
	TimePacket timePacket(currentPacket.getApplicationData(),
			currentPacket.getApplicationDataSize());
	ReturnValue_t result = CCSDSTime::convertFromCcsds(&timeToSet,
			timePacket.getTime(), timePacket.getTimeSize());
	if(result != RETURN_OK) {
		triggerEvent(CLOCK_SET_FAILURE, result, 0);
		return result;
	}

	uint32_t formerUptime;
	Clock::getUptime(&formerUptime);
	result = Clock::setClock(&timeToSet);

	if(result == RETURN_OK) {
		uint32_t newUptime;
		Clock::getUptime(&newUptime);
		triggerEvent(CLOCK_SET,newUptime,formerUptime);
		return RETURN_OK;
	}
	else {
		triggerEvent(CLOCK_SET_FAILURE, result, 0);
		return RETURN_FAILED;
	}
}