//#include <rtl.h>
#include <time.h>
#include <pthread.h>
#include <rtl_sched.h>
#include <rtl_printf.h>
//#include <asm/io.h>
#include "can.h"
#include "isarw.h"

int WR_CAN_BOX(int *ID,char DLC,char *DATA,char SHARED)
{
int box_counter,wr_add,i;
char target_control_reg,box_control_reg,can_id_low,can_id_high,BUFF_OK;

box_counter=0;
BUFF_OK=0;

while(!BUFF_OK)
{

if ( (isa_readb((0xD41B8)+(box_counter*11)) & 0x80) == 0)//if the buffer is empty
	{
	can_id_low= *ID;
	can_id_high = ((*ID)& 0x0700) >> 8;
	wr_add = (0xD41B8 + (box_counter * 11));
	//write de msg id
	isa_writeb(can_id_low,wr_add+1);
	isa_writeb(can_id_high,wr_add+2);
	//write de msg data
	for(i=0;i<DLC;i++)
	{
		isa_writeb(DATA[i],wr_add+3+i);
		rtl_printf("escribo dato  \n");
	}
	box_control_reg = 0x80+(DLC);
	isa_writeb(box_control_reg,wr_add);
	rtl_printf("toy escribiendo en el box nš: %d \n",box_counter);
	target_control_reg=isa_readb(TX_MODE_TARGET)+0x80;//flag tx msg for target
	isa_writeb(target_control_reg,TX_MODE_TARGET);
	rtl_delay(20000);//20 usec pc waiting
	BUFF_OK=1;

	}

else if (box_counter < 35)
	{
	box_counter++;
	}
else if (box_counter >= 35)
	{
	BUFF_OK=1;//buffer is full
	rtl_printf("no free box \n");
	}


}//end if

return 0;

}//end function
	


int RD_CAN_BOX(int *ID,char *DATA)
{
int box_counter, wr_add,i;
char box_control_reg,BUFF_OK;

box_counter=0;
BUFF_OK=0;


while(!BUFF_OK)
	{
	box_control_reg=isa_readb(0xD4000+(box_counter*11));//read first buffer control word

	if( (isa_readb(0xD4000+(box_counter*11)) & 0x80) > 0)//if the buffer is empty
		{
		wr_add=(0xD4000+(box_counter*11));
		*(ID-1)=box_control_reg & 0x07; //DLC
		//READ THE MSG ID
		*ID=isa_readb(wr_add+1);
		*(ID + 1)=isa_readb(wr_add + 2);
		
		//obtain the msg data
		for(i=0;i<(box_control_reg & 0x07);i++)
			*(DATA + i)=isa_readb(wr_add + 3 +i);

		//write the box word control
		box_control_reg=0;//buffer empty
		isa_writeb(box_control_reg,wr_add);
		BUFF_OK=1;
		}//END IF

	else if (box_counter < 40)
		box_counter++;
	else
		BUFF_OK=1;//buffer is empty
	}//end while

return 0;

}


void RAM_CLEAN(void)
{
	int i;
	for(i=0xD4000;i<0xD43F0;i++)
		isa_writeb(0,i);
}
