#include "ObjectFactory.h"
#include "OBSWConfig.h"
#include <objects/systemObjectList.h>
#include <tmtc/apid.h>
#include <tmtc/pusIds.h>

#include <fsfw/tmtcservices/CommandingServiceBase.h>
#include <fsfw/tmtcservices/PusServiceBase.h>

#include <mission/core/GenericFactory.h>
#include <mission/utility/TmFunnel.h>

#if OBSW_USE_TMTC_TCP_BRIDGE == 0
#include "fsfw/osal/common/UdpTcPollingTask.h"
#include "fsfw/osal/common/UdpTmTcBridge.h"
#else
#include "fsfw/osal/common/TcpTmTcBridge.h"
#include "fsfw/osal/common/TcpTmTcServer.h"
#endif

#include <fsfw/tmtcpacket/pus/tm.h>


#if OBSW_ADD_TEST_CODE == 1
#include <test/testtasks/TestTask.h>
#endif

void Factory::setStaticFrameworkObjectIds(){
	PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR;
	PusServiceBase::packetDestination = objects::TM_FUNNEL;

	CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR;
	CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL;

	TmFunnel::downlinkDestination = objects::TMTC_BRIDGE;
	// No storage object for now.
	TmFunnel::storageDestination = objects::NO_OBJECT;

	VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION;
	TmPacketBase::timeStamperId = objects::TIME_STAMPER;
}

void ObjectFactory::produce(void* args){
	Factory::setStaticFrameworkObjectIds();
	ObjectFactory::produceGenericObjects();

    new TestTask(objects::TEST_TASK);
}