Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Revision:
48:195c97f12e8e
Parent:
46:a670f187a704
Child:
50:d9b6577a70f5
--- a/prompt.cpp	Tue Oct 07 18:43:44 2014 +0000
+++ b/prompt.cpp	Mon Oct 20 16:13:10 2014 +0000
@@ -3,6 +3,7 @@
 TCPSocketServer tcp_server;
 TCPSocketConnection tcp_client;
 Timer tcp_timer;
+Timer udp_timer;
 
 UDPSocket udp_server;
 Endpoint udp_client;
@@ -24,6 +25,8 @@
 bool from_eth = false;
 bool udp_request = false;
 bool tcp_session = false;
+bool cb_session = false;
+bool cb_status = false;
 
 uint8_t test_debug = 1;
 #define PVERSION 4          // Sempre atualizar a versao do prompt
@@ -58,7 +61,7 @@
   while (size--) *dest++ = *src++;
 }
 
-int str2uint (char * s, unsigned int * val) {
+int str2uint ( char * s, unsigned int * val ){
   int i = 0;
   unsigned int ret = 0;
   for (;;) {
@@ -213,6 +216,11 @@
         
         debug_buf[ 0 ] = 0;
         bufptr = 0;
+        if( tcp_session ) tcp_client.send_all( "\n\r>" , strlen( "\n\r>" ) );
+        
+        else if( udp_request ){
+            udp_server.sendTo( udp_client, "\n\r>", strlen( "\n\r>" ) );
+        }
     }
     
     if (type == 'c' ){                // close all files
@@ -388,7 +396,7 @@
 }
 
 // main prompt process
-char * prompt_process( char * msg_to_eth ){
+char * prompt_process( char * msg_from_cb ){
     //FIXME dar flush na serial
     volatile char b = 0;
     static uint8_t bufret = 0;
@@ -400,41 +408,43 @@
         flood_timeout.stop();
         flood_timeout.reset();
     }
-    if( tcp_timer.read() > 3 || tcp_session ){
-        wdt.kick();
-        tcp_timer.reset();
-        if( tcp_session ){            
-            tcp_client.set_blocking( false, 1 );
-            int n = tcp_client.receive( buffer, sizeof( buffer ) );
-            if( n > 0 ){
-                wdt.kick();
-                tcp_timer.reset();                    
-                buffer[ n - 2 ] = 0;
-                bufptr = n - 2;
-                if( !( strcmp( buffer, "quit" ) ) ){
-                    if( debug_prompt_eth ) pc.printf( "\n\rquit request\n\r" );
-                    debug_buf = __debug_buf__;
-                    bufptr = last_bufptr;
-                    from_eth = false;
-                    tcp_session = false;
-                    tcp_client.close();
-                    bufret = 0;
-                    return( NULL );
-                }
-                from_eth = true;
-                bufret = 1;
-                //break;
+    if( !tcp_server.accept( tcp_client ) ){
+        //debug_msg("");
+        tcp_session = true;
+        //from_eth = true;
+        last_bufptr = bufptr;
+        buffer[ 0 ] = 0;
+        bufptr = 0;
+        bufret = 0;
+    }
+    wdt.kick(); 
+    if( !( (int)tcp_timer.read_ms() % 100 ) ){
+        tcp_client.set_blocking( false, 1 );
+        int n = tcp_client.receive( buffer, sizeof( buffer ) - 1 );
+        if( n > 0 ){
+            if( ( n > 2 ) && ( buffer[ n - 2 ]  == '\r' ) ) buffer[ n - 2 ] = 0;
+            
+            if( ( n > 1 ) && ( buffer[ n - 1 ]  == '\n' ) ) buffer[ n - 1 ] = 0;
+            
+            if( n == 1 && buffer[ 0 ] == 0x0A ) strcpy( buffer, "\r" );
+            
+            if( buffer[ 0 ] == '\r' || buffer[ 1 ] == '\n' || buffer[ 2 ] == 'r' || buffer[ 2 ] == '\n'   ) strcpy( buffer, "\r" );
+            
+            bufptr = strlen( buffer );
+            debug_buf = buffer;
+            
+            if( !( strcmp( buffer, "quit" ) ) ){
+                tcp_timer.reset();
+                debug_buf = __debug_buf__;
+                bufptr = last_bufptr;
+                from_eth = false;
+                tcp_session = false;
+                tcp_client.close();
+                bufret = 0;
+                return( NULL );
             }
-        }else{ 
-            if( !tcp_server.accept( tcp_client ) ){
-                tcp_session = true;
-                from_eth = true;
-                last_bufptr = bufptr;
-                buffer[ 0 ] = '\0';
-                debug_buf = buffer;
-                bufptr = 0;
-                bufret = 0;
-            }
+            from_eth = true;
+            bufret = 1;
         }
         if( tcp_timer.read() >= TCP_IDLE_MAX_TIME ){
             tcp_timer.reset();
@@ -447,39 +457,53 @@
             tcp_client.close();
             return( NULL );
         }
-    }else if( !tcp_session ){
-        int length;
-        length = udp_server.receiveFrom( udp_client, buffer, __PROMPT_ETH_BUFFER_SIZE__ );
-        if( length > 0){
-            //pc.printf("\n\r%s:%d\n\r", __FILE__, __LINE__ );
-            buffer[ length ] = '\0';
-            buffer[ strlen( buffer ) - 1 ] = '\0';
+    }else{/* if( !tcp_session ){
+        int n = udp_server.receiveFrom( udp_client, buffer, __PROMPT_ETH_BUFFER_SIZE__ - 1 );
+        if( n > 0){
+            if( ( n > 2 ) && ( buffer[ n - 2 ]  == '\r' ) ) buffer[ n - 2 ] = 0;
+                
+            if( ( n > 1 ) && ( buffer[ n - 1 ]  == '\n' ) ) buffer[ n - 1 ] = 0;
+            
+            if( n == 1 && buffer[ 0 ] == 0x0A ){ strcpy( buffer, "\r" ); }
+            
             last_bufptr = bufptr;
             bufptr = strlen( buffer );
             debug_buf = buffer;
             from_eth = true;
             udp_request = true;
             bufret = 1;
-        }else{
-            if ( pc.readable() ){
-                // imput do teclado
-                b = pc.getc();
-                
-                if( b == 0x0D ){ // enter
-                    bufret = 1;
-                }else{
-                    pc.putc( b );
-                    if( b == 0x08 || b == 0x7F ){ // BS | DEL
-                        if( bufptr > 0 ) debug_buf[ --bufptr ] = 0;
-                    }else if( b == 0x09 ){
-                        // ignore tab
-                    }else{  
-                        debug_buf[bufptr] = b;
-                        bufptr++;
+        }else{*/
+            if( !from_eth ){
+                if ( pc.readable() ){
+                    // imput do teclado
+                    b = pc.getc();
+                    
+                    if( b == 0x0D ){ // enter
+                        bufret = 1;
+                    }else{
+                        pc.putc( b );
+                        if( b == 0x08 || b == 0x7F ){ // BS | DEL
+                            if( bufptr > 0 ) debug_buf[ --bufptr ] = 0;
+                        }else if( b == 0x09 ){
+                            // ignore tab
+                        }else{  
+                            debug_buf[bufptr] = b;
+                            bufptr++;
+                        }
                     }
                 }
             }
-        }
+        //}
+    }
+    if( msg_from_cb ){
+        if( tcp_session ){
+            tcp_client.send_all( msg_from_cb, strlen( msg_from_cb ) );
+        }else if( udp_request ){
+            udp_server.sendTo( udp_client, msg_from_cb, strlen( msg_from_cb ) );
+        }    
+        pc.printf( "\n\r%s\n\r", msg_from_cb );
+        return( NULL );
+        // tirar esse return daqui que nao vai precisar mais
     }
         
     // Prompt commands here
@@ -491,9 +515,13 @@
             strcpy( debug_buf, last_debug_buf );
         }
         
+        //tratamento dos enters
         if( !bufptr ){
             miss_match = false;
-        }     
+        }else if( bufptr == 1 ) {
+            if( debug_buf[ 0 ] == 0x0D || debug_buf[ 0 ] == 0x0D ) miss_match = false;
+        }
+        
         if( xstrmatch( (uint8_t*)debug_buf, (uint8_t*) "ifconfig" ) ){
             miss_match = false;
             pc.printf("\n\r");
@@ -513,6 +541,7 @@
                 }
             }
             files('w');
+            __disable_irq();
             NVIC_SystemReset();
         }
 
@@ -528,7 +557,7 @@
         if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "extset ", 7 ) ){
             miss_match = false;
             fip = fopen("/qspi/myext.txt", "w");
-            fprintf(fip, "%i\n\r" , ( debug_buf + 7) );
+            fprintf(fip, "%s\n\r" , ( debug_buf + 7) );
             fclose(fip);
             pc.printf("\n\r");
             files('s');
@@ -608,6 +637,7 @@
                     udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
                 }
             }
