lpsanoy_lenvov hace 2 años
padre
commit
d81ef90b7b

+ 0 - 82
Xianglinghui/05.src/pdu_ctrl_app/letter/os/shell_cfg_user.h

@@ -1,82 +0,0 @@
-/**
- * @file shell_cfg_user.h
- * @author Letter (nevermindzzt@gmail.com)
- * @brief shell config
- * @version 3.0.0
- * @date 2019-12-31
- * 
- * @copyright (c) 2019 Letter
- * 
- */
-
-#ifndef __SHELL_CFG_USER_H__
-#define __SHELL_CFG_USER_H__
-
-#include "stdlib.h"
-unsigned int userGetTick();
-
-/**
- * @brief 是否使用shell伴生对象
- *        一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对象
- */
-#define     SHELL_USING_COMPANION       0
-
-/**
- * @brief 支持shell尾行模式
- */
-#define     SHELL_SUPPORT_END_LINE      1
-
-/**
- * @brief 使用执行未导出函数的功能
- *        启用后,可以通过`exec [addr] [args]`直接执行对应地址的函数
- * @attention 如果地址错误,可能会直接引起程序崩溃
- */
-#define     SHELL_EXEC_UNDEF_FUNC       1
-
-/**
- * @brief 保存命令返回值
- *        开启后会默认定义一个`RETVAL`变量,会保存上一次命令执行的返回值,可以在随后的命令中进行调用
- *        如果命令的`SHELL_CMD_DISABLE_RETURN`标志被设置,则该命令不会更新`RETVAL`
- */
-#define     SHELL_KEEP_RETURN_VALUE     1
-
-/**
- * @brief shell格式化输入的缓冲大小
- *        为0时不使用shell格式化输入
- * @note shell格式化输入会阻塞shellTask, 仅适用于在有操作系统的情况下使用
- */
-#define     SHELL_SCAN_BUFFER          128
-
-/**
- * @brief 获取系统时间(ms)
- *        定义此宏为获取系统Tick,如`HAL_GetTick()`
- * @note 此宏不定义时无法使用双击tab补全命令help,无法使用shell超时锁定
- */
-#define     SHELL_GET_TICK()            userGetTick()
-
-/**
- * @brief shell内存分配
- *        shell本身不需要此接口,若使用shell伴生对象,需要进行定义
- */
-#define     SHELL_MALLOC(size)          malloc(size)
-
-/**
- * @brief shell内存释放
- *        shell本身不需要此接口,若使用shell伴生对象,需要进行定义
- */
-#define     SHELL_FREE(obj)             free(obj)
-
-/**
- * @brief 使用函数签名
- *        使能后,可以在声明命令时,指定函数的签名,shell 会根据函数签名进行参数转换,
- *        而不是自动判断参数的类型,如果参数和函数签名不匹配,会停止执行命令
- */
-#define     SHELL_USING_FUNC_SIGNATURE  1
-
-/**
- * @brief 支持数组参数
- *        使能后,可以在命令中使用数组参数,如`cmd [1,2,3]`
- *        需要使能 `SHELL_USING_FUNC_SIGNATURE` 宏,并且配置 `SHELL_MALLOC`, `SHELL_FREE`
- */
-#define     SHELL_SUPPORT_ARRAY_PARAM   1
-#endif

+ 0 - 81
Xianglinghui/05.src/pdu_ctrl_app/letter/os/shell_port.c

@@ -1,81 +0,0 @@
-/**
- * @file shell_port.c
- * @author Letter (NevermindZZT@gmail.com)
- * @brief 
- * @version 0.1
- * @date 2019-02-22
- * 
- * @copyright (c) 2019 Letter
- * 
- */
-
-#include "shell.h"
-
-
-// #include <stdio.h>
-// #include <dirent.h>
-// #include <unistd.h>
-// #include <stddef.h>
-// #include <string.h>
-#include <sys/time.h>
-// #include <pthread.h>
-
-Shell shell;
-char shellBuffer[512];
-
-
-/**
- * @brief 获取系统tick
- * 
- * @return unsigned int 系统tick
- */
-unsigned int userGetTick()
-{
-    struct timeval tv;
-    gettimeofday(&tv, NULL);
-    return (tv.tv_sec * 1000 + tv.tv_usec / 1000) & 0x7FFFFFFF;
-}
-
-/**
- * @brief 用户shell写
- * 
- * @param data 数据
- */
-unsigned short userShellWrite(char *data, unsigned short len)
-{
-    unsigned short length = len;
-    while (length--)
-    {
-        putchar(*data++);
-    }
-    return len;
-}
-
-/**
- * @brief 用户shell读
- * 
- * @param data 数据
- * @return char 状态
- */
-unsigned short userShellRead(char *data, unsigned short len)
-{
-    unsigned short length = len;
-    while (length--)
-    {
-        *data++ = getchar();
-    }
-    return len;
-}
-
-
-/**
- * @brief 用户shell初始化
- * 
- */
-void userShellInit(void)
-{
-    shell.write = userShellWrite;
-    shell.read = userShellRead;
-    shellInit(&shell, shellBuffer, 512);
-    shellTask(&shell);
-}

+ 0 - 20
Xianglinghui/05.src/pdu_ctrl_app/letter/os/shell_port.h

@@ -1,20 +0,0 @@
-/**
- * @file shell_port.h
- * @author Letter (NevermindZZT@gmail.com)
- * @brief 
- * @version 0.1
- * @date 2019-02-22
- * 
- * @copyright (c) 2019 Letter
- * 
- */
-
-#ifndef __SHELL_PORT_H__
-#define __SHELL_PORT_H__
-
-#include "shell.h"
-
-extern Shell shell;
-
-void userShellInit(void);
-#endif

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 2059
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell.c


+ 0 - 557
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell.h

