| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 | 
							- /*
 
-  * FreeRTOS+CLI V1.0.1 (C) 2012 Real Time Engineers ltd.
 
-  *
 
-  * FreeRTOS+CLI is an add-on component to FreeRTOS.  It is not, in itself, part
 
-  * of the FreeRTOS kernel.  FreeRTOS+CLI is licensed separately from FreeRTOS,
 
-  * and uses a different license to FreeRTOS.  FreeRTOS+CLI uses a dual license
 
-  * model, information on which is provided below:
 
-  *
 
-  * - Open source licensing -
 
-  * FreeRTOS+CLI is a free download and may be used, modified and distributed
 
-  * without charge provided the user adheres to version two of the GNU General
 
-  * Public license (GPL) and does not remove the copyright notice or this text.
 
-  * The GPL V2 text is available on the gnu.org web site, and on the following
 
-  * URL: http://www.FreeRTOS.org/gpl-2.0.txt
 
-  *
 
-  * - Commercial licensing -
 
-  * Businesses and individuals who wish to incorporate FreeRTOS+CLI into
 
-  * proprietary software for redistribution in any form must first obtain a
 
-  * (very) low cost commercial license - and in-so-doing support the maintenance,
 
-  * support and further development of the FreeRTOS+CLI product.  Commercial
 
-  * licenses can be obtained from http://shop.freertos.org and do not require any
 
-  * source files to be changed.
 
-  *
 
-  * FreeRTOS+CLI is distributed in the hope that it will be useful.  You cannot
 
-  * use FreeRTOS+CLI unless you agree that you use the software 'as is'.
 
-  * FreeRTOS+CLI is provided WITHOUT ANY WARRANTY; without even the implied
 
-  * warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
 
-  * PURPOSE. Real Time Engineers Ltd. disclaims all conditions and terms, be they
 
-  * implied, expressed, or statutory.
 
-  *
 
-  * 1 tab == 4 spaces!
 
-  *
 
-  * http://www.FreeRTOS.org
 
-  * http://www.FreeRTOS.org/FreeRTOS-Plus
 
-  *
 
-  */
 
- /* Standard includes. */
 
- #include <string.h>
 
- #include <stdint.h>
 
- /* FreeRTOS includes. */
 
- #include "FreeRTOS.h"
 
- #include "task.h"
 
- /* Utils includes. */
 
- #include "FreeRTOS_CLI.h"
 
- typedef struct xCOMMAND_INPUT_LIST
 
- {
 
- 	const CLI_Command_Definition_t *pxCommandLineDefinition;
 
- 	struct xCOMMAND_INPUT_LIST *pxNext;
 
- } CLI_Definition_List_Item_t;
 
- /*
 
-  * The callback function that is executed when "help" is entered.  This is the
 
-  * only default command that is always present.
 
-  */
 
- static portBASE_TYPE prvHelpCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
- /* The definition of the "help" command.  This command is always at the front
 
- of the list of registered commands. */
 
- static const CLI_Command_Definition_t xHelpCommand =
 
- {
 
- 	( const int8_t * const ) "help",
 
- 	( const int8_t * const ) "\r\n\thelp: вывод краткого описания поддерживаемых команд\r\n",
 
- 	prvHelpCommand,
 
- 	0
 
- };
 
- /* The definition of the list of commands.  Commands that are registered are
 
- added to this list. */
 
- static CLI_Definition_List_Item_t xRegisteredCommands =
 
- {
 
- 	&xHelpCommand,	/* The first command in the list is always the help command, defined in this file. */
 
- 	NULL,
 
- };
 
- /* A buffer into which command outputs can be written is declared here, rather
 
- than in the command console implementation, to allow multiple command consoles
 
- to share the same buffer.  For example, an application may allow access to the
 
- command interpreter by UART and by Ethernet.  Sharing a buffer is done purely
 
- to save RAM.  Note, however, that the command console itself is not re-entrant,
 
- so only one command interpreter interface can be used at any one time.  For that
 
- reason, no attempt at providing mutual exclusion to the cOutputBuffer array is
 
- attempted. */
 
- int8_t cOutputBuffer[ configCOMMAND_INT_MAX_OUTPUT_SIZE ];
 
- /*-----------------------------------------------------------*/
 
- portBASE_TYPE FreeRTOS_CLIRegisterCommand( const CLI_Command_Definition_t * const pxCommandToRegister )
 
