Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
main_app_functions.cpp
- Committer:
- klauss
- Date:
- 2015-11-24
- Revision:
- 137:32dd35a6dbc9
- Parent:
- 135:2f4290590e51
File content as of revision 137:32dd35a6dbc9:
#include "main_app_functions.h"
inline void reset_leds() { led1 = led2 = 1; led3 = led4 = 0; }
int header_app_init ( void )
{
vz_printf ( "\r\n" );
if ( debug_app_init ) vz_printf ( "init_wdt() :: %s", ( init_wdt () == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "config_lpc() :: %s", ( config_lpc () == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "start_cpld() :: %s", ( start_cpld () == 0 ) ? "Ok" : "Failure" );
if( sdram_init() == 1 ) {
vz_printf ("******* Failed to initialize SDRAM *******");
return 1;
} else {
vz_printf ("******* Success to initialize SDRAM *******");
}
int init_fsystem_ret = init_fsystem();
if( init_fsystem_ret & BIT0 )
{
vz_printf ("******* File system configured!!*******");
}
if( init_fsystem_ret & BIT1 )
{
vz_printf ("******* File System Ready *******");
}
{
char s[ 32 ];
mbed_mac_address( s );
vz_printf ( "::Mac::%02x:%02x:%02x:%02x:%02x:%02x:: ", s[0],s[1],s[2],s[3],s[4],s[5] );
}
eth_status = __init_eth__ ();
if ( eth_status )
{
vz_printf ("******* Cannot connect to eth *******");
} else {
vz_printf ("******* Connection eth - ok *******");
int vz_io_eth_init_ret = vz_io_eth_init ();
if ( vz_io_eth_init_ret == BIT0 ) vz_printf ("******* Prompt eth UDP Ready *******");
if ( vz_io_eth_init_ret == BIT1 ) vz_printf ("******* Prompt eth TCP Ready *******");
if ( debug_app_init ) vz_printf ( "vz_io_eth_init () :: %s", ( vz_io_eth_init_ret == ( BIT0 bitor BIT1 ) ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_external_wdt () :: %s", ( init_external_wdt () == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_bl () :: %s", ( init_bl() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_clock () :: %s", ( init_clock () == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_pwr_src () :: %s", ( init_power_source () == 0 ) ? "Ok" : "Failure" );
}
sync_timer.start();
led_sync_timer.start();
ext = 0;
port = 0;
buffer_from_cb_ptr = ( uint8_t * )RXBuffer;
data = NULL;
type = DO_NOTHING;
v_cb = new Vector();
if ( debug_app_init ) vz_printf ( "v_cb :: %s", ( v_cb not_eq NULL ) ? "Ok" : "Failure" );
v_call = new Vector();
if ( debug_app_init ) vz_printf ( "v_call :: %s", ( v_call not_eq NULL ) ? "Ok" : "Failure" );
ts = new Timeslice();
if( ts == NULL ) {
memory_is_over = true;
if( debug_memory ) vz_printf ("TS allocation fail");
}
if ( debug_app_init ) vz_printf ( "TS :: %s", ( ts not_eq NULL ) ? "Ok" : "Failure" );
for( register uint16_t i = 0; i < CB_BUFFER_SIZE; i++ ) {
cb_rx_buffer[ i ] = 0;
cb_tx_buffer[ i ] = 0;
}
reset_leds();
if ( debug_app_init ) vz_printf ( "init_fw_handler() :: %s", ( init_fw_handler() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_ranges() :: %s", ( init_ranges() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_refresh() :: %s", ( init_refresh() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_sync_refresh() :: %s", ( init_sync_refresh() == 0 ) ? "Ok" : "Failure" );
count = 0;
max_registered_cbx = 0;
wake_all = false;
pkg_wdt = RX_CB_IDLE;
eth_wdt = ETH_CONNECT_TIMEOUT;
invite_retry_timer.start();
if ( debug_app_init ) vz_printf ( "hex_init() :: %s", ( hex_init() == 0 ) ? "Ok" : "Failure" );
reset_leds();
lpc_low_level_input_counter = 0;
if ( debug_app_init ) vz_printf ( "init_hello () :: %s", ( init_hello () == 0 ) ? "Ok" : "Failure" );
test_ts_timer.start ();
vz_printf ( "\r\n" );
return ( 0 );
}
int try_reconnect_with_eth ( void )
{
eth_status = __init_eth__();
if ( eth_status )
{
vz_printf ("******* Cannot connect to eth *******");
} else {
vz_printf ("******* Connection eth - ok *******");
int vz_io_eth_init_ret = vz_io_eth_init ();
if ( vz_io_eth_init_ret == BIT0 ) vz_printf ("******* Prompt eth UDP Ready *******");
if ( vz_io_eth_init_ret == BIT1 ) vz_printf ("******* Prompt eth TCP Ready *******");
if ( debug_app_init ) vz_printf ( "vz_io_eth_init () :: %s", ( vz_io_eth_init_ret == ( BIT0 bitor BIT1 ) ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_external_wdt() :: %s", ( init_external_wdt() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_bl() :: %s", ( init_bl() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_clock() :: %s", ( init_clock() == 0 ) ? "Ok" : "Failure" );
if ( debug_app_init ) vz_printf ( "init_pwr_src () :: %s", ( init_power_source () == 0 ) ? "Ok" : "Failure" );
}
return eth_status;
}
int show_stats ( void )
{
char str [ 256 ];
int snprintf_ret = snprintf( str, sizeof ( str ) - 1,
"\n\rReceived Pkgs::\n\r "
"Boot :: %u\n\r "
"Registry :: %u\n\r "
"Invite :: %u\n\r "
"Audio :: %u\n\r "
"Telemetry :: %u\n\r "
"CB_stats :: %u\n\r "
"CB_bye :: %u\n\r "
"Prompt :: %u\n\r "
"Flood :: %u\n\r "
"Bootloader_cbx :: %u\n\r",
boot_counter,
registry_counter,
invite_counter,
audio_counter,
telemetry_counter,
cb_stats_counter,
cb_bye_counter,
prompt_counter,
flood_counter,
bootloader_cbx_counter
);
vz_printf ( "%s", str );
if ( debug_string_length ) vz_debug ( "str.length ( %d )", snprintf_ret );
return ( snprintf_ret );
}
int reset_stats ( void )
{
boot_counter = 0;
registry_counter = 0;
invite_counter = 0;
audio_counter = 0;
telemetry_counter = 0;
cb_bye_counter = 0;
prompt_counter = 0;
flood_counter = 0;
bootloader_cbx_counter = 0;
cb_stats_counter = 0;
fw_counter = 0;
return ( 0 );
}
int
show_cb_list ( Vector * v_cb )
{
vz_printf (
"Registered %d[ %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()
);
if( v_cb->size() == 1 ) {
vz_printf (" %d ", ( ( Call_Box * )v_cb -> get_element( 0 ) ) -> get_ext () );
} else if( v_cb -> size() > 1 ) {
char str [ 1024 ];
int ext_list [ u8_MAX_CB_IN_A_BRANCH ];
register int i = 0;
for( ; i < v_cb -> size(); i++ ) {
ext_list [ i ] = ( ( Call_Box * )v_cb->get_element ( i ) ) -> get_ext ();
}
qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
char aux[ 16 ];
strcpy ( str, "\r\n> " );
for ( i = 0; i < v_cb -> size () - 1; i ++ )
{
sprintf ( aux, "%i, ", ext_list [ i ] );
strcat ( str, aux );
if ( ( i not_eq 0 ) and not ( ( i + 1 ) % 16 ) ) strcat ( str, "\r\n> " );
}
sprintf ( aux, "%i ", ext_list [ i ] );
strcat ( str, aux );
vz_printf ( "%s", str );
}
return ( 0 );
}
int
show_cb_long_list ( Vector * v_cb, bool show_time, bool show_invite )
{
{
int ext_list [ u8_MAX_CB_IN_A_BRANCH ];
if ( v_cb -> size () >= 1 )
{
for ( register int i = 0; i < v_cb -> size (); i ++ )
{
ext_list [ i ] = ( ( Call_Box * )v_cb -> get_element ( i ) ) -> get_ext ();
}
qsort ( ext_list, v_cb -> size (), sizeof ( int ), ls_comp );
}
vz_printf ("Registered %d[ %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()
);
for ( register uint8_t i = 0; i < v_cb -> size (); i ++ )
{
Call_Box * cb = find_CB ( v_cb, ext_list [ i ] );
if ( cb not_eq NULL )
{
char cb_status [ 32 ];
char cb_sip_status [ 32 ];
switch ( cb -> get_status () )
{
case cb_idle : {
strcpy ( cb_status, "cb_idle" );
break;
}
case cb_ringing : {
strcpy ( cb_status, "cb_ringing" );
break;
}
case cb_trying : {
strcpy ( cb_status,"cb_trying" );
break;
}
case cb_on_call : {
strcpy ( cb_status, "cb_on_call" );
break;
}
case cb_busy : {
strcpy ( cb_status, "cb_busy" );
break;
}
case cb_denied : {
strcpy ( cb_status, "cb_denied" );
break;
}
case cb_bootloader : {
strcpy ( cb_status, "cb_bootloader" );
break;
}
}
switch( cb -> get_sip_status () )
{
case sip_idle : {
strcpy ( cb_sip_status, "sip_idle" );
break;
}
case sip_waiting_trying : {
strcpy ( cb_sip_status, "sip_waiting_trying" );
break;
}
case sip_trying : {
strcpy ( cb_sip_status, "sip_trying" );
break;
}
case sip_ringing : {
strcpy ( cb_sip_status, "sip_ringing" );
break;
}
case sip_busy : {
strcpy ( cb_sip_status, "sip_busy" );
break;
}
case sip_ok : {
strcpy ( cb_sip_status, "sip_ok" );
break;
}
case sip_on_call : {
strcpy ( cb_sip_status, "sip_on_call" );
break;
}
case sip_denied : {
strcpy ( cb_sip_status, "sip_denied" );
break;
}
}
char cbx_to_string [ 254 ];
snprintf ( cbx_to_string, sizeof ( cbx_to_string ),
"Ext :: %5i :: Port :: %5i :: Status -- %s - %s",
cb->get_ext(), cb->get_port(), cb_status, cb_sip_status
);
if( cb -> get_timeslice () not_eq 0 )
{
char aux [ 32 ];
snprintf ( aux, sizeof ( aux ), " -- on TimeSlice :: %i", cb->get_timeslice () );
strcat( cbx_to_string, aux );
}
if ( show_time )
{
char get_timer_msg [ 128 ];
snprintf ( get_timer_msg, sizeof ( get_timer_msg ) -1, " -- timer %4i [ %s ",
cb -> get_timer (),
( cb -> get_overflow_flag () ) ? "Overflow" : "Ok"
);
int get_overflow_times_tmp = cb -> get_overflow_times ();
if ( get_overflow_times_tmp == 0 ) strcat ( get_timer_msg, "]" );
else {
char strcat_tmp [ 16 ];
if ( get_overflow_times_tmp == 1 ) snprintf ( strcat_tmp, sizeof ( strcat_tmp ) - 1, "1 time ]" );
else snprintf ( strcat_tmp, sizeof ( strcat_tmp ) - 1, "%d times ]", get_overflow_times_tmp );
strcat ( get_timer_msg, strcat_tmp );
}
strcat ( cbx_to_string, get_timer_msg );
}
if ( show_invites )
{
char get_invites_msg [ 32 ];
snprintf ( get_invites_msg,
sizeof ( get_invites_msg ) -1,
" :: invites :: %u ", cb -> get_invite_counter () );
strcat ( cbx_to_string, get_invites_msg );
}
vz_printf ( cbx_to_string );
}
}
}
return ( 0 );
}
int show_cb ( Vector * v_cb )
{
vz_printf ("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()
);
for( register uint8_t i = 0; i < v_cb -> size (); i++ )
{
Call_Box * cb = ( Call_Box * )v_cb -> get_element ( i );
char cb_status [ 32 ];
char cb_sip_status [ 32 ];
switch ( cb -> get_status () )
{
case cb_idle : {
strcpy ( cb_status, "cb_idle" );
break;
}
case cb_ringing : {
strcpy ( cb_status, "cb_ringing" );
break;
}
case cb_trying : {
strcpy ( cb_status,"cb_trying" );
break;
}
case cb_on_call : {
strcpy ( cb_status, "cb_on_call" );
break;
}
case cb_busy : {
strcpy ( cb_status, "cb_busy" );
break;
}
case cb_denied : {
strcpy ( cb_status, "cb_denied" );
break;
}
case cb_bootloader : {
strcpy ( cb_status, "cb_bootloader" );
break;
}
}
switch( cb -> get_sip_status () ) {
case sip_idle : {
strcpy ( cb_sip_status, "sip_idle" );
break;
}
case sip_waiting_trying : {
strcpy ( cb_sip_status, "sip_waiting_trying" );
break;
}
case sip_trying : {
strcpy ( cb_sip_status, "sip_trying" );
break;
}
case sip_ringing : {
strcpy ( cb_sip_status, "sip_ringing" );
break;
}
case sip_busy : {
strcpy ( cb_sip_status, "sip_busy" );
break;
}
case sip_ok : {
strcpy ( cb_sip_status, "sip_ok" );
break;
}
case sip_on_call : {
strcpy ( cb_sip_status, "sip_on_call" );
break;
}
case sip_denied : {
strcpy ( cb_sip_status, "sip_denied" );
break;
}
}
char cbx_to_string [ 254 ];
snprintf ( cbx_to_string, sizeof ( cbx_to_string ),
"Ext :: %5i :: Port :: %5i :: Status -- %s - %s",
cb -> get_ext (), cb -> get_port (), cb_status, cb_sip_status
);
if ( cb -> get_timeslice () not_eq 0 )
{
char aux [ 32 ];
snprintf ( aux, sizeof ( aux ), " -- on TimeSlice :: %i", cb -> get_timeslice () );
strcat ( cbx_to_string, aux );
}
vz_printf ( cbx_to_string );
}
return ( 0 );
}
int show_cb_sip ( Vector * v_cb )
{
vz_printf (":: Sip :: %u", v_cb -> size () );
for ( register uint8_t i = 0; i < v_cb -> size (); i++ )
{
Call_Box * cb = ( Call_Box * ) v_cb -> get_element ( i );
char tmp_send_msg [ 256 ];
snprintf ( tmp_send_msg, sizeof ( tmp_send_msg ) - 1,
"ext :: %5i -- port :: %5i -- timer %4i [ %s ",
cb -> get_sip_ext (),
cb -> get_sip_port (),
cb -> get_timer (),
( cb -> get_overflow_flag () ) ? "Overflow" : "Ok"
);
int get_overflow_times_tmp = cb -> get_overflow_times ();
if ( get_overflow_times_tmp == 0 ) strcat ( tmp_send_msg, "]" );
else {
char strcat_tmp [ 16 ];
if ( get_overflow_times_tmp == 1 ) snprintf( strcat_tmp, sizeof ( strcat_tmp ) - 1, "1 time ]" );
else snprintf( strcat_tmp, sizeof ( strcat_tmp ) - 1, "%d times ]", get_overflow_times_tmp );
strcat ( tmp_send_msg, strcat_tmp );
}
vz_printf ( tmp_send_msg );
}
return ( 0 );
}
int show_sizes ( void )
{
sizes = false;
vz_printf ( "CB_New (%u) -- CB_Delete (%u)", cb_new_counter, cb_delete_counter );
vz_printf ( "SIP_New (%u) -- SIP_Delete (%u)", sip_new_counter, sip_delete_counter );
vz_printf ( "RTP_header_New (%u) -- RTP_header_Delete (%u)", rtp_header_new_counter, rtp_header_delete_counter );
vz_printf ( "RTP_body_New (%u) -- RTP_body_Delete (%u)", rtp_body_new_counter, rtp_body_delete_counter );
vz_printf ( "Call_New (%u) -- Call_Delete (%u)", call_new_counter, call_delete_counter );
vz_printf ( "lpc_low_level_input_counter :: %d", lpc_low_level_input_counter );
vz_printf ( "Memory is %s", ( memory_is_over ) ? "Over" : "Ok" );
vz_printf ( "Missed_Pkg :: %d ::", missed_pkg );
vz_printf ( "Sizeof Sip :: %u", sizeof ( Sip ) );
vz_printf ( "Sizeof Call_Box :: %u", sizeof ( Call_Box ) );
vz_printf ( "Sizeof VZ_call :: %u", sizeof ( VZ_call ) );
vz_printf ( "Sizeof RTP :: %u", sizeof ( RTP ) );
vz_printf ( "Sizeof RTP_Header :: %u", sizeof ( RTP_Header ) );
vz_printf ( "Sizeof RTP_Body :: %u", sizeof ( RTP_Body ) );
vz_printf ( "Sizeof Vector :: %u", sizeof ( Vector ) );
vz_printf ("Sizeof Timeslice :: %u", sizeof ( Timeslice ) );
vz_printf ( "Sizeof Watchdog :: %u", sizeof ( Watchdog ) );
return ( 0 );
}
int check_udp_packages_pending ( Vector * v_cb )
{
fd_set fdSet;
FD_ZERO(&fdSet);
udp_query = false;
from_eth = false;
for( register uint8_t i = 0; i < v_cb->size(); i++ ) {
Call_Box * cb = (Call_Box *)v_cb->get_element( i );
FD_SET( cb->get_sip_socket_fd(), &fdSet);
}
/* Recepcao de pacotes UDP para atualizacao de callboxes */
FD_SET( udp_bl_client.get_fd (), &fdSet);
/* Recepcao de pacotes UDP para "tickagem" do watchdog */
FD_SET( udp_wdt_client.get_fd (), &fdSet);
// adiciona o socket de comandos prompt-UDP-ETH
FD_SET( udp_client.get_fd (), &fdSet );
// adiciona o socket de pedido de clock para o servidor
FD_SET( clock_sock.get_fd (), &fdSet );
struct timeval t;
t.tv_sec = 0;
t.tv_usec = 0;
int ret = lwip_select ( FD_SETSIZE, &fdSet, NULL, NULL, &t );
if ( ( udp_bl_timer.read() > 30) and (bl_start_flag) )
{
udp_bl_timer.stop();
udp_bl_timer.reset();
bl_start_flag = 0;
if (bl_ts not_eq 0) {
ts->return_timeslice( bl_ts );
bl_ts = 0;
}
if (bl_cb not_eq NULL) {
bl_cb -> set_timeslice( 0 );
bl_cb -> cb_set_status ( cb_idle );
bl_cb = NULL;
}
}
if ( ret > 0 )
{
for ( register uint8_t i = 0; i < v_cb -> size (); i++ )
{
Call_Box * cb = ( Call_Box * )v_cb -> get_element ( i );
int fd = cb -> get_sip_socket_fd ();
if ( FD_ISSET ( fd, &fdSet ) )
{
cb -> sip_udp_incomming_pkg ();
}
}
/* Tratamento dos pacotes de bootloader vindo do servidor */
if( FD_ISSET( udp_bl_client.get_fd(), &fdSet ) ) {
if( udp_bl_client.receiveFrom( udp_bl_server, bl_recv_buffer, sizeof( bl_recv_buffer ) ) > 0 ) {
uint16_t cnt = 0;
if (debug_bootloader) {
pc.printf("\r\nPACOTE SRV->HDR {");
for (cnt = 0;cnt < UDP_BL_SIZE;cnt++) {
if ((cnt % 30) == 0) {
pc.printf("\r\n ");
pc.printf(hex16(cnt));
pc.printf(" : ");
}
pc.printf(hex8(bl_recv_buffer[cnt]));
pc.printf(", ");
}
pc.printf("\r\n}");
}
bl_peer = ((uint8_t)bl_recv_buffer[0])*256 + (uint8_t)bl_recv_buffer[1];
bl_send_buffer[0] = bl_recv_buffer[0];
bl_send_buffer[1] = bl_recv_buffer[1];
for (cnt = 2;cnt < UDP_BL_SIZE;cnt++) {
bl_send_buffer[cnt] = 0;
}
if ((bl_ts == 0) and !(bl_start_flag)) {
bl_ts = ts->get_timeslice();
}
/* caso nao haja timeslice disponivel informar servidor */
if ((bl_ts == 0) and !(bl_start_flag)) {
strncpy(bl_send_buffer + 2,"cbxdead\x00",8);
int udp_bl_client_ret = udp_bl_client.sendTo ( udp_bl_server, bl_send_buffer, strlen ( bl_send_buffer ) );
if ( udp_bl_client_ret not_eq strlen( bl_send_buffer ) )
{
reconnect_bl ();
miss_bl_udp_send_pkg ++;
if ( debug_reconnect ) vz_printf ( "[%d] Reconnect BL - %d", bl_peer, udp_bl_client_ret );
}
} else {
/* pacote para verificar se o callbox esta disponivel */
if (!(strncmp(bl_recv_buffer + 2,"avaiable?",9))) {
bl_start_flag = 1;
udp_bl_timer.start();
udp_bl_timer.reset();
strncpy(bl_send_buffer + 2,"cbxalive\x00",9);
if (debug_bootloader) {
pc.printf("\r\nPACOTE HDR->SRV {");
for (cnt = 0;cnt < UDP_BL_SIZE;cnt++) {
if ((cnt % 30) == 0) {
pc.printf("\r\n ");
pc.printf(hex16(cnt));
pc.printf(" : ");
}
pc.printf(hex8(bl_send_buffer[cnt]));
pc.printf(", ");
}
pc.printf("\r\n}");
}
int udp_bl_client_ret = udp_bl_client.sendTo ( udp_bl_server, bl_send_buffer, strlen ( bl_send_buffer ) );
if ( udp_bl_client_ret not_eq strlen( bl_send_buffer ) )
{
reconnect_bl ();
miss_bl_udp_send_pkg ++;
if ( debug_reconnect ) vz_printf ( "[%d] Reconnect BL - %d", bl_peer, udp_bl_client_ret );
}
}
/* pacote para indicar o termino do processo de atualizacao */
else if (!(strncmp(bl_recv_buffer + 2,"finished",8))) {
bl_start_flag = 0;
if (bl_ts not_eq 0) {
ts->return_timeslice( bl_ts );
bl_ts = 0;
}
if (bl_cb not_eq NULL) {
bl_cb->set_timeslice( 0 );
bl_cb -> cb_set_status( cb_idle );
bl_cb = NULL;
}
}
/* pacotes a serem repassados para o callbox */
else if (bl_start_flag) {
uint16_t bl_cnt = 0;
udp_bl_timer.reset();
/* pacote de ERASE enviado para o cbx */
/* neste momento a cabeceira sabe que o servidor se comunicou com o callbox */
if (!(strncmp(bl_recv_buffer + 2,"\x45",1))) {
bl_cb = find_CB( v_cb, bl_peer );
if (bl_cb not_eq NULL) {
bl_cb->set_timeslice( bl_ts );
bl_cb -> cb_set_status ( cb_bootloader );
}
}
/* pacote de OK enviado para o cbx */
/* neste momento a cabeceira desaloca o timeslice do callbox */
if (!(strncmp(bl_recv_buffer + 2,"\x4f\x00\x00\x00",4))) {
ts->return_timeslice( bl_ts );
bl_ts = 0;
if (bl_cb not_eq NULL) {
bl_cb->set_timeslice( 0 );
}
}
bl_cbx_buffer[0] = bl_ts;
for (bl_cnt = 0; bl_cnt < BL_SIZE; bl_cnt++) {
bl_cbx_buffer[bl_cnt + 1] = bl_recv_buffer[bl_cnt + 2];
}
if (debug_bootloader) {
pc.printf("\r\nPACOTE HDR->CBX {");
for (cnt = 0;cnt < BL_SIZE + 1;cnt++) {
if ((cnt % 30) == 0) {
pc.printf("\r\n ");
pc.printf(hex16(cnt));
pc.printf(" : ");
}
pc.printf(hex8(bl_cbx_buffer[cnt]));
pc.printf(", ");
}
pc.printf("\r\n}");
}
if (bl_cb not_eq NULL) {
bl_port = bl_cb->get_port();
} else {
bl_port = bl_peer;
}
send2callboxes( build_cb_package( bl_peer, bl_port, BOOTLOADER_CBX,bl_cbx_buffer, 0, BL_SIZE + 1, write_buffer) );
}
}
}
}
// verifica o socket do prompt-UDP-ETH
if( FD_ISSET( udp_client.get_fd(), &fdSet ) ) {
char to_prompt_process [ PROMPT_UDP_COMMAND_SIZE ];
for( register int i = 0; i < PROMPT_UDP_COMMAND_SIZE; i++ ) to_prompt_process[ i ] = 0;
int prompt_process_msg_rcv = udp_client.receiveFrom ( udp_server, to_prompt_process, ( PROMPT_UDP_COMMAND_SIZE - 1 ) );
if ( prompt_process_msg_rcv == -1 )
{
if ( debug_reconnect ) vz_printf ("Reconnect Prompt Process");
reconnect_udp_prompt_process ();
miss_prompt_udp_rcv_pkg ++;
}
else if ( prompt_process_msg_rcv > 0 )
{
udp_query = true;
from_eth = true;
prompt_process ( to_prompt_process, prompt_process_msg_rcv );
}
}
// verifica o socket do watchdog
if ( FD_ISSET ( udp_wdt_client.get_fd(), &fdSet ) )
{
const uint16_t WAKE_MSG_SIZE = 768;
static char wake_msg [ WAKE_MSG_SIZE ];
for ( register uint16_t i = 0; i < WAKE_MSG_SIZE; i ++ ) wake_msg [ i ] = 0;
Endpoint udp_wdt_server;
int wake_msg_rcv = udp_wdt_client.receiveFrom ( udp_wdt_server, wake_msg, sizeof ( wake_msg ) );
if ( dmissed_wdt ) vz_debug ("wake_msg_rcv :: %d -- wake_msg :: %s", wake_msg_rcv, wake_msg );
if( wake_msg_rcv == -1 )
{
if( debug_reconnect ) vz_printf ("Reconnect Extern wdt");
reconnect_extern_wdt_socket ();
miss_wdt_send_pkg ++;
}
else if( wake_msg_rcv > 0 )
{
if( !( strncmp( wake_msg, "alive", 5 ) ) ) {
// Just ckeck but not set 'alive?'
// 'alive*' - force wdt tick right now
// Ckecking and set 'alive'
bool question_alive = ( wake_msg[ 5 ] == '?' );
if( wake_msg[ 5 ] == '*' ) wdt.kick();
if ( dmissed_wdt ) if ( wake_msg [ 5 ] == '?' ) vz_debug ("Recebi o alive ???");
build_wdt_string ( wake_msg, WAKE_MSG_SIZE - 1 );
wake_msg[ WAKE_MSG_SIZE - 1 ] = 0;
int send = udp_wdt_client.sendTo ( udp_wdt_server, wake_msg, strlen ( wake_msg ) );
if( send not_eq strlen ( wake_msg ) )
{
if ( debug_reconnect ) vz_debug ("Reconnect Extern wdt (%d, %d)", send, strlen ( wake_msg ) );
reconnect_extern_wdt_socket ();
miss_wdt_send_pkg ++;
}
if ( (
(!question_alive)
&& ( cb_new_counter <= u8_MAX_CB_IN_A_BRANCH )
&& ( ( cb_new_counter >= MIN_CBX_IN_A_BRANCH ) || ( disable_wdt_from_cbx ) )
) )
{
external_wdt = EXTERN_WDT_IDLE;
if ( dmissed_wdt ) vz_debug ("kickando");
}
if ( dmissed_wdt ) vz_debug ("Mandei send = %d[::%s::] to [%s:%i]", send, wake_msg, udp_wdt_server.get_address (), udp_wdt_server.get_port () );
} else if( !( strncmp( wake_msg, "reset", 5 ) ) ) {
external_wdt = 0;
sprintf( wake_msg, "rst:%u:", uptime );
int send = udp_wdt_client.sendTo ( udp_wdt_server, wake_msg, strlen( wake_msg ) );
if( send not_eq strlen( wake_msg ) )
{
if( debug_reconnect ) vz_printf ("Reconnect Extern wdt");
reconnect_extern_wdt_socket ();
miss_wdt_send_pkg ++;
}
}
}
}
if( FD_ISSET( clock_sock.get_fd(), &fdSet ) )
{
update_clock ();
}
}
return ( ret );
}
int show_cb_content ( void )
{
Call_Box * cb = find_CB ( v_cb, print_this_cb );
if ( cb not_eq NULL ) {
cb -> print_yourself ();
} else {
if ( print_values ) {
vz_debug ("Objeto CBx ( %d ) nao encontrado", print_this_cb );
} else {
vz_printf ("Objeto CBx ( %d ) nao encontrado", print_this_cb );
}
}
return ( 0 );
}
int show_cb_content_all ( void )
{
if ( v_cb -> size () == 0 ) {
vz_printf ("known CBx :: 0");
}
for ( register uint8_t i = 0; i < v_cb->size(); i++ )
{
Call_Box * cb = (Call_Box *)v_cb->get_element( i );
if ( cb not_eq NULL ) {
cb -> print_yourself ();
} else {
if ( print_values ) vz_debug ("Objeto CBx ( %d ) nao encontrado", i );
}
}
return ( 0 );
}
int show_rtp ( void )
{
vz_printf (":: RTP :: %u", v_cb->size() );
int ext_list[ u8_MAX_CB_IN_A_BRANCH ];
if( v_cb->size() >= 1 ) {
for( register int i = 0; i < v_cb->size(); i++ )
{
ext_list[ i ] = ( ( Call_Box * )v_cb->get_element( i ) )->get_ext();
}
qsort( ext_list, v_cb->size(), sizeof( int ), ls_comp );
}
for ( register uint8_t i = 0; i < v_cb->size(); i++ )
{
Call_Box * cb = find_CB( v_cb, ext_list[ i ] );
if( cb not_eq NULL )
{
vz_printf ("CBX ( %d, %d ) - SIP ( %d, %d ) - RTP ( %d )",
cb -> get_ext (),
cb -> get_port (),
cb -> get_sip_ext (),
cb -> get_sip_port (),
cb -> get_rtp_port ()
);
}
}
return ( 0 );
}
int
fuck_rtp ( Vector * v_cb )
{
Call_Box * cb = find_CB( v_cb, frtp_target );
if ( cb not_eq NULL ) {
cb -> set_rtp_port ( -1008789032 );
} else {
vz_debug ("frtp fail");
}
return ( 0 );
}
int
show_hex_cb_content ( void )
{
uint8_t * ptr = ( uint8_t * ) find_CB ( v_cb, print_hex_this_cb );
if ( ptr not_eq NULL )
{
vz_printf ( "Values :: %p\r\n", ( void *) ptr );
for ( register int i = 0; i < sizeof( Call_Box ); i++ )
{
if( debug_uart3 ) pc.printf("%x", *ptr++ );
if ( ( i % 32 ) == 0 )
{
if ( i not_eq 0 ) {
if( debug_uart3 ) pc.printf("\n\r> ");
} else {
if( debug_uart3 ) pc.printf(" ");
}
} else {
if( debug_uart3 ) pc.printf(" ");
}
}
if ( debug_uart3 ) pc.printf("\n\r> ");
if ( tcp_session ) {
char aux[ ( sizeof( Call_Box ) * 3 ) + 3 ];
for ( register int i = 0; i < ( sizeof( Call_Box ) * 3 ) + 3 ; i++ ) aux [ i ] = 0;
uint8_t * ptr = ( uint8_t * ) find_CB ( v_cb, print_hex_this_cb );
for ( register int i = 0; i < sizeof( Call_Box ); i++ )
{
char tmp[ 16 ];
sprintf( tmp, "%x ", *ptr++ );
strcat( aux, tmp );
}
strcat( aux, "\n\r\0" );
tcp_client.send_all( ( char *)aux, strlen( (char * )aux ) );
tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) );
}
}
else
{
if ( print_values ) vz_debug ("Objeto CBx ( %d ) nao encontrado", print_this_cb );
}
return ( 0 );
}
int show_hex_cb_content_all ()
{
if ( v_cb -> size () == 0 )
{
vz_printf ("known CBx :: 0");
}
for ( register uint8_t j = 0; j < v_cb->size(); j++ )
{
uint8_t * ptr = ( uint8_t * ) v_cb->get_element( j );
if ( ptr not_eq NULL )
{
vz_printf ("Values :: %p\r\n", ( void *) ptr );
for ( register int i = 0; i < sizeof( Call_Box ); i++ )
{
if( debug_uart3 ) pc.printf("%x", *ptr++ );
if ( ( i % 32 ) == 0 )
{
if( i not_eq 0 ) {
if( debug_uart3 ) pc.printf("\n\r> ");
} else {
if( debug_uart3 ) pc.printf(" ");
}
} else {
if( debug_uart3 ) pc.printf(" ");
}
}
if ( debug_uart3 ) pc.printf("\n\r> ");
if ( tcp_session )
{
char aux[ ( sizeof( Call_Box ) * 3 ) + 3 ];
for ( register int i = 0; i < ( sizeof( Call_Box ) * 3 ) + 3 ; i++ ) aux [ i ] = 0;
uint8_t * ptr = ( uint8_t * ) v_cb->get_element( j );
for ( register int i = 0; i < sizeof( Call_Box ); i++ )
{
char tmp[ 16 ];
sprintf( tmp, "%x ", *ptr++ );
strcat( aux, tmp );
}
strcat( aux, "\n\r\0" );
tcp_client.send_all( ( char *)aux, strlen( (char * )aux ) );
tcp_client.send_all( "\r\n> ", strlen( "\r\n> " ) );
}
} else {
if ( print_values ) {
vz_debug ("Objeto CBx ( %d ) nao encontrado", j );
} else {
vz_printf ("Objeto CBx ( %d ) nao encontrado", j );
}
}
}
return ( 0 );
}
int show_cb_sip ( void )
{
Call_Box * cb = find_CB ( v_cb, print_this_sip );
if ( cb not_eq NULL )
{
if( cb -> sip_print_yourself () == -1 )
{
if( print_values ) {
vz_debug ("Sip param of %d equals NULL", print_this_sip );
} else {
vz_printf ("Sip param of %d equals NULL", print_this_sip );
}
}
} else {
if ( print_values ) {
vz_debug ("Objeto CBx ( %d ) nao encontrado", print_this_cb );
} else {
vz_printf ("Objeto CBx ( %d ) nao encontrado", print_this_cb );
}
}
return ( 0 );
}
int show_cb_sip_all ( void )
{
if ( v_cb -> size () == 0 )
{
vz_printf ("known CBx :: 0");
}
for ( register uint8_t i = 0; i < v_cb->size(); i++ )
{
Call_Box * cb = (Call_Box *)v_cb->get_element( i );
if ( cb not_eq NULL )
{
if ( cb -> sip_print_yourself () == -1 )
{
if ( print_values ) {
vz_debug ("Sip param of %d equals NULL", print_this_sip );
} else {
vz_printf ("Sip param of %d equals NULL", print_this_sip );
}
}
} else {
if( print_values ) {
vz_debug ("CBx %d not found", print_this_sip );
} else {
vz_printf ("CBx %d not found", print_this_sip );
}
}
}
return ( 0 );
}
int show_cb_hex_sip ( void )
{
uint8_t * ptr = NULL;
Call_Box * cb = find_CB ( v_cb, print_hex_this_sip );
if( cb not_eq NULL )
{
ptr = ( uint8_t * ) cb -> get_sip ();
}
if ( ptr not_eq NULL )
{
vz_printf ("Values :: %p\r\n", ( void *) ptr );
for ( register int i = 0; i < sizeof( Sip ); i++ )
{
if( debug_uart3 ) pc.printf("%x", *ptr++ );
if ( ( i % 32 ) == 0 )
{
if( i not_eq 0 ) {
if( debug_uart3 ) pc.printf("\n\r> ");
} else {
if( debug_uart3 ) pc.printf(" ");
}
} else {
if( debug_uart3 ) pc.printf(" ");
}
}
if ( debug_uart3 ) pc.printf("\n\r> ");
if ( tcp_session ) {
char aux[ ( 32 * 3 ) + 5 ];
for ( register int i = 0; i < ( 32 * 3 ) + 5 ; i++ ) aux [ i ] = 0;
ptr = NULL;
print_hex_sip_var = false;
Call_Box * cb = find_CB ( v_cb, print_hex_this_sip );
if( cb not_eq NULL )
{
ptr = ( uint8_t * ) cb -> get_sip ();
}
if ( ptr not_eq NULL )
{
bool finished = false;
volatile int i = 0;
int count = 0;
Timer dont_overwrite_tcp_buffer;
dont_overwrite_tcp_buffer.reset ();
dont_overwrite_tcp_buffer.start ();
while ( !finished )
{
if( dont_overwrite_tcp_buffer.read_ms () >= 500 )
{
dont_overwrite_tcp_buffer.reset();
for ( ; i < sizeof( Sip ); i++ )
{
char tmp[ 16 ];
sprintf( tmp, "%x ", *ptr++ );
strcat( aux, tmp );
count++;
if ( count >= 32 )
{
count = 0;
i++;
break;
}
}
strcat ( aux, "\n\r\0" );
tcp_client.send_all ( ( char *)aux, strlen( (char * )aux ) );
if ( i >= sizeof ( Sip ) ) finished = true;
strcpy ( aux, "\0" );
}
}
dont_overwrite_tcp_buffer.reset();
dont_overwrite_tcp_buffer.stop();
tcp_client.send_all ( "\r\n> ", strlen( "\r\n> " ) );
}
}
}
else
{
if ( print_values ) vz_debug ("Objeto CBx ( %d ) nao encontrado", print_this_cb );
}
return ( 0 );
}
int show_rtp_on_call ( void )
{
vz_printf (":: CAll RTP :: %u", v_call->size() );
for( register uint8_t i = 0; i < v_call->size(); i++ ) {
VZ_call * call = ( VZ_call * )v_call->get_element( i );
if( call not_eq NULL )
{
vz_printf ("CBX ( %d, %d ) - Server ( %d, %d )",
call->get_cb_ext(),
call->get_cb_port(),
call->get_rtp_server_ext(),
call->get_rtp_server_port()
);
}
}
return ( 0 );
}
int show_call ( void )
{
VZ_call * call = find_Call ( v_call, print_this_call );
if ( call not_eq NULL )
{
vz_printf ("Values :: %p\r\n", ( void *) call );
call -> print_yourself ();
}
else
{
if( print_values ) {
vz_debug ("Call %d not found", print_this_call );
} else {
vz_printf ("Call %d not found", print_this_call );
}
}
return ( 0 );
}
int show_hex_call ( void )
{
VZ_call * call = find_Call ( v_call, print_hex_this_call );
uint8_t * ptr = NULL;
if( call not_eq NULL )
{
ptr = ( uint8_t * ) call;
}
if ( ptr not_eq NULL )
{
vz_printf ("Values :: %p\r\n", ( void *) ptr );
for ( register int i = 0; i < sizeof( VZ_call ); i++ )
{
if( debug_uart3 ) pc.printf("%x", *ptr++ );
if ( ( i % 32 ) == 0 )
{
if( i not_eq 0 ) {
if( debug_uart3 ) pc.printf("\n\r> ");
} else {
if( debug_uart3 ) pc.printf(" ");
}
}
else
{
if( debug_uart3 ) pc.printf(" ");
}
}
if ( debug_uart3 ) pc.printf("\n\r> ");
if ( tcp_session ) {
char aux[ ( 32 * 3 ) + 5 ];
for ( register int i = 0; i < ( 32 * 3 ) + 5 ; i++ ) aux [ i ] = 0;
ptr = NULL;
VZ_call * call = find_Call ( v_call, print_hex_this_call );
uint8_t * ptr = NULL;
if( call not_eq NULL )
{
ptr = ( uint8_t * ) call;
}
if ( ptr not_eq NULL )
{
bool finished = false;
volatile int i = 0;
int count = 0;
Timer dont_overwrite_tcp_buffer;
dont_overwrite_tcp_buffer.reset ();
dont_overwrite_tcp_buffer.start ();
while ( !finished )
{
if( dont_overwrite_tcp_buffer.read_ms () >= 20 )
{
dont_overwrite_tcp_buffer.reset();
for ( ; i < sizeof( VZ_call ); i++ )
{
char tmp[ 16 ];
sprintf( tmp, "%x ", *ptr++ );
strcat( aux, tmp );
count++;
if ( count >= 32 )
{
count = 0;
i++;
break;
}
}
strcat ( aux, "\n\r\0" );
tcp_client.send_all ( ( char *)aux, strlen( (char * )aux ) );
if ( i >= sizeof ( VZ_call ) ) finished = true;
strcpy ( aux, "\0" );
}
}
dont_overwrite_tcp_buffer.reset();
dont_overwrite_tcp_buffer.stop();
tcp_client.send_all ( "\r\n> ", strlen( "\r\n> " ) );
}
}
}
else
{
if( print_values )
{
vz_debug ("Call %d not found", print_this_call );
}
else
{
vz_printf ("Call %d not found", print_this_call );
}
}
return ( 0 );
}
int show_cb_rtp ( void )
{
VZ_call * call = find_Call ( v_call, print_hex_this_rtp );
uint8_t * ptr = NULL;
if( call not_eq NULL )
{
ptr = ( uint8_t * ) call -> check_rtp ();
}
if ( ptr not_eq NULL )
{
vz_printf ("Values :: %p\r\n", ( void *) ptr );
for ( register int i = 0; i < sizeof( RTP ); i++ )
{
if( debug_uart3 ) pc.printf("%x", *ptr++ );
if ( ( i % 32 ) == 0 )
{
if( i not_eq 0 )
{
if( debug_uart3 ) pc.printf("\n\r> ");
}
else
{
if( debug_uart3 ) pc.printf(" ");
}
}
else
{
if( debug_uart3 ) pc.printf(" ");
}
}
if ( debug_uart3 ) pc.printf("\n\r> ");
if ( tcp_session ) {
char aux[ ( 32 * 3 ) + 5 ];
for ( register int i = 0; i < ( 32 * 3 ) + 5 ; i++ ) aux [ i ] = 0;
ptr = NULL;
VZ_call * call = find_Call ( v_call, print_hex_this_rtp );
uint8_t * ptr = NULL;
if( call not_eq NULL )
{
ptr = ( uint8_t * ) call -> check_rtp ();
}
if ( ptr not_eq NULL )
{
bool finished = false;
volatile int i = 0;
int count = 0;
Timer dont_overwrite_tcp_buffer;
dont_overwrite_tcp_buffer.reset ();
dont_overwrite_tcp_buffer.start ();
while ( !finished )
{
if( dont_overwrite_tcp_buffer.read_ms () >= 20 )
{
dont_overwrite_tcp_buffer.reset();
for ( ; i < sizeof( RTP ); i++ )
{
char tmp[ 16 ];
sprintf( tmp, "%x ", *ptr++ );
strcat( aux, tmp );
count++;
if ( count >= 32 )
{
count = 0;
i++;
break;
}
}
strcat ( aux, "\n\r\0" );
tcp_client.send_all ( ( char *)aux, strlen( (char * )aux ) );
if ( i >= sizeof ( RTP ) ) finished = true;
strcpy ( aux, "\0" );
}
}
dont_overwrite_tcp_buffer.reset();
dont_overwrite_tcp_buffer.stop();
tcp_client.send_all ( "\r\n> ", strlen( "\r\n> " ) );
}
}
}
else
{
if( print_values )
{
vz_debug ("Call %d not found", print_this_rtp );
}
else
{
vz_printf ("Call %d not found", print_this_rtp );
}
}
return ( 0 );
}
int show_cb_hex_rtp ( void )
{
VZ_call * call = find_Call ( v_call, print_this_rtp );
if ( call not_eq NULL )
{
if ( call -> check_rtp () not_eq NULL )
{
vz_printf ("Values :: %p\r\n", ( void *) call -> check_rtp () );
call -> rtp_print_yourself ();
}
else
{
if( print_values )
{
vz_debug ("Call->RTP %d not found", print_this_rtp );
}
else
{
vz_printf ("Call->RTP %d not found", print_this_rtp );
}
}
}
else
{
if( print_values )
{
vz_debug ("Call->RTP %d not found", print_this_rtp );
}
else
{
vz_printf ("Call->RTP %d not found", print_this_rtp );
}
}
return ( 0 );
}
int reset_stats_cks ( void )
{
pkg_cksok = 0;
pkg_ckserr = 0;
pkg_zero = 0;
out_of_range = 0;
missed_pkg = 0;
delayed_pkg_to_cb = 0;
cpld_pkg_tx_counter = 0;
cpld_pkg_rx_counter = 0;
return ( 0 );
}
int show_cb_stats ( void )
{
vz_printf (
"\r\n"
" PKG_CKS OK: %d ( %003.2f )\r\n"
" PKG_CKS ERR: %d ( %003.2f )\r\n"
" PKG_0: %d ( %003.2f )\r\n"
" Out_of_range: %d ( %003.2f )\r\n"
" Miss_Pkg: %d\r\n"
" TX_delayed: %d\n\r"
" TX_Counter: %d\n\r"
" RX_Counter: %d\r\n",
pkg_cksok, ( cpld_pkg_rx_counter == 0 ) ? 0.00 : ( ( double ) pkg_cksok / cpld_pkg_rx_counter ) * 100,
pkg_ckserr, ( cpld_pkg_rx_counter == 0 ) ? 0.00 : ( ( double ) pkg_ckserr / cpld_pkg_rx_counter ) * 100,
pkg_zero, ( cpld_pkg_rx_counter == 0 ) ? 0.00 : ( ( double ) pkg_zero / cpld_pkg_rx_counter ) * 100,
out_of_range, ( cpld_pkg_rx_counter == 0 ) ? 0.00 : ( ( double ) out_of_range / cpld_pkg_rx_counter ) * 100,
missed_pkg,
delayed_pkg_to_cb,
cpld_pkg_tx_counter,
cpld_pkg_rx_counter
);
return ( 0 );
}
int reset_missed_send_udp ( void )
{
miss_fw_send_pkg = 0;
miss_prompt_udp_send_pkg = 0;
miss_sip_registry_send_pkg = 0;
miss_sip_invite_send_pkg = 0;
miss_sip_bye_send_pkg = 0;
miss_sip_ok_send_pkg = 0;
miss_sip_rcv_bye_send_pkg = 0;
miss_wdt_send_pkg = 0;
miss_prompt_udp_send_pkg = 0;
miss_rtp_udp_send_pkg = 0;
miss_prompt_udp_rcv_pkg = 0;
return ( 0 );
}
int show_missed_send_udp_pkg ( void )
{
vz_printf ( "\r\nMissed pkgs ::\r\n "
"FW: %d\r\n "
"Prompt UDP %d\r\n "
"Registry %d\r\n "
"Invite %d\r\n "
"Bye %d\r\n "
"UDP incoming ( invite ans ) %d\r\n "
"UDP incoming ( bye from * ) %d\r\n "
"Wdt [ alive | rst ] %d\r\n "
"Rcv prompt %d\r\n "
"[ debug | send ]_msg %d\r\n "
"RTP %d\r\n",
miss_fw_send_pkg,
miss_prompt_udp_send_pkg,
miss_sip_registry_send_pkg,
miss_sip_invite_send_pkg,
miss_sip_bye_send_pkg,
miss_sip_ok_send_pkg,
miss_sip_rcv_bye_send_pkg,
miss_wdt_send_pkg,
miss_prompt_udp_send_pkg,
miss_prompt_udp_rcv_pkg,
miss_rtp_udp_send_pkg
);
return ( 0 );
}
int
invite_ack_to_cb_handler ( Vector * v_cb, Vector * v_call )
{
static int retry_invite_pkg = 0;
bool need_retry = false;
Call_Box * cb = NULL;
for ( register uint8_t i = 0; i < v_cb -> size (); i++ )
{
retry_invite_pkg ++;
if ( retry_invite_pkg >= v_cb -> size () ) retry_invite_pkg = 0;
cb = (Call_Box * )v_cb -> get_element ( i );
if ( cb not_eq NULL )
{
switch ( cb -> get_status () )
{
case cb_ringing :
case cb_trying :
case cb_on_call :
need_retry = true;
break;
}
if ( need_retry ) break;
}
}
if ( need_retry )
{
uint16_t ext = cb -> get_ext ();
uint16_t port = cb -> get_port ();
if ( cb -> get_invite_response () == false )
{
buffer [ TIMESLICE_PLACE ] = cb -> get_timeslice ();
do_not_show_this_invite_pkg = true;
send2callboxes ( build_cb_package ( ext, port, INVITE, ( char * )buffer,
cb -> msg_id_update (), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
if ( debug_resend_invite ) vz_debug ("[%d] resend invite OK to Cbx : ( %d, %d )", ext, ext, port );
}
if ( find_Call ( v_call, ext ) == NULL )
{
uint8_t cb_status = cb -> get_status ();
if ( ( ( cb_status == cb_ringing ) or ( cb_status == cb_trying ) ) )
{
char rtp_src_tmp_write_buffer [ CB_BUFFER_SIZE ];
uint8_t rtp_dst_tmp_write_buffer [ CB_BUFFER_SIZE ];
for ( register int i = 0; i < RTP_MSG_SIZE; i++ ) rtp_src_tmp_write_buffer [ i ] = 0x00;
send2callboxes ( build_cb_package ( ext, port, AUDIO,
rtp_src_tmp_write_buffer, AUDIO, RTP_MSG_SIZE, rtp_dst_tmp_write_buffer ) );
} else {
if ( cb -> get_invite_retry_count () == 0 )
{
cb -> set_msg_id ( ( cb->get_msg_id () + 1 ) & ~BIT7 );
for ( register uint8_t i = 0; i < v_call -> size(); i++ )
{
VZ_call * call = ( VZ_call * )v_call -> get_element ( i );
if ( call -> get_cb_ext () == ext )
{
v_call -> remove_element ( i );
if ( call not_eq NULL ) delete( call );
break;
}
}
ts -> return_timeslice ( cb -> call_end () );
if( debug_invite or debug_resend_invite ) vz_debug ( "[%d] No audio pkgs from cbx", ext );
}
}
}
}
return ( 0 );
}
int check_audio_from_ast ( Vector * v_cb, Vector * v_call )
{
for( register uint8_t i = 0; i < v_call->size(); i++ )
{
VZ_call * call = ( VZ_call * ) v_call -> get_element ( i );
if ( call not_eq NULL )
{
int length = 0;
char * tmp = call -> get_eth_message ( &length );
if( tmp not_eq NULL )
{
Call_Box * cb = find_CB ( v_cb, call -> get_cb_ext () );
if( cb not_eq NULL )
{
int cb_port = cb -> get_port ();
if ( drop_rtp_from_ast_pkg )
{
led1 = !led1;
}
else
{
uint8_t * pkg2cb = build_cb_package ( call -> get_cb_ext (), cb_port, AUDIO,
tmp, AUDIO, length, write_buffer );
send2callboxes( pkg2cb );
}
} else if ( debug_main ) vz_debug ("[%d] received missed package -- Type :: %i", ext, type );
}
}
}
return ( 0 );
}
int
wake_up_or_refresh_handler ( Vector * v_cb )
{
int return_value = 0;
if( timer_sync_refresh.read_ms () > 250 * 2 )
{
timer_sync_refresh.reset ();
static uint8_t time_to_mode = TIME_TO_REFRESH;
if ( time_to_mode == TIME_TO_REFRESH )
{
time_to_mode = TIME_TO_WAKE_UP;
if ( !do_not_refresh ) return_value = refresh ( v_cb );
} else {
time_to_mode = TIME_TO_REFRESH;
if ( wake_all and ( v_call -> size() == 0 ) and cm -> get_cbx_wake_mode () ) wake_all_up ( v_cb );
}
}
return ( return_value );
}
int check_sip_messages_from_ast ( Vector * v_cb, Vector * v_call )
{
// check sip messages only for cbx in call ?
int ext_to_be_removed = sip_manager ( v_cb );
if ( ext_to_be_removed > 0 )
{
Call_Box * cb = find_CB ( v_cb, ext_to_be_removed );
if ( cb not_eq NULL )
{
if ( cb -> get_status () == cb_on_call )
{
buffer [ TIMESLICE_PLACE ] = 0;
for ( register uint8_t i = 0; i < v_call -> size(); i++ )
{
VZ_call * call = ( VZ_call * )v_call -> get_element ( i );
if ( call -> get_cb_ext () == ext_to_be_removed )
{
v_call -> remove_element ( i );
delete ( call );
}
}
ts -> return_timeslice ( cb -> call_end ( false ) );
send2callboxes ( build_cb_package ( cb -> get_ext (), cb -> get_port (), CB_BYE,
( char * )buffer, cb -> get_msg_id(), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
if( debug_invite ) vz_debug ("[%d] Received Bye from *", cb -> get_ext () );
}
} else if( debug_main ) vz_debug ("[%d] Missed bye request", ext_to_be_removed );
}
return ( 0 );
}
int check_for_runaways_ts ( Vector * v_cb, Timeslice * ts )
{
if( ( v_call->size() == 0 ) && ( ts->remain_timeslices() not_eq MAX_TIMESLICES ) ) {
bool ts_reset = true;
for( register uint8_t i = 0; i < v_cb->size(); i++ ) {
uint16_t cb_status = ((Call_Box *)v_cb->get_element( i ))->get_status();
uint16_t cb_sip_status = ((Call_Box *)v_cb->get_element( i ))->get_sip_status();
if ((cb_status not_eq cb_idle) and (cb_sip_status not_eq sip_idle)) {
ts_reset = false;
break;
}
}
if( ts_reset && !bl_start_flag )
{
if( debug_invite ) vz_debug ("Resetando TS");
ts->reset();
}
}
return ( 0 );
}
int show_wdt_status ( void )
{
if( eth_status == 0 ) {
vz_printf ( "Wdt last reset: %s - status_eth :: Connected - Extern Wdt idle for :: %3d sec ( %3d ) - Rx from CBx idle for :: %3d sec ( %3d )",
( wdt.WatchdogCausedReset() ) ? "true" : "false",
EXTERN_WDT_IDLE - external_wdt,
EXTERN_WDT_IDLE,
RX_CB_IDLE - pkg_wdt,
RX_CB_IDLE
);
} else {
vz_printf ( "Wdt last reset: %s - status_eth :: Disconnected :: since %3d sec - Extern Wdt idle for :: %3d sec ( %3d ) - Rx from CBx idle for :: %3d sec ( %3d )",
( wdt.WatchdogCausedReset() ) ? "true" : "false",
ETH_CONNECT_TIMEOUT - eth_wdt,
EXTERN_WDT_IDLE - external_wdt,
EXTERN_WDT_IDLE,
RX_CB_IDLE - pkg_wdt,
RX_CB_IDLE
);
}
return ( 0 );
}
int wdt_update ( void )
{
uptime++;
current_time++;
if ( wdt_show ) debug_wdt = true;
if ( external_wdt ) external_wdt--;
if ( pkg_wdt ) pkg_wdt--;
if ( eth_wdt ) eth_wdt--;
if ( eth_wdt && external_wdt && ( pkg_wdt || disable_wdt_from_cbx ) ){
wdt.kick();
return ( 0 );
}
return ( 1 );
}
int check_for_unwanted_rtp_ports ( Vector * v_cb )
{
for ( register uint8_t i = 0; i < v_cb->size(); i++ )
{
Call_Box * cb = (Call_Box *) v_cb->get_element (i);
if ( cb not_eq NULL )
{
if ( ( cb->get_status () == cb_idle ) && ( cb->get_sip_status () == sip_idle ) && ( cb -> is_rtp_timer_timeout () ) )
{
if ( debug_reset_rtp ) vz_debug ( "[%d] rtp reset", cb -> get_ext () );
cb -> cb_set_status( cb_idle );
cb -> set_sip_status ( sip_idle );
cb -> reset_rtp_timer ();
cb -> set_rtp_port ( 0 );
}
}
}
return ( 0 );
}
int process_received_pkg_from_cbx ( void )
{
// short path
if ( buffer_from_cb_ptr [ TYPE_PLACE ] == AUDIO )
{
xmemcpy ( buffer, buffer_from_cb_ptr, CB_BUFFER_SIZE );
status = WAITING;
missed_pkg --;
}
else
// long path
{
xmemcpy ( cb_rx_buffer, buffer_from_cb_ptr, CB_BUFFER_SIZE );
status = WAITING;
missed_pkg --;
xmemcpy ( buffer, cb_rx_buffer, CB_BUFFER_SIZE );
if ( debug_show_rx_cpld )
{
char str [ 256 ];
strcpy ( str, "RX :: \n\r" );
for ( register uint16_t i = 0; i < 32; i++ )
{
char tmp [ 8 ];
sprintf ( tmp, "%02x ", cb_rx_buffer [ i ] );
strcat ( str, tmp );
}
strcat ( str, "\n\r " );
vz_printf ( "%s", str );
}
}
data = parse_vz_pkg ( &ext, &port, &type, buffer );
if ( data not_eq NULL )
{
if ( min_ext == 0 ) min_ext = ext;
if ( ext > max_ext ) max_ext = ext;
if ( ext < min_ext ) min_ext = ext;
if ( debug_fw ) { fw_cbx_pkg ( ext, ( char *)buffer ); }
if ( type == TELEMETRY )
{
telemetry_counter ++;
if ( debug_telemetry ) show_last_rx = true;
}
if( type not_eq AUDIO )
{
if ( debug_cb_rx ) { vz_printf ("[%d %d] -- Type :: %d", ext, port, type ); }
if(
type == TELEMETRY or
type == CB_STATS or
type == FW1 or
type == FW2 or
type == FW3 or
type == FW4 or
type == FW5 or
type == FW6
) type = FW;
if ( debug_sqn ) { vz_printf ("[%d %d] -- Type :: %d -- seq_num :: %u", ext, port, type, cb_tx_buffer [ SEQ_NUM_PLACE ] ); }
Call_Box * cb = find_CB ( v_cb, ext );
if ( cb not_eq NULL )
{
if ( data[ 0 ] bitand BIT7 )
{
if ( type == BOOT )
{
send2callboxes( build_cb_package( ext, port, REGISTRY,
( char * )data, cb->get_msg_id(), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
} else {
if ( debug_main ) vz_debug ("[%d] Received ack pkg with seq_num %d", ext, data[ 0 ] );
switch ( type )
{
case INVITE : {
if ( debug_main or debug_invite ) vz_debug ("[%d] Invite ACK - msg_id %d -- Cbx seqNum %d", ext, cb->get_msg_id(), data[ 0 ] );
break;
}
case CB_BYE : {
if ( debug_main or debug_invite ) vz_debug ("[%d] BYE ACK - msg_id %d", ext, cb->get_msg_id() );
cb -> set_bye_response_ok ();
break;
}
case REGISTRY : {
if ( debug_main or debug_aging ) vz_debug ("[%d] Registry ACK - msg_id %d", ext, cb->get_msg_id() );
break;
}
default : {
if ( debug_main or debug_aging ) vz_debug ("[%d] ACK msg_id :: %d :: type %d", ext, cb->get_msg_id(), type );
}
}
if ( type not_eq REGISTRY and type not_eq CB_BYE and type not_eq INVITE ) type = DO_NOTHING;
if ( type == CB_BYE )
{
VZ_call * call = find_Call ( v_call, ext );
if ( call not_eq NULL )
{
if ( call -> get_elapsed_time () < 120000 )
{
if ( debug_invite ) vz_debug ("[%d] ack bye ignored", ext );
type = DO_NOTHING;
}
}
}
}
}
}
}
} else type = DO_NOTHING;
return 0;
}
Call_Box *
try_add_new_cbx ( Vector * v_cb, const int ext )
{
if ( v_cb not_eq NULL )
{
if ( v_cb -> size () < u8_MAX_CB_IN_A_BRANCH )
{
if ( debug_main ) vz_debug ( "[%d] Adding Cbx", ext );
Call_Box * cb = new Call_Box ( ext, ext );
if ( cb == NULL ) { memory_is_over = true; }
else
{
int pair_ext = ( ( ext % 2 ) == 0 ) ? ext + 1 : ext - 1;
Call_Box * pair_cb = find_CB ( v_cb, pair_ext );
if ( pair_cb not_eq NULL )
{
int pair_ret = cb -> set_pair_cbx ( pair_cb );
if ( pair_ret == 0 ) {
if ( debug_pair ) vz_debug ( "[%d] vinculado com [%d]", ext, pair_ext );
pair_cb -> set_pair_cbx ( cb );
} else if ( pair_ret == -3 ) {
if ( debug_pair ) vz_debug ( "[%d] par sobrescrito com [%d]", ext, pair_ext );
}
} else if ( debug_pair ) vz_debug ( "[%d] Par nao encontrado", ext )
v_cb -> add ( cb );
if ( debug_main ) vz_debug ( "[%d] Added CBx", ext );
return ( cb );
}
}
}
return ( NULL );
}
void update_all_cb_timer ( Vector * v_cb )
{
if ( v_cb == NULL ) return;
for( register uint8_t i = 0; i < v_cb->size(); i++ )
{
Call_Box * cb = ( Call_Box * )v_cb->get_element( i );
if ( cb not_eq NULL ) cb -> update_time ();
}
}
int init_hello ( void )
{
hello_sync.start ();
hello_times = 0;
return ( 0 );
}
void send_hello_to_cbx ( void )
{
if ( hello_times >= 3 ){
hello_sync.stop ();
hello_sync.reset ();
dont_say_hello_again = true;
}
if ( ( !dont_say_hello_again ) && ( hello_sync.read () > 3 ) && ( hello_times < 3 ) )
{
hello_times++;
char cmd_msg [ CB_BUFFER_SIZE ] = "pend\r";
if ( debug_hello ) vz_debug ("Enviando pend_all nro [ %i ]", hello_times );
send2callboxes( build_cb_package( BROADCAST_EXT, BROADCAST_EXT, PROMPT, cmd_msg, ( 0x11 + hello_times ), CB_BUFFER_SIZE - VZ_HEADER_OFFSET, write_buffer ) );
hello_sync.reset ();
}
}
void show_hello_status_function ( void )
{
vz_printf ("hello_sync.read :: %d -- hello_times :: %u", ( int ) hello_sync.read (), hello_times );
}
void show_last_rx_pkg_from_cbx ( void )
{
char str [ 256 ] = "";
for ( register uint16_t i = 0; i < CB_BUFFER_SIZE; i++ )
{
char tmp[ 8 ];
sprintf ( tmp, "%02x", cb_rx_buffer [ i ] );
strcat ( str, tmp );
if ( ( i not_eq 0 ) && !( ( i + 1 ) % 25 ) )
{
vz_printf ( "%s", str );
strcpy ( str, "" );
}
else { strcat ( str, " " ); }
}
vz_printf ( "%s", str );
}
void show_last_tx_pkg_from_cbx ( void )
{
char str [ 256 ] = "";
for ( register uint16_t i = 0; i < CB_BUFFER_SIZE; i++ )
{
char tmp[ 8 ];
sprintf ( tmp, "%02x", cb_tx_buffer [ i ] );
strcat ( str, tmp );
if ( ( i not_eq 0 ) && !( ( i + 1 ) % 25 ) )
{
vz_printf ( "%s", str );
strcpy ( str, "" );
}
else { strcat ( str, " " ); }
}
vz_printf ( "%s", str );
}
/* Funcao para leitura da fonte de alimentacao e aviso ao servidor */
void check_power_source ( void )
{
static uint8_t samples = 0, warn_back = 0, wait_to_warn = 0;
power_source_timer.stop ();
power_source_timer.reset ();
if ( pwr_src_in )
{
if ( samples < 8 ) samples ++;
} else {
if ( samples > 0 ) samples --;
}
if ( wait_to_warn ) wait_to_warn --;
if ( samples >= 8 )
{
power_source_status = 1;
if (!wait_to_warn )
{
wait_to_warn = u8_WAIT_TO_WARN;
warn_back = 1;
int power_source_client_ret = power_source_client.sendTo ( pwr_src_server, "mainpowerisdown", u8_POWER_MSG_LENGTH );
if ( power_source_client_ret not_eq u8_POWER_MSG_LENGTH )
{
reconnect_power_source ();
miss_power_source_send_pkg ++;
if ( debug_reconnect ) vz_debug (
"Reconnect power_source_client_ret [ %d - %d ]",
power_source_client_ret, u8_POWER_MSG_LENGTH
);
}
vz_debug ( "Main power is DOWN!");
} else {
wait_to_warn--;
}
}
if ( ( samples == 0 ) and ( warn_back ) )
{
power_source_status = 0;
warn_back = 0;
wait_to_warn = 0;
int power_source_client_ret = power_source_client.sendTo ( pwr_src_server, "mainpowerisback", u8_POWER_MSG_LENGTH );
if ( power_source_client_ret not_eq u8_POWER_MSG_LENGTH );
{
reconnect_power_source ();
miss_power_source_send_pkg ++;
if ( debug_reconnect ) vz_debug (
"Reconnect power_source_client_ret [ %d - %d ]",
power_source_client_ret, u8_POWER_MSG_LENGTH
);
}
vz_debug ( "Main power is BACK!" );
}
power_source_timer.start ();
}
void update_config_values ( void )
{
if ( cm -> min_ext_was_modified () or cm -> max_ext_was_modified () ) init_ranges ();
if ( cm -> header_ip_was_modified () or
cm -> net_mask_was_modified () or
cm -> gateway_was_modified () )
{
__reconnect ();
}
if ( cm -> header_ip_was_modified () or
cm -> shift_port_was_modified () or
cm -> server_ext_was_modified () or
cm -> server_port_was_modified () or
cm -> server_ip_was_modified ()
)
{
for ( register uint8_t i = 0; i < v_cb -> size (); i++ )
{
Call_Box * cb = ( Call_Box * ) v_cb -> get_element ( i );
if ( cb not_eq NULL ) {
cb -> update ();
}
}
}
if ( cm -> server_ip_was_modified () ) reconnect_power_source ();
if ( cm -> fw_server_ip_was_modified () or cm -> fw_server_port_was_modified () ) {
re_start_fw ();
}
}
char * build_wdt_string ( char * wake_msg, const size_t length )
{
if ( wake_msg == NULL ) return ( NULL );
snprintf ( wake_msg, length,"wdt:%u,%u,%u,%c,%u,%d,%u,%u,%d,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u:",
uptime,
invite_counter,
external_wdt,
( wdt.WatchdogCausedReset() ) ? '1' : '0',
cb_new_counter,
v_cb -> size (),
ts->remain_timeslices(),
sip_socket_send_failure,
v_call -> size (),
pkg_cksok,
pkg_ckserr,
pkg_zero,
out_of_range,
missed_pkg,
delayed_pkg_to_cb,
cpld_pkg_tx_counter,
cpld_pkg_rx_counter,
eth_wdt,
pkg_wdt,
miss_fw_send_pkg,
miss_prompt_udp_send_pkg,
miss_sip_registry_send_pkg,
miss_sip_invite_send_pkg,
miss_sip_bye_send_pkg,
miss_sip_ok_send_pkg,
miss_sip_rcv_bye_send_pkg,
miss_wdt_send_pkg,
miss_rtp_udp_send_pkg,
miss_prompt_udp_rcv_pkg,
miss_clock_send_pkg,
miss_sip_inc_pkg,
miss_power_source_send_pkg,
miss_bl_udp_send_pkg,
miss_rtp_udp_rcv_pkg
);
return ( wake_msg );
}