@@ -1,557 +0,0 @@
-/**
- * @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 "shell_cfg.h"
-
-#define     SHELL_VERSION               "3.2.3"                 /**< 版本号 */
-
-
-/**
- * @brief shell 断言
- * 
- * @param expr 表达式
- * @param action 断言失败操作
- */
-#define     SHELL_ASSERT(expr, action) \
-            if (!(expr)) { \
-                action; \
-            }
-
-#if SHELL_USING_LOCK == 1
-#define     SHELL_LOCK(shell)           shell->lock(shell)
-#define     SHELL_UNLOCK(shell)         shell->unlock(shell)
-#else
-#define     SHELL_LOCK(shell)
-#define     SHELL_UNLOCK(shell)
-#endif /** SHELL_USING_LOCK == 1 */
-/**
- * @brief shell 命令权限
- * 
- * @param permission 权限级别
- */
-#define     SHELL_CMD_PERMISSION(permission) \
-            (permission & 0x000000FF)
-
-/**
- * @brief shell 命令类型
- * 
- * @param type 类型
- */
-#define     SHELL_CMD_TYPE(type) \
-            ((type & 0x0000000F) << 8)
-
-/**
- * @brief 使能命令在未校验密码的情况下使用
- */
-#define     SHELL_CMD_ENABLE_UNCHECKED \
-            (1 << 12)
-
-/**
- * @brief 禁用返回值打印
- */
-#define     SHELL_CMD_DISABLE_RETURN \
-            (1 << 13)
-
-/**
- * @brief 只读属性(仅对变量生效)
- */
-#define     SHELL_CMD_READ_ONLY \
-            (1 << 14)
-
-/**
- * @brief 命令参数数量
- */
-#define     SHELL_CMD_PARAM_NUM(num) \
-            ((num & 0x0000000F)) << 16
-
-#ifndef SHELL_SECTION
-    #if defined(__CC_ARM) || defined(__CLANG_ARM)
-        #define SHELL_SECTION(x)                __attribute__((section(x), aligned(1)))
-    #elif defined (__IAR_SYSTEMS_ICC__)
-        #define SHELL_SECTION(x)                @ x
-    #elif defined(__GNUC__)
-        #define SHELL_SECTION(x)                __attribute__((section(x), aligned(1)))
-    #else
-        #define SHELL_SECTION(x)
-    #endif
-#endif
-
-#ifndef SHELL_USED
-    #if defined(__CC_ARM) || defined(__CLANG_ARM)
-        #define SHELL_USED                      __attribute__((used))
-    #elif defined (__IAR_SYSTEMS_ICC__)
-        #define SHELL_USED                      __root
-    #elif defined(__GNUC__)
-        #define SHELL_USED                      __attribute__((used))
-    #else
-        #define SHELL_USED
-    #endif
-#endif
-
-/**
- * @brief shell float型参数转换
- */
-#define     SHELL_PARAM_FLOAT(x)            (*(float *)(&x))
-
-/**
- * @brief shell 代理函数名
- */
-#define     SHELL_AGENCY_FUNC_NAME(_func)   agency##_func
-
-/**
- * @brief shell代理函数定义
- * 
- * @param _func 被代理的函数
- * @param ... 代理参数
- */
-#define     SHELL_AGENCY_FUNC(_func, ...) \
-            void SHELL_AGENCY_FUNC_NAME(_func)(int p1, int p2, int p3, int p4, int p5, int p6, int p7) \
-            { _func(__VA_ARGS__); }
-
-#if SHELL_USING_CMD_EXPORT == 1
-
-    /**
-     * @brief shell 命令定义
-     * 
-     * @param _attr 命令属性
-     * @param _name 命令名
-     * @param _func 命令函数
-     * @param _desc 命令描述
-     * @param ... 其他参数
-     */
-    #define SHELL_EXPORT_CMD(_attr, _name, _func, _desc, ...) \
-            const char shellCmd##_name[] = #_name; \
-            const char shellDesc##_name[] = #_desc; \
-            SHELL_USED const ShellCommand \
-            shellCommand##_name SHELL_SECTION("shellCommand") =  \
-            { \
-                .attr.value = _attr, \
-                .data.cmd.name = shellCmd##_name, \
-                .data.cmd.function = (int (*)())_func, \
-                .data.cmd.desc = shellDesc##_name, \
-                ##__VA_ARGS__ \
-            }
-
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    /**
-     * @brief shell 命令定义
-     * 
-     * @param _attr 命令属性
-     * @param _name 命令名
-     * @param _func 命令函数
-     * @param _desc 命令描述
-     * @param _sign 命令签名
-     */
-    #define SHELL_EXPORT_CMD_SIGN(_attr, _name, _func, _desc, _sign) \
-            const char shellCmd##_name[] = #_name; \
-            const char shellDesc##_name[] = #_desc; \
-            const char shellSign##_name[] = #_sign; \
-            SHELL_USED const ShellCommand \
-            shellCommand##_name SHELL_SECTION("shellCommand") =  \
-            { \
-                .attr.value = _attr, \
-                .data.cmd.name = shellCmd##_name, \
-                .data.cmd.function = (int (*)())_func, \
-                .data.cmd.desc = shellDesc##_name, \
-                .data.cmd.signature = shellSign##_name \
-            }
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-
-    /**
-     * @brief shell 代理命令定义
-     * 
-     * @param _attr 命令属性
-     * @param _name 命令名
-     * @param _func 命令函数
-     * @param _desc 命令描述
-     * @param ... 代理参数
-     */
-    #define SHELL_EXPORT_CMD_AGENCY(_attr, _name, _func, _desc, ...) \
-            SHELL_AGENCY_FUNC(_func, ##__VA_ARGS__) \
-            SHELL_EXPORT_CMD(_attr, _name, SHELL_AGENCY_FUNC_NAME(_func), _desc)
-
-    /**
-     * @brief shell 变量定义
-     * 
-     * @param _attr 变量属性
-     * @param _name 变量名
-     * @param _value 变量值
-     * @param _desc 变量描述
-     */
-    #define SHELL_EXPORT_VAR(_attr, _name, _value, _desc) \
-            const char shellCmd##_name[] = #_name; \
-            const char shellDesc##_name[] = #_desc; \
-            SHELL_USED const ShellCommand \
-            shellVar##_name SHELL_SECTION("shellCommand") =  \
-            { \
-                .attr.value = _attr, \
-                .data.var.name = shellCmd##_name, \
-                .data.var.value = (void *)_value, \
-                .data.var.desc = shellDesc##_name \
-            }
-
-    /**
-     * @brief shell 用户定义
-     * 
-     * @param _attr 用户属性
-     * @param _name 用户名
-     * @param _password 用户密码
-     * @param _desc 用户描述
-     */
-    #define SHELL_EXPORT_USER(_attr, _name, _password, _desc) \
-            const char shellCmd##_name[] = #_name; \
-            const char shellPassword##_name[] = #_password; \
-            const char shellDesc##_name[] = #_desc; \
-            SHELL_USED const ShellCommand \
-            shellUser##_name SHELL_SECTION("shellCommand") =  \
-            { \
-                .attr.value = _attr|SHELL_CMD_TYPE(SHELL_TYPE_USER), \
-                .data.user.name = shellCmd##_name, \
-                .data.user.password = shellPassword##_name, \
-                .data.user.desc = shellDesc##_name \
-            }
-
-    /**
-     * @brief shell 按键定义
-     * 
-     * @param _attr 按键属性
-     * @param _value 按键键值
-     * @param _func 按键函数
-     * @param _desc 按键描述
-     */
-    #define SHELL_EXPORT_KEY(_attr, _value, _func, _desc) \
-            const char shellDesc##_value[] = #_desc; \
-            SHELL_USED const ShellCommand \
-            shellKey##_value SHELL_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 代理按键定义
-     * 
-     * @param _attr 按键属性
-     * @param _value 按键键值
-     * @param _func 按键函数
-     * @param _desc 按键描述
-     * @param ... 代理参数
-     */
-    #define SHELL_EXPORT_KEY_AGENCY(_attr, _value, _func, _desc, ...) \
-            SHELL_AGENCY_FUNC(_func, ##__VA_ARGS__) \
-            SHELL_EXPORT_KEY(_attr, _value, SHELL_AGENCY_FUNC_NAME(_func), _desc)
-
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    /**
-     * @brief shell 参数解析器定义
-     * 
-     * @param _attr 参数解析器属性
-     * @param _type 参数解析器类型
-     * @param _parser 参数解析器函数
-     * @param _cleaner 参数清理器
-     */
-    #define SHELL_EXPORT_PARAM_PARSER(_attr, _type, _parser, _cleaner) \
-            const char shellDesc##_parser[] = #_type; \
-            SHELL_USED const ShellCommand \
-            shellCommand##_parser SHELL_SECTION("shellCommand") = \
-            { \
-                .attr.value = _attr|SHELL_CMD_TYPE(SHELL_TYPE_PARAM_PARSER), \
-                .data.paramParser.type = shellDesc##_parser, \
-                .data.paramParser.parser = (int (*)(char *, void **))_parser, \
-                .data.paramParser.cleaner = (int (*)(void *))_cleaner \
-            }
-#endif
-
-#else
-    /**
-     * @brief shell 命令item定义
-     * 
-     * @param _attr 命令属性
-     * @param _name 命令名
-     * @param _func 命令函数
-     * @param _desc 命令描述
-     */
-    #define SHELL_CMD_ITEM(_attr, _name, _func, _desc) \
-            { \
-                .attr.value = _attr, \
-                .data.cmd.name = #_name, \
-                .data.cmd.function = (int (*)())_func, \
-                .data.cmd.desc = #_desc \
-            }
-
-    /**
-     * @brief shell 变量item定义
-     * 
-     * @param _attr 变量属性
-     * @param _name 变量名
-     * @param _value 变量值
-     * @param _desc 变量描述
-     */
-    #define SHELL_VAR_ITEM(_attr, _name, _value, _desc) \
-            { \
-                .attr.value = _attr, \
-                .data.var.name = #_name, \
-                .data.var.value = (void *)_value, \
-                .data.var.desc = #_desc \
-            }
-
-    /**
-     * @brief shell 用户item定义
-     * 
-     * @param _attr 用户属性
-     * @param _name 用户名
-     * @param _password 用户密码
-     * @param _desc 用户描述
-     */
-    #define SHELL_USER_ITEM(_attr, _name, _password, _desc) \
-            { \
-                .attr.value = _attr|SHELL_CMD_TYPE(SHELL_TYPE_USER), \
-                .data.user.name = #_name, \
-                .data.user.password = #_password, \
-                .data.user.desc = #_desc \
-            }
-
-    /**
-     * @brief shell 按键item定义
-     * 
-     * @param _attr 按键属性
-     * @param _value 按键键值
-     * @param _func 按键函数
-     * @param _desc 按键描述
-     */
-    #define SHELL_KEY_ITEM(_attr, _value, _func, _desc) \
-            { \
-                .attr.value = _attr|SHELL_CMD_TYPE(SHELL_TYPE_KEY), \
-                .data.key.value = _value, \
-                .data.key.function = (void (*)(Shell *))_func, \
-                .data.key.desc = #_desc \
-            }
-
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    /**
-     * @brief shell 参数解析器item定义
-     * 
-     * @param _attr 参数解析器属性
-     * @param _type 参数解析器类型
-     * @param _parser 参数解析器函数
-     * @param _cleaner 参数清理器
-     */
-    #define SHELL_PARAM_PARSER_ITEM(_attr, _type, _parser, _cleaner) \
-            { \
-                .attr.value = _attr|SHELL_CMD_TYPE(SHELL_TYPE_PARAM_PARSER), \
-                .data.paramParser.type = #_type, \
-                .data.paramParser.parser = (int (*)(char *, void **))_parser, \
-                .data.paramParser.cleaner = (int (*)(void *))_cleaner \
-            }
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-
-    #define SHELL_EXPORT_CMD(_attr, _name, _func, _desc)
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    #define SHELL_EXPORT_CMD_SIGN(_attr, _name, _func, _desc, _sign)
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-    #define SHELL_EXPORT_CMD_AGENCY(_attr, _name, _func, _desc, ...)
-    #define SHELL_EXPORT_VAR(_attr, _name, _value, _desc)
-    #define SHELL_EXPORT_USER(_attr, _name, _password, _desc)
-    #define SHELL_EXPORT_KEY(_attr, _value, _func, _desc)
-    #define SHELL_EXPORT_KEY_AGENCY(_attr, _name, _func, _desc, ...)
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    #define SHELL_EXPORT_PARAM_PARSER(_attr, _type, _parser, _cleaner)
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-#endif /** SHELL_USING_CMD_EXPORT == 1 */
-
-/**
- * @brief shell command类型
- */
-typedef enum
-{
-    SHELL_TYPE_CMD_MAIN = 0,                                    /**< main形式命令 */
-    SHELL_TYPE_CMD_FUNC,                                        /**< C函数形式命令 */
-    SHELL_TYPE_VAR_INT,                                         /**< int型变量 */
-    SHELL_TYPE_VAR_SHORT,                                       /**< short型变量 */
-    SHELL_TYPE_VAR_CHAR,                                        /**< char型变量 */
-    SHELL_TYPE_VAR_STRING,                                      /**< string型变量 */
-    SHELL_TYPE_VAR_POINT,                                       /**< 指针型变量 */
-    SHELL_TYPE_VAR_NODE,                                        /**< 节点变量 */
-    SHELL_TYPE_USER,                                            /**< 用户 */
-    SHELL_TYPE_KEY,                                             /**< 按键 */
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    SHELL_TYPE_PARAM_PARSER,                                    /**< 参数解析器 */
-#endif
-} ShellCommandType;
-
-
-/**
- * @brief Shell定义
- */
-typedef struct shell_def
-{
-    struct
-    {
-        const struct shell_command *user;                       /**< 当前用户 */
-        int activeTime;                                         /**< shell激活时间 */
-        char *path;                                             /**< 当前shell路径 */
-    #if SHELL_USING_COMPANION == 1
-        struct shell_companion_object *companions;              /**< 伴生对象 */
-    #endif
-    #if SHELL_KEEP_RETURN_VALUE == 1
-        int retVal;                                             /**< 返回值 */
-    #endif
-    } info;
-    struct
-    {
-        unsigned short length;                                  /**< 输入数据长度 */
-        unsigned short cursor;                                  /**< 当前光标位置 */
-        char *buffer;                                           /**< 输入缓冲 */
-        char *param[SHELL_PARAMETER_MAX_NUMBER];                /**< 参数 */
-        unsigned short bufferSize;                              /**< 输入缓冲大小 */
-        unsigned short paramCount;                              /**< 参数数量 */
-        int keyValue;                                           /**< 输入按键键值 */
-    } parser;
-#if SHELL_HISTORY_MAX_NUMBER > 0
-    struct
-    {
-        char *item[SHELL_HISTORY_MAX_NUMBER];                   /**< 历史记录 */
-        unsigned short number;                                  /**< 历史记录数 */
-        unsigned short record;                                  /**< 当前记录位置 */
-        signed short offset;                                    /**< 当前历史记录偏移 */
-    } history;
-#endif /** SHELL_HISTORY_MAX_NUMBER > 0 */
-    struct
-    {
-        void *base;                                             /**< 命令表基址 */
-        unsigned short count;                                   /**< 命令数量 */
-    } commandList;
-    struct
-    {
-        unsigned char isChecked : 1;                            /**< 密码校验通过 */
-        unsigned char isActive : 1;                             /**< 当前活动Shell */
-        unsigned char tabFlag : 1;                              /**< tab标志 */
-    } status;
-    signed short (*read)(char *, unsigned short);               /**< shell读函数 */
-    signed short (*write)(char *, unsigned short);              /**< shell写函数 */
-#if SHELL_USING_LOCK == 1
-    int (*lock)(struct shell_def *);                              /**< shell 加锁 */
-    int (*unlock)(struct shell_def *);                            /**< shell 解锁 */
-#endif
-} Shell;
-
-
-/**
- * @brief shell command定义
- */
-typedef struct shell_command
-{
-    union
-    {
-        struct
-        {
-            unsigned char permission : 8;                       /**< command权限 */
-            ShellCommandType type : 4;                          /**< command类型 */
-            unsigned char enableUnchecked : 1;                  /**< 在未校验密码的情况下可用 */
-            unsigned char disableReturn : 1;                    /**< 禁用返回值输出 */
-            unsigned char readOnly : 1;                         /**< 只读 */
-            unsigned char reserve : 1;                          /**< 保留 */
-            unsigned char paramNum : 4;                         /**< 参数数量 */
-        } attrs;
-        int value;
-    } attr;                                                     /**< 属性 */
-    union
-    {
-        struct
-        {
-            const char *name;                                   /**< 命令名 */
-            int (*function)();                                  /**< 命令执行函数 */
-            const char *desc;                                   /**< 命令描述 */
-        #if SHELL_USING_FUNC_SIGNATURE == 1
-            const char *signature;                              /**< 函数签名 */
-        #endif
-        } cmd;                                                  /**< 命令定义 */
-        struct
-        {
-            const char *name;                                   /**< 变量名 */
-            void *value;                                        /**< 变量值 */
-            const char *desc;                                   /**< 变量描述 */
-        } var;                                                  /**< 变量定义 */
-        struct
-        {
-            const char *name;                                   /**< 用户名 */
-            const char *password;                               /**< 用户密码 */
-            const char *desc;                                   /**< 用户描述 */
-        } user;                                                 /**< 用户定义 */
-        struct
-        {
-            int value;                                          /**< 按键键值 */
-            void (*function)(Shell *);                          /**< 按键执行函数 */
-            const char *desc;                                   /**< 按键描述 */
-        } key;                                                  /**< 按键定义 */
-#if SHELL_USING_FUNC_SIGNATURE == 1
-        struct
-        {
-            const char *type;                                   /**< 参数类型 */
-            int (*parser)(char *, void **);                     /**< 解析函数 */
-            int (*cleaner)(void *);                             /**< 清理器 */
-        } paramParser;                                          /**< 参数解析器 */
-#endif
-    } data;
-} ShellCommand;
-
-/**
- * @brief shell节点变量属性
- */
-typedef struct
-{
-    void *var;                                                  /**< 变量引用 */
-    int (*get)();                                               /**< 变量get方法 */
-    int (*set)();                                               /**< 变量set方法 */
-} ShellNodeVarAttr;
-
-
-#define shellSetPath(_shell, _path)     (_shell)->info.path = _path
-#define shellGetPath(_shell)            ((_shell)->info.path)
-
-#define shellDeInit(shell)              shellRemove(shell)
-
-void shellInit(Shell *shell, char *buffer, unsigned short size);
-void shellRemove(Shell *shell);
-unsigned short shellWriteString(Shell *shell, const char *string);
-void shellPrint(Shell *shell, const char *fmt, ...);
-void shellScan(Shell *shell, char *fmt, ...);
-Shell* shellGetCurrent(void);
-void shellHandler(Shell *shell, char data);
-void shellWriteEndLine(Shell *shell, char *buffer, int len);
-void shellTask(void *param);
-int shellRun(Shell *shell, const char *cmd);
-
-
-
-#if SHELL_USING_COMPANION == 1
-/**
- * @brief shell伴生对象定义
- */
-typedef struct shell_companion_object
-{
-    int id;                                                     /**< 伴生对象ID */
-    void *obj;                                                  /**< 伴生对象 */
-    struct shell_companion_object *next;                        /**< 下一个伴生对象 */
-} ShellCompanionObj;
-
-
-signed char shellCompanionAdd(Shell *shell, int id, void *object);
-signed char shellCompanionDel(Shell *shell, int id);
-void *shellCompanionGet(Shell *shell, int id);
-#endif
-
-#endif

+ 0 - 267
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell_cfg.h

@@ -1,267 +0,0 @@
-/**
- * @file shell_cfg.h
- * @author Letter (nevermindzzt@gmail.com)
- * @brief shell config
- * @version 3.0.0
- * @date 2019-12-31
- * 
- * @copyright (c) 2019 Letter
- * 
- */
-
-#ifndef __SHELL_CFG_H__
-#define __SHELL_CFG_H__
-
-#ifdef SHELL_CFG_USER
-#include SHELL_CFG_USER
-#endif
-
-#ifndef SHELL_TASK_WHILE
-/**
- * @brief 是否使用默认shell任务while循环
- *        使能此宏,则`shellTask()`函数会一直循环读取输入,一般使用操作系统建立shell
- *        任务时使能此宏,关闭此宏的情况下,一般适用于无操作系统,在主循环中调用`shellTask()`
- */
-#define     SHELL_TASK_WHILE            1
-#endif /** SHELL_TASK_WHILE */
-
-#ifndef SHELL_USING_CMD_EXPORT
-/**
- * @brief 是否使用命令导出方式
- *        使能此宏后,可以使用`SHELL_EXPORT_CMD()`等导出命令
- *        定义shell命令,关闭此宏的情况下,需要使用命令表的方式
- */
-#define     SHELL_USING_CMD_EXPORT      0
-#endif /** SHELL_USING_CMD_EXPORT */
-
-#ifndef SHELL_USING_COMPANION
-/**
- * @brief 是否使用shell伴生对象
- *        一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对象
- */
-#define     SHELL_USING_COMPANION       0
-#endif /** SHELL_USING_COMPANION */
-
-#ifndef SHELL_SUPPORT_END_LINE
-/**
- * @brief 支持shell尾行模式
- */
-#define     SHELL_SUPPORT_END_LINE      0
-#endif /** SHELL_SUPPORT_END_LINE */
-
-#ifndef SHELL_HELP_LIST_USER
-/**
- * @brief 是否在输出命令列表中列出用户
- */
-#define     SHELL_HELP_LIST_USER        0
-#endif /** SHELL_HELP_LIST_USER */
-
-#ifndef SHELL_HELP_LIST_VAR
-/**
- * @brief 是否在输出命令列表中列出变量
- */
-#define     SHELL_HELP_LIST_VAR         0
-#endif /** SHELL_HELP_LIST_VAR */
-
-#ifndef SHELL_HELP_LIST_KEY
-/**
- * @brief 是否在输出命令列表中列出按键
- */
-#define     SHELL_HELP_LIST_KEY         0
-#endif /** SHELL_HELP_LIST_KEY */
-
-#ifndef SHELL_HELP_SHOW_PERMISSION
-/**
- * @brief 是否在输出命令列表中展示命令权限
- */
-#define     SHELL_HELP_SHOW_PERMISSION  1
-#endif /** SHELL_HELP_SHOW_PERMISSION */
-
-#ifndef SHELL_ENTER_LF
-/**
- * @brief 使用LF作为命令行回车触发
- *        可以和SHELL_ENTER_CR同时开启
- */
-#define     SHELL_ENTER_LF              1
-#endif /** SHELL_ENTER_LF */
-
-#ifndef SHELL_ENTER_CR
-/**
- * @brief 使用CR作为命令行回车触发
- *        可以和SHELL_ENTER_LF同时开启
- */
-#define     SHELL_ENTER_CR              1
-#endif /** SHELL_ENTER_CR */
-
-#ifndef SHELL_ENTER_CRLF
-/**
- * @brief 使用CRLF作为命令行回车触发
- *        不可以和SHELL_ENTER_LF或SHELL_ENTER_CR同时开启
- */
-#define     SHELL_ENTER_CRLF            0
-#endif /** SHELL_ENTER_CRLF */
-
-#ifndef SHELL_EXEC_UNDEF_FUNC
-/**
- * @brief 使用执行未导出函数的功能
- *        启用后,可以通过`exec [addr] [args]`直接执行对应地址的函数
- * @attention 如果地址错误,可能会直接引起程序崩溃
- */
-#define     SHELL_EXEC_UNDEF_FUNC       0
-#endif /** SHELL_EXEC_UNDEF_FUNC */
-
-#ifndef SHELL_PARAMETER_MAX_NUMBER
-/**
- * @brief shell命令参数最大数量
- *        包含命令名在内,超过16个参数并且使用了参数自动转换的情况下,需要修改源码
- */
-#define     SHELL_PARAMETER_MAX_NUMBER  8
-#endif /** SHELL_PARAMETER_MAX_NUMBER */
-
-#ifndef SHELL_HISTORY_MAX_NUMBER
-/**
- * @brief 历史命令记录数量
- */
-#define     SHELL_HISTORY_MAX_NUMBER    5
-#endif /** SHELL_HISTORY_MAX_NUMBER */
-
-#ifndef SHELL_DOUBLE_CLICK_TIME
-/**
- * @brief 双击间隔(ms)
- *        使能宏`SHELL_LONG_HELP`后此宏生效,定义双击tab补全help的时间间隔
- */
-#define     SHELL_DOUBLE_CLICK_TIME     200
-#endif /** SHELL_DOUBLE_CLICK_TIME */
-
-#ifndef SHELL_QUICK_HELP
-/**
- * @brief 快速帮助
- *        作用于双击tab的场景,当使能此宏时,双击tab不会对命令进行help补全,而是直接显示对应命令的帮助信息
- */
-#define     SHELL_QUICK_HELP            1
-#endif /** SHELL_QUICK_HELP */
-
-#ifndef SHELL_KEEP_RETURN_VALUE
-/**
- * @brief 保存命令返回值
- *        开启后会默认定义一个`RETVAL`变量,会保存上一次命令执行的返回值,可以在随后的命令中进行调用
- *        如果命令的`SHELL_CMD_DISABLE_RETURN`标志被设置,则该命令不会更新`RETVAL`
- */
-#define     SHELL_KEEP_RETURN_VALUE     0
-#endif /** SHELL_KEEP_RETURN_VALUE */
-
-#ifndef SHELL_MAX_NUMBER
-/**
- * @brief 管理的最大shell数量
- */
-#define     SHELL_MAX_NUMBER            5
-#endif /** SHELL_MAX_NUMBER */
-
-#ifndef SHELL_PRINT_BUFFER
-/**
- * @brief shell格式化输出的缓冲大小
- *        为0时不使用shell格式化输出
- */
-#define     SHELL_PRINT_BUFFER          128
-#endif /** SHELL_PRINT_BUFFER */
-
-#ifndef SHELL_SCAN_BUFFER
-/**
- * @brief shell格式化输入的缓冲大小
- *        为0时不使用shell格式化输入
- * @note shell格式化输入会阻塞shellTask, 仅适用于在有操作系统的情况下使用
- */
-#define     SHELL_SCAN_BUFFER          0
-#endif /** SHELL_SCAN_BUFFER */
-
-#ifndef SHELL_GET_TICK
-/**
- * @brief 获取系统时间(ms)
- *        定义此宏为获取系统Tick,如`HAL_GetTick()`
- * @note 此宏不定义时无法使用双击tab补全命令help,无法使用shell超时锁定
- */
-#define     SHELL_GET_TICK()            0
-#endif /** SHELL_GET_TICK */
-
-#ifndef SHELL_USING_LOCK
-/**
- * @brief 使用锁
- * @note 使用shell锁时,需要对加锁和解锁进行实现
- */
-#define     SHELL_USING_LOCK            0
-#endif /** SHELL_USING_LOCK */
-
-#ifndef SHELL_MALLOC
-/**
- * @brief shell内存分配
- *        shell本身不需要此接口,若使用shell伴生对象,需要进行定义
- */
-#define     SHELL_MALLOC(size)          0
-#endif /** SHELL_MALLOC */
-
-#ifndef SHELL_FREE
-/**
- * @brief shell内存释放
- *        shell本身不需要此接口,若使用shell伴生对象,需要进行定义
- */
-#define     SHELL_FREE(obj)             0
-#endif /** SHELL_FREE */
-
-#ifndef SHELL_SHOW_INFO
-/**
- * @brief 是否显示shell信息
- */
-#define     SHELL_SHOW_INFO             1
-#endif /** SHELL_SHOW_INFO */
-
-#ifndef SHELL_CLS_WHEN_LOGIN
-/**
- * @brief 是否在登录后清除命令行
- */
-#define     SHELL_CLS_WHEN_LOGIN        1
-#endif /** SHELL_CLS_WHEN_LOGIN */
-
-#ifndef SHELL_DEFAULT_USER
-/**
- * @brief shell默认用户
- */
-#define     SHELL_DEFAULT_USER          "letter"
-#endif /** SHELL_DEFAULT_USER */
-
-#ifndef SHELL_DEFAULT_USER_PASSWORD
-/**
- * @brief shell默认用户密码
- *        若默认用户不需要密码,设为""
- */
-#define     SHELL_DEFAULT_USER_PASSWORD ""
-#endif /** SHELL_DEFAULT_USER_PASSWORD */
-
-#ifndef SHELL_LOCK_TIMEOUT
-/**
- * @brief shell自动锁定超时
- *        shell当前用户密码有效的时候生效,超时后会自动重新锁定shell
- *        设置为0时关闭自动锁定功能,时间单位为`SHELL_GET_TICK()`单位
- * @note 使用超时锁定必须保证`SHELL_GET_TICK()`有效
- */
-#define     SHELL_LOCK_TIMEOUT          0 * 60 * 1000
-#endif /** SHELL_LOCK_TIMEOUT */
-
-#ifndef SHELL_USING_FUNC_SIGNATURE
-/**
- * @brief 使用函数签名
- *        使能后,可以在声明命令时,指定函数的签名,shell 会根据函数签名进行参数转换,
- *        而不是自动判断参数的类型,如果参数和函数签名不匹配,会停止执行命令
- */
-#define     SHELL_USING_FUNC_SIGNATURE  0
-#endif /** SHELL_USING_FUNC_SIGNATURE */
-
-#ifndef SHELL_SUPPORT_ARRAY_PARAM
-/**
- * @brief 支持数组参数
- *        使能后,可以在命令中使用数组参数,如`cmd [1,2,3]`
- *        需要使能 `SHELL_USING_FUNC_SIGNATURE` 宏,并且配置 `SHELL_MALLOC`, `SHELL_FREE`
- */
-#define     SHELL_SUPPORT_ARRAY_PARAM   0
-#endif /** SHELL_SUPPORT_ARRAY_PARAM */
-
-#endif

+ 0 - 114
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell_cmd_list.c

@@ -1,114 +0,0 @@
-/**
- * @file shell_cmd_list.c
- * @author Letter (NevermindZZT@gmail.com)
- * @brief shell cmd list
- * @version 3.0.0
- * @date 2020-01-17
- * 
- * @copyright (c) 2020 Letter
- * 
- */
-
-#include "shell.h"
-#include "elog.h"
-#if SHELL_USING_CMD_EXPORT != 1
-
-extern int shellSetVar(char *name, int value);
-extern void shellUp(Shell *shell);
-extern void shellDown(Shell *shell);
-extern void shellRight(Shell *shell);
-extern void shellLeft(Shell *shell);
-extern void shellTab(Shell *shell);
-extern void shellBackspace(Shell *shell);
-extern void shellDelete(Shell *shell);
-extern void shellEnter(Shell *shell);
-extern void shellHelp(int argc, char *argv[]);
-extern void shellUsers(void);
-extern void shellCmds(void);
-extern void shellVars(void);
-extern void shellKeys(void);
-extern void shellClear(void);
-#if SHELL_EXEC_UNDEF_FUNC == 1
-extern int shellExecute(int argc, char *argv[]);
-#endif
-
-SHELL_AGENCY_FUNC(shellRun, shellGetCurrent(), (const char *)p1);
-
-
-
-void shellLogTest(int argc, char *argv[])
-{
-    log_i("run shell test.");
-}
-
-
-/**
- * @brief shell命令表
- * 
- */
-const ShellCommand shellCommandList[] = 
-{
-    {.attr.value=SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_USER),
-    .data.user.name = SHELL_DEFAULT_USER,
-    .data.user.password = SHELL_DEFAULT_USER_PASSWORD,
-    .data.user.desc = "default user"},
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
-                   setVar, shellSetVar, set var),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0), 0x1B5B4100, shellUp, up),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0), 0x1B5B4200, shellDown, down),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x1B5B4300, shellRight, right),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x1B5B4400, shellLeft, left),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0), 0x09000000, shellTab, tab),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x08000000, shellBackspace, backspace),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x7F000000, shellDelete, delete),
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x1B5B337E, shellDelete, delete),
-#if SHELL_ENTER_LF == 1
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x0A000000, shellEnter, enter),
-#endif
-#if SHELL_ENTER_CR == 1
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x0D000000, shellEnter, enter),
-#endif
-#if SHELL_ENTER_CRLF == 1
-    SHELL_KEY_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED,
-                   0x0D0A0000, shellEnter, enter),
-#endif
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_DISABLE_RETURN,
-                   help, shellHelp, show command info\r\nhelp [cmd]),
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
-                   users, shellUsers, list all user),
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
-                   cmds, shellCmds, list all cmd),
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
-                   vars, shellVars, list all var),
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
-                   keys, shellKeys, list all key),
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
-                   clear, shellClear, clear console),
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
-                   sh, SHELL_AGENCY_FUNC_NAME(shellRun), run command directly),
-#if SHELL_EXEC_UNDEF_FUNC == 1
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_DISABLE_RETURN,
-                   exec, shellExecute, execute function undefined),
-#endif
-
-    SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_DISABLE_RETURN,
-                   log_test, shellLogTest, shell log test),
-
-};
-
-
-/**
- * @brief shell命令表大小
- * 
- */
-const unsigned short shellCommandCount 
-    = sizeof(shellCommandList) / sizeof(ShellCommand);
-
-#endif

