/*****************************************************************************/
//			************* MASTER CARD CODE *************
/*****************************************************************************/

#define MP_START_BIT   		0XCF	/* Master Protocol Start				*/ 
#define SP_START_BIT   		0xCE	/* Slave  Protocol Start				*/ 
#define MP_END_BIT	        0xCD	/* Master Protocol End					*/ 
#define SP_END_BIT          0xCC	/* Slave  Protocol End					*/ 
#define ACKNOWLEDGE	        0xCA	/* Acknowledge From Slave Card			*/ 
#define DATA_ACK        	0xC8	/* Data Acknowledge						*/ 
#define MAX_TASKS			  96

unsigned char buf;			/* Data Received Buffer */ 
unsigned char end_of_comm;
unsigned char synch_flag;	/* Infinite Loops Breaking Countdown Variable, Decrememted In TISR */
unsigned char slave_card_id;

bit acknowledge;	/* Acknowledge To Master Flag */   
bit give_data_ack;	/* Data Acknowledge To Master Flag */
bit data_ack;		/* Data Acknowledge To Slave Flag */    
bit transmit_ready;	/* Transmitter Ready Flag */ 

void SerialISR_Master(void) interrupt 4 using 3
{	/* Data Reception */  
	if(RI)					
	{	/* If A Character Is Received */
		buf = SBUF; /* Store The Character Sent From Slave In Buffer */

		if((buf ==  ACKNOWLEDGE))
		{	/* If Data Received Is Acknowledge */
			acknowledge = 1;/* Set Acknowledge Received Flag */
		}
		else if(buf == DATA_ACK)/* If Data Received Is Data Acknowledge */
			data_ack = 1;/* Set Data Acknowledged Flag */

		else if((buf & 0XF0) == 0XA0)  
		{	/* Cross Check Whether The End Of Comm Byte Is Received From The Proper Slave Or Not */
			end_of_comm = 0XCC;   /* Set The End Of Comm Byte Received Flag */
		}
		else if(buf == SP_END_BIT)  
		{	/* If Data Received Is Slave Portocol End Byte */	
			/*
				Process The Received Data Operations
			*/
        }
		else if(buf == SP_START_BIT) 
		{	/* If Data Received Is Slave Protocol Start Byte */	
			/* 
				Prepare To Receive The Data Bytes From The Next Reception
			*/
		}
	    else
		{	/* If Data Bytes Are Being Received...*/
			/* 
				Load The Data Bytes Into The Buffers
			*/
		}	
		transmit_ready = 0;		/*	Block The Transmitter Ready Flag */
		TB8 = 0;				/*	Clear Bit 8 Of Comm */              
		SBUF = DATA_ACK;        /*	Send The Data Acknowledge to Slave */
		RI = 0;		/* Clear RI To Wait For Next Character */ 
		buf = 0;	/* Clear The Received Byte Storing Buffer */
	}
	/*Data Transmission*/
	else if(TI) 
	{	
		TB8 = 0;/* Clear Bit 8 For General Data Transmission */
		TI = 0;	
		transmit_ready = 1;	/* Release The Transmitter Ready Token After Transmission Completed */
	}
}

void getDataFromSlaves(void)
{
	slave_card_id++;
	if(end_of_comm == 0X55)						
	{	// If Comm Port Is Free...
		end_of_comm = 0XAA;//MAKE IT BUSY
		/* Address A Slave By Sending (slave_card_id | 0x20) As A General Command.
		   If The Addressed Slave Responded For Re-Transmitting Its Data Bytes...*/
		synch_flag = 75;	/* Load The Synchronisation Flag Count, Which Counts Down In TISR Every 20 ms */
		while( (end_of_comm == 0XAA) && synch_flag){;}
		/* Wait Until The Slave Transmits The Total Pending Data Or Synch Count Comes To Zero thro Timer 0 ISR */
		if(end_of_comm == 0XAA)			
		{	/* If The Slave Card Lost The Communication,
			   store the Error Log and send reset signal to restart the system */
		}
		end_of_comm = 0x55;// Make Comm Port Free...
	}

}
void main(void)
{
	unsigned char i;
	/* Initialisations Go Here */
	while(1)
	{
		for(i=0; i<MAX_TASKS ; i++) 
		{	// ITERATIONS FOR ALL TASKS
			if(i%8 == 0)			  
			{	// FOR EVERY 8 SERVES
				getDataFromSlaves();
			}
		}
		/* Remaining Code Goes Here */
	}
}
