Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: main.cpp
- Revision:
- 117:e9facba9db27
- Parent:
- 116:39a41ebb675c
- Child:
- 118:b93b17c50910
diff -r 39a41ebb675c -r e9facba9db27 main.cpp --- a/main.cpp Thu Apr 23 20:24:09 2015 +0000 +++ b/main.cpp Thu Apr 23 21:53:28 2015 +0000 @@ -1,10 +1,12 @@ +#include "telemetry.h" #include "eth.h" #include "bits.h" -#include "UART3Interrupt.h" // for RXBuffer[ CB_BUFFER_SIZE ]; +#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" @@ -13,6 +15,7 @@ #include "configs.h" #include "sdram.h" #include "fw.h" +#include "bootloader.h" volatile u16_t lpc_low_level_input_counter = 0; int main() @@ -46,6 +49,7 @@ send_msg("******* Connection eth - ok *******"); init_prompt_eth(); init_external_wdt(); + init_bl(); } Timer sync_timer, led_sync_timer; @@ -58,16 +62,16 @@ int port = 0; /* buffer para onde se copia os dados vindos do cb para tratameno interno */ - uint8_t buffer[ CB_BUFFER_SIZE ]; + 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 ]; + 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 ]; + uint8_t cb_rx_buffer[ __CB_BUFFER_SIZE__ ]; /* referencia para os dados contidos no pacote, sem o header */ uint8_t * data = NULL; @@ -97,10 +101,7 @@ sync_timer.reset(); } } - } - - // aloca o vetor de calls - if( v_call == NULL ) { + } else if( v_call == NULL ) { while( v_call == NULL ) { Vector * v_call = new Vector(); if( sync_timer.read() > 5 ) { @@ -120,7 +121,7 @@ if( debug_memory ) debug_msg("Call vector allocation fail"); } - for( register uint16_t i = 0; i < CB_BUFFER_SIZE; i++ ) { + for( register uint16_t i = 0; i < __CB_BUFFER_SIZE__; i++ ) { cb_rx_buffer[ i ] = 0; cb_tx_buffer[ i ] = 0; } @@ -129,13 +130,19 @@ udp_timer.start(); + init_telemetry_handler(); + + //debug_msg(""); init_fw_handler(); + //debug_msg(""); led2 = 0; init_ranges(); init_refresh(); + init_aging(); + init_sync_refresh(); //init_invite_pgk_retry_manager(); @@ -153,6 +160,7 @@ uint16_t pkg_wdt = RX_CB_IDLE; uint16_t eth_wdt = ETH_CONNECT_TIMEOUT; + uint32_t uptime = 0; led1 = 0; send_msg("Ready"); @@ -167,20 +175,33 @@ Timer test_timer; - reset_leds(); + hex_init(); /*------------------------------------------ main loop ---------------------------------------------------------------*/ - while( true ) - { + while( true ) { + reset_leds(); + // need be removed; + 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; } + 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( !( ++count % 15 ) ) { if( eth_status ) { @@ -191,6 +212,7 @@ if( debug_main ) debug_msg("Connection eth - ok"); init_prompt_eth(); init_external_wdt(); + init_bl(); } } } @@ -200,17 +222,10 @@ 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, 0 ); + prompt_process( NULL ); if( r_stats ) { boot_counter = 0; @@ -223,45 +238,19 @@ flood_counter = 0; bootloader_cbx_counter = 0; cb_stats_counter = 0; - fw_counter = 0; r_stats = false; stats = true; } - if( stats ) - { + 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 " - "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, - flood_counter, - bootloader_cbx_counter - ); + 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 ); stats =false; } - if( list ) - { + if( list ) { uint8_t missed_cb = ( ( max_ext - min_ext ) + 1 ) - v_cb->size(); if( ( max_ext % 2 ) == 0 ) missed_cb++; @@ -353,6 +342,10 @@ strcpy( cb_status, "cb_denied" ); break; } + case cb_bootloader : { + strcpy( cb_status, "cb_bootloader" ); + break; + } } switch( cb->sip->status ) { case sip_idle : { @@ -413,8 +406,7 @@ long_list = false; } - if( pshowcb == true ) - { + 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 ); @@ -520,15 +512,43 @@ if( status != __WAITING__ ) { pkg_wdt = RX_CB_IDLE; - xmemcpy( cb_rx_buffer, buffer_from_cb_ptr, CB_BUFFER_SIZE ); + xmemcpy( cb_rx_buffer, buffer_from_cb_ptr, __CB_BUFFER_SIZE__ ); status = __WAITING__; missed_pkg--; - xmemcpy( buffer, cb_rx_buffer, CB_BUFFER_SIZE ); + 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; + } 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 " ); @@ -539,17 +559,18 @@ 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++; @@ -573,14 +594,15 @@ 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 ) ); + 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 ] ); switch( type ) { case __INVITE__ : { - if( debug_main || debug_invite ) debug_msg("Invite Ack from %d on msg_id %d -- Cbx seqNum %d", ext, cb->get_msg_id(), data[ 0 ] ); + 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(); break; } case __CB_BYE__ : { @@ -596,7 +618,7 @@ if( debug_main || debug_aging ) debug_msg("ACK from %d in pkg :: %d :: type %d", ext, cb->get_msg_id(), type ); } } - if( type != __REGISTRY__ && type != __CB_BYE__ && type != __INVITE__ ) type = __DO_NOTHING__; + if( type != __REGISTRY__ && type != __CB_BYE__ ) type = __DO_NOTHING__; if( type == __CB_BYE__ ){ VZ_call * call = __find_Call__( v_call, ext ); if( call != NULL ){ @@ -613,9 +635,8 @@ } else type = __DO_NOTHING__; } - if( sizes == true ) - { - sizes = false; + if( main_test == true ) { + main_test = 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 ); @@ -625,7 +646,6 @@ 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 ) ); @@ -633,7 +653,35 @@ 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 ) { @@ -653,12 +701,31 @@ 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); 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)) { + udp_bl_timer.stop(); + udp_bl_timer.reset(); + bl_start_flag = 0; + if (bl_ts != 0) { + ts->return_timeslice( bl_ts ); + bl_ts = 0; + } + if (bl_cb != NULL) { + bl_cb->set_timeslice( 0 ); + set_status( bl_cb->status, cb_idle ); + bl_cb = NULL; + } + } if(ret > 0 ) { for( register uint8_t i = 0; i < v_cb->size(); i++ ) { @@ -1596,86 +1663,17 @@ 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( - "\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 - ); + 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 ); 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 ) { @@ -1683,6 +1681,38 @@ 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__ : @@ -1713,18 +1743,18 @@ set_status( cb->sip->status, sip_idle ); v_call->remove_element( i ); + + //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); + //cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); - send2callboxes( build_cb_package( ext, port, __CB_BYE__, - ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) ); + 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 ); - cb -> set_rtp_port ( 0 ); - - cb -> reset_rtp_timer (); - delete( call ); + //cb->re_start_timer(); } } if( already_removed ) if( debug_main || debug_invite ) debug_msg( "Already removed from vector call" ); @@ -1745,10 +1775,13 @@ 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 ) ); + 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(); } } } @@ -1756,21 +1789,18 @@ if( already_removed ) if( debug_main || debug_invite ) debug_msg( "Already removed from inviting queue" ); cb->registry(); - cb -> set_rtp_port ( 0 ); - cb -> reset_rtp_timer (); } else if( debug_invite || debug_main ) debug_msg("Bye from who ? %d", ext ); } break; case __INVITE__ : { if( drop_invite_pkg ){ - debug_msg("Dropando invite pck from %d msg id :: %d", ext, data[ 0 ] ); + debug_msg("Dropando invite pck msg id :: %d", data[ 0 ] ); break; } invite_counter++; - if( debug_invite ) debug_msg("Invite request from %i", ext); + if( debug_invite ) debug_msg("Request Invite received from Cbx %i", 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 ); @@ -1784,28 +1814,12 @@ } } } - - if( cb != NULL ) - { - cb->invite_retry_count_reset(); - + if( cb != NULL ) { cb->set_msg_id( data[ 0 ] ); - - if( cb->status == cb_idle ){ - cb -> set_invite_response_ok(); - cb -> reset_rtp_timer (); - cb -> init_rtp_timer (); - } else { - data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice(); - - cb->set_invite_response_pending(); - - cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); - - send2callboxes( build_cb_package( ext, port, __INVITE__, - ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) ); + if( cb->status == cb_idle ){ + cb->set_invite_response_ok(); + cb->invite_retry_count_reset(); } - invite_handler( v_call, v_cb, ts, cb ); } } @@ -1838,8 +1852,14 @@ if( debug_boot == true ){ send_msg("Rcv boot pkg from (%d, %d) 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; @@ -1850,7 +1870,44 @@ break; 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 ); + //BLEUBA + //pc.printf("\r\nCBX RESPONDEU BOOTLOADER!\r\n"); + 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}"); + } + udp_bl_client.sendTo( udp_bl_server, bl_send_buffer, UDP_BL_SIZE ); } break; @@ -1858,15 +1915,16 @@ 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 :: %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 ); - } + 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 ); } } @@ -1885,8 +1943,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> " ) ); @@ -1896,37 +1954,33 @@ break; case __AUDIO__ : { audio_counter++; - if ( received_audio_from_cb ) { - debug_msg("audio pkg from %d", 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(); + } } - } - - 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("received missed package from CBx :: %i", ext ); - } + } else { + if( debug_main ) debug_msg("received missed package from CBx :: %i", ext ); } } break; }// fim switch { // rajada - if( invite_retry_timer.read_ms() > 20 ) + if( invite_retry_timer.read_ms() > 30 ) { invite_retry_timer.reset(); @@ -1958,51 +2012,35 @@ 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 ) ); + 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 ( __find_Call__( v_call, cb->get_ext () ) == NULL ) + } + + if( cb->get_invite_retry_count() == 0 ) { - - if ( ( ( cb->status == cb_ringing ) || ( cb->status == cb_trying ) ) ) + cb->send_bye(); + + 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++ ) { - const int rtp_tmp_length = 172; - 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_tmp_length; 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_tmp_length, rtp_dst_tmp_write_buffer ) ); - } else { - if ( cb->get_invite_retry_count() == 0 ) + VZ_call * call = ( VZ_call * )v_call->get_element( i ); + if( call->get_cb_ext() == cb->get_ext() ) { - cb->send_bye(); - - 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++ ) - { - VZ_call * call = ( VZ_call * )v_call->get_element( i ); - if( call->get_cb_ext() == cb->get_ext() ) - { - v_call->remove_element( i ); - if( call != NULL ) delete( call ); - break; - } - } - - if( debug_invite ) debug_msg( "-- No audio pkgs --" ); - set_status( cb->status, cb_idle ); - set_status( cb->sip->status, sip_idle ); + v_call->remove_element( i ); + if( call != NULL ) delete( call ); + break; } } + + if( debug_invite ) debug_msg( "-- No audio pkgs --" ); + set_status( cb->status, cb_idle ); + set_status( cb->sip->status, sip_idle ); } } } @@ -2010,48 +2048,53 @@ for( register uint8_t i = 0; i < v_call->size(); i++ ) { VZ_call * call = ( VZ_call * )v_call->get_element( i ); - 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("received missed package from CBx :: %i -- Type :: %i", ext, type ); - } + 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( 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 time_to_mode = TIME_TO_REFRESH; + static uint8_t mode = TIME_TO_REFRESH; - if ( time_to_mode == TIME_TO_REFRESH ){ - time_to_mode = TIME_TO_WAKE_UP; - refresh ( v_cb ); + if( mode == TIME_TO_REFRESH ) { + mode = TIME_TO_WAKE_UP; + refresh( v_cb, buffer, write_buffer, NULL ); } else { - time_to_mode = TIME_TO_REFRESH; - if ( wake_all ) if ( v_call->size() == 0 ) wake_all_up ( v_cb ); + mode = TIME_TO_REFRESH; + if( wake_all ) if( v_call->size() == 0 ) wake_all_up( v_cb, buffer, write_buffer ); } } + + //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 ) { @@ -2073,14 +2116,13 @@ } } + //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); - - cb -> set_rtp_port ( 0 ); - - cb -> reset_rtp_timer (); + + //debug_msg("msg_id -- %d", cb->get_msg_id() ); - send2callboxes( build_cb_package( ext, port, __CB_BYE__, - ( char * )buffer, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) ); + 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(); @@ -2089,28 +2131,34 @@ } /* Verifica andamento de ligações para eventualmente encerra-las por timeout */ - call_manager( v_call, v_cb, ts ); + call_manager( v_call, v_cb, buffer, write_buffer, 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++ ) { - if ( ( ( Call_Box * )v_cb->get_element( i ) )->get_status() != cb_idle && - ( ( Call_Box * )v_cb->get_element( i ) )->get_sip_status() != sip_idle ) { + uint16_t cb_status = ((Call_Box *)v_cb->get_element( i ))->get_status(); + uint16_t cb_sip_status = ((Call_Box *)v_cb->get_element( i ))->get_sip_status(); + + if ((cb_status != cb_idle) and (cb_sip_status != sip_idle)) { ts_reset = false; break; } + } - if( ts_reset ) { + if( ts_reset && !bl_start_flag ) + { if( debug_invite ) debug_msg("Resetando TS"); 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); @@ -2118,7 +2166,7 @@ { if ( ( cb->get_status () == cb_idle ) && ( cb->get_sip_status () == sip_idle ) && ( cb -> is_rtp_timer_timeout () ) ) { - if ( debug_reset_rtp ) debug_msg( "%d rtp reset", cb -> get_ext () ); + if ( debug_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 (); @@ -2126,6 +2174,12 @@ } } } + */ + + //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();