Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Revision:
119:ee6a53069455
Parent:
118:b93b17c50910
Child:
120:770f00554b1e
--- a/main.cpp	Fri Apr 24 13:54:24 2015 +0000
+++ b/main.cpp	Thu Apr 30 15:42:41 2015 +0000
@@ -1,219 +1,34 @@
-#include "telemetry.h"
-#include "eth.h"
-#include "bits.h"
-#include "UART3Interrupt.h" // for RXBuffer[ __CB_BUFFER_SIZE__ ];                                                                                 
-#include "utils.h"
-#include "parallelcpld.h"
-#include "debug.h"
-#include "flood.h"
-#include "bootloader_cbx.h"
-#include "call_manager.h"
-#include "call_box_manager.h"
-#include "sip_manager.h"
-#include "shared_variables.h"
-#include "prompt.h"
-#include "configs.h"
-#include "sdram.h"
-#include "fw.h"
-#include "bootloader.h"
-volatile u16_t lpc_low_level_input_counter = 0;
+#include "main_includes_configs.h"
 
 int main()
 {
-    init_wdt();
-
-    config_lpc();
-
-    start_cpld();
-
     debug_uart3 = true;
-    if( sdram_init() == 1 ) {
-        send_msg("******* Failed to initialize SDRAM *******");
-        return 1;
-    } 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 *******");
-    } else {
-        send_msg("******* Connection eth - ok *******");
-        init_prompt_eth();
-        init_external_wdt();
-        init_bl();
-    }
-
-    Timer sync_timer, led_sync_timer;
-    sync_timer.start(), led_sync_timer.start();
-
-    /* representa ramal do call box */
-    int ext = 0;
-
-    /* representa porta do call box */
-    int port = 0;
-
-    /* buffer para onde se copia os dados vindos do cb para tratameno interno */
-    uint8_t buffer[ __CB_BUFFER_SIZE__ ];
-
-    /* buffer de escrita do pacote de saida que sera enviado pro cb / servidor */
-    uint8_t write_buffer[ __CB_BUFFER_SIZE__ ];
-
-    /* ponteiro que aponta para os dados vindo do CPLD */
-    uint8_t * buffer_from_cb_ptr = ( uint8_t * )RXBuffer;
-
-    /* Armazena o ultimo pacote recebido dos CBx */
-    uint8_t cb_rx_buffer[ __CB_BUFFER_SIZE__ ];
-
-    /* referencia para os dados contidos no pacote, sem o header */
-    uint8_t * data = NULL;
-
-    /* gerencia o tipo do pacote para providenciar tratamento adequado */
-    volatile uint8_t type = __DO_NOTHING__;
-
-    /* representa a lista dos Call Boxes atualmente recfonhecidos pela cabeceira */
-    Vector * v_cb = new Vector();
-
-    /* representa a lista de ligacoes ativas na cabeceira */
-    Vector * v_call = new Vector();
-
-    /* gerencia a distribuicao de timeslice para os call boxes */
-    Timeslice * ts = new Timeslice();
-    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 ) {
-        while( v_cb == NULL ) {
-            Vector * v_cb = new Vector();
-            if( sync_timer.read() > 5 ) {
-                send_msg("Erro ao alocar o vetor de CBx");
-                sync_timer.reset();
-            }
-        }
-    } else if( v_call == NULL ) {
-        while( v_call == NULL ) {
-            Vector * v_call = new Vector();
-            if( sync_timer.read() > 5 ) {
-                send_msg("Erro ao alocar o vetor de Calls");
-                sync_timer.reset();
-            }
-        }
-    }
-
-    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;
-        cb_tx_buffer[ i ] = 0;
-    }
-
-    reset_leds();
-
-    udp_timer.start();
-
-    init_telemetry_handler();
+    
+    int header_app_init_ret = header_app_init ();
     
-    //debug_msg("");
-    init_fw_handler();
-    //debug_msg("");
+    send_msg( "header_app_init %s" , ( header_app_init_ret  == 0 ) ? "Ok" : "Failure" );
     
-    led2 = 0;
-    init_ranges();
-
-    init_refresh();
-
-    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 );
-
-    uint8_t max_registered_cbx = 0;
-
-    bool wake_all = false;
-
-    uint16_t pkg_wdt = RX_CB_IDLE;
-    uint16_t eth_wdt = ETH_CONNECT_TIMEOUT;
-    uint32_t uptime = 0;
-    led1 = 0;
-    send_msg("Ready");
-
-    //bool registry_test = false;
-    //static int next_value = 5002;
-    //static int nex_test_registry = next_value;
+    if ( header_app_init_ret == 0 ) send_msg("Ready");
     
-    //bool invite_retry_time = false;
-    Timer invite_retry_timer;
-    invite_retry_timer.start();
     debug_uart3 = false;
     
-    Timer test_timer;
+    /*------------------------------------------ main loop ---------------------------------------------------------------*/
     
