Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

main.cpp

Committer:
klauss
Date:
2015-11-24
Revision:
137:32dd35a6dbc9
Parent:
136:2da626f30efa

File content as of revision 137:32dd35a6dbc9:

#include "main_app_functions.h"
#include "main_app_var_configs.h"

int main()
{
    debug_uart3 = true;
    
    int header_app_init_ret = header_app_init ();
    
    vz_printf ( "header_app_init %s" , ( header_app_init_ret  == 0 ) ? "Ok" : "Failure" );
    
    if ( header_app_init_ret == 0 ) vz_printf ("Ready");
    
    debug_uart3 = false;
    
    power_source_timer.start ();
    
    bool init_test = true;
    bool end_test = false;
    
    bool init_test_mean = true;
    bool end_test_mean = false;
    Timer timer;
    
    /*------------------------------------------ main loop ---------------------------------------------------------------*/
    
    while( true )
    {   
        if ( main_test_mean )
        {
            const uint16_t u16_COUNT_TIMES = 60000;
            
            static uint16_t count = u16_COUNT_TIMES;
            
            static uint64_t u_sum = 0;
            
            if ( init_test_mean )
            {
                u_sum = 0;
                count = u16_COUNT_TIMES;
                
                init_test_mean = false;
                
                timer.start ();
                timer.reset ();
            } 
                else if ( count  )
            {
                count--;
                
                timer.stop ();
                
                u_sum += timer.read_us ();
                
                timer.start ();
                timer.reset ();
                   
                if ( count == 0 ) end_test_mean = true;
            } 
                else if ( end_test_mean )
            {
                vz_printf ( "Elapsed_time_mean : [ %.2lfu ]", double ( u_sum / u16_COUNT_TIMES ) );
                
                end_test_mean = false;    
                init_test_mean = true;
                main_test_mean = false;
                
                timer.stop ();
            }
        }
        
        if ( main_test )
        {
            if ( init_test )
            {
                init_test = false;
                end_test = true;    
                timer.start ();
                timer.reset ();
            } else if ( end_test )
            {
                timer.stop ();
                int u_elapsed_time = timer.read_us ();
                int m_elapsed_time = timer.read_ms ();
                int s_elapsed_time = timer.read ();
                
                vz_printf ( "Elapsed_time : [ %du, %dm, %ds ]", u_elapsed_time, m_elapsed_time, s_elapsed_time );
                
                end_test = false;    
                init_test = true;
                main_test = false;
            }
        }
    
        prompt_process ( NULL, 0 );
        
        if ( cm -> was_modified () ) 
        { 
            update_config_values (); 
            cm -> set_modified_false ();
        }
        
        if ( show_last_rx )
        {
            if ( v_call -> size () == 0 ) show_last_rx_pkg_from_cbx ();
            show_last_rx = false;    
        }
        
        if ( show_last_tx )
        {
            if ( v_call -> size () == 0 ) show_last_tx_pkg_from_cbx ();
            show_last_tx = false;    
        }
        
        if ( show_hello_status )
        {
            show_hello_status_function ();
            show_hello_status = false;    
        }
        
        if( v_cb->size() > max_registered_cbx ) max_registered_cbx = v_cb->size();

        if ( sync_timer.read() > 5 )
        {
            sync_timer.reset();

            if( debug_cks == true ) { pcks_s = true; }

            if( debug_alive == true ) { pshowcb = true; }
            
            if( !( ++count % 15 ) ) {
                if( eth_status ) {
                    try_reconnect_with_eth ();
                }
            }
            
            //35 sec.
            if( ( count > 7 ) and ( wake_all == false ) and ( not wake_all_disable ) and ( cm -> get_cbx_wake_mode () ) ) {
                wake_all = true;
                if( debug_wake == true ) vz_printf ( "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; }

        }
        
        if ( show_wake_all_up_status )
        {
            vz_printf ( "wake_all_up status :: %s", ( wake_all ) ? "Enable" : "Disable" );
            show_wake_all_up_status = false;    
        }
        
        check_clock ();

        if ( r_stats )
        {
            reset_stats ();
            stats = true;
            r_stats = false;
        }

        if ( stats )
        { 
            show_stats ();
            stats =false;
        }

        if ( list ) 
        {
            show_cb_list ( v_cb );
            list = false;
        }

        if ( long_list ) 
        {
            show_cb_long_list ( v_cb, show_time, show_invites );
            long_list = false;
            show_time = false;
            show_invites = false;
        }
        
        if ( pshowcb ) 
        {
            show_cb ( v_cb );
            pshowcb = false;
        }
        
        if ( request_clock_now )
        {
            request_clock_to_server ();
            show_current_time = true;
            request_clock_now = false;    
        }
        
        if ( show_current_time ) 
        {  
            show_clock ();
            show_current_time = false;;
        }
        
        if( show_sip ){
            show_cb_sip ( v_cb );
            show_sip = false;
        } 

        if( pflood == true ) flood();

        if( debug_eth ) {
            vz_printf ("Eth status %s", ( eth_status == 0 ) ? "Connected" : "Disconnected" );
            debug_eth = false;
        }
          

        // chechando se existe um pacote vindo do cbx pendente
        if( status != WAITING ) 
        {
            process_received_pkg_from_cbx ();
        } 
            else if ( test_ts and test_ts_timer.read_ms () > 10 )
        {
            if ( v_cb -> size () not_eq 0 )
            {
                Call_Box * cb = ( Call_Box * ) v_cb -> get_element ( 0 );
                if ( cb not_eq NULL )
                {
                    ext = cb -> get_ext ();
                    port = cb -> get_port ();     
                } 
            }
                else
            {
                ext = 5000;
                port = 5000;
            }
                
            type = INVITE;
            data = buffer;
            
            test_ts_timer.reset ();
        }
            else if ( simulate )
        {
            simulate = false;
            
            data = buffer;
            
            data [ SEQ_NUM_PLACE ] = seq_num_to_simulate;
            
            ext = ext_to_simulate;
            
            port = port_to_simulate;
            
            type = num_type_to_simulate;
        }

        if( sizes == true )
        {
            show_sizes ();
            sizes = false;
        }
        
        // usado pra testes
        {
            if ( registra )
            {
                int internal_ext = 8000;
                registra = false;
                for( register uint8_t i = 0; i < u8_MAX_CB_IN_A_BRANCH - 2; i++ ) {
                    v_cb -> add ( new Call_Box ( internal_ext, internal_ext++ ) );
                }    
            }
            
            if ( registra4 )
            {
                int internal_ext = 8000;
                registra4 = false;
                for( register uint8_t i = 0; i < 4; i++ )
                {
                    v_cb -> add ( new Call_Box ( internal_ext, internal_ext++ ) );
                }    
            }
            
            if ( need_registry_someone )
            {
                need_registry_someone = false;
                
                v_cb -> add ( new Call_Box ( ext_to_be_registered, ext_to_be_registered ) );
                
                ext_to_be_registered = 0;
            }
        }
        
        check_udp_packages_pending ( v_cb );
        
        if( dshow_rtp == true )
        {
            show_rtp ();
            dshow_rtp = false;
        }
            
        // usado pra test
        if ( frtp )
        {
            fuck_rtp ( v_cb );
            frtp = false;
        }
        
        // usado pra test
        if ( rescue_rtp )
        {
            rescue_rtp = false;
            Call_Box * cb = find_CB( v_cb, rescue_rtp_target );
            if ( cb != NULL )
            {
                cb -> set_rtp_port ( rescue_rtp_value );
            }
                else
            {
                vz_debug ("rescue rtp fail");
            }
        }
        
        if ( print_v_cb )
        {
            v_cb->print_yourself ();
            print_v_cb = false;
        }
        
        if ( print_v_call )
        {
            v_call->print_yourself ();
            print_v_call = false;         
        }
        
        if ( print_cb_var )
        {
            show_cb_content ();
            print_cb_var = false;
        }
        
        if ( print_cb_all )
        {
            show_cb_content_all ();
            print_cb_all = false;
        }
        
        if ( print_hex_cb_var )
        {
            show_hex_cb_content ();
            print_hex_cb_var = false;
        }
        
        if ( print_hex_cb_all )
        {
            show_hex_cb_content_all ();
            print_hex_cb_all = false;
        }
         
        if ( print_sip_var )
        {
            show_cb_sip ();
            print_sip_var = false;
        }
        
        if ( print_sip_all )
        {
            show_cb_sip_all ();
            print_sip_all = false;
        }
        
        if ( print_hex_sip_var )
        {
            show_cb_hex_sip ();
            print_hex_sip_var = false;
        }
         
        if( dcallshow_rtp == true ){
            show_rtp_on_call ();
            dcallshow_rtp = false;
        }
        
        if ( print_call_var )
        {
            show_call ();
            print_call_var = false;
            
        }
        
        if ( print_hex_call_var )
        {   
            show_hex_call ();
            print_hex_call_var = false;
        }
        
        
        if ( print_hex_rtp_var )
        {   
            show_cb_rtp ();
            print_hex_rtp_var = false;
        }
        
        if ( print_rtp_var )
        {
            show_cb_hex_rtp ();
            print_rtp_var = false;
        }

        if( reset_cks == true )
        {
            reset_stats_cks ();
            pcks_s = true;
            reset_cks = false;
        }

        if( pcks_s == true ) {
            show_cb_stats ();
            pcks_s = false;
        }
        
        if ( show_wdt_string )
        {
            char wdt_msg [ 1024 ];
            build_wdt_string ( wdt_msg, sizeof ( wdt_msg ) - 1 );
            
            int siRet = strlen ( wdt_msg );
            
            vz_printf ( "wdt_msg.length::%d\r\n%s", siRet, wdt_msg );
            
            show_wdt_string = false;    
        }
        
        if( reset_missed_send_udp_pkg )
        {
            reset_missed_send_udp ();
            missed_send_udp_pkg = true;
            reset_missed_send_udp_pkg = false;
        }
        
        if ( missed_send_udp_pkg )
        {
            show_missed_send_udp_pkg ();
            missed_send_udp_pkg = false;
        }
            
        // usado pra test
        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 ) );    
        }
        
        if ( led_sync_timer.read() > 1 ) {
            led_sync_timer.reset();
            led3 = !led3;
            CAB_LED = !CAB_LED;
        }
        
        if ( boolWho_is_your_pair )
        {
            boolWho_is_your_pair = false;
            
            Call_Box * cb = find_CB ( v_cb, u16Who_is_your_pair );
            
            if ( cb not_eq NULL )
            {
                cb = cb -> get_pair_cbx ();
                
                if ( cb not_eq NULL ) vz_printf ( "[%d] pair [%d]", u16Who_is_your_pair, cb -> get_ext () );
                
                else vz_printf ( "[%d] pair nao encontrado", u16Who_is_your_pair );
                
            } else vz_printf ( "[%d] nao encontrado", u16Who_is_your_pair );
            
            u16Who_is_your_pair = 0;    
        }
        
        switch ( type ) 
        {
            case DO_NOTHING :{}
            break;

            case CB_BYE : 
            {
                cb_bye_counter ++;
                Call_Box * cb = find_CB ( v_cb, ext );
                if ( cb != NULL )
                {
                    if ( debug_invite or debug_main ) vz_debug ("[%d] Bye pkg - msg_id %d e pkg_id %d", ext, cb -> get_msg_id (), data [ 0 ] );
                    
                    bool already_removed = true;
                    
                    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 ] or_eq BIT7, CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
                    
                        ts -> return_timeslice ( cb -> call_end () );
                    }
    
                    if ( already_removed ) if ( debug_main or debug_invite ) vz_debug ( "[%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 )
                        {
                            already_removed = false;
                            
                            data[ TIMESLICE_PLACE ] = 0;

                            v_call->remove_element( i );

                            send2callboxes( build_cb_package( ext, port, CB_BYE,
                                ( char * )data, data[ 0 ] or_eq BIT7, CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
                            
                            delete( call );
                            
                            ts -> return_timeslice ( cb -> call_end () );
                        }
                    }
   
                    if( already_removed ) if( debug_main or debug_invite ) vz_debug ( "[%d] Already removed from vector call", ext );

                    cb -> registry ();
                    
                } else if ( debug_invite or debug_main ) vz_debug ("[%d] Bye from who ?", ext );
            }
            break;

            case INVITE : 
            {
                if ( drop_invite_pkg )
                {
                    vz_debug ("[%d] Dropando invite pck - msg id :: %d", ext, data[ 0 ] );
                    break;
                }
                
                invite_counter ++;
                
                if ( debug_invite ) vz_debug ("[%d] Invite request", ext );
                
                Call_Box * cb = find_CB ( v_cb, ext );
              
                if ( cb == NULL ) cb = try_add_new_cbx ( v_cb, ext );
                
                if ( cb == NULL ) {
                    if ( debug_memory or debug_invite ) vz_debug ("[%d] Invite allocation cb fail", ext );
                } else {
                    cb -> update_invite_counter ();
                    
                    cb -> invite_retry_count_reset ();
                    
                    cb -> set_msg_id ( data [ 0 ] );
                    
                    if ( cb -> get_status () == cb_idle ) { 
                        cb -> call_config ();
                        if ( test_ts ) vz_debug ("TST::IDLE");
                    } else {
                        data [ TIMESLICE_PLACE ] = cb -> get_timeslice ();
                        
                        cb -> set_invite_response_pending ();    
                        
                        if ( test_ts ) vz_debug ("TST::%u ", data [ TIMESLICE_PLACE ]);
                        
                        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 : {
                /*
                    Colocar um if, de que se o cbx já existia, e tinha dado timeout
                    ou por slave ou por mestre, resetar o timer dos 2
                */
                registry_counter ++;
                Call_Box * cb = find_CB ( v_cb, ext );
                
                if ( cb == NULL ) cb = try_add_new_cbx ( v_cb, ext );
                
                if ( cb == NULL and debug_memory ) vz_debug ( "[%d] Registry cb allocation fail", ext );
                
                int registry_ret = -1;
                
                if ( cb not_eq NULL ) registry_ret = cb -> registry ();
                
                if ( ( registry_ret > 0 ) and eth_status ) try_reconnect_with_eth ();
                
                if ( debug_main and registry_ret ) vz_debug ( "[%d %d] Registered", ext, port );
                
                pkg_wdt = RX_CB_IDLE;
            }
            break;
            
            case BOOT : {
                boot_counter++;
                if( debug_boot == true ){
                    vz_printf ("[%d %d] Boot pkg -- pkg-id %d", ext, port, data[ 0 ] );    
                }
                send2callboxes( build_cb_package( ext, port, REGISTRY,
                    ( char * )data, data[ 0 ] bitor BIT7, CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
            }
            break;
            
            case FW : {
                if ( debug_fw_print ) vz_printf ("[%d %d]::FW pkg::", ext, port );
                fw_cbx_pkg ( ext, ( char *) buffer );
            }
            break;

            case BOOTLOADER_CBX : {
                uint16_t bl_cnt2 = 0;
                if (debug_bootloader) {
                    pc.printf("\r\npacote CBX->HDR {");
                    for (bl_cnt2 = 0;bl_cnt2 < BL_SIZE + 1;bl_cnt2++) {
                        if ((bl_cnt2 % 30) == 0) {
                            pc.printf("\r\n  ");
                            pc.printf(hex16(bl_cnt2));
                            pc.printf(" : ");
                        }
                        pc.printf(hex8(data[bl_cnt2]));
                        pc.printf(", ");
                    }
                    pc.printf("\r\n}");
                }
                bootloader_cbx_counter++;
                bl_send_buffer[0] = (char)(ext >> 8);
                bl_send_buffer[1] = (char)(ext & 0xff);
                for (bl_cnt2 = 0; bl_cnt2 < BL_SIZE; bl_cnt2++) {
                    bl_send_buffer[bl_cnt2 + 2] = data[bl_cnt2 + 1];
                }
                if (debug_bootloader) {
                    pc.printf("\r\npacote HDR->SRV {");
                    for (bl_cnt2 = 0;bl_cnt2 < UDP_BL_SIZE;bl_cnt2++) {
                        if ((bl_cnt2 % 30) == 0) {
                            pc.printf("\r\n  ");
                            pc.printf(hex16(bl_cnt2));
                            pc.printf(" : ");
                        }
                        pc.printf(hex8(bl_send_buffer[bl_cnt2]));
                        pc.printf(", ");
                    }
                    pc.printf("\r\n}");
                }
                int udp_bl_client_ret = udp_bl_client.sendTo ( udp_bl_server, bl_send_buffer, UDP_BL_SIZE );
                if ( udp_bl_client_ret not_eq UDP_BL_SIZE )
                {
                        reconnect_bl ();
                        miss_bl_udp_send_pkg ++;
                        if ( debug_reconnect ) vz_printf ( "[%d] Reconnect BL - %d", ext, udp_bl_client_ret );
                }
            }
            break;

            case PROMPT : {
                Call_Box * cb = find_CB ( v_cb, ext );

                if ( cb == NULL ) cb = try_add_new_cbx ( v_cb, ext );

                if( cb != NULL ) cb -> registry ();

                if ( ( strncasecmp ( ( const char * )data, "ping", 4 ) == 0 ) or ( strncasecmp ( ( const char * )data, "pong", 4 ) == 0 ) )
                {
                    if( debug_ping ) vz_printf ( "[%d %d] Prompt pkg :: Ping", ext, port );
                } 
                    else 
                {
                    prompt_counter++;
                    
                    vz_printf ( "[%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" );
                    }
                    if( debug_uart3 ) pc.printf("\n\r> ");

                    if( tcp_session ) {
                        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> " ) );
                    }
                }
            }
            break;
            
            case AUDIO : {
                audio_counter++;
                if ( received_audio_from_cb ) {
                    vz_debug ("[%d] audio pkg", ext );    
                }
                
                VZ_call * call = find_Call ( v_call, ext );
                if ( call != NULL )
                {
                    if ( drop_rtp_from_cbx_pkg )
                    {
                        led2 = !led2;
                        break;
                    } 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 )
                {
                    if ( cb -> get_invite_response () == false )
                    {
                        cb -> set_invite_response_ok ();
                        cb -> invite_retry_count_reset ();
                    } 
                } else {
                    if ( debug_main ) vz_debug ("[%d] received missed package", ext );
                }
            }
            break;
        }// fim switch
        
        // rajada
        if( invite_retry_timer.read_ms() >= 20 )
        {
            invite_ack_to_cb_handler ( v_cb, v_call );
            
            invite_retry_timer.reset();
        }    
    
        check_audio_from_ast ( v_cb, v_call );        

        wake_up_or_refresh_handler ( v_cb );

        check_sip_messages_from_ast ( v_cb, v_call );
        
        /* Verifica andamento de ligações para eventualmente encerra-las por timeout */
        call_manager( v_call, v_cb, ts );

        invite_handler( v_call, v_cb, ts, NULL );

        check_for_runaways_ts ( v_cb, ts );
        
        check_for_unwanted_rtp_ports ( v_cb );
        
        tx_buffer_ring_buffer_handler();

        type = DO_NOTHING;

        if( eth_status == 0 ) eth_wdt = ETH_CONNECT_TIMEOUT;

        if( wdt_timer.read() >= 1 ) {
            if ( -1 == wdt_update () ) vz_debug ("Erro!!!!!");
            wdt_timer.reset();
        }

        if( debug_wdt )
        {
            show_wdt_status ();
            debug_wdt = false;   
        }
        
        update_all_cb_timer ( v_cb );
        
        if ( !dont_say_hello_again ) send_hello_to_cbx ();
        
        /* Verificacao da fonte de alimentacao */
        if ( power_source_timer.read () > 1 )
        {
            check_power_source ();
        }
        
%: ifdef MODE_TEST
        wdt.kick();
%: endif
    }// fim while
}// fim main \o/