/*
 * sits-bridge3.c
 *
 * Thomas Weickert, weickert@teco.edu
 * 2003.02.06
 *
 *	TODO:	- better solution for UART_OUT_BUF_SIZE
 */

/* -------------------------------------------------------------------------
 * includes
 * ------------------------------------------------------------------------- */
#include <avr/io.h>

#if defined(__AVR_ATmega128__)
 #include <avr/iom128.h>
#else
 #error "Don't know how to make for non-avr128 platforms."
#endif


#include <avr/interrupt.h>
#include <avr/signal.h>

#include <smart-its.h>
#include <drivers.h>
#include <dispatcher.h>

#include <bt_stack.h>

// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------

#define UART_IN_BUF_SIZE 128	//like UART1_RX_BUFFER_SIZE
#define UART_OUT_BUF_SIZE MAX_L2CAP_DATA_LEN*2

#define BT_IN_BUF_SIZE 4
#define BT_OUT_BUF_SIZE 256

// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------

bt_addr_t local_bd_addr;
l2cap_data_buffer_elem_t bt_in_buf[BT_IN_BUF_SIZE];
u8 uart_in_buf[UART_IN_BUF_SIZE];
u8 uart_out_buf[UART_OUT_BUF_SIZE];

// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------

static u8 flag_rec = 0;
static u8 bt_out_buf[BT_OUT_BUF_SIZE];
static u8 deesc = 0;
static u16 mark = 0;

// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------

//like btn_system_init, but without btn_uart1_init
void btn_bridge_init( int argc, char *argv[])
{
	btn_init( 0, NULL );
	btn_disp_init();
	btn_led_init();

	// switch on bt module
	btn_bt_power_supply_on( TRUE );
	btn_bt_radio_on( TRUE );
	// hard-reset the module
	btn_bt_radio_reset_NOT( FALSE );
	btn_delay_ms(10);
	btn_bt_radio_reset_NOT( TRUE );
	btn_delay_ms(1000);

	btn_uart0_init();
	btn_timeout_init();
	btn_rtc_init();
	btn_power_init();
	// btn_srand( 1 );

	btn_bt_init( bt_in_buf, BT_IN_BUF_SIZE );
}

// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------

void bt_received_cb( call_data_t call_data, cb_data_t cb_data )
{
	//i: index im l2cap data buffer
	//j: index im uart_out_buffer
	int i,j;
	u8 idx,c;
	idx=(u8)call_data;

	uart_out_buf[0]=0;
	j=1;
	for(i=0;i<bt_in_buf[idx].payload_length;i++)
	{
		c=bt_in_buf[idx].data[i];

		if(c==0)
		{
			uart_out_buf[j]=219;
			j++;
			uart_out_buf[j]=1;
		}
		else if(c==192)
		{
			uart_out_buf[j]=219;
			j++;
			uart_out_buf[j]=193;
		}
		else if(c==219)
		{
			uart_out_buf[j]=219;
			j++;
			uart_out_buf[j]=220;
		}
		else uart_out_buf[j]=c;
		j++;
	}
	uart_out_buf[j]=192;
	j++;
	btn_bt_data_free(idx);

	btn_uart1_write(uart_out_buf,j);


	//DEBUG
	//printf("\n\rPacket:");
	//for(i=0;i<j;i++)
	//	printf("%x, ",uart_out_buf[i]);

}
// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------

void uart_received_cb( call_data_t call_data, cb_data_t cb_data )
{
	u8 count,i,j,tmp,error;

	count = btn_uart1_read( uart_in_buf, UART_IN_BUF_SIZE );
	if( count == 0 )
		return;

	for(i=0;i<count;i++)
	{
		tmp=uart_in_buf[i];

		if(tmp==192)
		{
			flag_rec=mark;
		}
		else
		{
			if(deesc)
			{
				deesc=0;
				bt_out_buf[mark]=tmp-1;
			}
			else
			{
				bt_out_buf[mark]=tmp;
			}
		}
		mark++;
		if(tmp==0)mark=0;
		if(tmp==219){mark--;deesc=1;}

		if(flag_rec)	//sende
		{
			for( j=0; j<MAX_NUM_CHAN; j++ )
			{
				if( chanTable[j].ptr != 255 )
				// 255 represents an unused channel
				{
					error=btn_bt_data_send( chanTable[j].local_cid, bt_out_buf, flag_rec );
				}
			}
			flag_rec=0;
			mark=0;
		}//senden
	}
}

// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------
int main( int argc, char *argv[] ) {

	unsigned char error;
	btn_bridge_init( argc, argv );
	btn_bt_init( bt_in_buf, BT_IN_BUF_SIZE );

	btn_bt_psm_add( 101 );
	btn_bt_psm_add( 103 );

	btn_bt_change_local_name( "Bridge, V3" , &error);


	btn_disp_ev_reg( UART1_RCV_EV, uart_received_cb, 0 );
	btn_uart1_init();
	btn_uart1_set_baud_rate(115200);

	btn_disp_ev_reg( BT_DATA_RCV_EV, bt_received_cb, BT_DATA_RCV_EV );

	btn_disp_run();

	return 0;
}