-    hex_init();
-
-    /*------------------------------------------ main loop ---------------------------------------------------------------*/
-    while( true ) {
-        reset_leds();
-        // need be removed;
-        
+    while( true )
+    {    
         if( v_cb->size() > max_registered_cbx ) max_registered_cbx = v_cb->size();
 
-        if( sync_timer.read() > 5 ) {
+        if( sync_timer.read() > 5 )
+        {
             sync_timer.reset();
 
-            if( debug_cks == true ) {
-                pcks_s = true;
-            }
+            if( debug_cks == true ) { pcks_s = true; }
 
-            if( debug_alive == true ) {
-                pshowcb = true;
-            }
-            
-            
-            {
-            //    debug_msg("Enviei");
-            //    send2callboxes( __build_cb_package__( 5000, 5000, __INVITE__,
-            //        ( char * )buffer, 0x12, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
-            //    v_cb -> add ( new Call_Box ( 5010, 5010 ) );
-            }
+            if( debug_alive == true ) { pshowcb = true; }
             
             if( !( ++count % 15 ) ) {
                 if( eth_status ) {
-                    eth_status = __init_eth__();
-                    if( eth_status ) {
-                        if( debug_main ) debug_msg("Cannot connect to eth");
-                    } else {
-                        if( debug_main ) debug_msg("Connection eth - ok");
-                        init_prompt_eth();
-                        init_external_wdt();
-                        init_bl();
-                    }
+                    try_reconnect_with_eth ();
                 }
             }
             
@@ -222,278 +37,55 @@
                 wake_all = true;
                 if( debug_wake == true ) send_msg( "Time to wake" );
             }
+            
+            // enable na variavel que exibe lista com estatisticas de pacotes que falharam ao serem enviados via interface eth
+            if ( debug_missed ) { missed_send_udp_pkg = true; }
+
         }
 
-        //FIXMEj colocar uma condicao aqui caso necessario pra nao comprometer ligacoes ...
-        prompt_process( NULL );
+        prompt_process( NULL, 0 );
+        
+        check_clock ();
 
-        if( r_stats ) {
-            boot_counter = 0;
-            registry_counter = 0;
-            invite_counter = 0;
-            audio_counter = 0;
-            telemetry_counter = 0;
-            cb_bye_counter = 0;
-            prompt_counter = 0;
-            flood_counter = 0;
-            bootloader_cbx_counter = 0;
-            cb_stats_counter = 0;
+        if ( r_stats )
+        {
+            reset_stats ();
             r_stats = false;
             stats = true;
         }
 
-        if( stats ) {
-            char str[ 200 ];
-            snprintf( str, 200, "\n\rReceived Pkgs::\n\r Boot :: %u\n\r Registry :: %u\n\r Invite :: %u\n\r Audio :: %u\n\r Telemetry :: %u\n\r CB_stats :: %u\n\r CB_bye :: %u\n\r Prompt :: %u\n\r Flood :: %u\n\r Bootloader_cbx :: %u\n\r",
-                      boot_counter, registry_counter, invite_counter, audio_counter, telemetry_counter, cb_stats_counter, cb_bye_counter, prompt_counter, flood_counter, bootloader_cbx_counter );
-            send_msg( str );
+        if ( stats )
+        { 
+            show_stats ();
             stats =false;
         }
 
-        if( list ) {
-            uint8_t missed_cb = ( ( max_ext - min_ext ) + 1 ) - v_cb->size();
-
-            if( ( max_ext % 2 ) == 0 ) missed_cb++;
-
-            if( min_ext % 2 ) missed_cb++;
-
-            if( min_ext == 0 && max_ext == 0 ) missed_cb = 0;
-
-            send_msg("Registered %d[ %d ] CBx ( %d - %d ) - Missed %d -- Remain_timeslices :: %d :: v_call->size() :: %d", v_cb->size(), max_registered_cbx, min_ext, max_ext, missed_cb, ts->remain_timeslices(), v_call->size() );
-            if( v_cb->size() == 1 ) {
-                send_msg(" %d ", ( ( Call_Box * )v_cb->get_element( 0 ) )->get_ext() );
-            } else if( v_cb->size() > 1 ) {
-                char str[ 1024 ];
-                int ext_list[ __MAX_CB_IN_A_BRANCH__ ];
-                register int i = 0;
-                for( ; i < v_cb->size(); i++ ) {
-                    ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
-                }
-
-                qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
-
-                char aux[ 16 ];
-                strcpy( str, "\r\n> " );
-                for( i = 0; i < v_cb->size() - 1; i++ ) {
-                    sprintf( aux, "%i, ", ext_list[ i ] );
-                    strcat( str, aux );
-                    if( ( i != 0 ) && !( ( i + 1 ) % 16 ) ) strcat( str, "\r\n> " );
-                }
-                sprintf( aux, "%i ", ext_list[ i ] );
-                strcat( str, aux );
-                send_msg( "%s", str );
-            }
+        if ( list ) 
+        {
+            show_cb_list ( v_cb );
             list = false;
         }
 
-        if( long_list ) 
+        if ( long_list ) 
         {
-            uint8_t missed_cb = ( ( max_ext - min_ext ) + 1 ) - v_cb->size();
-
-            if( ( max_ext % 2 ) == 0 ) missed_cb++;
-
-            if( min_ext % 2 ) missed_cb++;
-
-            if( min_ext == 0 && max_ext == 0 ) missed_cb = 0;
-
-            {
-                int ext_list[ __MAX_CB_IN_A_BRANCH__ ];
-                
-                if( v_cb->size() >= 1 ) {
-                    for( register int i = 0; i < v_cb->size(); i++ )
-                    {
-                        ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
-                    }
-                    qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
-                }   
-                
-                send_msg("Registered %d[ %d ] CBx ( %d - %d ) - Missed %d -- Remain_timeslices :: %d :: v_call->size() :: %d", v_cb->size(), max_registered_cbx, min_ext, max_ext, missed_cb, ts->remain_timeslices(), v_call->size() );
-                
-                for( register uint8_t i = 0; i < v_cb->size(); i++ ) {
-                    
-                    Call_Box * cb = __find_CB__( v_cb, ext_list[ i ] );
-            
-                    if( cb != NULL )
-                    {
-                        char cb_status[ 32 ];
-                        char cb_sip_status[ 32 ];
-                        switch( cb->status ) {
-                            case cb_idle : {
-                                strcpy( cb_status, "cb_idle" );
-                                break;
-                            }
-                            case cb_ringing : {
-                                strcpy( cb_status, "cb_ringing" );
-                                break;
-                            }
-                            case cb_trying : {
-                                strcpy( cb_status,"cb_trying" );
-                                break;
-                            }
-                            case cb_on_call : {
-                                strcpy( cb_status, "cb_on_call" );
-                                break;
-                            }
-                            case cb_busy : {
-                                strcpy( cb_status, "cb_busy" );
-                                break;
-                            }
-                            case cb_denied : {
-                                strcpy( cb_status, "cb_denied" );
-                                break;
-                            }
-                            case cb_bootloader : {
-                                strcpy( cb_status, "cb_bootloader" );
-                                break;
-                            }
-                        }
-                        switch( cb->sip->status ) {
-                            case sip_idle : {
-                                strcpy( cb_sip_status, "sip_idle" );
-                                break;
-                            }
-                            case sip_waiting_trying : {
-                                strcpy( cb_sip_status, "sip_waiting_trying" );
-                                break;
-                            }
-                            case sip_trying : {
-                                strcpy( cb_sip_status, "sip_trying" );
-                                break;
-                            }
-                            case sip_ringing : {
-                                strcpy( cb_sip_status, "sip_ringing" );
-                                break;
-                            }
-                            case sip_busy : {
-                                strcpy( cb_sip_status, "sip_busy" );
-                                break;
-                            }
-                            case sip_ok : {
-                                strcpy( cb_sip_status, "sip_ok" );
-                                break;
-                            }
-                            case sip_on_call : {
-                                strcpy( cb_sip_status, "sip_on_call" );
-                                break;
-                            }
-                            case sip_denied : {
-                                strcpy( cb_sip_status, "sip_denied" );
-                                break;
-                            }
-                        }
-                        char cbx_to_string[ 254 ];
-                        char aux[ 16 ];
-                        strcpy( cbx_to_string, "Ext :: " );
-                        itoa( cb->get_ext(), aux , 10 );
-                        strcat( cbx_to_string, aux );
-                        strcat( cbx_to_string, " :: Port :: " );
-                        itoa( cb->get_port(), aux , 10 );
-                        strcat( cbx_to_string, aux );
-                        strcat( cbx_to_string, " :: Status -- " );
-                        strcat( cbx_to_string, cb_status );
-                        strcat( cbx_to_string, " - " );
-                        strcat( cbx_to_string, cb_sip_status );
-                        if( cb->get_timeslice() != 0 ) {
-                            strcat( cbx_to_string, " -- on TimeSlice :: " );
-                            itoa( cb->get_timeslice(), aux , 10 );
-                            strcat( cbx_to_string, aux );
-                        }
-                        send_msg( cbx_to_string );
-                    }
-                }   
-                
-            }
+            show_cb_long_list ( v_cb );
             long_list = false;
         }
-
-        if( pshowcb == true ) {
-            send_msg("Registered %d ( of %d ) CBx ( %d - %d ) -- Remain_timeslices :: %d :: v_call->size() :: %d", v_cb->size(), max_registered_cbx, min_ext, max_ext, ts->remain_timeslices(), v_call->size() );
-            for( register uint8_t i = 0; i < v_cb->size(); i++ ) {
-                Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
-                char cb_status[ 32 ];
-                char cb_sip_status[ 32 ];
-                switch( cb->status ) {
-                    case cb_idle : {
-                        strcpy( cb_status, "cb_idle" );
-                        break;
-                    }
-                    case cb_ringing : {
-                        strcpy( cb_status, "cb_ringing" );
-                        break;
-                    }
-                    case cb_trying : {
-                        strcpy( cb_status,"cb_trying" );
-                        break;
-                    }
-                    case cb_on_call : {
-                        strcpy( cb_status, "cb_on_call" );
-                        break;
-                    }
-                    case cb_busy : {
-                        strcpy( cb_status, "cb_busy" );
-                        break;
-                    }
-                    case cb_denied : {
-                        strcpy( cb_status, "cb_denied" );
-                        break;
-                    }
-                }
-                switch( cb->sip->status ) {
-                    case sip_idle : {
-                        strcpy( cb_sip_status, "sip_idle" );
-                        break;
-                    }
-                    case sip_waiting_trying : {
-                        strcpy( cb_sip_status, "sip_waiting_trying" );
-                        break;
-                    }
-                    case sip_trying : {
-                        strcpy( cb_sip_status, "sip_trying" );
-                        break;
-                    }
-                    case sip_ringing : {
-                        strcpy( cb_sip_status, "sip_ringing" );
-                        break;
-                    }
-                    case sip_busy : {
-                        strcpy( cb_sip_status, "sip_busy" );
-                        break;
-                    }
-                    case sip_ok : {
-                        strcpy( cb_sip_status, "sip_ok" );
-                        break;
-                    }
-                    case sip_on_call : {
-                        strcpy( cb_sip_status, "sip_on_call" );
-                        break;
-                    }
-                    case sip_denied : {
-                        strcpy( cb_sip_status, "sip_denied" );
-                        break;
-                    }
-                }
-                char cbx_to_string[ 254 ];
-                char aux[ 16 ];
-                strcpy( cbx_to_string, "Ext :: " );
-                itoa( cb->get_ext(), aux , 10 );
-                strcat( cbx_to_string, aux );
-                strcat( cbx_to_string, " :: Port :: " );
-                itoa( cb->get_port(), aux , 10 );
-                strcat( cbx_to_string, aux );
-                strcat( cbx_to_string, " :: Status -- " );
-                strcat( cbx_to_string, cb_status );
-                strcat( cbx_to_string, " - " );
-                strcat( cbx_to_string, cb_sip_status );
-                if( cb->get_timeslice() != 0 ) {
-                    strcat( cbx_to_string, " -- on TimeSlice :: " );
-                    itoa( cb->get_timeslice(), aux , 10 );
-                    strcat( cbx_to_string, aux );
-                }
-                send_msg( cbx_to_string );
-            }
+        
+        if ( pshowcb ) 
+        {
+            show_cb ( v_cb );
             pshowcb = false;
         }
         
+        if ( show_current_time ) 
+        {  
+            show_clock ();
+            show_current_time = false;;
+        }
+        
+        if ( test_flag_unusual ) _this_is_a_only_test ();
+        
         if( show_sip == true ){
             show_sip = false;
             send_msg(":: Sip :: %u", v_cb->size() );
@@ -510,45 +102,17 @@
             send_msg("Eth status %s", ( eth_status == 0 ) ? "Connected" : "Disconnected" );
         }
 
-        if( status != __WAITING__ ) {
+        if( status != WAITING ) {
             pkg_wdt = RX_CB_IDLE;
-            xmemcpy( cb_rx_buffer, buffer_from_cb_ptr, __CB_BUFFER_SIZE__ );
-            status = __WAITING__;
+            xmemcpy( cb_rx_buffer, buffer_from_cb_ptr, CB_BUFFER_SIZE );
+            status = WAITING;
             missed_pkg--;
-            xmemcpy( buffer, cb_rx_buffer, __CB_BUFFER_SIZE__ );
-            
-            /*
-            {
-              uint16_t e, p;
-              e = buffer[0];
-              e <<= 8;
-              e |= buffer[1];
-              p = buffer[2];
-              p <<= 8;
-              p |= buffer[3];
-              //if (e != (p+100)) {
-              if( ( buffer[0] == 0x14 ) && ( buffer[1] == 0x0a ) ) {
-                int i;
-                char s[400], ss[4];;
-                strcpy(s,"OPS-PKG:");
-                for (i=0; i<40; i++) {
-                  sprintf(ss," %02x",buffer[i]);
-                  strcat(s,ss);
-                }
-                debug_msg( s );
-              }
-            }
-            */
-            
-            if( debug_cpld ) {
-                rx = true;
-                tx = true;
-            }
+            xmemcpy( buffer, cb_rx_buffer, CB_BUFFER_SIZE );
 
             if( rx ) {
                 char str[ 1024 ];
                 strcpy( str, "RX :: \n\r " );
-                for( register uint16_t i = 0; i < __CB_BUFFER_SIZE__; i++ ) {
+                for( register uint16_t i = 0; i < CB_BUFFER_SIZE; i++ ) {
                     char tmp[ 16 ];
                     strcat( str, itoa( cb_rx_buffer[ i ], tmp, 16 ) );
                     if( ( i != 0 ) && !( ( i + 1 ) % 50 ) ) strcat( str, "\n\r " );
@@ -559,72 +123,70 @@
                 rx = false;
             }
 
-            data = __parse_vz_pkg__( &ext, &port, &type, buffer );
+            data = parse_vz_pkg ( &ext, &port, &type, buffer );
 
-            if( data != NULL ) {
+            if( data != NULL )
+            {
                 if( min_ext == 0 ) min_ext = ext;
 
                 if( ext > max_ext ) max_ext = ext;
 
                 if( ext < min_ext ) min_ext = ext;
                 
-                if( debug_fw ){
-                    fw_cbx_pkg( ext, port, ( char *)buffer );
-                }
+                if( debug_fw ){ fw_cbx_pkg( ext, port, ( char *)buffer ); }
                 
-                if( type == __TELEMETRY__ ) telemetry_counter++;
+                if( type == TELEMETRY ) telemetry_counter++;
 
-                if( type != __AUDIO__ ) {
+                if( type != AUDIO ) {
                     if( 
-                        type == __TELEMETRY__ || 
-                        type == __CB_STATS__ ||
-                        type == __FW1__ ||
-                        type == __FW2__ ||
-                        type == __FW3__ ||
-                        type == __FW4__ ||
-                        type == __FW5__ ||
-                        type == __FW6__
-                     ) type = __FW__;
+                        type == TELEMETRY || 
+                        type == CB_STATS ||
+                        type == FW1 ||
+                        type == FW2 ||
+                        type == FW3 ||
+                        type == FW4 ||
+                        type == FW5 ||
+                        type == FW6
+                     ) type = FW;
                     
                     if( debug_cb_rx == true ){
-                        send_msg("Pkg from CBx :: ( %d, %d ) -- Type :: %d", ext, port, type );
+                        send_msg("[%d %d] -- Type :: %d", ext, port, type );
                     }
 
                     Call_Box * cb = __find_CB__( v_cb, ext );
                     if( cb != NULL ) {
                         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 ) );
+                            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( debug_main ) debug_msg("Received ack pkg with seq_num %d", data[ 0 ] );
+                                if( debug_main ) debug_msg("[%d] Received ack pkg with seq_num %d", ext, 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->first_invite_response_ok();
+                                    case INVITE : {
+                                        if( debug_main || debug_invite ) debug_msg("[%d] Invite Ack - msg_id %d -- Cbx seqNum %d", ext, cb->get_msg_id(), data[ 0 ] );
                                         break;
                                     }
-                                    case __CB_BYE__ : {
-                                        if( debug_main || debug_invite ) debug_msg("BYE Ack from %d on msg_id %d", ext, cb->get_msg_id() );
+                                    case CB_BYE : {
+                                        if( debug_main || debug_invite ) debug_msg("[%d] BYE Ack - msg_id %d", ext, cb->get_msg_id() );
                                         cb->set_bye_response_ok();
                                         break;
                                     }
-                                    case __REGISTRY__ : {
-                                        if( debug_main || debug_aging ) debug_msg("Registry ACK from %d in pkg :: %d", ext, cb->get_msg_id() );
+                                    case REGISTRY : {
+                                        if( debug_main || debug_aging ) debug_msg("[%d] Registry ACK - msg_id %d", ext, cb->get_msg_id() );
                                         break;
                                     }
                                     default : {
-                                        if( debug_main || debug_aging ) debug_msg("ACK from %d in pkg :: %d :: type %d", ext, cb->get_msg_id(), type );
+                                        if( debug_main || debug_aging ) debug_msg("[%d] ACK msg_id :: %d :: type %d", ext, cb->get_msg_id(), type );
                                     }
                                 }
-                                if( type != __REGISTRY__ && type != __CB_BYE__ ) type = __DO_NOTHING__;
-                                if( type == __CB_BYE__ ){
+                                if( type != REGISTRY && type != CB_BYE && type != INVITE ) 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__;
+                                            if( debug_invite ) debug_msg("[%d] ack bye ignored", ext );
+                                            type = DO_NOTHING;
                                         }
                                     }
                                 }
@@ -632,11 +194,12 @@
                         }
                     }
                 }
-            } else type = __DO_NOTHING__;
+            } else type = DO_NOTHING;
         }
 
-        if( main_test == true ) {
-            main_test = false;
+        if( sizes == true )
+        {
+            sizes = false;
             send_msg("CB_New (%u) -- CB_Delete (%u)", cb_new_counter, cb_delete_counter );
             send_msg("SIP_New (%u) -- SIP_Delete (%u)", sip_new_counter, sip_delete_counter );
             send_msg("RTP_header_New (%u) -- RTP_header_Delete (%u)", rtp_header_new_counter, rtp_header_delete_counter );
@@ -646,6 +209,7 @@
             send_msg("Memory is %s", ( memory_is_over ) ? "Over" : "Ok" );
             send_msg("Missed_Pkg :: %d ::", missed_pkg );
             send_msg("Sizeof Sip :: %u", sizeof( Sip ) );
+            send_msg("Sizeof Call_Box :: %u", sizeof ( Call_Box ) );
             send_msg("Sizeof VZ_call :: %u", sizeof( VZ_call ) );
             send_msg("Sizeof RTP :: %u", sizeof( RTP ) );
             send_msg("Sizeof RTP_Header :: %u", sizeof( RTP_Header ) );
@@ -653,35 +217,7 @@
             send_msg("Sizeof Vector :: %u", sizeof( Vector ) );
             send_msg("Sizeof Timeslice :: %u", sizeof( Timeslice ) );
             send_msg("Sizeof Watchdog :: %u", sizeof( Watchdog ) );
-            //VZ_call * call = new VZ_call( 1234, 9876, 413, 12093 );
-            //v_call -> add ( call );
         }
-
-        //static int wdt_count = 0;
-        /*
-        if( registry_test == true ) {
-            registry_test = false;
-
-            if( wdt_count++ > 5 || v_cb->size() < 66 ) {
-                wdt_count = 0;
-
-                if( type == __DO_NOTHING__ ) {
-                    if( next_value < ( 5002 + __MAX_CB_IN_A_BRANCH__ - 2 ) ) {
-                        //type = __REGISTRY__;
-                        data = buffer;
-                        ext = next_value;
-                        port = next_value++;
-                    } else {
-                        if( nex_test_registry > ( 5002 + __MAX_CB_IN_A_BRANCH__ - 1 - 2 ) ) nex_test_registry = 5002;
-                        //type = __REGISTRY__;
-                        data = buffer;
-                        ext = nex_test_registry;
-                        port = nex_test_registry++;
-                    }
-                }
-            }
-        }
-        */
         
         if ( registra )
         {
@@ -700,19 +236,25 @@
                 Call_Box * cb = (Call_Box *)v_cb->get_element( i );
                 FD_SET( cb->get_sip_socket_fd(), &fdSet);
             }
-
+            
             /* Recepcao de pacotes UDP para atualizacao de callboxes */
             FD_SET( udp_bl_client.get_fd(), &fdSet);
             
             /* Recepcao de pacotes UDP para "tickagem" do watchdog */
             FD_SET( udp_wdt_client.get_fd(), &fdSet);
             
+            // adiciona o socket de comandos prompt-UDP-ETH
+            FD_SET( udp_client.get_fd(), &fdSet );
+            
+            // adiciona o socket de pedido de clock para o servidor
+            FD_SET( clock_sock.get_fd(), &fdSet );
+            
             struct timeval t;
             t.tv_sec = 0;
             t.tv_usec = 0;
             int ret = lwip_select( FD_SETSIZE, &fdSet, NULL, NULL, &t );
             
-                        if ((udp_bl_timer.read() > 30) and (bl_start_flag)) {
+            if ((udp_bl_timer.read() > 30) and (bl_start_flag)) {
                 udp_bl_timer.stop();
                 udp_bl_timer.reset();
                 bl_start_flag = 0;
@@ -727,7 +269,8 @@
                 }
             }
 
-            if(ret > 0 ) {
+            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();
@@ -850,17 +393,48 @@
                                 } else {
                                     bl_port = bl_peer;
                                 }
-                                send2callboxes( __build_cb_package__( bl_peer, bl_port, __BOOTLOADER_CBX__,bl_cbx_buffer, 0, BL_SIZE + 1, write_buffer) );
+                                send2callboxes( build_cb_package( bl_peer, bl_port, BOOTLOADER_CBX,bl_cbx_buffer, 0, BL_SIZE + 1, write_buffer) );
                             }
                         }
                     }
                 }
                 
+                // verifica o socket do prompt-UDP-ETH                
+                if( FD_ISSET( udp_client.get_fd(), &fdSet ) ) {
+                    char to_prompt_process[ PROMPT_UDP_COMMAND_SIZE ];
+                    for( register int i = 0; i < PROMPT_UDP_COMMAND_SIZE; i++ ) to_prompt_process[ i ] = 0;
+                    
+                    int prompt_process_msg_rcv = udp_client.receiveFrom( udp_server, to_prompt_process, ( sizeof( to_prompt_process ) - 1 ) );
+                    
+                    to_prompt_process[ prompt_process_msg_rcv ] = 0;
+                    if( prompt_process_msg_rcv == -1 )
+                    {
+                        if( debug_reconnect ) send_msg("Reconnect Prompt Process");
+                        reconnect_udp_prompt_process();
+                        miss_prompt_udp_rcv_pkg++;
+                    } 
+                        else if( prompt_process_msg_rcv > 0 )
+                    {
+                        udp_query = true;
+                        prompt_process( to_prompt_process, prompt_process_msg_rcv );
+                    }
+                } 
+                
+                // verifica o socket do watchdog
                 if( FD_ISSET( udp_wdt_client.get_fd(), &fdSet ) ) {
                     char wake_msg[ 768 ];
                     Endpoint udp_wdt_server;
                     
-                    if( udp_wdt_client.receiveFrom( udp_wdt_server, wake_msg, sizeof( wake_msg ) ) > 0 ){
+                    int wake_msg_rcv = udp_wdt_client.receiveFrom( udp_wdt_server, wake_msg, sizeof( wake_msg ) );
+                    
+                    if( wake_msg_rcv == -1 )
+                    {
+                        if( debug_reconnect ) send_msg("Reconnect Extern wdt");
+                        reconnect_extern_wdt_socket();
+                        miss_wdt_send_pkg++;
+                    } 
+                        else if( wake_msg_rcv > 0 )
+                    {
                         if( !( strncmp( wake_msg, "alive", 5 ) ) ) {
                             // Just ckeck but not set 'alive?'
                             // 'alive*' - force wdt tick right now
@@ -868,15 +442,7 @@
                             bool question_alive = ( wake_msg[ 5 ] == '?' );
                             if( wake_msg[ 5 ] == '*' ) wdt.kick();
                             
-                            /*
-                            uint8_t registered_cbx = v_cb->size();
-                            for( register int i = 0; i < v_cb->size(); i++ ){
-                                Call_Box * cb = (Call_Box * )v_cb->get_element( i );
-                                if( cb->is_timeout() ){ if( registered_cbx ) registered_cbx--; }
-                            }
-                            */
-                            
-                            snprintf( wake_msg, 48,"wdt:%u,%u,%u,%c,%u,%u,%u,%u,%u:", 
+                            snprintf( wake_msg, ( 768 - 1 ),"wdt:%u,%u,%u,%c,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u:", 
                                 uptime, 
                                 invite_counter, 
                                 external_wdt, 
@@ -885,23 +451,63 @@
                                 v_cb->size(),
                                 ts->remain_timeslices(), 
                                 sip_socket_send_failure, 
-                                v_call->size()
-                            //    registered_cbx
+                                v_call->size(),
+                                pkg_cksok,
+                                pkg_ckserr,
+                                pkg_zero,
+                                out_of_range,
+                                missed_pkg,
+                                delayed_pkg_to_cb,
+                                cpld_pkg_tx_counter,
+                                cpld_pkg_rx_counter,
+                                eth_wdt,
+                                pkg_wdt,
+                                miss_fw_send_pkg,
+                                miss_prompt_udp_send_pkg,
+                                miss_sip_registry_send_pkg,
+                                miss_sip_invite_send_pkg,
+                                miss_sip_bye_send_pkg,
+                                miss_sip_unregistry_send_pkg,
+                                miss_sip_ok_send_pkg,
+                                miss_sip_rcv_bye_send_pkg,
+                                miss_wdt_send_pkg,
+                                miss_prompt_udp_send_pkg,
+                                miss_ftp_udp_send_pkg,
+                                miss_prompt_udp_rcv_pkg,
+                                miss_closk_send_pkg
                             );
+            
                             wake_msg[ 768 - 1 ] = 0;
-                            udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) );
+                            int send = udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) );
+                            if( send != strlen( wake_msg ) )
+                            {
+                                if( debug_reconnect ) debug_msg("Reconnect Extern wdt (%d, %d)", send, strlen( wake_msg ) );
+                                reconnect_extern_wdt_socket();
+                                miss_wdt_send_pkg++;
+                            }
         
-                            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 ) ) ) {
                                 external_wdt = EXTERN_WDT_IDLE;
                             }
                         } else if( !( strncmp( wake_msg, "reset", 5 ) ) ) {
                             external_wdt = 0;
         
                             sprintf( wake_msg, "rst:%u:", uptime );
-                            udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) );
+                            int send = udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) );
+                            if( send != strlen( wake_msg ) )
+                            {
+                                if( debug_reconnect ) send_msg("Reconnect Extern wdt");
+                                reconnect_extern_wdt_socket();
+                                miss_wdt_send_pkg++;
+                            }
                         }
                     }
                 }
