Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface NTPClient mbed-rtos_old mbed
Fork of header_main_public by
main.cpp
00001 #include "bits.h" 00002 #include "utils.h" 00003 #include "configs.h" 00004 #include "UART3Interrupt.h" 00005 #include "parallelcpld.h" 00006 00007 #include "debug.h" 00008 #include "utils.h" 00009 00010 /* 00011 #define set_status(a,b) _set_status(a,b) 00012 #define _set_status(a,b) { \ 00013 a = b; \ 00014 sprintf( debug_msg, "-- State == %d -- Line %d", a, __LINE__ ); \ 00015 debug.sendTo( debug_server, debug_msg, strlen( debug_msg ) ); \ 00016 } 00017 #define whereami() _whereami() 00018 #define _whereami() { \ 00019 sprintf( debug_msg, "-- whereami %d", __LINE__ ); \ 00020 debug.sendTo( debug_server, debug_msg, strlen( debug_msg ) ); \ 00021 } 00022 */ 00023 volatile uint8_t status = 0x00; 00024 00025 bool debug_bool = true; 00026 00027 int main(){ 00028 start_cpld(); 00029 config_lpc(); 00030 00031 /* referencia e inicio da conexao com a ethernet */ 00032 EthernetInterface eth; 00033 00034 int eth_status = __init_eth__( ð ); 00035 00036 if( eth_status ){ 00037 debug_msg("Sem conexao eth"); 00038 } 00039 00040 /* debugs */ 00041 // debug_server.set_address( "192.168.120.144", 9897 ); 00042 // debug.bind( 72133 ); 00043 // debug.init(); 00044 00045 Timer t; 00046 t.start(); 00047 00048 /* representa ramal do call box */ 00049 int ext = 0; 00050 00051 /* representa porta do call box */ 00052 int port = 0; 00053 00054 /* buffer para onde se copia os dados vindos do cb para tratameno interno */ 00055 uint8_t buffer[ __CB_BUFFER_SIZE__ ]; 00056 00057 /* buffer de escrita do pacote de saida que sera enviado pro cb / servidor */ 00058 uint8_t write_buffer[ __CB_BUFFER_SIZE__ ]; 00059 00060 /* ponteiro que aponta para os dados vindo do CPLD */ 00061 uint8_t * buffer_from_cb_ptr = ( uint8_t * )RXBuffer; 00062 00063 /* referencia para os dados contidos no pacote, sem o header */ 00064 uint8_t * data = NULL; 00065 00066 /* gerencia o tipo do pacote para providenciar tratamento adequado */ 00067 volatile uint8_t type = __DO_NOTHING__; 00068 00069 /* representa a lista dos Call Boxes atualmente reconhecidos pela cabeceira */ 00070 Vector * v_cb = new Vector(); 00071 00072 /* representa a lista de ligacoes ativas na cabeceira */ 00073 Vector * v_call = new Vector(); 00074 00075 /* gerencia a distribuicao de timeslice para os call boxes */ 00076 Timeslice * ts = new Timeslice(); 00077 00078 /* tenta instanciar o vetor de call boxes, acende o led 1 antes de encerrar o programa */ 00079 reset_leds(); 00080 if( v_cb == NULL ){ 00081 led1 = 0; 00082 while( v_cb == NULL ){ 00083 Vector * v_cb = new Vector(); 00084 led1 = led1; 00085 if( t.read() > 5 ){ 00086 debug_msg("Erro ao alocar o vetor de CBx"); 00087 t.reset(); 00088 } 00089 } 00090 }else if( v_call == NULL ){ 00091 led2 = 0; 00092 led1 = 1; 00093 while( v_call == NULL ){ 00094 Vector * v_call = new Vector(); 00095 led1 = led1; 00096 if( t.read() > 5 ){ 00097 debug_msg("Erro ao alocar o vetor de Calls"); 00098 t.reset(); 00099 } 00100 } 00101 } 00102 reset_leds(); 00103 debug_msg( " Ready " ); 00104 while( true ){ 00105 if( status != __WAITING__ ){ 00106 __read_cb_buffer__( buffer, buffer_from_cb_ptr ); 00107 status = __WAITING__; 00108 00109 data = __parse_cb_buffer__( &ext, &port, &type, buffer ); 00110 00111 if( data != NULL ){ 00112 debug_msg("Procurando pelo CBx :: %d -- Type :: %d", ext, type ); 00113 if( type != __AUDIO__ ){ 00114 Call_Box * cb = __find_CB__( v_cb, ext ); 00115 if( cb != NULL ){ 00116 cb->reset_elapsed_time(); 00117 if( ( data[ 0 ] ^ cb->get_msg_id() ) == BIT7 ){ 00118 // some pkg reply 00119 if( ( data[ 0 ] | BIT7 ) == cb->get_msg_id() ){ 00120 if( type == __BOOT__ ) type = __REGISTRY__; 00121 __send_to_cb__( __build_cb_package__( ext, port, type, 00122 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00123 type = __DO_NOTHING__; 00124 debug_msg("-- Renviado ultimo pkg --"); 00125 }else if( data[ 0 ] == ( cb->get_msg_id() | BIT7 ) ){ 00126 // ack from CBx 00127 debug_msg("-- ACK do meu pkg --"); 00128 type = __DO_NOTHING__; 00129 } 00130 } 00131 } 00132 } 00133 }else type = __DO_NOTHING__; 00134 } 00135 //---------------------- 00136 if( t.read() > 5 ){ 00137 for( register uint8_t i = 0; i < v_cb->size(); i++ ){ 00138 Call_Box * cb = ( Call_Box * )v_cb->get_element( i ); 00139 debug_msg(" Type :: %d -- Ext :: %d -- TimeSlice :: %d -- remain_timeslices :: %d :: v_call->size() :: %d :: Status :: %d :: SIP Status %d", type , cb->get_ext(), cb->get_timeslice(), ts->remain_timeslices(), v_call->size(), cb->status, cb->sip->status ); 00140 } 00141 debug_msg(""); 00142 t.reset(); 00143 led3 = !led3; 00144 } 00145 //---------------------- 00146 switch( type ){ 00147 case __DO_NOTHING__ :{} 00148 break; 00149 00150 case __CB_BYE__ : { 00151 Call_Box * cb = __find_CB__( v_cb, ext ); 00152 if( cb != NULL ){ 00153 debug_msg("Nao encontrado CBx :: %d -- Type :: %d", ext, type ); 00154 data[ 0 ] |= BIT7; 00155 cb->set_msg_id( data[ 0 ] ); 00156 debug_msg( " Request bye from CBx " ); 00157 for( register uint8_t i = 0; i < v_call->size(); i++ ){ 00158 VZ_call * call = (VZ_call *)v_call->get_element( i ); 00159 if( call->get_cb_ext() == ext ){ 00160 cb->send_bye(); 00161 ts->return_timeslice( cb->get_timeslice() ); 00162 cb->set_timeslice( 0x00 ); 00163 set_status( cb->status, cb_idle ); 00164 v_call->remove_element( i ); 00165 set_status( cb->sip->status, sip_idle); 00166 data[ __TIMESLICE_PLACE__ ] = 0x00; 00167 __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, 00168 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00169 set_status( cb->sip->status, sip_idle ); 00170 delete( call ); 00171 } 00172 } 00173 } 00174 }break; 00175 00176 case __INVITE__ : { 00177 debug_msg("ok -- recebido o invite pelo menos"); 00178 Call_Box * cb = __find_CB__( v_cb, ext ); 00179 if( cb == NULL ){ 00180 debug_msg("Nao encontrado CBx :: %d -- Type :: %d", ext, type ); 00181 cb = new Call_Box( ext, port ); 00182 v_cb->add( cb ); 00183 set_status( cb->status, cb_idle ); 00184 cb->registry(); 00185 } 00186 cb->reset_elapsed_time(); 00187 if( v_call->size() != 0 ){ 00188 data[ 0 ] |= BIT7; 00189 cb->set_msg_id( data[ 0 ] ); 00190 set_status(cb->status,cb_idle); 00191 cb->set_timeslice( 0x00 ); 00192 data[ __TIMESLICE_PLACE__ ] = 0x00; 00193 __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, 00194 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00195 debug_msg( "-- Negando chamada, uma ja em andamento -- " ); 00196 break; 00197 } 00198 set_status( cb->status, cb_trying ); 00199 debug_msg(" Ok temos um cbx encontrado com status :: %d", cb->status ); 00200 switch( cb->status ){ 00201 case cb_on_call : { 00202 // a priori, nao fazer nada 00203 //data[ __TIMESLICE_PLACE__ ] = 0x00; 00204 //__send_to_cb__( __build_cb_package__( ext, port, __BYE__, 00205 // ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00206 }break; 00207 00208 case cb_ringing : { 00209 // tratar sip 2 00210 }break; 00211 00212 case cb_trying : { 00213 data[ 0 ] |= BIT7; 00214 cb->set_msg_id( data[ 0 ] ); 00215 cb->set_timeslice( ts->get_timeslice() ); 00216 if( cb->get_timeslice() == 0x00 ){ 00217 //sem timeslice pra tratar com o * 00218 set_status(cb->status,cb_idle); 00219 data[ __TIMESLICE_PLACE__ ] = 0x00; 00220 __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, 00221 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00222 set_status( cb->sip->status, sip_idle); 00223 debug_msg( "-- Trying -- Sem TS -- %s ", write_buffer ); 00224 }else{ 00225 set_status(cb->status,cb_busy); 00226 data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice(); 00227 __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, 00228 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00229 00230 debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); 00231 00232 cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) ); 00233 VZ_call * call = cb->invite(); 00234 00235 if( call != NULL ){ 00236 v_call->add( call ); 00237 set_status(cb->status,cb_on_call); 00238 00239 debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); 00240 __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, 00241 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00242 debug_msg( "-- Trying -- aceitando pedido de invite -- %s ", write_buffer ); 00243 //debug_pkg( 300, write_buffer ); 00244 }else{ 00245 set_status( cb->status,cb_idle); 00246 ts->return_timeslice( cb->get_timeslice() ); 00247 cb->set_timeslice( 0x00 ); 00248 data[ __TIMESLICE_PLACE__ ] = 0x00; 00249 debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); 00250 __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, 00251 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00252 debug_msg( "-- Trying -- Negando pedido de invite -- %s ", write_buffer ); 00253 set_status( cb->sip->status, sip_idle); 00254 } 00255 } 00256 }break; 00257 case cb_busy : { 00258 // tratar sip 00259 }break; 00260 } 00261 }break; 00262 case __REGISTRY__ : { 00263 Call_Box * cb = NULL; 00264 00265 data[ 0 ] |= BIT7 ; 00266 cb = __find_CB__( v_cb, ext ); 00267 if( cb != NULL ){ 00268 cb->reset_elapsed_time(); 00269 debug_msg(" reset_elapsed_time CBx -- %d", ext ); 00270 }else{ 00271 debug_msg("Nao encontrado CBx :: %d -- Type :: %d", ext, type ); 00272 cb = new Call_Box( ext, port ); 00273 v_cb->add( cb ); 00274 debug_msg(" Criado CBx -- %d", ext ); 00275 } 00276 debug_msg("::Registrado %d - %d::", ext, port ); 00277 cb->registry(); 00278 }break; 00279 case __BOOT__ : { 00280 __send_to_cb__( __build_cb_package__( ext, port, __REGISTRY__, 00281 ( char * )data, data[ 0 ], __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00282 }break; 00283 case __TELEMETRY__ : { 00284 debug_msg("Leitura da bateria :: ( Id : %x, MSB : %x, LSB : %x )", data[ 0 ], data[ 1 ], data[ 2 ] ); 00285 }break; 00286 case __AUDIO__ : { 00287 Call_Box * cb; 00288 VZ_call * call = NULL; 00289 cb = NULL; 00290 call = __find_Call__( v_call, ext ); 00291 if( call != NULL ){ 00292 //debug_( 240, data ); 00293 //debug_pkg( 242, data ); 00294 //char * pkg = call->build_eth_package( oitocentos ); 00295 //char * pkg = call->build_eth_package( data ); 00296 char * pkg = call->build_eth_package( data + 2 ); 00297 call->send_message( pkg ); 00298 cb = __find_CB__( v_cb, ext ); 00299 if( cb != NULL ) cb->reset_elapsed_time(); 00300 }else{ 00301 debug_msg("Nao encontrado CBx :: %d -- Type :: %d", ext, type ); 00302 } 00303 }break; 00304 }// fim switch 00305 for( register int i = 0; i < v_call->size(); i++ ){ 00306 VZ_call * call = ( VZ_call * )v_call->get_element( i ); 00307 int length = 0; 00308 char * tmp = call->get_eth_message( &length ); 00309 if( tmp != NULL ){ 00310 Call_Box * cb = NULL; 00311 int cb_port = 0xffff; 00312 cb = __find_CB__( v_cb, call->get_cb_ext() ); 00313 00314 if( cb != NULL ){ 00315 cb_port = cb->get_port(); 00316 }else debug_msg("Nao encontrado CBx :: %d -- Type :: %d", ext, type ); 00317 00318 uint8_t * pkg2cb = __build_cb_package__( call->get_cb_ext(), cb_port, __AUDIO__, 00319 tmp, __AUDIO__, length, write_buffer ); 00320 00321 __send_to_cb__( pkg2cb ); 00322 } 00323 } 00324 ///debug_msg(""); 00325 registry_aging( v_cb, buffer, write_buffer ); 00326 00327 int ret = sip_manager( v_cb, v_call, write_buffer ); 00328 if( ret > 0x00 ){ 00329 Call_Box * cb = __find_CB__( v_cb, ret ); 00330 if( cb != NULL ){ 00331 if( cb->status == cb_on_call ){ 00332 ts->return_timeslice( cb->get_timeslice() ); 00333 cb->set_timeslice( 0x00 ); 00334 set_status(cb->status,cb_idle); 00335 buffer[ __TIMESLICE_PLACE__ ] = 0x00; 00336 cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) ); 00337 for( register uint8_t i = 0; i < v_call->size(); i++ ){ 00338 VZ_call * call = ( VZ_call * )v_call->get_element( i ); 00339 if( call->get_cb_ext() == ret ){ 00340 v_call->remove_element( i ); 00341 delete( call ); 00342 } 00343 } 00344 __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, 00345 ( char * )buffer, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); 00346 cb->reset_sip(); 00347 set_status( cb->sip->status, sip_idle ); 00348 } 00349 }else debug_msg("Nao encontrado CBx :: %d -- Type :: %d", ext, type ); 00350 } 00351 00352 call_manager( v_call, v_cb, buffer, write_buffer, ts ); 00353 00354 static uint8_t flag = 0; 00355 if( v_call->size() == 0 ){ 00356 if (flag == 0) { flag = 1; } 00357 ts->reset(); 00358 }else { 00359 if (flag == 1) { flag = 0; } 00360 } 00361 /* eu deveria tirar ts que nao constam em chamadas aqui */ 00362 /* for( register uint8_t i = 0; i < v_cb->size(); i++ ){ 00363 Call_Box * cb = ( Call_Box * )v_cb->get_element( i ); 00364 if( cb->get_timeslice() != 0x00 ){ 00365 VZ_call * call = __find_Call__( v_call, cb->get_ext() ); 00366 if( call == NULL ){ 00367 ts->return_timeslice( cb->get_timeslice() ); 00368 cb->set_timeslice( 0x00 ); 00369 set_status(cb->status,cb_idle); 00370 } 00371 } 00372 } 00373 */ type = __DO_NOTHING__; 00374 } 00375 }
Generated on Sat Jul 16 2022 08:57:54 by
1.7.2