- {
 
- static CLI_Definition_List_Item_t *pxLastCommandInList = &xRegisteredCommands;
 
- CLI_Definition_List_Item_t *pxNewListItem;
 
- portBASE_TYPE xReturn = pdFAIL;
 
- 	/* Check the parameter is not NULL. */
 
- 	configASSERT( pxCommandToRegister );
 
- 	/* Create a new list item that will reference the command being registered. */
 
- 	pxNewListItem = ( CLI_Definition_List_Item_t * ) pvPortMalloc( sizeof( CLI_Definition_List_Item_t ) );
 
- 	configASSERT( pxNewListItem );
 
- 	if( pxNewListItem != NULL )
 
- 	{
 
- 		taskENTER_CRITICAL();
 
- 		{
 
- 			/* Reference the command being registered from the newly created
 
- 			list item. */
 
- 			pxNewListItem->pxCommandLineDefinition = pxCommandToRegister;
 
- 			/* The new list item will get added to the end of the list, so
 
- 			pxNext has nowhere to point. */
 
- 			pxNewListItem->pxNext = NULL;
 
- 			/* Add the newly created list item to the end of the already existing
 
- 			list. */
 
- 			pxLastCommandInList->pxNext = pxNewListItem;
 
- 			/* Set the end of list marker to the new list item. */
 
- 			pxLastCommandInList = pxNewListItem;
 
- 		}
 
- 		taskEXIT_CRITICAL();
 
- 		xReturn = pdPASS;
 
- 	}
 
- 	return xReturn;
 
- }
 
- /*-----------------------------------------------------------*/
 
- portBASE_TYPE FreeRTOS_CLIProcessCommand(cli_state_t *cli_state, const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, size_t xWriteBufferLen  )
 