+ 0 - 87
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell_companion.c

@@ -1,87 +0,0 @@
-/**
- * @file shell_companion.c
- * @author Letter (nevermindzzt@gmail.com)
- * @brief shell companion object support
- * @version 3.0.3
- * @date 2020-07-22
- * 
- * @copyright (c) 2020 Letter
- * 
- */
- #include "shell.h"
- 
-#if SHELL_USING_COMPANION == 1
-/**
- * @brief shell添加伴生对象
- * 
- * @param shell shell对象
- * @param id 伴生对象ID
- * @param object 伴生对象
- * @return signed char 0 添加成功 -1 添加失败
- */
-signed char shellCompanionAdd(Shell *shell, int id, void *object)
-{
-    ShellCompanionObj *companions = shell->info.companions;
-    ShellCompanionObj *node = SHELL_MALLOC(sizeof(ShellCompanionObj));
-    SHELL_ASSERT(node, return -1);
-    node->id = id;
-    node->obj = object;
-    node->next = companions;
-    shell->info.companions = node;
-    return 0;
-}
-
-/**
- * @brief shell删除伴生对象
- * 
- * @param shell shell对象
- * @param id 伴生对象ID
- * @return signed char 0 删除成功 -1 无匹配对象
- */
-signed char shellCompanionDel(Shell *shell, int id)
-{
-    ShellCompanionObj *companions = shell->info.companions;
-    ShellCompanionObj *front = companions;
-    while (companions)
-    {
-        if (companions->id == id)
-        {
-            if (companions == shell->info.companions && !(companions->next)) 
-            {
-                shell->info.companions = (void *)0;
-            }
-            else
-            {
-                front->next = companions->next;
-            }
-            SHELL_FREE(companions);
-            return 0;
-        }
-        front = companions;
-        companions = companions->next;
-    }
-    return -1;
-}
-
-/**
- * @brief shell获取伴生对象
- * 
- * @param shell shell对象
- * @param id 伴生对象ID
- * @return void* 伴生对象,无匹配对象时返回NULL
- */
-void *shellCompanionGet(Shell *shell, int id)
-{
-    SHELL_ASSERT(shell, return (void *)0);
-    ShellCompanionObj *companions = shell->info.companions;
-    while (companions)
-    {
-        if (companions->id == id)
-        {
-            return companions->obj;
-        }
-        companions = companions->next;
-    }
-    return (void *)0;
-}
-#endif /** SHELL_USING_COMPANION == 1 */

+ 0 - 847
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell_ext.c