+            __disable_irq();
             NVIC_SystemReset();
         }
 
@@ -619,6 +649,11 @@
                 debug_buf[ strlen( debug_buf ) - 1 ] = '\0';
             }
         }
+        
+        if( xstrmatch( (uint8_t*)debug_buf, (uint8_t*) "status" ) ){
+            miss_match = false;
+            cb_status = true;
+        }
 
         if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "flood ",6 ) ){
             if (xmemmatch( (uint8_t*)(debug_buf+6), (uint8_t*) "on",2 ) ){
@@ -645,6 +680,18 @@
                 tflood.stop();
                 flood_timeout.reset();
             }
+            if (xmemmatch( (uint8_t*)(debug_buf+6), (uint8_t*) "disable",3 )) {
+                miss_match = false;
+                // implementar uma logica que recebe start ext e end ext e manda flood off pra eles
+                pc.printf("\n\rFlood OFF\n\r");
+                if( from_eth ){
+                    snprintf( debug_buf, __PROMPT_ETH_BUFFER_SIZE__, "Flood Off\n\r" );
+                    debug_buf[ strlen( debug_buf ) - 1 ] = '\0';
+                }
+                pflood = 0;
+                tflood.stop();
+                flood_timeout.reset();
+            }
         }
         
         if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "debug ",6 )) {
@@ -731,39 +778,92 @@
         }
         
         //promptcb ramal porta comando
