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 20:24:09 2015 +0000
Revision:
116:39a41ebb675c
Parent:
115:a1e1e2e60a2c
Child:
117:e9facba9db27
inicio do merge da vers?o da ultima vistoria com a da sprint 0

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 116:39a41ebb675c 23 send2callboxes( build_cb_package( cb->get_ext(), cb->get_port(), __INVITE__, ( char * )data,
klauss 116:39a41ebb675c 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 116:39a41ebb675c 41 send2callboxes( build_cb_package( cb->get_ext(), cb->get_port(), __CB_BYE__, ( char * )data,
klauss 116:39a41ebb675c 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 116:39a41ebb675c 54 if ( call != NULL )
klauss 116:39a41ebb675c 55 {
klauss 116:39a41ebb675c 56 if( call->get_cb_ext() == ext ) return( call );
klauss 116:39a41ebb675c 57 }
klauss 74:81c47fff88a5 58 }
klauss 74:81c47fff88a5 59 return( NULL );
klauss 74:81c47fff88a5 60 }
klauss 74:81c47fff88a5 61
klauss 74:81c47fff88a5 62 /* remove calls por timeout */
klauss 116:39a41ebb675c 63 void call_manager( Vector * v_call, Vector * v_cb, Timeslice * ts )
klauss 116:39a41ebb675c 64 {
klauss 116:39a41ebb675c 65 //FixME pode dar problema por conta do static
klauss 116:39a41ebb675c 66 static uint8_t data[ CB_BUFFER_SIZE ], write_buffer[ CB_BUFFER_SIZE ];
klauss 116:39a41ebb675c 67
klauss 81:3656f00ab3db 68 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 74:81c47fff88a5 69 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 92:92df17f538a8 70 if( call->is_timetofinish() || call->cbx_pkg_is_idle() ){
klauss 92:92df17f538a8 71
klauss 92:92df17f538a8 72 if( debug_invite ){
klauss 92:92df17f538a8 73 if( call->cbx_pkg_is_idle() ){
klauss 97:8985817e8847 74 if( debug_invite ) debug_msg("Call timeout: no pkg");
klauss 92:92df17f538a8 75 } else {
klauss 97:8985817e8847 76 if( debug_invite ) debug_msg("Call timeout");
klauss 92:92df17f538a8 77 }
klauss 92:92df17f538a8 78 }
klauss 74:81c47fff88a5 79 v_call->remove_element( i );
klauss 74:81c47fff88a5 80 Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
klauss 81:3656f00ab3db 81 if( cb != NULL ){
klauss 74:81c47fff88a5 82 cb->status = cb_idle;
klauss 74:81c47fff88a5 83 ts->return_timeslice( cb->get_timeslice() );
klauss 74:81c47fff88a5 84 cb->set_timeslice( 0x00 );
klauss 74:81c47fff88a5 85 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 92:92df17f538a8 86 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 116:39a41ebb675c 87 send2callboxes( build_cb_package( cb->get_ext(), cb->get_port(), __CB_BYE__,
klauss 116:39a41ebb675c 88 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 74:81c47fff88a5 89 cb->send_bye();
klauss 74:81c47fff88a5 90 set_status( cb->sip->status, sip_idle );
klauss 116:39a41ebb675c 91 cb -> reset_cb_status ();
klauss 116:39a41ebb675c 92 cb -> set_rtp_port ( 0 );
klauss 116:39a41ebb675c 93 cb -> reset_rtp_timer ();
klauss 74:81c47fff88a5 94 }
klauss 74:81c47fff88a5 95 delete( call );
klauss 74:81c47fff88a5 96 }
klauss 74:81c47fff88a5 97 }
klauss 78:1353744f01e1 98 }
klauss 78:1353744f01e1 99
klauss 78:1353744f01e1 100 void invite_handler( Vector * v_call, Vector * v_cb, Timeslice * ts, Call_Box * inviting_cb ){
klauss 116:39a41ebb675c 101 if ( ( v_call != NULL ) && ( v_cb != NULL ) && ( ts != NULL ) )
klauss 116:39a41ebb675c 102 {
klauss 116:39a41ebb675c 103 uint8_t data[ CB_BUFFER_SIZE ];
klauss 116:39a41ebb675c 104 uint8_t write_buffer[ CB_BUFFER_SIZE ];
klauss 78:1353744f01e1 105
klauss 116:39a41ebb675c 106 if( inviting_cb != NULL ){
klauss 116:39a41ebb675c 107 if( inviting_cb->status == cb_idle ){
klauss 116:39a41ebb675c 108 inviting_cb->cb_set_status( cb_trying );
klauss 116:39a41ebb675c 109 if( debug_invite ) debug_msg("Request invite cbx status :: cb_trying" );
klauss 116:39a41ebb675c 110 }
klauss 113:db67ae00550e 111 }
klauss 113:db67ae00550e 112
klauss 116:39a41ebb675c 113 for( register uint8_t i = 0; i < v_cb->size(); i++ )
klauss 116:39a41ebb675c 114 {
klauss 116:39a41ebb675c 115 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 116:39a41ebb675c 116
klauss 116:39a41ebb675c 117 if ( cb == NULL ) continue;
klauss 116:39a41ebb675c 118
klauss 116:39a41ebb675c 119 if( cb->get_status() == cb_idle || cb->get_status() == cb_on_call ) continue;
klauss 116:39a41ebb675c 120
klauss 116:39a41ebb675c 121 int ext = cb->get_ext();
klauss 116:39a41ebb675c 122 int port = cb->get_port();
klauss 116:39a41ebb675c 123
klauss 116:39a41ebb675c 124 VZ_call * call = NULL;
klauss 116:39a41ebb675c 125
klauss 116:39a41ebb675c 126 switch( cb->status ){
klauss 116:39a41ebb675c 127 case cb_trying : {
klauss 116:39a41ebb675c 128 uint8_t temp = cb->get_msg_id();
klauss 116:39a41ebb675c 129 cb->set_msg_id( temp |= BIT7 );
klauss 116:39a41ebb675c 130 cb->set_timeslice( ts->get_timeslice() );
klauss 116:39a41ebb675c 131 if( cb->get_timeslice() == 0x00 ){
klauss 116:39a41ebb675c 132
klauss 116:39a41ebb675c 133 cb->cb_set_status( cb_idle );
klauss 116:39a41ebb675c 134
klauss 116:39a41ebb675c 135 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 116:39a41ebb675c 136
klauss 116:39a41ebb675c 137 send2callboxes( build_cb_package( ext, port, __INVITE__,
klauss 116:39a41ebb675c 138 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 116:39a41ebb675c 139
klauss 116:39a41ebb675c 140 set_status( cb->sip->status, sip_idle );
klauss 116:39a41ebb675c 141
klauss 116:39a41ebb675c 142 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 116:39a41ebb675c 143
klauss 116:39a41ebb675c 144 if( debug_invite ) debug_msg( "-- Trying -- without TS --");
klauss 116:39a41ebb675c 145
klauss 116:39a41ebb675c 146 cb -> set_rtp_port ( 0 );
klauss 116:39a41ebb675c 147
klauss 116:39a41ebb675c 148 cb -> reset_rtp_timer ();
klauss 116:39a41ebb675c 149
klauss 116:39a41ebb675c 150 return;
klauss 116:39a41ebb675c 151 }else{
klauss 116:39a41ebb675c 152 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
klauss 116:39a41ebb675c 153
klauss 116:39a41ebb675c 154 cb->cb_set_status( cb_ringing );
klauss 116:39a41ebb675c 155
klauss 116:39a41ebb675c 156 cb->set_invite_response_pending();
klauss 116:39a41ebb675c 157
klauss 116:39a41ebb675c 158 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 116:39a41ebb675c 159
klauss 116:39a41ebb675c 160 send2callboxes( build_cb_package( ext, port, __INVITE__,
klauss 116:39a41ebb675c 161 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 116:39a41ebb675c 162
klauss 116:39a41ebb675c 163 if( debug_invite ) debug_msg("-- %d on TS::%d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 116:39a41ebb675c 164 }
klauss 116:39a41ebb675c 165 }break;
klauss 116:39a41ebb675c 166 case cb_ringing : {
klauss 116:39a41ebb675c 167 call = cb->invite();
klauss 114:472502b31a12 168
klauss 116:39a41ebb675c 169 if( cb->get_sip_status() == sip_busy ){
klauss 116:39a41ebb675c 170 cb->cb_set_status( cb_busy );
klauss 116:39a41ebb675c 171 }else if( call != NULL ){
klauss 116:39a41ebb675c 172 if( __find_Call__( v_call, call->get_cb_ext() ) == NULL ) v_call -> add( call );
klauss 116:39a41ebb675c 173
klauss 116:39a41ebb675c 174 call->init_cbx_pkg_idle_timer();
klauss 116:39a41ebb675c 175
klauss 116:39a41ebb675c 176 if( cb->get_sip_status() == sip_on_call ){
klauss 116:39a41ebb675c 177
klauss 116:39a41ebb675c 178 set_status( cb->status, cb_on_call );
klauss 116:39a41ebb675c 179
klauss 116:39a41ebb675c 180 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
klauss 116:39a41ebb675c 181
klauss 116:39a41ebb675c 182 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 116:39a41ebb675c 183
klauss 116:39a41ebb675c 184 send2callboxes( build_cb_package( ext, port, __INVITE__, ( char * )data,
klauss 116:39a41ebb675c 185 cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 116:39a41ebb675c 186
klauss 116:39a41ebb675c 187 cb->set_invite_response_pending();
klauss 116:39a41ebb675c 188
klauss 116:39a41ebb675c 189 if( debug_invite ) debug_msg( "-- ringing -- accepting call request --" );
klauss 116:39a41ebb675c 190 }
klauss 116:39a41ebb675c 191 }else{
klauss 116:39a41ebb675c 192 if( cb->get_sip_status() == sip_denied ) cb->cb_set_status( cb_denied );
klauss 116:39a41ebb675c 193 }
klauss 116:39a41ebb675c 194 }break;
klauss 116:39a41ebb675c 195 case cb_busy : {
klauss 116:39a41ebb675c 196 set_status( cb->status, cb_idle );
klauss 116:39a41ebb675c 197 ts->return_timeslice( cb->get_timeslice() );
klauss 116:39a41ebb675c 198 cb->set_timeslice( 0x00 );
klauss 114:472502b31a12 199 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 116:39a41ebb675c 200 if( debug_invite ) debug_msg("-- %d on %d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 114:472502b31a12 201
klauss 114:472502b31a12 202 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 109:a5b8264ffbbc 203
klauss 116:39a41ebb675c 204 send2callboxes( build_cb_package( ext, port, __CB_BYE__,
klauss 116:39a41ebb675c 205 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 116:39a41ebb675c 206
klauss 116:39a41ebb675c 207 if( debug_invite ) debug_msg( "-- Trying -- denying call request << Busy Here >> --" );
klauss 114:472502b31a12 208
klauss 116:39a41ebb675c 209 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 116:39a41ebb675c 210 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 116:39a41ebb675c 211 if( call->get_cb_ext() == cb->get_ext() ){
klauss 116:39a41ebb675c 212 v_call->remove_element( i );
klauss 116:39a41ebb675c 213 if( call != NULL ) delete( call );
klauss 116:39a41ebb675c 214 break;
klauss 116:39a41ebb675c 215 }
klauss 109:a5b8264ffbbc 216 }
klauss 116:39a41ebb675c 217
klauss 116:39a41ebb675c 218 cb->send_bye();
klauss 116:39a41ebb675c 219 set_status( cb->sip->status, sip_idle );
klauss 116:39a41ebb675c 220 cb -> set_rtp_port ( 0 );
klauss 116:39a41ebb675c 221 cb -> reset_rtp_timer ();
klauss 116:39a41ebb675c 222 }break;
klauss 116:39a41ebb675c 223 case cb_denied : {
klauss 116:39a41ebb675c 224 ts->return_timeslice( cb->get_timeslice() );
klauss 116:39a41ebb675c 225 cb->set_timeslice( 0x00 );
klauss 116:39a41ebb675c 226 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 116:39a41ebb675c 227 if( debug_invite ) debug_msg("-- %d on %d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 116:39a41ebb675c 228
klauss 116:39a41ebb675c 229 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 116:39a41ebb675c 230
klauss 116:39a41ebb675c 231 send2callboxes( build_cb_package( ext, port, __CB_BYE__,
klauss 116:39a41ebb675c 232 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 116:39a41ebb675c 233
klauss 116:39a41ebb675c 234 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 116:39a41ebb675c 235 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 116:39a41ebb675c 236 if( call->get_cb_ext() == cb->get_ext() ){
klauss 116:39a41ebb675c 237 v_call->remove_element( i );
klauss 116:39a41ebb675c 238 if( call != NULL ) delete( call );
klauss 116:39a41ebb675c 239 break;
klauss 116:39a41ebb675c 240 }
klauss 114:472502b31a12 241 }
klauss 116:39a41ebb675c 242 if( debug_invite ) debug_msg( "-- Trying -- denying call request --" );
klauss 116:39a41ebb675c 243 set_status( cb->status, cb_idle );
klauss 116:39a41ebb675c 244 set_status( cb->sip->status, sip_idle );
klauss 116:39a41ebb675c 245 cb -> set_rtp_port ( 0 );
klauss 116:39a41ebb675c 246 cb -> reset_rtp_timer ();
klauss 116:39a41ebb675c 247 }break;
klauss 116:39a41ebb675c 248 }
klauss 78:1353744f01e1 249 }
klauss 78:1353744f01e1 250 }
klauss 74:81c47fff88a5 251 }