@@ -1,847 +0,0 @@
-/**
- * @file shell_ext.c
- * @author Letter (NevermindZZT@gmail.com)
- * @brief shell extensions
- * @version 3.0.0
- * @date 2019-12-31
- * 
- * @copyright (c) 2019 Letter
- * 
- */
-
-#include "shell_cfg.h"
-#include "shell.h"
-#include "shell_ext.h"
-#include "string.h"
-
-extern ShellCommand* shellSeekCommand(Shell *shell,
-                                      const char *cmd,
-                                      ShellCommand *base,
-                                      unsigned short compareLength);
-extern int shellGetVarValue(Shell *shell, ShellCommand *command);
-
-#if SHELL_SUPPORT_ARRAY_PARAM == 1
-extern int shellSplit(char *string, unsigned short strLen, char *array[], char splitKey, short maxNum);
-
-static int shellExtParseArray(Shell *shell, char *string, char *type, size_t *result);
-static int shellExtCleanerArray(Shell *shell, char *type, void *param);
-#endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-
-#if SHELL_USING_FUNC_SIGNATURE == 1
-/**
- * @brief 获取下一个参数类型
- * 
- * @param signature 函数签名
- * @param index 参数遍历在签名中的起始索引
- * @param type 获取到的参数类型
- * 
- * @return int 下一个参数在签名中的索引
- */
-static int shellGetNextParamType(const char *signature, int index, char *type)
-{
-    const char *p = signature + index;
-#if SHELL_SUPPORT_ARRAY_PARAM == 1
-    if (*p == '[')
-    {
-        *type++ = *p++;
-        index++;
-    }
-#endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-    if (*p == 'L')
-    {
-        while (*p != ';' && *p != 0)
-        {
-            *type++ = *p++;
-            index++;
-        }
-        *type++ = *p++;
-        index++;
-    }
-    else if (*p != 0)
-    {
-        *type++ = *p;
-        index++;
-    }
-    *type = '\0';
-    return index;
-}
-
-/**
- * @brief 获取期待的参数个数
- * 
- * @param signature 函数签名
- * 
- * @return int 参数个数
- */
-static int shellGetParamNumExcept(const char *signature)
-{
-    int num = 0;
-    const char *p = signature;
-    
-    while (*p)
-    {
-    #if SHELL_SUPPORT_ARRAY_PARAM == 1
-        if (*p == '[')
-        {
-            p++;
-        }
-    #endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-        if (*p == 'L')
-        {
-            while (*p != ';' && *p != 0)
-            {
-                p++;
-            }
-            p++;
-        }
-        else
-        {
-            p++;
-        }
-        num++;
-    }
-    return num;
-}
-#endif
-
-/**
- * @brief 判断数字进制
- * 
- * @param string 参数字符串
- * @return ShellNumType 进制
- */
-static ShellNumType shellExtNumType(char *string)
-{
-    char *p = string;
-    ShellNumType type = NUM_TYPE_DEC;
-
-    if ((*p == '0') && ((*(p + 1) == 'x') || (*(p + 1) == 'X')))
-    {
-        type = NUM_TYPE_HEX;
-    }
-    else if ((*p == '0') && ((*(p + 1) == 'b') || (*(p + 1) == 'B')))
-    {
-        type = NUM_TYPE_BIN;
-    }
-    else if (*p == '0')
-    {
-        type = NUM_TYPE_OCT;
-    }
-    
-    while (*p++)
-    {
-        if (*p == '.' && *(p + 1) != 0)
-        {
-            type = NUM_TYPE_FLOAT;
-            break;
-        }
-    }
-
-    return type;
-}
-
-
-/**
- * @brief 字符转数字
- * 
- * @param code 字符
- * @return char 数字
- */
-static char shellExtToNum(char code)
-{
-    if ((code >= '0') && (code <= '9'))
-    {
-        return code -'0';
-    }
-    else if ((code >= 'a') && (code <= 'f'))
-    {
-        return code - 'a' + 10;
-    }
-    else if ((code >= 'A') && (code <= 'F'))
-    {
-        return code - 'A' + 10;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-
-/**
- * @brief 解析字符参数
- * 
- * @param string 字符串参数
- * @return char 解析出的字符
- */
-static char shellExtParseChar(char *string)
-{
-    char *p = (*string == '\'') ? (string + 1) : string;
-    char value = 0;
-
-    if (*p == '\\')
-    {
-        switch (*(p + 1))
-        {
-        case 'b':
-            value = '\b';
-            break;
-        case 'r':
-            value = '\r';
-            break;
-        case 'n':
-            value = '\n';
-            break;
-        case 't':
-            value = '\t';
-            break;
-        case '0':
-            value = 0;
-            break;
-        default:
-            value = *(p + 1);
-            break;
-        }
-    }
-    else
-    {
-        value = *p;
-    }
-    return value;
-}
-
-
-/**
- * @brief 解析字符串参数
- * 
- * @param string 字符串参数
- * @return char* 解析出的字符串
- */
-static char* shellExtParseString(char *string)
-{
-    char *p = string;
-    unsigned short index = 0;
-
-    if (*string == '\"')
-    {
-        p = ++string;
-    }
-
-    while (*p)
-    {
-        if (*p == '\\')
-        {
-            *(string + index) = shellExtParseChar(p);
-            p++;
-        }
-        else if (*p == '\"')
-        {
-            *(string + index) = 0;
-        }
-        else
-        {
-            *(string + index) = *p;
-        }
-        p++;
-        index ++;
-    }
-    *(string + index) = 0;
-    return string;
-}
-
-
-/**
- * @brief 解析数字参数
- * 
- * @param string 字符串参数
- * @return size_t 解析出的数字
- */
-static size_t shellExtParseNumber(char *string)
-{
-    ShellNumType type = NUM_TYPE_DEC;
-    char radix = 10;
-    char *p = string;
-    char offset = 0;
-    signed char sign = 1;
-    size_t valueInt = 0;
-    float valueFloat = 0.0;
-    size_t devide = 0;
-
-    if (*string == '-')
-    {
-        sign = -1;
-    }
-
-    type = shellExtNumType(string + ((sign == -1) ? 1 : 0));
-
-    switch ((char)type)
-    {
-    case NUM_TYPE_HEX:
-        radix = 16;
-        offset = 2;
-        break;
-    
-    case NUM_TYPE_OCT:
-        radix = 8;
-        offset = 1;
-        break;
-
-    case NUM_TYPE_BIN:
-        radix = 2;
-        offset = 2;
-        break;
-    
-    default:
-        break;
-    }
-
-    p = string + offset + ((sign == -1) ? 1 : 0);
-
-    while (*p)
-    {
-        if (*p == '.')
-        {
-            devide = 1;
-            p++;
-            continue;
-        }
-        valueInt = valueInt * radix + shellExtToNum(*p);
-        devide *= 10;
-        p++;
-    }
-    if (type == NUM_TYPE_FLOAT && devide != 0)
-    {
-        valueFloat = (float)valueInt / devide * sign;
-        return *(size_t *)(&valueFloat);
-    }
-    else
-    {
-        return valueInt * sign;
-    }
-}
-
-
-/**
- * @brief 解析变量参数
- * 
- * @param shell shell对象
- * @param var 变量
- * @return size_t 变量值
- */
-static size_t shellExtParseVar(Shell *shell, char *var)
-{
-    ShellCommand *command = shellSeekCommand(shell,
-                                             var + 1,
-                                             shell->commandList.base,
-                                             0);
-    if (command)
-    {
-        return shellGetVarValue(shell, command);
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-
-/**
- * @brief 解析参数
- * 
- * @param shell shell对象
- * @param string 参数
- * @param type 参数类型
- * @param result 解析结果
- * 
- * @return int 0 解析成功 --1 解析失败
- */
-int shellExtParsePara(Shell *shell, char *string, char *type, size_t *result)
-{
-    if (type == NULL || (*string == '$' && *(string + 1)))
-    {
-        if (*string == '\'' && *(string + 1))
-        {
-            *result = (size_t)shellExtParseChar(string);
-            return 0;
-        }
-        else if (*string == '-' || (*string >= '0' && *string <= '9'))
-        {
-            *result = shellExtParseNumber(string);
-            return 0;
-        }
-        else if (*string == '$' && *(string + 1))
-        {
-            *result = shellExtParseVar(shell, string);
-            return 0;
-        }
-        else if (*string)
-        {
-            *result = (size_t)shellExtParseString(string);
-            return 0;
-        }
-    }
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    else
-    {
-        if (*string == '$' && *(string + 1))
-        {
-            *result = shellExtParseVar(shell, string);
-            return 0;
-        }
-    #if SHELL_SUPPORT_ARRAY_PARAM == 1
-        else if (type[0] == '[')
-        {
-            return shellExtParseArray(shell, string, type, result);
-        }
-    #endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-        else if (strcmp("c", type) == 0)
-        {
-            *result = (size_t)shellExtParseChar(string);
-            return 0;
-        }
-        else if (strcmp("q", type) == 0
-                 || strcmp("h", type) == 0
-                 || strcmp("i", type) == 0
-                 || strcmp("f", type) == 0
-                 || strcmp("p", type) == 0)
-        {
-            *result = shellExtParseNumber(string);
-            return 0;
-        }
-        else if (strcmp("s", type) == 0)
-        {
-            *result = (size_t)shellExtParseString(string);
-            return 0;
-        }
-        else
-        {
-            ShellCommand *command = shellSeekCommand(shell,
-                                                     type,
-                                                     shell->commandList.base,
-                                                     0);
-            if (command != NULL)
-            {
-                void *param;
-                if (command->data.paramParser.parser(shellExtParseString(string), &param) == 0)
-                {
-                    *result = (size_t)param;
-                    return 0;
-                }
-                else
-                {
-                    shellWriteString(shell, "Parse param for type: ");
-                    shellWriteString(shell, type);
-                    shellWriteString(shell, " failed\r\n");
-                    return -1;
-                }
-            }
-            else
-            {
-                shellWriteString(shell, "Can't find the param parser for type: ");
-                shellWriteString(shell, type);
-                shellWriteString(shell, "\r\n");
-                return -1;
-            }
-        }
-    }
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-    return -1;
-}
-
-
-#if SHELL_USING_FUNC_SIGNATURE == 1
-/**
- * @brief 清理参数
- * 
- * @param shell shell 
- * @param type 参数类型
- * @param param 参数
- * 
- * @return int 0 清理成功 -1 清理失败
- */
-int shellExtCleanerPara(Shell *shell, char *type, size_t param)
-{
-    if (type == NULL)
-    {
-        return 0;
-    }
-    else
-    {
-    #if SHELL_SUPPORT_ARRAY_PARAM == 1
-        if (type[0] == '[') {
-            return shellExtCleanerArray(shell, type, (void *) param);
-        }
-        else
-    #endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-        if (strcmp("c", type) == 0
-            || strcmp("q", type) == 0
-            || strcmp("h", type) == 0
-            || strcmp("i", type) == 0
-            || strcmp("f", type) == 0
-            || strcmp("p", type) == 0
-            || strcmp("s", type) == 0)
-        {
-            return 0;
-        }
-        else
-        {
-            ShellCommand *command = shellSeekCommand(shell,
-                                                     type,
-                                                     shell->commandList.base,
-                                                     0);
-            if (command != NULL && command->data.paramParser.cleaner != NULL)
-            {
-                return command->data.paramParser.cleaner((void *)param);
-            }
-        }
-    }
-    return -1;
-}
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-
-#if SHELL_SUPPORT_ARRAY_PARAM == 1
-/**
- * @brief 估算数组长度
- * 
- * @param string 数组参数
- * 
- * @return int 估算的数组长度
- */
-static int shellEstimateArrayLength(char *string)
-{
-    int length = 0;
-    char *p = string;
-    while (*p)
-    {
-        if (*p == ',')
-        {
-            length++;
-        }
-        p++;
-    }
-    return length + 1;
-}
-
-/**
- * @brief 分割数组参数
- * 
- * @param string 数组参数
- * @param array 分割后的字符串数组
- * 
- * @return int 数组长度
- */
-static int shellSplitArray(char *string, char ***array)
-{
-    int strLen = strlen(string);
-    if (string[strLen - 1] == ']')
-    {
-        string[--strLen] = 0;
-    }
-    if (string[0] == '[')
-    {
-        --strLen;
-        string++;
-    }
-    int size = shellEstimateArrayLength(string);
-    *array = SHELL_MALLOC(size * sizeof(char *));
-    return shellSplit(string, strLen, *array, ',', size);
-}
-
-/**
- * @brief 解析数组参数
- * 
- * @param shell shell 对象
- * @param string 数组参数
- * @param type 参数类型
- * @param result 解析结果
- * 
- * @return int 0 解析成功 -1 解析失败
- */
-static int shellExtParseArray(Shell *shell, char *string, char *type, size_t *result)
-{
-    char **params;
-    int size = shellSplitArray(string, &params);
-    int elementBytes = sizeof(void *);
-
-    if (strcmp(type + 1, "q") == 0)
-    {
-        elementBytes = sizeof(char);
-    }
-    else if (strcmp(type + 1, "h") == 0)
-    {
-        elementBytes = sizeof(short);
-    }
-    else if (strcmp(type + 1, "i") == 0)
-    {
-        elementBytes = sizeof(int);
-    }
-
-    ShellArrayHeader *header = SHELL_MALLOC(elementBytes * size + sizeof(ShellArrayHeader));
-    *result = (size_t) ((size_t) header + sizeof(ShellArrayHeader));
-    header->size = size;
-    header->elementBytes = elementBytes;
-    for (short i = 0; i < size; i++)
-    {
-        size_t value;
-        if (shellExtParsePara(shell, params[i], type + 1, &value) != 0)
-        {
-            SHELL_FREE(header);
-            SHELL_FREE(params);
-            return -1;
-        }
-        memcpy((void *) ((size_t) *result + elementBytes * i), &value, elementBytes);
-    }
-
-    SHELL_FREE(params);
-    return 0;
-}
-
-/**
- * @brief 清理数组参数
- * 
- * @param shell shell 对象
- * @param type 参数类型
- * @param param 参数
- * 
- * @return int 0 清理成功 -1 清理失败
- */
-static int shellExtCleanerArray(Shell *shell, char *type, void *param)
-{
-    ShellArrayHeader *header = (ShellArrayHeader *) ((size_t) param - sizeof(ShellArrayHeader));
-    for (short i = 0; i < header->size; i++)
-    {
-        if (shellExtCleanerPara(shell, type + 1, *(size_t *) ((size_t) param + header->elementBytes * i)) != 0)
-        {
-            return -1;
-        }
-    }
-    SHELL_FREE(header);
-    return 0;
-}
-
-/**
- * @brief 获取数组大小
- * 
- * @param param 数组
- * 
- * @return int 数组大小
- */
-int shellGetArrayParamSize(void *param)
-{
-    ShellArrayHeader *header = (ShellArrayHeader *) ((size_t) param - sizeof(ShellArrayHeader));
-    return header->size;
-}
-#endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-
-
-/**
- * @brief 执行命令
- * 
- * @param shell shell对象
- * @param command 命令
- * @param argc 参数个数
- * @param argv 参数
- * @return int 返回值
- */
-int shellExtRun(Shell *shell, ShellCommand *command, int argc, char *argv[])
-{
-    int ret = 0;
-    size_t params[SHELL_PARAMETER_MAX_NUMBER] = {0};
-    int paramNum = command->attr.attrs.paramNum > (argc - 1) ? 
-        command->attr.attrs.paramNum : (argc - 1);
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    char type[16];
-    int index = 0;
-    
-    if (command->data.cmd.signature != NULL)
-    {
-        int except = shellGetParamNumExcept(command->data.cmd.signature);
-        if (except != argc - 1)
-        {
-            shellWriteString(shell, "Parameters number incorrect\r\n");
-            return -1;
-        }
-    }
-#endif
-    for (int i = 0; i < argc - 1; i++)
-    {
-    #if SHELL_USING_FUNC_SIGNATURE == 1
-        if (command->data.cmd.signature != NULL) {
-            index = shellGetNextParamType(command->data.cmd.signature, index, type);
-            if (shellExtParsePara(shell, argv[i + 1], type, &params[i]) != 0)
-            {
-                return -1;
-            }
-        }
-        else
-    #endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-        {
-            if (shellExtParsePara(shell, argv[i + 1], NULL, &params[i]) != 0)
-            {
-                return -1;
-            }
-        }
-    }
-    switch (paramNum)
-    {
-#if SHELL_PARAMETER_MAX_NUMBER >= 1
-    case 0:
-        ret = command->data.cmd.function();
-        break;
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 1 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 2
-    case 1:
-    {
-        int (*func)(size_t) = command->data.cmd.function;
-        ret = func(params[0]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 2 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 3
-    case 2:
-    {
-        int (*func)(size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 3 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 4
-    case 3:
-    {
-        int (*func)(size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 4 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 5
-    case 4:
-    {
-        int (*func)(size_t, size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 5 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 6
-    case 5:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 6 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 7
-    case 6:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 7 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 8
-    case 7:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 8 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 9
-    case 8:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t)
-            = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 9 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 10
-    case 9:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 10 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 11
-    case 10:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8], params[9]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 11 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 12
-    case 11:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8], params[9], params[10]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 12 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 13
-    case 12:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t, size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8], params[9], params[10], params[11]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 13 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 14
-    case 13:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t, size_t, size_t, size_t, size_t) = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8], params[9], params[10], params[11], params[12]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 14 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 15
-    case 14:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t, size_t, size_t, size_t, size_t, size_t)
-            = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8], params[9], params[10], params[11], params[12], params[13]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 15 */
-#if SHELL_PARAMETER_MAX_NUMBER >= 16
-    case 15:
-    {
-        int (*func)(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t,
-                    size_t, size_t, size_t, size_t, size_t, size_t, size_t)
-            = command->data.cmd.function;
-        ret = func(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7],
-                   params[8], params[9], params[10], params[11], params[12], params[13], params[14]);
-        break;
-    }
-#endif /** SHELL_PARAMETER_MAX_NUMBER >= 16 */
-    default:
-        ret = -1;
-        break;
-    }
-    
-#if SHELL_USING_FUNC_SIGNATURE == 1
-    if (command->data.cmd.signature != NULL) {
-        index = 0;
-        for (int i = 0; i < argc - 1; i++)
-        {
-            index = shellGetNextParamType(command->data.cmd.signature, index, type);
-            shellExtCleanerPara(shell, type, params[i]);
-        }
-    }
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-
-    return ret;
-}
-

+ 0 - 47
Xianglinghui/05.src/pdu_ctrl_app/letter/src/shell_ext.h

@@ -1,47 +0,0 @@
-/**
- * @file shell_ext.h
- * @author Letter (NevermindZZT@gmail.com)
- * @brief shell extensions
- * @version 3.0.0
- * @date 2019-12-31
- * 
- * @copyright (c) 2019 Letter
- * 
- */
-
-#ifndef __SHELL_EXT_H__
-#define __SHELL_EXT_H__
-
-#include "shell.h"
-
-/**
- * @brief 数字类型
- * 
- */
-typedef enum
-{
-    NUM_TYPE_DEC,                                           /**< 十进制整型 */
-    NUM_TYPE_BIN,                                           /**< 二进制整型 */
-    NUM_TYPE_OCT,                                           /**< 八进制整型 */
-    NUM_TYPE_HEX,                                           /**< 十六进制整型 */
-    NUM_TYPE_FLOAT                                          /**< 浮点型 */
-} ShellNumType;
-
-#if SHELL_SUPPORT_ARRAY_PARAM == 1
-typedef struct
-{
-    unsigned short size;
-    unsigned char elementBytes;
-} ShellArrayHeader;
-#endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-
-int shellExtParsePara(Shell *shell, char *string, char *type, size_t *result);
-#if SHELL_USING_FUNC_SIGNATURE == 1
-int shellExtCleanerPara(Shell *shell, char *type, size_t param);
-#endif /** SHELL_USING_FUNC_SIGNATURE == 1 */
-#if SHELL_SUPPORT_ARRAY_PARAM == 1
-int shellGetArrayParamSize(void *param);
-#endif /** SHELL_SUPPORT_ARRAY_PARAM == 1 */
-int shellExtRun(Shell *shell, ShellCommand *command, int argc, char *argv[]);
-
-#endif

+ 302 - 267
Xianglinghui/05.src/pdu_ctrl_app/src/appweb_handle.c

@@ -27,253 +27,6 @@ static char* g_product_pwr_type_str[4] = {
 };
 
 
-
-#if(0)
-//总电源监控
-typedef struct
-{
-    float totalVoltage;             //总电压
-    float totalCurrent;             //总电流
-    float totalPower;               //总功率
-    float frequency;                //频率
-    float powerConsumption;         //总耗电量
-    float powerFactor;              //功率因数
-}TotalPwrParam;
-TotalPwrParam _totalPwrParam;
-
-//通道电源管理
-typedef struct
-{
-    char channelName[128] ;         //通道名称
-    unsigned char channelNumber;    //通道号
-    float channelVoltages;          //电压
-    float channelCurrents;
-    float channelPower ;
-    float channelFrequency;         //频率
-    float channelPowerConsumption;  //耗电量
-    float channelPowerFactor;       //功率因数
-}ChnPwrParam;
-ChnPwrParam _chnPwrParam[MAX_CHN_COUNT];
-
-//总体电源参数
-
-char* param_overall_to_json(int type,TotalPwrParam* _totalPwrParam)
-{
-    char* str = NULL;
-    // 创建 JSON 对象
-    cJSON* root = cJSON_CreateObject();
-    // 添加基本键值对
-    cJSON_AddNumberToObject(root, "code", 200);
-    if(type==0)
-    {
-        //创建数据
-        cJSON* data_root_array = cJSON_CreateArray();
-        cJSON* data_filed = cJSON_CreateObject();
-        cJSON_AddNumberToObject(data_filed,"totalVoltage",_totalPwrParam->totalVoltage);
-        cJSON_AddNumberToObject(data_filed,"totalCurrent",_totalPwrParam->totalCurrent);
-        cJSON_AddNumberToObject(data_filed,"totalPower",_totalPwrParam->totalPower);
-        cJSON_AddNumberToObject(data_filed,"powerConsumption",_totalPwrParam->powerConsumption);
-        cJSON_AddNumberToObject(data_filed,"powerFactor",_totalPwrParam->powerFactor);
-        cJSON_AddItemToObject(data_root_array, "data", data_filed);
-        cJSON_AddItemToObject(root, "data", data_root_array);
-    }
-    //添加结果
-    cJSON_AddStringToObject(root, "msg", "操作成功");
-    str = cJSON_Print(root);
-    return str;
-}
-
-//添加一个电源通道项
-cJSON* param_chn_to_json_item(ChnPwrParam* _chnPwrParam)
-{
-    cJSON* data_filed = cJSON_CreateObject();
-    cJSON_AddStringToObject(data_filed,"channelName",_chnPwrParam->channelName);
-    cJSON_AddNumberToObject(data_filed,"channelNumber",_chnPwrParam->channelNumber);
-    cJSON_AddNumberToObject(data_filed,"voltage",_chnPwrParam->channelVoltages);
-    cJSON_AddNumberToObject(data_filed,"current",_chnPwrParam->channelCurrents);
-    cJSON_AddNumberToObject(data_filed,"power",_chnPwrParam->channelPower);
-    cJSON_AddNumberToObject(data_filed,"frequency",_chnPwrParam->channelFrequency);
-    cJSON_AddNumberToObject(data_filed,"powerConsumption",_chnPwrParam->channelPowerConsumption);
-    cJSON_AddNumberToObject(data_filed,"powerFactor",_chnPwrParam->channelPowerFactor);
-    //cJSON_AddItemToObject(data_root_array, "data", data_filed);  
-    return data_filed;  
-}
-
-//返回通道的电源参数
-char* param_chn_to_json(void)
-{
-    char* str = NULL;
-    // 创建 JSON 对象
-    cJSON* root = cJSON_CreateObject();
-    // 添加基本键值对
-    cJSON_AddNumberToObject(root, "code", 200);
-    //创建数据
-    cJSON* data_root_array = cJSON_CreateArray();
-
-    //chn 0
-    cJSON* data_filed = cJSON_CreateObject();
-    cJSON_AddStringToObject(data_filed,"channelName","交流1通道");
-    cJSON_AddNumberToObject(data_filed,"channelNumber",1);
-    cJSON_AddNumberToObject(data_filed,"voltage",220);
-    cJSON_AddNumberToObject(data_filed,"current",10);
-    cJSON_AddNumberToObject(data_filed,"power",2200);
-    cJSON_AddNumberToObject(data_filed,"frequency",50);
-    cJSON_AddNumberToObject(data_filed,"powerConsumption",2500);
-    cJSON_AddNumberToObject(data_filed,"powerFactor",2500);
-    cJSON_AddItemToObject(data_root_array, "data", data_filed);
-    //chn 1
-    cJSON* data1_filed = cJSON_CreateObject();
-    cJSON_AddStringToObject(data1_filed,"channelName","交流2通道");
-    cJSON_AddNumberToObject(data1_filed,"channelNumber",2);
-    cJSON_AddNumberToObject(data1_filed,"voltage",220);
-    cJSON_AddNumberToObject(data1_filed,"current",10);
-    cJSON_AddNumberToObject(data1_filed,"power",2200);
-    cJSON_AddNumberToObject(data1_filed,"frequency",50);
-    cJSON_AddNumberToObject(data1_filed,"powerConsumption",2500);
-    cJSON_AddNumberToObject(data1_filed,"powerFactor",2500);
-    cJSON_AddItemToObject(data_root_array, "data", data1_filed);
-
-
-    cJSON_AddItemToObject(root, "data", data_root_array);
-    //添加结果
-    cJSON_AddStringToObject(root, "msg", "操作成功");
-    str = cJSON_Print(root);
-    return str;
-}
-
-char* param_sensor_to_json()
-{
-    char* str = NULL;
-    // 创建 JSON 对象
-    cJSON* root = cJSON_CreateObject();
-    // 添加基本键值对
-    cJSON_AddNumberToObject(root, "code", 200);
-    //创建数据
-    cJSON* data_root_array = cJSON_CreateArray();
-    cJSON* data_filed = cJSON_CreateObject();
-    cJSON_AddStringToObject(data_filed,"sensorType","temperatureSensor");
-    cJSON_AddNumberToObject(data_filed,"sensorNumber",1);
-    cJSON_AddStringToObject(data_filed,"sensorName","温湿度传感器");
-    cJSON_AddStringToObject(data_filed,"comSlogan","COM0");
-    cJSON_AddNumberToObject(data_filed,"address",1);
-    cJSON_AddNumberToObject(data_filed,"baud",115200);
-    cJSON_AddStringToObject(data_filed,"connectionStatus","在线");
-    cJSON_AddNumberToObject(data_filed,"temperatureValue",25);
-    cJSON_AddNumberToObject(data_filed,"humidityValue",40);
-    // cJSON_AddStringToObject(data_filed,"alarmStatus","未报警");
-    // cJSON_AddStringToObject(data_filed,"waterImmersionState","未侵入");
-    // cJSON_AddStringToObject(data_filed,"accessControlStatus","锁闭");
-    // cJSON_AddNumberToObject(data_filed,"gasConcentration",20);
-    // cJSON_AddNumberToObject(data_filed,"airflowValue",30);
-    // cJSON_AddNumberToObject(data_filed,"airPressureValue",15);
-    cJSON_AddItemToObject(data_root_array, "data", data_filed);
-    cJSON_AddItemToObject(root, "data", data_root_array);
-    //添加结果
-    cJSON_AddStringToObject(root, "msg", "操作成功");
-    str = cJSON_Print(root);
-    return str;
-}
-
-
-int json_overall_to_param(const char* str)
-{
-    cJSON* cjson = NULL;
-    cjson = cJSON_Parse(str);
-    if(cjson==NULL)
-    {
-        printf("Error: Invalid JSON.\n");
-        return ;
-    }
-    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
-    // if(strcmp(cjson_token->valuestring,"token")!=0)
-    //     return -1 ;
-    printf("token:%s\n",cjson_token->valuestring);
-
-    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    if(strcmp(cjson_type->valuestring,"listQuery")==0)
-        return 0 ;   
-    else if(strcmp(cjson_type->valuestring,"open")==0)
-        return 1 ;  
-    else if(strcmp(cjson_type->valuestring,"close")==0)
-        return 2 ;                   
-    else 
-        return -1;
-}
-
-
-void json_chn_to_param(const char* str)
-{
-    cJSON* cjson = NULL;
-    cjson = cJSON_Parse(str);
-    if(cjson==NULL)
-    {
-        printf("Error: Invalid JSON.\n");
-        return ;
-    }
-    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
-    printf("token:%s\n",cjson_token->valuestring);
-
-    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    printf("type:%s\n",cjson_type->valuestring);
-}
-
-void json_sensor_to_param(const char* str)
-{
-    cJSON* cjson = NULL;
-    cjson = cJSON_Parse(str);
-    if(cjson==NULL)
-    {
-        printf("Error: Invalid JSON.\n");
-        return ;
-    }
-    // cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
-    // printf("token:%s\n",cjson_token->valuestring);
-
-    // cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    // printf("type:%s\n",cjson_type->valuestring);
-
-    // cJSON* cjson_sensor_type = cJSON_GetObjectItem(cjson,"sensorType");
-    // printf("sensorType:%s\n",cjson_sensor_type->valuestring);
-
-    cJSON_Print(cjson);
-}
-
-
-
-
-
-static void channelStatusMonitoring(HttpStream *stream)
-{
-    HttpQueue   *q;
-    cchar* rx_body_buf = NULL;
-
-    q = stream->writeq;
-    //get param
-    rx_body_buf = httpGetBodyInput(stream);
-    json_chn_to_param(rx_body_buf);
-    //set response
-    httpSetStatus(stream, 200);
-    httpWrite(q, param_chn_to_json());
-    httpFinalize(stream);
-}
-
-
-static void sensorStatusMonitoring(HttpStream *stream)
-{
-    HttpQueue   *q;
-    cchar* rx_body_buf = NULL;
-
-    q = stream->writeq;
-    //get param
-    rx_body_buf = httpGetBodyInput(stream);
-    json_sensor_to_param(rx_body_buf);
-    //set response
-    httpSetStatus(stream, 200);
-    httpWrite(q, param_sensor_to_json());
-    httpFinalize(stream);
-}
-#endif
-
 //静态全局
 static _User_Log _user_log ;
 
@@ -507,6 +260,26 @@ static void overallStatusMonitoring(HttpStream *stream)
     else if(strcmp(_over_all_sts_monitor.type,"listHisQuery")==0)
     {
         log_i("over all request:listHisQuery");
+        int ret = 0 ;
+        int size = 0 ;
+        GlobalPowerInfo _globalPowerInfo;
+        
+        INIT_LIST_HEAD(&_globalPowerInfo.list);
+        ret = dev_search_power_info(__globalDeviceManage.db,
+                                __globalDeviceManage._global_device_info->product_id,
+                                0,
+                                _over_all_sts_monitor.start_time,
+                                _over_all_sts_monitor.end_time,
+                                _over_all_sts_monitor.page_num,
+                                _over_all_sts_monitor.page_size
+                                &size,
+                                &_globalPowerInfo);
+        if(ret!=0)
+        {
+            log_e("dev all status history get error.\n");
+        }
+        //返回应答
+        ack_str = overall_power_history_to_json(&_globalPowerInfo,&__globalDeviceManage);
     }     
     #endif
     //响应
@@ -515,7 +288,7 @@ static void overallStatusMonitoring(HttpStream *stream)
     httpFinalize(stream);
     //释放资源
     //log_d(ack_str);
-    //cJSON_free((void*)ack_str);
+    cJSON_free((void*)ack_str);
 }
 
 /// @brief 电源通道