-        if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "promptcb ", 9)) {
+        if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "pcb ", 4 )) {
             miss_match = false;
-            static int id_msg = 0x10;
-            uint8_t write_buffer[300];
+            static uint8_t id_msg = 0x10;
+            uint8_t write_buffer[ 300 ];
+            int ext,port;
+            char *split, *ref;
+            
+            ref = debug_buf;
+            debug_buf[ bufptr++ ] = 0x0D;
+            debug_buf[ bufptr++ ] = 0x00;
+            
+            split = strtok( debug_buf + 4, " " );
+            ext = atoi( split );
+            split = strtok( NULL, " " );
+            port = atoi( split );
+            //split = strtok( NULL, " " );
+            split += strlen( split ) + 1;
+            
+            promptcb_last_ext = ext;
+            promptcb_last_port = port;
+            
+            pc.printf("\r\next=%d port=%d\r\ncmd=%s\r\n", ext, port, split );
+            __send_to_cb__( __build_cb_package__( ext, port, __PROMPT__, split, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+            pc.printf("\n\rComando enviado\n\r");
+            
+            for( register int i = 0; i < 32; i++ )
+                pc.printf("%0x ", write_buffer[ i ] );
+            pc.printf("\n\r");
+            
+            debug_buf = ref;
+            bufptr = 0;
+            debug_buf[ 0 ] = 0;
+            
+            /*
+
             unsigned int ext,port;
             int ant1,ant2;
 
-            debug_buf[bufptr++] = 0x0D;
-            debug_buf[bufptr++] = 0x00;
-
-            ant1 = str2uint( (debug_buf+9), &ext);
-            ant2 = str2uint( ((debug_buf+9)+ant1+1), &port);
+            debug_buf[ bufptr++ ] = 0x0D;
+            debug_buf[ bufptr++ ] = 0x00;
+            
+            ant1 = str2uint( ( debug_buf + 4 ), &ext );
+            ant2 = str2uint( ( ( debug_buf + 4 ) + ant1 + 1 ), &port );
 
             promptcb_last_ext = ext;
             promptcb_last_port = port;
-            pc.printf("\r\next=%d port=%d\r\ncmd=%s\r\n",ext, port, debug_buf+9+ant1+2+ant2);
-            promptcb_last_ext = ext;
-            __send_to_cb__( __build_cb_package__( ext, port, __PROMPT__, debug_buf+9+ant1+2+ant2, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+            
+            pc.printf("\r\next=%d port=%d\r\ncmd=%s\r\n", ext, port, debug_buf + 4 + ant1 + 2 + ant2 );
+            __send_to_cb__( __build_cb_package__( ext, port, __PROMPT__, debug_buf + 4 + ant1 + 2 + ant2, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
             pc.printf("\n\rComando enviado\n\r");
+            
+            for( register int i = 0; i < 300; i++ ){
+                pc.printf("%x ", write_buffer[ i ] );
+                if( i % 23 == 0 ) pc.printf("\n\r");
+            }
+            pc.printf("\n\r");
+            */
         }
-        if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "pcb ",4 )) {
+        
+        if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "_pcb",4 )) {
             miss_match = false;
             static int id_msg = 0x30;
-            uint8_t write_buffer[300];
-            debug_buf[bufptr++] = 0x0D;
-            debug_buf[bufptr++] = 0x00;
+            uint8_t write_buffer[ 300 ];
+            debug_buf[ bufptr++ ] = 0x0D;
+            debug_buf[ bufptr++ ] = 0x00;
 
-            pc.printf("\r\next=%d port=%d\r\ncmd=%s\r\n",promptcb_last_ext, promptcb_last_port, debug_buf+4);
+            pc.printf("\r\next=%d port=%d\r\ncmd=%s\r\n",promptcb_last_ext, promptcb_last_port, debug_buf + 4 );
 
-            __send_to_cb__( __build_cb_package__( promptcb_last_ext, promptcb_last_port, __PROMPT__, debug_buf+4, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
+            __send_to_cb__( __build_cb_package__( promptcb_last_ext, promptcb_last_port, __PROMPT__, debug_buf + 4, id_msg++, __CB_BUFFER_SIZE__ - __VZ_HEADER_OFFSET__, write_buffer ) );
             pc.printf("\n\rComando enviado\n\r");
         }
-
+        /*
+        if( xstrmatch( (uint8_t*)debug_buf, (uint8_t*) "flood kill ", 11 ) ){
+            miss_match = false;
+            
+            split = strtok( debug_buf + 11, " " );
+            int ext_init = atoi( split );
+            split = strtok( NULL, " " );
+            int ext_end = atoi( split );
+            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';
+            }
+        }
+        */
         if( xmemmatch( (uint8_t*)debug_buf, (uint8_t*) "cks",3 )) {
             miss_match = false;
             pcks_s = 1;
@@ -875,7 +975,7 @@
                     udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
                 }
             }
-            pc.printf("promptcb ramal porta comando    - envia o <comando> para o cbx <ramal> e <porta> executar\n\r");
+            pc.printf("pcb porta comando               - envia o <comando> para o cbx <ramal> e <porta> executar\n\r");
             if( from_eth ){
                 snprintf( debug_buf,__PROMPT_ETH_BUFFER_SIZE__, "promptcb ramal porta comando    - envia o <comando> para o cbx <ramal> e <porta> executar\n\r" );
                 if( tcp_session ) tcp_client.send_all( debug_buf, strlen( debug_buf ) );
@@ -983,6 +1083,15 @@
                     udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
                 }
             }
