Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: main.cpp
- Revision:
- 119:ee6a53069455
- Parent:
- 118:b93b17c50910
- Child:
- 120:770f00554b1e
diff -r b93b17c50910 -r ee6a53069455 main.cpp --- 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();