summaryrefslogtreecommitdiff
path: root/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c')
-rw-r--r--FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
new file mode 100644
index 000000000..3ab14bb97
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
@@ -0,0 +1,272 @@
+/*
+ FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
+ All rights reserved
+
+ VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
+
+ ***************************************************************************
+ >>! NOTE: The modification to the GPL is included to allow you to !<<
+ >>! distribute a combined work that includes FreeRTOS without being !<<
+ >>! obliged to provide the source code for proprietary components !<<
+ >>! outside of the FreeRTOS kernel. !<<
+ ***************************************************************************
+
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. Full license text is available on the following
+ link: http://www.freertos.org/a00114.html
+
+ ***************************************************************************
+ * *
+ * FreeRTOS provides completely free yet professionally developed, *
+ * robust, strictly quality controlled, supported, and cross *
+ * platform software that is more than just the market leader, it *
+ * is the industry's de facto standard. *
+ * *
+ * Help yourself get started quickly while simultaneously helping *
+ * to support the FreeRTOS project by purchasing a FreeRTOS *
+ * tutorial book, reference manual, or both: *
+ * http://www.FreeRTOS.org/Documentation *
+ * *
+ ***************************************************************************
+
+ http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
+ the FAQ page "My application does not run, what could be wrong?". Have you
+ defined configASSERT()?
+
+ http://www.FreeRTOS.org/support - In return for receiving this top quality
+ embedded software for free we request you assist our global community by
+ participating in the support forum.
+
+ http://www.FreeRTOS.org/training - Investing in training allows your team to
+ be as productive as possible as early as possible. Now you can receive
+ FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
+ Ltd, and the world's leading authority on the world's leading RTOS.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool, a DOS
+ compatible FAT file system, and our tiny thread aware UDP/IP stack.
+
+ http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
+ Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
+
+ http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
+ Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
+ licenses offer ticketed support, indemnification and commercial middleware.
+
+ http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+ engineered and independently SIL3 certified version for use in safety and
+ mission critical applications that require provable dependability.
+
+ 1 tab == 4 spaces!
+*/
+
+/*
+ * NOTE: This file uses a third party USB CDC driver.
+ */
+
+/* Standard includes. */
+#include "string.h"
+#include "stdio.h"
+
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "semphr.h"
+
+/* Example includes. */
+#include "FreeRTOS_CLI.h"
+
+/* Demo application includes. */
+#include "serial.h"
+
+/* Dimensions the buffer into which input characters are placed. */
+#define cmdMAX_INPUT_SIZE 50
+
+#define cmdQUEUE_LENGTH 25
+
+/* DEL acts as a backspace. */
+#define cmdASCII_DEL ( 0x7F )
+
+#define cmdMAX_MUTEX_WAIT ( ( ( TickType_t ) 300 ) / ( portTICK_PERIOD_MS ) )
+
+#ifndef configCLI_BAUD_RATE
+ #define configCLI_BAUD_RATE 115200
+#endif
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The task that implements the command console processing.
+ */
+static void prvUARTCommandConsoleTask( void *pvParameters );
+void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority );
+
+/*-----------------------------------------------------------*/
+
+/* Const messages output by the command console. */
+static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";
+static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
+static const char * const pcNewLine = "\r\n";
+
+SemaphoreHandle_t xTxMutex = NULL;
+static xComPortHandle xPort = 0;
+
+/* Serial drivers that use task notifications may need the CLI task's handle. */
+TaskHandle_t xCLITaskHandle = NULL;
+
+/*-----------------------------------------------------------*/
+
+void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority )
+{
+ /* Create the semaphore used to access the UART Tx. */
+ xTxMutex = xSemaphoreCreateMutex();
+ configASSERT( xTxMutex );
+
+ /* Create that task that handles the console itself. */
+ xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
+ "CLI", /* Text name assigned to the task. This is just to assist debugging. The kernel does not use this name itself. */
+ usStackSize, /* The size of the stack allocated to the task. */
+ NULL, /* The parameter is not used, so NULL is passed. */
+ uxPriority, /* The priority allocated to the task. */
+ &xCLITaskHandle ); /* Serial drivers that use task notifications may need the CLI task's handle. */
+}
+/*-----------------------------------------------------------*/
+
+static void prvUARTCommandConsoleTask( void *pvParameters )
+{
+char cRxedChar;
+uint8_t ucInputIndex = 0;
+char *pcOutputString;
+static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
+BaseType_t xReturned;
+xComPortHandle xPort;
+
+ ( void ) pvParameters;
+
+ /* Obtain the address of the output buffer. Note there is no mutual
+ exclusion on this buffer as it is assumed only one command console interface
+ will be used at any one time. */
+ pcOutputString = FreeRTOS_CLIGetOutputBuffer();
+
+ /* Initialise the UART. */
+ xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );
+
+ /* Send the welcome message. */
+ vSerialPutString( xPort, ( char * ) pcWelcomeMessage, strlen( pcWelcomeMessage ) );
+
+ for( ;; )
+ {
+ /* Wait for the next character. The while loop is used in case
+ INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will
+ be a genuine block time rather than an infinite block time. */
+ while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS );
+
+ /* Ensure exclusive access to the UART Tx. */
+ if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
+ {
+ /* Echo the character back. */
+ xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );
+
+ /* Was it the end of the line? */
+ if( ( cRxedChar == '\n' ) || ( cRxedChar == '\r' ) )
+ {
+ /* Just to space the output from the input. */
+ vSerialPutString( xPort, ( char * ) pcNewLine, strlen( pcNewLine ) );
+
+ /* See if the command is empty, indicating that the last command
+ is to be executed again. */
+ if( ucInputIndex == 0 )
+ {
+ /* Copy the last command back into the input string. */
+ strcpy( cInputString, cLastInputString );
+ }
+
+ /* Pass the received command to the command interpreter. The
+ command interpreter is called repeatedly until it returns
+ pdFALSE (indicating there is no more output) as it might
+ generate more than one string. */
+ do
+ {
+ /* Get the next output string from the command interpreter. */
+ xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
+
+ /* Write the generated string to the UART. */
+ vSerialPutString( xPort, ( char * ) pcOutputString, strlen( pcOutputString ) );
+
+ } while( xReturned != pdFALSE );
+
+ /* All the strings generated by the input command have been
+ sent. Clear the input string ready to receive the next command.
+ Remember the command that was just processed first in case it is
+ to be processed again. */
+ strcpy( cLastInputString, cInputString );
+ ucInputIndex = 0;
+ memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
+
+ vSerialPutString( xPort, ( char * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ) );
+ }
+ else
+ {
+ if( cRxedChar == '\r' )
+ {
+ /* Ignore the character. */
+ }
+ else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
+ {
+ /* Backspace was pressed. Erase the last character in the
+ string - if any. */
+ if( ucInputIndex > 0 )
+ {
+ ucInputIndex--;
+ cInputString[ ucInputIndex ] = '\0';
+ }
+ }
+ else
+ {
+ /* A character was entered. Add it to the string entered so
+ far. When a \n is entered the complete string will be
+ passed to the command interpreter. */
+ if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
+ {
+ if( ucInputIndex < cmdMAX_INPUT_SIZE )
+ {
+ cInputString[ ucInputIndex ] = cRxedChar;
+ ucInputIndex++;
+ }
+ }
+ }
+ }
+
+ /* Must ensure to give the mutex back. */
+ xSemaphoreGive( xTxMutex );
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vOutputString( const char * const pcMessage )
+{
+ if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
+ {
+ vSerialPutString( xPort, ( char * ) pcMessage, strlen( pcMessage ) );
+ xSemaphoreGive( xTxMutex );
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vOutputChar( const char cChar, const TickType_t xTicksToWait )
+{
+ if( xSemaphoreTake( xTxMutex, xTicksToWait ) == pdPASS )
+ {
+ xSerialPutChar( xPort, cChar, xTicksToWait );
+ xSemaphoreGive( xTxMutex );
+ }
+}
+/*-----------------------------------------------------------*/