+            pc.printf("status                          - lista resumida de cbx registrados na header\n\r");
+            if( from_eth ){
+                snprintf( debug_buf,__PROMPT_ETH_BUFFER_SIZE__, "showcb                          - lista resumida de cbx registrados na header\n\r" );
+                if( tcp_session ) tcp_client.send_all( debug_buf, strlen( debug_buf ) );
+                
+                else if( udp_request ){
+                    udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
+                }
+            }
             pc.printf("cks                             - exibe estatisticas de check sum\n\r");
             if( from_eth ){
                 snprintf( debug_buf,__PROMPT_ETH_BUFFER_SIZE__, "cks                             - exibe estatisticas de check sum\n\r" );
@@ -1063,53 +1172,35 @@
 
                 pc.printf("\n\r calling callbox %s \n\r",debug_buf+7);
             }
-
         }
         */
         
         if( miss_match ){ 
-            pc.printf("\n\r%s: command not found\n\r", debug_buf );
+            pc.printf("\n\r> %s: command not found\n\r", debug_buf );
             if( from_eth ){
-                snprintf( debug_buf, __PROMPT_ETH_BUFFER_SIZE__, "%s: command not found\n", debug_buf );
+                snprintf( debug_buf, __PROMPT_ETH_BUFFER_SIZE__, "> %s: command not found\n ", debug_buf );
                 debug_buf[ strlen( debug_buf ) - 1 ] = '\0';
             }
         }
