/* -----------------------------------------------------------------------------------------------------------*/ 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; }
/* -----------------------------------------------------------------------------------------------------------*/ 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 ); }
/* -----------------------------------------------------------------------------------------------------------*/ 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; }