VZTECH / Mbed 2 deprecated main_src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Files at this revision

API Documentation at this revision

Comitter:
klauss
Date:
Thu Oct 30 19:26:41 2014 +0000
Parent:
66:3f1d22e69e7b
Child:
68:b54993674190
Commit message:
implementacao do protocolo de comunicacao eth->header->cbx_bootloader

Changed in this revision

bootloader_cbx_handler.cpp Show annotated file Show diff for this revision Revisions of this file
bootloader_cbx_handler.h Show annotated file Show diff for this revision Revisions of this file
call_box.cpp Show annotated file Show diff for this revision Revisions of this file
eth.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
prompt.cpp Show annotated file Show diff for this revision Revisions of this file
prompt.h Show annotated file Show diff for this revision Revisions of this file
vz_protocol.cpp Show annotated file Show diff for this revision Revisions of this file
vz_protocol.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bootloader_cbx_handler.cpp	Thu Oct 30 19:26:41 2014 +0000
@@ -0,0 +1,95 @@
+#include "bootloader_cbx_handler.h"
+
+Timer bl_timer;
+bool listen_udp = false;
+char last_client_ip[ 16 ];
+int last_client_port;
+UDPSocket bl_cbx_server;
+Endpoint bl_cbx_client;
+
+int init_bl_handler( void ){
+    bl_timer.stop();
+    bl_timer.reset();
+    bl_timer.start();
+    
+    int bind_ret = bl_cbx_server.bind( UDP_BOOTLOADER_PORT );
+    
+    bl_cbx_server.set_blocking( false, 2 );
+    
+    return( bind_ret );
+}
+
+char * listen_bl_socket( char * buffer, int *length ){
+    *length = bl_cbx_server.receiveFrom( bl_cbx_client, buffer, __CB_BUFFER_SIZE__ );
+    
+    if( *length == -1 ){
+        int ret = bl_cbx_server.bind( UDP_BOOTLOADER_PORT );    
+        
+        if( ret == -1 ){
+            bl_cbx_server.close(); 
+            bl_cbx_server.bind( UDP_BOOTLOADER_PORT );
+            //FIXME colocar alguma variavel de status pra nem mandar msgs eth caso nao tenha conectado
+        }
+    }else if( *length > 0){
+        buffer[ *length ] = '\0';
+        buffer[ strlen( buffer ) - 1 ] = '\0';
+        bl_timer.reset();
+        return( buffer );
+    }    
+    return( NULL );
+}
+
+int bl_handler( void ){
+    int length = 0;
+    char bl_msg[ 320 ];
+    char * bl_data;
+    int bl_ext;
+    int bl_port;
+    static int id_msg = 0x11;
+    
+    if( listen_udp ){
+        listen_bl_socket( bl_msg, &length );
+        if( bl_timer.read() > 60 ){
+            listen_udp = false;
+            bl_timer.reset();    
+        }
+    }else if( bl_timer.read() > 7 && !listen_udp ){
+        listen_bl_socket( bl_msg, &length );
+        if( length > 0 ){ 
+            listen_udp = true;
+            strcpy( last_client_ip, bl_cbx_client.get_address() );
+            last_client_port = bl_cbx_client.get_port();
+        }else bl_timer.reset();
+    }
+    
+    if( length > 0 ){
+        uint8_t bl_msg_to_cbx[ __CB_BUFFER_SIZE__ ];
+        send_msg("Bootloader order received");
+        bl_data = strtok( bl_msg, " " ); 
+        bl_ext = atoi( bl_data );
+        bl_data += strlen( bl_data) + 1;
+        
+        bl_port = convert_ext_to_port( bl_ext );
+        
+        send_msg("Received msg from :: %s:%d to CBx %i", last_client_ip, last_client_port, bl_ext );
+        send_msg("Message received == %s--", bl_data );
+        __send_to_cb__( __build_cb_package__( bl_ext, bl_port, __BOOTLOADER_CBX__, bl_data, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, bl_msg_to_cbx ) );
+        
+        //FIXME talvez nao seja preciso do strcat
+        strcat( bl_data, "\n\r" );
+        int sent = bl_cbx_server.sendTo( bl_cbx_client, bl_data, strlen( bl_data ) );
+        
+        if( dbl ) send_msg("%i bytes de resposta", sent);
+        
+        return( sent );
+    }
+    return( 0 );    
+}
+
+int bl_cbx_reply_to_eth( int ext, char * eth_data ){
+    int sent = bl_cbx_server.sendTo( bl_cbx_client, eth_data, strlen( eth_data ) );
+        
+    if( dbl ) send_msg( "%i bytes de resposta", sent );
+    
+    return( sent );
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bootloader_cbx_handler.h	Thu Oct 30 19:26:41 2014 +0000
@@ -0,0 +1,184 @@
+#ifndef __BOOTLOADER_CBX_HANDLER_H__
+#define __BOOTLOADER_CBX_HANDLER_H__
+
+#include "prompt.h"
+#include "debug.h"
+#include "vz_protocol.h"
+
+#define udp_idle 0x00
+#define udp_waiting_start_pkg 0x01
+#define udp_listen 0x02
+
+extern bool listen_udp;
+extern Timer bl_timer;
+extern UDPSocket bl_cbx_server;
+extern Endpoint bl_cbx_client;
+
+extern char last_client_ip[ 16 ];
+extern int last_client_port;
+
+int init_bl_handler( void );
+char * listen_bl_socket( char * buffer, int *length );
+int bl_handler( void );
+int bl_cbx_reply_to_eth( int ext, char * data );
+
+/*
+int is_start_pkg( uint8_t * data ){
+    //seq_num must to be 0s
+    if( !data ) return -1; 
+    
+    for( register int i = __VZ_HEADER_OFFSET__; i < __PROMPT_ETH_BUFFER_SIZE__; i++ ) if( data[ i ] ) return( 0 );
+    
+    return( 1 );
+}
+
+int is_stop_pkg( uint8_t * data ){
+    //seq_num must to be 0s
+    if( !data ) return -1; 
+    
+    for( register int i = __VZ_HEADER_OFFSET__; i < __PROMPT_ETH_BUFFER_SIZE__; i++ ) if( data[ i ] ) return( 0 );
+    
+    return( 1 );
+}
+
+int is_time_to_stop( uint8_t * data ){
+    static int count = 0;
+    if( !data ) return( 0 );
+    
+    if( is_stop_pkg( data ) == 1 ) count++;
+    
+    else count = 0;
+    
+    if( count == 10 ) return( 1 );
+    
+    else return( 0 );
+}
+
+*/
+
+
+/*
+char * listen_bl_socket( char * buffer, int *length ){
+    static UDPSocket server;
+    server.set_blocking( false, 2 );
+    server.bind( UDP_BOOTLOADER_PORT );
+    Endpoint client;
+    //bool valid_reboot = false;
+    uint8_t * data = NULL;
+    static int bl_ext;
+    static int bl_port;
+    //static uint8_t type;
+    static Timer t;
+    //static uint8_t status = udp_idle;
+    //static uint8_t seq_num = 0;
+    //OBS sizeof( buffer ) == 4 ????
+    //length = server.receiveFrom( client, buffer, sizeof( buffer ) );
+    *length = server.receiveFrom( client, buffer, __PROMPT_ETH_BUFFER_SIZE__ );
+    
+    if( *length == -1 ){
+        int ret = server.bind( UDP_BOOTLOADER_PORT );    
+        
+        if( ret == -1 ){
+            server.close(); 
+            server.bind( UDP_BOOTLOADER_PORT );
+        }
+    }
+    
+    if( *length > 0){
+        buffer[ *length ] = '\0';
+        buffer[ strlen( buffer ) - 1 ] = '\0';
+        t.start();
+        bl_timer.reset();
+        
+        return( NULL );
+    }
+        
+        //data = __parse_vz_pkg__( &bl_ext, &bl_port, __BOOT_LOADER__, (uint8_t *)buffer );
+        
+        if( !data ){
+            debug_msg("UDP pks parse failed");
+            server.sendTo( client, buffer, sizeof( buffer ) );
+            return( NULL );
+        }
+        */
+        
+        /*
+        if( status == udp_idle ){ 
+            data[ 0 ] |= BIT7;
+            strcpy( (char *)&data[ 1 ], "Received listen request" );
+            server.sendTo( client, buffer, sizeof( buffer ) );
+            status = udp_waiting_start_pkg;
+        }
+        */
+        
+        /*
+        if( status == udp_waiting_start_pkg ){
+            static int count = 0;
+            if( is_start_pkg( data ) == 1 ) 
+                if( count++ == __START_PKG_COUNT__ ) status = udp_listen;
+            
+            else{ 
+                count = 0;
+                status = udp_idle;
+            }
+        }
+        */
+        /*      
+        if( status == udp_listen ){
+            debug_msg( "Received start pkgs" ); // mandar msg pro server
+            if( t.read() < 60 ){
+                server.set_blocking( true, 10 );
+                t.reset();
+                do{
+                    wdt.kick();
+                    *length = server.receiveFrom( client, buffer, sizeof( buffer ) );
+                    //data = __parse_vz_pkg__( &bl_ext, &_blport, &type, (uint8_t *)buffer );
+                    if( data ){
+                        if( !( is_start_pkg( data ) ) ) break;
+                    }else{
+                        debug_msg("UDP pks parse failed");
+                        // reenvia pkg dizendo que podemos comecar com a transacao de dados
+                    }
+                }while( t.read() < 60 );
+                
+                if( t.read() < 60 ){
+                    //tratar o primeiro pkg depois dos zeros aqui
+                    //a ideia é ir recebendo e colocando no arquivo "se for pra header" ou mandar
+                    //pro cb depois,
+                    if( !( ext || port ) ){ // pkg pra header
+                        debug_msg("criando arquivo");
+                    }else{
+                        debug_msg("Mandando pkg pro cb");
+                    }
+                    //FIXME mudar essa condicao de parada
+                    while( !( is_time_to_stop( data ) == 1 ) ){
+                        wdt.kick();
+                        *length = server.receiveFrom( client, buffer, sizeof( buffer ) );
+                        if( ( data[ 0 ] - seq_num ) != 1 ){
+                            //perdi algum pacote    
+                            //solicitar re-envio mandando o ultimo seq_num recebido talvez ...
+                            continue;
+                        }else{
+                            debug_msg("+(%d,%d)-%s+", ext, port, data );
+                        }
+                    }
+                    //pensar em como validar os pacotes recebidos, cks ... e o que mais ?
+                    //se validado os pkgs, dar reset com os dados no arquivo bla, caso contrario, ignorar ...
+                    //if( valid_reboot ) NVIC_SystemReset();
+                    
+                    //else{
+                    //    server.set_blocking( false, 1 );
+                    //    t.stop();
+                    //    t.reset();
+                    //    debug_msg("Nao Resetando ... ");
+                    //}
+                    
+                }
+            }
+        }else return( buffer );
+    *length = 0;
+    return( NULL );
+    //return( NULL );
+}
+*/  
+#endif
\ No newline at end of file
--- a/call_box.cpp	Tue Oct 28 18:35:48 2014 +0000
+++ b/call_box.cpp	Thu Oct 30 19:26:41 2014 +0000
@@ -40,8 +40,7 @@
     //static int count = 1;
     //if( timeout != __MAX_TIMEOUT__ ) timeout = __STEP__  * count++;
     t.reset();
-    //return( remaining_attempts-- );
-    return( 1 );
+    return( remaining_attempts-- );
 }
 
 void Call_Box::registry( void ){
--- a/eth.h	Tue Oct 28 18:35:48 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-#ifndef __ETH_H__
-#define __ETH_H__
-
-#include "prompt.h"
-#include "debug.h"
-#include "vz_protocol.h"
-
-#define udp_idle 0x00
-#define udp_waiting_start_pkg 0x01
-#define udp_listen 0x02
-
-int is_start_pkg( uint8_t * data ){
-    //seq_num must to be 0s
-    if( !data ) return -1; 
-    
-    for( register int i = __VZ_HEADER_OFFSET__; i < __PROMPT_ETH_BUFFER_SIZE__; i++ ) if( data[ i ] ) return( 0 );
-    
-    return( 1 );
-}
-
-int is_stop_pkg( uint8_t * data ){
-    //seq_num must to be 0s
-    if( !data ) return -1; 
-    
-    for( register int i = __VZ_HEADER_OFFSET__; i < __PROMPT_ETH_BUFFER_SIZE__; i++ ) if( data[ i ] ) return( 0 );
-    
-    return( 1 );
-}
-
-int is_time_to_stop( uint8_t * data ){
-    static int count = 0;
-    if( !data ) return( 0 );
-    
-    if( is_stop_pkg( data ) == 1 ) count++;
-    
-    else count = 0;
-    
-    if( count == 10 ) return( 1 );
-    
-    else return( 0 );
-}
-
-char * listen_eth_udp( char * buffer, int *length ){
-    /*
-    static UDPSocket server;
-    server.set_blocking( false, 2 );
-    server.bind( UDP_PORT_LISTENER );
-    Endpoint client;
-    bool valid_reboot = false;
-    uint8_t * data = NULL;
-    static int ext;
-    static int port;
-    static uint8_t type;
-    static Timer t;
-    static uint8_t status = udp_idle;
-    static uint8_t seq_num = 0;
-    // OBS sizeof( buffer ) == 4 ????
-    
-    //length = server.receiveFrom( client, buffer, sizeof( buffer ) );
-    *length = server.receiveFrom( client, buffer, __PROMPT_ETH_BUFFER_SIZE__ );
-    
-    if( *length > 0){
-        buffer[ *length ] = '\0';
-        buffer[ strlen( buffer ) - 1 ] = '\0';
-        t.start();
-        
-        debug_msg("%s", buffer );
-        buffer = prompt_process( buffer );
-        
-        if( buffer ){
-            debug_msg("--%s--", buffer );
-            int sent = server.sendTo( client, buffer, strlen( buffer ) );
-            debug_msg("Sent %d", sent );
-        }
-        
-        return( NULL );
-        
-        data = __parse_vz_pkg__( &ext, &port, &type, (uint8_t *)buffer );
-        
-        if( !data ){
-            debug_msg("UDP pks parse failed");
-            server.sendTo( client, buffer, sizeof( buffer ) );
-            return( NULL );
-        }
-        
-        if( status == udp_idle ){ 
-            data[ 0 ] |= BIT7;
-            strcpy( (char *)&data[ 1 ], "Received listen request" );
-            server.sendTo( client, buffer, sizeof( buffer ) );
-            status = udp_waiting_start_pkg;
-        }
-        
-        if( status == udp_waiting_start_pkg ){
-            static int count = 0;
-            if( is_start_pkg( data ) == 1 ) 
-                if( count++ == __START_PKG_COUNT__ ) status = udp_listen;
-            
-            else{ 
-                count = 0;
-                status = udp_idle;
-            }
-        }
-                
-        if( status == udp_listen ){
-            debug_msg( "Received start pkgs" ); // mandar msg pro server
-            if( t.read() < 60 ){
-                server.set_blocking( true, 10 );
-                t.reset();
-                do{
-                    wdt.kick();
-                    *length = server.receiveFrom( client, buffer, sizeof( buffer ) );
-                    data = __parse_vz_pkg__( &ext, &port, &type, (uint8_t *)buffer );
-                    if( data ){
-                        if( !( is_start_pkg( data ) ) ) break;
-                    }else{
-                        debug_msg("UDP pks parse failed");
-                        // reenvia pkg dizendo que podemos comecar com a transacao de dados
-                    }
-                }while( t.read() < 60 );
-                
-                if( t.read() < 60 ){
-                    //tratar o primeiro pkg depois dos zeros aqui
-                    //a ideia é ir recebendo e colocando no arquivo "se for pra header" ou mandar
-                    //pro cb depois,
-                    if( !( ext || port ) ){ // pkg pra header
-                        debug_msg("criando arquivo");
-                    }else{
-                        debug_msg("Mandando pkg pro cb");
-                    }
-                    //FIXME mudar essa condicao de parada
-                    while( !( is_time_to_stop( data ) == 1 ) ){
-                        wdt.kick();
-                        *length = server.receiveFrom( client, buffer, sizeof( buffer ) );
-                        if( ( data[ 0 ] - seq_num ) != 1 ){
-                            //perdi algum pacote    
-                            //solicitar re-envio mandando o ultimo seq_num recebido talvez ...
-                            continue;
-                        }else{
-                            debug_msg("+(%d,%d)-%s+", ext, port, data );
-                        }
-                    }
-                    //pensar em como validar os pacotes recebidos, cks ... e o que mais ?
-                    //se validado os pkgs, dar reset com os dados no arquivo bla, caso contrario, ignorar ...
-                    if( valid_reboot ) NVIC_SystemReset();
-                    
-                    else{
-                        server.set_blocking( false, 1 );
-                        t.stop();
-                        t.reset();
-                        debug_msg("Nao Resetando ... ");
-                    }
-                }
-            }
-        }else return( buffer );
-    }else return( NULL );
-    return( NULL );
-    */
-    return( NULL );
-}
-    
-#endif
\ No newline at end of file
--- a/main.cpp	Tue Oct 28 18:35:48 2014 +0000
+++ b/main.cpp	Thu Oct 30 19:26:41 2014 +0000
@@ -7,7 +7,7 @@
 #include "debug.h"
 #include "utils.h"
 #include "flood.h"
-#include "eth.h"
+#include "bootloader_cbx_handler.h"
 
 volatile uint8_t status = 0x00;
 
@@ -30,7 +30,7 @@
     }
     Timer t;
     t.start();
