![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: main.cpp
- Revision:
- 109:a5b8264ffbbc
- Parent:
- 108:18a3702650f3
- Child:
- 111:c0833f2455ed
--- a/main.cpp Wed Mar 18 13:33:54 2015 +0000 +++ b/main.cpp Tue Apr 07 14:27:44 2015 +0000 @@ -1,95 +1,97 @@ -#include "main_includes.h" +#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" -// Contador low-level de pacotes recebifos na interface eth da embarcada, extern de lpc17_emac.c volatile u16_t lpc_low_level_input_counter = 0; int main() -{ - // configura e inicia o wdt +{ init_wdt(); - // configs de sistema, irqs, I/O bounds config_lpc(); - // inicializa a comunicacao com a laser start_cpld(); - // habilita a impressao de caracteres na interface UART3 debug_uart3 = true; - - // rotina de verificacao do uso do sistema de memoria if( sdram_init() == 1 ) { - pc.printf("\r\n******* Failed to initialize SDRAM *******\r\n"); + send_msg("******* Failed to initialize SDRAM *******"); return 1; } else { - pc.printf("\r\n******* Success to initialize SDRAM *******\r\n"); + send_msg("******* Success to initialize SDRAM *******"); } - // inicializa o sistema de arquivo para uso init_fsystem(); - // exibe endereco MAC da lpc { char s[ 32 ]; mbed_mac_address( s ); - pc.printf( "\r\n******* ::Mac::%02x:%02x:%02x:%02x:%02x:%02x:: *******\r\n", s[0],s[1],s[2],s[3],s[4],s[5] ); + send_msg( "::Mac::%02x:%02x:%02x:%02x:%02x:%02x:: ", s[0],s[1],s[2],s[3],s[4],s[5] ); } - // rotina de inicializacao da interface ETH short int eth_status = __init_eth__(); if( eth_status ) { - pc.printf("\r\n******* Cannot connect to eth *******\r\n"); + send_msg("******* Cannot connect to eth *******"); } else { - pc.printf("\r\n******* Connection eth - ok *******\r\n"); + send_msg("******* Connection eth - ok *******"); init_prompt_eth(); init_external_wdt() } - // sync_timer : usado para sincronizar eventos a cada x unidades de tempo, usualmente em debugs - // led_sync_timer : usado para controlar a taxa de toggle do led de debug Timer sync_timer, led_sync_timer; - - sync_timer.start(); - led_sync_timer.start(); + sync_timer.start(), led_sync_timer.start(); - // representa ramal do call box + /* representa ramal do call box */ int ext = 0; - // representa porta do call box + /* 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 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 ]; + /* 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 + /* 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 ]; + /* 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 + /* referencia para os dados contidos no pacote, sem o header */ uint8_t * data = NULL; - // gerencia o tipo do pacote para providenciar tratamento adequado + /* 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 + /* representa a lista dos Call Boxes atualmente recfonhecidos pela cabeceira */ Vector * v_cb = new Vector(); - // representa a lista de ligacoes ativas na cabeceira + /* representa a lista de ligacoes ativas na cabeceira */ Vector * v_call = new Vector(); - // gerencia a distribuicao de timeslice para os call boxes + /* 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"); } - // aloca o vetor de call boxes + /* instancia o vetor de call boxes // calls */ if( v_cb == NULL ) { while( v_cb == NULL ) { Vector * v_cb = new Vector(); @@ -98,10 +100,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 ) { @@ -121,267 +120,109 @@ if( debug_memory ) debug_msg("Call vector allocation fail"); } - // inicializa buffers de armazenamento temporario de I/O com o CBx - 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; } - // apagar os leds do lpc reset_leds(); - //FIXME remover caso compravado desuso udp_timer.start(); + + init_telemetry_handler(); - // inicializa o sistema para envio de pacotes do tipo __FW?__ e __TELEMETRY__ para servidor ( ip, porta ) previamente configurado. + //debug_msg(""); init_fw_handler(); + //debug_msg(""); led2 = 0; - - // le do sistema de arquivos valores previamente configurados de primeiro e ultimo ramal de um determinado ramo. init_ranges(); - - // inicializa o timer de refresh dos cbx + init_refresh(); - // inicializa o time de envelhecimento do CBx init_aging(); - // inicislizs o yimrt para sincronizar as rotinas de wake_all_up e refresh init_sync_refresh(); - // usada para delay na ativacao de algumas funcoes, wake_all_up e tentativa de eth reconnect + //init_invite_pgk_retry_manager(); + + //void init_bye_pgk_retry_manager(); + static uint8_t count = 0; - // contador usado para indicar quantos cbx foram registrados na logica + //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; - // inicia dizendo que a rotina nao deve rodar agora ( 35 sec. nas versoes originais ) bool wake_all = false; - // inico das variaveis controladoras do extern wdt - - // atribui valor maximo ao countdown que verifica comunicao com os CBx uint16_t pkg_wdt = RX_CB_IDLE; - - // atribi falor maximo ao countdown que verifica conexao eth 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; - // inicializa o contador de uptime da header - uint32_t uptime = 0; - - led1 = 0; - - send_msg("\r\nReady"); - - // inicializa o timer de retry dos pacotes de invite, necessario para o comportamento "metralhadora" da header. + //bool invite_retry_time = false; Timer invite_retry_timer; invite_retry_timer.start(); + debug_uart3 = false; - // desabilita a impressao de caracteres na interface UART3 - //debug_uart3 = false; - - reset_leds(); + Timer test_timer; /*------------------------------------------ main loop ---------------------------------------------------------------*/ while( true ) { - // inicializa o loop afirmando que nao existe comando externo para ser processado pelo prompt. - udp_query = false; - from_eth = false; - - // chama rotina de processamento de entrada serial para o prompp - prompt_process( NULL, 0 ); + reset_leds(); + // need be removed; - //begin verificacao e tratamento dos pacotes recebidos via UDP-ETH - { - fd_set fdSet; - FD_ZERO(&fdSet); - - // coloca o socket SIP de todos os CBx - for( register uint8_t i = 0; i < v_cb->size(); i++ ) { - Call_Box * cb = (Call_Box *)v_cb->get_element( i ); - FD_SET( cb->get_sip_socket_fd(), &fdSet ); - } - - // adiciona o socket 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 ); - - struct timeval t; - t.tv_sec = 0; - t.tv_usec = 0; - // verifica se existe algo pendente para ser tratado - int ret = lwip_select( FD_SETSIZE, &fdSet, NULL, NULL, &t ); - - if(ret > 0 ) { - // existe algo na fila UDP pendente. - // verigica o socket SIP de cada CBx - 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(); - if( FD_ISSET( fd, &fdSet ) ) { - int rcv = cb->sip_udp_incomming_pkg(); - } - } - - // 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; - - 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 - // Ckecking and set 'alive' - bool question_alive = ( wake_msg[ 5 ] == '?' ); - if( wake_msg[ 5 ] == '*' ) wdt.kick(); - - snprintf( wake_msg, 48,"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:", - uptime, - invite_counter, - external_wdt, - ( wdt.WatchdogCausedReset() ) ? '1' : '0', - cb_new_counter, - v_cb->size(), - ts->remain_timeslices(), - sip_socket_send_failure, - 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 - ); - - wake_msg[ 768 - 1 ] = 0; - 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 ) ) ) { - external_wdt = EXTERN_WDT_IDLE; - } - } else if( !( strncmp( wake_msg, "reset", 5 ) ) ) { - external_wdt = 0; - - sprintf( wake_msg, "rst:%u:", uptime ); - 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++; - } - } - } - } - } - }//end verificacao e tratamento dos pacotes recebidos via UDP-ETH - - - // atualiza o valor do contador max_registered_cbx if( v_cb->size() > max_registered_cbx ) max_registered_cbx = v_cb->size(); - // executa a cada 5 segundos comandos e verificacoes ( principalmente debugs ) if( sync_timer.read() > 5 ) { sync_timer.reset(); - - // atualiza valor da variavel de delay - count++; - // enable na variavel que exibe estatisticas de cks dos pacotes recebidos pela header if( debug_cks == true ) { pcks_s = true; } - // enable na variavel que exibe uma lista ( por ordem de pedido de registro ) dos cbx if( debug_alive == true ) { pshowcb = true; } - // 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; + // 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 ) ); } - // verifica status da conexao eth, em caso de falha na inicializacao anterior, tenta conectar periodicamente a cada 75 sec. - // nas implementacoes inicias - if( !( count % 15 ) ) { + if( !( ++count % 15 ) ) { if( eth_status ) { eth_status = __init_eth__(); if( eth_status ) { - if( debug_main ) pc.printf("\r\nCannot connect to eth\r\n"); + if( debug_main ) debug_msg("Cannot connect to eth"); } else { - if( debug_main ) pc.printf("\r\nConnection eth - ok"); + if( debug_main ) debug_msg("Connection eth - ok"); init_prompt_eth(); init_external_wdt() } } } - // inicializa rotina de verificacao de "pares" de CBx apos 35 sec. nas implementacoes iniciais + //35 sec. if( ( count > 7 ) && ( wake_all == false ) ) { wake_all = true; if( debug_wake == true ) send_msg( "Time to wake" ); } - } + } - // zera os contadores de pacotes recebidos na interface CBx->Header + //FIXMEj colocar uma condicao aqui caso necessario pra nao comprometer ligacoes ... + prompt_process( NULL ); + if( r_stats ) { boot_counter = 0; registry_counter = 0; @@ -393,23 +234,19 @@ flood_counter = 0; bootloader_cbx_counter = 0; cb_stats_counter = 0; - fw_counter = 0; r_stats = false; stats = true; } - // exibe o valor dos contadores de pacotes recebidos na interfacao CBx->ETH if( stats ) { char str[ 200 ]; - snprintf( str, 200, "\n\r Received 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 Fw :: %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, fw_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; } - - // exibe uma lista ( em ordem crescente e por ramais ) dos cbx que ja se registraram ao menos uma vez - if( list ) - { + + if( list ) { uint8_t missed_cb = ( ( max_ext - min_ext ) + 1 ) - v_cb->size(); if( ( max_ext % 2 ) == 0 ) missed_cb++; @@ -443,9 +280,8 @@ send_msg( "%s", str ); } list = false; - } - - // validar na proxima iteracao. + } + if( long_list ) { uint8_t missed_cb = ( ( max_ext - min_ext ) + 1 ) - v_cb->size(); @@ -561,12 +397,8 @@ } long_list = false; } - - - // exibe uma lista de cbx por ordem de registro contendo status do cbx e do sip vinculado nesse cbx - 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 ); @@ -654,92 +486,61 @@ pshowcb = false; } - // exibe Ramal e Porta do objeto SIP associado a cada cbx - // assim como exibe um timer crescente em segundos, desde o ultimo pacote recebido deste cbx respondendo registro. if( show_sip == true ){ show_sip = false; send_msg(":: Sip :: %u", v_cb->size() ); for( register uint8_t i = 0; i < v_cb->size(); i++ ) { Call_Box * cb = ( Call_Box * )v_cb->get_element( i ); - if( cb != NULL ) send_msg("ext :: %d -- port :: %d -- timer %d", cb->get_sip_ext(), cb->get_sip_port(), cb->get_timer() ); + send_msg("ext :: %d -- port :: %d -- timer %d", cb->get_sip_ext(), cb->get_sip_port(), cb->get_timer() ); } } - - if( dshow_rtp == true ){ - dshow_rtp = false; - send_msg(":: RTP :: %u", v_cb->size() ); - - 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 ); - } - - for ( register uint8_t i = 0; i < v_cb->size(); i++ ) - { - Call_Box * cb = __find_CB__( v_cb, ext_list[ i ] ); - if( cb != NULL ) - { - send_msg("CBX ( %d, %d ) - SIP ( %d, %d ) - RTP ( %d ) - Timer ( %d )", - cb -> get_ext (), - cb -> get_port (), - cb -> get_sip_ext (), - cb -> get_sip_port (), - cb -> get_rtp_port (), - cb -> get_rtp_timer () - ); - } - } - } - - if( dcallshow_rtp == true ){ - dcallshow_rtp = false; - send_msg(":: CAll RTP :: %u", v_call->size() ); - for( register uint8_t i = 0; i < v_call->size(); i++ ) { - VZ_call * call = ( VZ_call * )v_call->get_element( i ); - if( call != NULL ) - { - send_msg("CBX ( %d, %d ) - Server ( %d, %d )", - call->get_cb_ext(), - call->get_cb_port(), - call->get_rtp_server_ext(), - call->get_rtp_server_port() - ); - } - } - } - // aciona rotina de envio de pacote de flood if( pflood == true ) flood(); - - - // exibe status de conexao ETH if( debug_eth ) { debug_eth = false; send_msg("Eth status %s", ( eth_status == 0 ) ? "Connected" : "Disconnected" ); } - - - // testa se existe um pacote recebido pela interface CBx->Header pendente para ser processado. 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; + } - // exibe esta pacote caso seja solicitado - // TODO implementar um debug que exibe somente, todos os pacotes recebidos 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 " ); @@ -749,36 +550,23 @@ send_msg( "%s", str ); rx = false; } - - // chama rotina para interpretar e validar o pacote recebido - data = parse_vz_pkg( &ext, &port, &type, buffer ); - // caso parse_vz_pkg tenha retorno diferente de NULL, trata-se de um pacote valido para ser processado + data = __parse_vz_pkg__( &ext, &port, &type, buffer ); + if( data != NULL ) { - // atualiza referencias de menor e maior ramal conhecidos ate o momento if( min_ext == 0 ) min_ext = ext; if( ext > max_ext ) max_ext = ext; if( ext < min_ext ) min_ext = ext; - // verifica se precisa "exportar" esse pacote para debug externo if( debug_fw ){ fw_cbx_pkg( ext, port, ( char *)buffer ); } - // por decisao de projeto, todos os pacote de telemetria sao exportados para parse no servidor - if( type == __TELEMETRY__ ) - { - telemetry_counter++; - //FIXME colocar o dtelos aqui - } - - // alguns tratamentos adicionais que sao pertinentes em caso de pacotes diferentes do tipo __AUDIO__ - if( type != __AUDIO__ ) - { - // vefifica quais pacotes precisam ser exportados para o servidor e faz a substituicao do typo para __FW__ sem com isso - // alterar o pacote de origem. + if( type == __TELEMETRY__ ) telemetry_counter++; + + if( type != __AUDIO__ ) { if( type == __TELEMETRY__ || type == __CB_STATS__ || @@ -790,39 +578,23 @@ type == __FW6__ ) type = __FW__; - // exibe que o pacote foi recebido porem sem exibir o conteudo do pacote, apenas ramal e porta do remetente e tipo do pkg if( debug_cb_rx == true ){ send_msg("Pkg from CBx :: ( %d, %d ) -- Type :: %d", ext, port, type ); } - - // exibe o pacote recebido propriamente - if( debug_show_cpld ) - { - char str[ 1024 ]; - strcpy( str, "RX :: \n\r " ); - 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 " ); - - else strcat( str, " " ); - } - send_msg( "%s", str ); - } - // verificacoes de ACKS 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 ) ); + 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", ext, cb->get_msg_id() ); + //cb->first_invite_response_ok(); break; } case __CB_BYE__ : { @@ -843,9 +615,6 @@ VZ_call * call = __find_Call__( v_call, ext ); if( call != NULL ){ if( call->get_elapsed_time() < 120000 ){ - // devido a um bug na implementacao do protocolo, eventualmente o cbx envia - // um pacote de bye nao intencional que encerrava ligacoes precocemente - // solucao encontrada, colocado um timer de controle. if( debug_invite ) debug_msg("%d ack bye ignored", ext ); type = __DO_NOTHING__; } @@ -857,27 +626,18 @@ } } else type = __DO_NOTHING__; } - - // exibe uptime atual - if( show_uptime ) - { - show_uptime = false; - send_msg("Uptime: %d", uptime ); - } - // exibe algumas informacoes pertinentes sobre quantidade de variaveis alocadas e tamanho de alguns objetos. - 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 ); send_msg("RTP_body_New (%u) -- RTP_body_Delete (%u)", rtp_body_new_counter, rtp_body_delete_counter ); - send_msg("Call_New (%u) -- Call_Delete (%u)", call_new_counter, call_delete_counter ); + send_msg("Call_New (%u) -- Call_Delete (%u)", call_new_counter, call_delete_counter ); send_msg("lpc_low_level_input_counter :: %d", lpc_low_level_input_counter ); 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 ) ); @@ -885,11 +645,936 @@ 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++; + } + } + } + } + */ + + { + fd_set fdSet; + FD_ZERO(&fdSet); + + for( register uint8_t i = 0; i < v_cb->size(); i++ ) { + Call_Box * cb = (Call_Box *)v_cb->get_element( i ); + FD_SET( cb->get_sip_socket_fd(), &fdSet); + } + + 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(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(); + if( FD_ISSET( fd, &fdSet ) ) { + int rcv = cb->sip_udp_incomming_pkg(); + } + } + 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 ){ + if( !( strncmp( wake_msg, "alive", 5 ) ) ) { + // Just ckeck but not set 'alive?' + // 'alive*' - force wdt tick right now + // Ckecking and set 'alive' + 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:", + uptime, + invite_counter, + external_wdt, + ( wdt.WatchdogCausedReset() ) ? '1' : '0', + cb_new_counter, + v_cb->size(), + ts->remain_timeslices(), + sip_socket_send_failure, + v_call->size() + // registered_cbx + ); + wake_msg[ 768 - 1 ] = 0; + udp_wdt_client.sendTo( udp_wdt_server, wake_msg, strlen( wake_msg ) ); + + if( ( (!question_alive) && ( cb_new_counter <= __MAX_CB_IN_A_BRANCH__ ) && ( cb_new_counter >= 2 ) ) ) { + 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 ) ); + } + } + } + } + } + + if( dshow_rtp == true ){ + dshow_rtp = false; + send_msg(":: RTP :: %u", v_cb->size() ); + + 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 ); + } + + for ( register uint8_t i = 0; i < v_cb->size(); i++ ) + { + Call_Box * cb = __find_CB__( v_cb, ext_list[ i ] ); + if( cb != NULL ) + { + send_msg("CBX ( %d, %d ) - SIP ( %d, %d ) - RTP ( %d )", + cb -> get_ext (), + cb -> get_port (), + cb -> get_sip_ext (), + cb -> get_sip_port (), + cb -> get_rtp_port () + ); + } + } + } + + if( malasia ) + { + malasia = false; + // conclusao, mudar o nro nao impala, talvez mudar o nro no pacote ... + Call_Box * cb = __find_CB__( v_cb, 5016 ); + if( cb != NULL ) + { + cb -> set_rtp_port ( cb -> get_rtp_port () * 10 + 1 ); + send_msg("CBX ( %d, %d ) - SIP ( %d, %d ) - RTP ( %d )", + cb -> get_ext (), + cb -> get_port (), + cb -> get_sip_ext (), + cb -> get_sip_port (), + cb -> get_rtp_port () + ); + } + } + + if( york ) + { + york = false; + Call_Box * cb = __find_CB__( v_cb, 5016 ); + if( cb != NULL ) + { + cb -> set_rtp_port ( 80 ); + send_msg("CBX ( %d, %d ) - SIP ( %d, %d ) - RTP ( %d )", + cb -> get_ext (), + cb -> get_port (), + cb -> get_sip_ext (), + cb -> get_sip_port (), + cb -> get_rtp_port () + ); + } + } + + if ( frtp ) + { + frtp = false; + Call_Box * cb = __find_CB__( v_cb, frtp_target ); + if ( cb != NULL ) + { + cb -> set_rtp_port ( -1008789032 ); + } + else + { + debug_msg("frtp fail"); + } + + } + + 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 + { + debug_msg("rescue rtp fail"); + } + + } + + if( america ) + { + america = false; + Call_Box * cb = __find_CB__( v_cb, 5016 ); + if( cb != NULL ) + { + cb -> set_rtp_port ( 8929415 ); + send_msg("CBX ( %d, %d ) - SIP ( %d, %d ) - RTP ( %d )", + cb -> get_ext (), + cb -> get_port (), + cb -> get_sip_ext (), + cb -> get_sip_port (), + cb -> get_rtp_port () + ); + } + } + + //begin debug_print + if ( print_v_cb ) + { + print_v_cb = false; + v_cb->print_yourself (); + } + + if ( print_v_call ) + { + print_v_call = false; + v_call->print_yourself (); + } + + if ( print_cb_var ) + { + print_cb_var = false; + Call_Box * cb = __find_CB__ ( v_cb, print_this_cb ); + if ( cb != NULL ) + { + cb -> print_yourself (); + } + else + { + if( print_values ) + { + debug_msg ("Objeto CBx ( %d ) nao encontrado", print_this_cb ); + } + else + { + send_msg ("Objeto CBx ( %d ) nao encontrado", print_this_cb ); + } + } + } + + if ( print_cb_all ) + { + print_cb_all = false; + + if ( v_cb -> size () == 0 ) + { + send_msg("known CBx :: 0"); + } + + for ( register uint8_t i = 0; i < v_cb->size(); i++ ) + { + Call_Box * cb = (Call_Box *)v_cb->get_element( i ); + + if ( cb != NULL ) + { + cb -> print_yourself (); + } + else + { + if ( print_values ) debug_msg ("Objeto CBx ( %d ) nao encontrado", i ); + } + } + } + + if ( print_hex_cb_var ) + { + print_hex_cb_var = false; + uint8_t * ptr = ( uint8_t * ) __find_CB__ ( v_cb, print_hex_this_cb ); + + if ( ptr != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) ptr ); + for ( register int i = 0; i < sizeof( Call_Box ); i++ ) + { + if( debug_uart3 ) pc.printf("%x", *ptr++ ); + + if ( ( i % 32 ) == 0 ) + { + if( i != 0 ) + { + if( debug_uart3 ) pc.printf("\n\r> "); + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + if ( debug_uart3 ) pc.printf("\n\r> "); + + if ( tcp_session ) { + char aux[ ( sizeof( Call_Box ) * 3 ) + 3 ]; + + for ( register int i = 0; i < ( sizeof( Call_Box ) * 3 ) + 3 ; i++ ) aux [ i ] = 0; + + uint8_t * ptr = ( uint8_t * ) __find_CB__ ( v_cb, print_hex_this_cb ); + + for ( register int i = 0; i < sizeof( Call_Box ); i++ ) + { + char tmp[ 16 ]; + sprintf( tmp, "%x ", *ptr++ ); + strcat( aux, tmp ); + } + + strcat( aux, "\n\r\0" ); + tcp_client.send_all( ( char *)aux, strlen( (char * )aux ) ); + tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) ); + } + } + else + { + if ( print_values ) debug_msg ("Objeto CBx ( %d ) nao encontrado", print_this_cb ); + } } + if ( print_hex_cb_all ) + { + print_hex_cb_all = false; + + if ( v_cb -> size () == 0 ) + { + send_msg("known CBx :: 0"); + } + + for ( register uint8_t j = 0; j < v_cb->size(); j++ ) + { + uint8_t * ptr = ( uint8_t * ) v_cb->get_element( j ); + + if ( ptr != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) ptr ); + for ( register int i = 0; i < sizeof( Call_Box ); i++ ) + { + if( debug_uart3 ) pc.printf("%x", *ptr++ ); + + if ( ( i % 32 ) == 0 ) + { + if( i != 0 ) + { + if( debug_uart3 ) pc.printf("\n\r> "); + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + if ( debug_uart3 ) pc.printf("\n\r> "); + + if ( tcp_session ) { + char aux[ ( sizeof( Call_Box ) * 3 ) + 3 ]; + + for ( register int i = 0; i < ( sizeof( Call_Box ) * 3 ) + 3 ; i++ ) aux [ i ] = 0; + + uint8_t * ptr = ( uint8_t * ) v_cb->get_element( j ); + + for ( register int i = 0; i < sizeof( Call_Box ); i++ ) + { + char tmp[ 16 ]; + sprintf( tmp, "%x ", *ptr++ ); + strcat( aux, tmp ); + } + + strcat( aux, "\n\r\0" ); + tcp_client.send_all( ( char *)aux, strlen( (char * )aux ) ); + tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) ); + } + } + else + { + if ( print_values ) + { + debug_msg ("Objeto CBx ( %d ) nao encontrado", j ); + } + else + { + send_msg ("Objeto CBx ( %d ) nao encontrado", j ); + } + } + } + } + //begin Sip debug print + { + if ( print_sip_var ) + { + print_sip_var = false; + Call_Box * cb = __find_CB__ ( v_cb, print_this_sip ); + if ( cb != NULL ) + { + if( ( cb -> sip ) != NULL ) + { + cb -> sip -> print_yourself (); + } + else + { + if( print_values ) + { + debug_msg("Sip param of %d equals NULL", print_this_sip ); + } + else + { + send_msg("Sip param of %d equals NULL", print_this_sip ); + } + } + } + else + { + if ( print_values ) + { + debug_msg ("Objeto CBx ( %d ) nao encontrado", print_this_cb ); + } + else + { + send_msg ("Objeto CBx ( %d ) nao encontrado", print_this_cb ); + } } + } + + if ( print_sip_all ) + { + print_sip_all = false; + + if ( v_cb -> size () == 0 ) + { + send_msg("known CBx :: 0"); + } + + for ( register uint8_t i = 0; i < v_cb->size(); i++ ) + { + Call_Box * cb = (Call_Box *)v_cb->get_element( i ); + + if ( cb != NULL ) + { + if( ( cb -> sip ) != NULL ) + { + cb -> sip -> print_yourself (); + } + else + { + if( print_values ) + { + debug_msg("Sip param of %d equals NULL", print_this_sip ); + } + else + { + send_msg("Sip param of %d equals NULL", print_this_sip ); + } + } + } + else + { + if( print_values ) + { + debug_msg("CBx %d not found", print_this_sip ); + } + else + { + send_msg("CBx %d not found", print_this_sip ); + } + } + } + } + + if ( print_hex_sip_var ) + { + uint8_t * ptr = NULL; + + print_hex_sip_var = false; + Call_Box * cb = __find_CB__ ( v_cb, print_hex_this_sip ); + if( cb != NULL ) + { + if( ( cb -> sip ) != NULL ) + ptr = ( uint8_t * ) cb -> sip; + } + + if ( ptr != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) ptr ); + for ( register int i = 0; i < sizeof( Sip ); i++ ) + { + if( debug_uart3 ) pc.printf("%x", *ptr++ ); + + if ( ( i % 32 ) == 0 ) + { + if( i != 0 ) + { + if( debug_uart3 ) pc.printf("\n\r> "); + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + if ( debug_uart3 ) pc.printf("\n\r> "); + + if ( tcp_session ) { + char aux[ ( 32 * 3 ) + 5 ]; + + for ( register int i = 0; i < ( 32 * 3 ) + 5 ; i++ ) aux [ i ] = 0; + + ptr = NULL; + + print_hex_sip_var = false; + Call_Box * cb = __find_CB__ ( v_cb, print_hex_this_sip ); + if( cb != NULL ) + { + if( ( cb -> sip ) != NULL ) + ptr = ( uint8_t * ) cb -> sip; + } + + if ( ptr != NULL ) + { + bool finished = false; + volatile int i = 0; + int count = 0; + Timer dont_overwrite_tcp_buffer; + dont_overwrite_tcp_buffer.reset (); + dont_overwrite_tcp_buffer.start (); + + while ( !finished ) + { + if( dont_overwrite_tcp_buffer.read_ms () >= 500 ) + { + dont_overwrite_tcp_buffer.reset(); + for ( ; i < sizeof( Sip ); i++ ) + { + char tmp[ 16 ]; + sprintf( tmp, "%x ", *ptr++ ); + strcat( aux, tmp ); + count++; + + if ( count >= 32 ) + { + count = 0; + i++; + break; + } + } + strcat ( aux, "\n\r\0" ); + tcp_client.send_all ( ( char *)aux, strlen( (char * )aux ) ); + if ( i >= sizeof ( Sip ) ) finished = true; + strcpy ( aux, "\0" ); + } + } + dont_overwrite_tcp_buffer.reset(); + dont_overwrite_tcp_buffer.stop(); + tcp_client.send_all ( "\r\n> ", strlen( "\r\n> " ) ); + } + } + } + else + { + if ( print_values ) debug_msg ("Objeto CBx ( %d ) nao encontrado", print_this_cb ); + } + } + /* + if ( print_hex_cb_all ) + { + print_hex_cb_all = false; + + if ( v_cb -> size () == 0 ) + { + send_msg("known CBx :: 0"); + } + + for ( register uint8_t j = 0; j < v_cb->size(); j++ ) + { + uint8_t * ptr = ( uint8_t * ) v_cb->get_element( j ); + + if ( ptr != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) ptr ); + for ( register int i = 0; i < sizeof( Call_Box ); i++ ) + { + if( debug_uart3 ) pc.printf("%x", *ptr++ ); + + if ( ( i % 32 ) == 0 ) + { + if( i != 0 ) + { + if( debug_uart3 ) pc.printf("\n\r> "); + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + if ( debug_uart3 ) pc.printf("\n\r> "); + + if ( tcp_session ) { + char aux[ ( sizeof( Call_Box ) * 3 ) + 3 ]; + + for ( register int i = 0; i < ( sizeof( Call_Box ) * 3 ) + 3 ; i++ ) aux [ i ] = 0; + + uint8_t * ptr = ( uint8_t * ) v_cb->get_element( j ); + + for ( register int i = 0; i < sizeof( Call_Box ); i++ ) + { + char tmp[ 16 ]; + sprintf( tmp, "%x ", *ptr++ ); + strcat( aux, tmp ); + } + + strcat( aux, "\n\r\0" ); + tcp_client.send_all( ( char *)aux, strlen( (char * )aux ) ); + tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) ); + } + } + else + { + if ( print_values ) debug_msg ("Objeto CBx ( %d ) nao encontrado", j ); + } + } + } + */ + }//end Sip debug print + + if( dcallshow_rtp == true ){ + dcallshow_rtp = false; + send_msg(":: CAll RTP :: %u", v_call->size() ); + for( register uint8_t i = 0; i < v_call->size(); i++ ) { + VZ_call * call = ( VZ_call * )v_call->get_element( i ); + if( call != NULL ) + { + send_msg("CBX ( %d, %d ) - Server ( %d, %d )", + call->get_cb_ext(), + call->get_cb_port(), + call->get_rtp_server_ext(), + call->get_rtp_server_port() + ); + } + } + } + + if ( print_call_var ) + { + print_call_var = false; + VZ_call * call = __find_Call__( v_call, print_this_call ); + if ( call != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) call ); + call -> print_yourself (); + } + else + { + if( print_values ) + { + debug_msg("Call %d not found", print_this_call ); + } + else + { + send_msg("Call %d not found", print_this_call ); + } + } + } + + if ( print_hex_call_var ) + { + print_hex_call_var = false; + VZ_call * call = __find_Call__( v_call, print_hex_this_call ); + + uint8_t * ptr = NULL; + if( call != NULL ) + { + ptr = ( uint8_t * ) call; + } + + if ( ptr != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) ptr ); + for ( register int i = 0; i < sizeof( VZ_call ); i++ ) + { + if( debug_uart3 ) pc.printf("%x", *ptr++ ); + + if ( ( i % 32 ) == 0 ) + { + if( i != 0 ) + { + if( debug_uart3 ) pc.printf("\n\r> "); + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + if ( debug_uart3 ) pc.printf("\n\r> "); + + if ( tcp_session ) { + char aux[ ( 32 * 3 ) + 5 ]; + + for ( register int i = 0; i < ( 32 * 3 ) + 5 ; i++ ) aux [ i ] = 0; + + ptr = NULL; + + VZ_call * call = __find_Call__( v_call, print_hex_this_call ); + + uint8_t * ptr = NULL; + if( call != NULL ) + { + ptr = ( uint8_t * ) call; + } + + if ( ptr != NULL ) + { + bool finished = false; + volatile int i = 0; + int count = 0; + Timer dont_overwrite_tcp_buffer; + dont_overwrite_tcp_buffer.reset (); + dont_overwrite_tcp_buffer.start (); + + while ( !finished ) + { + if( dont_overwrite_tcp_buffer.read_ms () >= 20 ) + { + dont_overwrite_tcp_buffer.reset(); + for ( ; i < sizeof( VZ_call ); i++ ) + { + char tmp[ 16 ]; + sprintf( tmp, "%x ", *ptr++ ); + strcat( aux, tmp ); + count++; + + if ( count >= 32 ) + { + count = 0; + i++; + break; + } + } + strcat ( aux, "\n\r\0" ); + tcp_client.send_all ( ( char *)aux, strlen( (char * )aux ) ); + if ( i >= sizeof ( VZ_call ) ) finished = true; + strcpy ( aux, "\0" ); + } + } + dont_overwrite_tcp_buffer.reset(); + dont_overwrite_tcp_buffer.stop(); + tcp_client.send_all ( "\r\n> ", strlen( "\r\n> " ) ); + } + } + } + else + { + if( print_values ) + { + debug_msg("Call %d not found", print_this_call ); + } + else + { + send_msg("Call %d not found", print_this_call ); + } + } + } + + + if ( print_hex_rtp_var ) + { + print_hex_rtp_var = false; + VZ_call * call = __find_Call__( v_call, print_hex_this_rtp ); + + uint8_t * ptr = NULL; + if( call != NULL ) + { + ptr = ( uint8_t * ) call -> check_rtp (); + } + + if ( ptr != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) ptr ); + for ( register int i = 0; i < sizeof( RTP ); i++ ) + { + if( debug_uart3 ) pc.printf("%x", *ptr++ ); + + if ( ( i % 32 ) == 0 ) + { + if( i != 0 ) + { + if( debug_uart3 ) pc.printf("\n\r> "); + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + else + { + if( debug_uart3 ) pc.printf(" "); + } + } + if ( debug_uart3 ) pc.printf("\n\r> "); + + if ( tcp_session ) { + char aux[ ( 32 * 3 ) + 5 ]; + + for ( register int i = 0; i < ( 32 * 3 ) + 5 ; i++ ) aux [ i ] = 0; + + ptr = NULL; + + VZ_call * call = __find_Call__( v_call, print_hex_this_rtp ); + + uint8_t * ptr = NULL; + if( call != NULL ) + { + ptr = ( uint8_t * ) call -> check_rtp (); + } + + if ( ptr != NULL ) + { + bool finished = false; + volatile int i = 0; + int count = 0; + Timer dont_overwrite_tcp_buffer; + dont_overwrite_tcp_buffer.reset (); + dont_overwrite_tcp_buffer.start (); + + while ( !finished ) + { + if( dont_overwrite_tcp_buffer.read_ms () >= 20 ) + { + dont_overwrite_tcp_buffer.reset(); + for ( ; i < sizeof( RTP ); i++ ) + { + char tmp[ 16 ]; + sprintf( tmp, "%x ", *ptr++ ); + strcat( aux, tmp ); + count++; + + if ( count >= 32 ) + { + count = 0; + i++; + break; + } + } + strcat ( aux, "\n\r\0" ); + tcp_client.send_all ( ( char *)aux, strlen( (char * )aux ) ); + if ( i >= sizeof ( RTP ) ) finished = true; + strcpy ( aux, "\0" ); + } + } + dont_overwrite_tcp_buffer.reset(); + dont_overwrite_tcp_buffer.stop(); + tcp_client.send_all ( "\r\n> ", strlen( "\r\n> " ) ); + } + } + } + else + { + if( print_values ) + { + debug_msg("Call %d not found", print_this_rtp ); + } + else + { + send_msg("Call %d not found", print_this_rtp ); + } + } + } + + if ( print_rtp_var ) + { + print_rtp_var = false; + VZ_call * call = __find_Call__( v_call, print_this_rtp ); + if ( call != NULL ) + { + if ( call -> check_rtp () != NULL ) + { + send_msg ("Values :: %p\r\n", ( void *) call -> check_rtp () ); + call -> rtp_print_yourself (); + } + else + { + if( print_values ) + { + debug_msg("Call->RTP %d not found", print_this_rtp ); + } + else + { + send_msg("Call->RTP %d not found", print_this_rtp ); + } + } + } + else + { + if( print_values ) + { + debug_msg("Call->RTP %d not found", print_this_rtp ); + } + else + { + send_msg("Call->RTP %d not found", print_this_rtp ); + } + } + } + + //end debug_print - // zera os contadores de cks de pacotes recebidos na interface CBx->Header, e outros contadores relacionados if( reset_cks == true ) { pkg_cksok = 0; pkg_ckserr = 0; @@ -903,164 +1588,63 @@ 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; - } - - - // rotina de teste para sobrecarga do processamento do cbx. + 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 ) ); } - // toggle nos leds de debug da header. - if( led_sync_timer.read() >= 1 ) { + if( led_sync_timer.read() > 1 ) { led_sync_timer.reset(); led3 = !led3; CAB_LED = !CAB_LED; } - - // rotina de teste ( usados durante desenvolvimento - if( main_test ) - { - for ( register uint8_t i = 0; i < v_cb->size(); i++ ) + + static int test_ext = 5102; + static int test_port = 5102; + + if ( tango ) + { + if ( v_cb -> size () >= 27 ) { - Call_Box * cb = (Call_Box *) v_cb->get_element (i); - if( ( cb != NULL ) && ( cb -> get_ext () == 5000 ) ) - { - main_test = false; - cb -> init_rtp_timer (); - } - } + tango = false; + test_timer.start (); + } + + ext = test_ext++; + port = test_port++; + type = __REGISTRY__; + data = buffer; } - - // begin switch para tratemento de pacote baseado no type + + 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__ : {} break; case __CB_BYE__ : { - /*** - end call - -- Fluxo -- - [ Principio ] - -- Receber um pedido de bye - -- procurar e encerrar a ligacao - - - Incrementa o contador de pacotes recebidos - - Procura por este cbx no vetor logico de CBx. - - Em caso de nao localizacao - Nao executa tratamento e exibe mensagem informando, caso seja habilitado degub - - Em caso de localizacao do cbx - - Seta o BIT7 para ACK - - assume que esta ligacao já foi removida - - procura por essa call no vetor logico de calls - - Em caso de nao localizacao - - Executa Busca no vetor logico de CBX - - Em caso de localizacao - - assume que esta ligacao já foi removida - - Confirma que a ligacao nao tinha sido removida - - Envia pacote de BYE para o servidor asterisk ( * ) - - Recupera o TimeSlice ( ts ) usado nesta call - - Atribui o TS 0 neste cbx - - Preenche a posição do TS com 0 - - Retorna o status do CBx e do SIP deste CBx para idle - - Remove a call do vetor - - Envia pacote de ack para o CBx - - Atualiza o id da próxima msg que sera enviada para este CBx - - Em caso de nao localizacao - Exibe mensagem informando que exta call ja tinha sido removida, caso habilitado debug - - Em caso de localizacao - - Confirma que a ligacao nao tinha sido removida - - Envia pacote de BYE para o servidor asterisk ( * ) - - Recupera o TimeSlice ( ts ) usado nesta call - - Atribui o TS 0 neste cbx - - Preenche a posição do TS com 0 - - Retorna o status do CBx e do SIP deste CBx para idle - - Remove a call do vetor - - Envia pacote de ack para o CBx - - Atualiza o id da próxima msg que sera enviada para este CBx - - Deleta o objeto call. - - Em caso de nao localizacao - Exibe mensagem informando que exta call ja tinha sido removida, caso habilitado debug - ***/ - cb_bye_counter++; Call_Box * cb = __find_CB__( v_cb, ext ); if( cb != NULL ) { @@ -1084,30 +1668,27 @@ 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" ); - - // ok, mas nem sempre o cbx "entrou" em call - // Faz-se agora a busca no vetor logico de CBx e nao no de calls como acima + + //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; - // nao entra nesse if caso tenha sido removido no for de cima. if( cb->get_status() != cb_idle ) { already_removed = false; cb->send_bye(); @@ -1119,10 +1700,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(); } } } @@ -1130,35 +1714,15 @@ 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__ : { - /*** - init call - [ Principio ] - -- Receber um pedido de chamada - -- tratar com o cbx o andamento da negociacao SIP ( informando disponibilidade de TS ) - -- tratar com o * a negociacao SIP - - -- Fluxo -- - - Incrementa o contador de pacotes de pedido de chamada ( invite ) enviados. - - Procura por este CBx no vetor logico de CBX - - Em caso de nao localizacao - - Verifica se nao existem mais cbx criados do que o permitido por definicao de projeto - - Tenta criar o objeto CBx - - Caso consiga criar : adiciona o novo elemento no vetor logico de CBx - - Caso nao consiga criar : Exibe msg de erro condicionada a debuf e seta variavel indicando ausencia de memoria - - Em caso de localizacao ( ou tenha conseguido criar no caso acima ) - - Atribui o valor recebido no pacote na posicao ID como sendo o id da proxima msg - - Verifica o status do CBx - - Caso status idle, inicia timer de tratamento de envio de ACK pro CBx - - Invoca rotina de tratamento SIP deste pedido de chamada. - ***/ - + if( drop_invite_pkg ){ + debug_msg("Dropando invite pck msg id :: %d", data[ 0 ] ); + break; + } invite_counter++; if( debug_invite ) debug_msg("Request Invite received from Cbx %i", ext); Call_Box * cb = __find_CB__( v_cb, ext ); @@ -1180,36 +1744,12 @@ if( cb->status == cb_idle ){ cb->set_invite_response_ok(); cb->invite_retry_count_reset(); - cb -> reset_rtp_timer (); - cb -> init_rtp_timer (); } invite_handler( v_call, v_cb, ts, cb ); } } break; case __REGISTRY__ : { - /*** - [ Principio ] - -- Receber um pacote de registro - -- Encaminhar para o * - - -- Fluxo -- - - incrementa o contador de pacotes de registro recebidos - - Procura por este cbx no vetor logico de CBx. - - Verifica se nao existem mais cbx criados do que o permitido por definicao de projeto - - Caso nao exista - - Verifica se o CBx foi encontrado no vetor - - Caso nao tenha sido - - Tentar criar este elemento - - Verifica criacao bem sucedida - - Caso tenha criado o elemento - - Adiciona o mesmo no vetor logico de CBX - - Caso nao tenha criado o elemento - - seta variavel de erro - - exibe mensagem de erro condicionada a debug. - - Caso o CBx tenha sido encontrado ( ou criado acima ) - - Envia pacote de registro para o * - ***/ registry_counter++; Call_Box * cb = __find_CB__( v_cb, ext ); if( v_cb->size() < __MAX_CB_IN_A_BRANCH__ ) { @@ -1229,96 +1769,51 @@ if( debug_main ) debug_msg("Registered %d - %d", ext, port ); if( cb != NULL ) cb->registry(); + } break; case __BOOT__ : { - /*** - [ Principio ] - -- Receber um pacote de boot do CBx - -- Encaminhar um pacote do tipo "Registro" para o CBx - [ NOTA ] Por decisao de projeto, o CBx responde pacotes do tipo __REGISTRY__ pendindo pra se registrar. - - -- Fluxo -- - - Incrementa o contador de pacotes de boot recebidos - - Envia para o CBx remetendo o mesmo pacote, contendo o tipo __REGISTRY__ e o id como sendo o id recebido "OR" BIT7 - - ***/ boot_counter++; 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; case __FW__ : { - /*** - [ Principio ] - -- Encaminhar para o servidor predeterminado todo pacote do tipo __FW__ - - -- Fluxo -- - - Incrementa o contador de pacotes de __FW__ recebidos - - invoca rotina que exporta este pacote para o servidor - ***/ - fw_counter++; if( debug_fw_print ) send_msg("::FW pkg from %d - %d::", ext, port ); fw_cbx_pkg( ext, port, ( char *)buffer ); } break; case __BOOTLOADER_CBX__ : { - /*** - [ Principio ] - -- A definir, a priori a header seria um bypass responsavel apenas por gerenciar um TS. - -- Fluxo -- - - incrementa o contador de pacote de bootloader CBx recebidos - - ??? - ***/ bootloader_cbx_counter++; + //int ret = bl_cbx_reply_to_eth( ext, ( char * )data ); } break; - case __PROMPT__ : { - /*** - [ Principio ] - -- Receber um pacote do CBx - -- Criar, adicionar e registrar o CBx remetente - -- Exibir na tela possiveis comandos/saidas do CBx de interesse. - -- Fluxo -- - - Procura por este cbx no vetor logico de CBx. - - Verifica se o CBx foi encontrado no vetor - - Caso nao tenha sido encontrado - - Verifica se nao existem mais cbx criados do que o permitido por definicao de projeto - - Caso nao exista - - Tentar criar este elemento - - Verifica criacao bem sucedida - - Caso nao tenha criado o elemento - - seta variavel de erro - - Caso tenha criado o elemento - - Adiciona o mesmo no vetor logico de CBX - - Caso tenha sido encontrado ( ou criado no caso acima ) - - Encaminha pedido de registro para o * - - Verifica se o pacote recebido possui como conteudo "ping" - - em caso positivo - - exibe msg indicativa condicionada a debug - - em caso negativo - - Incrementa o contador de pacotes recebidos - - Exibe conteudo de pacote ( 32 primeiros bytes ) condicionado a debug - ***/ - + case __PROMPT__ : { 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 ); } } @@ -1328,7 +1823,7 @@ if( debug_ping ) send_msg( "Prompt pkg from ( %i, %i ) :: Ping", ext, port ); } else { prompt_counter++; - //FIXME acumular a string e mandar via send_msg + //fixme isso nao poderia ser resolvido com um sendmsg ? send_msg( "Prompt pkg from ( %i, %i ) ::", ext, port ); for( register uint8_t i = 0; i < 32; i++ ) { if( debug_uart3 ) pc.printf("%c", data[ i ] ); @@ -1336,51 +1831,33 @@ } if( debug_uart3 ) pc.printf("\n\r> "); - if( tcp_session && !udp_query ) { - char aux[ CB_BUFFER_SIZE + 3 ]; - strncpy( aux, (char * )data, CB_BUFFER_SIZE ); + 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> " ) ); } - else if( udp_query ) - { - char aux[ CB_BUFFER_SIZE + 3 ]; - strncpy( aux, (char * )data, CB_BUFFER_SIZE ); - strcat( aux, "\n\r\0" ); - udp_query_send_msg( ( char *)data ); - udp_query_send_msg( "\r\n> " ); - } } } break; case __AUDIO__ : { - /*** - [ Principio ] - -- Receber pacote de audio do CBx - -- Encaminhar para o * - -- Fluxo -- - - Incrementa o contador de pacotes recebidos - - Procura por este cbx no vetor logico de calls. - - Caso nao encontre - - Exibe mensagem de erro condicionada a debug - - Caso encontre - - Encaminha o pacote para o servidor - - Reseta o timer de idle desta ligacao - - Busca pelo CBX no vetor logico de CBx - - Caso encontre - - Informa que esta tendo comunicacao CBx->Header - ***/ audio_counter++; VZ_call * call = __find_Call__( v_call, ext ); if( call != NULL ) { - // Por definicao de projeto, os dados de audio comecam no data + 2 - // esses 2 bytes foram usados para id de debug durante o desenvolvimento 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 ( drop_rtp_from_cbx_pkg ) + { + led2 = !led2; + break; + } + + if( cb != NULL ){ + //cb->reset_elapsed_time(); cb->set_invite_response_ok(); cb->invite_retry_count_reset(); } @@ -1389,34 +1866,19 @@ } } break; - }//end switch para tratemento de pacote baseado no type + }// fim switch { // rajada - /*** - [ Principio ] - -- Verifica se existem CBx em ligaçao - -- Verifica se os mesmos estao enviando pacotes de audio - -- Re-envio o pacote avisando que o CBx pode entrar no status "on_call" - ***/ + //if( invite_retry_time == true ){ + // invite_retry_time = false; if( invite_retry_timer.read_ms() > 30 ) { invite_retry_timer.reset(); static int retry_invite_pkg = 0; if( retry_invite_pkg >= v_cb->size() ) retry_invite_pkg = 0; - // procura por CBx em ligaçao sequencialmente - int i = 0; - - led4 = 1; - - /* - // por hipótese esse valor esta sendo corrompido quando recebido UDP - for ( ; i < v_cb->size(); i++ ) - { - { - led4 = 0; - } - + register int i = 0; + for( ; i < v_cb->size(); i++ ) { Call_Box * cb = (Call_Box * )v_cb->get_element( i ); if( ( cb->status == cb_ringing ) || ( cb->status == cb_trying ) || ( cb->status == cb_on_call ) ) { if( i > retry_invite_pkg ) { @@ -1425,30 +1887,28 @@ } } } - + if( i != v_cb->size() ){ Call_Box * cb = (Call_Box *)v_cb->get_element( retry_invite_pkg++ ); - + if( ( cb->status == cb_ringing ) || ( cb->status == cb_trying ) || ( cb->status == cb_on_call ) ) { if( cb->get_invite_response() == false ) { + //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); buffer[ __TIMESLICE_PLACE__ ] = cb->get_timeslice(); - - // re-envia pacote confirmando que ligacao esta ok, CBx pode ligar o mic. e o speaker - 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() ); } - - // fim das tentativas if( cb->get_invite_retry_count() == 0 ) { cb->send_bye(); ts->return_timeslice( cb->get_timeslice() ); cb->set_timeslice( 0x00 ); + //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); for( register uint8_t i = 0; i < v_call->size(); i++ ) { @@ -1466,73 +1926,59 @@ } } } - */ } - } - - /*** - [ Principio ] - -- Para cada CBx em ligaçao - -- Verificar e encaminhar pacotes recebidos da interface ETH-Header-CBx - -- Fluxo -- - - Para cada elemento do vetor call - - Verificar se consta algo pendente para processamento no sentido ETH->Header->Cbx - - Caso existe - - Procurar por este CBx no vetor lógico de CBx - - Caso seja encontrado - - Enviar pacote recebido para este CBx - - Caso nao seja encontrado - - Exibe msg de erro condicionado a debug - ***/ - + } // fim rajada + 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(); - - uint8_t * pkg2cb = build_cb_package( call->get_cb_ext(), cb_port, __AUDIO__, + 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 ); - } + } + + } else if( debug_main ) debug_msg("received missed package from CBx :: %i -- Type :: %i", ext, type ); } } - - /*** - [ Principio ] - -- Verificar se já se passou determinada unidade de tempo - -- Baseado nisso, chamar a funcao [ 1 ] refresh ou [ 2 ] wake_all_up - [ 1 ] -- Encaminha periodicamente um pacote de __REGISTRY__ para cada CBx, um por vez. - [ 2 ] -- Busca por elementos que constem sem seus pares registrados e manda um __PROMPT__ ping para cada um, um por vez. - ***/ + + //if( v_call->size() == 0 ) refresh( v_cb, buffer, write_buffer, NULL ); + + if( timer_sync_refresh.read_ms() > 250 ) { + timer_sync_refresh.reset(); - if( timer_sync_refresh.read_ms() > 250 ) - { - timer_sync_refresh.reset(); - static uint8_t time_to_mode = TIME_TO_REFRESH; - if( time_to_mode == TIME_TO_REFRESH ) - { - time_to_mode = TIME_TO_WAKE_UP; - refresh( v_cb ); - } - else - { - time_to_mode = TIME_TO_REFRESH; - if( wake_all ) if( v_call->size() == 0 ) wake_all_up( v_cb ); + static uint8_t mode = TIME_TO_REFRESH; + + if( mode == TIME_TO_REFRESH ) { + mode = TIME_TO_WAKE_UP; + refresh( v_cb, buffer, write_buffer, NULL ); + } else { + 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 ? - // end call int ext_to__be_removed = sip_manager( v_cb ); if( ext_to__be_removed > 0x00 ) { Call_Box * cb = __find_CB__( v_cb, ext_to__be_removed ); @@ -1553,26 +1999,26 @@ } } + //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(); } } else if( debug_main ) debug_msg("Missed bye request from * CBx :: %d", ext ); - } + } /* 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 já em andamento com o * */ + /* tratamento de pedidos de ligação */ invite_handler( v_call, v_cb, ts, NULL ); - + /* rotina de verificação de TS's perdidos */ if( ( v_call->size() == 0 ) && ( ts->remain_timeslices() != __MAX_TIMESLICES__ ) ) { bool ts_reset = true; @@ -1583,44 +2029,29 @@ break; } } - if ( ts_reset ) - { - if ( debug_invite ) debug_msg ("Resetando TS"); - ts -> reset (); + if( ts_reset ) { + 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); - if ( cb != NULL ) - { - 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 () ); - set_status ( cb -> status, cb_idle ); - set_status ( cb->sip->status, sip_idle ); - cb -> reset_rtp_timer (); - cb -> set_rtp_port ( 0 ); - } - } - } - + + //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(); - // atribui o valor default para a variavel type type = __DO_NOTHING__; - - // verifica o status da conexao ETH, caso exteja conectado ( == 0 ) atribui o valor maximo ao contador de controle + if( eth_status == 0 ) eth_wdt = ETH_CONNECT_TIMEOUT; - - // responsavel por atualizar os contadores de controle utilizados para tickar o wdt - // e tickar o wdt + if( wdt_timer.read() >= 1 ) { - //FIXME remove myself + //registry_test = true; + //invite_retry_time = true; + uptime++; wdt_timer.reset(); @@ -1634,10 +2065,8 @@ if( eth_wdt && external_wdt && pkg_wdt ){ wdt.kick(); } - } - - // exibe informacoes referentes ao wdt, ultimo reset, status da eth, tempo em segundos desde o ultimo tick dowdt externo, - // tempo em segundos desde o ultimo pacote recebido da interface fibra + } + if( debug_wdt ) { send_msg("lpc_low_level_input_counter :: %d", lpc_low_level_input_counter ); lpc_low_level_input_counter = 0; @@ -1661,6 +2090,6 @@ RX_CB_IDLE ); } - } - }//fim while ( main loop ) + } + } } \ No newline at end of file