#include "FsfwFactory.h"
#include <OBSWConfig.h>

#include <fsfw/devicehandlers/DeviceHandlerBase.h>
#include <fsfw/events/EventManager.h>
#include <fsfw/health/HealthTable.h>
#include <fsfw/tmtcservices/CommandingServiceBase.h>
#include <fsfw/tmtcservices/PusServiceBase.h>
#include <fsfw/internalerror/InternalErrorReporter.h>

#include <cstdint>

/**
 * This function builds all system objects required for using
 * the FSFW. It is recommended to build all other required objects
 * in a function with an identical prototype, call this function in it and
 * then pass the function to the object manager so it builds all system
 * objects on software startup.
 *
 * All system objects are registered in the internal object manager
 * automatically. The objects should be added to tasks at a later stage, using
 * their objects IDs.
 *
 * This function also sets static framework IDs.
 *
 * Framework should be created first before creating mission system objects.
 * @ingroup init
 */
void Factory::produceFsfwObjects(void) {
	setStaticFrameworkObjectIds();
	new EventManager(objects::EVENT_MANAGER);
	new HealthTable(objects::HEALTH_TABLE);
	new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
}

void Factory::setStaticFrameworkObjectIds() {
	PusServiceBase::PUS_DISTRIBUTOR = objects::NO_OBJECT;
	PusServiceBase::PACKET_DESTINATION = objects::NO_OBJECT;

	CommandingServiceBase::defaultPacketSource = objects::NO_OBJECT;
	CommandingServiceBase::defaultPacketDestination = objects::NO_OBJECT;

	DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
	DeviceHandlerBase::rawDataReceiverId = objects::PUS_SERVICE_2_DEVICE_ACCESS;

	DeviceHandlerFailureIsolation::powerConfirmationId = objects::NO_OBJECT;
}