Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Revision:
82:f55d13babca0
Parent:
81:3656f00ab3db
Child:
83:b8a1d8fdeaeb
--- a/main.cpp	Tue Dec 30 12:37:40 2014 +0000
+++ b/main.cpp	Tue Dec 30 21:00:00 2014 +0000
@@ -29,6 +29,7 @@
     }else{
         send_msg("******* Connection eth - ok *******");
         init_prompt_eth();
+        init_external_wdt()
     }
     
     Timer sync_timer, led_sync_timer;
@@ -143,6 +144,7 @@
                     }else{
                         if( debug_main ) debug_msg("Connection eth - ok");
                         init_prompt_eth();
+                        init_external_wdt()
                     }
                 }
             }
@@ -383,7 +385,8 @@
                                         if( debug_main || debug_aging ) debug_msg("ACK from %d in pkg :: %d :: type %d", ext, cb->get_msg_id(), type );   
                                     }    
                                 }
-                                if( type != __REGISTRY__ ) type = __DO_NOTHING__;
+                                if( type != __REGISTRY__ && type != __CB_BYE__ ) type = __DO_NOTHING__;
+                                //if( type != __REGISTRY__ ) type = __DO_NOTHING__;
                             }
                         }
                     }
@@ -392,12 +395,18 @@
         }
         
         if( main_test == true ){
-         //   Call_Box * cb = new Call_Box( 5010, 5010 );
-         //   v_cb->add( cb );
+            static int next_value = 5010;
+            Call_Box * cb = new Call_Box( next_value, next_value++ );
+            v_cb->add( cb );
+            cb->cb_set_status( cb_on_call );
+            cb->set_timeslice( ts->get_timeslice() );
+            
          //   cb = new Call_Box( 5011, 5011 );
          //   v_cb->add( cb );
+         
             main_test = false;
             send_msg("Missed_Pkg :: %d ::", missed_pkg );
+            
         }
         
         if( reset_cks == true ){
@@ -447,16 +456,45 @@
                             
                             v_call->remove_element( i );
                             
-                            cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
-                            
                             send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
                                 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                                
+                            cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
                             
                             delete( call );
                             cb->re_start_timer();
                         }
                     }
-                    if( already_removed ) if( debug_main || debug_invite ) debug_msg( "Already removed" );
+                    if( already_removed ) if( debug_main || debug_invite ) debug_msg( "Already removed from vector call" );
+                    
+                    //ok, mas nem sempre o cbx "entrou em call
+                    for( register uint8_t i = 0; i < v_cb->size(); i++ ) {
+                        Call_Box * cb = (Call_Box *)v_cb->get_element( i );
+                        if( cb->get_ext() == ext ) {
+                            already_removed = true;
+                            if( cb->get_status() != cb_idle ) {
+                                already_removed = false;
+                                cb->send_bye();
+
+                                ts->return_timeslice( cb->get_timeslice() );
+                                cb->set_timeslice( 0x00 );
+                                data[ __TIMESLICE_PLACE__ ] = 0x00;
+
+                                set_status( cb->status, cb_idle );
+                                set_status( cb->sip->status, sip_idle );
+
+                                send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
+                                    ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+
+                                cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+
+                                cb->re_start_timer();
+                            }
+                        }
+                    }
+                    
+                    
+                    if( already_removed ) if( debug_main || debug_invite ) debug_msg( "Already removed from inviting queue" );
                     
                     cb->registry();
                 }else if( debug_invite || debug_main ) debug_msg("Bye from who ? %d", ext );
@@ -606,10 +644,10 @@
                         }
                     }
             
-                    //cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
-                    cb->set_msg_id( 80 );
+                    cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                    //cb->set_msg_id( 80 );
                     
-                    debug_msg("msg_id -- %d", cb->get_msg_id() );
+                    //debug_msg("msg_id -- %d", cb->get_msg_id() );
                     
                     send2callboxes( __build_cb_package__( ext, port, __CB_BYE__, 
                         ( char * )buffer, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
@@ -629,7 +667,9 @@
         if( ( v_call->size() == 0 ) && ( ts->remain_timeslices() != __MAX_TIMESLICES__ ) ){
              bool ts_reset = true;
              for( register uint8_t i = 0; i < v_cb->size(); i++ ){
-                if ( ( ( Call_Box * )v_cb->get_element( i ) )->get_status() != cb_idle ){
+                if ( ( ( Call_Box * )v_cb->get_element( i ) )->get_status() != cb_idle &&
+                        ( ( Call_Box * )v_cb->get_element( i ) )->get_sip_status() != sip_idle )
+                {
                     ts_reset = false;
                     break;
                 }
@@ -653,6 +693,19 @@
         if( eth_status == 0 ) eth_wdt = ETH_CONNECT_TIMEOUT;
         
         if( wdt_timer.read() > 1 ){
+            char wake_msg[ 8 ];
+
+            int read = udp_wdt_client.receiveFrom( udp_wdt_server, wake_msg, sizeof( wake_msg ) );
+            
+            if( read > 0 ){
+                if( !( strncmp( wake_msg, "alive", 5 ) ) ){
+                    external_wdt = EXTERN_WDT_IDLE;
+                    strcpy( wake_msg, "wakeup" );
+                    while( !( udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) ) ) );
+                }
+            }
+            if( debug_wdt ) if( read < 0 ) debug_msg( "some's wrong ... some's wrong" );
+            
             wdt_timer.reset();
             
             if( wdt_show ) debug_wdt = true;
@@ -669,17 +722,21 @@
         if( debug_wdt ){
             debug_wdt = false;
             if( eth_status == 0 ){
-                send_msg( "Wdt last reset: %s - status_eth :: Connected - Extern Wdt idle for :: %3d sec - Rx from CBx idle for :: %3d sec", 
+                send_msg( "Wdt last reset: %s - status_eth :: Connected - Extern Wdt idle for :: %3d sec ( %3d ) - Rx from CBx idle for :: %3d sec ( %3d )", 
                     ( wdt.WatchdogCausedReset() ) ? "true" : "false", 
                     EXTERN_WDT_IDLE - external_wdt, 
-                    RX_CB_IDLE - pkg_wdt 
+                    EXTERN_WDT_IDLE,
+                    RX_CB_IDLE - pkg_wdt,
+                    RX_CB_IDLE
                 );
             }else{
-                send_msg( "Wdt last reset: %s - status_eth :: Disconnected :: since %3d sec - Extern Wdt idle for :: %3d sec - Rx from CBx idle for :: %3d sec", 
+                send_msg( "Wdt last reset: %s - status_eth :: Disconnected :: since %3d sec - Extern Wdt idle for :: %3d sec ( %3d ) - Rx from CBx idle for :: %3d sec ( %3d )", 
                     ( wdt.WatchdogCausedReset() ) ? "true" : "false", 
                     ETH_CONNECT_TIMEOUT - eth_wdt,
-                    EXTERN_WDT_IDLE - external_wdt, 
-                    RX_CB_IDLE - pkg_wdt 
+                    EXTERN_WDT_IDLE - external_wdt,
+                    EXTERN_WDT_IDLE,
+                    RX_CB_IDLE - pkg_wdt,
+                    RX_CB_IDLE
                 );
             }
         }