-    Timer udp_timer;
+    //Timer udp_timer;
           
     /* representa ramal do call box */
     int ext = 0;
@@ -97,8 +97,12 @@
     send_msg("Ready");
     uint8_t before = t.read();
     static uint8_t count = 0;
+    int bl_ret = init_bl_handler();
+    if( dbl ) send_msg("Valor de retorno do bl_habdler = %d", bl_ret );
+    
+    /*------------------------------------------------ main loop -------------------------------------------------------------------------*/
     while( true ){
-        //FIXME colocar uma condicao aqui
+        //FIXME colocar uma condicao aqui caso necessario pra nao comprometer ligacoes ...
         prompt_process( NULL );
         wdt.kick();
         
@@ -139,13 +143,14 @@
             cb_bye_counter = 0; 
             prompt_counter = 0; 
             flood_counter = 0; 
+            bootloader_cbx_counter = 0;
             r_stats = false;
             stats = true;
         }
         if( stats ){
             char str[ 200 ];
-            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", 
-                boot_counter, registry_counter, invite_counter, audio_counter, telemetry_counter, cb_bye_counter, prompt_counter, flood_counter );
+            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", 
+                boot_counter, registry_counter, invite_counter, audio_counter, telemetry_counter, cb_bye_counter, prompt_counter, flood_counter, bootloader_cbx_counter );
             send_msg( str );
             stats =false;
         }
