Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Wed Mar 18 13:33:54 2015 +0000
Revision:
108:18a3702650f3
Parent:
106:a34fcf9f0e02
Child:
109:a5b8264ffbbc
wip - bug udp porta, corrompendo v_cb->size () em ultima analise

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 74:81c47fff88a5 7 Call_Box * __find_CB__( Vector * v_cb, int ext ){
klauss 74:81c47fff88a5 8 Call_Box * cb = NULL;
klauss 74:81c47fff88a5 9 for( register int i = 0; i < v_cb->size(); i++ ){
klauss 74:81c47fff88a5 10 cb = ( Call_Box * )v_cb->get_element( i );
klauss 108:18a3702650f3 11 if( cb != NULL )
klauss 108:18a3702650f3 12 {
klauss 108:18a3702650f3 13 if( cb->get_ext() == ext ) return( cb );
klauss 108:18a3702650f3 14 }
klauss 74:81c47fff88a5 15 }
klauss 74:81c47fff88a5 16 return( NULL );
klauss 74:81c47fff88a5 17 }
klauss 74:81c47fff88a5 18
klauss 106:a34fcf9f0e02 19 int refresh ( Vector * v_cb )
klauss 106:a34fcf9f0e02 20 {
klauss 106:a34fcf9f0e02 21 if( v_cb != NULL)
klauss 106:a34fcf9f0e02 22 {
klauss 81:3656f00ab3db 23 static int lst_index = 0;
klauss 81:3656f00ab3db 24
klauss 106:a34fcf9f0e02 25 if( v_cb->size() > 0 )
klauss 106:a34fcf9f0e02 26 {
klauss 106:a34fcf9f0e02 27 uint8_t data[ CB_BUFFER_SIZE ], write_buffer[ CB_BUFFER_SIZE ];
klauss 81:3656f00ab3db 28
klauss 106:a34fcf9f0e02 29 led4 = 0;
klauss 106:a34fcf9f0e02 30 if( lst_index >= v_cb->size() ) lst_index = 0;
klauss 106:a34fcf9f0e02 31
klauss 106:a34fcf9f0e02 32 Call_Box * cb = (Call_Box * )v_cb->get_element( lst_index++ );
klauss 106:a34fcf9f0e02 33
klauss 106:a34fcf9f0e02 34 if( cb != NULL && cb->status == cb_idle ){
klauss 80:61d61c9eb75c 35
klauss 106:a34fcf9f0e02 36 if( cb->get_ext() % 2 == 1 ){
klauss 106:a34fcf9f0e02 37 Call_Box * cb_master = __find_CB__( v_cb, cb->get_ext() - 1 );
klauss 106:a34fcf9f0e02 38 if( cb_master != NULL && cb_master->status != cb_idle ) return( 0x20 );
klauss 106:a34fcf9f0e02 39 }
klauss 106:a34fcf9f0e02 40
klauss 106:a34fcf9f0e02 41 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 106:a34fcf9f0e02 42
klauss 106:a34fcf9f0e02 43 send2callboxes( build_cb_package( cb->get_ext(), cb->get_port(), __REGISTRY__,
klauss 106:a34fcf9f0e02 44 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 80:61d61c9eb75c 45
klauss 106:a34fcf9f0e02 46 if( debug_refresh ) send_msg("Refresh %d", cb->get_ext() );
klauss 106:a34fcf9f0e02 47
klauss 106:a34fcf9f0e02 48 return( 0 );
klauss 106:a34fcf9f0e02 49 }else return( -5 );
klauss 106:a34fcf9f0e02 50 }else return( -3 );
klauss 89:0fe315117b00 51 }else return( -1 );
klauss 80:61d61c9eb75c 52 }
klauss 80:61d61c9eb75c 53
klauss 106:a34fcf9f0e02 54
klauss 108:18a3702650f3 55 //FiXME remove myself
klauss 108:18a3702650f3 56 //funcao fora de uso, nao usar,
klauss 108:18a3702650f3 57 /*
klauss 74:81c47fff88a5 58 void registry_aging( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
klauss 80:61d61c9eb75c 59 for( register int i = 0; i < v_cb->size(); i++ ){
klauss 80:61d61c9eb75c 60 Call_Box * cb = (Call_Box * )v_cb->get_element( i );
klauss 108:18a3702650f3 61 //if ( cb->is_timeout() )
klauss 108:18a3702650f3 62 {
klauss 80:61d61c9eb75c 63 if( debug_aging ) debug_msg("sands for %d", cb->get_ext() );
klauss 80:61d61c9eb75c 64 if( cb->has_next_try() == false ){
klauss 80:61d61c9eb75c 65 if( debug_aging ) debug_msg( "time to really go ( ext %d removed )", cb->get_ext() );
klauss 80:61d61c9eb75c 66 v_cb->remove_element( i );
klauss 80:61d61c9eb75c 67 delete( cb );
klauss 80:61d61c9eb75c 68 break;
klauss 89:0fe315117b00 69 }
klauss 80:61d61c9eb75c 70 }
klauss 80:61d61c9eb75c 71 }
klauss 78:1353744f01e1 72 }
klauss 108:18a3702650f3 73 */
klauss 78:1353744f01e1 74
klauss 106:a34fcf9f0e02 75 //void wake_all_up( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
klauss 106:a34fcf9f0e02 76 void wake_all_up( Vector * v_cb )
klauss 106:a34fcf9f0e02 77 {
klauss 105:a930035b6556 78 /***
klauss 105:a930035b6556 79 [ Principio ]
klauss 105:a930035b6556 80 -- Procurar por CBx que constem sem seus pares registrados na lógica.
klauss 105:a930035b6556 81 -- Mandar uma mensagem do tipo prompt-ping para este elemento
klauss 105:a930035b6556 82
klauss 105:a930035b6556 83 -- Fluxo --
klauss 105:a930035b6556 84 - Verificar se possui uma lista ordenada de CBx atualizada
klauss 105:a930035b6556 85 - Caso nao possua, gerar esta lista.
klauss 105:a930035b6556 86 - Para cada iteraçao
klauss 105:a930035b6556 87 - Verifica se o CBx é master ou slave
klauss 105:a930035b6556 88 - Verifica se o par deste esta registrado
klauss 105:a930035b6556 89 - Caso contratio
klauss 105:a930035b6556 90 - Verifica se o CBx encontrado esta em ligaçao
klauss 105:a930035b6556 91 - Caso nao esteja, encaminha mensagem de ping para o CBx ausente da dupla.
klauss 105:a930035b6556 92 ***/
klauss 105:a930035b6556 93
klauss 106:a34fcf9f0e02 94 uint8_t data[ CB_BUFFER_SIZE ], write_buffer[ CB_BUFFER_SIZE ];
klauss 106:a34fcf9f0e02 95 if( ( v_cb != NULL ) ){
klauss 104:62646ef786a3 96 static int ext_list[ __MAX_CB_IN_A_BRANCH__ + 1 ];
klauss 104:62646ef786a3 97 static uint8_t last_size = 0;
klauss 78:1353744f01e1 98 uint8_t size = v_cb->size();
klauss 104:62646ef786a3 99 static int wake_all_up_index = 0;
klauss 78:1353744f01e1 100
klauss 104:62646ef786a3 101 if( last_size != size )
klauss 104:62646ef786a3 102 {
klauss 78:1353744f01e1 103 for( register int i = 0; i < size; i++ ){
klauss 78:1353744f01e1 104 ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
klauss 78:1353744f01e1 105 }
klauss 78:1353744f01e1 106
klauss 78:1353744f01e1 107 qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
klauss 104:62646ef786a3 108 }
klauss 104:62646ef786a3 109
klauss 104:62646ef786a3 110 if( size > 0 )
klauss 104:62646ef786a3 111 {
klauss 104:62646ef786a3 112 // testa se eh o master
klauss 104:62646ef786a3 113 if( ( ext_list[ wake_all_up_index ] % 2 ) == 0 )
klauss 104:62646ef786a3 114 {
klauss 104:62646ef786a3 115 //testa se o slave nao esta registrado
klauss 104:62646ef786a3 116 if( ( size == 1 ) || ( ( wake_all_up_index + 1 ) == size ) || ( ext_list[ wake_all_up_index + 1 ] != ( ext_list[ wake_all_up_index ] + 1 ) ) )
klauss 104:62646ef786a3 117 {
klauss 105:a930035b6556 118 strcpy( ( char * )data, "ping\r" );
klauss 104:62646ef786a3 119 Call_Box * cb = __find_CB__( v_cb, ext_list[ wake_all_up_index ] );
klauss 105:a930035b6556 120
klauss 105:a930035b6556 121 // verifica se o master esta em chamada.
klauss 105:a930035b6556 122 if( cb != NULL && cb->status == cb_idle )
klauss 104:62646ef786a3 123 {
klauss 104:62646ef786a3 124 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 104:62646ef786a3 125
klauss 105:a930035b6556 126 send2callboxes( build_cb_package( ( cb->get_ext() + 1 ), ( cb->get_port() + 1 ), __PROMPT__,
klauss 105:a930035b6556 127 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 104:62646ef786a3 128
klauss 104:62646ef786a3 129 if( debug_wake ) send_msg("%d without %d - ping sent to %d",
klauss 104:62646ef786a3 130 ext_list[ wake_all_up_index ], ext_list[ wake_all_up_index ] + 1, cb->get_ext() + 1 );
klauss 104:62646ef786a3 131 }
klauss 104:62646ef786a3 132 }
klauss 78:1353744f01e1 133
klauss 104:62646ef786a3 134 }else{
klauss 104:62646ef786a3 135 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 104:62646ef786a3 136 {
klauss 105:a930035b6556 137 strcpy( ( char * )data, "ping\r" );
klauss 104:62646ef786a3 138 Call_Box * cb = __find_CB__( v_cb, ( ext_list[ wake_all_up_index ] ) );
klauss 105:a930035b6556 139
klauss 105:a930035b6556 140 // verifica se o slave esta em chamada.
klauss 105:a930035b6556 141 if( cb != NULL && cb->status == cb_idle )
klauss 104:62646ef786a3 142 {
klauss 104:62646ef786a3 143 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ~BIT7 );
klauss 104:62646ef786a3 144
klauss 105:a930035b6556 145 send2callboxes( build_cb_package( ( cb->get_ext() - 1 ), ( cb->get_port() - 1 ), __PROMPT__,
klauss 105:a930035b6556 146 ( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 104:62646ef786a3 147
klauss 104:62646ef786a3 148 if( debug_wake ) send_msg("%d without %d - ping sent to %d",
klauss 104:62646ef786a3 149 ext_list[ wake_all_up_index ], ext_list[ wake_all_up_index ] - 1, cb->get_ext() - 1 );
klauss 78:1353744f01e1 150 }
klauss 74:81c47fff88a5 151 }
klauss 74:81c47fff88a5 152 }
klauss 74:81c47fff88a5 153 }
klauss 104:62646ef786a3 154 if( ++wake_all_up_index >= size ) wake_all_up_index = 0;
klauss 74:81c47fff88a5 155 }
klauss 74:81c47fff88a5 156 }