Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Thu Apr 23 13:57:54 2015 +0000
Revision:
115:a1e1e2e60a2c
Parent:
114:472502b31a12
Child:
116:39a41ebb675c
implementando retrys wip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
klauss 74:81c47fff88a5 1 #include "call_manager.h"
klauss 74:81c47fff88a5 2
klauss 81:3656f00ab3db 3 Timer invite_pkg_retry_timer;
klauss 81:3656f00ab3db 4 Timer bye_pkg_retry_timer;
klauss 81:3656f00ab3db 5
klauss 81:3656f00ab3db 6 void init_invite_pgk_retry_manager( void ){
klauss 81:3656f00ab3db 7 invite_pkg_retry_timer.start();
klauss 81:3656f00ab3db 8 }
klauss 81:3656f00ab3db 9
klauss 81:3656f00ab3db 10 void init_bye_pgk_retry_manager( void ){
klauss 81:3656f00ab3db 11 bye_pkg_retry_timer.start();
klauss 81:3656f00ab3db 12 }
klauss 81:3656f00ab3db 13
klauss 81:3656f00ab3db 14 void invite_pgk_retry_manager( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
klauss 81:3656f00ab3db 15 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 81:3656f00ab3db 16 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 81:3656f00ab3db 17 if( cb->get_status() == cb_on_call ){
klauss 81:3656f00ab3db 18 if( cb->get_invite_response() == false ){
klauss 81:3656f00ab3db 19 invite_pkg_retry_timer.reset();
klauss 81:3656f00ab3db 20
klauss 92:92df17f538a8 21 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 81:3656f00ab3db 22
klauss 114:472502b31a12 23 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __INVITE__, ( char * )data,
klauss 114:472502b31a12 24 cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 81:3656f00ab3db 25
klauss 81:3656f00ab3db 26 return;
klauss 81:3656f00ab3db 27 }
klauss 81:3656f00ab3db 28 }
klauss 81:3656f00ab3db 29 }
klauss 81:3656f00ab3db 30 }
klauss 81:3656f00ab3db 31
klauss 81:3656f00ab3db 32 void bye_pgk_retry_manager( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
klauss 81:3656f00ab3db 33 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 81:3656f00ab3db 34 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 81:3656f00ab3db 35 if( cb->get_status() == cb_idle ){
klauss 81:3656f00ab3db 36 if( cb->get_bye_response() == false ){
klauss 81:3656f00ab3db 37 bye_pkg_retry_timer.reset();
klauss 81:3656f00ab3db 38
klauss 92:92df17f538a8 39 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 81:3656f00ab3db 40
klauss 114:472502b31a12 41 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__, ( char * )data,
klauss 114:472502b31a12 42 cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 81:3656f00ab3db 43
klauss 81:3656f00ab3db 44 return;
klauss 81:3656f00ab3db 45 }
klauss 81:3656f00ab3db 46 }
klauss 81:3656f00ab3db 47 }
klauss 81:3656f00ab3db 48 }
klauss 78:1353744f01e1 49
klauss 74:81c47fff88a5 50 VZ_call * __find_Call__( Vector * v_call, int ext ){
klauss 74:81c47fff88a5 51 VZ_call * call = NULL;
klauss 74:81c47fff88a5 52 for( register int i = 0; i < v_call->size(); i++ ){
klauss 74:81c47fff88a5 53 call = ( VZ_call * )v_call->get_element( i );
klauss 74:81c47fff88a5 54 if( call->get_cb_ext() == ext ) return( call );
klauss 74:81c47fff88a5 55 }
klauss 74:81c47fff88a5 56 return( NULL );
klauss 74:81c47fff88a5 57 }
klauss 74:81c47fff88a5 58
klauss 74:81c47fff88a5 59 /* remove calls por timeout */
klauss 114:472502b31a12 60 void call_manager( Vector * v_call, Vector * v_cb, uint8_t * data, uint8_t * write_buffer, Timeslice * ts ){
klauss 81:3656f00ab3db 61 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 74:81c47fff88a5 62 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 92:92df17f538a8 63 if( call->is_timetofinish() || call->cbx_pkg_is_idle() ){
klauss 92:92df17f538a8 64
klauss 92:92df17f538a8 65 if( debug_invite ){
klauss 92:92df17f538a8 66 if( call->cbx_pkg_is_idle() ){
klauss 97:8985817e8847 67 if( debug_invite ) debug_msg("Call timeout: no pkg");
klauss 92:92df17f538a8 68 } else {
klauss 97:8985817e8847 69 if( debug_invite ) debug_msg("Call timeout");
klauss 92:92df17f538a8 70 }
klauss 92:92df17f538a8 71 }
klauss 74:81c47fff88a5 72 v_call->remove_element( i );
klauss 74:81c47fff88a5 73 Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
klauss 81:3656f00ab3db 74 if( cb != NULL ){
klauss 74:81c47fff88a5 75 cb->status = cb_idle;
klauss 74:81c47fff88a5 76 ts->return_timeslice( cb->get_timeslice() );
klauss 74:81c47fff88a5 77 cb->set_timeslice( 0x00 );
klauss 74:81c47fff88a5 78 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 92:92df17f538a8 79 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 114:472502b31a12 80 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__,
klauss 114:472502b31a12 81 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 74:81c47fff88a5 82 cb->send_bye();
klauss 74:81c47fff88a5 83 set_status( cb->sip->status, sip_idle );
klauss 114:472502b31a12 84 cb -> reset_cb_status();
klauss 74:81c47fff88a5 85 }
klauss 74:81c47fff88a5 86 delete( call );
klauss 74:81c47fff88a5 87 }
klauss 74:81c47fff88a5 88 }
klauss 78:1353744f01e1 89 }
klauss 78:1353744f01e1 90
klauss 78:1353744f01e1 91 void invite_handler( Vector * v_call, Vector * v_cb, Timeslice * ts, Call_Box * inviting_cb ){
klauss 114:472502b31a12 92 uint8_t data[ __CB_BUFFER_SIZE__ ];
klauss 114:472502b31a12 93 uint8_t write_buffer[ __CB_BUFFER_SIZE__ ];
klauss 78:1353744f01e1 94
klauss 114:472502b31a12 95 if( inviting_cb != NULL ){
klauss 114:472502b31a12 96 if( inviting_cb->status == cb_idle ){
klauss 114:472502b31a12 97 inviting_cb->cb_set_status( cb_trying );
klauss 114:472502b31a12 98 if( debug_invite ) debug_msg("Request invite cbx status :: cb_trying" );
klauss 113:db67ae00550e 99 }
klauss 114:472502b31a12 100 }
klauss 114:472502b31a12 101
klauss 114:472502b31a12 102 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 114:472502b31a12 103 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 114:472502b31a12 104 if( cb->get_status() == cb_idle || cb->get_status() == cb_on_call ) continue;
klauss 114:472502b31a12 105
klauss 114:472502b31a12 106 int ext = cb->get_ext();
klauss 114:472502b31a12 107 int port = cb->get_port();
klauss 113:db67ae00550e 108
klauss 114:472502b31a12 109 VZ_call * call = NULL;
klauss 114:472502b31a12 110
klauss 114:472502b31a12 111 switch( cb->status ){
klauss 114:472502b31a12 112 case cb_trying : {
klauss 114:472502b31a12 113 uint8_t temp = cb->get_msg_id();
klauss 114:472502b31a12 114 cb->set_msg_id( temp |= BIT7 );
klauss 114:472502b31a12 115 cb->set_timeslice( ts->get_timeslice() );
klauss 114:472502b31a12 116 if( cb->get_timeslice() == 0x00 ){
klauss 114:472502b31a12 117
klauss 114:472502b31a12 118 cb->cb_set_status( cb_idle );
klauss 114:472502b31a12 119
klauss 114:472502b31a12 120 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 114:472502b31a12 121
klauss 114:472502b31a12 122 send2callboxes( __build_cb_package__( ext, port, __INVITE__,
klauss 114:472502b31a12 123 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 114:472502b31a12 124
klauss 114:472502b31a12 125 set_status( cb->sip->status, sip_idle );
klauss 114:472502b31a12 126
klauss 114:472502b31a12 127 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 114:472502b31a12 128
klauss 114:472502b31a12 129 if( debug_invite ) debug_msg( "-- Trying -- without TS --");
klauss 114:472502b31a12 130
klauss 114:472502b31a12 131 return;
klauss 114:472502b31a12 132 }else{
klauss 114:472502b31a12 133 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
klauss 114:472502b31a12 134
klauss 114:472502b31a12 135 cb->cb_set_status( cb_ringing );
klauss 114:472502b31a12 136
klauss 114:472502b31a12 137 cb->set_invite_response_pending();
klauss 114:472502b31a12 138
klauss 114:472502b31a12 139 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 113:db67ae00550e 140
klauss 114:472502b31a12 141 send2callboxes( __build_cb_package__( ext, port, __INVITE__,
klauss 114:472502b31a12 142 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 109:a5b8264ffbbc 143
klauss 114:472502b31a12 144 if( debug_invite ) debug_msg("-- %d on TS::%d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 114:472502b31a12 145 }
klauss 114:472502b31a12 146 }break;
klauss 114:472502b31a12 147 case cb_ringing : {
klauss 114:472502b31a12 148 call = cb->invite();
klauss 114:472502b31a12 149
klauss 114:472502b31a12 150 if( cb->get_sip_status() == sip_busy ){
klauss 114:472502b31a12 151 cb->cb_set_status( cb_busy );
klauss 114:472502b31a12 152 }else if( call != NULL ){
klauss 114:472502b31a12 153 if( __find_Call__( v_call, call->get_cb_ext() ) == NULL ) v_call -> add( call );
klauss 114:472502b31a12 154
klauss 114:472502b31a12 155 call->init_cbx_pkg_idle_timer();
klauss 114:472502b31a12 156
klauss 114:472502b31a12 157 if( cb->get_sip_status() == sip_on_call ){
klauss 108:18a3702650f3 158
klauss 114:472502b31a12 159 set_status( cb->status, cb_on_call );
klauss 113:db67ae00550e 160
klauss 114:472502b31a12 161 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
klauss 114:472502b31a12 162
klauss 114:472502b31a12 163 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 114:472502b31a12 164
klauss 114:472502b31a12 165 send2callboxes( __build_cb_package__( ext, port, __INVITE__, ( char * )data,
klauss 114:472502b31a12 166 cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 114:472502b31a12 167
klauss 114:472502b31a12 168 cb->set_invite_response_pending();
klauss 114:472502b31a12 169
klauss 114:472502b31a12 170 if( debug_invite ) debug_msg( "-- ringing -- accepting call request --" );
klauss 109:a5b8264ffbbc 171 }
klauss 114:472502b31a12 172 }else{
klauss 114:472502b31a12 173 if( cb->get_sip_status() == sip_denied ) cb->cb_set_status( cb_denied );
klauss 114:472502b31a12 174 }
klauss 114:472502b31a12 175 }break;
klauss 114:472502b31a12 176 case cb_busy : {
klauss 114:472502b31a12 177 set_status( cb->status, cb_idle );
klauss 114:472502b31a12 178 ts->return_timeslice( cb->get_timeslice() );
klauss 114:472502b31a12 179 cb->set_timeslice( 0x00 );
klauss 114:472502b31a12 180 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 114:472502b31a12 181 if( debug_invite ) debug_msg("-- %d on %d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 114:472502b31a12 182
klauss 114:472502b31a12 183 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 114:472502b31a12 184
klauss 114:472502b31a12 185 send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
klauss 114:472502b31a12 186 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 114:472502b31a12 187
klauss 114:472502b31a12 188 if( debug_invite ) debug_msg( "-- Trying -- denying call request << Busy Here >> --" );
klauss 114:472502b31a12 189
klauss 114:472502b31a12 190 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 114:472502b31a12 191 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 114:472502b31a12 192 if( call->get_cb_ext() == cb->get_ext() ){
klauss 114:472502b31a12 193 v_call->remove_element( i );
klauss 114:472502b31a12 194 if( call != NULL ) delete( call );
klauss 114:472502b31a12 195 break;
klauss 114:472502b31a12 196 }
klauss 114:472502b31a12 197 }
klauss 114:472502b31a12 198
klauss 114:472502b31a12 199 cb->send_bye();
klauss 114:472502b31a12 200 set_status( cb->sip->status, sip_idle );
klauss 114:472502b31a12 201 }break;
klauss 114:472502b31a12 202 case cb_denied : {
klauss 114:472502b31a12 203 ts->return_timeslice( cb->get_timeslice() );
klauss 114:472502b31a12 204 cb->set_timeslice( 0x00 );
klauss 114:472502b31a12 205 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 114:472502b31a12 206 if( debug_invite ) debug_msg("-- %d on %d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 114:472502b31a12 207
klauss 114:472502b31a12 208 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 114:472502b31a12 209
klauss 114:472502b31a12 210 send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
klauss 114:472502b31a12 211 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 113:db67ae00550e 212
klauss 114:472502b31a12 213 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 114:472502b31a12 214 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 114:472502b31a12 215 if( call->get_cb_ext() == cb->get_ext() ){
klauss 114:472502b31a12 216 v_call->remove_element( i );
klauss 114:472502b31a12 217 if( call != NULL ) delete( call );
klauss 114:472502b31a12 218 break;
klauss 78:1353744f01e1 219 }
klauss 114:472502b31a12 220 }
klauss 114:472502b31a12 221 if( debug_invite ) debug_msg( "-- Trying -- denying call request --" );
klauss 114:472502b31a12 222 set_status( cb->status, cb_idle );
klauss 114:472502b31a12 223 set_status( cb->sip->status, sip_idle );
klauss 114:472502b31a12 224 }break;
klauss 78:1353744f01e1 225 }
klauss 78:1353744f01e1 226 }
klauss 74:81c47fff88a5 227 }