Beispiel #1
0
/* -----------------------------------------------------------------------------------------------------------*/
void UART_E0_SendByte( char Byte )
{
	char temp;

	temp = SREG;
	cli();
	
	if ( Get_Bytes_in_FIFO ( TX_E0_fifo ) == 0 )
	{
		// Wenn Controller noch mit senden eines Byte beschäftig, ab in den Puffer
		if ( TX_E0_state == TX_sending )
		{			
			// Byte in Buffer schreiben
			Put_Byte_in_FIFO ( TX_E0_fifo, Byte );
			
			// Buffer Empty Interrupt freigeben, TX_complete sperren
			USART_TxdInterruptLevel_Set( &USARTE0 , USART_TXCINTLVL_OFF_gc );
			USART_DreInterruptLevel_Set( &USARTE0 , USART_DREINTLVL_HI_gc );
		}
		else
		{
			// Buffer Empty sperren, TX_complete freigeben
			USART_PutChar( &USARTE0, Byte );
			// Buffer Emty sperren, TX_complete freigeben
			USART_TxdInterruptLevel_Set( &USARTE0 , USART_TXCINTLVL_HI_gc );
			USART_DreInterruptLevel_Set( &USARTE0 , USART_DREINTLVL_OFF_gc );

			TX_E0_state = TX_sending;
		}
	}
	else
	{	
		// Wenn Puffer voll, warten bis wieder was rein paßt
		while ( 1 )
		{
			cli();
			
			if ( Get_Bytes_in_FIFO ( TX_E0_fifo ) < TX_Bufferlen ) break;
			
			SREG = temp;
		}

		// Byte in Buffer schreiben
		Put_Byte_in_FIFO ( TX_E0_fifo, Byte );
	}
	
	SREG = temp;
}
Beispiel #2
0
/* -----------------------------------------------------------------------------------------------------------*/
int UART_E0_GetBytesinTxBuffer( void )
{
	int BytesInBuffer=1;
	char temp;

	temp = SREG;
	cli();
	
	// Anzahl der Bytes holen
	BytesInBuffer = Get_Bytes_in_FIFO ( TX_E0_fifo );
	
	SREG = temp;
	
	return( BytesInBuffer );
}
Beispiel #3
0
/* -----------------------------------------------------------------------------------------------------------*/
char UART_E0_GetByte( void )
{
	char Byte=0;
	char temp;
	
	temp = SREG;
	cli();
	
	// check ob überhaupt noch Bytes im Puffer sind, und wenn ja, auslesen
	if ( Get_Bytes_in_FIFO ( RX_E0_fifo ) != 0 )
		Byte = Get_Byte_from_FIFO ( RX_E0_fifo );
	
	SREG = temp;
	
	return( Byte );
}
/*------------------------------------------------------------------------------------------------------------*/
void mp3client_stream( void )
{
	static unsigned int temp;
	char sreg_tmp;

	
	timer0_stop();
	
	// Wenn slowstart auf 0 steht Decoder nicht befüttern, sonst warten bis 7/8 voll
	if ( slowstart == 0 )
		VS10xx_flush_from_FIFO( MP3_FIFO );
	else
		if ( Get_Bytes_in_FIFO ( MP3_FIFO ) > ( mp3_buffer_size / 8 ) * 7 ) slowstart = 0;
	
	// Verbindung wirklich noch offen
	if( CheckSocketState( MP3_SOCKET ) == SOCKET_NOT_USE )
	{
		CloseTCPSocket( MP3_SOCKET );
		MP3_SOCKET = NO_SOCKET_USED;
	}
	else
	{
		sreg_tmp = SREG;
		sei();
		
		// Datenpuffer auffrischen mit neuen daten von TCP-Verbindung
		while ( GetBytesInSocketData( MP3_SOCKET ) >= MP3TCPtranslen && Get_FIFOrestsize ( MP3_FIFO ) > MP3TCPtranslen && metainfolen == 0 )
		{
			// Wenn die transferlänge zum nächsten Metaint kleiner als translen zwischen tcp und mp3 buffer ist, nur diese
			// kopieren damit danach der metaint eingelesen werden kann
			if ( metaint - ( metaintcounter%metaint ) < MP3TCPtranslen && metaint != 0)
			{
				LED_on(1);
				temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, metaint - ( metaintcounter%metaint ) );
				totalbytes = totalbytes + temp;
				metaintcounter = metaintcounter + temp;
				LED_off(1);
			}
			else
			{	
				LED_on(1);
				temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, MP3TCPtranslen );
				totalbytes = totalbytes + temp;
				metaintcounter = metaintcounter + temp;
				LED_off(1);
			}
			
			if ( metaintcounter%metaint == 0 && metaint != 0 )
			{
				// checkt und wartet ob mehr als 1 Byte im Puffer ist
				while ( GetBytesInSocketData( MP3_SOCKET ) <= 0 );
				// lese Byte und errechne die metalänge
				metainfolen = GetByteFromSocketData ( MP3_SOCKET ) * 16 ;
				
				break;
			}
		}

		SREG = sreg_tmp;
	}
	
	timer0_free();

}
/*------------------------------------------------------------------------------------------------------------*/
void mp3client_thread( void )
{
	#define bandwidthhis	16
	unsigned char i;
	static unsigned long totalbytesold[bandwidthhis],bandwidth;
	static unsigned char y;	
	static unsigned int temp;
	timer0_stop();
	
	STDOUT_Set_RS232 ();
	
	if ( MP3_SOCKET == NO_SOCKET_USED )
	{ 	
		// keine Verbindung offen? Trafficcounter zurücksetzen
		y=0;
		metaintcounter=0;
		slowstart = 1;
	}
	else
	{	
		// Verbindung wirklich noch offen
		if( CheckSocketState( MP3_SOCKET ) == SOCKET_NOT_USE )
		{
			CloseTCPSocket( MP3_SOCKET );
			MP3_SOCKET = NO_SOCKET_USED;
		}
		else
		{		
			// Wenn Puffer auf unter 1/8 gelaufen ist slowstart setzen 
			if ( Get_Bytes_in_FIFO ( MP3_FIFO ) < mp3_buffer_size / 8 ) slowstart = 1;			
		
/*			// Datenpuffer auffrischen mit neuen daten von TCP-Verbindung
			while ( GetBytesInSocketData( MP3_SOCKET ) >= MP3TCPtranslen && Get_FIFOrestsize ( MP3_FIFO ) > MP3TCPtranslen && metainfolen == 0 )
			{
				// Wenn die transferlänge zum nächsten Metaint kleiner als translen zwischen tcp und mp3 buffer ist, nur diese
				// kopieren damit danach der metaint eingelesen werden kann
				if ( metaint - ( metaintcounter%metaint ) < MP3TCPtranslen && metaint != 0)
				{
					LED_on(1);
					temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, metaint - ( metaintcounter%metaint ) );
					totalbytes = totalbytes + temp;
					metaintcounter = metaintcounter + temp;
					LED_off(1);
				}
				else
				{	
					LED_on(1);
					temp = GetSocketDataToFIFO ( MP3_SOCKET, MP3_FIFO, MP3TCPtranslen );
					totalbytes = totalbytes + temp;
					metaintcounter = metaintcounter + temp;
					LED_off(1);
				}
				
				if ( metaintcounter%metaint == 0 && metaint != 0 )
				{
					// checkt und wartet ob mehr als 1 Byte im Puffer ist
					while ( GetBytesInSocketData( MP3_SOCKET ) <= 0 );
					// lese Byte und errechne die metalänge
					metainfolen = GetByteFromSocketData ( MP3_SOCKET ) * 16 ;
					
					break;
				}
    		}
*/			
			// Wenn der metaintcounter auf einen metaint steht, den metaint lesen und ausgeben
			if ( metainfolen != 0 )
			{						
				mp3client_readmetainfo( MP3_SOCKET, metainfolen );
				metainfolen = 0;
			}

			// Counter schon bei 0, wenn ja stats updaten
			if ( CLOCK_GetCountdownTimer ( mp3timer ) == 0 )
			{			
				bandwidth = 0;	

				// traffic aufaddieren
				for ( i = 0 ; i < bandwidthhis ; i++)
					bandwidth = bandwidth + totalbytesold[ i ];	
	
				// bandwidth berechnen alle 0,5 sekunden
				bandwidth = ( bandwidth / bandwidthhis ) * 2;
				
				// stats sichern
				mp3clientupdate( bandwidth, GetBytesInSocketData( MP3_SOCKET ) , Get_Bytes_in_FIFO ( MP3_FIFO ), VS10xx_get_decodetime( ), verboselevel );		

				// wenn verboselevel gesetzt ausgeben
				if ( verboselevel != 0)
					printf_P( PSTR("\r%5d(TCP %4d)Bytes on FIFO, bandwidth:%3ldkbit/s(%2dkb/s)"), Get_Bytes_in_FIFO ( MP3_FIFO ), GetBytesInSocketData( MP3_SOCKET ), ( bandwidth * 8 ) / 1024, ( bandwidth * 8 ) / 8192 );	

				// zähler für bandwidth zurücksetzten
				if ( y < bandwidthhis )
				{
					totalbytesold[y] = totalbytes;
				}
				else
				{
					y = 0;
					totalbytesold[y] = totalbytes;
				}
				y++;
				totalbytes = 0;	

				// Counter neu starten 0,5 Sekunden
				CLOCK_SetCountdownTimer ( mp3timer, 47, MSECOUND );
			}
		}
	}
	
	timer0_free();
	return;
}