Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
parallelcpld.cpp
- Committer:
- klauss
- Date:
- 2015-11-24
- Revision:
- 137:32dd35a6dbc9
- Parent:
- 132:05cd37f7e007
File content as of revision 137:32dd35a6dbc9:
#include "parallelcpld.h" DigitalOut data0(p30); //LSB DigitalOut data1(p31); DigitalOut data2(p32); DigitalOut data3(p33); DigitalOut data4(p34); DigitalOut data5(p37); DigitalOut data6(p38); DigitalOut data7(p39); //MSB DigitalOut DataReady(p11); ///<IO 27 DigitalOut hw_extern_wdt( p23 ); uint8_t cb_tx_buffer [ CB_BUFFER_SIZE ]; uint8_t TXBuffer[ CB_BUFFER_SIZE ]; uint8_t tx_clear = 1; ring_buffer * rb = ring_buffer_init( NULL ); // Print a variable using parallel protocol void parallel_write( uint8_t data ){ data0 = BIT0&(data); data1 = BIT1&(data); data2 = BIT2&(data); data3 = BIT3&(data); data4 = BIT4&(data); data5 = BIT5&(data); data6 = BIT6&(data); data7 = BIT7&(data); } // Needs: function parallel_write/ Global variables: TXBuffer, tx_clear / Configuration extern interrupt void send2callboxes( uint8_t * buffer ) { if ( drop_entendi_pkg and ( buffer[ TYPE_PLACE ] == INVITE ) ) { vz_debug ( "Droped entendi pkg" ); return; } if( tx_clear == 1 ) { tx_clear = 0; xmemcpy ( TXBuffer, buffer, CB_BUFFER_SIZE ); // Send the first position of TXBuffer first parallel_write ( TXBuffer [ 0 ] ); DataReady = 1; cpld_pkg_tx_counter++; uint16_t ext = ( ( uint16_t )buffer[ 0 ] ) << 8 | buffer[ 1 ]; uint16_t port = ( ( uint16_t )buffer[ 2 ] ) << 8 | buffer[ 3 ]; uint8_t type = buffer [ TYPE_PLACE ]; if ( debug_fw ) { buffer[ 0 ] |= BIT7; fw_cbx_pkg ( ext, ( char *)buffer ); } if ( ( type not_eq AUDIO ) and not ( do_not_show_this_invite_pkg ) ) { xmemcpy ( cb_tx_buffer, buffer, CB_BUFFER_SIZE ); if ( debug_show_tx_cpld ) { char str [ 256 ]; strcpy ( str, "TX :: \n\r" ); for ( register uint16_t i = 0; i < 32; i++ ) { char tmp [ 8 ]; sprintf ( tmp, "%02x ", cb_tx_buffer [ i ] ); strcat ( str, tmp ); } strcat ( str, "\n\r " ); vz_printf ( "%s", str ); } if ( debug_cb_tx ) vz_printf ("H -> CBx :: ( %d, %d ) -- Type :: %d", ext, port, type ); if ( debug_sqn ) vz_printf ("H -> CBx :: ( %d, %d ) -- Type :: %d -- seq_num :: %u", ext, port, type, cb_tx_buffer [ SEQ_NUM_PLACE ] ); } do_not_show_this_invite_pkg = false; }else{ // Error if the transmission is still in use uint8_t ret = ring_buffer_add( rb, buffer ); delayed_pkg_to_cb++; if( ret == 0x01 ) if( dparallel ) vz_debug ("Error: Ring buffer fully charged"); if( ret == 0x00 ) if( dparallel ) vz_debug ("Success : package queued -- on queue %u", rb->size ); } } //***************************************************************************** // EXTERN IRQ Handler //***************************************************************************** void get2(){ static uint16_t c = 1; // Get Ready the new data DataReady = 0; tx_clear = 0; if ( c < 300 ){ // Write the next data to be send parallel_write ( TXBuffer[c] ) ; // Allow the data to be capture DataReady = 1; }else{ // Allow the next package to the transmitted tx_clear = 1; c = 0; } c++; } void tx_buffer_ring_buffer_handler( void ){ if( ( rb->size != 0x00 ) && ( tx_clear == 1 ) ){ uint8_t * _rb_next = ring_buffer_get_next( rb ); if( dparallel ) vz_printf ( "Ring Buffer less one -- remain %u", rb->size ); send2callboxes( _rb_next ); } }