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:
79:9bc12aa305a9
Child:
81:3656f00ab3db
cco

Who changed what in which revision?

UserRevisionLine numberNew contents of line
klauss 74:81c47fff88a5 1 #include "telemetry.h"
klauss 74:81c47fff88a5 2 #include "eth.h"
klauss 74:81c47fff88a5 3 #include "bits.h"
klauss 74:81c47fff88a5 4 #include "UART3Interrupt.h" // for RXBuffer[ __CB_BUFFER_SIZE__ ];
klauss 74:81c47fff88a5 5 #include "utils.h"
klauss 74:81c47fff88a5 6 #include "parallelcpld.h"
klauss 74:81c47fff88a5 7 #include "debug.h"
klauss 74:81c47fff88a5 8 #include "flood.h"
klauss 74:81c47fff88a5 9 #include "bootloader_cbx.h"
klauss 74:81c47fff88a5 10 #include "call_manager.h"
klauss 74:81c47fff88a5 11 #include "call_box_manager.h"
klauss 74:81c47fff88a5 12 #include "sip_manager.h"
klauss 74:81c47fff88a5 13 #include "shared_variables.h"
klauss 74:81c47fff88a5 14 #include "prompt.h"
klauss 0:4d17cd9c8f9d 15 #include "configs.h"
klauss 0:4d17cd9c8f9d 16
klauss 0:4d17cd9c8f9d 17 int main(){
klauss 79:9bc12aa305a9 18 /* inicia o wdt interno */
klauss 48:195c97f12e8e 19 wdt.Configure( 40.0 );
klauss 79:9bc12aa305a9 20
klauss 79:9bc12aa305a9 21 /*inicia o wdt externo */
klauss 79:9bc12aa305a9 22 init_tcp_wdt();
klauss 79:9bc12aa305a9 23
klauss 0:4d17cd9c8f9d 24 start_cpld();
klauss 79:9bc12aa305a9 25
klauss 0:4d17cd9c8f9d 26 config_lpc();
klauss 79:9bc12aa305a9 27
klauss 43:455522f98de5 28 init_fsystem();
klauss 43:455522f98de5 29
klauss 78:1353744f01e1 30 short int eth_status = __init_eth__();
klauss 8:e3bfe62a477e 31 if( eth_status ){
klauss 48:195c97f12e8e 32 send_msg("Cannot connect to eth\n\r");
klauss 43:455522f98de5 33 }else{
klauss 48:195c97f12e8e 34 send_msg("Connection eth - ok");
klauss 78:1353744f01e1 35 init_prompt_eth();
klauss 8:e3bfe62a477e 36 }
klauss 78:1353744f01e1 37
klauss 78:1353744f01e1 38 Timer sync_timer, led_sync_timer;
klauss 78:1353744f01e1 39 sync_timer.start(), led_sync_timer.start();
klauss 0:4d17cd9c8f9d 40
klauss 0:4d17cd9c8f9d 41 /* representa ramal do call box */
klauss 0:4d17cd9c8f9d 42 int ext = 0;
klauss 0:4d17cd9c8f9d 43
klauss 0:4d17cd9c8f9d 44 /* representa porta do call box */
klauss 78:1353744f01e1 45 int port = 0;
klauss 78:1353744f01e1 46
klauss 0:4d17cd9c8f9d 47 /* buffer para onde se copia os dados vindos do cb para tratameno interno */
klauss 0:4d17cd9c8f9d 48 uint8_t buffer[ __CB_BUFFER_SIZE__ ];
klauss 0:4d17cd9c8f9d 49
klauss 0:4d17cd9c8f9d 50 /* buffer de escrita do pacote de saida que sera enviado pro cb / servidor */
klauss 0:4d17cd9c8f9d 51 uint8_t write_buffer[ __CB_BUFFER_SIZE__ ];
klauss 0:4d17cd9c8f9d 52
klauss 0:4d17cd9c8f9d 53 /* ponteiro que aponta para os dados vindo do CPLD */
klauss 0:4d17cd9c8f9d 54 uint8_t * buffer_from_cb_ptr = ( uint8_t * )RXBuffer;
klauss 0:4d17cd9c8f9d 55
klauss 62:07e5bdc9f8f7 56 /* Armazena o ultimo pacote recebido dos CBx */
klauss 62:07e5bdc9f8f7 57 uint8_t cb_rx_buffer[ __CB_BUFFER_SIZE__ ];
klauss 62:07e5bdc9f8f7 58
klauss 0:4d17cd9c8f9d 59 /* referencia para os dados contidos no pacote, sem o header */
klauss 0:4d17cd9c8f9d 60 uint8_t * data = NULL;
klauss 0:4d17cd9c8f9d 61
klauss 0:4d17cd9c8f9d 62 /* gerencia o tipo do pacote para providenciar tratamento adequado */
klauss 0:4d17cd9c8f9d 63 volatile uint8_t type = __DO_NOTHING__;
klauss 0:4d17cd9c8f9d 64
klauss 0:4d17cd9c8f9d 65 /* representa a lista dos Call Boxes atualmente reconhecidos pela cabeceira */
klauss 0:4d17cd9c8f9d 66 Vector * v_cb = new Vector();
klauss 0:4d17cd9c8f9d 67
klauss 0:4d17cd9c8f9d 68 /* representa a lista de ligacoes ativas na cabeceira */
klauss 0:4d17cd9c8f9d 69 Vector * v_call = new Vector();
klauss 0:4d17cd9c8f9d 70
klauss 0:4d17cd9c8f9d 71 /* gerencia a distribuicao de timeslice para os call boxes */
klauss 0:4d17cd9c8f9d 72 Timeslice * ts = new Timeslice();
klauss 78:1353744f01e1 73
klauss 0:4d17cd9c8f9d 74 /* tenta instanciar o vetor de call boxes, acende o led 1 antes de encerrar o programa */
klauss 0:4d17cd9c8f9d 75 if( v_cb == NULL ){
klauss 0:4d17cd9c8f9d 76 while( v_cb == NULL ){
klauss 0:4d17cd9c8f9d 77 Vector * v_cb = new Vector();
klauss 78:1353744f01e1 78 if( sync_timer.read() > 5 ){
klauss 48:195c97f12e8e 79 send_msg("Erro ao alocar o vetor de CBx");
klauss 78:1353744f01e1 80 sync_timer.reset();
klauss 0:4d17cd9c8f9d 81 }
klauss 0:4d17cd9c8f9d 82 }
klauss 0:4d17cd9c8f9d 83 }else if( v_call == NULL ){
klauss 0:4d17cd9c8f9d 84 while( v_call == NULL ){
klauss 0:4d17cd9c8f9d 85 Vector * v_call = new Vector();
klauss 78:1353744f01e1 86 if( sync_timer.read() > 5 ){
klauss 48:195c97f12e8e 87 send_msg("Erro ao alocar o vetor de Calls");
klauss 78:1353744f01e1 88 sync_timer.reset();
klauss 0:4d17cd9c8f9d 89 }
klauss 0:4d17cd9c8f9d 90 }
klauss 0:4d17cd9c8f9d 91 }
klauss 63:0d95da692bb4 92
klauss 78:1353744f01e1 93 reset_leds();
klauss 78:1353744f01e1 94
klauss 63:0d95da692bb4 95 for( register uint16_t i = 0; i < __CB_BUFFER_SIZE__; i++ ){
klauss 63:0d95da692bb4 96 cb_rx_buffer[ i ] = 0;
klauss 63:0d95da692bb4 97 cb_tx_buffer[ i ] = 0;
klauss 63:0d95da692bb4 98 }
klauss 63:0d95da692bb4 99
klauss 0:4d17cd9c8f9d 100 reset_leds();
klauss 78:1353744f01e1 101
klauss 33:735fd60e96d8 102 udp_timer.start();
klauss 68:b54993674190 103
klauss 68:b54993674190 104 init_telemetry_handler();
klauss 68:b54993674190 105
klauss 80:61d61c9eb75c 106 init_refresh();
klauss 80:61d61c9eb75c 107
klauss 78:1353744f01e1 108 init_aging();
klauss 78:1353744f01e1 109
klauss 62:07e5bdc9f8f7 110 static uint8_t count = 0;
klauss 78:1353744f01e1 111
klauss 78:1353744f01e1 112 short int bl_ret = init_bl_handler();
klauss 67:cdedc64d9921 113 if( dbl ) send_msg("Valor de retorno do bl_habdler = %d", bl_ret );
klauss 67:cdedc64d9921 114
klauss 78:1353744f01e1 115 //uint8_t before = ( int ) sync_timer.read() % 2;
klauss 78:1353744f01e1 116
klauss 78:1353744f01e1 117 uint8_t max_registered_cbx = 0;
klauss 78:1353744f01e1 118
klauss 78:1353744f01e1 119 //bool wake_all = false;
klauss 68:b54993674190 120
klauss 68:b54993674190 121 send_msg("Ready");
klauss 68:b54993674190 122
klauss 78:1353744f01e1 123 /*------------------------------------------ main loop ---------------------------------------------------------------*/
Cola 21:0bd688722e81 124 while( true ){
klauss 78:1353744f01e1 125 if( v_cb->size() > max_registered_cbx ) max_registered_cbx = v_cb->size();
klauss 78:1353744f01e1 126
klauss 78:1353744f01e1 127 if( sync_timer.read() > 5 ){
klauss 78:1353744f01e1 128 sync_timer.reset();
klauss 78:1353744f01e1 129
klauss 78:1353744f01e1 130 if( debug_cks == true ){
klauss 79:9bc12aa305a9 131 send_msg("PKG_CSK OK: %d :: PKG_CSK ERR: %d :: PKG_ZERO: %d :: Out_of_range: %d", pkg_cksok, pkg_ckserr, pkg_zero, out_of_range );
klauss 78:1353744f01e1 132 }
klauss 78:1353744f01e1 133
klauss 78:1353744f01e1 134 if( debug_alive == true ){
klauss 78:1353744f01e1 135 send_msg("Registered %d ( of %d ) CBx -- Remain_timeslices :: %d :: v_call->size() :: %d", v_cb->size(), max_registered_cbx , ts->remain_timeslices(), v_call->size() );
klauss 78:1353744f01e1 136 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 78:1353744f01e1 137 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 78:1353744f01e1 138 char cb_status[ 32 ];
klauss 78:1353744f01e1 139 char cb_sip_status[ 32 ];
klauss 78:1353744f01e1 140 switch( cb->status ){
klauss 78:1353744f01e1 141 case cb_idle : { strcpy( cb_status, "cb_idle" ); break; }
klauss 78:1353744f01e1 142 case cb_ringing : { strcpy( cb_status, "cb_ringing" ); break; }
klauss 78:1353744f01e1 143 case cb_trying : { strcpy( cb_status,"cb_trying" ); break; }
klauss 78:1353744f01e1 144 case cb_on_call : { strcpy( cb_status, "cb_on_call" ); break; }
klauss 78:1353744f01e1 145 case cb_busy : { strcpy( cb_status, "cb_busy" ); break; }
klauss 78:1353744f01e1 146 case cb_denied : { strcpy( cb_status, "cb_denied" ); break; }
klauss 78:1353744f01e1 147 }
klauss 78:1353744f01e1 148 switch( cb->sip->status ){
klauss 78:1353744f01e1 149 case sip_idle : { strcpy( cb_sip_status, "sip_idle" ); break; }
klauss 78:1353744f01e1 150 case sip_waiting_trying : { strcpy( cb_sip_status, "sip_waiting_trying" ); break; }
klauss 78:1353744f01e1 151 case sip_trying : { strcpy( cb_sip_status, "sip_trying" ); break; }
klauss 78:1353744f01e1 152 case sip_ringing : { strcpy( cb_sip_status, "sip_ringing" ); break; }
klauss 78:1353744f01e1 153 case sip_busy : { strcpy( cb_sip_status, "sip_busy" ); break; }
klauss 78:1353744f01e1 154 case sip_ok : { strcpy( cb_sip_status, "sip_ok" ); break; }
klauss 78:1353744f01e1 155 case sip_on_call : { strcpy( cb_sip_status, "sip_on_call" ); break; }
klauss 78:1353744f01e1 156 case sip_denied : { strcpy( cb_sip_status, "sip_denied" ); break; }
klauss 78:1353744f01e1 157 }
klauss 78:1353744f01e1 158 char cbx_to_string[ 254 ];
klauss 78:1353744f01e1 159 char aux[ 16 ];
klauss 78:1353744f01e1 160 strcpy( cbx_to_string, "Ext :: " );
klauss 78:1353744f01e1 161 itoa( cb->get_ext(), aux , 10 );
klauss 78:1353744f01e1 162 strcat( cbx_to_string, aux );
klauss 78:1353744f01e1 163 strcat( cbx_to_string, " :: Status -- " );
klauss 78:1353744f01e1 164 strcat( cbx_to_string, cb_status );
klauss 78:1353744f01e1 165 strcat( cbx_to_string, " - " );
klauss 78:1353744f01e1 166 strcat( cbx_to_string, cb_sip_status );
klauss 78:1353744f01e1 167 if( cb->get_timeslice() != 0 ){
klauss 78:1353744f01e1 168 strcat( cbx_to_string, " -- on TimeSlice :: " );
klauss 78:1353744f01e1 169 itoa( cb->get_timeslice(), aux , 10 );
klauss 78:1353744f01e1 170 strcat( cbx_to_string, aux );
klauss 78:1353744f01e1 171 }
klauss 78:1353744f01e1 172 send_msg( cbx_to_string );
klauss 78:1353744f01e1 173 }
klauss 78:1353744f01e1 174 }
klauss 78:1353744f01e1 175
klauss 78:1353744f01e1 176 count++;
klauss 78:1353744f01e1 177 if( !( count % 15 ) ){
klauss 78:1353744f01e1 178 if( eth_status ){
klauss 78:1353744f01e1 179 wdt.kick();
klauss 78:1353744f01e1 180 eth_status = __init_eth__();
klauss 78:1353744f01e1 181 if( eth_status ){
klauss 78:1353744f01e1 182 if( debug_main ) debug_msg("Cannot connect to eth");
klauss 78:1353744f01e1 183 }else{
klauss 78:1353744f01e1 184 if( debug_main ) debug_msg("Connection eth - ok");
klauss 78:1353744f01e1 185 init_prompt_eth();
klauss 78:1353744f01e1 186 }
klauss 78:1353744f01e1 187 }
klauss 78:1353744f01e1 188 }
klauss 78:1353744f01e1 189 if( !( count % 6 ) ){
klauss 78:1353744f01e1 190 //wake_all = true;
klauss 78:1353744f01e1 191 if( debug_wake == true ) send_msg( "Time to wake" );
klauss 78:1353744f01e1 192 }
klauss 78:1353744f01e1 193
klauss 78:1353744f01e1 194 //if( wake_all ) if( v_call->size() == 0 ) wake_all_up( v_cb, buffer, write_buffer );
klauss 78:1353744f01e1 195 }
klauss 78:1353744f01e1 196
klauss 78:1353744f01e1 197 if( main_test == true ){
klauss 78:1353744f01e1 198 uint8_t test_data[ 1024 ];
klauss 78:1353744f01e1 199 Call_Box * cb = __find_CB__( v_cb, 5514 );
klauss 78:1353744f01e1 200
klauss 78:1353744f01e1 201 strcpy( ( char * )test_data, "ping\r\r\r\n" );
klauss 78:1353744f01e1 202 if( cb != NULL ){
klauss 78:1353744f01e1 203 send2callboxes( __build_cb_package__( cb->get_ext(), cb->get_port(), __PROMPT__,
klauss 78:1353744f01e1 204 ( char * )test_data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 205 debug_msg("test_ping");
klauss 78:1353744f01e1 206 }
klauss 78:1353744f01e1 207 }
klauss 78:1353744f01e1 208
klauss 78:1353744f01e1 209
klauss 68:b54993674190 210 //FIXMEj colocar uma condicao aqui caso necessario pra nao comprometer ligacoes ...
klauss 35:96885a7931f0 211 prompt_process( NULL );
klauss 33:735fd60e96d8 212 wdt.kick();
klauss 62:07e5bdc9f8f7 213
klauss 78:1353744f01e1 214 if( debug_cpld ) rx = true;
klauss 78:1353744f01e1 215
klauss 62:07e5bdc9f8f7 216 if( rx ){
klauss 62:07e5bdc9f8f7 217 char str[ 1024 ];
klauss 63:0d95da692bb4 218 strcpy( str, "RX :: \n\r " );
klauss 62:07e5bdc9f8f7 219 for( register uint16_t i = 0; i < __CB_BUFFER_SIZE__; i++ ){
klauss 62:07e5bdc9f8f7 220 char tmp[ 16 ];
klauss 62:07e5bdc9f8f7 221 strcat( str, itoa( cb_rx_buffer[ i ], tmp, 16 ) );
klauss 78:1353744f01e1 222 if( ( i != 0 ) && !( ( i + 1 ) % 50 ) ) strcat( str, "\n\r " );
klauss 62:07e5bdc9f8f7 223
klauss 62:07e5bdc9f8f7 224 else strcat( str, " " );
klauss 62:07e5bdc9f8f7 225 }
klauss 62:07e5bdc9f8f7 226 send_msg( "%s", str );
klauss 62:07e5bdc9f8f7 227 rx = false;
klauss 62:07e5bdc9f8f7 228 }
klauss 62:07e5bdc9f8f7 229
klauss 63:0d95da692bb4 230 if( tx ){
klauss 63:0d95da692bb4 231 char str[ 1024 ];
klauss 63:0d95da692bb4 232 strcpy( str, "TX :: \n\r " );
klauss 63:0d95da692bb4 233 for( register uint16_t i = 0; i < __CB_BUFFER_SIZE__; i++ ){
klauss 63:0d95da692bb4 234 char tmp[ 16 ];
klauss 63:0d95da692bb4 235 strcat( str, itoa( cb_tx_buffer[ i ], tmp, 16 ) );
klauss 78:1353744f01e1 236 if( ( i != 0 ) && !( ( i + 1 ) % 50 ) ) strcat( str, "\n\r " );
klauss 63:0d95da692bb4 237
klauss 63:0d95da692bb4 238 else strcat( str, " " );
klauss 63:0d95da692bb4 239 }
klauss 63:0d95da692bb4 240 send_msg( "%s", str );
klauss 63:0d95da692bb4 241 tx = false;
klauss 63:0d95da692bb4 242 }
klauss 63:0d95da692bb4 243
klauss 63:0d95da692bb4 244 if( r_stats ){
klauss 63:0d95da692bb4 245 boot_counter = 0;
klauss 63:0d95da692bb4 246 registry_counter = 0;
klauss 63:0d95da692bb4 247 invite_counter = 0;
klauss 63:0d95da692bb4 248 audio_counter = 0;
klauss 63:0d95da692bb4 249 telemetry_counter = 0;
klauss 63:0d95da692bb4 250 cb_bye_counter = 0;
klauss 63:0d95da692bb4 251 prompt_counter = 0;
klauss 63:0d95da692bb4 252 flood_counter = 0;
klauss 67:cdedc64d9921 253 bootloader_cbx_counter = 0;
klauss 63:0d95da692bb4 254 r_stats = false;
klauss 63:0d95da692bb4 255 stats = true;
klauss 63:0d95da692bb4 256 }
klauss 63:0d95da692bb4 257 if( stats ){
klauss 63:0d95da692bb4 258 char str[ 200 ];
klauss 67:cdedc64d9921 259 snprintf( str, 200, "\n\rReceived Pkgs::\n\r Boot :: %u\n\r Registry :: %u\n\r Ivite :: %u\n\r Audio :: %u\n\r Telemetry :: %u\n\r Cb_by :: %u\n\r Prompt :: %u\n\r Flood :: %u\n\r Bootloader_cbx :: %u\n\r",
klauss 67:cdedc64d9921 260 boot_counter, registry_counter, invite_counter, audio_counter, telemetry_counter, cb_bye_counter, prompt_counter, flood_counter, bootloader_cbx_counter );
klauss 63:0d95da692bb4 261 send_msg( str );
klauss 63:0d95da692bb4 262 stats =false;
klauss 63:0d95da692bb4 263 }
klauss 63:0d95da692bb4 264
klauss 62:07e5bdc9f8f7 265 if( list ){
klauss 78:1353744f01e1 266 uint8_t missed_cb = ( ( max_ext - min_ext ) + 1 ) - v_cb->size();
klauss 78:1353744f01e1 267
klauss 78:1353744f01e1 268 if( ( max_ext % 2 ) == 0 ) missed_cb++;
klauss 78:1353744f01e1 269
klauss 78:1353744f01e1 270 if( min_ext % 2 ) missed_cb++;
klauss 78:1353744f01e1 271
klauss 78:1353744f01e1 272 if( min_ext == 0 && max_ext == 0 ) missed_cb = 0;
klauss 78:1353744f01e1 273
klauss 78:1353744f01e1 274 send_msg("Registered %d[ %d ] CBx ( %d - %d ) - Missed %d -- Remain_timeslices :: %d :: v_call->size() :: %d", v_cb->size(), max_registered_cbx, min_ext, max_ext, missed_cb, ts->remain_timeslices(), v_call->size() );
klauss 78:1353744f01e1 275 if( v_cb->size() == 1 ){
klauss 78:1353744f01e1 276 send_msg(" %d ", ( ( Call_Box * )v_cb->get_element( 0 ) )->get_ext() );
klauss 78:1353744f01e1 277 }else if( v_cb->size() > 1 ){
klauss 62:07e5bdc9f8f7 278 char str[ 1024 ];
klauss 78:1353744f01e1 279 int ext_list[ __MAX_CB_IN_A_BRANCH__ ];
klauss 62:07e5bdc9f8f7 280 register int i = 0;
klauss 62:07e5bdc9f8f7 281 for( ; i < v_cb->size(); i++ ){
klauss 78:1353744f01e1 282 ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
klauss 62:07e5bdc9f8f7 283 }
klauss 62:07e5bdc9f8f7 284
klauss 62:07e5bdc9f8f7 285 qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
klauss 62:07e5bdc9f8f7 286
klauss 62:07e5bdc9f8f7 287 char aux[ 16 ];
klauss 78:1353744f01e1 288 strcpy( str, "\r\n> " );
klauss 62:07e5bdc9f8f7 289 for( i = 0; i < v_cb->size() - 1; i++ ){
klauss 62:07e5bdc9f8f7 290 sprintf( aux, "%i, ", ext_list[ i ] );
klauss 62:07e5bdc9f8f7 291 strcat( str, aux );
klauss 78:1353744f01e1 292 if( ( i != 0 ) && !( ( i + 1 ) % 16 ) ) strcat( str, "\r\n> " );
klauss 62:07e5bdc9f8f7 293 }
klauss 62:07e5bdc9f8f7 294 sprintf( aux, "%i ", ext_list[ i ] );
klauss 62:07e5bdc9f8f7 295 strcat( str, aux );
klauss 62:07e5bdc9f8f7 296 send_msg( "%s", str );
klauss 62:07e5bdc9f8f7 297 }
klauss 62:07e5bdc9f8f7 298 list = false;
klauss 62:07e5bdc9f8f7 299 }
klauss 62:07e5bdc9f8f7 300
klauss 78:1353744f01e1 301 if( reset_cks == true ){
klauss 78:1353744f01e1 302 pkg_cksok = 0;
klauss 78:1353744f01e1 303 pkg_ckserr = 0;
klauss 78:1353744f01e1 304 reset_cks = false;
klauss 78:1353744f01e1 305 pcks_s = true;
Cola 24:270b436a1bb0 306 }
Cola 24:270b436a1bb0 307
klauss 78:1353744f01e1 308 if( pcks_s == true ){
klauss 79:9bc12aa305a9 309 send_msg("PKG_CSK OK: %d :: PKG_CSK ERR: %d :: PKG_ZERO: %d :: Out_of_range: %d", pkg_cksok, pkg_ckserr, pkg_zero, out_of_range );
klauss 78:1353744f01e1 310 pcks_s = false;
klauss 52:12930cef17c4 311 }
klauss 52:12930cef17c4 312
klauss 78:1353744f01e1 313 if( pshowcb == true ){
klauss 78:1353744f01e1 314 // por que nao posso colocar isso como list on ?
klauss 78:1353744f01e1 315 send_msg("Registered %d ( of %d ) CBx ( %d - %d ) -- Remain_timeslices :: %d :: v_call->size() :: %d", v_cb->size(), max_registered_cbx, min_ext, max_ext, ts->remain_timeslices(), v_call->size() );
Cola 24:270b436a1bb0 316 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 30:8dfb6d8de53d 317 Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
klauss 78:1353744f01e1 318 char cb_status[ 32 ];
klauss 78:1353744f01e1 319 char cb_sip_status[ 32 ];
klauss 78:1353744f01e1 320 switch( cb->status ){
klauss 78:1353744f01e1 321 case cb_idle : { strcpy( cb_status, "cb_idle" ); break; }
klauss 78:1353744f01e1 322 case cb_ringing : { strcpy( cb_status, "cb_ringing" ); break; }
klauss 78:1353744f01e1 323 case cb_trying : { strcpy( cb_status,"cb_trying" ); break; }
klauss 78:1353744f01e1 324 case cb_on_call : { strcpy( cb_status, "cb_on_call" ); break; }
klauss 78:1353744f01e1 325 case cb_busy : { strcpy( cb_status, "cb_busy" ); break; }
klauss 78:1353744f01e1 326 case cb_denied : { strcpy( cb_status, "cb_denied" ); break; }
klauss 78:1353744f01e1 327 }
klauss 78:1353744f01e1 328 switch( cb->sip->status ){
klauss 78:1353744f01e1 329 case sip_idle : { strcpy( cb_sip_status, "sip_idle" ); break; }
klauss 78:1353744f01e1 330 case sip_waiting_trying : { strcpy( cb_sip_status, "sip_waiting_trying" ); break; }
klauss 78:1353744f01e1 331 case sip_trying : { strcpy( cb_sip_status, "sip_trying" ); break; }
klauss 78:1353744f01e1 332 case sip_ringing : { strcpy( cb_sip_status, "sip_ringing" ); break; }
klauss 78:1353744f01e1 333 case sip_busy : { strcpy( cb_sip_status, "sip_busy" ); break; }
klauss 78:1353744f01e1 334 case sip_ok : { strcpy( cb_sip_status, "sip_ok" ); break; }
klauss 78:1353744f01e1 335 case sip_on_call : { strcpy( cb_sip_status, "sip_on_call" ); break; }
klauss 78:1353744f01e1 336 case sip_denied : { strcpy( cb_sip_status, "sip_denied" ); break; }
klauss 78:1353744f01e1 337 }
klauss 78:1353744f01e1 338 char cbx_to_string[ 254 ];
klauss 78:1353744f01e1 339 char aux[ 16 ];
klauss 78:1353744f01e1 340 strcpy( cbx_to_string, "Ext :: " );
klauss 78:1353744f01e1 341 itoa( cb->get_ext(), aux , 10 );
klauss 78:1353744f01e1 342 strcat( cbx_to_string, aux );
klauss 78:1353744f01e1 343 strcat( cbx_to_string, " :: Status -- " );
klauss 78:1353744f01e1 344 strcat( cbx_to_string, cb_status );
klauss 78:1353744f01e1 345 strcat( cbx_to_string, " - " );
klauss 78:1353744f01e1 346 strcat( cbx_to_string, cb_sip_status );
klauss 78:1353744f01e1 347 if( cb->get_timeslice() != 0 ){
klauss 78:1353744f01e1 348 strcat( cbx_to_string, " -- on TimeSlice :: " );
klauss 78:1353744f01e1 349 itoa( cb->get_timeslice(), aux , 10 );
klauss 78:1353744f01e1 350 strcat( cbx_to_string, aux );
klauss 78:1353744f01e1 351 }
klauss 78:1353744f01e1 352 send_msg( cbx_to_string );
klauss 48:195c97f12e8e 353 }
klauss 78:1353744f01e1 354 pshowcb = false;
klauss 48:195c97f12e8e 355 }
Cola 22:d2a4b5939115 356
klauss 78:1353744f01e1 357 if( pflood == true ) flood();
klauss 30:8dfb6d8de53d 358
klauss 0:4d17cd9c8f9d 359 if( status != __WAITING__ ){
klauss 74:81c47fff88a5 360 xmemcpy( cb_rx_buffer, buffer_from_cb_ptr, __CB_BUFFER_SIZE__ );
klauss 0:4d17cd9c8f9d 361 status = __WAITING__;
klauss 78:1353744f01e1 362 xmemcpy( buffer, cb_rx_buffer, __CB_BUFFER_SIZE__ );
klauss 0:4d17cd9c8f9d 363
klauss 34:f19d9735428e 364 data = __parse_vz_pkg__( &ext, &port, &type, buffer );
klauss 0:4d17cd9c8f9d 365
klauss 78:1353744f01e1 366 if( data != NULL ){
klauss 78:1353744f01e1 367 if( min_ext == 0 ) min_ext = ext;
klauss 78:1353744f01e1 368
klauss 78:1353744f01e1 369 if( ext > max_ext ) max_ext = ext;
klauss 78:1353744f01e1 370
klauss 78:1353744f01e1 371 if( ext < min_ext ) min_ext = ext;
klauss 78:1353744f01e1 372
klauss 78:1353744f01e1 373 if( debug_cb_rx == true ) debug_msg("Pkg from CBx :: %d -- Type :: %d", ext, type );
klauss 78:1353744f01e1 374
klauss 7:019b08223b87 375 if( type != __AUDIO__ ){
klauss 0:4d17cd9c8f9d 376 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 0:4d17cd9c8f9d 377 if( cb != NULL ){
klauss 78:1353744f01e1 378 if( ( data[ 0 ] & BIT7 ) >= BIT7 ){
klauss 78:1353744f01e1 379 if( type == __BOOT__ ){
klauss 78:1353744f01e1 380 send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
klauss 78:1353744f01e1 381 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 382 }else if( ( data[ 0 ] & BIT7 ) == ( cb->get_msg_id() ^ BIT7 ) ){
klauss 0:4d17cd9c8f9d 383 // ack from CBx
klauss 30:8dfb6d8de53d 384 if( debug_main ) debug_msg("-- ACK do meu pkg --");
klauss 0:4d17cd9c8f9d 385 type = __DO_NOTHING__;
klauss 0:4d17cd9c8f9d 386 }
klauss 0:4d17cd9c8f9d 387 }
klauss 0:4d17cd9c8f9d 388 }
klauss 0:4d17cd9c8f9d 389 }
klauss 0:4d17cd9c8f9d 390 }else type = __DO_NOTHING__;
klauss 0:4d17cd9c8f9d 391 }
klauss 78:1353744f01e1 392
klauss 78:1353744f01e1 393 if( led_sync_timer.read() > 1 ){
klauss 78:1353744f01e1 394 led_sync_timer.reset();
klauss 78:1353744f01e1 395 led3 = !led3;
klauss 78:1353744f01e1 396 CAB_LED = !CAB_LED;
klauss 78:1353744f01e1 397 }
klauss 78:1353744f01e1 398
klauss 0:4d17cd9c8f9d 399 switch( type ){
klauss 0:4d17cd9c8f9d 400 case __DO_NOTHING__ :{}
klauss 0:4d17cd9c8f9d 401 break;
klauss 0:4d17cd9c8f9d 402
klauss 0:4d17cd9c8f9d 403 case __CB_BYE__ : {
klauss 63:0d95da692bb4 404 cb_bye_counter++;
klauss 0:4d17cd9c8f9d 405 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 0:4d17cd9c8f9d 406 if( cb != NULL ){
klauss 0:4d17cd9c8f9d 407 data[ 0 ] |= BIT7;
klauss 0:4d17cd9c8f9d 408 cb->set_msg_id( data[ 0 ] );
klauss 30:8dfb6d8de53d 409 if( debug_main ) debug_msg( " Request bye from CBx " );
klauss 0:4d17cd9c8f9d 410 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 0:4d17cd9c8f9d 411 VZ_call * call = (VZ_call *)v_call->get_element( i );
klauss 0:4d17cd9c8f9d 412 if( call->get_cb_ext() == ext ){
klauss 4:de46f0d9b14d 413 cb->send_bye();
klauss 78:1353744f01e1 414
klauss 0:4d17cd9c8f9d 415 ts->return_timeslice( cb->get_timeslice() );
klauss 0:4d17cd9c8f9d 416 cb->set_timeslice( 0x00 );
klauss 78:1353744f01e1 417 data[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 78:1353744f01e1 418
klauss 0:4d17cd9c8f9d 419 set_status( cb->status, cb_idle );
klauss 78:1353744f01e1 420 set_status( cb->sip->status, sip_idle );
klauss 78:1353744f01e1 421
klauss 13:ae278302dffe 422 v_call->remove_element( i );
klauss 78:1353744f01e1 423
klauss 74:81c47fff88a5 424 send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
klauss 0:4d17cd9c8f9d 425 ( char * )data, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 426
klauss 78:1353744f01e1 427 cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 78:1353744f01e1 428
klauss 3:cd9148672e25 429 delete( call );
klauss 29:7246460b73f8 430 cb->re_start_timer();
klauss 0:4d17cd9c8f9d 431 }
klauss 0:4d17cd9c8f9d 432 }
klauss 78:1353744f01e1 433 cb->registry();
klauss 0:4d17cd9c8f9d 434 }
klauss 7:019b08223b87 435 }break;
klauss 7:019b08223b87 436
klauss 0:4d17cd9c8f9d 437 case __INVITE__ : {
klauss 63:0d95da692bb4 438 invite_counter++;
klauss 78:1353744f01e1 439 if( debug_invite ) debug_msg("Request Invite received from Cbx %i", ext);
klauss 0:4d17cd9c8f9d 440 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 0:4d17cd9c8f9d 441 if( cb == NULL ){
klauss 78:1353744f01e1 442 if( debug_main ) debug_msg( "Adding CBx :: %i", ext );
klauss 0:4d17cd9c8f9d 443 cb = new Call_Box( ext, port );
klauss 0:4d17cd9c8f9d 444 v_cb->add( cb );
klauss 0:4d17cd9c8f9d 445 }
klauss 78:1353744f01e1 446 cb->registry();
klauss 78:1353744f01e1 447 cb->set_msg_id( data[ 0 ] );
klauss 78:1353744f01e1 448 invite_handler( v_call, v_cb, ts, cb );
klauss 0:4d17cd9c8f9d 449 }break;
klauss 4:de46f0d9b14d 450 case __REGISTRY__ : {
klauss 63:0d95da692bb4 451 registry_counter++;
klauss 78:1353744f01e1 452 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 2:93bec7313ccc 453
klauss 78:1353744f01e1 454 if( cb == NULL ){
klauss 78:1353744f01e1 455 if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
klauss 4:de46f0d9b14d 456 cb = new Call_Box( ext, port );
klauss 4:de46f0d9b14d 457 v_cb->add( cb );
klauss 30:8dfb6d8de53d 458 if( debug_main ) debug_msg("Added CBx -- %d", ext );
klauss 0:4d17cd9c8f9d 459 }
klauss 78:1353744f01e1 460 if( debug_main ) debug_msg("Registered %d - %d", ext, port );
klauss 78:1353744f01e1 461
klauss 4:de46f0d9b14d 462 cb->registry();
klauss 78:1353744f01e1 463
klauss 4:de46f0d9b14d 464 }break;
klauss 4:de46f0d9b14d 465 case __BOOT__ : {
klauss 63:0d95da692bb4 466 boot_counter++;
klauss 74:81c47fff88a5 467 send2callboxes( __build_cb_package__( ext, port, __REGISTRY__,
klauss 78:1353744f01e1 468 ( char * )data, data[ 0 ] | BIT7, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 4:de46f0d9b14d 469 }break;
klauss 4:de46f0d9b14d 470 case __TELEMETRY__ : {
klauss 78:1353744f01e1 471 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 78:1353744f01e1 472 if( cb == NULL ){
klauss 78:1353744f01e1 473 if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
klauss 78:1353744f01e1 474 cb = new Call_Box( ext, port );
klauss 78:1353744f01e1 475 v_cb->add( cb );
klauss 78:1353744f01e1 476 if( debug_main ) debug_msg("Added CBx -- %d", ext );
klauss 78:1353744f01e1 477 }
klauss 78:1353744f01e1 478 cb->registry();
klauss 80:61d61c9eb75c 479 //FIXME mandar um pacote do tipo 2 pro cbx
klauss 63:0d95da692bb4 480 telemetry_counter++;
klauss 78:1353744f01e1 481 if( debug_telemetry ) send_msg("::Telemetry from %d - %d::", ext, port );
klauss 53:bb492a8f115a 482 build_telemetry_report( ext, port, ( char *)data );
klauss 4:de46f0d9b14d 483 }break;
klauss 36:728498a78e1e 484
klauss 67:cdedc64d9921 485 case __BOOTLOADER_CBX__ : {
klauss 67:cdedc64d9921 486 bootloader_cbx_counter++;
klauss 67:cdedc64d9921 487 int ret = bl_cbx_reply_to_eth( ext, ( char * )data );
klauss 67:cdedc64d9921 488 }break;
klauss 67:cdedc64d9921 489
klauss 36:728498a78e1e 490 case __PROMPT__ : {
klauss 78:1353744f01e1 491 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 78:1353744f01e1 492 if( cb == NULL ){
klauss 78:1353744f01e1 493 if( debug_main ) debug_msg("Adding Cbx :: %d", ext );
klauss 78:1353744f01e1 494 cb = new Call_Box( ext, port );
klauss 78:1353744f01e1 495 v_cb->add( cb );
klauss 78:1353744f01e1 496 if( debug_main ) debug_msg("Added CBx -- %d", ext );
klauss 48:195c97f12e8e 497 }
klauss 78:1353744f01e1 498
klauss 78:1353744f01e1 499 cb->registry();
klauss 48:195c97f12e8e 500
klauss 78:1353744f01e1 501 if( xstrmatch( ( uint8_t * )data, ( uint8_t * )"ping" ) ){
klauss 78:1353744f01e1 502 if( debug_ping ) send_msg( "Prompt pkg from ( %i, %i ) :: Ping", ext, port );
klauss 78:1353744f01e1 503 }else{
klauss 78:1353744f01e1 504 prompt_counter++;
klauss 78:1353744f01e1 505 //fixme isso nao poderia ser resolvido com um sendmsg ?
klauss 78:1353744f01e1 506 send_msg( "Prompt pkg from ( %i, %i ) ::", ext, port );
klauss 78:1353744f01e1 507 for( register uint8_t i = 0; i < 32; i++ ){
klauss 78:1353744f01e1 508 pc.printf("%c", data[ i ] );
klauss 78:1353744f01e1 509 if( i == 15 ) pc.printf( "\r\n" );
klauss 78:1353744f01e1 510 }
klauss 78:1353744f01e1 511 pc.printf("\n\r> ");
klauss 78:1353744f01e1 512
klauss 78:1353744f01e1 513 if( tcp_session ){
klauss 78:1353744f01e1 514 char aux[ __CB_BUFFER_SIZE__ + 3 ];
klauss 78:1353744f01e1 515 strncpy( aux, (char * )data, __CB_BUFFER_SIZE__ );
klauss 78:1353744f01e1 516 strcat( aux, "\n\r\0" );
klauss 78:1353744f01e1 517 tcp_client.send_all( ( char *)data, strlen( (char * )data ) );
klauss 78:1353744f01e1 518 tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) );
klauss 78:1353744f01e1 519 }
klauss 48:195c97f12e8e 520 }
klauss 36:728498a78e1e 521 }break;
klauss 0:4d17cd9c8f9d 522 case __AUDIO__ : {
klauss 63:0d95da692bb4 523 audio_counter++;
klauss 78:1353744f01e1 524 VZ_call * call = __find_Call__( v_call, ext );
klauss 0:4d17cd9c8f9d 525 if( call != NULL ){
klauss 30:8dfb6d8de53d 526 char * pkg = call->build_eth_package( data + 2 );
klauss 0:4d17cd9c8f9d 527 call->send_message( pkg );
klauss 78:1353744f01e1 528 Call_Box * cb = __find_CB__( v_cb, ext );
klauss 0:4d17cd9c8f9d 529 if( cb != NULL ) cb->reset_elapsed_time();
klauss 18:01a93677e40c 530 }else{
klauss 78:1353744f01e1 531 if( debug_main ) debug_msg("received missed package from CBx :: %i", ext );
klauss 0:4d17cd9c8f9d 532 }
klauss 0:4d17cd9c8f9d 533 }break;
klauss 9:ffa64f38ef9c 534 }// fim switch
klauss 78:1353744f01e1 535 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 0:4d17cd9c8f9d 536 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 0:4d17cd9c8f9d 537 int length = 0;
klauss 0:4d17cd9c8f9d 538 char * tmp = call->get_eth_message( &length );
klauss 0:4d17cd9c8f9d 539 if( tmp != NULL ){
klauss 0:4d17cd9c8f9d 540 int cb_port = 0xffff;
klauss 78:1353744f01e1 541 Call_Box * cb = __find_CB__( v_cb, call->get_cb_ext() );
klauss 4:de46f0d9b14d 542
klauss 4:de46f0d9b14d 543 if( cb != NULL ){
klauss 4:de46f0d9b14d 544 cb_port = cb->get_port();
klauss 78:1353744f01e1 545
klauss 78:1353744f01e1 546 uint8_t * pkg2cb = __build_cb_package__( call->get_cb_ext(), cb_port, __AUDIO__,
klauss 0:4d17cd9c8f9d 547 tmp, __AUDIO__, length, write_buffer );
klauss 4:de46f0d9b14d 548
klauss 78:1353744f01e1 549 send2callboxes( pkg2cb );
klauss 78:1353744f01e1 550 }else if( debug_main ) debug_msg("received missed package from CBx :: %i -- Type :: %i", ext, type );
klauss 0:4d17cd9c8f9d 551 }
klauss 14:22a35f575502 552 }
klauss 80:61d61c9eb75c 553 if( v_call->size() == 0 ) refresh( v_cb, buffer, write_buffer, NULL );
klauss 80:61d61c9eb75c 554
klauss 78:1353744f01e1 555 //if( v_call->size() == 0 ) registry_aging( v_cb, buffer, write_buffer );
klauss 78:1353744f01e1 556
klauss 78:1353744f01e1 557 //Fixme pensar melhor nessa parte durante ligacoes, pode complicar com muitos cbx ...
klauss 78:1353744f01e1 558 //testar sem os debugs em on, pode fazer a diferenca
klauss 28:94aec56c6329 559 if( v_call->size() == 0 ) registry_aging( v_cb, buffer, write_buffer );
klauss 4:de46f0d9b14d 560
klauss 78:1353744f01e1 561 // check sip messages only for cbx in call ?
klauss 78:1353744f01e1 562 int ext_to__be_removed = sip_manager( v_cb );
klauss 78:1353744f01e1 563 if( ext_to__be_removed > 0x00 ){
klauss 78:1353744f01e1 564 Call_Box * cb = __find_CB__( v_cb, ext_to__be_removed );
klauss 4:de46f0d9b14d 565 if( cb != NULL ){
klauss 4:de46f0d9b14d 566 if( cb->status == cb_on_call ){
klauss 4:de46f0d9b14d 567 ts->return_timeslice( cb->get_timeslice() );
klauss 4:de46f0d9b14d 568 cb->set_timeslice( 0x00 );
klauss 4:de46f0d9b14d 569 buffer[ __TIMESLICE_PLACE__ ] = 0x00;
klauss 78:1353744f01e1 570
klauss 78:1353744f01e1 571 set_status( cb->status, cb_idle );
klauss 78:1353744f01e1 572 set_status( cb->sip->status, sip_idle );
klauss 78:1353744f01e1 573
klauss 4:de46f0d9b14d 574 for( register uint8_t i = 0; i < v_call->size(); i++ ){
klauss 4:de46f0d9b14d 575 VZ_call * call = ( VZ_call * )v_call->get_element( i );
klauss 78:1353744f01e1 576 if( call->get_cb_ext() == ext_to__be_removed ){
klauss 4:de46f0d9b14d 577 v_call->remove_element( i );
klauss 4:de46f0d9b14d 578 delete( call );
klauss 4:de46f0d9b14d 579 }
klauss 2:93bec7313ccc 580 }
klauss 78:1353744f01e1 581
klauss 74:81c47fff88a5 582 send2callboxes( __build_cb_package__( ext, port, __CB_BYE__,
klauss 4:de46f0d9b14d 583 ( char * )buffer, cb->get_msg_id(), __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
klauss 78:1353744f01e1 584 cb->set_msg_id( ( cb->get_msg_id() & ~BIT7 ) + 1 );
klauss 78:1353744f01e1 585
klauss 29:7246460b73f8 586 cb->re_start_timer();
klauss 0:4d17cd9c8f9d 587 }
klauss 78:1353744f01e1 588 }else if( debug_main ) debug_msg("Missed bye request from * CBx :: %d", ext );
klauss 0:4d17cd9c8f9d 589 }
klauss 13:ae278302dffe 590
klauss 10:22da1a0ac1e1 591 call_manager( v_call, v_cb, buffer, write_buffer, ts );
klauss 0:4d17cd9c8f9d 592
klauss 78:1353744f01e1 593 invite_handler( v_call, v_cb, ts, NULL );
klauss 78:1353744f01e1 594
klauss 78:1353744f01e1 595 if( ( v_call->size() == 0 ) && ( ts->remain_timeslices() != __MAX_TIMESLICES__ ) ){
klauss 78:1353744f01e1 596 bool ts_reset = true;
klauss 78:1353744f01e1 597 for( register uint8_t i = 0; i < v_cb->size(); i++ ){
klauss 78:1353744f01e1 598 if ( ( ( Call_Box * )v_cb->get_element( i ) )->get_status() != cb_idle ){
klauss 78:1353744f01e1 599 ts_reset = false;
klauss 78:1353744f01e1 600 break;
klauss 78:1353744f01e1 601 }
klauss 78:1353744f01e1 602 }
klauss 78:1353744f01e1 603 if( ts_reset ){
klauss 78:1353744f01e1 604 debug_msg("");
klauss 78:1353744f01e1 605 ts->reset();
klauss 78:1353744f01e1 606 }
klauss 0:4d17cd9c8f9d 607 }
klauss 78:1353744f01e1 608
klauss 67:cdedc64d9921 609 bl_handler();
klauss 78:1353744f01e1 610
klauss 72:895ca792c647 611 tx_buffer_ring_buffer_handler();
klauss 33:735fd60e96d8 612
klauss 30:8dfb6d8de53d 613 type = __DO_NOTHING__;
klauss 0:4d17cd9c8f9d 614 }
klauss 0:4d17cd9c8f9d 615 }