Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Revision:
92:92df17f538a8
Parent:
91:c2a86b1f8aaa
Child:
95:0911808656c5
--- a/main.cpp	Thu Jan 08 23:44:08 2015 +0000
+++ b/main.cpp	Sat Jan 10 16:35:11 2015 +0000
@@ -156,9 +156,11 @@
 
     send_msg("Ready");
 
-    bool registry_test = false;
-    static int next_value = 5002;
-    static int nex_test_registry = next_value;
+    //bool registry_test = false;
+    //static int next_value = 5002;
+    //static int nex_test_registry = next_value;
+    
+    bool invite_retry_time = false;
 
     /*------------------------------------------ main loop ---------------------------------------------------------------*/
     while( true ) {
@@ -427,17 +429,17 @@
                 if( type != __AUDIO__ ) {
                     Call_Box * cb = __find_CB__( v_cb, ext );
                     if( cb != NULL ) {
-                        if( ( data[ 0 ] & BIT7 ) >= BIT7 ) {
+                        if( data[ 0 ] & BIT7 ) {
                             if( type == __BOOT__ ) {
                                 send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
-                                                                      ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
-                            } else if( ( data[ 0 ] & BIT7 ) == BIT7 ) {
+                                    ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                            } else {
                                 if( debug_main ) debug_msg("Received ack pkg with seq_num %d", data[ 0 ] );
 
                                 switch( type ) {
                                     case __INVITE__ : {
                                         if( debug_main || debug_invite ) debug_msg("Invite Ack from %d on msg_id %d", ext, cb->get_msg_id() );
-                                        cb->set_invite_response_ok();
+                                        //cb->first_invite_response_ok();
                                         break;
                                     }
                                     case __CB_BYE__ : {
@@ -453,8 +455,16 @@
                                         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 != __CB_BYE__ ) type = __DO_NOTHING__;
-                                if( type != __REGISTRY__ ) type = __DO_NOTHING__;
+                                if( type != __REGISTRY__ && type != __CB_BYE__ ) type = __DO_NOTHING__;
+                                if( type == __CB_BYE__ ){
+                                    VZ_call * call = __find_Call__( v_call, ext );
+                                    if( call != NULL ){
+                                        if( call->get_elapsed_time() < 120000 ){
+                                            if( debug_invite ) debug_msg("%d ack bye ignored", ext );
+                                            type = __DO_NOTHING__;
+                                        }
+                                    }
+                                }
                             }
                         }
                     }
@@ -483,7 +493,8 @@
             send_msg("Sizeof Watchdog :: %u", sizeof( Watchdog ) );
         }
 
-        static int wdt_count = 0;
+        //static int wdt_count = 0;
+        /*
         if( registry_test == true ) {
             registry_test = false;
 
@@ -506,7 +517,8 @@
                 }
             }
         }
-
+        */
+        
         {
             fd_set fdSet;
             FD_ZERO(&fdSet);
@@ -543,8 +555,8 @@
                             bool question_alive = ( wake_msg[ 5 ] == '?' );
                             if( wake_msg[ 5 ] == '*' ) wdt.kick();
         
-                            snprintf( wake_msg, 48,"wdt:%u,%u,%u,%c,%u,%u,%u:", uptime, invite_counter, external_wdt, ( wdt.WatchdogCausedReset() ) ? '1' : '0', cb_new_counter, v_call->size(), ts->remain_timeslices() );
-                            wake_msg[ 48 - 1 ] = 0;
+                            snprintf( wake_msg, 48,"wdt:%u,%u,%u,%c,%u,%u,%u,%u:", uptime, invite_counter, external_wdt, ( wdt.WatchdogCausedReset() ) ? '1' : '0', cb_new_counter, v_call->size(), ts->remain_timeslices(), sip_socket_send_failure );
+                            wake_msg[ 768 - 1 ] = 0;
                             udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) );
         
                             if( ( (!question_alive) && ( cb_new_counter <= __MAX_CB_IN_A_BRANCH__ ) && ( cb_new_counter >= 2 ) ) ) {
@@ -585,7 +597,6 @@
             break;
 
             case __CB_BYE__ : {
-                //FIXME como mandar um BYE pro servidor ?
                 cb_bye_counter++;
                 Call_Box * cb = __find_CB__( v_cb, ext );
                 if( cb != NULL ) {
@@ -593,6 +604,14 @@
                     data[ 0 ] |= BIT7;
                     cb->set_msg_id( data[ 0 ] );
                     if( debug_main || debug_invite ) debug_msg( "Request bye from CBx " );
+                    
+                    debug_msg("----------");
+                    for( register uint8_t i = 0; i < v_call->size(); i++ ) {
+                        VZ_call * call = (VZ_call *)v_call->get_element( i );
+                        debug_msg("--%d--", call->get_cb_ext() );
+                    }
+                    debug_msg("----------");
+                    
                     bool already_removed = true;
                     for( register uint8_t i = 0; i < v_call->size(); i++ ) {
                         VZ_call * call = (VZ_call *)v_call->get_element( i );
@@ -608,11 +627,15 @@
                             set_status( cb->sip->status, sip_idle );
 
                             v_call->remove_element( i );
+                            
+                            //cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                            //cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
 
                             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 );
+                              
+                            // envia o ack bye depois atualiza o msg_id  
+                            cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
 
                             delete( call );
                             cb->re_start_timer();
@@ -637,9 +660,10 @@
                                 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 ) );
+                                    ( 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->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                                cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
 
                                 cb->re_start_timer();
                             }
@@ -672,6 +696,10 @@
                 }
                 if( cb != NULL ) {
                     cb->set_msg_id( data[ 0 ] );
+                    if( cb->status == cb_idle ){
+                        cb->set_invite_response_ok();
+                        cb->invite_retry_count_reset();
+                    }
                     invite_handler( v_call, v_cb, ts, cb );
                 }
             }
@@ -702,17 +730,16 @@
             case __BOOT__ : {
                 boot_counter++;
                 send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
-                                                      ( char * )data, data[ 0 ] | BIT7, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                    ( char * )data, data[ 0 ] | BIT7, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
             }
             break;
             case __TELEMETRY__ : {
                 Call_Box * cb = __find_CB__( v_cb, ext );
 
                 if( cb == NULL ) {
-                    send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
-                                                          ( char * )data, ( ( data[ 0 ] &  ~BIT7 ) + 1 ), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+        //            send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
+        //                ( char * )data, ( ( data[ 0 ] &  ~BIT7 ) + 1 ), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
 
-                    /*
                     if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
                     cb = new Call_Box( ext, port );
 
@@ -722,12 +749,10 @@
                         v_cb->add( cb );
                         if( debug_main ) debug_msg("Added CBx -- %d", ext );
                     }
-                    */
                 }
-                /*
                 if( cb != NULL ){
                     cb->registry();
-                }*/
+                }
 
                 telemetry_counter++;
                 if( debug_telemetry ) send_msg("::Telemetry from %d - %d::", ext, port );
@@ -745,9 +770,9 @@
                 Call_Box * cb = __find_CB__( v_cb, ext );
 
                 if( cb == NULL ) {
-                    send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
-                                                          ( char * )data, ( ( data[ 0 ] &  ~BIT7 ) + 1 ), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
-                    /*
+//                    send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
+//                        ( char * )data, ( ( data[ 0 ] &  ~BIT7 ) + 1 ), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+
                     if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
                     cb = new Call_Box( ext, port );
                     if( cb == NULL ){
@@ -756,10 +781,9 @@
                         v_cb->add( cb );
                         if( debug_main ) debug_msg("Added CBx -- %d", ext );
                     }
-                    */
                 }
 
-                //if( cb!= NULL ) cb->registry();
+                if( cb!= NULL ) cb->registry();
 
                 if( xstrmatch( ( uint8_t * )data, ( uint8_t * )"ping" ) ) {
                     if( debug_ping ) send_msg( "Prompt pkg from ( %i, %i ) :: Ping", ext, port );
@@ -789,14 +813,65 @@
                 if( call != NULL ) {
                     char * pkg = call->build_eth_package( data + 2 );
                     call->send_message( pkg );
+                    call->cbx_pkg_idle_timer_reset();
                     Call_Box * cb = __find_CB__( v_cb, ext );
-                    if( cb != NULL ) cb->reset_elapsed_time();
+                    if( cb != NULL ){
+                        cb->reset_elapsed_time();                        
+                        cb->set_invite_response_ok();
+                        cb->invite_retry_count_reset();
+                    } 
                 } else {
                     if( debug_main ) debug_msg("received missed package  from CBx :: %i", ext );
                 }
             }
             break;
         }// fim switch