+                
+                if( FD_ISSET( clock_sock.get_fd(), &fdSet ) )
+                {
+                    update_clock ();
+                }
             }
         }
         
@@ -948,7 +554,7 @@
             dshow_rtp = false;
             send_msg(":: RTP :: %u", v_cb->size() );
             
-            int ext_list[ __MAX_CB_IN_A_BRANCH__ ];
+            int ext_list[ MAX_CB_IN_A_BRANCH ];
                 
             if( v_cb->size() >= 1 ) {
                 for( register int i = 0; i < v_cb->size(); i++ )
@@ -1784,17 +1390,86 @@
             pcks_s = true;
         }
 
+        // exibe os contadores de cks de pacotes recebidos na interface CBx->Header, e outros contadores relacionados
         if( pcks_s == true ) {
-            send_msg("PKG_CKS OK: %d :: PKG_CKS ERR: %d :: PKG_0: %d :: Out_of_range: %d :: Miss_Pkg :: %d"
-            "\n\r> TX_delayed :: %d :: TX_Counter :: %d :: RX_Counter :: %d", pkg_cksok, pkg_ckserr, pkg_zero, out_of_range, missed_pkg, delayed_pkg_to_cb, cpld_pkg_tx_counter, cpld_pkg_rx_counter  );
+            send_msg( 
+                "\r\n"
+                "   PKG_CKS OK: %d ( %003.2f )\r\n"
+                "   PKG_CKS ERR: %d ( %003.2f )\r\n"
+                "   PKG_0: %d ( %003.2f )\r\n"
+                "   Out_of_range: %d ( %003.2f )\r\n"
+                "   Miss_Pkg: %d\r\n"
+                "   TX_delayed: %d\n\r"
+                "   TX_Counter: %d\n\r"
+                "   RX_Counter: %d\r\n",
+                pkg_cksok, ( cpld_pkg_rx_counter  == 0 ) ? 0.00 : ( (  double ) pkg_cksok / cpld_pkg_rx_counter ) * 100, 
+                pkg_ckserr, ( cpld_pkg_rx_counter  == 0 ) ? 0.00 : ( ( double ) pkg_ckserr / cpld_pkg_rx_counter ) * 100, 
+                pkg_zero, ( cpld_pkg_rx_counter  == 0 ) ? 0.00 : ( ( double ) pkg_zero / cpld_pkg_rx_counter ) * 100, 
+                out_of_range, ( cpld_pkg_rx_counter  == 0 ) ? 0.00 : ( ( double ) out_of_range / cpld_pkg_rx_counter ) * 100, 
+                missed_pkg, 
+                delayed_pkg_to_cb, 
+                cpld_pkg_tx_counter, 
+                cpld_pkg_rx_counter 
+            );
             pcks_s = false;
         }
