forked from xuos/xiuos
				
			
		
			
				
	
	
		
			277 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
/**
 | 
						|
 * @file shell.h
 | 
						|
 * @author Letter (NevermindZZT@gmail.com)
 | 
						|
 * @brief letter shell
 | 
						|
 * @version 3.0.0
 | 
						|
 * @date 2019-12-30
 | 
						|
 * 
 | 
						|
 * @copyright (c) 2020 Letter
 | 
						|
 * 
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef     __SHELL_H__
 | 
						|
#define     __SHELL_H__
 | 
						|
 | 
						|
#include "xsconfig.h"
 | 
						|
#include "stdlib.h"
 | 
						|
 | 
						|
#define     SHELL_VERSION               "3.0.5"                 /**< version */
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief get system time (ms)
 | 
						|
 *        
 | 
						|
 * @note When this macro is not defined, 
 | 
						|
 * you cannot use double-clicking the tab to complete the command help, 
 | 
						|
 * and you cannot use the shell timeout lock
 | 
						|
 */
 | 
						|
#define     SHELL_GET_TICK()            CalculteTimeMsFromTick(CurrentTicksGain())
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief shell permitt
 | 
						|
 * 
 | 
						|
 * @param permission permission level
 | 
						|
 */
 | 
						|
#define     SHELL_CMD_PERMISSION(permission) \
 | 
						|
            (permission & 0x000000FF)
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief shell COMMAND TYPE
 | 
						|
 * 
 | 
						|
 * @param type type of command
 | 
						|
 */
 | 
						|
#define     SHELL_CMD_TYPE(type) \
 | 
						|
            ((type & 0x0000000F) << 8)
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Enable command without verifying the password
 | 
						|
 */
 | 
						|
#define     SHELL_CMD_ENABLE_UNCHECKED \
 | 
						|
            (1 << 12)
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Disable print return value  
 | 
						|
 */
 | 
						|
#define     SHELL_CMD_DISABLE_RETURN \
 | 
						|
            (1 << 13)
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Read-only attributes (only valid for variables) 
 | 
						|
 */
 | 
						|
#define     SHELL_CMD_READ_ONLY \
 | 
						|
            (1 << 14)
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Number of command parameters 
 | 
						|
 */
 | 
						|
