Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: main.cpp
- Revision:
- 89:0fe315117b00
- Parent:
- 87:679ee0d594a9
- Child:
- 91:c2a86b1f8aaa
--- a/main.cpp Tue Jan 06 16:39:09 2015 +0000 +++ b/main.cpp Wed Jan 07 21:48:53 2015 +0000 @@ -15,6 +15,8 @@ #include "configs.h" #include "sdram.h" +#define vz_LIM 8 + volatile u16_t lpc_low_level_input_counter = 0; int main(){ @@ -24,18 +26,21 @@ start_cpld(); - if( sdram_init() == 1 ) - { + if( sdram_init() == 1 ){ send_msg("******* Failed to initialize SDRAM *******"); return 1; - } - else - { + } else { send_msg("******* Success to initialize SDRAM *******"); } init_fsystem(); + { + char s[ 32 ]; + mbed_mac_address( s ); + send_msg( "::Mac::%02x:%02x:%02x:%02x:%02x:%02x:: ", s[0],s[1],s[2],s[3],s[4],s[5] ); + } + short int eth_status = __init_eth__(); if( eth_status ){ send_msg("******* Cannot connect to eth *******"); @@ -80,7 +85,11 @@ /* gerencia a distribuicao de timeslice para os call boxes */ Timeslice * ts = new Timeslice(); - if( ts == NULL ) memory_is_over = true; + if( ts == NULL ) + { + memory_is_over = true; + if( debug_memory ) debug_msg("TS allocation fail"); + } /* instancia o vetor de call boxes // calls */ if( v_cb == NULL ){ @@ -101,8 +110,17 @@ } } - if( v_cb == NULL ) memory_is_over = true; - if( v_call == NULL ) memory_is_over = true; + if( v_cb == NULL ) + { + memory_is_over = true; + if( debug_memory ) debug_msg("Call_Box vector allocation fail"); + } + + if( v_call == NULL ) + { + memory_is_over = true; + if( debug_memory ) debug_msg("Call vector allocation fail"); + } for( register uint16_t i = 0; i < __CB_BUFFER_SIZE__; i++ ){ cb_rx_buffer[ i ] = 0; @@ -121,13 +139,16 @@ init_aging(); + init_sync_refresh(); + //init_invite_pgk_retry_manager(); //void init_bye_pgk_retry_manager(); + static uint8_t count = 0; - short int bl_ret = init_bl_handler(); - if( dbl ) send_msg("Valor de retorno do bl_habdler = %d", bl_ret ); + //short int bl_ret = init_bl_handler(); + //if( dbl ) send_msg("Valor de retorno do bl_habdler = %d", bl_ret ); uint8_t max_registered_cbx = 0; @@ -135,39 +156,16 @@ uint16_t pkg_wdt = RX_CB_IDLE; uint16_t eth_wdt = ETH_CONNECT_TIMEOUT; - uint32_t uptime = 0; send_msg("Ready"); bool regystry_test = false; - static int next_value = 5010; static int nex_test_registry = next_value; - { - char s[ 32 ]; - mbed_mac_address( s ); - send_msg( "::Mac::%02x:%02x:%02x:%02x:%02x:%02x:: ", s[0],s[1],s[2],s[3],s[4],s[5] ); - } + uint8_t vz_lim = vz_LIM; -//#define NUM_SOCK 50 -//#define TEST_SERVER_IP "192.168.120.7" -//#define ETH_MSG_SIZE 1600 - - //UDPSocket sock[ NUM_SOCK ]; - //Endpoint server[ NUM_SOCK ]; - - /* - for( register int i = 0; i < NUM_SOCK; i++ ) - { - int ref = ( i + 10000 ); - server[ i ].set_address( TEST_SERVER_IP, ref ); - sock[ i ].set_blocking( false, 0 ); - int bind_ret = sock[ i ].bind( ref ); - send_msg("Sock %2d ( %d )%s", i, ref, ( bind_ret ) ? "Fail" : "Ok" ); - } - */ /*------------------------------------------ main loop ---------------------------------------------------------------*/ while( true ){ if( v_cb->size() > max_registered_cbx ) max_registered_cbx = v_cb->size(); @@ -200,8 +198,6 @@ wake_all = true; if( debug_wake == true ) send_msg( "Time to wake" ); } - - if( wake_all ) if( v_call->size() == 0 ) wake_all_up( v_cb, buffer, write_buffer ); } //FIXMEj colocar uma condicao aqui caso necessario pra nao comprometer ligacoes ... @@ -450,32 +446,71 @@ send_msg("Sizeof Timeslice :: %u", sizeof( Timeslice ) ); send_msg("Sizeof Watchdog :: %u", sizeof( Watchdog ) ); } + + static int wdt_count = 0; if( regystry_test == true ) { regystry_test = false; - if( type == __DO_NOTHING__ ) - { - //if( next_value < ( 5010 + __MAX_CB_IN_A_BRANCH__ - 2 ) ) - { - type = __REGISTRY__; - data = buffer; - ext = next_value; - port = next_value++; + Timer sel; + int tempo = 0; + sel.start(); + + fd_set fdSet; + FD_ZERO(&fdSet); + + for( register uint8_t i = 0; i < v_cb->size(); i++ ) { + Call_Box * cb = (Call_Box *)v_cb->get_element( i ); + FD_SET( cb->get_sip_socket_fd(), &fdSet); + + } + + struct timeval t; + t.tv_sec = 0; + t.tv_usec = 0; + int ret = lwip_select( FD_SETSIZE, &fdSet, NULL, NULL, &t ); + + //int ret = lwip_select( FD_SETSIZE, &fdSet, NULL, NULL, NULL ); + //send_msg("Ret:%d - Time::%d ", ret, sel.read_us() ); + if(ret > 0 ){ + for( register uint8_t i = 0; i < v_cb->size(); i++ ) { + Call_Box * cb = (Call_Box *)v_cb->get_element( i ); + int fd = cb->get_sip_socket_fd(); + if( FD_ISSET( fd, &fdSet ) ){ + //if( FD_ISSET( fd, &fdSet ) )send_msg( "ISSET %d - %d", cb->get_ext(), fd ); + int rcv = cb->sip_udp_drop_once(); + //if( rcv > 0 ) send_msg("Drop %d - %d", cb->get_ext(), rcv ); + } } - /* - else - { - if( nex_test_registry > ( 5010 + __MAX_CB_IN_A_BRANCH__ - 1 - 2 ) ) nex_test_registry = 5010; - type = __REGISTRY__; - data = buffer; - ext = nex_test_registry; - port = nex_test_registry++; + } + + tempo = sel.read_us(); + debug_msg("Time::%d", tempo ); + if( wdt_count++ > 5 || v_cb->size() < 66 ){ + wdt_count = 0; + + if( type == __DO_NOTHING__ ) + { + if( next_value < ( 5010 + __MAX_CB_IN_A_BRANCH__ - 2 ) ) + { + type = __REGISTRY__; + data = buffer; + ext = next_value; + port = next_value++; + } + else + { + if( nex_test_registry > ( 5010 + __MAX_CB_IN_A_BRANCH__ - 1 - 2 ) ) nex_test_registry = 5010; + type = __REGISTRY__; + data = buffer; + ext = nex_test_registry; + port = nex_test_registry++; + } } - */ } } + if( reset_cks == true ){ pkg_cksok = 0; pkg_ckserr = 0; @@ -571,14 +606,18 @@ if( debug_invite ) debug_msg("Request Invite received from Cbx %i", ext); Call_Box * cb = __find_CB__( v_cb, ext ); if( cb == NULL ){ + if( v_cb->size() < vz_lim ) + { if( debug_main ) debug_msg( "Adding CBx :: %i", ext ); cb = new Call_Box( ext, port ); if( cb == NULL ){ memory_is_over = true; + if( debug_memory ) debug_msg("Invite allocation cb fail"); }else{ v_cb->add( cb ); } + } } if( cb != NULL ){ cb->set_msg_id( data[ 0 ] ); @@ -588,18 +627,20 @@ case __REGISTRY__ : { registry_counter++; Call_Box * cb = __find_CB__( v_cb, ext ); - + if( v_cb->size() < vz_lim ){ if( cb == NULL ){ if( debug_main ) debug_msg("Adding Cbx :: %d", ext ); cb = new Call_Box( ext, port ); if( cb == NULL ){ memory_is_over = true; + if( debug_memory ) debug_msg("Registry cb allocation fail"); }else{ v_cb->add( cb ); if( debug_main ) debug_msg("Added CBx -- %d", ext ); } } + } if( debug_main ) debug_msg("Registered %d - %d", ext, port ); if( cb != NULL ) cb->registry(); @@ -718,7 +759,24 @@ } } //if( v_call->size() == 0 ) refresh( v_cb, buffer, write_buffer, NULL ); - refresh( v_cb, buffer, write_buffer, NULL ); + + if( timer_sync_refresh.read_ms() > 500 ) + { + timer_sync_refresh.reset(); + + static uint8_t mode = TIME_TO_REFRESH; + + if( mode == TIME_TO_REFRESH ){ + mode = TIME_TO_WAKE_UP; + refresh( v_cb, buffer, write_buffer, NULL ); + }else{ + mode = TIME_TO_REFRESH; + //if( wake_all ) if( v_call->size() == 0 ) wake_all_up( v_cb, buffer, write_buffer ); + } + } + + + //refresh( v_cb, buffer, write_buffer, NULL ); //Fixme pensar melhor nessa parte durante ligacoes, pode complicar com muitos cbx ... //if( v_call->size() == 0 ) registry_aging( v_cb, buffer, write_buffer ); @@ -799,13 +857,21 @@ uptime++; int read = udp_wdt_client.receiveFrom( udp_wdt_server, wake_msg, sizeof( wake_msg ) ); + bool force_alive = false ; + if( read > 0 ){ eth_pkg_received++; - + if( !( strncmp( wake_msg, "alive", 5 ) ) ){ // Just ckeck but not set 'alive?' // Ckecking and set 'alive' bool question_alive = ( wake_msg[ 5 ] == '?' ); + force_alive = ( wake_msg[ 5 ] == '*' ); + + if( wake_msg[ 5 ] == '@' ) + { + vz_lim = wake_msg[ 6 ]; + } snprintf( wake_msg, 48,"wdt:%u,%u,%u,%c,%u:", uptime, invite_counter, external_wdt, ( wdt.WatchdogCausedReset() ) ? '1' : '0', cb_new_counter ); wake_msg[ 48 - 1 ] = 0; @@ -814,15 +880,15 @@ if( wdt_show ) send_msg( "Sent %d bytes in response", sent ); - if( (!question_alive) && ( cb_new_counter <= __MAX_CB_IN_A_BRANCH__ ) && ( cb_new_counter >= 2 ) ) { + if( ( (!question_alive) && ( cb_new_counter <= __MAX_CB_IN_A_BRANCH__ ) && ( cb_new_counter >= 2 ) ) + || force_alive ){ external_wdt = EXTERN_WDT_IDLE; } }else if( !( strncmp( wake_msg, "reset", 5 ) ) ){ external_wdt = 0; sprintf( wake_msg, "rst:%u:", uptime ); - int sent = 0; - sent = udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) ); + int sent = udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) ); if( wdt_show ) send_msg( "Sent %d bytes in response", sent ); } @@ -837,7 +903,7 @@ if( pkg_wdt ) pkg_wdt--; if( eth_wdt ) eth_wdt--; - if( eth_wdt && external_wdt && pkg_wdt ){ + if( ( eth_wdt && external_wdt && pkg_wdt ) || force_alive ){ wdt.kick(); } }