Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Sat Jan 10 16:35:11 2015 +0000
Revision:
92:92df17f538a8
Parent:
91:c2a86b1f8aaa
Child:
93:69ccd653c7ca
with supress

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() & ~BIT7 );
klauss 92:92df17f538a8 22 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 81:3656f00ab3db 23
klauss 81:3656f00ab3db 24 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __INVITE__, ( char * )data,
klauss 81:3656f00ab3db 25 cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 81:3656f00ab3db 26
klauss 81:3656f00ab3db 27 return;
klauss 81:3656f00ab3db 28 }
klauss 81:3656f00ab3db 29 }
klauss 81:3656f00ab3db 30 }
klauss 81:3656f00ab3db 31 }
klauss 81:3656f00ab3db 32
klauss 81:3656f00ab3db 33 void bye_pgk_retry_manager( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
klauss 81:3656f00ab3db 34 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 81:3656f00ab3db 35 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 81:3656f00ab3db 36 if( cb->get_status() == cb_idle ){
klauss 81:3656f00ab3db 37 if( cb->get_bye_response() == false ){
klauss 81:3656f00ab3db 38 bye_pkg_retry_timer.reset();
klauss 81:3656f00ab3db 39
klauss 92:92df17f538a8 40 //cb->set_msg_id( cb->get_msg_id() & ~BIT7 );
klauss 92:92df17f538a8 41 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 81:3656f00ab3db 42
klauss 81:3656f00ab3db 43 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__, ( char * )data,
klauss 81:3656f00ab3db 44 cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 81:3656f00ab3db 45
klauss 81:3656f00ab3db 46 return;
klauss 81:3656f00ab3db 47 }
klauss 81:3656f00ab3db 48 }
klauss 81:3656f00ab3db 49 }
klauss 81:3656f00ab3db 50 }
klauss 78:1353744f01e1 51
klauss 74:81c47fff88a5 52 VZ_call * __find_Call__( Vector * v_call, int ext ){
klauss 74:81c47fff88a5 53 VZ_call * call = NULL;
klauss 74:81c47fff88a5 54 for( register int i = 0; i < v_call->size(); i++ ){
klauss 74:81c47fff88a5 55 call = ( VZ_call * )v_call->get_element( i );
klauss 74:81c47fff88a5 56 if( call->get_cb_ext() == ext ) return( call );
klauss 74:81c47fff88a5 57 }
klauss 74:81c47fff88a5 58 return( NULL );
klauss 74:81c47fff88a5 59 }
klauss 74:81c47fff88a5 60
klauss 74:81c47fff88a5 61 /* remove calls por timeout */
klauss 74:81c47fff88a5 62 void call_manager( Vector * v_call, Vector * v_cb, uint8_t * data, uint8_t * write_buffer, Timeslice * ts ){
klauss 81:3656f00ab3db 63 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 74:81c47fff88a5 64 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 92:92df17f538a8 65 if( call->is_timetofinish() || call->cbx_pkg_is_idle() ){
klauss 92:92df17f538a8 66
klauss 92:92df17f538a8 67 if( debug_invite ){
klauss 92:92df17f538a8 68 if( call->cbx_pkg_is_idle() ){
klauss 92:92df17f538a8 69 debug_msg("Call timeout: no pkg");
klauss 92:92df17f538a8 70 } else {
klauss 92:92df17f538a8 71 debug_msg("Call timeout");
klauss 92:92df17f538a8 72 }
klauss 92:92df17f538a8 73 }
klauss 74:81c47fff88a5 74 v_call->remove_element( i );
klauss 74:81c47fff88a5 75 Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
klauss 81:3656f00ab3db 76 if( cb != NULL ){
klauss 74:81c47fff88a5 77 cb->status = cb_idle;
klauss 74:81c47fff88a5 78 ts->return_timeslice( cb->get_timeslice() );
klauss 74:81c47fff88a5 79 cb->set_timeslice( 0x00 );
klauss 74:81c47fff88a5 80 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 92:92df17f538a8 81 // cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 92:92df17f538a8 82 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 74:81c47fff88a5 83 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__,
klauss 74:81c47fff88a5 84 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 74:81c47fff88a5 85 cb->send_bye();
klauss 74:81c47fff88a5 86 set_status( cb->sip->status, sip_idle );
klauss 74:81c47fff88a5 87 cb->re_start_timer();
klauss 91:c2a86b1f8aaa 88 cb->reset_cb_status();
klauss 74:81c47fff88a5 89 }
klauss 74:81c47fff88a5 90 delete( call );
klauss 74:81c47fff88a5 91 }
klauss 74:81c47fff88a5 92 }
klauss 78:1353744f01e1 93 }
klauss 78:1353744f01e1 94
klauss 78:1353744f01e1 95 void invite_handler( Vector * v_call, Vector * v_cb, Timeslice * ts, Call_Box * inviting_cb ){
klauss 78:1353744f01e1 96 uint8_t data[ __CB_BUFFER_SIZE__ ];
klauss 78:1353744f01e1 97 uint8_t write_buffer[ __CB_BUFFER_SIZE__ ];
klauss 78:1353744f01e1 98
klauss 92:92df17f538a8 99 static uint8_t supress = 0;
klauss 92:92df17f538a8 100
klauss 78:1353744f01e1 101 if( inviting_cb != NULL ){
klauss 92:92df17f538a8 102 //if( inviting_cb->status != cb_on_call ){
klauss 92:92df17f538a8 103
klauss 92:92df17f538a8 104 //}
klauss 92:92df17f538a8 105 if( inviting_cb->status == cb_idle ){
klauss 78:1353744f01e1 106 inviting_cb->cb_set_status( cb_trying );
klauss 78:1353744f01e1 107 if( debug_invite ) debug_msg("Request invite cbx status :: cb_trying" );
klauss 78:1353744f01e1 108 }
klauss 78:1353744f01e1 109 }
klauss 78:1353744f01e1 110
klauss 78:1353744f01e1 111 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 78:1353744f01e1 112 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 78:1353744f01e1 113 if( cb->get_status() == cb_idle || cb->get_status() == cb_on_call ) continue;
klauss 78:1353744f01e1 114
klauss 78:1353744f01e1 115 int ext = cb->get_ext();
klauss 78:1353744f01e1 116 int port = cb->get_port();
klauss 78:1353744f01e1 117
klauss 78:1353744f01e1 118 VZ_call * call = NULL;
klauss 78:1353744f01e1 119
klauss 78:1353744f01e1 120 switch( cb->status ){
klauss 78:1353744f01e1 121 case cb_trying : {
klauss 78:1353744f01e1 122 uint8_t temp = cb->get_msg_id();
klauss 78:1353744f01e1 123 cb->set_msg_id( temp |= BIT7 );
klauss 78:1353744f01e1 124 cb->set_timeslice( ts->get_timeslice() );
klauss 78:1353744f01e1 125 if( cb->get_timeslice() == 0x00 ){
klauss 78:1353744f01e1 126
klauss 78:1353744f01e1 127 cb->cb_set_status( cb_idle );
klauss 78:1353744f01e1 128
klauss 78:1353744f01e1 129 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 78:1353744f01e1 130
klauss 78:1353744f01e1 131 send2callboxes( __build_cb_package__( ext, port, __INVITE__,
klauss 78:1353744f01e1 132 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 133
klauss 78:1353744f01e1 134 set_status( cb->sip->status, sip_idle );
klauss 78:1353744f01e1 135
klauss 92:92df17f538a8 136 //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 92:92df17f538a8 137 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 78:1353744f01e1 138
klauss 78:1353744f01e1 139 if( debug_invite ) debug_msg( "-- Trying -- without TS --");
klauss 78:1353744f01e1 140
klauss 78:1353744f01e1 141 return;
klauss 78:1353744f01e1 142 }else{
klauss 78:1353744f01e1 143 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
klauss 78:1353744f01e1 144
klauss 78:1353744f01e1 145 cb->cb_set_status( cb_ringing );
klauss 78:1353744f01e1 146
klauss 92:92df17f538a8 147 cb->set_invite_response_pending();
klauss 92:92df17f538a8 148
klauss 92:92df17f538a8 149 supress++;
klauss 92:92df17f538a8 150
klauss 92:92df17f538a8 151 if( supress == 0x04 ) supress = 0x00;
klauss 92:92df17f538a8 152
klauss 92:92df17f538a8 153 if( supress & BIT0 )
klauss 92:92df17f538a8 154 {
klauss 92:92df17f538a8 155 debug_msg("supress entendi");
klauss 92:92df17f538a8 156 }
klauss 92:92df17f538a8 157 else
klauss 92:92df17f538a8 158 {
klauss 92:92df17f538a8 159 debug_msg("don't supress entendi ");
klauss 92:92df17f538a8 160
klauss 92:92df17f538a8 161 //cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ( ~BIT7 ) );
klauss 92:92df17f538a8 162 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 92:92df17f538a8 163
klauss 92:92df17f538a8 164 send2callboxes( __build_cb_package__( ext, port, __INVITE__,
klauss 92:92df17f538a8 165 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 92:92df17f538a8 166 }
klauss 78:1353744f01e1 167
klauss 81:3656f00ab3db 168 if( debug_invite ) debug_msg("-- %d on TS::%d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 78:1353744f01e1 169 }
klauss 78:1353744f01e1 170 }break;
klauss 78:1353744f01e1 171 case cb_ringing : {
klauss 78:1353744f01e1 172 call = cb->invite();
klauss 82:f55d13babca0 173
klauss 82:f55d13babca0 174 if( cb->get_sip_status() == sip_busy ){
klauss 82:f55d13babca0 175 cb->cb_set_status( cb_busy );
klauss 82:f55d13babca0 176 }else if( call != NULL ){
klauss 78:1353744f01e1 177 if( __find_Call__( v_call, call->get_cb_ext() ) == NULL ) v_call -> add( call );
klauss 78:1353744f01e1 178
klauss 92:92df17f538a8 179 call->init_cbx_pkg_idle_timer();
klauss 92:92df17f538a8 180
klauss 78:1353744f01e1 181 if( cb->get_sip_status() == sip_on_call ){
klauss 78:1353744f01e1 182
klauss 78:1353744f01e1 183 set_status( cb->status, cb_on_call );
klauss 78:1353744f01e1 184
klauss 81:3656f00ab3db 185 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice();
klauss 78:1353744f01e1 186
klauss 92:92df17f538a8 187 //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 92:92df17f538a8 188 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 92:92df17f538a8 189
klauss 92:92df17f538a8 190 if( supress & BIT1 )
klauss 92:92df17f538a8 191 {
klauss 92:92df17f538a8 192 debug_msg("supress ok vai la");
klauss 92:92df17f538a8 193 }
klauss 92:92df17f538a8 194 else
klauss 92:92df17f538a8 195 {
klauss 92:92df17f538a8 196 send2callboxes( __build_cb_package__( ext, port, __INVITE__, ( char * )data,
klauss 92:92df17f538a8 197 cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 92:92df17f538a8 198 debug_msg("send ok liga o mic");
klauss 92:92df17f538a8 199 }
klauss 81:3656f00ab3db 200
klauss 81:3656f00ab3db 201 cb->set_invite_response_pending();
klauss 78:1353744f01e1 202
klauss 78:1353744f01e1 203 if( debug_invite ) debug_msg( "-- ringing -- accepting call request --" );
klauss 78:1353744f01e1 204 }
klauss 78:1353744f01e1 205 }else{
klauss 78:1353744f01e1 206 if( cb->get_sip_status() == sip_denied ) cb->cb_set_status( cb_denied );
klauss 78:1353744f01e1 207 }
klauss 78:1353744f01e1 208 }break;
klauss 78:1353744f01e1 209 case cb_busy : {
klauss 78:1353744f01e1 210 set_status( cb->status, cb_idle );
klauss 78:1353744f01e1 211 ts->return_timeslice( cb->get_timeslice() );
klauss 78:1353744f01e1 212 cb->set_timeslice( 0x00 );
klauss 78:1353744f01e1 213 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 81:3656f00ab3db 214 if( debug_invite ) debug_msg("-- %d on %d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 78:1353744f01e1 215
klauss 92:92df17f538a8 216 //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 92:92df17f538a8 217 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 78:1353744f01e1 218
klauss 78:1353744f01e1 219 send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
klauss 78:1353744f01e1 220 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 221
klauss 78:1353744f01e1 222 if( debug_invite ) debug_msg( "-- Trying -- denying call request << Busy Here >> --" );
klauss 78:1353744f01e1 223
klauss 78:1353744f01e1 224 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 78:1353744f01e1 225 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 78:1353744f01e1 226 if( call->get_cb_ext() == cb->get_ext() ){
klauss 78:1353744f01e1 227 v_call->remove_element( i );
klauss 91:c2a86b1f8aaa 228 if( call != NULL ) delete( call );
klauss 78:1353744f01e1 229 break;
klauss 78:1353744f01e1 230 }
klauss 78:1353744f01e1 231 }
klauss 78:1353744f01e1 232
klauss 78:1353744f01e1 233 cb->send_bye();
klauss 78:1353744f01e1 234 set_status( cb->sip->status, sip_idle );
klauss 78:1353744f01e1 235 cb->re_start_timer();
klauss 78:1353744f01e1 236 }break;
klauss 78:1353744f01e1 237 case cb_denied : {
klauss 78:1353744f01e1 238 ts->return_timeslice( cb->get_timeslice() );
klauss 78:1353744f01e1 239 cb->set_timeslice( 0x00 );
klauss 78:1353744f01e1 240 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 81:3656f00ab3db 241 if( debug_invite ) debug_msg("-- %d on %d --", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] );
klauss 78:1353744f01e1 242
klauss 92:92df17f538a8 243 //cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 92:92df17f538a8 244 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 78:1353744f01e1 245
klauss 78:1353744f01e1 246 send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
klauss 78:1353744f01e1 247 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 248
klauss 78:1353744f01e1 249 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 78:1353744f01e1 250 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 78:1353744f01e1 251 if( call->get_cb_ext() == cb->get_ext() ){
klauss 78:1353744f01e1 252 v_call->remove_element( i );
klauss 91:c2a86b1f8aaa 253 if( call != NULL ) delete( call );
klauss 78:1353744f01e1 254 break;
klauss 78:1353744f01e1 255 }
klauss 78:1353744f01e1 256 }
klauss 91:c2a86b1f8aaa 257 debug_msg("");
klauss 78:1353744f01e1 258 if( debug_invite ) debug_msg( "-- Trying -- denying call request --" );
klauss 78:1353744f01e1 259 set_status( cb->status, cb_idle );
klauss 78:1353744f01e1 260 set_status( cb->sip->status, sip_idle );
klauss 78:1353744f01e1 261 }break;
klauss 78:1353744f01e1 262 }
klauss 78:1353744f01e1 263 }
klauss 74:81c47fff88a5 264 }