- {
 
- 	static const CLI_Definition_List_Item_t *pxCommand = NULL;
 
- 	portBASE_TYPE xReturn = pdTRUE;
 
- 	const int8_t *pcRegisteredCommandString;
 
- 	size_t xCommandStringLength;
 
- 	/* Note:  This function is not re-entrant.  It must not be called from more
 
- 	thank one task. */
 
- 	if( pxCommand == NULL )
 
- 	{
 
- 		/* Search for the command string in the list of registered commands. */
 
- 		for( pxCommand = &xRegisteredCommands; pxCommand != NULL; pxCommand = pxCommand->pxNext )
 
- 		{
 
- 			pcRegisteredCommandString = pxCommand->pxCommandLineDefinition->pcCommand;
 
- 			xCommandStringLength = strlen( ( const char * ) pcRegisteredCommandString );
 
- 			/* To ensure the string lengths match exactly, so as not to pick up
 
- 			a sub-string of a longer command, check the byte after the expected
 
- 			end of the string is either the end of the string or a space before
 
- 			a parameter. */
 
- 			if( ( pcCommandInput[ xCommandStringLength ] == ' ' ) || ( pcCommandInput[ xCommandStringLength ] == 0x00 ) )
 
- 			{
 
- 				if( strncmp( ( const char * ) pcCommandInput, ( const char * ) pcRegisteredCommandString, xCommandStringLength ) == 0 )
 
- 				{
 
- 					/* The command has been found.  Check it has the expected
 
- 					number of parameters.  If cExpectedNumberOfParameters is -1,
 
- 					then there could be a variable number of parameters and no
 
- 					check is made. */
 
- 					if( pxCommand->pxCommandLineDefinition->cExpectedNumberOfParameters >= 0 )
 
- 					{
 
- 						if( prvGetNumberOfParameters( pcCommandInput ) != pxCommand->pxCommandLineDefinition->cExpectedNumberOfParameters )
 
- 						{
 
- 							xReturn = pdFALSE;
 
- 						}
 
- 					}
 
- 					break;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	if( ( pxCommand != NULL ) && ( xReturn == pdFALSE ) )
 
- 	{
 
- 		/* The command was found, but the number of parameters with the command
 
- 		was incorrect. */
 
- 		strncpy( ( char * ) pcWriteBuffer, "Неправильно введены параметры команды.  Введите \"help\" для просмотра списка поддерживаемых команд.\r\n\r\n", xWriteBufferLen );
 
- 		pxCommand = NULL;
 
- 	}
 
- 	else if( pxCommand != NULL )
 
- 	{
 
- 		/* Call the callback function that is registered to this command. */
 
- 		xReturn = pxCommand->pxCommandLineDefinition->pxCommandInterpreter(cli_state, pcWriteBuffer, xWriteBufferLen, pcCommandInput );
 
- 		/* If xReturn is pdFALSE, then no further strings will be returned
 
- 		after this one, and	pxCommand can be reset to NULL ready to search
 
- 		for the next entered command. */
 
- 		if( xReturn == pdFALSE )
 
- 		{
 
- 			pxCommand = NULL;
 
- 		}
 
- 	}
 
- 	else
 
- 	{
 
- 		/* pxCommand was NULL, the command was not found. */
 
- 		strncpy( ( char * ) pcWriteBuffer, ( const char * const ) "Команда не поддерживается.  Введите \"help\" для просмотра списка поддерживаемых команд.\r\n\r\n", xWriteBufferLen );
 
- 		xReturn = pdFALSE;
 
- 	}
 
- 	return xReturn;
 
- }
 
- /*-----------------------------------------------------------*/
 
- int8_t *FreeRTOS_CLIGetOutputBuffer( void )
 
- {
 
- 	return cOutputBuffer;
 
- }
 
- /*-----------------------------------------------------------*/
 
- const int8_t *FreeRTOS_CLIGetParameter( const int8_t *pcCommandString, unsigned portBASE_TYPE uxWantedParameter, portBASE_TYPE *pxParameterStringLength )
 
- {
 
- unsigned portBASE_TYPE uxParametersFound = 0;
 
- const int8_t *pcReturn = NULL;
 
- 	*pxParameterStringLength = 0;
 
- 	while( uxParametersFound < uxWantedParameter )
 
- 	{
 
- 		/* Index the character pointer past the current word.  If this is the start
 
- 		of the command string then the first word is the command itself. */
 
- 		while( ( ( *pcCommandString ) != 0x00 ) && ( ( *pcCommandString ) != ' ' ) )
 
- 		{
 
- 			pcCommandString++;
 
- 		}
 
- 		/* Find the start of the next string. */
 
- 		while( ( ( *pcCommandString ) != 0x00 ) && ( ( *pcCommandString ) == ' ' ) )
 
- 		{
 
- 			pcCommandString++;
 
- 		}
 
- 		/* Was a string found? */
 
- 		if( *pcCommandString != 0x00 )
 
- 		{
 
- 			/* Is this the start of the required parameter? */
 
- 			uxParametersFound++;
 
- 			if( uxParametersFound == uxWantedParameter )
 
- 			{
 
- 				/* How long is the parameter? */
 
- 				pcReturn = pcCommandString;
 
- 				while( ( ( *pcCommandString ) != 0x00 ) && ( ( *pcCommandString ) != ' ' ) )
 
- 				{
 
- 					( *pxParameterStringLength )++;
 
- 					pcCommandString++;
 
- 				}
 
- 				if( *pxParameterStringLength == 0 )
 
- 				{
 
- 					pcReturn = NULL;
 
- 				}
 
- 				break;
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			break;
 
- 		}
 
- 	}
 
- 	return pcReturn;
 
- }
 
- /*-----------------------------------------------------------*/
 
- static portBASE_TYPE prvHelpCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 
- {
 
- 	static const CLI_Definition_List_Item_t * pxCommand = NULL;
 
- 	signed portBASE_TYPE xReturn;
 
- 	( void ) pcCommandString;
 
- 	//configASSERT( pcWriteBuffer );
 
- 	if( pxCommand == NULL )
 
- 	{
 
- 		/* Reset the pxCommand pointer back to the start of the list. */
 
- 		pxCommand = &xRegisteredCommands;
 
- 	}
 
- 	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
 
- 	/* Return the next command help string, before moving the pointer on to
 
- 	the next command in the list. */
 
- 	strncpy( ( char * ) pcWriteBuffer, ( const char * ) pxCommand->pxCommandLineDefinition->pcHelpString, xWriteBufferLen );
 
- 	pxCommand = pxCommand->pxNext;
 
- 	if( pxCommand == NULL )
 
- 	{
 
- 		/* There are no more commands in the list, so there will be no more
 
- 		strings to return after this one and pdFALSE should be returned. */
 
- 		xReturn = pdFALSE;
 
- 	}
 
- 	else
 
- 	{
 
- 		xReturn = pdTRUE;
 
- 	}
 
- 	return xReturn;
 
- }
 
- /*-----------------------------------------------------------*/
 
- int8_t prvGetNumberOfParameters( const int8_t * pcCommandString )
 
- {
 
- int8_t cParameters = 0;
 
- portBASE_TYPE xLastCharacterWasSpace = pdFALSE;
 
- 	/* Count the number of space delimited words in pcCommandString. */
 
- 	while( *pcCommandString != 0x00 )
 
- 	{
 
- 		if( ( *pcCommandString ) == ' ' )
 
- 		{
 
- 			if( xLastCharacterWasSpace != pdTRUE )
 
- 			{
 
- 				cParameters++;
 
- 				xLastCharacterWasSpace = pdTRUE;
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			xLastCharacterWasSpace = pdFALSE;
 
- 		}
 
- 		pcCommandString++;
 
- 	}
 
- 	/* If the command string ended with spaces, then there will have been too
 
- 	many parameters counted. */
 
- 	if( xLastCharacterWasSpace == pdTRUE )
 
- 	{
 
- 		cParameters--;
 
- 	}
 
- 	/* The value returned is one less than the number of space delimited words,
 
- 	as the first word should be the command itself. */
 
- 	return cParameters;
 
- }
 
- /*-----------------------------------------------------------*/
 
- portBASE_TYPE FreeRTOS_CLICompleteCMDCommand( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer)
 
- {
 
- 	const CLI_Definition_List_Item_t *pxCommand = NULL;
 
- 	portBASE_TYPE xReturn = pdFALSE;
 
- 	const int8_t *pcRegisteredCommandString;
 
- 	size_t xCommandStringLength;
 
- 	int8_t args = 0;
 
- 	char* compl_world;
 
- 	uint8_t cnt_complete = 0 ;
 
- 	uint8_t len = 0;
 
- 	char* end_compl_word;
 
- 	char* end_compl_word2;
 
- 	args = prvGetNumberOfParameters(pcCommandInput);
 
- 	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
 
- 	if(args == 0){
 
- 		for( pxCommand = &xRegisteredCommands; pxCommand != NULL; pxCommand = pxCommand->pxNext )
 
- 		{
 
- 			if (strstr ((char *)pxCommand->pxCommandLineDefinition->pcCommand, (char *)pcCommandInput) == (char *)pxCommand->pxCommandLineDefinition->pcCommand) {
 
- 				compl_world  = (char *)pxCommand->pxCommandLineDefinition->pcCommand;
 
- 				compl_world  += strlen((char *)pcCommandInput);
 
- 				len = strlen(compl_world);
 
- 				cnt_complete ++;
 
- 			}
 
- 		}
 
- 	}
 
- 	else{
 
- 		/* Search for the command string in the list of registered commands. */
 
- 		for( pxCommand = &xRegisteredCommands; pxCommand != NULL; pxCommand = pxCommand->pxNext )
 
- 		{
 
- 			len = 0;
 
- 			pcRegisteredCommandString = pxCommand->pxCommandLineDefinition->pcCommand;
 
- 			xCommandStringLength = strlen( ( const char * ) pcRegisteredCommandString );
 
- 			/* To ensure the string lengths match exactly, so as not to pick up
 
- 			a sub-string of a longer command, check the byte after the expected
 
- 			end of the string is either the end of the string or a space before
 
- 			a parameter. */
 
- 			if( ( pcCommandInput[ xCommandStringLength ] == ' ' ) || ( pcCommandInput[ xCommandStringLength ] == 0x00 ) )
 
- 			{
 
- 				if( strncmp( ( const char * ) pcCommandInput, ( const char * ) pcRegisteredCommandString, xCommandStringLength ) == 0 )
 
- 				{
 
- 					compl_world = strstr ((char *)pxCommand->pxCommandLineDefinition->pcHelpString, (char *)pcCommandInput);
 
- 					while (compl_world != NULL) {
 
- 						compl_world  += (strlen((char *)pcCommandInput) - 1 );
 
- 						end_compl_word = strstr(compl_world, ":");
 
- 						if(end_compl_word != NULL){
 
- 							end_compl_word2 = strstr(compl_world, " ");
 
- 							if(end_compl_word2 == NULL){
 
- 								if(end_compl_word2 < end_compl_word){
 
- 									if(end_compl_word2[1] != '<'){
 
- 										len = end_compl_word2 - compl_world;
 
- 									}
 
- 								}
 
- 							}
 
- 							else
 
- 								if(strstr(compl_world, ">") == NULL)
 
- 									len = end_compl_word - compl_world;
 
- 							}
 
- 						compl_world = strstr ((char *)pxCommand->pxCommandLineDefinition->pcHelpString, compl_world);
 
- 						cnt_complete ++;
 
- 					}
 
- 					break;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	if(cnt_complete == 1 && len != 0){
 
- 		strncat((char *)pcWriteBuffer, compl_world, len);
 
- 	}
 
- 	return xReturn;
 
- }
 
 
  |