#define     SHELL_CMD_PARAM_NUM(num) \
 | 
						|
            ((num & 0x0000000F)) << 16
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief shell Command definition 
 | 
						|
     * 
 | 
						|
     * @param _attr Command attributes 
 | 
						|
     * @param _name Command name 
 | 
						|
     * @param _func Command function 
 | 
						|
     * @param _desc Command description 
 | 
						|
     */
 | 
						|
    #define SHELL_EXPORT_CMD(_attr, _name, _func, _desc) \
 | 
						|
            const char shellCmd##_name[] = #_name; \
 | 
						|
            const char shellDesc##_name[] = #_desc; \
 | 
						|
            const ShellCommand \
 | 
						|
            shellCommand##_name SECTION("shellCommand") =  \
 | 
						|
            { \
 | 
						|
                .attr.value = _attr, \
 | 
						|
                .data.cmd.name = shellCmd##_name, \
 | 
						|
                .data.cmd.function = (int (*)())_func, \
 | 
						|
                .data.cmd.desc = shellDesc##_name \
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief shell variable definition
 | 
						|
     * 
 | 
						|
     * @param _attr Command attributes
 | 
						|
     * @param _name Command name
 | 
						|
     * @param _value Command function
 | 
						|
     * @param _desc Command description
 | 
						|
     */
 | 
						|
    #define SHELL_EXPORT_VAR(_attr, _name, _value, _desc) \
 | 
						|
            const char shellCmd##_name[] = #_name; \
 | 
						|
            const char shellDesc##_name[] = #_desc; \
 | 
						|
            const ShellCommand \
 | 
						|
            shellVar##_name SECTION("shellCommand") =  \
 | 
						|
            { \
 | 
						|
                .attr.value = _attr, \
 | 
						|
                .data.var.name = shellCmd##_name, \
 | 
						|
                .data.var.value = (void *)_value, \
 | 
						|
                .data.var.desc = shellDesc##_name \
 | 
						|
            }
 | 
						|
 | 
						|
 
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief shell Key definition 
 | 
						|
     * 
 | 
						|
     * @param _attr Key attributes 
 | 
						|
     * @param _value Key value 
 | 
						|
     * @param _func Key function 
 | 
						|
     * @param _desc Key description 
 | 
						|
     */
 | 
						|
    #define SHELL_EXPORT_KEY(_attr, _value, _func, _desc) \
 | 
						|
            const char shellDesc##_value[] = #_desc; \
 | 
						|
            const ShellCommand \
 | 
						|
            shellKey##_value SECTION("shellCommand") =  \
 | 
						|
            { \
 | 
						|
                .attr.value = _attr|SHELL_CMD_TYPE(SHELL_TYPE_KEY), \
 | 
						|
                .data.key.value = _value, \
 | 
						|
                .data.key.function = (void (*)(Shell *))_func, \
 | 
						|
                .data.key.desc = shellDesc##_value \
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief shell command type
 | 
						|
 */
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
    SHELL_TYPE_CMD_MAIN = 0,                                    /**< main function form command  */
 | 
						|
    SHELL_TYPE_CMD_FUNC,                                        /**< C function form command  */
 | 
						|
    SHELL_TYPE_VAR_INT,                                         /**< int variable  */
 | 
						|
    SHELL_TYPE_VAR_SHORT,                                       /**< short variable */
 | 
						|
    SHELL_TYPE_VAR_CHAR,                                        /**< char variable */
 | 
						|
    SHELL_TYPE_VAR_STRING,                                      /**< string variable */
 | 
						|
    SHELL_TYPE_VAR_POINT,                                       /**< point variable */
 | 
						|
    SHELL_TYPE_VAR_NODE,                                        /**< node variable*/
 | 
						|
    SHELL_TYPE_USER,                                            /**< user */
 | 
						|
    SHELL_TYPE_KEY,                                             /**< Key */
 | 
						|
} ShellCommandType;
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Shell definition
 | 
						|
 */
 | 
						|
typedef struct shell_def
 | 
						|
{
 | 
						|
    struct
 | 
						|
    {
 | 
						|
        const struct shell_command *user;                       /**< Current user  */
 | 
						|
        int activeTime;                                         /**< shell activation time  */
 | 
						|
        char *path;                                             /**< Current shell path  */
 | 
						|
    
 | 
						|
    } info;
 | 
						|
    struct
 | 
						|
    {
 | 
						|
        unsigned short length;                                  /**< Input data length  */
 | 
						|
        unsigned short cursor;                                  /**< Current cursor position  */
 | 
						|
        char *buffer;                                           /**< Input buffer  */
 | 
						|
        char *param[SHELL_PARAMETER_MAX_NUMBER];                /**< parameter  */
 | 
						|
        unsigned short bufferSize;                              /**< Input buffer size  */
 | 
						|
        unsigned short paramCount;                              /**< Number of parameters  */
 | 
						|
        int keyValue;                                           /**< Enter key value  */
 | 
						|
    } parser;
 | 
						|
    struct
 | 
						|
    {
 | 
						|
        char *item[SHELL_HISTORY_MAX_NUMBER];                   /**< history record  */
 | 
						|
        unsigned short number;                                  /**< Number of history records  */
 | 
						|
        unsigned short record;                                  /**< Current record location  */
 | 
						|
        signed short offset;                                    /**< Current history offset  */
 | 
						|
    } history;
 | 
						|
    struct
 | 
						|
    {
 | 
						|
        void *base;                                             /**< Command table base address  */
 | 
						|
        unsigned short count;                                   /**< Number of commands  */
 | 
						|
    } commandList;
 | 
						|
    struct
 | 
						|
    {
 | 
						|
        unsigned char isChecked : 1;                            /**< Password verification passed  */
 | 
						|
        unsigned char isActive : 1;                             /**< Current active Shell  */
 | 
						|
        unsigned char tabFlag : 1;                              /**< tab Flag */
 | 
						|
    } status;
 | 
						|
    signed char (*read)(char *);                                /**< shell read function */
 | 
						|
    void (*write)(const char);                                  /**< shell write function */
 | 
						|
} Shell;
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief shell command definition
 | 
						|
 */
 | 
						|
typedef struct shell_command
 | 
						|
{
 | 
						|
    union
 | 
						|
    {
 | 
						|
        struct
 | 
						|
        {
 | 
						|
            unsigned char permission : 8;                       /**< command permission */
 | 
						|
            ShellCommandType type : 4;                          /**< command type*/
 | 
						|
            unsigned char enableUnchecked : 1;                  /**< Enable when Unchecked */
 | 
						|
            unsigned char disableReturn : 1;                    /**< Disable return value output  */
 | 
						|
            unsigned char  readOnly : 1;                        /**< readOnly */
 | 
						|
            unsigned char reserve : 1;                          /**< reserve*/
 | 
						|
            unsigned char paramNum : 4;                         /**< Number of parameters  */
 | 
						|
        } attrs;
 | 
						|
        int value;
 | 
						|
    } attr;                                                     /**< attribution */
 | 
						|
    union
 | 
						|
    {
 | 
						|
        struct
 | 
						|
        {
 | 
						|
            const char *name;                                   /**< name */
 | 
						|
            int (*function)();                                  /**< function  */
 | 
						|
            const char *desc;                                   /**< Command description  */
 | 
						|
        } cmd;                                                  /**< Command definition */
 | 
						|
        struct
 | 
						|
        {
 | 
						|
            const char *name;                                   /**< varibale name */
 | 
						|
            void *value;                                        /**< value of variable */
 | 
						|
            const char *desc;                                   /**< Variable description  */
 | 
						|
        } var;                                                  /**< variable definition */
 | 
						|
        struct
 | 
						|
        {
 | 
						|
            const char *name;                                   /**< user name */
 | 
						|
            const char *password;                               /**< user's password */
 | 
						|
            const char *desc;                                   /**< user's description */
 | 
						|
        } user;                                                 /**< user definition */
 | 
						|
        struct
 | 
						|
        {
 | 
						|
            int value;                                          /**< key value */
 | 
						|
            void (*function)(Shell *);                          /**< funciton for key */
 | 
						|
            const char *desc;                                   /**< key description */
 | 
						|
        } key;                                                  /**< key definition */
 | 
						|
    } data; 
 | 
						|
} ShellCommand;
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Shell node variable attributes 
 | 
						|
 */
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
    void *var;                                                  /**< Variable reference  */
 | 
						|
    int (*get)();                                               /**< Variable get method  */
 | 
						|
    int (*set)();                                               /**< Variable set method  */
 | 
						|
} ShellNodeVarAttr;
 | 
						|
 | 
						|
 | 
						|
#define shellSetPath(_shell, _path)     (_shell)->info.path = _path
 | 
						|
#define shellGetPath(_shell)            ((_shell)->info.path)
 | 
						|
#define KEY_LENGTH       8
 | 
						|
 | 
						|
void shellInit(Shell *shell, char *buffer, unsigned short size);
 | 
						|
unsigned short shellWriteString(Shell *shell, const char *string);
 | 
						|
Shell* shellGetCurrent(void);
 | 
						|
void shellHandler(Shell *shell, char data);
 | 
						|
void shellTask(void *param);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
signed char shellCompanionAdd(Shell *shell, int id, void *object);
 | 
						|
signed char shellCompanionDel(Shell *shell, int id);
 | 
						|
void *shellCompanionGet(Shell *shell, int id);
 | 
						|
 | 
						|
 | 
						|
#endif
 | 
						|
 |