etisserant@391: #include "canfestival.h"
etisserant@391: 
etisserant@391: #include "Master.h"
etisserant@391: #include "Slave.h"
etisserant@391: #include "TestMasterSlave.h"
etisserant@391: 
etisserant@391: 
etisserant@391: static UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
etisserant@391: {
etisserant@391: 	eprintf("OnSlaveMap1Update:%d\n", SlaveMap1);
etisserant@391: 	return 0;
etisserant@391: }
etisserant@391: 
etisserant@391: s_BOARD SlaveBoard = {"0", "125K"};
etisserant@391: s_BOARD MasterBoard = {"1", "125K"};
etisserant@391: 
etisserant@391: /***************************  INIT  *****************************************/
etisserant@391: static void InitNodes(CO_Data* d, UNS32 id)
etisserant@391: {
etisserant@391: 	/****************************** INITIALISATION SLAVE *******************************/
etisserant@391: 	if(strcmp(SlaveBoard.baudrate, "none")) {
etisserant@391: 		setNodeId(&TestSlave_Data, 0x02);
etisserant@391: 
etisserant@391: 		setState(&TestSlave_Data, Initialisation);
etisserant@391: 	}
etisserant@391: 
etisserant@391: 	/****************************** INITIALISATION MASTER *******************************/
etisserant@391: 	if(strcmp(MasterBoard.baudrate, "none")){
etisserant@391:  		RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update);
etisserant@391: 		
etisserant@391: 		// Defining the node Id
etisserant@391: 		setNodeId(&TestMaster_Data, 0x01);
etisserant@391: 
etisserant@391: 		setState(&TestMaster_Data, Initialisation);
etisserant@391: 	}
etisserant@391: }
etisserant@391: 
etisserant@391: int TestMasterSlave_start (void)
etisserant@391: {
etisserant@391: 	if(strcmp(SlaveBoard.baudrate, "none")){
etisserant@391: 		
etisserant@391: 		TestSlave_Data.heartbeatError = TestSlave_heartbeatError;
etisserant@391: 		TestSlave_Data.initialisation = TestSlave_initialisation;
etisserant@391: 		TestSlave_Data.preOperational = TestSlave_preOperational;
etisserant@391: 		TestSlave_Data.operational = TestSlave_operational;
etisserant@391: 		TestSlave_Data.stopped = TestSlave_stopped;
etisserant@391: 		TestSlave_Data.post_sync = TestSlave_post_sync;
etisserant@391: 		TestSlave_Data.post_TPDO = TestSlave_post_TPDO;
etisserant@391: 		TestSlave_Data.storeODSubIndex = TestSlave_storeODSubIndex;
etisserant@391: 		TestSlave_Data.post_emcy = TestSlave_post_emcy;
etisserant@391: 
etisserant@391: 		if(!canOpen(&SlaveBoard,&TestSlave_Data)){
etisserant@391: 			eprintf("Cannot open Slave Board (%s,%s)\n",SlaveBoard.busname, SlaveBoard.baudrate);
etisserant@391: 			return 1;
etisserant@391: 		}
etisserant@391: 	}
etisserant@391: 	if(strcmp(MasterBoard.baudrate, "none")){
etisserant@391: 		
etisserant@391: 		TestMaster_Data.heartbeatError = TestMaster_heartbeatError;
etisserant@391: 		TestMaster_Data.initialisation = TestMaster_initialisation;
etisserant@391: 		TestMaster_Data.preOperational = TestMaster_preOperational;
etisserant@391: 		TestMaster_Data.operational = TestMaster_operational;
etisserant@391: 		TestMaster_Data.stopped = TestMaster_stopped;
etisserant@391: 		TestMaster_Data.post_sync = TestMaster_post_sync;
etisserant@391: 		TestMaster_Data.post_TPDO = TestMaster_post_TPDO;
etisserant@391: 		TestMaster_Data.post_emcy = TestMaster_post_emcy;
etisserant@391: 		TestMaster_Data.post_SlaveBootup=TestMaster_post_SlaveBootup;
etisserant@391: 		
etisserant@391: 		if(!canOpen(&MasterBoard,&TestMaster_Data)){
etisserant@391: 			eprintf("Cannot open Master Board (%s,%s)\n",MasterBoard.busname, MasterBoard.baudrate);
etisserant@391: 			if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data);
etisserant@391: 			return 1;
etisserant@391: 		}
etisserant@391: 	}
etisserant@391: 
etisserant@391: 	// Start timer thread
etisserant@391: 	StartTimerLoop(&InitNodes);
etisserant@391: 
etisserant@391: 	return 0;
etisserant@391: }
etisserant@391: 
etisserant@391: void TestMasterSlave_stop (void)
etisserant@391: {
etisserant@391: 	eprintf("Finishing.\n");
etisserant@391: 	
etisserant@391: 	EnterMutex();
etisserant@391: 	masterSendNMTstateChange (&TestMaster_Data, 0x02, NMT_Reset_Node);
etisserant@391: 	LeaveMutex();
etisserant@391: 	
etisserant@391: 	// Stop master
etisserant@391: 	EnterMutex();
etisserant@391: 	setState(&TestMaster_Data, Stopped);
etisserant@391: 	LeaveMutex();
etisserant@391: 	
etisserant@391: 	// Stop timer thread
etisserant@391: 	StopTimerLoop();
etisserant@391: 	
etisserant@391: 	// Close CAN devices (and can threads)
etisserant@391: 	if(strcmp(SlaveBoard.baudrate, "none")) canClose(&TestSlave_Data);
etisserant@391: 	if(strcmp(MasterBoard.baudrate, "none")) canClose(&TestMaster_Data);
etisserant@391: 
etisserant@391: 	eprintf("End.\n");
etisserant@391: }