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 utils.cpp Source File

utils.cpp

00001 #include "utils.h"
00002 
00003 void reverse( char str[], int length ){
00004     int start = 0;
00005     int end = length -1;
00006     while (start < end){
00007         swap(*(str+start), *(str+end));
00008         start++;
00009         end--;
00010     }
00011 }
00012 char* itoa(int num, char* str, int base){
00013     int i = 0;
00014     bool isNegative = false;
00015 
00016     if( num == 0 ){
00017         str[i++] = '0';
00018         str[i] = '\0';
00019         return str;
00020     }
00021     if( num < 0 && base == 10 ){
00022         isNegative = true;
00023         num = -num;
00024     }
00025     while( num != 0 ){
00026         int rem = num % base;
00027         str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
00028         num = num/base;
00029     }
00030     if( isNegative )
00031         str[i++] = '-';
00032     
00033     str[i] = '\0'; // Append string terminator
00034 
00035     reverse( str, i );
00036     return( str );
00037 }
00038 
00039 void reset_leds( void ){
00040     led1 = led2 = 1;
00041     led3 = led4 = 0;
00042 }
00043 
00044 int __init_eth__( EthernetInterface * eth ){
00045     //eth->init( __MY_IP__, "255.255.255.0", "192.168.120.1" );
00046     eth->init( "192.168.2.200", "255.255.255.0", "192.168.2.254" );
00047     
00048 /*
00049 #ifdef debug_colinas
00050 #define __MY_IP__ "192.168.2.200"
00051 #define __MY_GT__ "192.168.2.254"
00052 #endif
00053 #ifndef debug_colinas
00054 #define __MY_IP__ "192.168.120.169"
00055 #define __MY_GT__ "192.168.120.1"
00056 #endif
00057 
00058 #define __MY_MK__ "255.255.255.0"
00059 */
00060     return eth->connect();
00061     // pensar em o que acontece e como sinalizar que nao consegui conectar na web
00062     // aparente so da time out, so que algo vai travar quando eu tentar usar a conexao
00063 }
00064 
00065 Call_Box * __find_CB__( Vector * v_cb, int ext ){
00066     Call_Box * cb = NULL;
00067     for( register int i = 0; i < v_cb->size(); i++ ){
00068         cb = ( Call_Box * )v_cb->get_element( i );
00069         if( cb->get_ext() == ext ) return( cb );
00070     }
00071     return( NULL );
00072 }
00073 
00074 VZ_call * __find_Call__( Vector * v_call, int ext ){
00075     VZ_call * call = NULL;
00076     for( register int i = 0; i < v_call->size(); i++ ){
00077         call = ( VZ_call * )v_call->get_element( i );
00078         if( call->get_cb_ext() == ext ) return( call );
00079     }
00080     return( NULL );
00081 }
00082 
00083 void registry_aging( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
00084     Call_Box * cb = NULL;
00085     if( v_cb && data && write_buffer ){
00086         for( register int i = 0; i < v_cb->size(); i++ ){
00087             cb = (Call_Box * )v_cb->get_element( i );
00088             if( cb->is_timeout() ){
00089                 if( cb->reconfigure_timeout() == 0x00 ){
00090             //        debug_msg("( ext %d removed", cb->get_ext() );
00091                     //cb->unregistry();
00092                     //v_cb->remove_element( i );
00093                     //delete( cb );
00094                     break;
00095                 }else{
00096               //      debug_msg("Ping on %d", cb->get_ext() );
00097                     
00098                     cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) );
00099                     
00100                     debug_msg("");
00101                     
00102                     __send_to_cb__( __build_cb_package__( cb->get_ext(), cb->get_port(), __REGISTRY__, 
00103                         ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
00104                     
00105                     debug_msg("");
00106                     
00107                     cb->registry();
00108                     
00109                     debug_msg("");
00110                 }
00111             }
00112         }
00113     }
00114     /*
00115     Call_Box * cb = NULL;
00116     if( v_cb && data && write_buffer ){
00117         bool remove_slave = false;
00118         int slave = 0x00;
00119         int tam = v_cb->size();
00120         for( register int i = 0; i < v_cb->size(); i++ ){
00121             cb = (Call_Box * )v_cb->get_element( i );
00122             if( cb->get_ext() % 2 ) continue;
00123             if( cb->is_timeout() ){
00124                 if( cb->reconfigure_timeout() == 0x00 ){
00125                     debug_msg("( ext %d removed", cb->get_ext() );
00126                     cb->unregistry();
00127                     slave = cb->get_ext() + 1;
00128                     remove_slave = true;
00129                     v_cb->remove_element( i );
00130                     delete( cb );
00131                     break;
00132                 }else{
00133                     cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) );
00134                     __send_to_cb__( __build_cb_package__( cb->get_ext(), cb->get_port(), __REGISTRY__, 
00135                         ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
00136                     cb->registry();
00137                 }
00138             }
00139         }
00140         if( remove_slave ){                
00141             for( register int i = 0; i < v_cb->size(); i++ ){
00142                 cb = (Call_Box * )v_cb->get_element( i );
00143                 if( cb->get_ext() == slave ){
00144                     debug_msg("( ext %d removed", cb->get_ext() );
00145                     cb->unregistry();
00146                     v_cb->remove_element( i );
00147                     delete( cb );
00148                 }
00149             }
00150         }
00151         if( tam != v_cb->size() ) debug_msg("%d ---> %d", tam, v_cb->size() );
00152     }
00153     */
00154     //debug_msg("");
00155 }
00156 
00157 int sip_manager( Vector * v_cb, Vector * v_call, uint8_t * write_buffer ){
00158     static int index = 0;
00159     //debug_msg("");
00160     if( v_cb && write_buffer ){
00161         if( v_cb->size() > 0 ){
00162             //debug_msg("");
00163             if( index >= v_cb->size() ) index = 0;    
00164         }else return 0;
00165         Call_Box * cb = (Call_Box * )v_cb->get_element( index );
00166         /*  Retorna 
00167             = 0 :: ok
00168             < 0 :: tive problemas
00169             > 0 :: devo remover essa call do vetor de calls 
00170         */
00171         int returned_value = 0;
00172         
00173         if( cb->status == cb_on_call || cb->status == cb_idle ){
00174             //debug_msg("");
00175             returned_value = cb->listen_SIP_server();
00176         }
00177         index++;
00178         return( returned_value );
00179     }
00180     led1 = !led1;
00181     return( -1 );
00182 }
00183 
00184 /* remove calls por timeout */
00185 void call_manager( Vector * v_call, Vector * v_cb, uint8_t * data, uint8_t * write_buffer, Timeslice * ts ){
00186     for( register int i = 0; i < v_call->size(); i++ ){
00187         VZ_call * call = ( VZ_call * )v_call->get_element( i );
00188         if( call->is_timeout() || call->is_timetofinish() ){
00189             v_call->remove_element( i );
00190             Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
00191             if( cb ){ 
00192                 cb->status = cb_idle;
00193                 ts->return_timeslice( cb->get_timeslice() );
00194                 cb->set_timeslice( 0x00 );
00195                 data[ __TIMESLICE_PLACE__ ] = 0x00;
00196                 cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) );
00197                 __send_to_cb__( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__, 
00198                     ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
00199                 cb->send_bye();
00200                 set_status( cb->sip->status, sip_idle );
00201             }
00202             delete( call );    
00203         }
00204     }    
00205 }
00206 
00207 void build_telemetry_report( int ext, int port, char * data ){
00208     // construir o pacote de telemetria aqui
00209     // decidir se isso sera escrito em disco e de tempos em tempos enviado para o servidor ... 
00210     // ou se sera enviado toda vez que determinado cb se registrar ...    
00211 }
00212 
00213 void __send_to_cb__( uint8_t * buffer ){
00214     xmemcpy( TXBuffer, buffer, DATA_SIZE );
00215     send2callboxes();
00216 }