// Function used to print a string in the terminal by other tasks
void echo (char *string, char Terminalbackup)
{
    INT8U backup_cnt = 0;
    INT8U i = 0;
    char backup[(CONSOLE_BUFFER_SIZE/2)];
	char *command_start = "echo ";
    char *command_end   = "\n\r";

    if (Terminalbackup == TRUE)
    {
    	backup_cnt = TerminalBackup(&backup[0]);
    }

    SetSilentMode(TRUE);
    while (*command_start)
    {
			if (OSQueuePost(USB, *command_start++) == BUFFER_UNDERRUN)
			{
			  // Problema: Estouro de buffer
			  OSCleanQueue(USB);
			}
    }

	while (*string)
    {
			if (OSQueuePost(USB, *string++) == BUFFER_UNDERRUN)
			{
			  // Problema: Estouro de buffer
			  OSCleanQueue(USB);
			}
    }

    while (*command_end)
    {
			if (OSQueuePost(USB, *command_end++) == BUFFER_UNDERRUN)
			{
			  // Problema: Estouro de buffer
			  OSCleanQueue(USB);
			}
    }

    if (Terminalbackup == TRUE)
    {
		for(i=0;i<backup_cnt;i++)
		{
			if (OSQueuePost(USB, backup[i]) == BUFFER_UNDERRUN)
			{
			  // Problema: Estouro de buffer
			  OSCleanQueue(USB);
			}
		}
    }
}
/*****************************************************************************
* Name:
*    terminal_proces
* In:
*    N/A
*
* Out:
*    N/A
*
* Description:
*    Main loop of terminal application. gathers input, and executes commands.
*
* Assumptions:
*    --
*****************************************************************************/
void usb_terminal_process(void)
{
    INT8U data;
    char c;

    while(1)
    {
        (void)OSQueuePend(USB, &data, 0);
        c=(char)data;

        if ((c != '\n') && (c != '\r'))
        {
            if (c != 0x7F)
            {
                if (SilentMode == FALSE)
                {
                    while(c!=(char)(*putch)(c)) {};
                }
            } else
            {
                if (usb_cmd_line_ndx)
                {
                    while(c!=(char)(*putch)(c)) {};
                }
            }
        }

        /* Execute command if enter is received, or usb_cmd_line is full. */
        if ((c=='\r') || (usb_cmd_line_ndx == sizeof(usb_cmd_line)-2))
        {
            int usb_start = usb_skipp_space(usb_cmd_line, 0);
            int usb_end = usb_find_word(usb_cmd_line, usb_start);
            int usb_x;

            /* Separate command string from parameters, and close
               parameters string. */
            usb_cmd_line[usb_end]=usb_cmd_line[usb_cmd_line_ndx]='\0';

            /* Identify command. */
            usb_x=usb_find_command(usb_cmd_line+usb_start);

            /* Command not found. */
            if (usb_x == -1)
            {
                print_usb("\r\nUnknown command!\r\n");
            }
            else
            {
                (*usb_cmds[usb_x]->func)(usb_cmd_line+usb_end+1);
            }
            usb_cmd_line_ndx=0;
            usb_print_prompt();
            SetSilentMode(FALSE);
        }
        else
        {   /* Put character to usb_cmd_line. */
            if (c=='\b')
            {
                if (usb_cmd_line_ndx > 0)
                {
                    usb_cmd_line[usb_cmd_line_ndx]='\0';
                    usb_cmd_line_ndx--;
                }
            }
            else if(c=='\n') {
                continue;
            }
            else
            {
                if (c == 0x7F)
                {
                    if (usb_cmd_line_ndx)
                    {
                        usb_cmd_line[usb_cmd_line_ndx]=0;
                        usb_cmd_line_ndx--;
                        usb_cmd_line[usb_cmd_line_ndx]=0;
                    }
                } else
                {
                    usb_cmd_line[usb_cmd_line_ndx++]=c;
                }
            }
        }

        if (SilentMode == FALSE)
        {
            cdc_process();
        }
    }
}