@@ -547,15 +320,14 @@ static void channelStatusMonitoring(HttpStream *stream)
         log_i("channel status request:listQuery");
         GlobalPowerInfo _powerInfo;
         GlobalPowerManger* _globalPowerMangerTemp = NULL ;
+        int product_chn_id = 0 ;
         //查询json参数
         /*
         * todo:
         */
         _OverChnPwrAckInfo _over_chn_pwr_back_info;
         INIT_LIST_HEAD(&_over_chn_pwr_back_info.list);
-
-
-
+        #if(0)
         list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
         {
             //log_d("start serach ch%d.",_globalPowerMangerTemp->product_ch_id);
@@ -585,15 +357,15 @@ static void channelStatusMonitoring(HttpStream *stream)
                 _overChnPwrBackInfoTemp->consumption = _powerInfo._power_info.consumption ;
                 _overChnPwrBackInfoTemp->factor = _powerInfo._power_info.factor ;
                 list_add_tail(&_overChnPwrBackInfoTemp->list,&_over_chn_pwr_back_info.list);
-                //log_d("serach ch%d pwr ok.",_globalPowerMangerTemp->product_ch_id);
             }
         }
+        #endif
 
-
-        #if(0)
+        product_chn_id = strtol(_over_chn_pwr_request.productChId);
+        #if(1)
        //未指定通道 检索所有通道
-       if(_over_chn_pwr_request.productChId==0)
-       {
+        if(product_chn_id==0)
+        {
             list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
             {
                 //log_d("start serach ch%d.",_globalPowerMangerTemp->product_ch_id);
@@ -627,7 +399,7 @@ static void channelStatusMonitoring(HttpStream *stream)
                 }
             }
        }
-       else
+       else //指定通道
        {
             list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
             {
@@ -730,13 +502,44 @@ static void channelStatusMonitoring(HttpStream *stream)
         */
         ack_str = ctrl_sts_ack_to_json();
     }
+    else if(strcmp(_over_chn_pwr_request.type,"listHisQuery")==0) //历史记录查询
+    {
+        int ret = 0 ;
+        int size = 0 ;
+        int h_pwrchn = 0 ;
+        GlobalPowerInfo _globalPowerInfo;
+        INIT_LIST_HEAD(&_globalPowerInfo.list);
+
+        h_pwrchn = strtol(_over_chn_pwr_request.productChId,NULL,10);
+        //查询数据
+        ret = dev_search_power_info(__globalDeviceManage.db,
+                                __globalDeviceManage._global_device_info->product_id,
+                                h_pwrchn,
+                                _over_all_sts_monitor.start_time,
+                                _over_all_sts_monitor.end_time,
+                                _over_all_sts_monitor.page_num,
+                                _over_all_sts_monitor.page_size
+                                &size,
+                                &_globalPowerInfo);
+        if(ret!=0)
+        {
+            log_e("dev all status history get error.\n");
+        }
+        
+        //应答
+        ack_str = over_channel_power_history_to_json(&_globalPowerInfo,
+                                                    &__globalDeviceManage._global_device_info, 
+                                                    _over_chn_pwr_request.productChName,
+                                                    h_pwrchn);
+    }
+
     #endif
     //响应
     httpSetStatus(stream, 200);
     httpWrite(q, ack_str);//应答
     httpFinalize(stream);
     //释放资源
-    //cJSON_free((void*)ack_str);
+    cJSON_free((void*)ack_str);
 }
 
 
@@ -747,28 +550,250 @@ static void sensorStatusMonitoring(HttpStream *stream)
     int ret = -1 ;
     _OverSensorRequest _over_all_sensor_request;
     _OverSensorBackInfo _over_all_sensor_back_info;
+    GlobalSensorManger _globalSensorMangerTemp ;
+    GlobalSensorInfo _globalSensorInfo;
     HttpQueue   *q;
     cchar* rx_body_buf = NULL;
     char* ack_str = NULL ;
     q = stream->writeq;
-    #if(0)
+    #if(1)
     //get param
     rx_body_buf = httpGetBodyInput(stream); 
     //转换json参数
-    if(json_to_overall_sensor_status(rx_body_buf,&_over_all_sensor_request)!=0)
+    if(json_to_sensor_manage(rx_body_buf,&_over_all_sensor_request)!=0)
     {
         httpSetStatus(stream, 400);
         httpFinalize(stream);
         return ;        
     } 
-
     //查询json参数
