Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Tue Dec 16 19:34:30 2014 +0000
Revision:
80:61d61c9eb75c
Parent:
78:1353744f01e1
Child:
81:3656f00ab3db
cco

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 78:1353744f01e1 5
klauss 74:81c47fff88a5 6 Call_Box * __find_CB__( Vector * v_cb, int ext ){
klauss 74:81c47fff88a5 7 Call_Box * cb = NULL;
klauss 74:81c47fff88a5 8 for( register int i = 0; i < v_cb->size(); i++ ){
klauss 74:81c47fff88a5 9 cb = ( Call_Box * )v_cb->get_element( i );
klauss 74:81c47fff88a5 10 if( cb->get_ext() == ext ) return( cb );
klauss 74:81c47fff88a5 11 }
klauss 74:81c47fff88a5 12 return( NULL );
klauss 74:81c47fff88a5 13 }
klauss 74:81c47fff88a5 14
klauss 80:61d61c9eb75c 15 int init_refresh( void ){
klauss 80:61d61c9eb75c 16 timer_refresh.start();
klauss 80:61d61c9eb75c 17 return( 0 );
klauss 80:61d61c9eb75c 18 }
klauss 80:61d61c9eb75c 19
klauss 78:1353744f01e1 20 int init_aging( void ){
klauss 78:1353744f01e1 21 timer_aging.start();
klauss 78:1353744f01e1 22 return( 0 );
klauss 78:1353744f01e1 23 }
klauss 80:61d61c9eb75c 24
klauss 80:61d61c9eb75c 25 int refresh( Vector * v_cb, uint8_t * data, uint8_t * write_buffer, Call_Box * cb ){
klauss 80:61d61c9eb75c 26 if( v_cb != NULL && data != NULL && write_buffer != NULL ){
klauss 80:61d61c9eb75c 27 if( cb != NULL ){
klauss 80:61d61c9eb75c 28 timer_refresh.reset();
klauss 80:61d61c9eb75c 29
klauss 80:61d61c9eb75c 30 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __REGISTRY__,
klauss 80:61d61c9eb75c 31 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 80:61d61c9eb75c 32
klauss 80:61d61c9eb75c 33 return( 0x10 );
klauss 80:61d61c9eb75c 34 }
klauss 80:61d61c9eb75c 35
klauss 80:61d61c9eb75c 36 static int lst_index = 0;
klauss 80:61d61c9eb75c 37 if( timer_refresh.read_ms() > 500 ){
klauss 80:61d61c9eb75c 38 timer_refresh.reset();
klauss 80:61d61c9eb75c 39 if( v_cb->size() > 0 ){
klauss 80:61d61c9eb75c 40 if( lst_index == v_cb->size() ) lst_index = 0;
klauss 80:61d61c9eb75c 41
klauss 80:61d61c9eb75c 42 Call_Box * cb = (Call_Box * )v_cb->get_element( lst_index++ );
klauss 80:61d61c9eb75c 43
klauss 80:61d61c9eb75c 44 if( cb != NULL ){
klauss 80:61d61c9eb75c 45 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ( ~BIT7 ) );
klauss 80:61d61c9eb75c 46
klauss 80:61d61c9eb75c 47 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __REGISTRY__,
klauss 80:61d61c9eb75c 48 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 80:61d61c9eb75c 49
klauss 80:61d61c9eb75c 50 return( 0 );
klauss 80:61d61c9eb75c 51 }else return( -3 );
klauss 80:61d61c9eb75c 52 }else return( 1 );
klauss 80:61d61c9eb75c 53 }else return( -1 );
klauss 80:61d61c9eb75c 54 }else return( -3 );
klauss 80:61d61c9eb75c 55 }
klauss 80:61d61c9eb75c 56
klauss 80:61d61c9eb75c 57 //FiXME se validar, nao preciso de tantos parametros ...
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 80:61d61c9eb75c 61 if( cb->is_timeout() ){
klauss 80:61d61c9eb75c 62 if( debug_aging ) debug_msg("sands for %d", cb->get_ext() );
klauss 80:61d61c9eb75c 63 if( cb->has_next_try() == false ){
klauss 80:61d61c9eb75c 64 if( debug_aging ) debug_msg( "time to really go ( ext %d removed )", cb->get_ext() );
klauss 80:61d61c9eb75c 65 v_cb->remove_element( i );
klauss 80:61d61c9eb75c 66 delete( cb );
klauss 80:61d61c9eb75c 67 break;
klauss 80:61d61c9eb75c 68 }else{
klauss 80:61d61c9eb75c 69 refresh( v_cb, data, write_buffer, cb );
klauss 80:61d61c9eb75c 70 }
klauss 80:61d61c9eb75c 71 }
klauss 80:61d61c9eb75c 72 }
klauss 80:61d61c9eb75c 73 /*
klauss 78:1353744f01e1 74 if( v_cb != NULL && data != NULL && write_buffer != NULL ){
klauss 78:1353744f01e1 75 uint8_t enough = 0;
klauss 78:1353744f01e1 76
klauss 78:1353744f01e1 77 static int lst_ext = 0;
klauss 78:1353744f01e1 78
klauss 78:1353744f01e1 79 if( timer_aging.read_ms() > 200 ){
klauss 78:1353744f01e1 80 timer_aging.reset();
klauss 80:61d61c9eb75c 81
klauss 78:1353744f01e1 82 for( register int i = 0; i < v_cb->size(); i++ ){
klauss 78:1353744f01e1 83 Call_Box * cb = (Call_Box * )v_cb->get_element( i );
klauss 78:1353744f01e1 84 if( cb->is_timeout() ){
klauss 78:1353744f01e1 85 if( cb->has_next_try() == false ){
klauss 80:61d61c9eb75c 86 if( debug_aging ) debug_msg( "time to really go ( ext %d removed )", cb->get_ext() );
klauss 78:1353744f01e1 87 v_cb->remove_element( i );
klauss 78:1353744f01e1 88 delete( cb );
klauss 78:1353744f01e1 89 break;
klauss 78:1353744f01e1 90 }else{
klauss 80:61d61c9eb75c 91 if( lst_ext == max_ext ) lst_ext = 0;
klauss 78:1353744f01e1 92
klauss 78:1353744f01e1 93 if( lst_ext == 0 ) lst_ext = cb->get_ext();
klauss 78:1353744f01e1 94
klauss 80:61d61c9eb75c 95 if( cb->get_ext() < lst_ext ) continue;
klauss 78:1353744f01e1 96
klauss 80:61d61c9eb75c 97 lst_ext = cb->get_ext();
klauss 78:1353744f01e1 98
klauss 78:1353744f01e1 99 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ( ~BIT7 ) );
klauss 78:1353744f01e1 100
klauss 78:1353744f01e1 101 int8_t type = cb->get_next_aging_type();
klauss 78:1353744f01e1 102
klauss 78:1353744f01e1 103 uint8_t msg_type = 0x00;
klauss 78:1353744f01e1 104
klauss 78:1353744f01e1 105 if( type == REQUEST_REGISTRY ){
klauss 78:1353744f01e1 106 msg_type = __REGISTRY__;
klauss 78:1353744f01e1 107 if( debug_aging ) debug_msg("Registry request Cbx %d -- On msg-id %d", cb->get_ext(), cb->get_msg_id() );
klauss 78:1353744f01e1 108 }else if( type == REQUEST_PEND ){
klauss 78:1353744f01e1 109 msg_type = __PROMPT__;
klauss 78:1353744f01e1 110 strcpy( ( char * )data, "pend\r\r\r\n" );
klauss 78:1353744f01e1 111 if( debug_aging ) debug_msg("Pend Request Cbx %d -- On msg-id %d", cb->get_ext(), cb->get_msg_id() );
klauss 78:1353744f01e1 112 }else if( ( type == REQUEST_PING ) ){
klauss 78:1353744f01e1 113 msg_type = __PROMPT__;
klauss 78:1353744f01e1 114 strcpy( ( char * )data, "ping\r\r\r\n" );
klauss 78:1353744f01e1 115 if( debug_aging ) debug_msg("Ping on Cbx %d -- On msg-id %d", cb->get_ext(), cb->get_msg_id() );
klauss 78:1353744f01e1 116 }
klauss 78:1353744f01e1 117
klauss 78:1353744f01e1 118 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), msg_type,
klauss 80:61d61c9eb75c 119 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 120 return;
klauss 78:1353744f01e1 121 }
klauss 78:1353744f01e1 122 }
klauss 78:1353744f01e1 123 }
klauss 78:1353744f01e1 124 if( debug_aging ) if( enough > 1 ) debug_msg( " out( %d ) ", enough );
klauss 78:1353744f01e1 125 }
klauss 78:1353744f01e1 126 }
klauss 80:61d61c9eb75c 127 */
klauss 78:1353744f01e1 128 }
klauss 78:1353744f01e1 129
klauss 78:1353744f01e1 130 void wake_all_up( Vector * v_cb, uint8_t * data, uint8_t * write_buffer ){
klauss 78:1353744f01e1 131 if( v_cb != NULL && data != NULL && write_buffer != NULL ){
klauss 78:1353744f01e1 132 int ext_list[ __MAX_CB_IN_A_BRANCH__ ];
klauss 78:1353744f01e1 133 uint8_t size = v_cb->size();
klauss 78:1353744f01e1 134
klauss 78:1353744f01e1 135 bool once = true;
klauss 78:1353744f01e1 136
klauss 78:1353744f01e1 137 if( size > 0 ){
klauss 78:1353744f01e1 138 for( register int i = 0; i < size; i++ ){
klauss 78:1353744f01e1 139 ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
klauss 78:1353744f01e1 140 }
klauss 78:1353744f01e1 141
klauss 78:1353744f01e1 142 qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
klauss 78:1353744f01e1 143
klauss 78:1353744f01e1 144 for( register int i = 0; i < size; i++ ){
klauss 78:1353744f01e1 145 // testa se eh o master
klauss 78:1353744f01e1 146 if( ( ext_list[ i ] % 2 ) == 0 ){
klauss 78:1353744f01e1 147 //testa se o slave nao esta registrado
klauss 78:1353744f01e1 148 if( ( ( i + 1 ) < size ) && ( ext_list[ i + 1 ] != ( ext_list[ i ] + 1 ) ) || ( size == 1 ) ){
klauss 78:1353744f01e1 149 if( debug_wake ) debug_msg("Mestre %d encontrado sem slave %d", ext_list[ i ], ext_list[ i ] + 1 );
klauss 78:1353744f01e1 150 if( once ){
klauss 78:1353744f01e1 151 strcpy( ( char * )data, "ping\r\r\r\n" );
klauss 78:1353744f01e1 152 Call_Box * cb = __find_CB__( v_cb, ext_list[ i ] );
klauss 78:1353744f01e1 153 if( cb != NULL ){
klauss 78:1353744f01e1 154 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ( ~BIT7 ) );
klauss 78:1353744f01e1 155
klauss 78:1353744f01e1 156 send2callboxes( __build_cb_package__( ( cb->get_ext() + 1 ), ( cb->get_port() + 1 ), __PROMPT__,
klauss 78:1353744f01e1 157 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 158
klauss 78:1353744f01e1 159 if( debug_wake ) debug_msg("Slave %d pingado", cb->get_ext() + 1 );
klauss 78:1353744f01e1 160 }
klauss 78:1353744f01e1 161 once = false;
klauss 78:1353744f01e1 162 }
klauss 78:1353744f01e1 163 }
klauss 74:81c47fff88a5 164 }else{
klauss 78:1353744f01e1 165 if( ( ( i - 1 ) > 0 ) && ( ext_list[ i - 1 ] != ( ext_list[ i ] - 1 ) ) || ( size == 1 ) ){
klauss 78:1353744f01e1 166 if( debug_wake ) debug_msg("Escravo revolucionario %d encontrado sem master %d", ext_list[ i ], ext_list[ i ] - 1 );
klauss 78:1353744f01e1 167 if( once ){
klauss 78:1353744f01e1 168 strcpy( ( char * )data, "ping\r\r\r\n" );
klauss 78:1353744f01e1 169 Call_Box * cb = __find_CB__( v_cb, ( ext_list[ i ] ) );
klauss 78:1353744f01e1 170 if( cb != NULL ){
klauss 78:1353744f01e1 171 cb->set_msg_id( ( cb->get_msg_id() + 1 ) & ( ~BIT7 ) );
klauss 78:1353744f01e1 172
klauss 78:1353744f01e1 173 send2callboxes( __build_cb_package__( ( cb->get_ext() - 1 ), ( cb->get_port() - 1 ), __PROMPT__,
klauss 78:1353744f01e1 174 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 175
klauss 78:1353744f01e1 176 if( debug_wake ) debug_msg("Master %d pingado", cb->get_ext() - 1 );
klauss 78:1353744f01e1 177 }
klauss 78:1353744f01e1 178 once = false;
klauss 78:1353744f01e1 179 }
klauss 78:1353744f01e1 180 }
klauss 74:81c47fff88a5 181 }
klauss 74:81c47fff88a5 182 }
klauss 74:81c47fff88a5 183 }
klauss 74:81c47fff88a5 184 }
klauss 74:81c47fff88a5 185 }