Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: main.cpp
- Revision:
- 92:92df17f538a8
- Parent:
- 91:c2a86b1f8aaa
- Child:
- 95:0911808656c5
--- a/main.cpp Thu Jan 08 23:44:08 2015 +0000 +++ b/main.cpp Sat Jan 10 16:35:11 2015 +0000 @@ -156,9 +156,11 @@ send_msg("Ready"); - bool registry_test = false; - static int next_value = 5002; - static int nex_test_registry = next_value; + //bool registry_test = false; + //static int next_value = 5002; + //static int nex_test_registry = next_value; + + bool invite_retry_time = false; /*------------------------------------------ main loop ---------------------------------------------------------------*/ while( true ) { @@ -427,17 +429,17 @@ if( type != __AUDIO__ ) { Call_Box * cb = __find_CB__( v_cb, ext ); if( cb != NULL ) { - if( ( data[ 0 ] & BIT7 ) >= BIT7 ) { + 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 ) ); - } else if( ( data[ 0 ] & BIT7 ) == BIT7 ) { + ( 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->set_invite_response_ok(); + //cb->first_invite_response_ok(); break; } case __CB_BYE__ : { @@ -453,8 +455,16 @@ 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 = __DO_NOTHING__; - if( type != __REGISTRY__ ) 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 ){ + if( call->get_elapsed_time() < 120000 ){ + if( debug_invite ) debug_msg("%d ack bye ignored", ext ); + type = __DO_NOTHING__; + } + } + } } } } @@ -483,7 +493,8 @@ send_msg("Sizeof Watchdog :: %u", sizeof( Watchdog ) ); } - static int wdt_count = 0; + //static int wdt_count = 0; + /* if( registry_test == true ) { registry_test = false; @@ -506,7 +517,8 @@ } } } - + */ + { fd_set fdSet; FD_ZERO(&fdSet); @@ -543,8 +555,8 @@ bool question_alive = ( wake_msg[ 5 ] == '?' ); if( wake_msg[ 5 ] == '*' ) wdt.kick(); - snprintf( wake_msg, 48,"wdt:%u,%u,%u,%c,%u,%u,%u:", uptime, invite_counter, external_wdt, ( wdt.WatchdogCausedReset() ) ? '1' : '0', cb_new_counter, v_call->size(), ts->remain_timeslices() ); - wake_msg[ 48 - 1 ] = 0; + snprintf( wake_msg, 48,"wdt:%u,%u,%u,%c,%u,%u,%u,%u:", uptime, invite_counter, external_wdt, ( wdt.WatchdogCausedReset() ) ? '1' : '0', cb_new_counter, v_call->size(), ts->remain_timeslices(), sip_socket_send_failure ); + 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 ) ) ) { @@ -585,7 +597,6 @@ break; case __CB_BYE__ : { - //FIXME como mandar um BYE pro servidor ? cb_bye_counter++; Call_Box * cb = __find_CB__( v_cb, ext ); if( cb != NULL ) { @@ -593,6 +604,14 @@ data[ 0 ] |= BIT7; cb->set_msg_id( data[ 0 ] ); if( debug_main || debug_invite ) debug_msg( "Request bye from CBx " ); + + debug_msg("----------"); + for( register uint8_t i = 0; i < v_call->size(); i++ ) { + VZ_call * call = (VZ_call *)v_call->get_element( i ); + debug_msg("--%d--", call->get_cb_ext() ); + } + debug_msg("----------"); + bool already_removed = true; for( register uint8_t i = 0; i < v_call->size(); i++ ) { VZ_call * call = (VZ_call *)v_call->get_element( i ); @@ -608,11 +627,15 @@ 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 ) ); - - cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); + + // envia o ack bye depois atualiza o msg_id + cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); delete( call ); cb->re_start_timer(); @@ -637,9 +660,10 @@ 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 ) ); + ( 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() & ~BIT7 ) + 1 ); + cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); cb->re_start_timer(); } @@ -672,6 +696,10 @@ } if( cb != NULL ) { cb->set_msg_id( data[ 0 ] ); + if( cb->status == cb_idle ){ + cb->set_invite_response_ok(); + cb->invite_retry_count_reset(); + } invite_handler( v_call, v_cb, ts, cb ); } } @@ -702,17 +730,16 @@ case __BOOT__ : { boot_counter++; send2callboxes( __build_cb_package__( ext, port, __REGISTRY__, - ( char * )data, data[ 0 ] | BIT7, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); + ( char * )data, data[ 0 ] | BIT7, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); } break; case __TELEMETRY__ : { Call_Box * cb = __find_CB__( v_cb, ext ); if( cb == NULL ) { - send2callboxes( __build_cb_package__( ext, port, __REGISTRY__, - ( char * )data, ( ( data[ 0 ] & ~BIT7 ) + 1 ), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); + // 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 ); @@ -722,12 +749,10 @@ v_cb->add( cb ); if( debug_main ) debug_msg("Added CBx -- %d", ext ); } - */ } - /* if( cb != NULL ){ cb->registry(); - }*/ + } telemetry_counter++; if( debug_telemetry ) send_msg("::Telemetry from %d - %d::", ext, port ); @@ -745,9 +770,9 @@ Call_Box * cb = __find_CB__( v_cb, ext ); if( cb == NULL ) { - send2callboxes( __build_cb_package__( ext, port, __REGISTRY__, - ( char * )data, ( ( data[ 0 ] & ~BIT7 ) + 1 ), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); - /* +// 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 ){ @@ -756,10 +781,9 @@ v_cb->add( cb ); if( debug_main ) debug_msg("Added CBx -- %d", ext ); } - */ } - //if( cb!= NULL ) cb->registry(); + if( cb!= NULL ) cb->registry(); if( xstrmatch( ( uint8_t * )data, ( uint8_t * )"ping" ) ) { if( debug_ping ) send_msg( "Prompt pkg from ( %i, %i ) :: Ping", ext, port ); @@ -789,14 +813,65 @@ if( call != NULL ) { 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->reset_elapsed_time(); + if( cb != NULL ){ + cb->reset_elapsed_time(); + cb->set_invite_response_ok(); + cb->invite_retry_count_reset(); + } } else { if( debug_main ) debug_msg("received missed package from CBx :: %i", ext ); } } break; }// fim switch + + { + if( invite_retry_time == true ){ + invite_retry_time = false; + static int retry_invite_pkg = 0; + if( retry_invite_pkg >= v_cb->size() ) retry_invite_pkg = 0; + + 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 ){ + debug_msg(""); + //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(); + + 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", cb->get_ext() ); + } + 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++ ){ + 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 ); + } + } + } + } for( register uint8_t i = 0; i < v_call->size(); i++ ) { VZ_call * call = ( VZ_call * )v_call->get_element( i ); @@ -816,6 +891,7 @@ } 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() > 500 ) { @@ -859,7 +935,8 @@ } } - cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); + //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 ); + cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 ); //debug_msg("msg_id -- %d", cb->get_msg_id() ); @@ -908,7 +985,8 @@ if( wdt_timer.read() >= 1 ) { //FIXME remove myself - registry_test = true; + //registry_test = true; + invite_retry_time = true; uptime++;