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 Sep 01 17:21:11 2015 +0000
Revision:
132:05cd37f7e007
Parent:
126:1f90756250fb
Child:
133:3d136f5ffd66
Substitui??o de; send_msg -> vz_printf; debug_msg -> vz_debug

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 126:1f90756250fb 7 Call_Box * find_CB ( Vector * v_cb, const int ext )
klauss 126:1f90756250fb 8 {
klauss 132:05cd37f7e007 9 //fixme
klauss 132:05cd37f7e007 10 // if ( v_cb == NULL ) return NULL;
klauss 74:81c47fff88a5 11 Call_Box * cb = NULL;
klauss 126:1f90756250fb 12 for ( register int i = 0; i < v_cb -> size (); i++ )
klauss 119:ee6a53069455 13 {
klauss 126:1f90756250fb 14 cb = ( Call_Box * ) v_cb -> get_element ( i );
klauss 126:1f90756250fb 15 if ( cb not_eq NULL )
klauss 119:ee6a53069455 16 {
klauss 126:1f90756250fb 17 if ( cb -> get_ext () == ext ) return ( cb );
klauss 119:ee6a53069455 18 }
klauss 74:81c47fff88a5 19 }
klauss 126:1f90756250fb 20 return ( NULL );
klauss 74:81c47fff88a5 21 }
klauss 74:81c47fff88a5 22
klauss 119:ee6a53069455 23 int refresh ( Vector * v_cb )
klauss 119:ee6a53069455 24 {
klauss 126:1f90756250fb 25 if ( v_cb not_eq NULL)
klauss 119:ee6a53069455 26 {
klauss 132:05cd37f7e007 27 static int list_index = 0;
klauss 113:db67ae00550e 28
klauss 126:1f90756250fb 29 if ( v_cb -> size () > 0 )
klauss 119:ee6a53069455 30 {
klauss 126:1f90756250fb 31 static uint8_t data [ CB_BUFFER_SIZE ], write_buffer [ CB_BUFFER_SIZE ];
klauss 116:39a41ebb675c 32
klauss 119:ee6a53069455 33 led4 = 0;
klauss 126:1f90756250fb 34
klauss 132:05cd37f7e007 35 if ( list_index >= v_cb -> size () ) list_index = 0;
klauss 119:ee6a53069455 36
klauss 132:05cd37f7e007 37 Call_Box * cb = ( Call_Box * ) v_cb -> get_element ( list_index++ );
klauss 119:ee6a53069455 38
klauss 126:1f90756250fb 39 if ( ( cb not_eq NULL ) and ( cb -> get_status () == cb_idle ) )
klauss 121:ee02790d00b7 40 {
klauss 132:05cd37f7e007 41 int local_ext = cb -> get_ext ();
klauss 132:05cd37f7e007 42 if ( local_ext % 2 == 1 )
klauss 126:1f90756250fb 43 {
klauss 132:05cd37f7e007 44 // if ( ! list_exception_ext -> find_value ( local_ext ) )
klauss 132:05cd37f7e007 45 {
klauss 132:05cd37f7e007 46 Call_Box * cb_master = find_CB ( v_cb, local_ext - 1 );
klauss 132:05cd37f7e007 47
klauss 132:05cd37f7e007 48 if ( ( cb_master not_eq NULL ) and ( cb_master -> get_status () not_eq cb_idle ) ) return ( 0x20 );
klauss 132:05cd37f7e007 49 }
klauss 119:ee6a53069455 50 }
klauss 126:1f90756250fb 51 else
klauss 126:1f90756250fb 52 {
klauss 132:05cd37f7e007 53 // if ( ! list_exception_ext -> find_value ( local_ext ) )
klauss 132:05cd37f7e007 54 {
klauss 132:05cd37f7e007 55 // checking slave status
klauss 132:05cd37f7e007 56 Call_Box * cb_slave = find_CB ( v_cb, local_ext + 1 );
klauss 119:ee6a53069455 57
klauss 132:05cd37f7e007 58 if ( ( cb_slave not_eq NULL ) and ( cb_slave -> get_status () not_eq cb_idle ) ) return ( 0x21 );
klauss 132:05cd37f7e007 59 }
klauss 132:05cd37f7e007 60 }
klauss 132:05cd37f7e007 61 /*
klauss 132:05cd37f7e007 62 condição adicionada para minimizar o comportamento do cbx perder o tx,
klauss 132:05cd37f7e007 63 pacotes vindo shiftados pra cabeceira, e não perdendo o rx, portando
klauss 132:05cd37f7e007 64 o cbx não resetava sozinho, idéia, deixar ele rebotar pelo wdt dele.
klauss 132:05cd37f7e007 65 */
klauss 132:05cd37f7e007 66 if ( ( cb -> get_timer () < ACCEPTABLE_DELAY ) and ( cb -> get_overflow_times () == 0 ) )
klauss 132:05cd37f7e007 67 {
klauss 132:05cd37f7e007 68 send2callboxes( build_cb_package( local_ext, cb->get_port(), REGISTRY,
klauss 132:05cd37f7e007 69 ( char * )data, cb -> msg_id_update (), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
klauss 132:05cd37f7e007 70
klauss 132:05cd37f7e007 71 if( debug_refresh ) vz_printf ("[%d] Refresh", local_ext );
klauss 132:05cd37f7e007 72 } else {
klauss 132:05cd37f7e007 73 if ( debug_dont_refresh ) vz_debug ("Nao pedindo registro para o [%d]( %d, %d )",
klauss 132:05cd37f7e007 74 local_ext, cb -> get_timer (), cb -> get_overflow_times () );
klauss 132:05cd37f7e007 75 }
klauss 119:ee6a53069455 76 return( 0 );
klauss 119:ee6a53069455 77 }else return( -5 );
klauss 119:ee6a53069455 78 }else return( -3 );
klauss 89:0fe315117b00 79 }else return( -1 );
klauss 80:61d61c9eb75c 80 }
klauss 80:61d61c9eb75c 81
klauss 126:1f90756250fb 82 void wake_all_up ( Vector * v_cb )
klauss 119:ee6a53069455 83 {
klauss 119:ee6a53069455 84 /***
klauss 119:ee6a53069455 85 [ Principio ]
klauss 119:ee6a53069455 86 -- Procurar por CBx que constem sem seus pares registrados na lógica.
klauss 119:ee6a53069455 87 -- Mandar uma mensagem do tipo prompt-ping para este elemento
klauss 119:ee6a53069455 88
klauss 119:ee6a53069455 89 -- Fluxo --
klauss 119:ee6a53069455 90 - Verificar se possui uma lista ordenada de CBx atualizada
klauss 119:ee6a53069455 91 - Caso nao possua, gerar esta lista.
klauss 119:ee6a53069455 92 - Para cada iteraçao
klauss 119:ee6a53069455 93 - Verifica se o CBx é master ou slave
klauss 119:ee6a53069455 94 - Verifica se o par deste esta registrado
klauss 119:ee6a53069455 95 - Caso contratio
klauss 119:ee6a53069455 96 - Verifica se o CBx encontrado esta em ligaçao
klauss 119:ee6a53069455 97 - Caso nao esteja, encaminha mensagem de ping para o CBx ausente da dupla.
klauss 119:ee6a53069455 98 ***/
klauss 119:ee6a53069455 99
klauss 119:ee6a53069455 100 uint8_t data[ CB_BUFFER_SIZE ], write_buffer[ CB_BUFFER_SIZE ];
klauss 126:1f90756250fb 101 if( ( v_cb not_eq NULL ) )
klauss 126:1f90756250fb 102 {
klauss 119:ee6a53069455 103 static int ext_list[ MAX_CB_IN_A_BRANCH + 1 ];
klauss 119:ee6a53069455 104 static uint8_t last_size = 0;
klauss 117:e9facba9db27 105 uint8_t size = v_cb->size();
klauss 119:ee6a53069455 106 static int wake_all_up_index = 0;
klauss 116:39a41ebb675c 107
klauss 126:1f90756250fb 108 if( last_size not_eq size )
klauss 119:ee6a53069455 109 {
klauss 78:1353744f01e1 110 for( register int i = 0; i < size; i++ ){
klauss 78:1353744f01e1 111 ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
klauss 78:1353744f01e1 112 }
klauss 78:1353744f01e1 113
klauss 124:c1b6c893e1c3 114 qsort( ext_list, v_cb->size(), sizeof( int ), wake_comp );
klauss 119:ee6a53069455 115 }
klauss 119:ee6a53069455 116
klauss 119:ee6a53069455 117 if( size > 0 )
klauss 119:ee6a53069455 118 {
klauss 119:ee6a53069455 119 // testa se eh o master
klauss 119:ee6a53069455 120 if( ( ext_list[ wake_all_up_index ] % 2 ) == 0 )
klauss 119:ee6a53069455 121 {
klauss 119:ee6a53069455 122 //testa se o slave nao esta registrado
klauss 126:1f90756250fb 123 if( ( size == 1 ) or ( ( wake_all_up_index + 1 ) == size ) or ( ( ext_list[ wake_all_up_index + 1 ] not_eq ( ext_list[ wake_all_up_index ] + 1 ) ) ) )
klauss 119:ee6a53069455 124 {
klauss 119:ee6a53069455 125 strcpy( ( char * )data, "ping\r" );
klauss 121:ee02790d00b7 126 Call_Box * cb = find_CB( v_cb, ext_list[ wake_all_up_index ] );
klauss 119:ee6a53069455 127
klauss 119:ee6a53069455 128 // verifica se o master esta em chamada.
klauss 126:1f90756250fb 129 if ( ( cb not_eq NULL ) and ( cb -> get_status () == cb_idle ) )
klauss 126:1f90756250fb 130 {
klauss 119:ee6a53069455 131 send2callboxes( build_cb_package( ( cb->get_ext() + 1 ), ( cb->get_port() + 1 ), PROMPT,
klauss 126:1f90756250fb 132 ( char * )data, cb -> msg_id_update (), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
klauss 119:ee6a53069455 133
klauss 132:05cd37f7e007 134 if( debug_wake ) vz_printf ("%d without %d - ping sent to %d",
klauss 119:ee6a53069455 135 ext_list[ wake_all_up_index ], ext_list[ wake_all_up_index ] + 1, cb->get_ext() + 1 );
klauss 119:ee6a53069455 136 }
klauss 119:ee6a53069455 137 }
klauss 117:e9facba9db27 138
klauss 119:ee6a53069455 139 }else{
klauss 126:1f90756250fb 140 if( ( size == 1 ) or ( wake_all_up_index == 0 ) or ( wake_all_up_index >= 1 ) and ( ( ext_list[ wake_all_up_index - 1 ] not_eq ( ext_list[ wake_all_up_index ] - 1 ) ) ) )
klauss 119:ee6a53069455 141 {
klauss 119:ee6a53069455 142 strcpy( ( char * )data, "ping\r" );
klauss 121:ee02790d00b7 143 Call_Box * cb = find_CB( v_cb, ( ext_list[ wake_all_up_index ] ) );
klauss 119:ee6a53069455 144
klauss 119:ee6a53069455 145 // verifica se o slave esta em chamada.
klauss 126:1f90756250fb 146 if ( ( cb not_eq NULL ) and ( cb -> get_status () == cb_idle ) )
klauss 119:ee6a53069455 147 {
klauss 119:ee6a53069455 148 send2callboxes( build_cb_package( ( cb->get_ext() - 1 ), ( cb->get_port() - 1 ), PROMPT,
klauss 126:1f90756250fb 149 ( char * )data, cb -> msg_id_update (), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
klauss 119:ee6a53069455 150
klauss 132:05cd37f7e007 151 if ( debug_wake ) vz_printf ("%d without %d - ping sent to %d",
klauss 126:1f90756250fb 152 ext_list [ wake_all_up_index ], ext_list [ wake_all_up_index ] - 1, cb -> get_ext () - 1 );
klauss 78:1353744f01e1 153 }
klauss 74:81c47fff88a5 154 }
klauss 74:81c47fff88a5 155 }
klauss 74:81c47fff88a5 156 }
klauss 126:1f90756250fb 157 if ( ++wake_all_up_index >= size ) wake_all_up_index = 0;
klauss 74:81c47fff88a5 158 }
klauss 74:81c47fff88a5 159 }