Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: prompt.cpp
- 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("> ");