Files
tc264smart/libraries/infineon_libraries/Service/CpuGeneric/SysSe/Comm/Ifx_Shell.h
T
32343 843447835d Initial commit: TC264 smart car project with IPS200 menu system
- IPS200 display menu with real-time status and parameter settings
- Camera image processing and line tracking
- IMU attitude solution and PID control
- WiFi SPI oscilloscope data transmission
2026-05-10 21:38:49 +08:00

475 lines
19 KiB
C

/**
* \file Ifx_Shell.h
* \brief Shell functions.
* \ingroup library_srvsw_sysse_comm_shell
*
* \version disabled
* \copyright Copyright (c) 2013 Infineon Technologies AG. All rights reserved.
*
*
* IMPORTANT NOTICE
*
*
* Use of this file is subject to the terms of use agreed between (i) you or
* the company in which ordinary course of business you are acting and (ii)
* Infineon Technologies AG or its licensees. If and as long as no such
* terms of use are agreed, use of this file is subject to following:
* Boost Software License - Version 1.0 - August 17th, 2003
* Permission is hereby granted, free of charge, to any person or
* organization obtaining a copy of the software and accompanying
* documentation covered by this license (the "Software") to use, reproduce,
* display, distribute, execute, and transmit the Software, and to prepare
* derivative works of the Software, and to permit third-parties to whom the
* Software is furnished to do so, all subject to the following:
* The copyright notices in the Software and this entire statement, including
* the above license grant, this restriction and the following disclaimer, must
* be included in all copies of the Software, in whole or in part, and all
* derivative works of the Software, unless such copies or derivative works are
* solely in the form of machine-executable object code generated by a source
* language processor.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* \defgroup library_srvsw_sysse_comm_shell Shell
* This module implements the Shell functions.
* It parses a command line and call the corresponding command execution.
* Multiple command list can be used in parallel.
*
* Only full command match is accepted.
*
* New feature / change:
* - Prefix can be defined for each command list
* - Help for a single command is displayed with "help <command>"
* - help for a command list is displayed with "help <listPrefix>"
* - command short cut is not allowed
* - command with identical start option "opt1 opt2" and "opt1 opt3" are accepted, and root to different handlers
* - Enhanced help info print
*
* Help text xyntax:
* - /p indicates a parameter description, can be multi-line, lines must be separated with ENDL
* - /s Indicates a syntax help
*
* Example of help list:
* \code
* Ifx_Shell_Command Ifx_g_OsciShell_commands[] =
* {
* {IFX_OSCI_SHELL_PREFIX, " : Oscilloscope functions"
* , NULL_PTR, NULL_PTR },
* {"run", " : run the oscilloscope"ENDL
* "/s run [single|auto|normal]"
* , NULL_PTR, &Ifx_OsciShell_run },
* {"stop", " : stop oscilloscope"
* , NULL_PTR, &Ifx_OsciShell_stop },
* {"trigger", " : trigger settings"ENDL
* "/s trigger [force|single|level <value>|raising|falling|source <chNum>|interval <value>]"ENDL
* "/p force: Force the trigger"ENDL
* "/p single: Single the trigger"ENDL
* "/p level <value>: Set trigger level to value"ENDL
* "/p [raising|falling]: Set trigger to raising or falling edges"ENDL
* "/p source <chNum>: Set trigger channel number"ENDL
* "<chNum> can be obtained with 'channel' command"ENDL
* "/p interval <value>: Set sampling interval to value"
*
* , NULL_PTR, &Ifx_OsciShell_trigger },
* {"status", " : display status"
* , NULL_PTR, &Ifx_OsciShell_status },
* {"channel", " : channel information"ENDL
* "/s channel: Show the channels information"ENDL
* "/s channel <ch> <sig>: Assign a signal to a channel"
* , NULL_PTR, &Ifx_OsciShell_channel },
* {"analyze", " : signal analysis of a ch"ENDL
* "/s analyze <ch>: analyze the input channel <ch>"
* , NULL_PTR, &Ifx_OsciShell_analyze },
* {"simulate", " : simulate a signal"ENDL
* "/s simulate <ch> <op> <wave> <freq> <ampl> <offs> <phase> : Simulate a signal generation"ENDL
* "/p <ch> : {0 .. Channel count}"ENDL
* "/p <op> : {add,sub,mul,clr}"ENDL
* "/p <wave> : {sine,square}"ENDL
* "/p <freq> : -INF .. INF"ENDL
* "/p <offs> : -INF .. INF"ENDL
* "/p <ampl> : -INF .. INF"ENDL
* "/p <phase>: 0 .. 360 [degree]"ENDL
* "/s simulate <ch> atan <ych> <xch>: Compute atan(ych/xch) and store in channel <ch>"
* , NULL_PTR, &Ifx_OsciShell_simulate},
* {"dump", " : dump values (all channels)"ENDL
* "/s dump <ch> [hex]"ENDL
* "/p <ch>: Dump the values of the channel <ch>"ENDL
* "/p hex: If hex is specified, values will be in hexadecimal"
* , NULL_PTR, &Ifx_OsciShell_dump },
* IFX_SHELL_COMMAND_LIST_END,
* };
* \endcode
*
* To enable help command, include the below command in the main command list
* {"help", SHELL_HELP_DESCRIPTION_TEXT , &\<Ifx_Shell\>, &Ifx_Shell_showHelp, },
*
* \ingroup library_srvsw_sysse_comm
*
*/
#ifndef IFX_SHELL_H
#define IFX_SHELL_H 1
//----------------------------------------------------------------------------------------
#include "StdIf/IfxStdIf_DPipe.h"
#include "Ifx_Cfg.h"
//----------------------------------------------------------------------------------------
#define IFX_SHELL_NULL_CHAR '\0'
#ifndef IFX_CFG_SHELL_CMD_HISTORY_SIZE
#define IFX_CFG_SHELL_CMD_HISTORY_SIZE (10) /**<\brief Number of commands to store in history */
#endif
#ifndef IFX_CFG_SHELL_CMD_LINE_SIZE
#define IFX_CFG_SHELL_CMD_LINE_SIZE (128) /**<\brief max command line IFX_CFG_SHELL_CMD_LINE_SIZE - 1 */
#endif
#ifndef IFX_CFG_SHELL_COMMAND_LISTS
#define IFX_CFG_SHELL_COMMAND_LISTS (1) /**<\brief Number of command lists */
#endif
#ifndef IFX_CFG_SHELL_PROMPT
#define IFX_CFG_SHELL_PROMPT "Shell>" /**<\brief Shell prompt */
#endif
#define SHELL_HELP_DESCRIPTION_TEXT \
" : Display command list, and command help."ENDL \
"/s help: show all commands"ENDL \
"/s help <command>: show the command details"
/** \brief Marker for end of command list, the end of list is detected by commandLine=NULL */
#define IFX_SHELL_COMMAND_LIST_END {0, 0, 0, 0}
/** \brief Marker for end of syntax list */
#define IFX_SHELL_SYNTAX_LIST_END {0, 0}
/** \brief Signifies no item in use in command history list */
#define IFX_SHELL_CMD_HISTORY_NO_ITEM (-1)
//----------------------------------------------------------------------------------------
/** \brief Result code definition used after each executed Shell command */
typedef enum
{
Ifx_Shell_ResultCode_unknown = (128),
Ifx_Shell_ResultCode_nok = (129),
Ifx_Shell_ResultCode_undefined = (130),
Ifx_Shell_ResultCode_ok = (255)
} Ifx_Shell_ResultCode;
/** \brief Definition of a callback function which handles a Shell command */
typedef boolean (*Ifx_Shell_Call)(pchar args, void *data, IfxStdIf_DPipe *io);
/** \brief Shell command object */
typedef struct
{
pchar commandLine;
pchar help;
void *data;
Ifx_Shell_Call call;
} Ifx_Shell_Command;
/** \brief Command line editing state */
typedef struct
{
char *cmdStr; /**< \brief Pointer to current string containing command line as so far processed */
Ifx_SizeT cursor; /**< \brief Pointer to variable containing position of cursor in so-far-processed command line */
Ifx_SizeT length; /**< \brief Pointer to variable containing total length of command line */
boolean historyAdd; /**< \brief If TRUE, when Enter is pressed, the current cmdLine should be added to the command history (in parent) */
Ifx_SizeT historyItem; /**< \brief Item ID in command history list, or IFX_SHELL_CMD_HISTORY_NO_ITEM if not using list (e.g. new command) */
} Ifx_Shell_CmdLine;
/** \brief Shell command processing state */
typedef enum
{
IFX_SHELL_CMD_STATE_NORMAL, /**< \brief Normal - no special sequences being processed */
IFX_SHELL_CMD_STATE_ESCAPE, /**< \brief Escape character has been pressed */
IFX_SHELL_CMD_STATE_ESCAPE_BRACKET, /**< \brief ESC [ pressed */
IFX_SHELL_CMD_STATE_ESCAPE_BRACKET_NUMBER /**< \brief ESC [ (number) pressed */
} Ifx_Shell_CmdState;
/** \brief Shell protocol configuration */
typedef struct
{
boolean (*start)(void *protocol, IfxStdIf_DPipe *io);
void (*execute)(void *protocol);
void (*onStart)(void *protocol, void *data);
void *onStartData;
void *object;
boolean started;
} Ifx_Shell_Protocol;
/** \brief Shell control flags */
typedef struct
{
uint16 showPrompt : 1;
uint16 enabled : 1;
uint16 sendResultCode : 1;
uint16 echo : 1;
uint16 echoError : 1;
} Ifx_Shell_Flags;
/** \brief internal Shell run-time data */
typedef struct
{
char echo[2];
char inputbuffer[IFX_CFG_SHELL_CMD_LINE_SIZE + 1];
char cmdStr[IFX_CFG_SHELL_CMD_LINE_SIZE];
Ifx_Shell_CmdState cmdState;
char escBracketNum;
} Ifx_Shell_Runtime;
typedef Ifx_Shell_Command *Ifx_Shell_CommandList;
typedef const Ifx_Shell_Command *Ifx_Shell_CommandListConst;
/**
* \brief Shell object definition
*/
typedef struct
{
IfxStdIf_DPipe *io; /**< \brief Pointer to IfxStdIf_DPipe object used by the Shell */
Ifx_Shell_Flags control; /**< \brief control flags */
/** \brief Array of pointers to the history entries */
char *cmdHistory[IFX_CFG_SHELL_CMD_HISTORY_SIZE];
/** \brief Current status of command line editing (saves passing many parameters around) */
Ifx_Shell_CmdLine cmd;
Ifx_Shell_Runtime locals; /**< \brief Runtime data */
/** \brief Array of pointers to command list. The pointed location shall be constant
* during Shell lifetime, e.g. stored in non-volatile memory or as global variable
*
* The 1st item in the list is use as a group command prefix if its "call" parameter is NULL pointer, else it is use as other entries.
* In case "call" is NULL, the corresponding 'data' is ignored, and the 'help' is displayed.
*
**/
Ifx_Shell_CommandListConst commandList[IFX_CFG_SHELL_COMMAND_LISTS];
Ifx_Shell_Protocol protocol; /**< \brief Protocol handler data */
} Ifx_Shell;
/**
* \brief Shell configuration.
*/
typedef struct
{
IfxStdIf_DPipe *standardIo; /**<\brief Pointer to a IfxStdIf_DPipe object used by the Shell */
boolean echo; /**<\brief Specifies whether each command shall be echoed back to user */
boolean showPrompt; /**<\brief Specifies whether the IFX_CFG_SHELL_PROMPT shall be displayed after each command */
boolean sendResultCode; /**<\brief Specifies whether the Ifx_Shell_ResultCode shall be sent to user */
Ifx_Shell_CommandListConst commandList[IFX_CFG_SHELL_COMMAND_LISTS]; /**< \brief Specifies pointer to the command list */
Ifx_Shell_Protocol protocol; /**<\brief Configuration for the Ifx_Shell_Protocol */
} Ifx_Shell_Config;
/**
* \brief Shell Syntax Description.
*/
typedef struct
{
pchar syntax; /**<\brief syntax */
pchar description; /**<\brief description */
} Ifx_Shell_Syntax;
//----------------------------------------------------------------------------------------
/** \addtogroup library_srvsw_sysse_comm_shell
* \{ */
/** \name Basic functionality
* \{ */
/** Set the config default parameter
*
* \param config Pointer to the configuration structure to be initialized
*/
void Ifx_Shell_initConfig(Ifx_Shell_Config *config);
/**
* \brief Initialize the shell
* \param shell Pointer to the \ref Ifx_Shell object
* \param config Pointer to the configuration structure
*/
IFX_EXTERN boolean Ifx_Shell_init(Ifx_Shell *shell, const Ifx_Shell_Config *config);
/**
* \brief Deinitialise the shell
* \param shell Pointer to the \ref Ifx_Shell object
*/
IFX_EXTERN void Ifx_Shell_deinit(Ifx_Shell *shell);
/**
* \brief Clear the receive buffer and enable the shell
* \param shell Pointer to the \ref Ifx_Shell object
*/
IFX_EXTERN void Ifx_Shell_enable(Ifx_Shell *shell);
/**
* \brief Disable the shell
* \param shell Pointer to the \ref Ifx_Shell object
*/
IFX_EXTERN void Ifx_Shell_disable(Ifx_Shell *shell);
/**
* \brief Process the shell.
*
* This function shall be called within a loop or periodic timer to guarantee the correct
* processing of the incoming/received data.
*
* \param shell Pointer to the \ref Ifx_Shell object
*/
IFX_EXTERN void Ifx_Shell_process(Ifx_Shell *shell);
/** \} */
//----------------------------------------------------------------------------------------
/** \name Parsing functions
* \{ */
/**
* \brief Within the context of Shell.call, skip the whitespaces of the args string.
* \param args Pointer to the original string
* \return Pointer to the string after skipping the whitespaces
*/
IFX_EXTERN pchar Ifx_Shell_skipWhitespace(pchar args);
/**
* \brief Match string pointed by the *argsPtr with a given token
* \param argsPtr Pointer to the argument null-terminated string
* \param token Pointer to the token string to match
* \retval TRUE if the given token match with the string pointed by argsPtr
*/
IFX_EXTERN boolean Ifx_Shell_matchToken(pchar *argsPtr, pchar token);
/**
* \brief Parse a token
* Return the next token in tokenBuffer and move the argsPtr pointer after this token
* \param argsPtr Pointer to the argument null-terminated string
* \param tokenBuffer Pointer to the value storage
* \param bufferLength Maximum parsing length
*/
IFX_EXTERN boolean Ifx_Shell_parseToken(pchar *argsPtr, char *tokenBuffer, int bufferLength);
/**
* \brief Parse an address
* \param argsPtr Pointer to the argument null-terminated string
* \param address Pointer to the value storage
*/
IFX_EXTERN boolean Ifx_Shell_parseAddress(pchar *argsPtr, void **address);
/**
* \brief Parse a signed 32-bit integer value
* \param argsPtr Pointer to the argument null-terminated string
* \param value Pointer to the value storage
*/
IFX_EXTERN boolean Ifx_Shell_parseSInt32(pchar *argsPtr, sint32 *value);
/**
* \brief Parse an unsigned 32-bit integer value
* \param argsPtr Pointer to the argument null-terminated string
* \param value Pointer to the value storage
* \param hex if TRUE, hex parsing will be done, else decimal parsing
*/
IFX_EXTERN boolean Ifx_Shell_parseUInt32(pchar *argsPtr, uint32 *value, boolean hex);
/**
* \brief Parse a signed 64-bit integer value
* \param argsPtr Pointer to the argument null-terminated string
* \param value Pointer to the value storage
*/
IFX_EXTERN boolean Ifx_Shell_parseSInt64(pchar *argsPtr, sint64 *value);
/**
* \brief Parse an unsigned 64-bit integer value
* \param argsPtr Pointer to the argument null-terminated string
* \param value Pointer to the value storage
* \param hex if TRUE, hex parsing will be done, else decimal parsing
*/
IFX_EXTERN boolean Ifx_Shell_parseUInt64(pchar *argsPtr, uint64 *value, boolean hex);
/**
* \brief Parse a 64-bit (double precision) floating-point value
* \param argsPtr Pointer to the argument null-terminated string
* \param value Pointer to the value storage
*/
IFX_EXTERN boolean Ifx_Shell_parseFloat64(pchar *argsPtr, float64 *value);
/**
* \brief Parse a 32-bit (single precision) floating-point value
* \param argsPtr Pointer to the argument null-terminated string
* \param value Pointer to the value storage
*/
IFX_EXTERN boolean Ifx_Shell_parseFloat32(pchar *argsPtr, float32 *value);
/** \} */
//----------------------------------------------------------------------------------------
/** \name Command list functions
* \{ */
/**
* \brief Find command in command List
* \param commandList Pointer to the first entry of an array of \ref Ifx_Shell_Command
* \param commandLine Pointer to null-terminated string containings the command to search.
* \param args Pointer to the argument null-terminated string
* \param match Return the number of arguments that matches
*/
IFX_EXTERN const Ifx_Shell_Command *Ifx_Shell_commandFind(Ifx_Shell_CommandListConst commandList, pchar commandLine, pchar *args, uint32 *match);
/**
* \brief Implementation of \ref Ifx_Shell_Call. Show the help menu from single command list.
* \param commandList Pointer to an array of Ifx_Shell_Command
* \param io Pointer to the IfxStdIf_DPipe object
* \param briefOnly if TRUE, show only the brief description, else show the full description
* \param singleCommand If TRUE, only show the 1st command pointed by commandList, else show the full list
*/
IFX_EXTERN boolean Ifx_Shell_showHelpSingle(Ifx_Shell_CommandListConst commandList, IfxStdIf_DPipe *io, boolean briefOnly, boolean singleCommand);
/**
* \brief Implementation of \ref Ifx_Shell_Call. Show the help menu and list of commands.
* \param args The argument null-terminated string
* \param shellPtr Pointer to a Shell object
* \param io Pointer to \ref IfxStdIf_DPipe object
*/
IFX_EXTERN boolean Ifx_Shell_showHelp(pchar args, void *shellPtr, IfxStdIf_DPipe *io);
/**
* \brief Implementation of \ref Ifx_Shell_Call. print the syntax.
* \param syntaxList Pointer to syntax list
* \param io Pointer to \ref IfxStdIf_DPipe object
*/
IFX_EXTERN void Ifx_Shell_printSyntax(const Ifx_Shell_Syntax *syntaxList, IfxStdIf_DPipe *io);
/** \} */
//----------------------------------------------------------------------------------------
/** \name Sub protocol functions
* \{ */
/**
* \brief Implementation of \ref Ifx_Shell_Call. Start the Shell protocol.
* \param args The argument null-terminated string
* \param data Pointer to \ref Ifx_Shell object
* \param io Pointer to \ref IfxStdIf_DPipe object
*/
IFX_EXTERN boolean Ifx_Shell_protocolStart(pchar args, void *data, IfxStdIf_DPipe *io);
/**
* \brief Implementation of \ref Ifx_Shell_Call. Start the ShellBb protocol.
* \param args The argument null-terminated string
* \param data Pointer to \ref Ifx_Shell object
* \param io Pointer to \ref IfxStdIf_DPipe object
*/
IFX_EXTERN boolean Ifx_Shell_bbProtocolStart(pchar args, void *data, IfxStdIf_DPipe *io);
/** \} */
//----------------------------------------------------------------------------------------
/** \} */
#endif