Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Fri May 08 04:15:23 2015 +0000
Revision:
121:ee02790d00b7
Parent:
119:ee6a53069455
Child:
124:c1b6c893e1c3
compiling

Who changed what in which revision?

UserRevisionLine numberNew contents of line
klauss 74:81c47fff88a5 1 #include "call_box_manager.h"
klauss 74:81c47fff88a5 2
klauss 80:61d61c9eb75c 3 Timer timer_refresh;
klauss 78:1353744f01e1 4 Timer timer_aging;
klauss 89:0fe315117b00 5 Timer timer_sync_refresh;
klauss 78:1353744f01e1 6
klauss 121:ee02790d00b7 7 Call_Box * find_CB( Vector * v_cb, int ext ){
klauss 74:81c47fff88a5 8 Call_Box * cb = NULL;
klauss 119:ee6a53069455 9 for ( register int i = 0; i < v_cb->size (); i++ )
klauss 119:ee6a53069455 10 {
klauss 74:81c47fff88a5 11 cb = ( Call_Box * )v_cb->get_element( i );
klauss 119:ee6a53069455 12 if ( cb != NULL )
klauss 119:ee6a53069455 13 {
klauss 119:ee6a53069455 14 if( cb->get_ext() == ext ) return( cb );
klauss 119:ee6a53069455 15 }
klauss 74:81c47fff88a5 16 }
klauss 74:81c47fff88a5 17 return( NULL );
klauss 74:81c47fff88a5 18 }
klauss 74:81c47fff88a5 19
klauss 119:ee6a53069455 20 int refresh ( Vector * v_cb )
klauss 119:ee6a53069455 21 {
klauss 119:ee6a53069455 22 if( v_cb != NULL)
klauss 119:ee6a53069455 23 {
klauss 81:3656f00ab3db 24 static int lst_index = 0;
klauss 113:db67ae00550e 25
klauss 119:ee6a53069455 26 if( v_cb->size() > 0 )
klauss 119:ee6a53069455 27 {
klauss 119:ee6a53069455 28 //FIXME pode acontecder problemas por ser static
klauss 119:ee6a53069455 29 static uint8_t data[ CB_BUFFER_SIZE ], write_buffer[ CB_BUFFER_SIZE ];
klauss 116:39a41ebb675c 30
klauss 119:ee6a53069455 31 led4 = 0;
klauss 119:ee6a53069455 32 if( lst_index >= v_cb->size() ) lst_index = 0;
klauss 119:ee6a53069455 33
klauss 119:ee6a53069455 34 Call_Box * cb = (Call_Box * )v_cb->get_element( lst_index++ );
klauss 119:ee6a53069455 35
klauss 121:ee02790d00b7 36 if ( ( cb != NULL ) && ( cb -> get_status () == cb_idle ) )
klauss 121:ee02790d00b7 37 {
klauss 117:e9facba9db27 38
klauss 119:ee6a53069455 39 if( cb->get_ext() % 2 == 1 ){
klauss 121:ee02790d00b7 40 Call_Box * cb_master = find_CB( v_cb, cb->get_ext() - 1 );
klauss 121:ee02790d00b7 41 if ( ( cb_master != NULL ) && ( cb_master -> get_status () != cb_idle ) ) return( 0x20 );
klauss 119:ee6a53069455 42 }
klauss 119:ee6a53069455 43
klauss 119:ee6a53069455 44 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 119:ee6a53069455 45
klauss 119:ee6a53069455 46 send2callboxes( build_cb_package( cb->get_ext(), cb->get_port(), REGISTRY,
klauss 119:ee6a53069455 47 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
klauss 114:472502b31a12 48
klauss 119:ee6a53069455 49 if( debug_refresh ) send_msg("[%d] Refresh", cb->get_ext() );
klauss 119:ee6a53069455 50
klauss 119:ee6a53069455 51 return( 0 );
klauss 119:ee6a53069455 52 }else return( -5 );
klauss 119:ee6a53069455 53 }else return( -3 );
klauss 89:0fe315117b00 54 }else return( -1 );
klauss 80:61d61c9eb75c 55 }
klauss 80:61d61c9eb75c 56
klauss 119:ee6a53069455 57 void wake_all_up( Vector * v_cb )
klauss 119:ee6a53069455 58 {
klauss 119:ee6a53069455 59 /***
klauss 119:ee6a53069455 60 [ Principio ]
klauss 119:ee6a53069455 61 -- Procurar por CBx que constem sem seus pares registrados na lógica.
klauss 119:ee6a53069455 62 -- Mandar uma mensagem do tipo prompt-ping para este elemento
klauss 119:ee6a53069455 63
klauss 119:ee6a53069455 64 -- Fluxo --
klauss 119:ee6a53069455 65 - Verificar se possui uma lista ordenada de CBx atualizada
klauss 119:ee6a53069455 66 - Caso nao possua, gerar esta lista.
klauss 119:ee6a53069455 67 - Para cada iteraçao
klauss 119:ee6a53069455 68 - Verifica se o CBx é master ou slave
klauss 119:ee6a53069455 69 - Verifica se o par deste esta registrado
klauss 119:ee6a53069455 70 - Caso contratio
klauss 119:ee6a53069455 71 - Verifica se o CBx encontrado esta em ligaçao
klauss 119:ee6a53069455 72 - Caso nao esteja, encaminha mensagem de ping para o CBx ausente da dupla.
klauss 119:ee6a53069455 73 ***/
klauss 119:ee6a53069455 74
klauss 119:ee6a53069455 75 uint8_t data[ CB_BUFFER_SIZE ], write_buffer[ CB_BUFFER_SIZE ];
klauss 119:ee6a53069455 76 if( ( v_cb != NULL ) ){
klauss 119:ee6a53069455 77 static int ext_list[ MAX_CB_IN_A_BRANCH + 1 ];
klauss 119:ee6a53069455 78 static uint8_t last_size = 0;
klauss 117:e9facba9db27 79 uint8_t size = v_cb->size();
klauss 119:ee6a53069455 80 static int wake_all_up_index = 0;
klauss 116:39a41ebb675c 81
klauss 119:ee6a53069455 82 if( last_size != size )
klauss 119:ee6a53069455 83 {
klauss 78:1353744f01e1 84 for( register int i = 0; i < size; i++ ){
klauss 78:1353744f01e1 85 ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
klauss 78:1353744f01e1 86 }
klauss 78:1353744f01e1 87
klauss 78:1353744f01e1 88 qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
klauss 119:ee6a53069455 89 }
klauss 119:ee6a53069455 90
klauss 119:ee6a53069455 91 if( size > 0 )
klauss 119:ee6a53069455 92 {
klauss 119:ee6a53069455 93 // testa se eh o master
klauss 119:ee6a53069455 94 if( ( ext_list[ wake_all_up_index ] % 2 ) == 0 )
klauss 119:ee6a53069455 95 {
klauss 119:ee6a53069455 96 //testa se o slave nao esta registrado
klauss 119:ee6a53069455 97 if( ( size == 1 ) || ( ( wake_all_up_index + 1 ) == size ) || ( ext_list[ wake_all_up_index + 1 ] != ( ext_list[ wake_all_up_index ] + 1 ) ) )
klauss 119:ee6a53069455 98 {
klauss 119:ee6a53069455 99 strcpy( ( char * )data, "ping\r" );
klauss 121:ee02790d00b7 100 Call_Box * cb = find_CB( v_cb, ext_list[ wake_all_up_index ] );
klauss 119:ee6a53069455 101
klauss 119:ee6a53069455 102 // verifica se o master esta em chamada.
klauss 121:ee02790d00b7 103 if ( ( cb != NULL ) && ( cb -> get_status () == cb_idle ) )
klauss 119:ee6a53069455 104 {
klauss 119:ee6a53069455 105 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 119:ee6a53069455 106
klauss 119:ee6a53069455 107 send2callboxes( build_cb_package( ( cb->get_ext() + 1 ), ( cb->get_port() + 1 ), PROMPT,
klauss 119:ee6a53069455 108 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
klauss 119:ee6a53069455 109
klauss 119:ee6a53069455 110 if( debug_wake ) send_msg("%d without %d - ping sent to %d",
klauss 119:ee6a53069455 111 ext_list[ wake_all_up_index ], ext_list[ wake_all_up_index ] + 1, cb->get_ext() + 1 );
klauss 119:ee6a53069455 112 }
klauss 119:ee6a53069455 113 }
klauss 117:e9facba9db27 114
klauss 119:ee6a53069455 115 }else{
klauss 119:ee6a53069455 116 if( ( size == 1 ) || ( wake_all_up_index == 0 ) || ( wake_all_up_index >= 1 ) && ( ext_list[ wake_all_up_index - 1 ] != ( ext_list[ wake_all_up_index ] - 1 ) ) )
klauss 119:ee6a53069455 117 {
klauss 119:ee6a53069455 118 strcpy( ( char * )data, "ping\r" );
klauss 121:ee02790d00b7 119 Call_Box * cb = find_CB( v_cb, ( ext_list[ wake_all_up_index ] ) );
klauss 119:ee6a53069455 120
klauss 119:ee6a53069455 121 // verifica se o slave esta em chamada.
klauss 121:ee02790d00b7 122 if ( ( cb != NULL ) && ( cb -> get_status () == cb_idle ) )
klauss 119:ee6a53069455 123 {
klauss 119:ee6a53069455 124 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 119:ee6a53069455 125
klauss 119:ee6a53069455 126 send2callboxes( build_cb_package( ( cb->get_ext() - 1 ), ( cb->get_port() - 1 ), PROMPT,
klauss 119:ee6a53069455 127 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
klauss 119:ee6a53069455 128
klauss 119:ee6a53069455 129 if( debug_wake ) send_msg("%d without %d - ping sent to %d",
klauss 119:ee6a53069455 130 ext_list[ wake_all_up_index ], ext_list[ wake_all_up_index ] - 1, cb->get_ext() - 1 );
klauss 78:1353744f01e1 131 }
klauss 74:81c47fff88a5 132 }
klauss 74:81c47fff88a5 133 }
klauss 74:81c47fff88a5 134 }
klauss 119:ee6a53069455 135 if( ++wake_all_up_index >= size ) wake_all_up_index = 0;
klauss 74:81c47fff88a5 136 }
klauss 74:81c47fff88a5 137 }