-    /*
-    * todo:
-    */
+    if(strcmp(_over_all_sensor_request.type,"listQuery")==0)
+    {
+        //链表初始化
+        INIT_LIST_HEAD(&_over_all_sensor_back_info.list)
+        //获取传感器当前的最新值
+        GlobalSensorManger* _globalSensorMangerTemp;
+        list_for_each_entry(_globalSensorMangerTemp, &__globalDeviceManage._globalSensorManger.list, list)
+        {
+            _OverSensorBackInfo* _overSensorBackInfoTemp = (_OverSensorBackInfo*)malloc(sizeof(_OverSensorBackInfo));
+            if(_overSensorBackInfoTemp==NULL)
+                log_e("_OverSensorBackInfo malloc error.");
+            memset(_overSensorBackInfoTemp,0,sizeof(_OverSensorBackInfo));
+
+            //基本信息
+            _overSensorBackInfoTemp->sensorId = _globalSensorMangerTemp.sensor_id;
+            _overSensorBackInfoTemp->sensorName = _globalSensorMangerTemp.sensor_name;
+            _overSensorBackInfoTemp->sensorType = _globalSensorMangerTemp.sensor_type;
+            _overSensorBackInfoTemp->sensorAddr = _globalSensorMangerTemp.sensor_addr ;
+            _overSensorBackInfoTemp->comSlogan = _globalSensorMangerTemp.sensor_port_name ;
+            _overSensorBackInfoTemp->sensorBaud = _globalSensorMangerTemp.sensor_baud;
+            _overSensorBackInfoTemp->connectionStatus = _globalSensorMangerTemp.sensor_status;
+            //拿数据
+            switch(_globalSensorMangerTemp->sensor_type)
+            {
+                case 0://温湿度传感器 2个值
+                {
+                    ret = dev_serach_latest_sensor_info(__globalDeviceManage.db,
+                                                __globalDeviceManage._global_device_info->product_id,
+                                                _overSensorBackInfoTemp->sensorId,
+                                                &_globalSensorInfo);
+                    if(ret!=0)
+                        log_e("get temp sensor info error.")
+                    _overSensorBackInfoTemp->temperatureValue = _globalSensorInfo.val1;
+                    _overSensorBackInfoTemp->humidityValue = _globalSensorInfo.val2;
+                };break; 
+                case 1://烟雾传感器 1个值
+                {
+                    ret = dev_serach_latest_sensor_info(__globalDeviceManage.db,
+                                                __globalDeviceManage._global_device_info->product_id,
+                                                _overSensorBackInfoTemp->sensorId,
+                                                &_globalSensorInfo);
+                    if(ret!=0)
+                        log_e("get temp sensor info error.")    
+                    _overSensorBackInfoTemp->alarmStatus =  _globalSensorInfo.val1; // 1/0 报警未报警
+                }break; 
+                case 2://水浸传感器 1个值  c
+                {
+                    ret = dev_serach_latest_sensor_info(__globalDeviceManage.db,
+                                                __globalDeviceManage._global_device_info->product_id,
+                                                _overSensorBackInfoTemp->sensorId,
+                                                &_globalSensorInfo);
+                    if(ret!=0)
+                        log_e("get temp sensor info error.")    
+                    _overSensorBackInfoTemp->waterImmersionState =  _globalSensorInfo.val1; // 1/0 报警未报警
+                }break; 
+                case 3://门禁传感器 没有值
+                {
 
-    //参数转换json
-    ack_str = over_all_pwr_monitor_to_json(&_over_all_sensor_back_info);
+                };break; 
+                case 4: //气体传感器 1个值
+                {
+                    ret = dev_serach_latest_sensor_info(__globalDeviceManage.db,
+                                                __globalDeviceManage._global_device_info->product_id,
+                                                _overSensorBackInfoTemp->sensorId,
+                                                &_globalSensorInfo);
+                    if(ret!=0)
+                        log_e("get temp sensor info error.")    
+                    _overSensorBackInfoTemp->gasConcentration =  _globalSensorInfo.val1; // 气体浓度
+                };break;
+                case 5://气压气流传感器 2个值
+                {
+                    ret = dev_serach_latest_sensor_info(__globalDeviceManage.db,
+                                                __globalDeviceManage._global_device_info->product_id,
+                                                _overSensorBackInfoTemp->sensorId,
+                                                &_globalSensorInfo);
+                    if(ret!=0)
+                        log_e("get temp sensor info error.")    
+                    _overSensorBackInfoTemp->airPressureValue =  _globalSensorInfo.val1; // 气压
+                    _overSensorBackInfoTemp->airflowValue =  _globalSensorInfo.val2; // 气流
+                };break; 
+                case 6://空调遥控器 没有值
+                {
+
+                };break; 
+            }
+            //入队
+            list_add_tail(_overSensorBackInfoTemp,&_over_all_sensor_back_info.list);
+        }    
+        //参数转换json
+        ack_str = over_all_sensor_info_to_json(&_over_all_sensor_back_info);
+    }
+    //删除传感器
+    else if(strcmp(_over_all_sensor_request.type,"delete")==0)
+    {
+        if(dev_delete_sensor_manage(__globalDeviceManage.db, 1,_globalSensorMangerTemp.sensor_id)==0)
+        {
+            log_e("sensor delete failed.");
+        }
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //更新传感器
+    else if(strcmp(_over_all_sensor_request.type,"update")==0)
+    {
+        //清空数据
+        memset(&_globalSensorMangerTemp, 0, sizeof(GlobalSensorManger));
+        //填充数据
+        _globalSensorMangerTemp.product_id = 1 ;
+        _globalSensorMangerTemp.sensor_id = strtol(_over_all_sensor_request.sensorId);
+        _globalSensorMangerTemp.sensor_type = strtol(_over_all_sensor_request.sensorType);
+        strcpy( _globalSensorMangerTemp.sensor_name,_over_all_sensor_request.sensorName);
+        strcpy(_globalSensorMangerTemp.sensor_port_name,_over_all_sensor_request.comSlogan);
+        _globalSensorMangerTemp.sensor_baud = strtol(_over_all_sensor_request.sensorBaud);
+        _globalSensorMangerTemp.sensor_addr = strtol(_over_all_sensor_request.sensorAddr);
+        _globalSensorMangerTemp.sensor_status = _over_all_sensor_request.sensor_status;
+        switch( _globalSensorMangerTemp.sensor_type)
+        {
+            case 0:_globalSensorMangerTemp.sensor_val_count = 2 ;break; //温湿度传感器 2个值
+            case 1:_globalSensorMangerTemp.sensor_val_count = 1 ;break; //烟雾传感器 1个值
+            case 2:_globalSensorMangerTemp.sensor_val_count = 1 ;break; //水浸传感器 1个值  
+            case 3:_globalSensorMangerTemp.sensor_val_count = 0 ;break; //门禁传感器 没有值
+            case 4:_globalSensorMangerTemp.sensor_val_count = 1 ;break; //气体传感器 1个值
+            case 5:_globalSensorMangerTemp.sensor_val_count = 2 ;break; //气压气流传感器 2个值
+            case 6:_globalSensorMangerTemp.sensor_val_count = 0 ;break; //空调遥控器 没有值
+        }
+        //插入数据库
+        if(dev_update_sensor_genera_manage(__globalDeviceManage.db,_globalSensorMangerTemp.sensor_id,&_globalSensorMangerTemp)==0)
+        {
+            log_e("dev update error.");
+        }
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //添加传感器
+    else if(strcmp(_over_all_sensor_request.type,"add")==0)
+    {
+        //清空数据
+        memset(&_globalSensorMangerTemp, 0, sizeof(GlobalSensorManger));
+        //填充数据
+        _globalSensorMangerTemp.product_id = 1 ;
+        _globalSensorMangerTemp.sensor_id = strtol(_over_all_sensor_request.sensorId);
+        _globalSensorMangerTemp.sensor_type = strtol(_over_all_sensor_request.sensorType);
+        strcpy( _globalSensorMangerTemp.sensor_name,_over_all_sensor_request.sensorName);
+        strcpy(_globalSensorMangerTemp.sensor_port_name,_over_all_sensor_request.comSlogan);
+        _globalSensorMangerTemp.sensor_baud = strtol(_over_all_sensor_request.sensorBaud);
+        _globalSensorMangerTemp.sensor_addr = strtol(_over_all_sensor_request.sensorAddr);
+        _globalSensorMangerTemp.sensor_status = _over_all_sensor_request.sensor_status;
+        switch( _globalSensorMangerTemp.sensor_type)
+        {
+            case 0:_globalSensorMangerTemp.sensor_val_count = 2 ;break; //温湿度传感器 2个值
+            case 1:_globalSensorMangerTemp.sensor_val_count = 1 ;break; //烟雾传感器 1个值
+            case 2:_globalSensorMangerTemp.sensor_val_count = 1 ;break; //水浸传感器 1个值  
+            case 3:_globalSensorMangerTemp.sensor_val_count = 0 ;break; //门禁传感器 没有值
+            case 4:_globalSensorMangerTemp.sensor_val_count = 1 ;break; //气体传感器 1个值
+            case 5:_globalSensorMangerTemp.sensor_val_count = 2 ;break; //气压气流传感器 2个值
+            case 6:_globalSensorMangerTemp.sensor_val_count = 0 ;break; //空调遥控器 没有值
+        }
+        //插入数据库
+        if(dev_insert_sensor_genera_manage(__globalDeviceManage.db,&_globalSensorMangerTemp)==0)
+        {
+            log_e("dev insert error.");
+        }
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //烟雾报警复位
+    else if(strcmp(_over_all_sensor_request.type,"reset")==0)
+    {
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //门禁释放
+    else if(strcmp(_over_all_sensor_request.type,"release")==0)
+    {
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //打开空调开关
+    else if(strcmp(_over_all_sensor_request.type,"open")==0)
+    {
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //关闭空调开关
+    else if(strcmp(_over_all_sensor_request.type,"close")==0)
+    {
+        ack_str = ctrl_sts_ack_to_json();
+    }
+    //历史信息
+    else if(strcmp(_over_all_sensor_request.type,"listHisQuery")==0)
+    {
+        int rsize = 0 ;
+        GlobalSensorInfo* _globalSensorInfoTemp;
+
+        INIT_LIST_HEAD(&_globalSensorInfo.list)
+        //查询数据
+        ret = dev_search_sensor_info(__globalDeviceManage.db,
+                            __globalDeviceManage._global_device_info->product_id,
+                            _over_all_sensor_request.sensorId,
+                            _over_all_sensor_request.startTime,
+                            _over_all_sensor_request.endTime,
+                            _over_all_sensor_request.page_num,
+                            _over_all_sensor_request.page_size,
+                            &rsize,
+                            &_globalSensorInfo);
+        if(ret!=0)
+            log_e("get sensor history error.")
+        //查找管理表找到关联信息
+
+        //组返回数据
+        list_for_each_entry(_globalSensorInfoTemp, &_globalSensorInfo.list, list)
+        {
+
+            _OverSensorBackInfo* _overSensorBackInfoTemp = (_OverSensorBackInfo*)malloc(sizeof(_OverSensorBackInfo));
+            if(_overSensorBackInfoTemp==NULL)
+                log_e("_OverSensorBackInfo malloc error.");
+            memset(_overSensorBackInfoTemp,0,sizeof(_OverSensorBackInfo));
+
+            //基本信息
+            _overSensorBackInfoTemp->sensorId = _over_all_sensor_request.sensorId;
+
+
+            // _overSensorBackInfoTemp->sensorName = _globalSensorMangerTemp.sensor_name;
+            // _overSensorBackInfoTemp->sensorType = _globalSensorMangerTemp.sensor_type;
+            // _overSensorBackInfoTemp->sensorAddr = _globalSensorMangerTemp.sensor_addr ;
+            // _overSensorBackInfoTemp->comSlogan = _globalSensorMangerTemp.sensor_port_name ;
+            // _overSensorBackInfoTemp->sensorBaud = _globalSensorMangerTemp.sensor_baud;
+            // _overSensorBackInfoTemp->connectionStatus = _globalSensorMangerTemp.sensor_status;
+
+
+
+        }        
+    }
     #endif
     //响应
     httpSetStatus(stream, 200);
@@ -865,10 +890,20 @@ static void serviceManagement(HttpStream *stream)
     int ret = -1 ;
     HttpQueue   *q;
     cchar* rx_body_buf = NULL;
+    _ServiceManageRequestInfo _serviceManageRequestInfo;
     char* ack_str = NULL ;
     q = stream->writeq;
     //get param
-    //rx_body_buf = httpGetBodyInput(stream); 
+    rx_body_buf = httpGetBodyInput(stream); 
+
+    //转换json参数
+    if(json_to_service_manage(rx_body_buf,&_serviceManageRequestInfo)!=0)
+    {
+        httpSetStatus(stream, 400);
+        httpFinalize(stream);
+        return ;        
+    }
+
 
     //响应
     httpSetStatus(stream, 200);

+ 4 - 2
Xianglinghui/05.src/pdu_ctrl_app/src/common.h

@@ -135,7 +135,7 @@ typedef struct
 {
     char            samp_time[32]                               ;//采集时间
     int             product_id                                  ;//产品ID
-    char            sensor_id                                   ;//电源通道
+    char            sensor_id                                   ;//传感器ID
     float           val1                                        ;//值1
     float           val2                                        ;//值2
     struct list_head list;
@@ -166,6 +166,7 @@ typedef struct
     bool                sensor_status                              ;//传感器状态
     char                sensor_val_count                           ;//传感器值个数
     GlobalSensorOverManage*  over_manager                         ;//超限管理   
+    struct list_head    list;   
 }GlobalSensorManger;
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////
@@ -202,7 +203,8 @@ typedef struct
     pthread_t           dev_samp_thread;//电源采集与控制线程
     bool                dev_samp_flag ;//电源采集线程标志
     GlobalDeviceInfo*   _global_device_info;    //设备管理信息
-    GlobalPowerManger  _globalPowerManger;     //电源管理表
+    GlobalPowerManger  _globalPowerManger;      //电源管理表
+    GlobalSensorManger _globalSensorManger;     //传感器管理表
 
     unsigned int        useSlaveCount ;       //有效地址
     Modbus_Manger       _globalRelaySampManger; //内部继电器使用

+ 494 - 67
Xianglinghui/05.src/pdu_ctrl_app/src/json_handle.c

@@ -3,6 +3,7 @@
 #include "elog.h"
 #include <string.h>
 #include <time.h>
+#include "common.h"
 
 //如果是在一个程序的循环中不断调用这个函数,那么是没有效果的
 //虽然也是使用的系统的时间函数来初始化随机数发生器,但程序的
@@ -679,31 +680,41 @@ int json_to_overall_status_monitor(const char* str,_Over_All_Sts_Monitor* _over_
         return -1;
     }
     cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
-    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    // cJSON* cjson_name = cJSON_GetObjectItem(cjson,"productName");
-    // cJSON* cjson_number = cJSON_GetObjectItem(cjson,"productNumber");
-
-    if(cjson_token->valuestring!=NULL)
+    if(cjson_token!=NULL)
         _over_all_sts_monitor->user_token = cjson_token->valuestring;
-    if(cjson_type->valuestring!=NULL)
+
+    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
+    if(cjson_type!=NULL)
         _over_all_sts_monitor->type = cjson_type->valuestring;
-    // if(cjson_name->valuestring!=NULL)
-    //     _over_all_sts_monitor->product_name = cjson_name->valuestring;
-    // if(cjson_number->valuestring!=NULL)
-    //     _over_all_sts_monitor->product_number = cjson_number->valuestring;
 
-    if(strcmp(_over_all_sts_monitor->type,"listHisQuery")==0)
-    {
-        // cJSON* cjson_start_time = cJSON_GetObjectItem(cjson,"startTime");
-        // cJSON* cjson_end_time = cJSON_GetObjectItem(cjson,"endTime");
-        // cJSON* cjson_page_num = cJSON_GetObjectItem(cjson,"pageNum");
-        // cJSON* cjson_page_size = cJSON_GetObjectItem(cjson,"pageSize");
-
-        // _over_all_sts_monitor->start_time = cjson_start_time->valuestring;
-        // _over_all_sts_monitor->end_time = cjson_end_time->valuestring;
-        // _over_all_sts_monitor->page_num = cjson_page_num->valuestring;
-        // _over_all_sts_monitor->page_size = cjson_page_size->valuestring;
-    }
+    cJSON* cjson_productName = cJSON_GetObjectItem(cjson,"productName");
+    if(cjson_productName!=NULL)
+        _over_all_sts_monitor->product_name = cjson_productName->valuestring;
+
+    cJSON* cjson_product_id = cJSON_GetObjectItem(cjson,"product_id");
+    if(cjson_product_id->valuestring!=NULL)
+        _over_all_sts_monitor->product_id = cjson_product_id->valuestring;
+
+    cJSON* cjson_productNumber = cJSON_GetObjectItem(cjson,"productNumber");
+    if(cjson_productNumber->valuestring!=NULL)
+        _over_all_sts_monitor->product_number = cjson_productNumber->valuestring;
+
+
+    cJSON* cjson_start_time = cJSON_GetObjectItem(cjson,"startTime");
+    if(cjson_start_time!=NULL)
+        _over_all_sts_monitor->start_time = cjson_start_time->valuestring;
+
+    cJSON* cjson_end_time = cJSON_GetObjectItem(cjson,"endTime");
+    if(cjson_end_time!=NULL)
+        _over_all_sts_monitor->end_time = cjson_end_time->valuestring;
+
+    cJSON* cjson_page_num = cJSON_GetObjectItem(cjson,"pageNum");
+    if(cjson_page_num!=NULL)
+        _over_all_sts_monitor->page_num = cjson_page_num->valuestring;
+
+    cJSON* cjson_page_size = cJSON_GetObjectItem(cjson,"pageSize");
+    if(cjson_page_size!=NULL)
+        _over_all_sts_monitor->page_size = cjson_page_size->valuestring;
 
     return 0 ;
 }
@@ -789,25 +800,46 @@ int json_to_chn_pwr_status_monitor(const char* str,_OverChnPwrRequest* _over_chn
         return -1;
     }
     cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
-    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    cJSON* cjson_chn_id = cJSON_GetObjectItem(cjson,"productChId");
-    //cJSON* cjson_name = cJSON_GetObjectItem(cjson,"productName");
-    //cJSON* cjson_chn_name = cJSON_GetObjectItem(cjson,"productChName");
-
-
     if(cjson_token!=NULL)
         _over_chn_pwr_request->user_token = cjson_token->valuestring;
+
+    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
     if(cjson_type!=NULL)
         _over_chn_pwr_request->type = cjson_type->valuestring;
+
+    cJSON* cjson_chn_id = cJSON_GetObjectItem(cjson,"productChId");
     if(cjson_chn_id!=NULL)    //通道
-        _over_chn_pwr_request->productChId = cjson_chn_id->valueint ;
+        _over_chn_pwr_request->productChId = cjson_chn_id->valuestring ;
+
+    cJSON* cjson_product_name = cJSON_GetObjectItem(cjson,"productName");
+    if(cjson_product_name!=NULL)    //通道
+        _over_chn_pwr_request->product_name = cjson_product_name->valuestring ;
+
+    cJSON* cjson_productChName = cJSON_GetObjectItem(cjson,"productChName");
+    if(cjson_productChName!=NULL)    //通道
+        _over_chn_pwr_request->productChName = cjson_productChName->valuestring ;
+
+    cJSON* cjson_start_time = cJSON_GetObjectItem(cjson,"start_time");
+    if(cjson_start_time!=NULL)    //通道
+        _over_chn_pwr_request->start_time = cjson_start_time->valuestring ;
+
+    cJSON* cjson_end_time = cJSON_GetObjectItem(cjson,"end_time");
+    if(cjson_end_time!=NULL)    //通道
+        _over_chn_pwr_request->end_time = cjson_end_time->valuestring ;
+
+    cJSON* cjson_pageNum = cJSON_GetObjectItem(cjson,"pageNum");
+    if(cjson_end_time!=NULL)    //通道
+        _over_chn_pwr_request->pageNum = cjson_pageNum->valuestring ;
+
+    cJSON* cjson_pageSize = cJSON_GetObjectItem(cjson,"pageNum");
+    if(cjson_pageSize!=NULL)    //通道
+        _over_chn_pwr_request->pageSize = cjson_pageSize->valuestring ;
+
+    cJSON* cjson_ChannelLoadType= cJSON_GetObjectItem(cjson,"ChannelLoadType");
+    if(cjson_ChannelLoadType!=NULL)    //通道
+        _over_chn_pwr_request->ChannelLoadType = cjson_ChannelLoadType->valuestring ;
 
 
-    // _over_chn_pwr_request->user_token = cjson_token->valuestring;
-    // _over_chn_pwr_request->type = cjson_type->valuestring;
-    // _over_chn_pwr_request->product_name = cjson_name->valuestring;
-    // _over_chn_pwr_request->productChName = cjson_chn_name->valuestring;
-    // _over_chn_pwr_request->productChId = cjson_chn_id->valuestring;
     return 0 ;
 }
 
@@ -832,6 +864,106 @@ char* ctrl_sts_ack_to_json(void)
 }
 
 
+/// @brief 返回历史信息
+/// @param _globalPowerInfo 
+/// @param _globalDeviceInfo 
+/// @return 
+char* overall_power_history_to_json(GlobalPowerInfo* _globalPowerInfo,GlobalDeviceInfo* _globalDeviceInfo)
+{
+    GlobalPowerInfo* __globalPowerInfoTemp;
+    char* str = NULL;
+    char temp[32] = {0};
+    // 添加基本键值对
+    cJSON_AddNumberToObject(root, "code", 200); 
+    //创建数据
+    cJSON* data_root_array = cJSON_CreateArray();
+
+    list_for_each_entry(__globalPowerInfoTemp, &_globalPowerInfo.list, list)
+    {
+        //添加第一条记录
+        cJSON* data_filed = cJSON_CreateObject();
+        cJSON_AddStringToObject(data_filed,"productName",_globalDeviceInfo->product_name);
+        cJSON_AddStringToObject(data_filed,"productNumber",_globalDeviceInfo->product_number);
+        cJSON_AddNumberToObject(data_filed,"productId",_globalDeviceInfo->product_id);
+        sprintf(temp,"%0.3f", __globalPowerInfoTemp->_power_info.voltage);
+        cJSON_AddStringToObject(data_filed,"productVoltage",temp);
+        sprintf(temp,"%0.3f", __globalPowerInfoTemp->_power_info.current);
+        cJSON_AddStringToObject(data_filed,"productCurrent",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.power);
+        cJSON_AddStringToObject(data_filed,"productPower",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.freq);
+        cJSON_AddStringToObject(data_filed,"productPowerFreq",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.consumption);  
+        cJSON_AddStringToObject(data_filed,"productConsumption",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.factor);                 
+        cJSON_AddStringToObject(data_filed,"productPowerFactor",temp);
+        cJSON_AddItemToObject(data_root_array, "data", data_filed);
+    }
+    //添加汇总
+    cJSON_AddItemToObject(root, "data", data_root_array);
+    //添加结果
+    cJSON_AddStringToObject(root, "msg", "操作成功");
+    //转换
+    str = cJSON_Print(root);    
+    //释放资源
+    cJSON_Delete(root);
+    return str;
+}
+
+
+/// @brief 返回通道历史信息
+/// @param _globalPowerInfo 
+/// @param _globalDeviceInfo 
+/// @return 
+char* over_channel_power_history_to_json(GlobalPowerInfo* _globalPowerInfo,GlobalDeviceInfo* _globalDeviceInfo,char* chn_name,char chn)
+{
+    GlobalPowerInfo* __globalPowerInfoTemp;
+    char* str = NULL;
+    char temp[32] = {0};
+    // 添加基本键值对
+    cJSON_AddNumberToObject(root, "code", 200); 
+    //创建数据
+    cJSON* data_root_array = cJSON_CreateArray();
+
+    
+
+    list_for_each_entry(__globalPowerInfoTemp, &_globalPowerInfo.list, list)
+    {
+        //添加第一条记录
+        cJSON* data_filed = cJSON_CreateObject();
+        cJSON_AddStringToObject(data_filed,"productName",_globalDeviceInfo->product_name);
+        cJSON_AddStringToObject(data_filed,"productNumber",_globalDeviceInfo->product_number);
+        cJSON_AddNumberToObject(data_filed,"productId",_globalDeviceInfo->product_id);
+        cJSON_AddStringToObject(data_filed,"productChName",chn_name);
+        cJSON_AddNumberToObject(data_filed,"productChId",chn);        
+        sprintf(temp,"%0.3f", __globalPowerInfoTemp->_power_info.voltage);
+        cJSON_AddStringToObject(data_filed,"productVoltage",temp);
+        sprintf(temp,"%0.3f", __globalPowerInfoTemp->_power_info.current);
+        cJSON_AddStringToObject(data_filed,"productCurrent",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.power);
+        cJSON_AddStringToObject(data_filed,"productPower",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.freq);
+        cJSON_AddStringToObject(data_filed,"productPowerFreq",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.consumption);  
+        cJSON_AddStringToObject(data_filed,"productConsumption",temp);
+        sprintf(temp,"%0.3f",__globalPowerInfoTemp->_power_info.factor);                 
+        cJSON_AddStringToObject(data_filed,"productPowerFactor",temp);
+        cJSON_AddStringToObject(data_filed,"productChStatus",_globalDeviceInfo->product_id);   
+        cJSON_AddItemToObject(data_root_array, "data", data_filed);
+    }
+    //添加汇总
+    cJSON_AddItemToObject(root, "data", data_root_array);
+    //添加结果
+    cJSON_AddStringToObject(root, "msg", "操作成功");
+    //转换
+    str = cJSON_Print(root);    
+    //释放资源
+    cJSON_Delete(root);
+    return str;
+}
+
+
+
 /// @brief 返回监控总信息
 /// @param _over_back_sts_info 
 /// @return 
@@ -955,7 +1087,7 @@ char* over_chn_pwr_monitor_to_json(_OverChnPwrAckInfo* _over_chn_pwr_back_info)
 /// @param str 
 /// @param _over_all_sensor_request 
 /// @return 
-int json_to_overall_sensor_status(const char* str,_OverSensorRequest* _over_all_sensor_request)
+int json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequest)
 {
     cJSON* cjson = NULL;
     cjson = cJSON_Parse(str);
@@ -965,12 +1097,66 @@ int json_to_overall_sensor_status(const char* str,_OverSensorRequest* _over_all_
         return -1;
     }
     cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
+    if(cjson_token!=NULL)
+        _over_all_sensor_request->user_token = cjson_token->valuestring;
+
     cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    cJSON* cjson_name = cJSON_GetObjectItem(cjson,"productName");
-    cJSON* cjson_number = cJSON_GetObjectItem(cjson,"productNumber");
+    if(cjson_type!=NULL)
+        _over_all_sensor_request->type = cjson_type->valuestring;
+
+    cJSON* cjson_productName = cJSON_GetObjectItem(cjson,"productName");
+    if(cjson_productName!=NULL)
+        _over_all_sensor_request->productName = cjson_productName->valuestring;
+
+    cJSON* cjson_productChName = cJSON_GetObjectItem(cjson,"productChName");
+    if(cjson_tcjson_productChNameype!=NULL)
+        _over_all_sensor_request->productChName = cjson_productChName->valuestring;
+
+    cJSON* cjson_productChId = cJSON_GetObjectItem(cjson,"productChId");
+    if(cjson_productChId!=NULL)
+        _over_all_sensor_request->productChId = cjson_productChId->valuestring;
+
+    cJSON* cjson_startTime = cJSON_GetObjectItem(cjson,"startTime");
+    if(cjson_startTime!=NULL)
+        _over_all_sensor_request->startTime = cjson_startTime->valuestring;
+
+    cJSON* cjson_endTime = cJSON_GetObjectItem(cjson,"endTime");
+    if(cjson_endTime!=NULL)
+        _over_all_sensor_request->endTime = cjson_endTime->valuestring;
+
+    cJSON* cjson_sensorId = cJSON_GetObjectItem(cjson,"sensorId");
+    if(cjson_sensorId!=NULL)
+        _over_all_sensor_request->sensorId = cjson_sensorId->valuestring;
+
+    cJSON* cjson_sensorType = cJSON_GetObjectItem(cjson,"sensorType");
+    if(sensorType!=NULL)
+        _over_all_sensor_request->sensorType = sensorType->valuestring;
+
+    cJSON* cjson_sensorName = cJSON_GetObjectItem(cjson,"sensorName");
+    if(cjson_sensorName!=NULL)
+        _over_all_sensor_request->sensorName = cjson_sensorName->valuestring;
+
+    cJSON* cjson_comSlogan = cJSON_GetObjectItem(cjson,"comSlogan");
+    if(cjson_comSlogan!=NULL)
+        _over_all_sensor_request->comSlogan = cjson_comSlogan->valuestring;
+
+    cJSON* cjson_sensorAddr = cJSON_GetObjectItem(cjson,"sensorAddr");
+    if(cjson_sensorAddr!=NULL)
+        _over_all_sensor_request->sensorAddr = cjson_sensorAddr->valuestring;
+
+    cJSON* cjson_sensorBaud = cJSON_GetObjectItem(cjson,"sensorBaud");
+    if(cjson_sensorBaud!=NULL)
+        _over_all_sensor_request->sensorBaud = cjson_sensorBaud->valuestring;
+
+    cJSON* cjson_connectionStatus = cJSON_GetObjectItem(cjson,"connectionStatus");
+    if(cjson_connectionStatus!=NULL)
+        _over_all_sensor_request->connectionStatus = cjson_connectionStatus->valuestring;
+
+
+    cJSON* cjson_connectionStatus = cJSON_GetObjectItem(cjson,"connectionStatus");
+    if(cjson_connectionStatus!=NULL)
+        _over_all_sensor_request->connectionStatus = cjson_connectionStatus->valuestring;
 
-    _over_all_sensor_request->user_token = cjson_token->valuestring;
-    _over_all_sensor_request->type = cjson_type->valuestring;
     return 0 ;
 }
 
@@ -1021,35 +1207,7 @@ char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_in
 }
 
 
-/// @brief 告警信息请求
-/// @param str 
-/// @param _over_all_sensor_request 
-/// @return 
-int json_to_alarm_request(const char* str,_AlarmRequestInfo* _alarm_request_info)
-{
-    cJSON* cjson = NULL;
-    cjson = cJSON_Parse(str);
-    if(cjson==NULL)
-    {
-        //log_e("Invalid JSON!");
-        return -1;
-    }
-    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
-    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
-    cJSON* cjson_alarmType = cJSON_GetObjectItem(cjson,"alarmType");
 
-    //cJSON_GetArrayItem
-
-    cJSON* cjson_begin_time = cJSON_GetObjectItem(cjson,"beginTime");
-    cJSON* cjson_end_time = cJSON_GetObjectItem(cjson,"endTime");
-
-    _alarm_request_info->user_token = cjson_token->valuestring;
-    _alarm_request_info->type = cjson_type->valuestring;
-    _alarm_request_info->alarmType = cjson_type->valuestring;
-    _alarm_request_info->begin_time = cjson_begin_time->valuestring;
-    _alarm_request_info->end_time = cjson_end_time->valuestring;
-    return 0 ;
-}
 
 
 /// @brief 返回传感器信息
@@ -1093,4 +1251,273 @@ char* alarm_info_to_json(_AlarmAckInfo* _alarm_ack_info)
     //释放资源
     cJSON_Delete(root);
     return str;
+}
+
+
+/// @brief 告警信息请求
+/// @param str 
+/// @param _over_all_sensor_request 
+/// @return 
+int json_to_alarm_manage(const char* str,_AlarmRequestInfo* _alarm_request_info)
+{
+    cJSON* cjson = NULL;
+    cjson = cJSON_Parse(str);
+    if(cjson==NULL)
+    {
+        //log_e("Invalid JSON!");
+        return -1;
+    }
+    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
+    if(cjson_token!=NULL)
+        _alarm_request_info->user_token = cjson_token->valuestring;
+
+    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
+    if(cjson_type!=NULL)
+        _alarm_request_info->type = cjson_type->valuestring ;
+
+    cJSON* cjson_alarmContentUpperValue = cJSON_GetObjectItem(cjson,"alarmContentUpperValue");
+    if(cjson_alarmContentUpperValue!=NULL)
+        _alarm_request_info->_pwr_info->alarmContentUpperValue = cjson_alarmContentUpperValue->valuestring ;
+
+    cJSON* cjson_currentUpperValue = cJSON_GetObjectItem(cjson,"currentUpperValue");
+    if(cjson_currentUpperValue!=NULL)
+        _alarm_request_info->_pwr_info->currentUpperValue = cjson_currentUpperValue->valuestring ;
+
+    cJSON* cjson_powerUpperValue = cJSON_GetObjectItem(cjson,"powerUpperValue");
+    if(cjson_powerUpperValue!=NULL)
+        _alarm_request_info->_pwr_info->powerUpperValue = cjson_powerUpperValue->valuestring ;
+
+    cJSON* cjson_productChId = cJSON_GetObjectItem(cjson,"productChId");
+    if(cjson_productChId!=NULL)
+        _alarm_request_info->_pwr_info->productChId = cjson_productChId->valuestring ;
+
+    cJSON* cjson_productChName = cJSON_GetObjectItem(cjson,"productChName");
+    if(cjson_productChName!=NULL)
+        _alarm_request_info->_pwr_info->productChName = cjson_productChName->valuestring ;
+
+    cJSON* cjson_voltageDownValue = cJSON_GetObjectItem(cjson,"voltageDownValue");
+    if(cjson_voltageDownValue!=NULL)
+        _alarm_request_info->_pwr_info->voltageDownValue = cjson_voltageDownValue->valuestring ;
+
+    cJSON* cjson_voltageUpperValue = cJSON_GetObjectItem(cjson,"voltageUpperValue");
+    if(cjson_voltageUpperValue!=NULL)
+        _alarm_request_info->_pwr_info->voltageUpperValue = cjson_voltageUpperValue->valuestring ;
+ 
+    cJSON* cjson_connectionStatus = cJSON_GetObjectItem(cjson,"connectionStatus");
+    if(cjson_connectionStatus!=NULL)
+        _alarm_request_info->_sensor_info->connectionStatus = cjson_connectionStatus->valuestring ;  
+
+    cJSON* cjson_sensorId = cJSON_GetObjectItem(cjson,"sensorId");
+    if(cjson_sensorId!=NULL)
+        _alarm_request_info->_sensor_info->sensorId = cjson_sensorId->valuestring ;  
+
+    cJSON* cjson_sensorName = cJSON_GetObjectItem(cjson,"sensorName");
+    if(cjson_sensorName!=NULL)
+        _alarm_request_info->_sensor_info->sensorName = cjson_sensorName->valuestring ;  
+
+    cJSON* cjson_sensorType = cJSON_GetObjectItem(cjson,"sensorType");
+    if(cjson_sensorType!=NULL)
+        _alarm_request_info->_sensor_info->sensorType = cjson_sensorType->valuestring ;  
+
+    cJSON* cjson_thresholdDownValue = cJSON_GetObjectItem(cjson,"thresholdDownValue");
+    if(cjson_thresholdDownValue!=NULL)
+        _alarm_request_info->_sensor_info->thresholdDownValue = cjson_thresholdDownValue->valuestring ;  
+
+    cJSON* cjson_thresholdUpperValue = cJSON_GetObjectItem(cjson,"thresholdUpperValue");
+    if(cjson_thresholdUpperValue!=NULL)
+        _alarm_request_info->_sensor_info->thresholdUpperValue = cjson_thresholdUpperValue->valuestring ;
+
+    return 0 ;
+}
+
+/// @brief 日志信息查询
+/// @param str 
+/// @param _logInformationRequestInfo 
+/// @return 
+int json_to_loginformation_manage(const char* str,_LogInformationRequestInfo* _logInformationRequestInfo)
+{
+    cJSON* cjson = NULL;
+    cjson = cJSON_Parse(str);
+    if(cjson==NULL)
+    {
+        //log_e("Invalid JSON!");
+        return -1;
+    }
+    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
+    if(cjson_token!=NULL)
+        _logInformationRequestInfo->user_token = cjson_token->valuestring;
+    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
+    if(cjson_type!=NULL)
+        _logInformationRequestInfo->type = cjson_type->valuestring ;  
+
+    cJSON* cjson_alarm_type = cJSON_GetObjectItem(cjson,"alarmType");
+    if(cjson_alarm_type!=NULL)
+        _logInformationRequestInfo->alarmType = cjson_alarm_type->valuestring ;  
+
+    cJSON* cjson_begin_time = cJSON_GetObjectItem(cjson,"beginTime");
+    if(cjson_begin_time!=NULL)
+        _logInformationRequestInfo->beginTime = cjson_begin_time->valuestring ;  
+
+    cJSON* cjson_end_time = cJSON_GetObjectItem(cjson,"endTime");
+    if(cjson_end_time!=NULL)
+        _logInformationRequestInfo->endtime = cjson_end_time->valuestring ;  
+
+    cJSON* cjson_pagenum = cJSON_GetObjectItem(cjson,"pageNum");
+    if(cjson_pagenum!=NULL)
+        _logInformationRequestInfo->pagenum = cjson_pagenum->valuestring ;  
+
+    cJSON* cjson_pagesize  = cJSON_GetObjectItem(cjson,"pageSize");
+    if(cjson_pagesize!=NULL)
+        _logInformationRequestInfo->pagesize = cjson_pagenum->valuestring ;  
+
+    cJSON* cjson_openName  = cJSON_GetObjectItem(cjson,"operName");
+    if(cjson_openName!=NULL)
+        _logInformationRequestInfo->openName = cjson_openName->valuestring ;  
+
+    return 0;
+}
+
+/// @brief 通信管理
+/// @param str 
+/// @param _communicationRequestInfo 
+/// @return 
+int json_to_communication_manage(const char* str,_CommunicationManageRequestInfo* _communicationRequestInfo)
+{
+    cJSON* cjson = NULL;
+    cjson = cJSON_Parse(str);
+    if(cjson==NULL)
+    {
+        //log_e("Invalid JSON!");
+        return -1;
+    }
+    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
+    if(cjson_token!=NULL)
+        _communicationRequestInfo->user_token = cjson_token->valuestring;
+    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
+    if(cjson_type!=NULL)
+        _communicationRequestInfo->type = cjson_type->valuestring ;
+    //网络配置上传参数
+    if(strcmp(_communicationRequestInfo->type,"WkSave")==0)
+    {     
+        cJSON* cjson_net_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_net_ipaddr = cJSON_GetObjectItem(cjson,"ipaddress");  
+        cJSON* cjson_net_mask = cJSON_GetObjectItem(cjson,"mask");  
+        cJSON* cjson_net_gateway = cJSON_GetObjectItem(cjson,"gateway");  
+        cJSON* cjson_net_dns1 = cJSON_GetObjectItem(cjson,"dns1");  
+        cJSON* cjson_net_dns2 = cJSON_GetObjectItem(cjson,"dns2");  
+        cJSON* cjson_net_mac = cJSON_GetObjectItem(cjson,"mac");  
+
+        if(cjson_net_mode!=NULL)
+            _communicationRequestInfo->_net_info->mode = cjson_net_mode->valuestring ;
+        if(cjson_net_ipaddr!=NULL)
+            _communicationRequestInfo->_net_info->ipaddr = cjson_net_ipaddr->valuestring ;
+        if(cjson_net_mask!=NULL)
+            _communicationRequestInfo->_net_info->maskaddr = cjson_net_mask->valuestring ;
+        if(cjson_net_gateway!=NULL)
+            _communicationRequestInfo->_net_info->gateway = cjson_net_gateway->valuestring ;
+        if(cjson_net_dns1!=NULL)
+            _communicationRequestInfo->_net_info->dns1 = cjson_net_dns1->valuestring ;
+        if(cjson_net_dns2!=NULL)
+            _communicationRequestInfo->_net_info->dns2 = cjson_net_dns2->valuestring ;
+    }
+    //RS485配置
+    if(strcmp(_communicationRequestInfo->type,"RsSave")==0)
+    { 
+        cJSON* cjson_rs_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_rs_baud = cJSON_GetObjectItem(cjson,"sensorBaud");  
+        if(cjson_rs_mode!=NULL)
+            _communicationRequestInfo->_rs_info->mode = cjson_rs_mode->valuestring ;
+        if(cjson_rs_baud!=NULL)
+            _communicationRequestInfo->_rs_info->baud = cjson_rs_baud->valuestring ;
+    }
+    return 0;
+}
+
+/// @brief JSON服务参数获取
+/// @param str 
+/// @param _serviceManageRequestInfo 
+/// @return 
+int json_to_service_manage(const char* str,_ServiceManageRequestInfo* _serviceManageRequestInfo)
+{
+    cJSON* cjson = NULL;
+    cjson = cJSON_Parse(str);
+    if(cjson==NULL)
+    {
+        //log_e("Invalid JSON!");
+        return -1;
+    }
+    cJSON* cjson_token = cJSON_GetObjectItem(cjson,"token");
+    if(cjson_token!=NULL)
+        _serviceManageRequestInfo->user_token = cjson_token->valuestring;
+    cJSON* cjson_type = cJSON_GetObjectItem(cjson,"type");
+    if(cjson_type!=NULL)
+        _serviceManageRequestInfo->type = cjson_type->valuestring ;
+    
+    ///SMTP上传参数
+    if(strcmp(_serviceManageRequestInfo->type,"SmtpSave")==0)
+    {     
+        cJSON* cjson_smtp_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_smtp_account = cJSON_GetObjectItem(cjson,"smtpAccount");  
+        cJSON* cjson_smtp_passwd = cJSON_GetObjectItem(cjson,"passWord");  
+        cJSON* cjson_smtp_server = cJSON_GetObjectItem(cjson,"server");  
+        cJSON* cjson_smtp_port = cJSON_GetObjectItem(cjson,"port");  
+        cJSON* cjson_smtp_auth = cJSON_GetObjectItem(cjson,"auth");  
+        cJSON* cjson_smtp_receive_account = cJSON_GetObjectItem(cjson,"receiveAccount"); 
+        if(cjson_smtp_mode!=NULL)
+            _serviceManageRequestInfo->_smtp_info->mode = cjson_smtp_mode->valuestring ;
+        if(cjson_smtp_account!=NULL)
+            _serviceManageRequestInfo->_smtp_info->smtpAccount = cjson_smtp_account->valuestring ;           
+        if(cjson_smtp_passwd!=NULL)
+            _serviceManageRequestInfo->_smtp_info->passWord = cjson_smtp_passwd->valuestring ; 
+        if(cjson_smtp_server!=NULL)
+            _serviceManageRequestInfo->_smtp_info->server = cjson_smtp_server->valuestring ; 
+        if(cjson_smtp_port!=NULL)
+            _serviceManageRequestInfo->_smtp_info->port = cjson_smtp_port->valuestring ; 
+        if(cjson_smtp_auth!=NULL)
+            _serviceManageRequestInfo->_smtp_info->auth = cjson_smtp_auth->valuestring ; 
+        if(cjson_smtp_receive_account!=NULL)
+            _serviceManageRequestInfo->_smtp_info->receiveAccount = cjson_smtp_receive_account->valuestring ; 
+    }
+    //SNMP上传参数
+    else if(strcmp(_serviceManageRequestInfo->type,"SnmpSave")==0)
+    {
+        cJSON* cjson_snmp_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_snmp_port = cJSON_GetObjectItem(cjson,"port"); 
+
+        if(cjson_snmp_mode!=NULL)
+            _serviceManageRequestInfo->_snmp_info->mode = cjson_snmp_mode->valuestring ;
+        if(cjson_snmp_port!=NULL)
+            _serviceManageRequestInfo->_snmp_info->port = cjson_snmp_port->valuestring ;        
+    }
+    //SNMP TRAP参数
+    else if(strcmp(_serviceManageRequestInfo->type,"StSave")==0)
+    {
+        cJSON* cjson_snmp_trap_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_snmp_trap__port = cJSON_GetObjectItem(cjson,"stType"); 
+
+        if(cjson_snmp_trap_mode!=NULL)
+            _serviceManageRequestInfo->_snmp_trap_info->mode = cjson_snmp_trap_mode->valuestring ;
+        if(cjson_snmp_trap__port!=NULL)
+            _serviceManageRequestInfo->_snmp_trap_info->port = cjson_snmp_trap__port->valuestring ;    
+    }
+    //NTP参数
+    else if(strcmp(_serviceManageRequestInfo->type,"NtpSave")==0)
+    {
+        cJSON* cjson_ntp_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_ntp_name = cJSON_GetObjectItem(cjson,"ntpName");  
+        cJSON* cjson_ntp_address = cJSON_GetObjectItem(cjson,"ntpadress");   
+        cJSON* cjson_ntp_port = cJSON_GetObjectItem(cjson,"port");       
+        cJSON* cjson_ntp_datetime = cJSON_GetObjectItem(cjson,"time");  
+        if(cjson_ntp_mode!=NULL)
+            _serviceManageRequestInfo->_ntp_info->mode = cjson_ntp_mode->valuestring ;
+        if(cjson_ntp_name!=NULL)
+            _serviceManageRequestInfo->_ntp_info->ntpName = cjson_ntp_name->valuestring ;    
+        if(cjson_ntp_address!=NULL)
+            _serviceManageRequestInfo->_ntp_info->ntpadress = cjson_ntp_address->valuestring ;
+        if(cjson_ntp_port!=NULL)
+            _serviceManageRequestInfo->_ntp_info->port = cjson_ntp_port->valuestring ; 
+        if(cjson_ntp_datetime!=NULL)
+            _serviceManageRequestInfo->_ntp_info->datetime = cjson_ntp_datetime->valuestring ;                     
+    }
+    return 0;
 }