@@ -489,6 +494,11 @@
                     build_telemetry_report( ext, port, ( char *)data );
                 }break;
                 
+            case __BOOTLOADER_CBX__ : {
+                bootloader_cbx_counter++;
+                int ret = bl_cbx_reply_to_eth( ext, ( char * )data );
+                }break;
+                
             case __PROMPT__ : {
                 prompt_counter++;
                 send_msg( "Prompt pkg from ( %i, %i ) ::", ext, port );
@@ -586,24 +596,9 @@
         }else{
             if (flag == 1) { flag = 0; }
         }
+                
+        bl_handler();
         
-        /*
-        int length;    
-        if( udp_timer.read() > 1 && !listen_udp ){
-            data = (uint8_t *)listen_eth_udp( (char *)buffer, &length );
-            if( length ){ 
-                listen_udp = true;
-                debug_msg("");
-            }else udp_timer.reset();
-        }
-        if( listen_udp ){
-            data = (uint8_t *)listen_eth_udp( (char *)buffer, &length );
-            if( udp_timer.read() > 30 ){
-                listen_udp = false;
-                udp_timer.reset();    
-            }
-        }
-        */
         type = __DO_NOTHING__;
     }
 }
\ No newline at end of file
--- a/prompt.cpp	Tue Oct 28 18:35:48 2014 +0000
+++ b/prompt.cpp	Thu Oct 30 19:26:41 2014 +0000
@@ -23,6 +23,7 @@
 uint8_t debug_eth_tx = 0;
 uint8_t debug_prompt_eth = 0;
 uint8_t debug_file = 0;