+        
+        // zera os contadores de pacotes que resultaram em falha de envio vio ETH
+        if( reset_missed_send_udp_pkg ){        
+            miss_fw_send_pkg = 0;                                                                                                                 
+            miss_prompt_udp_send_pkg = 0;                                                                                                         
+            miss_sip_registry_send_pkg = 0;                                                                                                       
+            miss_sip_invite_send_pkg = 0;                                                                                                         
+            miss_sip_bye_send_pkg = 0;                                                                                                            
+            miss_sip_unregistry_send_pkg = 0;                                                                                                     
+            miss_sip_ok_send_pkg = 0;                                                                                                             
+            miss_sip_rcv_bye_send_pkg = 0;
+            miss_wdt_send_pkg = 0;
+            miss_prompt_udp_send_pkg = 0;
+            miss_ftp_udp_send_pkg = 0;
+            miss_prompt_udp_rcv_pkg = 0;
+            reset_missed_send_udp_pkg = false;
+            missed_send_udp_pkg = true;
+        }
+        
+        // exibe estatisticas de pacotes que resultaram em falha de envio na interface ETH
+        if( missed_send_udp_pkg )
+        {
+            send_msg(   "\r\nMissed pkgs ::\r\n "
+                        "FW: %d\r\n "
+                        "Prompt UDP %d\r\n "
+                        "Registry %d\r\n "
+                        "Invite %d\r\n "
+                        "Bye %d\r\n "
+                        "Unregistry %d\r\n "
+                        "UDP incoming ( invite ans ) %d\r\n "
+                        "UDP incoming ( bye from * ) %d\r\n "
+                        "Wdt [ alive | rst ] %d\r\n "
+                        "Rcv prompt %d\r\n "
+                        "[ debug | send ]_msg %d\r\n "
+                        "RTP %d\r\n", 
+                miss_fw_send_pkg, 
+                miss_prompt_udp_send_pkg, 
+                miss_sip_registry_send_pkg, 
+                miss_sip_invite_send_pkg, 
+                miss_sip_bye_send_pkg, 
+                miss_sip_unregistry_send_pkg, 
+                miss_sip_ok_send_pkg, 
+                miss_sip_rcv_bye_send_pkg, 
+                miss_wdt_send_pkg, 
+                miss_prompt_udp_send_pkg,
+                miss_prompt_udp_rcv_pkg,
+                miss_ftp_udp_send_pkg 
+            );
+            
+            missed_send_udp_pkg = false;
+        }
 
         if( flood_bug_pkg ){
             static int id = 0x10;
             if( id < 10 ) id = 0x0b;
-            send2callboxes( __build_cb_package__( 5828, 5123, __REGISTRY__,
-                ( char * )buffer, id++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );    
+            send2callboxes( build_cb_package( 5828, 5123, REGISTRY,
+                ( char * )buffer, id++, CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );    
         }
         
         if( led_sync_timer.read() > 1 ) {
@@ -1802,195 +1477,153 @@
             led3 = !led3;
             CAB_LED = !CAB_LED;
         }
-        
-        static int test_ext = 5102;
-        static int test_port = 5102;
-        
-        if ( tango )
-        {   
-            if ( v_cb -> size () >= 27 )
-            {
-                tango = false;    
-                test_timer.start ();
-            }    
-                
-            ext = test_ext++;
-            port = test_port++;
-            type = __REGISTRY__;
-            data = buffer;
-        }
-        
-        if( v_cb -> size () >= 27 )
-        {
-            if( ( test_timer.read_ms () > 500 ) && ( type == __DO_NOTHING__ ) )
-            {
-                if( test_ext >= ( 5102 + 26 ) ) test_ext = 5102;
-                if( test_port >= ( 5102 + 26 ) ) test_port = 5102;
-
-                ext = test_ext++;
-                port = test_port++;
-                type = __REGISTRY__;
-                data = buffer;
-                test_timer.reset ();
-            }    
-        }
 
         switch( type ) {
-            case __DO_NOTHING__ :
+            case DO_NOTHING :
             {}
             break;
 
-            case __CB_BYE__ : {
+            case CB_BYE : {
                 cb_bye_counter++;
                 Call_Box * cb = __find_CB__( v_cb, ext );
                 if( cb != NULL ) {
-                    if( debug_invite || debug_main ) debug_msg("Received bye pkg with msg_id %d e pkg_id %d", cb->get_msg_id(), data[ 0 ] );
-                    data[ 0 ] |= BIT7;
-                    cb->set_msg_id( data[ 0 ] );
-                    if( debug_main || debug_invite ) debug_msg( "Request bye from CBx " );
+                    if( debug_invite || debug_main ) debug_msg("[%d] Bye pkg - msg_id %d e pkg_id %d", ext, cb->get_msg_id(), data[ 0 ] );
                     
                     bool already_removed = true;
-                    for( register uint8_t i = 0; i < v_call->size(); i++ ) {
+                    
+                    if( cb->get_status() != cb_idle ) {
+                        already_removed = false;
+                    
+                        data[ TIMESLICE_PLACE ] = 0;
+                    
+                        send2callboxes( build_cb_package( ext, port, CB_BYE,
+                            ( char * )data, data[ 0 ] |= BIT7, CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
+                    
+                        ts->return_timeslice( cb->call_end () );
+                    }
+    
+                    if( already_removed ) if( debug_main || debug_invite ) debug_msg( "[%d] Already removed from inviting queue", ext );
+                    
+                    already_removed = true;
+                    
+                    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() == ext ) {
+                        if( call->get_cb_ext() == ext )
+                        {
                             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 );
+                            
+                            data[ TIMESLICE_PLACE ] = 0;
 
                             v_call->remove_element( i );
+
+                            send2callboxes( build_cb_package( ext, port, CB_BYE,
+                                ( char * )data, data[ 0 ] |= BIT7, 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() + 1 ) & ~BIT7 );
-
-                            send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
-                                ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
-                              
-                            // 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();
+                            
+                            ts->return_timeslice( cb->call_end () );
                         }
                     }
-                    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;
+   
+                    if( already_removed ) if( debug_main || debug_invite ) debug_msg( "[%d] Already removed from vector call", ext );
 
-                                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->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
-
-                                //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 );
+                    cb -> registry();
+                    
+                } else if( debug_invite || debug_main ) debug_msg("[%d] Bye from who ?", ext );
             }
             break;
 
-            case __INVITE__ : {
+            case INVITE : {
                 if( drop_invite_pkg ){
-                    debug_msg("Dropando invite pck msg id :: %d", data[ 0 ] );
+                    debug_msg("[%d] Dropando invite pck - msg id :: %d", ext, data[ 0 ] );
                     break;
                 }
+                
                 invite_counter++;
-                if( debug_invite ) debug_msg("Request Invite received from Cbx %i", ext);
+                
+                if( debug_invite ) debug_msg("[%d] Invite request", ext);
+                
                 Call_Box * cb = __find_CB__( v_cb, ext );
+              
                 if( cb == NULL ) {
-                    if( v_cb->size() < __MAX_CB_IN_A_BRANCH__ ) {
-                        if( debug_main ) debug_msg( "Adding CBx :: %i", ext );
+                    if( v_cb->size() < MAX_CB_IN_A_BRANCH ) {
+                        if( debug_main ) debug_msg( "[%d] Adding CBx", ext );
                         cb = new Call_Box( ext, port );
 
                         if( cb == NULL ) {
                             memory_is_over = true;
-                            if( debug_memory ) debug_msg("Invite allocation cb fail");
+                            if( debug_memory ) debug_msg("[%d] Invite allocation cb fail", ext );
                         } else {
                             v_cb->add( cb );
                         }
                     }
                 }
-                if( cb != NULL ) {
+              
+                if( cb != NULL )
+                {
+                    cb->invite_retry_count_reset();
+                    
                     cb->set_msg_id( data[ 0 ] );
-                    if( cb->status == cb_idle ){
-                        cb->set_invite_response_ok();
-                        cb->invite_retry_count_reset();
+                    
+                    if( cb->status == cb_idle ){ 
+                        cb -> call_config ();
+                    } else {
+                        data[ TIMESLICE_PLACE ] = cb->get_timeslice();
+                        
+                        cb->set_invite_response_pending();    
+                            
+                        send2callboxes( build_cb_package( ext, port, INVITE, 
+                            ( char * )data, cb->msg_id_update (), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );    
                     }
+                    
                     invite_handler( v_call, v_cb, ts, cb );
                 }
             }
             break;
-            case __REGISTRY__ : {
+            case REGISTRY : {
                 registry_counter++;
                 Call_Box * cb = __find_CB__( v_cb, ext );
-                if( v_cb->size() < __MAX_CB_IN_A_BRANCH__ ) {
-                    if( cb == NULL ) {
-                        if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
+                
+                if( cb == NULL )
+                {
+                    if( v_cb->size() < MAX_CB_IN_A_BRANCH )
+                    {
+                        if( debug_main ) debug_msg("[%d] Adding Cbx", ext );
                         cb = new Call_Box( ext, port );
 
                         if( cb == NULL ) {
                             memory_is_over = true;
-                            if( debug_memory ) debug_msg("Registry cb allocation fail");
+                            if( debug_memory ) debug_msg("[%d] Registry cb allocation fail", ext );
                         } else {
                             v_cb->add( cb );
-                            if( debug_main ) debug_msg("Added CBx -- %d", ext );
+                            if( debug_main ) debug_msg("[%d] Added CBx", ext );
                         }
                     }
                 }
-                if( debug_main ) debug_msg("Registered %d - %d", ext, port );
+                
+                if( debug_main ) debug_msg("[%d %d] Registered", ext, port );
 
                 if( cb != NULL ) cb->registry();
-
             }
             break;
-            case __BOOT__ : {
+            case BOOT : {
                 boot_counter++;
                 if( debug_boot == true ){
-                    send_msg("Rcv boot pkg from (%d, %d) pkg-id %d", ext, port, data[ 0 ] );    
+                    send_msg("[%d %d] Boot pkg -- pkg-id %d", ext, port, data[ 0 ] );    
                 }
-                send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
-                    ( char * )data, data[ 0 ] | BIT7, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+                send2callboxes( build_cb_package( ext, port, REGISTRY,
+                    ( char * )data, data[ 0 ] | BIT7, CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
             }
             break;
             
-            case __TELEMETRY__ : {
-                if( debug_telemetry ) send_msg("::Telemetry from %d - %d::", ext, port );
-                build_telemetry_report( ext, port, ( char *)data );
-            }
-            break;
-            
-            case __FW__ : {
-                if( debug_fw_print ) send_msg("::FW pkg from %d - %d::", ext, port );
+            case FW : {
+                if( debug_fw_print ) send_msg("[%d %d]::FW pkg::", ext, port );
                 fw_cbx_pkg( ext, port, ( char *)buffer );
             }
             break;
 
-            case __BOOTLOADER_CBX__ : {
+            case BOOTLOADER_CBX : {
                 uint16_t bl_cnt2 = 0;
                 //char bl_send_buffer[ BL_SIZE + 2 ];
                 //int ret = bl_cbx_reply_to_eth( ext, ( char * )data );
@@ -2032,31 +1665,30 @@
             }
             break;
 
-            case __PROMPT__ : {
+            case PROMPT : {
                 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 ) );
-
-                    if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
-                    cb = new Call_Box( ext, port );
-                    if( cb == NULL ){
-                        memory_is_over = true;
-                    }else{
-                        v_cb->add( cb );
-                        if( debug_main ) debug_msg("Added CBx -- %d", ext );
+                    if( v_cb->size() < MAX_CB_IN_A_BRANCH ) {
+                        if( debug_main ) debug_msg("[%d] Adding Cbx", ext );
+                        cb = new Call_Box( ext, port );
+                        if( cb == NULL ){
+                            memory_is_over = true;
+                        }else{
+                            v_cb->add( cb );
+                            if( debug_main ) debug_msg("[%d] Added CBx", ext );
+                        }
                     }
                 }
 
                 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 );
+                    if( debug_ping ) send_msg( "[%d %d] Prompt pkg :: Ping", ext, port );
                 } else {
                     prompt_counter++;
                     //fixme isso nao poderia ser resolvido com um sendmsg ?
-                    send_msg( "Prompt pkg from ( %i, %i ) ::", ext, port );
+                    send_msg( "[%i, %i] Prompt pkg::", ext, port );
                     for( register uint8_t i = 0; i < 32; i++ ) {
                         if( debug_uart3 ) pc.printf("%c", data[ i ] );
                         if( i == 15 ) if( debug_uart3 ) pc.printf( "\r\n" );
@@ -2064,8 +1696,8 @@
                     if( debug_uart3 ) pc.printf("\n\r> ");
 
                     if( tcp_session ) {
-                        char aux[ __CB_BUFFER_SIZE__ + 3 ];
-                        strncpy( aux, (char * )data, __CB_BUFFER_SIZE__ );
+                        char aux[ CB_BUFFER_SIZE + 3 ];
+                        strncpy( aux, (char * )data, CB_BUFFER_SIZE );
                         strcat( aux, "\n\r\0" );
                         tcp_client.send_all( ( char *)data, strlen( (char * )data ) );
                         tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) );
@@ -2073,35 +1705,39 @@
                 }
             }
             break;
-            case __AUDIO__ : {
+            case AUDIO : {
                 audio_counter++;
+                if ( received_audio_from_cb ) {
+                    debug_msg("[%d] audio pkg", ext );    
+                }
+                
                 VZ_call * call = __find_Call__( v_call, ext );
                 if( call != NULL ) {
-                    if ( drop_rtp_from_cbx_pkg )
-                    {
+                    if ( drop_rtp_from_cbx_pkg ){
                         led2 = !led2;
                         break;
-                    }
-                        else
-                    {
+                    } else {
                         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->set_invite_response_ok();
-                            cb->invite_retry_count_reset();
-                        }
                     }
-                } else {
-                    if( debug_main ) debug_msg("received missed package  from CBx :: %i", ext );
+                } 
+                
+                Call_Box * cb = __find_CB__( v_cb, ext );       
+                if( cb != NULL ){
+                    if ( cb->get_invite_response() == false ) {
+                        cb->set_invite_response_ok();
+                        cb->invite_retry_count_reset();
+                    } else {
+                        if( debug_main ) debug_msg("[%d] received missed package", ext );       
+                    }
                 }
             }
             break;
         }// fim switch
         
         { // rajada
-            if( invite_retry_timer.read_ms() > 30 )
+            if( invite_retry_timer.read_ms() >= 20 )
             {
                 invite_retry_timer.reset();
 
@@ -2131,37 +1767,47 @@
                     {
                         cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
 
-                        buffer[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
+                        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,  %d )", cb->get_ext(), cb->get_port() );
-                    }
-                        
-                    if( cb->get_invite_retry_count() == 0 )
-                    {
-                        cb->send_bye();
+                        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 ) );
 
-                        ts->return_timeslice( cb->get_timeslice() );
-                        cb->set_timeslice( 0x00 );
-
-                        cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
-
-                        for( register uint8_t i = 0; i < v_call->size(); i++ )
+                        if( debug_invite ) debug_msg("[%d] resend invite OK to Cbx : ( %d,  %d )", cb->get_ext(), cb->get_ext(), cb->get_port() );
+                    } 
+                    
+                    if ( __find_Call__( v_call, cb->get_ext () ) == NULL )
+                    {
+                    
+                        if ( ( ( cb->status == cb_ringing ) || ( cb->status == cb_trying ) ) )
                         {
-                            VZ_call * call = ( VZ_call * )v_call->get_element( i );
-                            if( call->get_cb_ext() == cb->get_ext() )
+                                char rtp_src_tmp_write_buffer [ CB_BUFFER_SIZE ];
+                                uint8_t rtp_dst_tmp_write_buffer [ CB_BUFFER_SIZE ];
+                                
+                                for ( register int i = 0; i < RTP_MSG_SIZE; i++ ) rtp_src_tmp_write_buffer [ i ] = 'U'; // 0x55
+                                
+                                send2callboxes( build_cb_package( cb->get_ext (), cb->get_port (), AUDIO, 
+                                    rtp_src_tmp_write_buffer, AUDIO, RTP_MSG_SIZE, rtp_dst_tmp_write_buffer ) );
+                        } else {
+                            if ( cb->get_invite_retry_count() == 0 )
                             {
-                                v_call->remove_element( i );
-                                if( call != NULL ) delete( call );
-                                break;
+                                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;
+                                    }
+                                }
+                                
+                                ts->return_timeslice( cb->call_end () );
+                                
+                                if( debug_invite ) debug_msg( "[%d]-- No audio pkgs --", cb->get_ext () );
                             }
                         }
-
-                        if( debug_invite ) debug_msg( "-- No audio pkgs --" );
-                        set_status( cb->status, cb_idle );
-                        set_status( cb->sip->status, sip_idle );
                     }
                 }
             }          
@@ -2169,65 +1815,57 @@
 
         for( register uint8_t i = 0; i < v_call->size(); i++ ) {
             VZ_call * call = ( VZ_call * )v_call->get_element( i );
-            int length = 0;
-            char * tmp = call->get_eth_message( &length );
-            if( tmp != NULL ) {
-                int cb_port = 0xffff;
-                Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
-
-                if( cb != NULL ) {
-                    cb_port = cb->get_port();
-                    
-                    if ( drop_rtp_from_ast_pkg )
-                    {
-                        led1 = !led1;
-                    }
-                        else
-                    {
-                        uint8_t * pkg2cb = __build_cb_package__( call->get_cb_ext(), cb_port, __AUDIO__,
-                            tmp, __AUDIO__, length, write_buffer );
-                            
-                        send2callboxes( pkg2cb );
-                    }
-                    
-                } else if( debug_main ) debug_msg("received missed package  from CBx :: %i -- Type :: %i", ext, type );
+            if ( call != NULL )
+            {
+                int length = 0;
+                char * tmp = call->get_eth_message( &length );
+                if( tmp != NULL ) {
+                    int cb_port = 0xffff;
+                    Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
+    
+                    if( cb != NULL ) {
+                        cb_port = cb->get_port();
+                        
+                        if ( drop_rtp_from_ast_pkg )
+                        {
+                            led1 = !led1;
+                        }
+                            else
+                        {
+                            uint8_t * pkg2cb = build_cb_package( call->get_cb_ext(), cb_port, AUDIO,
+                                tmp, AUDIO, length, write_buffer );
+                                
+                            send2callboxes( pkg2cb );
+                        }
+                        
+                    } else if( debug_main ) debug_msg("[%d] received missed package -- Type :: %i", ext, type );
+                }
             }
         }
-        
-        //if( v_call->size() == 0 ) refresh( v_cb, buffer, write_buffer, NULL );
 
         if( timer_sync_refresh.read_ms() > 250 ) {
             timer_sync_refresh.reset();
 
-            static uint8_t mode = TIME_TO_REFRESH;
+            static uint8_t time_to_mode = TIME_TO_REFRESH;
 
-            if( mode == TIME_TO_REFRESH ) {
-                mode = TIME_TO_WAKE_UP;
-                refresh( v_cb, buffer, write_buffer, NULL );
+            if ( time_to_mode == TIME_TO_REFRESH ){
+                time_to_mode = TIME_TO_WAKE_UP;
+                refresh ( v_cb );
             } else {
-                mode = TIME_TO_REFRESH;
-                if( wake_all ) if( v_call->size() == 0 ) wake_all_up( v_cb, buffer, write_buffer );
+                time_to_mode = TIME_TO_REFRESH;
+                if ( wake_all ) if ( v_call->size() == 0 ) wake_all_up ( v_cb );
             }
         }
 
-
-        //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 );
-
         // check sip messages only for cbx in call ?
         int ext_to__be_removed = sip_manager( v_cb );
-        if( ext_to__be_removed > 0x00 ) {
+        if( ext_to__be_removed > 0 ) {
             Call_Box * cb = __find_CB__( v_cb, ext_to__be_removed );
             if( cb != NULL ) {
-                if( cb->status == cb_on_call ) {
-                    ts->return_timeslice( cb->get_timeslice() );
-                    cb->set_timeslice( 0x00 );
-                    buffer[ __TIMESLICE_PLACE__ ] = 0x00;
-
-                    set_status( cb->status, cb_idle );
-                    set_status( cb->sip->status, sip_idle );
+                //if( cb->status == cb_on_call ) // poderia ser if( cb->status != cb_idle ) ???
+                if( cb->status == cb_on_call )
+                {
+                    buffer[ TIMESLICE_PLACE ] = 0;
 
                     for( register uint8_t i = 0; i < v_call->size(); i++ ) {
                         VZ_call * call = ( VZ_call * )v_call->get_element( i );
@@ -2236,28 +1874,24 @@
                             delete( call );
                         }
                     }
-
-                    //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() );
+                    
+                    ts->return_timeslice( cb->call_end ( false ) );
 
-                    send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
-                        ( char * )buffer, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
-                        
-                    if( debug_invite ) debug_msg("Received Bye from *");
-                    //cb->re_start_timer();
+                    send2callboxes( build_cb_package( cb->get_ext (), cb->get_port (), CB_BYE,
+                        ( char * )buffer, cb->get_msg_id(), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
+                    
+                    if( debug_invite ) debug_msg("[%d] Received Bye from *", cb->get_ext () );
                 }
-            } else if( debug_main ) debug_msg("Missed bye request from * CBx :: %d", ext );
+            } else if( debug_main ) debug_msg("[%d] Missed bye request", ext_to__be_removed );
         }
 
         /* Verifica andamento de ligações para eventualmente encerra-las por timeout */
-        call_manager( v_call, v_cb, buffer, write_buffer, ts );
+        call_manager( v_call, v_cb, ts );
 
         /* tratamento de pedidos de ligação */
         invite_handler( v_call, v_cb, ts, NULL );
 
-                /* rotina de verificação de TS's perdidos */
+        /* rotina de verificação de TS's perdidos */
         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++ ) {
@@ -2276,10 +1910,8 @@
                 ts->reset();
             }
         }
-
         
         /* rotina "zeradora" de portas RTP */
-        /*
         for ( register uint8_t i = 0; i < v_cb->size(); i++ )
         {
             Call_Box * cb = (Call_Box *) v_cb->get_element (i);
@@ -2287,7 +1919,7 @@
             {
                 if (  ( cb->get_status () == cb_idle ) && ( cb->get_sip_status () == sip_idle ) && ( cb -> is_rtp_timer_timeout () ) )
                 {
-                    if ( debug_rtp ) debug_msg( "%d rtp reset", cb -> get_ext () );
+                    if ( debug_reset_rtp ) debug_msg( "[%d] rtp reset", cb -> get_ext () );
                     set_status ( cb -> status, cb_idle );
                     set_status ( cb->sip->status, sip_idle );
                     cb -> reset_rtp_timer ();
@@ -2295,17 +1927,11 @@
                 }
             }
         }
-        */
-
-        //invite_pgk_retry_manager( v_call, v_cb, buffer, write_buffer );
-
-        /* escuta se existe algum procedimento de gravação de cbx */
-        //bl_handler();
 
         /* rotina que esvazia possiveis pacotes que não foram transmitidos para evitar conflito */
         tx_buffer_ring_buffer_handler();
 
-        type = __DO_NOTHING__;
+        type = DO_NOTHING;
 
         if( eth_status == 0 ) eth_wdt = ETH_CONNECT_TIMEOUT;
 
@@ -2315,6 +1941,8 @@
             //invite_retry_time = true;
 
             uptime++;
+            
+            current_time++;
 
             wdt_timer.reset();