Skip to content
Snippets Groups Projects
EventActionService.cpp 7.24 KiB
#include "Services/EventActionService.hpp"
#include "Message.hpp"
#include "MessageParser.hpp"

/**
 * @todo: Should a check be added for index to not exceed the size of eventActionDefinitionArray
 * ? Also check if there is needed a uint16_t (in case of changing the size of
 * eventActionDefinitionArray
 */
void EventActionService::addEventActionDefinitions(Message message) {
	// TC[19,1]

	if (message.messageType == 1 && message.packetType == Message::TC && message.serviceType ==
																						19) {
		char x[64];
		uint16_t N = message.readUint16();
		uint16_t index = 0;
		uint8_t flag = 0; // used as boolean 0 is false, 1 is true
		for (uint16_t i = 0; i < N; i++) {
			while (eventActionDefinitionArray[index].empty == 0) {
				if (index == 255) { // 255 should be changed depending on size of the array
					flag = 1;
					break;
				}
				std::cout << "index: " << index << " empty: " << (unsigned)
				eventActionDefinitionArray[index].empty << " \n";
				index++;
			}


			if (flag == 0) {
				char data[128];
				std::cout << "Inside the flag == 0 " << "index: " << index << " empty: " <<
				(unsigned)
					eventActionDefinitionArray[index].empty << " \n";
				eventActionDefinitionArray[index].empty = 0;
				eventActionDefinitionArray[index].applicationId = message.readEnum16();
				eventActionDefinitionArray[index].eventDefinitionID = message.readEnum16();
				if (index == 0){
					message.readString(data, 3); // ECSS_MAX_STRING_SIZE??
				} else {
					message.readString(data, 3); // ECSS_MAX_STRING_SIZE??
				}
				eventActionDefinitionArray[index].request = String<64>(data);
				std::cout << "char data: " << data << " String<64>(data): " << String<64>(data)
				    .data() << " \n";
				std::cout << "String: " << eventActionDefinitionArray[index].request.data() << " \n";
				index++;

			}
		}

	}
	//std::cout << eventActionDefinitionArray[0].empty;

}

void EventActionService::deleteEventActionDefinitions(Message message) {
	// TC[19,2]
	if (message.messageType == 2 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		uint16_t N = message.readUint16();
		uint8_t index = 0;
		uint8_t flag = 0; // used as boolean 0 is false, 1 is true
		for (uint16_t i = 0; i < N; i++) {
			uint16_t applicationID = message.readEnum16();
			uint16_t eventDefinitionID = message.readEnum16();
			while (eventActionDefinitionArray[index].applicationId != applicationID ||
			       eventActionDefinitionArray[index].eventDefinitionID != eventDefinitionID) {
				if (index == 255) { // 255 should be changed depending on size of the array
					flag = 1;
					break;
				}
				index++;
			}
			if (flag == 0) { // Found
				eventActionDefinitionArray[index].empty = 1;
				eventActionDefinitionArray[index].eventDefinitionID = 65535;
				eventActionDefinitionArray[index].request = "";
				eventActionDefinitionArray[index].applicationId = 0;
			}
			index = 0;
		}

	}
}

void EventActionService::deleteAllEventActionDefinitions(Message message) {
	// TC[19,3]
	if (message.messageType == 3 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		for (uint16_t index = 0; index < 256; index++) {
			if (eventActionDefinitionArray[index].empty == 0) {
				eventActionDefinitionArray[index].empty = 1;
				eventActionDefinitionArray[index].eventDefinitionID = 65535;
				eventActionDefinitionArray[index].request = "";
				eventActionDefinitionArray[index].applicationId = 0;
			}
		}
	}
}

void EventActionService::enableEventActionDefinitions(Message message) {
	// TC[19,4]
	if (message.messageType == 4 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		uint16_t N = message.readUint16();
		uint8_t index = 0;
		uint8_t flag = 0; // used as boolean 0 is false, 1 is true
		for (uint16_t i = 0; i < N; i++) {
			uint16_t applicationID = message.readEnum16();
			uint16_t eventDefinitionID = message.readEnum16();
			while (eventActionDefinitionArray[index].applicationId != applicationID ||
			       eventActionDefinitionArray[index].eventDefinitionID != eventDefinitionID) {
				if (index == 255) { // 255 should be changed depending on size of the array
					flag = 1;
					break;
				}
				index++;
			}
			if (flag == 0) { // Found
				stateOfEventAction[index] = 1;
			}
			index = 0;
		}

	}
}

void EventActionService::disableEventActionDefinitions(Message message) {
	// TC[19,5]
	if (message.messageType == 5 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		uint16_t N = message.readUint16();
		uint8_t index = 0;
		uint8_t flag = 0; // used as boolean 0 is false, 1 is true
		for (uint16_t i = 0; i < N; i++) {
			uint16_t applicationID = message.readEnum16();
			uint16_t eventDefinitionID = message.readEnum16();
			while (eventActionDefinitionArray[index].applicationId != applicationID ||
			       eventActionDefinitionArray[index].eventDefinitionID != eventDefinitionID) {
				if (index == 255) { // 255 should be changed depending on size of the array
					flag = 1;
					break;
				}
				index++;
			}
			if (flag == 0) { // Found
				stateOfEventAction[index] = 0;
			}
			index = 0;
		}
	}
}

void EventActionService::requestEventActionDefinitionStatus(Message message) {
	// TC[19,6]
	if (message.messageType == 6 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		eventActionStatusReport();
	}
}

void EventActionService::eventActionStatusReport() {
	// TM[19,7]
	Message report = createTM(7);
	for (uint16_t i = 0; i < 256; i++) {
		if (eventActionDefinitionArray[i].empty == 0) {
			report.appendEnum16(eventActionDefinitionArray[i].applicationId);
			report.appendEnum16(eventActionDefinitionArray[i].eventDefinitionID);
			report.appendUint8(stateOfEventAction[i]);
		}
	}
	storeMessage(report);
}

void EventActionService::enableEventActionFunction(Message message) {
	// TC[19,8]
	if (message.messageType == 8 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		setEventActionFunctionStatus(EventActionFunctionStatus::enabledFunction);
	}
}

void EventActionService::disableEventActionFunction(Message message) {
	// TC[19,9]
	if (message.messageType == 9 && message.packetType == Message::TC && message.serviceType
	                                                                     == 19) {
		setEventActionFunctionStatus(EventActionFunctionStatus::disabledFunction);
	}
}

// Should I use the name execute here instead of executeAction?
void EventActionService::executeAction(uint16_t eventID) {
	// Custom function
	if (eventActionFunctionStatus == enabledFunction) {
		uint16_t i = 0;
		while (i < 256) {
			if (eventActionDefinitionArray[i].empty == 0) {
				if (eventActionDefinitionArray[i].eventDefinitionID == eventID) {
					break;
				}
			}
			i++;
		}
		if (i != 256) { // If i == 256 that means that no matching eventId was found
			MessageParser messageParser;
			Message message = messageParser.parseRequestTC(eventActionDefinitionArray[i].request);
			messageParser.execute(message);
		}
	}
}