+ 157 - 9
Xianglinghui/05.src/pdu_ctrl_app/src/json_handle.h

@@ -29,11 +29,12 @@ typedef struct
     char*   user_token;
     char*   type; //listInfoQuery listQuery open close listHisQuery
     char*   product_name;
+    char*   product_id;
     char*   product_number;
     char*   start_time;
     char*   end_time;
-    int     page_num;
-    int     page_size;
+    char*     page_num;
+    char*     page_size;
 }_Over_All_Sts_Monitor;
 
 
@@ -71,7 +72,12 @@ typedef struct
     char* type;
     char* product_name;
     char* productChName;
-    char productChId;
+    char* productChId;
+    char* start_time;
+    char* end_time;
+    char* pageNum;
+    char* pageSize;
+    char* ChannelLoadType;
 }_OverChnPwrRequest;
 
 /// @brief 总体电源返回信息
@@ -97,7 +103,7 @@ typedef struct
 {
     char*           product_name;
     char*           product_number;   
-    int           product_id;
+    int             product_id;
     float           voltage                                     ;//电压
     float           current                                     ;//电流
     float           power                                       ;//功率
@@ -112,6 +118,22 @@ typedef struct
 {
     char* user_token;
     char* type;
+    char* productName;
+    char* productNumber;
+    char* productChName;
+    char* productChId;
+    char* startTime;
+    char* endTime;
+    char* page_num;
+    char* page_size;
+
+    char* sensorId;
+    char* sensorType;
+    char* sensorName;
+    char* comSlogan;
+    char* sensorAddr;
+    char* sensorBaud;
+    char* connectionStatus;
 }_OverSensorRequest;
 
 
@@ -136,14 +158,37 @@ typedef struct
     struct list_head list;
 }_OverSensorBackInfo;
 