+        
+        {   
+            if( invite_retry_time == true ){
+                invite_retry_time = false;
+                static int retry_invite_pkg = 0;
+                if( retry_invite_pkg >= v_cb->size() ) retry_invite_pkg = 0;
+                
+                Call_Box * cb = (Call_Box *)v_cb->get_element( retry_invite_pkg++ );
+               
+                if( ( cb->status == cb_ringing ) || ( cb->status == cb_trying ) || ( cb->status == cb_on_call ) ){
+                    if( cb->get_invite_response() == false ){
+                        debug_msg("");
+                        //cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                        cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
+                        
+                        buffer[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
+                        
+                        send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __INVITE__, ( char * )buffer, 
+                            cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                        if( debug_invite ) debug_msg("resend invite OK to Cbx : %d", cb->get_ext() );
+                    }
+                    if( cb->get_invite_retry_count() == 0 ){
+                        cb->send_bye();
+                        
+                        ts->return_timeslice( cb->get_timeslice() );
+                        cb->set_timeslice( 0x00 );
+
+                        //cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                        cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
+                                                        
+                        for( register uint8_t i = 0; i < v_call->size(); i++ ){
+                            VZ_call * call = ( VZ_call * )v_call->get_element( i );
+                            if( call->get_cb_ext() == cb->get_ext() ){ 
+                                v_call->remove_element( i );
+                                if( call != NULL ) delete( call );
+                                break;
+                            }
+                        }
+                        
+                        if( debug_invite ) debug_msg( "-- No audio pkgs --" );
+                        set_status( cb->status, cb_idle );
+                        set_status( cb->sip->status, sip_idle );
+                    }
+                }
+            }
+        }
 
         for( register uint8_t i = 0; i < v_call->size(); i++ ) {
             VZ_call * call = ( VZ_call * )v_call->get_element( i );
@@ -816,6 +891,7 @@
                 } else if( debug_main ) debug_msg("received missed package  from CBx :: %i -- Type :: %i", ext, type );
             }
         }
+        
         //if( v_call->size() == 0 ) refresh( v_cb, buffer, write_buffer, NULL );
 
         if( timer_sync_refresh.read_ms() > 500 ) {
@@ -859,7 +935,8 @@
                         }
                     }
 
-                    cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                    //cb->set_msg_id( ( cb->get_msg_id() &  ~BIT7 ) + 1 );
+                    cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
 
                     //debug_msg("msg_id -- %d", cb->get_msg_id() );
 
@@ -908,7 +985,8 @@
 
         if( wdt_timer.read() >= 1 ) {
             //FIXME remove myself
-            registry_test = true;
+            //registry_test = true;
+            invite_retry_time = true;
 
             uptime++;