Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

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();
             }
         }