+/// @brief 电源类阈值设置
+typedef struct 
+{
+    char* alarmContentUpperValue;
+    char* currentUpperValue;
+    char* powerUpperValue;
+    char* productChId;
+    char* productChName;
+    char* voltageDownValue;
+    char* voltageUpperValue;
+}_Power_AlarmRequestInfo;
+
+/// @brief 传感器类阈值设置
+typedef struct 
+{
+    char* connectionStatus  ;
+    char* sensorId;
+    char* sensorName;
+    char* sensorType;
+    char* thresholdDownValue;
+    char* thresholdUpperValue;
+}_Sensor_AlarmRequestInfo;
+
+
 /// @brief 告警信息查询
 typedef struct
 {
     char* user_token;
     char* type;
-    char* alarmType;
-    char* begin_time;
-    char* end_time;
+    _Power_AlarmRequestInfo* _pwr_info;
+    _Sensor_AlarmRequestInfo* _sensor_info;
 }_AlarmRequestInfo;
 
 /// @brief 告警响应信息
@@ -159,6 +204,99 @@ typedef struct
 }_AlarmAckInfo;
 
 
+/// @brief SMPT服务信息
+typedef struct 
+{
+    char*  mode;
+    char* smtpAccount;
+    char* passWord;
+    char* server;
+    char* port;
+    char* auth;
+    char* receiveAccount;
+}_SMPT_ServerRequestInfo;
+
+/// @brief SNMP信息
+typedef struct
+{
+    char*  mode;
+    char* port;
+}_SNMP_ServerRequestInfo;
+
+/// @brief SNMP TRAP信息
+typedef struct
+{
+    char* mode;
+    char* stType;
+}_SNMPTRAP_ServerRequestInfo;
+
+/// @brief NTP信息
+typedef struct 
+{
+    char* mode;
+    char* ntpName;
+    char* ntpadress;
+    char* port;
+    char* datetime;
+}_NTP_ServiceRequestInfo;
+
+
+/// @brief 服务信息查询
+typedef struct
+{
+    char* user_token;
+    char* type;
+    _SMPT_ServerRequestInfo* _smtp_info ;
+    _SNMP_ServerRequestInfo* _snmp_info ;
+    _SNMPTRAP_ServerRequestInfo* _snmp_trap_info;
+    _NTP_ServiceRequestInfo* _ntp_info ;
+}_ServiceManageRequestInfo;
+
+
+/// @brief 网络参数配置
+typedef struct
+{
+    char* mode;
+    char* ipaddr;
+    char* maskaddr;
+    char* gateway;
+    char* dns1;
+    char* dns2;
+}_NET_CommunicationRequestInfo;
+
+/// @brief  RS参数配置
+typedef struct 
+{
+    char* mode;
+    char*  baud;
+}_RS_CommunicationRequestInfo;
+
+
+/// @brief 通信信息查询
+typedef struct
+{
+    char* user_token;
+    char* type;
+    _NET_CommunicationRequestInfo* _net_info;
+    _RS_CommunicationRequestInfo* _rs_info;
+}_CommunicationManageRequestInfo;
+
+
+
+/// @brief日志信息查询
+typedef struct
+{
+    char* user_token;
+    char* type;
+    char* alarmType;
+    char* beginTime;
+    char* endtime;
+    char* pagenum;
+    char* pagesize;
+    char* openName;
+}_LogInformationRequestInfo;
+
+
 char* ctrl_sts_ack_to_json(void);
 
 void get_rand_str(char* s,int num);
@@ -167,11 +305,15 @@ char* log_info_to_json(const char* token);
 
 char* user_info_to_json(void);
 char* user_routers_info_to_json(void);
-char* user_routers_info_to_json(void);
+
 
 int json_to_overall_status_monitor(const char* str,_Over_All_Sts_Monitor* _over_all_sts_monitor);
 char* over_all_monitor_to_json(_OverBackStsInfo* _over_back_sts_info);
 
+char* overall_power_history_to_json(GlobalPowerInfo* _globalPowerInfo,GlobalDeviceInfo* _globalDeviceInfo);
+
+char* over_channel_power_history_to_json(GlobalPowerInfo* _globalPowerInfo,GlobalDeviceInfo* _globalDeviceInfo,char* chn_name,char chn);
+
 int json_to_overall_pwr_status_monitor(const char* str,_OverAllPwrRequest* _over_all_pwr_request);
 char* over_all_pwr_monitor_to_json(_OverAllPwrAckInfo* _over_all_pwr_back_info);
 
@@ -182,9 +324,15 @@ int json_to_overall_sensor_status(const char* str,_OverSensorRequest* _over_all_
 char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_info);
 
 
-int json_to_alarm_request(const char* str,_AlarmRequestInfo* _alarm_request_info);
 char* alarm_info_to_json(_AlarmAckInfo* _alarm_ack_info);
 
 
+///请求管理
+int json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequest);
+int json_to_alarm_manage(const char* str,_AlarmRequestInfo* _alarm_request_info);
+int json_to_loginformation_manage(const char* str,_LogInformationRequestInfo* _logInformationRequestInfo);
+int json_to_communication_manage(const char* str,_CommunicationManageRequestInfo* _communicationRequestInfo);
+int json_to_service_manage(const char* str,_ServiceManageRequestInfo* _serviceManageRequestInfo);
+
 #endif
 

+ 112 - 26
Xianglinghui/05.src/pdu_ctrl_app/src/sqlite_handle.c

@@ -242,7 +242,15 @@ int dev_search_latest_power_info(sqlite3 *db,int product_id,int product_ch_id,Gl
 /// @param size       查询数据个数
 /// @param _globalPowerInfo 返回信息
 /// @return 
-int dev_search_power_info(sqlite3 *db,int product_id,int product_ch_id,char* start_time,char* stop_time,int* size,GlobalPowerInfo* _globalPowerInfo)
+int dev_search_power_info(sqlite3 *db,
+                        int product_id,
+                        int product_ch_id,
+                        char* start_time,
+                        char* stop_time,
+                        int page,
+                        int pageSize,
+                        int* size,
+                        GlobalPowerInfo* _globalPowerInfo)
 {
     //按时间段查询语句
     //SELECT* FROM Table_PowerInfo WHERE product_id=product_id AND (product_samp_time BETWEEN 'start_time' AND 'stop_time');
@@ -254,11 +262,13 @@ int dev_search_power_info(sqlite3 *db,int product_id,int product_ch_id,char* sta
     char** pResult = NULL;  //用来指向sql执行结果的指针
     char* err_msg=NULL;
  
-    sprintf(select_sql,"SELECT* FROM Table_PowerInfo WHERE (product_id=%d AND product_ch_id=%d) AND (product_samp_time BETWEEN '%s' AND '%s');",
+    sprintf(select_sql,"SELECT* FROM Table_PowerInfo WHERE (product_id=%d AND product_ch_id=%d) AND (product_samp_time BETWEEN '%s' AND '%s') LIMIT %d OFFSET %d;",
                         product_id,
                         product_ch_id,
                         start_time,
-                        stop_time);
+                        stop_time,
+                        pageSize,
+                        page);
     res = sqlite3_get_table(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
     if(res != SQLITE_OK)
         return -1 ;  
@@ -268,26 +278,21 @@ int dev_search_power_info(sqlite3 *db,int product_id,int product_ch_id,char* sta
     int k = 0 ;
     for (size_t i = 1; i < nrow + 1; i++)
     {
-        //for (size_t j = 0; j < ncolumn; j++)
-        //{
-            GlobalPowerInfo* _globalPowerInfoTemp = (GlobalPowerInfo*)malloc(sizeof(GlobalPowerInfo));
-            if(_globalPowerInfoTemp==NULL)
-                 return -1 ;
-            strcpy(_globalPowerInfoTemp->samp_time,pResult[i*ncolumn+0]);//i=0 10 
-            _globalPowerInfoTemp->product_id = atoi(pResult[i*ncolumn+1]);
-            _globalPowerInfoTemp->product_ch_id =  atoi(pResult[i*ncolumn+2]);
-            _globalPowerInfoTemp->product_status =  atoi(pResult[i*ncolumn+3]);
-            _globalPowerInfoTemp->_power_info.voltage = atof(pResult[i*ncolumn+4]);
-            _globalPowerInfoTemp->_power_info.current = atof(pResult[i*ncolumn+5]);
-            _globalPowerInfoTemp->_power_info.power = atof(pResult[i*ncolumn+6]);
-            _globalPowerInfoTemp->_power_info.freq = atof(pResult[i*ncolumn+7]);
-            _globalPowerInfoTemp->_power_info.consumption = atof(pResult[i*ncolumn+8]);
-            _globalPowerInfoTemp->_power_info.factor = atof(pResult[i*ncolumn+9]);
-            _globalPowerInfoTemp->list.next = NULL;
-            _globalPowerInfoTemp->list.prev = NULL ;
-            //尾部插入
-            list_add_tail(&_globalPowerInfoTemp->list, &_globalPowerInfo->list);
-        //}
+        GlobalPowerInfo* _globalPowerInfoTemp = (GlobalPowerInfo*)malloc(sizeof(GlobalPowerInfo));
+        if(_globalPowerInfoTemp==NULL)
+                return -1 ;
+        strcpy(_globalPowerInfoTemp->samp_time,pResult[i*ncolumn+0]);//i=0 10 
+        _globalPowerInfoTemp->product_id = atoi(pResult[i*ncolumn+1]);
+        _globalPowerInfoTemp->product_ch_id =  atoi(pResult[i*ncolumn+2]);
+        _globalPowerInfoTemp->product_status =  atoi(pResult[i*ncolumn+3]);
+        _globalPowerInfoTemp->_power_info.voltage = atof(pResult[i*ncolumn+4]);
+        _globalPowerInfoTemp->_power_info.current = atof(pResult[i*ncolumn+5]);
+        _globalPowerInfoTemp->_power_info.power = atof(pResult[i*ncolumn+6]);
+        _globalPowerInfoTemp->_power_info.freq = atof(pResult[i*ncolumn+7]);
+        _globalPowerInfoTemp->_power_info.consumption = atof(pResult[i*ncolumn+8]);
+        _globalPowerInfoTemp->_power_info.factor = atof(pResult[i*ncolumn+9]);
+        //尾部插入
+        list_add_tail(&_globalPowerInfoTemp->list, &_globalPowerInfo->list);
     }
     *size = nrow;
     sqlite3_free_table(pResult);
@@ -535,6 +540,48 @@ int dev_insert_sensor_info(sqlite3 *db,GlobalSensorInfo* _globalSensorInfo)
     return 0;
 }
 
+/// @brief 返回传感器的最新值
+/// @param db 
+/// @param product_id 
+/// @param sensor_id 
+/// @param sensor_type 
+/// @param _globalSensorInfo 
+/// @return 
+int dev_serach_latest_sensor_info(sqlite3 *db,int product_id,int sensor_id,GlobalSensorInfo* _globalSensorInfo)
+{
+    int res ;
+    char select_sql[256] = {0};
+    char *errorMsg = NULL;
+    int nrow = 1;               //满足条件的记录数目
+    int ncolumn = 0;            //每条记录包含的字段数据
+    char** pResult = NULL;  //用来指向sql执行结果的指针
+    char* err_msg=NULL;
+
+    sprintf(select_sql,"SELECT * FROM Table_SensorInfo WHERE product_id=%d AND product_ch_id=%d ORDER BY product_samp_time DESC LIMIT 1;",
+                        product_id,
+                        sensor_id);
+
+    res = sqlite3_get_table(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
+    if(res != SQLITE_OK)
+    {
+        log_e("sqlite handle error.");
+        return -1 ;  
+    }    
+    if(nrow==0)
+    {
+        log_e("sqlite search no data.");
+        return -1 ;
+    }
+    strcpy(_globalSensorInfo->samp_time,pResult[nrow*ncolumn+0]);
+    _globalSensorInfo->product_id = atoi(pResult[nrow*ncolumn+1]);
+    _globalSensorInfo->sensor_id = atoi(pResult[nrow*ncolumn+2]);
+    _globalSensorInfo->val1 = atof(pResult[nrow*ncolumn+3]);
+    _globalSensorInfo->val2 = atof(pResult[nrow*ncolumn+4]);
+    sqlite3_free_table(pResult);
+    return 0;
+}
+
+
 /// @brief 查询传感器信息
 /// @param db 
 /// @param product_id 
@@ -544,7 +591,15 @@ int dev_insert_sensor_info(sqlite3 *db,GlobalSensorInfo* _globalSensorInfo)
 /// @param size 
 /// @param _globalSensorInfo 
 /// @return 
-int dev_search_sensor_info(sqlite3 *db,int product_id,int sensor_id,char* start_time,char* stop_time,int* size,GlobalSensorInfo* _globalSensorInfo)
+int dev_search_sensor_info(sqlite3 *db,
+                        int product_id,
+                        int sensor_id,
+                        char* start_time,
+                        char* stop_time,
+                        int pageNum,
+                        int pageSize,
+                        int* size,
+                        GlobalSensorInfo* _globalSensorInfo)
 {
     //按时间段查询语句
     //SELECT* FROM Table_PowerInfo WHERE product_id=product_id AND (product_samp_time BETWEEN 'start_time' AND 'stop_time');
@@ -557,11 +612,13 @@ int dev_search_sensor_info(sqlite3 *db,int product_id,int sensor_id,char* start_
     char** pResult = NULL;  //用来指向sql执行结果的指针
     char* err_msg=NULL;
  
-    sprintf(select_sql,"SELECT* FROM Table_SensorInfo WHERE (product_id=%d) AND (sensor_id=%d) AND (sensor_samp_time BETWEEN '%s' AND '%s');",
+    sprintf(select_sql,"SELECT* FROM Table_SensorInfo WHERE (product_id=%d) AND (sensor_id=%d) AND (sensor_samp_time BETWEEN '%s' AND '%s') LIMIT %d OFFSET %d;",
                         product_id,
                         sensor_id,
                         start_time,
-                        stop_time);
+                        stop_time,
+                        pageSize,
+                        pageNum);
     res = sqlite3_get_table(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
     if(res != SQLITE_OK)
         return -1 ;  
@@ -591,6 +648,35 @@ int dev_search_sensor_info(sqlite3 *db,int product_id,int sensor_id,char* start_
     return 0;
 }
 
+/// @brief 删除一条传感器信息
+/// @param db 
+/// @param product_id 
+/// @param sensor_id 
+/// @return 
+int dev_delete_sensor_manage(sqlite3 *db,int product_id,int sensor_id)
+{
+    int res ;
+    char select_sql[256] = {0};
+    char *errorMsg = NULL;
+    int nrow = 0;               //满足条件的记录数目
+    int ncolumn = 0;            //每条记录包含的字段数据
+    char** pResult = NULL;  //用来指向sql执行结果的指针
+    char* err_msg=NULL;   
+
+    sprintf(select_sql,"DELETE FROM Table_SensorManage WHERE product_id=%d AND sensor_id=%d;",
+                _globalSensorManger->product_id,
+                _globalSensorManger->sensor_id,
+    );
+    res = sqlite3_get_table(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
+    if(res != SQLITE_OK)
+        return -1 ;  
+    sqlite3_free_table(pResult);
+    return 0;
+}
+
+
+
+
 /// @brief 插入一条传感器管理信息
 /// @param db 
 /// @param _globalSensorManger 

+ 22 - 4
Xianglinghui/05.src/pdu_ctrl_app/src/sqlite_handle.h

@@ -16,18 +16,36 @@ int dev_update_device_modus_info(sqlite3 *db,GlobalDeviceInfo* _globalDeviceInfo
 
 int dev_insert_power_info(sqlite3 *db,GlobalPowerInfo* _globalPowerChnInfo);
 int dev_search_latest_power_info(sqlite3 *db,int product_id,int product_ch_id,GlobalPowerInfo* _globalPowerInfo);
-int dev_search_power_info(sqlite3 *db,int product_id,int product_ch_id,char* start_time,char* stop_time,int* size,GlobalPowerInfo* _globalPowerInfo);
-
+int dev_search_power_info(sqlite3 *db,
+                        int product_id,
+                        int product_ch_id,
+                        char* start_time,
+                        char* stop_time,
+                        int page,
+                        int pageSize,
+                        int* size,
+                        GlobalPowerInfo* _globalPowerInfo);
+                        
 int dev_insert_power_manage_info(sqlite3 *db,int product_id,int product_ch_id,GlobalPowerManger* _globalPowerChnManger);
 int dev_get_power_manage_info(sqlite3 *db,int product_id,int product_ch_id,GlobalPowerManger* _globalPowerChnManger);
 int dev_update_power_manage_genera_info(sqlite3 *db,int product_id,int product_ch_id,GlobalPowerManger* _globalPowerChnManger);
 int dev_update_power_manage_over_info(sqlite3 *db,int product_id,int product_ch_id,GlobalPowerManger* _globalPowerChnManger);
 
 int dev_insert_sensor_info(sqlite3 *db,GlobalSensorInfo* _globalSensorInfo);
-int dev_search_sensor_info(sqlite3 *db,int product_id,int sensor_id,char* start_time,char* stop_time,int* size,GlobalSensorInfo* _globalSensorInfo);
+int dev_search_sensor_info(sqlite3 *db,
+                        int product_id,
+                        int sensor_id,
+                        char* start_time,
+                        char* stop_time,
+                        int pageNum,
+                        int pageSize,
+                        int* size,
+                        GlobalSensorInfo* _globalSensorInfo);
+
+int dev_serach_latest_sensor_info(sqlite3 *db,int product_id,int sensor_id,GlobalSensorInfo* _globalSensorInfo);
 
 int dev_insert_sensor_genera_manage(sqlite3 *db,GlobalSensorManger* _globalSensorManger);
 int dev_update_sensor_genera_manage(sqlite3 *db,int product_id,int sensor_id,GlobalSensorManger* _globalSensorManger);
 int dev_update_sensor_over_manage(sqlite3 *db,int product_id,int sensor_id,GlobalSensorManger* _globalSensorManger);
-
+int dev_delete_sensor_manage(sqlite3 *db,int product_id,int sensor_id);
 #endif