+bool dbl = false;
 bool from_eth = false;
 bool udp_request = false;
 bool tcp_session = false;
@@ -47,6 +48,7 @@
 uint16_t cb_bye_counter = 0; 
 uint16_t prompt_counter = 0; 
 uint16_t flood_counter = 0; 
+uint16_t bootloader_cbx_counter = 0;
 
 uint8_t test_debug = 1;
 #define PVERSION 5          // Sempre atualizar a versao do prompt
@@ -283,8 +285,10 @@
         cat("/qspi/telemetry_port.txt");
         
         strcpy( last_cmd, tmp_cmd );
-        debug_buf[ 0 ] = 0;
+        //debug_buf[ 0 ] = 0;
+        //bufptr = 0;
         bufptr = 0;
+        for( uint8_t i = 0; i < DEBUGBUFSIZE; i++ ) debug_buf[ i ] = 0;
         if( tcp_session ) tcp_client.send_all( "\n\r> " , strlen( "\n\r> " ) );
         
         else if( udp_request ){
@@ -383,8 +387,10 @@
                 debug_buf[ strlen( debug_buf ) - 1 ] = '\0';
                 if( tcp_session ){
                     tcp_client.send_all( debug_buf, strlen( debug_buf ) );
-                    debug_buf[ 0 ] = 0;
+                    //debug_buf[ 0 ] = 0;
+                    //bufptr = 0;
                     bufptr = 0;
+                    for( uint8_t i = 0; i < DEBUGBUFSIZE; i++ ) debug_buf[ i ] = 0;
                 }
             }
         }