-        
         else{
-            if( debug_buf[ 0 ] != 0x0D ) strcpy( last_debug_buf, debug_buf );
+            if( ( b != 0x0D ) && ( bufptr != 0 ) ) strcpy( last_debug_buf, debug_buf );
         }
-    }
-    /*
-    if( from_eth ){
-        if( tcp_session ){
-            tcp_client.send_all( debug_buf, strlen( debug_buf ) );
-            tcp_timer.reset();
-            bufret = 0;
-            from_eth = false;
-        }else{
-            msg_to_eth = debug_buf;
-            debug_buf = __debug_buf__;
-            bufptr = last_bufptr;
-            bufret = 0;
-            from_eth = false;
-            
-            if( miss_match ) return( NULL );
-            
-            else return( msg_to_eth );
-        }
-    }*/
-           
+    }      
     if( b == 0x0D || bufret == 1 || bufptr > DEBUGBUFSIZE ){
         bufret = 0;
         if( tcp_session ){
-            strcat( debug_buf, "\n\r> " );
+            if( debug_buf[ strlen( debug_buf ) - 1 ] == '\r' || debug_buf[ strlen( debug_buf ) - 1 ] == '\n' ) strcat( debug_buf, "> " );
+            
+            else strcat( debug_buf, "\n\r> " );
+            
             tcp_client.send_all( debug_buf, strlen( debug_buf ) );
-            tcp_timer.reset();
+            //tcp_timer.reset();
         }else if( udp_request ){
+            if( debug_buf[ strlen( debug_buf ) - 1 ] == '\r' || debug_buf[ strlen( debug_buf ) - 1 ] == '\n' ) strcat( debug_buf, "> " );
+            
+            else strcat( debug_buf, "\n\r> " );
+            
             int sent = udp_server.sendTo( udp_client, debug_buf, strlen( debug_buf ) );
-            debug_buf = __debug_buf__;
-            bufptr = last_bufptr;
-            from_eth = false;
             udp_request = false;
         }else{
             bufptr = 0;
@@ -1117,6 +1208,9 @@
                 debug_buf[i] = 0;
             }
         }
+        from_eth = false;
+        debug_buf = __debug_buf__;
+        bufptr = last_bufptr;
         pc.putc(0x0A);
         pc.putc(0x0D);
         pc.printf("> ");