VZTECH / Mbed 2 deprecated header_main_publish

Dependencies:   EthernetInterface NTPClient mbed-rtos_old mbed

Fork of header_main_public by VZTECH

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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__( &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 }