@@ -444,8 +450,10 @@
             }else if( udp_request ){
                 udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
             }
-            debug_buf[ 0 ] = 0;
+            //debug_buf[ 0 ] = 0;
+            //bufptr = 0;
             bufptr = 0;
+            for( uint8_t i = 0; i < DEBUGBUFSIZE; i++ ) debug_buf[ i ] = 0;
         } 
     }
     
@@ -493,8 +501,10 @@
             }else if( udp_request ){
                 udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
             }
-            debug_buf[ 0 ] = 0;
+            //debug_buf[ 0 ] = 0;
+            //bufptr = 0;
             bufptr = 0;
+            for( uint8_t i = 0; i < DEBUGBUFSIZE; i++ ) debug_buf[ i ] = 0;
         } 
     }
 }
@@ -853,7 +863,7 @@
             pc.printf("\n\r MUUUUUUUuuuuUUUUUU - I'm not a dog!!!! \n\r");
             if( from_eth ){
                 snprintf( debug_buf, __PROMPT_ETH_BUFFER_SIZE__, "MUUUUUUUuuuuUUUUUU - I'm not a dog!!!!\n\r");
-                debug_buf[ strlen( debug_buf ) - 1 ] = '\0';
+                //debug_buf[ strlen( debug_buf ) - 1 ] = '\0';
             }
         }
         
