VZTECH / Mbed 2 deprecated header_main

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

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 void __init_eth__( EthernetInterface * eth ){
00045     eth->init( __MY_IP__, "255.255.255.0", "192.168.120.1" );
00046     eth->connect();
00047     // pensar em o que acontece e como sinalizar que nao consegui conectar na web
00048     // aparente so da time out, so que algo vai travar quando eu tentar usar a conexao
00049 }
00050 
00051 Call_Box * __find_CB__( Vector * v_cb, int ext ){
00052     Call_Box * cb = NULL;
00053     for( register int i = 0; i < v_cb->size(); i++ ){
00054         cb = ( Call_Box * )v_cb->get_element( i );
00055         if( cb->get_ext() == ext ) return( cb );
00056     }
00057     return( NULL );
00058 }
00059 
00060 VZ_call * __find_Call__( Vector * v_call, int ext ){
00061     VZ_call * call = NULL;
00062     for( register int i = 0; i < v_call->size(); i++ ){
00063         call = ( VZ_call * )v_call->get_element( i );
00064         if( call->get_cb_ext() == ext ) return( call );
00065     }
00066     return( NULL );
00067 }
00068 
00069 void registry_aging( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
00070     Call_Box * cb = NULL;
00071     for( register int i = 0; i < v_cb->size(); i++ ){
00072         cb = (Call_Box * )v_cb->get_element( i );
00073         if( cb->is_timeout() ){
00074             cb->reset_elapsed_time();
00075             cb->registry();
00076             /*if( cb->reconfigure_timeout() == 0x00 ){
00077                 v_cb->remove_element( i );
00078                 cb->unregistry();
00079                 delete( cb );
00080             }else{
00081                 __send_to_cb__( __build_cb_package__( cb->get_ext(), cb->get_port(), __REGISTRY__, 
00082                     ( char * )data, __REGISTRY__, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
00083                 cb->registry();
00084             }*/
00085         }
00086     }
00087 }
00088 
00089 int sip_manager( Vector * v_cb, Vector * v_call, uint8_t * write_buffer ){
00090     static int index = 0;
00091     if( v_cb && write_buffer ){
00092         if( v_cb->size() > 0 ){
00093             if( index >= v_cb->size() ) index = 0;    
00094         }else return 0;
00095         Call_Box * cb = (Call_Box * )v_cb->get_element( index );
00096         /*  Retorna 
00097             = 0 :: ok
00098             < 0 :: tive problemas
00099             > 0 :: devo remover essa call do vetor de calls 
00100         */
00101         int returned_value = 0;
00102         
00103         if( cb->status == cb_on_call || cb->status == cb_idle ) returned_value = cb->listen_SIP_server();
00104         
00105         index++;
00106         return( returned_value );
00107     }
00108     led1 = !led1;
00109     return( -1 );
00110 }
00111 
00112 /* remove calls por timeout */
00113 void call_manager( Vector * v_call, Vector * v_cb, uint8_t * data, uint8_t * write_buffer, Timeslice * ts ){
00114     for( register int i = 0; i < v_call->size(); i++ ){
00115         VZ_call * call = ( VZ_call * )v_call->get_element( i );
00116         if( call->is_timeout() || call->is_timetofinish() ){
00117             v_call->remove_element( i );
00118             Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
00119             if( cb ){ 
00120                 cb->status = cb_idle;
00121                 ts->return_timeslice( cb->get_timeslice() );
00122                 cb->set_timeslice( 0x00 );
00123                 data[ __TIMESLICE_PLACE__ ] = 0x00;
00124                 cb->set_msg_id( ( ( cb->get_msg_id() ) + 1 ) & ( BIT7 ^ 0xff ) );
00125                 __send_to_cb__( __build_cb_package__( cb->get_ext(), cb->get_port(), __CB_BYE__, 
00126                     ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
00127                 cb->send_bye();
00128                 set_status( cb->sip->status, sip_idle );
00129             }
00130             delete( call );    
00131         }
00132     }    
00133 }
00134 
00135 void build_telemetry_report( int ext, int port, char * data ){
00136     // construir o pacote de telemetria aqui
00137     // decidir se isso sera escrito em disco e de tempos em tempos enviado para o servidor ... 
00138     // ou se sera enviado toda vez que determinado cb se registrar ...    
00139 }
00140 
00141 void __send_to_cb__( uint8_t * buffer ){
00142     xmemcpy( TXBuffer, buffer, DATA_SIZE );
00143     send2callboxes();
00144 }