Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
main.cpp
- Committer:
- klauss
- Date:
- 2014-10-20
- Revision:
- 52:12930cef17c4
- Parent:
- 49:4837ed2aad6b
- Child:
- 53:bb492a8f115a
File content as of revision 52:12930cef17c4:
#include "bits.h" #include "utils.h" #include "configs.h" #include "UART3Interrupt.h" #include "parallelcpld.h" #include "prompt.h" #include "debug.h" #include "utils.h" #include "flood.h" #include "eth.h" volatile uint8_t status = 0x00; int main(){ wdt.Configure( 40.0 ); start_cpld(); config_lpc(); init_fsystem(); // pensar melhor em como saber se estou conectado na eth //int eth_status = __init_eth__( ð ); int eth_status = __init_eth__(); if( eth_status ){ send_msg("Cannot connect to eth\n\r"); }else{ send_msg("Connection eth - ok"); init_prompt(); } Timer t; t.start(); Timer udp_timer; /* representa ramal do call box */ int ext = 0; /* representa porta do call box */ int port = 0; /* buffer para onde se copia os dados vindos do cb para tratameno interno */ uint8_t buffer[ __CB_BUFFER_SIZE__ ]; /* buffer de escrita do pacote de saida que sera enviado pro cb / servidor */ uint8_t write_buffer[ __CB_BUFFER_SIZE__ ]; /* ponteiro que aponta para os dados vindo do CPLD */ uint8_t * buffer_from_cb_ptr = ( uint8_t * )RXBuffer; /* referencia para os dados contidos no pacote, sem o header */ uint8_t * data = NULL; /* gerencia o tipo do pacote para providenciar tratamento adequado */ volatile uint8_t type = __DO_NOTHING__; /* representa a lista dos Call Boxes atualmente reconhecidos pela cabeceira */ Vector * v_cb = new Vector(); /* representa a lista de ligacoes ativas na cabeceira */ Vector * v_call = new Vector(); /* gerencia a distribuicao de timeslice para os call boxes */ Timeslice * ts = new Timeslice(); /* tenta instanciar o vetor de call boxes, acende o led 1 antes de encerrar o programa */ reset_leds(); if( v_cb == NULL ){ led1 = 0; while( v_cb == NULL ){ Vector * v_cb = new Vector(); led1 = led1; if( t.read() > 5 ){ send_msg("Erro ao alocar o vetor de CBx"); t.reset(); } } }else if( v_call == NULL ){ led2 = 0; led1 = 1; while( v_call == NULL ){ Vector * v_call = new Vector(); if( t.read() > 5 ){ send_msg("Erro ao alocar o vetor de Calls"); t.reset(); } } } reset_leds(); udp_timer.start(); send_msg("Ready"); while( true ){ //FIXME colocar uma condicao aqui prompt_process( NULL ); wdt.kick(); if (pcks_s == 1){ //pc.printf("\n\r PKG_CSK OK: %d", pkg_cksok); //pc.printf("\n\r PKG_CSK ERR: %d\n\r", pkg_ckserr); send_msg("PKG_CSK OK: %d :: PKG_CSK ERR: %d", pkg_cksok, pkg_ckserr ); pcks_s =0; } if( reset_cks ){ pkg_cksok = 0; pkg_ckserr = 0; send_msg("PKG_CSK OK: %d :: PKG_CSK ERR: %d", pkg_cksok, pkg_ckserr ); reset_cks = false; } if (pshowcb == 1){ send_msg("Registred %d CBx", v_cb->size() ); for( register uint8_t i = 0; i < v_cb->size(); i++ ){ Call_Box * cb = ( Call_Box * )v_cb->get_element( i ); send_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 ); } pshowcb = 0; } if( cb_status ){ cb_status = false; send_msg("Registred %d CBx", v_cb->size() ); char str[ 1024 ]; if( v_cb->size() == 0 ){ send_msg("{-/-}"); }else if( v_cb->size() == 1 ){ Call_Box * cb = ( Call_Box * )v_cb->get_element( 0 ); send_msg("{ %d }", cb->get_ext() ); }else{ register uint8_t i; char aux[ 16 ]; Call_Box * cb = NULL; strcpy( str, "{ " ); for( i = 0; i < v_cb->size() - 1; i++ ){ cb = ( Call_Box * )v_cb->get_element( i ); sprintf( aux, "%5d, ", cb->get_ext() ); strcat( str, aux ); if( ( i != 0 ) && !( i % 10 ) ) strcat( str, "\n\r " ); } cb = ( Call_Box * )v_cb->get_element( i ); sprintf( aux, "%5d ", cb->get_ext() ); strcat( str, aux ); strcat( str, " }" ); send_msg( "%s", str ); } } if( pflood == 1 ) flood(); if( status != __WAITING__ ){ __read_cb_buffer__( buffer, buffer_from_cb_ptr ); status = __WAITING__; data = __parse_vz_pkg__( &ext, &port, &type, buffer ); if( data != NULL ){ if( debug_alive == 1 && debug_cb_rx ) debug_msg("Pkg from CBx :: %d -- Type :: %d", ext, type ); if( type != __AUDIO__ ){ Call_Box * cb = __find_CB__( v_cb, ext ); if( cb != NULL ){ cb->reset_elapsed_time(); if( ( data[ 0 ] ^ cb->get_msg_id() ) == BIT7 ){ // some pkg reply if( ( data[ 0 ] | BIT7 ) == cb->get_msg_id() ){ if( type == __BOOT__ ) type = __REGISTRY__; __send_to_cb__( __build_cb_package__( ext, port, type, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); type = __DO_NOTHING__; if( debug_main ) debug_msg("-- Renviado ultimo pkg --"); }else if( data[ 0 ] == ( cb->get_msg_id() | BIT7 ) ){ // ack from CBx if( debug_main ) debug_msg("-- ACK do meu pkg --"); type = __DO_NOTHING__; } } } } }else type = __DO_NOTHING__; } //---------------------- if( t.read() > 5 ){ static uint8_t count = 0; /* static int test_ext = 870; static int test_port = 5170; static bool main_test = false; */ //send_msg("from_eth = %s - tcp_session = %s", ( from_eth ) ? "true" : "false", ( tcp_session ) ? "true" : "false" ); if( debug_alive ){ send_msg("Registred %d CBx", v_cb->size() ); for( register uint8_t i = 0; i < v_cb->size(); i++ ){ Call_Box * cb = ( Call_Box * )v_cb->get_element( i ); send_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 ); } } /* if( debug_alive == 1 ){ if( debug_main ) send_msg("Status - alive "); //uint32_t errper = 100*(pkg_ckserr/(pkg_ckserr + pkg_cksok)); //pc.printf("\n\r Error = %d", errper); } */ t.reset(); led3 = !led3; CAB_LED = !CAB_LED; if( debug_cks ) send_msg("PKG_CSK OK: %d :: PKG_CSK ERR: %d", pkg_cksok, pkg_ckserr ); //<><><><><><><><><><> count++; if( !( count % 15 ) ){ if( eth_status ){ wdt.kick(); //eth_status = __init_eth__( ð ); eth_status = __init_eth__(); if( eth_status ){ if( debug_main ) debug_msg("Cannot connect to eth"); }else{ if( debug_main ) debug_msg("Connection eth - ok"); init_prompt(); } } } //if( count == 4 ){ //debug_msg("Colocar simulacoes de cbx aqui"); //main_test = true; //} /* if( main_test ){ send_msg("Request registry from %d", test_ext ); data = buffer; ext = test_ext++; port = test_port++; type = __REGISTRY__; //if( test_ext == 881 ) main_test = false; main_test = false; } */ /* if( count == 5 * 2 ){ //debug_msg("Colocar simulacoes de cbx aqui"); data = buffer; ext = 891; port = 5001; type = __INVITE__; debug_msg("registro enviado"); }*/ } //---------------------- switch( type ){ case __DO_NOTHING__ :{} break; case __CB_BYE__ : { Call_Box * cb = __find_CB__( v_cb, ext ); if( cb != NULL ){ data[ 0 ] |= BIT7; cb->set_msg_id( data[ 0 ] ); if( debug_main ) debug_msg( " Request bye from CBx " ); 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() == ext ){ cb->send_bye(); ts->return_timeslice( cb->get_timeslice() ); cb->set_timeslice( 0x00 ); set_status( cb->status, cb_idle ); v_call->remove_element( i ); set_status( cb->sip->status, sip_idle); data[ __TIMESLICE_PLACE__ ] = 0x00; __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); set_status( cb->sip->status, sip_idle ); delete( call ); cb->re_start_timer(); } } } }break; case __INVITE__ : { if( debug_main ) debug_msg("Request Invite received from Cbx %i", ext); Call_Box * cb = __find_CB__( v_cb, ext ); if( cb == NULL ){ if( debug_main ) debug_msg("Adding CBx :: %i", ext ); cb = new Call_Box( ext, port ); v_cb->add( cb ); set_status( cb->status, cb_idle ); cb->registry(); } cb->reset_elapsed_time(); if( v_call->size() != 0 ){ data[ 0 ] |= BIT7; cb->set_msg_id( data[ 0 ] ); set_status(cb->status,cb_idle); cb->set_timeslice( 0x00 ); data[ __TIMESLICE_PLACE__ ] = 0x00; __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); if( debug_main ) debug_msg( "denying call - another call box on call" ); break; } set_status( cb->status, cb_trying ); if( debug_main ) debug_msg("Request invite cbx status :: %d", cb->status ); //FIXME essa logica deve estar la embaixo, fora do switch maior, a ideia eh // quando receber um pedido de invite, apenas manda o invite pro server // dai rodar, ver se alguem mandou alguma coisa e voltar a tratar com o // * ver se ja esta tudo ok, a ideia é fazer esse pedido de invite funcionar // assincrono. switch( cb->status ){ case cb_on_call : { // a priori, nao fazer nada //data[ __TIMESLICE_PLACE__ ] = 0x00; //__send_to_cb__( __build_cb_package__( ext, port, __BYE__, // ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); }break; case cb_ringing : { // tratar sip 2 }break; case cb_trying : { data[ 0 ] |= BIT7; cb->set_msg_id( data[ 0 ] ); cb->set_timeslice( ts->get_timeslice() ); if( cb->get_timeslice() == 0x00 ){ //sem timeslice pra tratar com o * set_status(cb->status,cb_idle); data[ __TIMESLICE_PLACE__ ] = 0x00; __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); set_status( cb->sip->status, sip_idle); if( debug_main ) debug_msg( "-- Trying -- without TS -- %s ", write_buffer ); }else{ set_status(cb->status,cb_busy); data[ __TIMESLICE_PLACE__ ] = cb->get_timeslice(); __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); if( debug_main ) debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) ); VZ_call * call = cb->invite(); if( call != NULL ){ v_call->add( call ); set_status(cb->status,cb_on_call); if( debug_main ) debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); __send_to_cb__( __build_cb_package__( ext, port, __INVITE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); if( debug_main ) debug_msg( "-- Trying -- accepting call request --" ); }else{ set_status( cb->status,cb_idle); ts->return_timeslice( cb->get_timeslice() ); cb->set_timeslice( 0x00 ); data[ __TIMESLICE_PLACE__ ] = 0x00; if( debug_main ) debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); if( debug_main ) debug_msg( "-- Trying -- denying call request --" ); set_status( cb->sip->status, sip_idle); } } }break; case cb_busy : { set_status( cb->status,cb_idle); ts->return_timeslice( cb->get_timeslice() ); cb->set_timeslice( 0x00 ); data[ __TIMESLICE_PLACE__ ] = 0x00; if( debug_main ) debug_msg(" -- %d on %d -- ", cb->get_ext(), data[ __TIMESLICE_PLACE__ ] ); __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); if( debug_main ) debug_msg( "-- Trying -- denying call request << Busy Here >> --" ); set_status( cb->sip->status, sip_idle ); }break; } }break; case __REGISTRY__ : { Call_Box * cb = NULL; data[ 0 ] |= BIT7 ; cb = __find_CB__( v_cb, ext ); if( cb != NULL ){ cb->reset_elapsed_time(); if( debug_main ) debug_msg(" reset_elapsed_time CBx -- %d", ext ); }else{ if( debug_main ) debug_msg("Adding Cbx :: %d -- Type :: %d", ext, type ); cb = new Call_Box( ext, port ); v_cb->add( cb ); if( debug_main ) debug_msg("Added CBx -- %d", ext ); } if( debug_main ) debug_msg("::registered %d - %d::", ext, port ); cb->registry(); }break; case __BOOT__ : { __send_to_cb__( __build_cb_package__( ext, port, __REGISTRY__, ( char * )data, data[ 0 ], __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); }break; case __TELEMETRY__ : { if( debug_main ) debug_msg("::telemetry from %d - %d::", ext, port ); //build_telemetry_report( ext, port, ( char *)data ); }break; case __PROMPT__ : { send_msg( "Prompt pkg from ( %i, %i ) ::", ext, port ); /* if( tcp_session ){ // udp ? char tmp[ 255 ]; sprintf( tmp, "Prompt pkg from ( %i, %i ) :: ", ext, port ); tcp_client.send_all( tmp, strlen( tmp ) ); } */ for( register int i = 0; i < __CB_BUFFER_SIZE__; i++ ){ pc.printf("%3i ", data[ i ] ); } //FIXMEj isso nao vai funcionar em udp, mudar pra send_msg pc.printf("\n\r"); if( tcp_session ){ char aux[ __CB_BUFFER_SIZE__ + 3 ]; strncpy( aux, (char * )data, __CB_BUFFER_SIZE__ ); strcat( aux, "\n\r\0" ); tcp_client.send_all( ( char *)data, strlen( (char * )data ) ); } }break; case __AUDIO__ : { Call_Box * cb; VZ_call * call = NULL; cb = NULL; call = __find_Call__( v_call, ext ); if( call != NULL ){ char * pkg = call->build_eth_package( data + 2 ); call->send_message( pkg ); cb = __find_CB__( v_cb, ext ); if( cb != NULL ) cb->reset_elapsed_time(); }else{ if( debug_main ) debug_msg("received missed package from CBx :: %i -- Type :: %i", ext, type ); } }break; }// fim switch for( register int i = 0; i < v_call->size(); i++ ){ VZ_call * call = ( VZ_call * )v_call->get_element( i ); int length = 0; char * tmp = call->get_eth_message( &length ); if( tmp != NULL ){ Call_Box * cb = NULL; int cb_port = 0xffff; cb = __find_CB__( v_cb, call->get_cb_ext() ); if( cb != NULL ){ cb_port = cb->get_port(); }else if( debug_main ) debug_msg("received missed package from CBx :: %i -- Type :: %i", ext, type ); uint8_t * pkg2cb = __build_cb_package__( call->get_cb_ext(), cb_port, __AUDIO__, tmp, __AUDIO__, length, write_buffer ); __send_to_cb__( pkg2cb ); } } if( v_call->size() == 0 ) registry_aging( v_cb, buffer, write_buffer ); int ret = sip_manager( v_cb, v_call, write_buffer ); if( ret > 0x00 ){ Call_Box * cb = __find_CB__( v_cb, ret ); if( cb != NULL ){ if( cb->status == cb_on_call ){ ts->return_timeslice( cb->get_timeslice() ); cb->set_timeslice( 0x00 ); set_status(cb->status,cb_idle); buffer[ __TIMESLICE_PLACE__ ] = 0x00; cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) ); 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() == ret ){ v_call->remove_element( i ); delete( call ); } } __send_to_cb__( __build_cb_package__( ext, port, __CB_BYE__, ( char * )buffer, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) ); //FIXME talvez eu nao precise dessa linha mudar o set_status( cb->sip->status, sip_idle ); pra ver o que acontece //cb->reset_sip(); set_status( cb->sip->status, sip_idle ); cb->re_start_timer(); } }else if( debug_main ) debug_msg("Missed bye request from * CBx :: %d -- Type :: %d", ext, type ); } call_manager( v_call, v_cb, buffer, write_buffer, ts ); static uint8_t flag = 0; if( v_call->size() == 0 ){ if (flag == 0) { flag = 1; } ts->reset(); }else{ if (flag == 1) { flag = 0; } } /* int length; if( udp_timer.read() > 1 && !listen_udp ){ data = (uint8_t *)listen_eth_udp( (char *)buffer, &length ); if( length ){ listen_udp = true; debug_msg(""); }else udp_timer.reset(); } if( listen_udp ){ data = (uint8_t *)listen_eth_udp( (char *)buffer, &length ); if( udp_timer.read() > 30 ){ listen_udp = false; udp_timer.reset(); } } */ type = __DO_NOTHING__; } }