@@ -1127,8 +1137,10 @@
             }
             
             debug_buf = ref;
+            //bufptr = 0;
+            //debug_buf[ 0 ] = 0;
             bufptr = 0;
-            debug_buf[ 0 ] = 0;
+            for( uint8_t i = 0; i < DEBUGBUFSIZE; i++ ) debug_buf[ i ] = 0;
         }
         
         else if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "_pcb",4 )) {
@@ -1526,17 +1538,13 @@
             miss_match = false;
             int ext,port;
             char cmd[ 16 ];
-            strcpy( cmd, "call init " );
             
             ext = atoi( debug_buf + 7 );
             port = convert_ext_to_port( ext );
             
-            if( ext % 2 ){
-                ext--;
-                strcat( cmd, "B\r\r" );
-            }else{
-                strcat( cmd, "A\r\r" );
-            }
+            strcpy( cmd, ( ext % 2 ) ? "call init B" : "call init A" );
+            
+            if( ext % 2 ) ext--;
             
             promptcb_last_ext = ext;
             promptcb_last_port = port;
@@ -1547,7 +1555,18 @@
             strcpy( promptcb_last_cmd, cmd );
             
             pc.printf("\r\next=%d port=%d\r\ncmd=%s\r\n", ext, port, cmd );
+            
+            pc.printf("\n\r--------------------------------------------------------\n\r");
+            for( uint16_t i = 0; i < strlen( cmd ) ; i++ ) pc.printf( "%02x ", cmd[ i ] );
+            
             __send_to_cb__( __build_cb_package__( ext, port, __PROMPT__, cmd, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+            pc.printf("\n\r--------------------------------------------------------\n\r");
+            for( uint16_t i = 0; i < 300 ; i++ ){
+                pc.printf( "%02x ", write_buffer[ i ] );
+                if( i != 0 && !( ( i + 1 ) % 30 ) ) pc.printf("\n\r");
+            }            
+                
+            
             pc.printf("\n\rComando enviado\n\r");
             
             if( from_eth ){
@@ -1561,7 +1580,7 @@
             }
             
             bufptr = 0;
-            debug_buf[ 0 ] = 0;
+            for( uint8_t i = 0; i < DEBUGBUFSIZE; i++ ) debug_buf[ i ] = 0;
         }
         
         if( miss_match ){ 
--- a/prompt.h	Tue Oct 28 18:35:48 2014 +0000
+++ b/prompt.h	Thu Oct 30 19:26:41 2014 +0000
@@ -24,6 +24,7 @@
 extern uint8_t debug_eth_tx;
 extern uint8_t debug_prompt_eth;
 extern uint8_t debug_file;
+extern bool dbl;
     
 extern uint8_t test_debug;
 
@@ -95,7 +96,10 @@
 extern uint16_t telemetry_counter; 
 extern uint16_t cb_bye_counter; 
 extern uint16_t prompt_counter; 
-extern uint16_t flood_counter; 
+extern uint16_t flood_counter;
+extern uint16_t bootloader_cbx_counter;
+
+extern Timer udp_timer;
 
 int convert_ext_to_port( int );
 
--- a/vz_protocol.cpp	Tue Oct 28 18:35:48 2014 +0000
+++ b/vz_protocol.cpp	Thu Oct 30 19:26:41 2014 +0000
@@ -156,22 +156,25 @@
         //__print_clock__( pkg + 8 );
         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
         fill = __TIMESLICE_PLACE__ + 1;
-    }
-    
-    if( type == __PROMPT__ ){
+    }else if( type == __PROMPT__ ){
         //__print_clock__( pkg + 8 );
         xmemcpy((pkg+7), (uint8_t*)cb_buffer, 293);
+        //FIXME isso forca qualquer cmd ter < 100 chars
         fill = 100;
-    }
-    
-    else if( type == __TELEMETRY__ ){
+    }else if( type == __TELEMETRY__ ){
         pkg[ 7 ] = seq_num;
         //__print_clock__( pkg + 8 );
         pkg[ __TIMESLICE_PLACE__ ] = cb_buffer[ __TIMESLICE_PLACE__ ];
         fill = __TIMESLICE_PLACE__ + 1;
+    }else if( type == __BOOTLOADER_CBX__ ){
+        pkg[ 7 ] = seq_num;
+        //__print_clock__( pkg + 8 );
+        fill = __VZ_HEADER_OFFSET__ + __CLOCK_SYNC_SIZE__ + __SEQ_NUM_SIZE__;
+    }else{
+        fill = __VZ_HEADER_OFFSET__;
     }
     
-    for( register int i = fill; i < __CB_BUFFER_SIZE__; i++ ) pkg[ i ] = 0x00;
+    for( register uint16_t i = fill; i < __CB_BUFFER_SIZE__; i++ ) pkg[ i ] = 0x00;
     
     uint16_t cc = __checksum__( pkg, 300 );
     pkg[ 4 ] =( uint8_t )( ( cc & 0xFF00 ) >> 8) ;
--- a/vz_protocol.h	Tue Oct 28 18:35:48 2014 +0000
+++ b/vz_protocol.h	Thu Oct 30 19:26:41 2014 +0000
@@ -10,9 +10,12 @@
 // 7 + 14 + 1 == ts
 
 #define __START_PKG_COUNT__ 100
+
 #define UDP_PORT_LISTENER 11406
 #define TCP_PORT_LISTENER 7879
 
+#define UDP_BOOTLOADER_PORT 9891
+
 #define __VZ_HEADER_OFFSET__ 7
 #define __CB_BUFFER_SIZE__ 300
 #define __PROMPT_ETH_BUFFER_SIZE__ 1024
@@ -26,7 +29,8 @@
 #define __UDP_PORT__ 7890 /* numeros arbitrarios ... */
 #define __TCP_PORT__ 8709
     
-#define __TELEMETRY_SERVER_IP__ "192.168.120.163"
+//#define __TELEMETRY_SERVER_IP__ "192.168.120.163"
+#define __TELEMETRY_SERVER_IP__ "192.168.120.144"
 #define __TELEMETRY_SERVER_PORT__ 9192
 #define __TELEMETRY_HEADER_PORT__ 9321
 
@@ -40,6 +44,7 @@
 #define __INVITE__ 0x04
 #define __AUDIO__ 0x08
 #define __TELEMETRY__ 0x10
+#define __BOOTLOADER_CBX__ 0x12
 #define __CB_BYE__ 0x20
 #define __PROMPT__ 0x01
 #define __FLOOD__ 0x40