This is an automated email from the ASF dual-hosted git repository. pkarashchenko pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit 06f39d10f15c7e68b3bd1c528bb7bb89fe5a8bd0 Author: Junbo Zheng <zhengjun...@xiaomi.com> AuthorDate: Mon Sep 12 15:43:36 2022 +0800 apps/nshlib: add uptime command support run uptime command on sim: nsh> nsh> nsh> uptime 19:35:01 up 1:40, load average: 0.00, 0.00, 0.00 nsh> nsh> nsh> uptime -s 2022-09-16 17:54:26 nsh> nsh> nsh> uptime -p up 1 hour, 40 minutes nsh> nsh> nsh> uptime -h Usage: uptime [options] Options: -p, show uptime in pretty format -h, display this help and exit -s, system up since nsh> nsh> nsh> uptime -abc uptime: invalid option -- -abc Usage: uptime [options] Options: -p, show uptime in pretty format -h, display this help and exit -s, system up since nsh> nsh> nsh> date Fri, Sep 16 19:35:18 2022 nsh> nsh> Signed-off-by: Junbo Zheng <zhengjun...@xiaomi.com> --- nshlib/Kconfig | 4 ++ nshlib/nsh.h | 4 ++ nshlib/nsh_command.c | 4 ++ nshlib/nsh_proccmds.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+) diff --git a/nshlib/Kconfig b/nshlib/Kconfig index 263ab5132..24e508e16 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -518,6 +518,10 @@ config NSH_DISABLE_UNSET bool "Disable unset" default DEFAULT_SMALL +config NSH_DISABLE_UPTIME + bool "Disable uptime" + default DEFAULT_SMALL + config NSH_DISABLE_URLDECODE bool "Disable urldecode" default DEFAULT_SMALL diff --git a/nshlib/nsh.h b/nshlib/nsh.h index 2bf66591b..1b98d0b0c 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -1204,6 +1204,10 @@ int cmd_pmconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); int cmd_usleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif +#ifndef CONFIG_NSH_DISABLE_UPTIME + int cmd_uptime(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv); +#endif + #if defined(CONFIG_NETUTILS_CODECS) && defined(CONFIG_CODECS_BASE64) # ifndef CONFIG_NSH_DISABLE_BASE64DEC int cmd_base64decode(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c index d577e21b1..5e53ea6f4 100644 --- a/nshlib/nsh_command.c +++ b/nshlib/nsh_command.c @@ -564,6 +564,10 @@ static const struct cmdmap_s g_cmdmap[] = { "unset", cmd_unset, 2, 2, "<name>" }, #endif +#ifndef CONFIG_NSH_DISABLE_UPTIME + { "uptime", cmd_uptime, 1, 2, "[-sph]" }, +#endif + #if defined(CONFIG_NETUTILS_CODECS) && defined(CONFIG_CODECS_URLCODE) # ifndef CONFIG_NSH_DISABLE_URLDECODE { "urldecode", cmd_urldecode, 2, 3, "[-f] <string or filepath>" }, diff --git a/nshlib/nsh_proccmds.c b/nshlib/nsh_proccmds.c index 099f40d3c..ef413ed98 100644 --- a/nshlib/nsh_proccmds.c +++ b/nshlib/nsh_proccmds.c @@ -33,6 +33,8 @@ #include <dirent.h> #include <errno.h> #include <signal.h> +#include <sys/sysinfo.h> +#include <time.h> #include "nsh.h" #include "nsh_console.h" @@ -45,6 +47,15 @@ # define CONFIG_NSH_PROC_MOUNTPOINT "/proc" #endif +#ifndef CONFIG_NSH_DISABLE_UPTIME + #ifndef FSHIFT + # define FSHIFT SI_LOAD_SHIFT + #endif +# define FIXED_1 (1 << FSHIFT) /* 1.0 as fixed-point */ +# define LOAD_INT(x) ((x) >> FSHIFT) +# define LOAD_FRAC(x) (LOAD_INT(((x) & (FIXED_1 - 1)) * 100)) +#endif + /**************************************************************************** * Private Types ****************************************************************************/ @@ -758,3 +769,114 @@ int cmd_usleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) return OK; } #endif + +/**************************************************************************** + * Name: cmd_uptime + ****************************************************************************/ + +#ifndef CONFIG_NSH_DISABLE_UPTIME +int cmd_uptime(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) +{ + uint32_t updays; + uint32_t uphours; + uint32_t upminutes; + + time_t current_time_seconds; + FAR struct tm *current_time; + + struct sysinfo sys_info; + + time_t uptime = 0; + + bool pretty_format_opt = false; + bool system_load_opt = false; + + if (argc < 2) + { + system_load_opt = true; + + current_time_seconds = time(NULL); + current_time = localtime(¤t_time_seconds); + nsh_output(vtbl, "%02u:%02u:%02u ", current_time->tm_hour, + current_time->tm_min, current_time->tm_sec); + } + else if (strcmp(argv[1], "-p") == 0) + { + pretty_format_opt = true; + } + else if (strcmp(argv[1], "-s") == 0) + { + sysinfo(&sys_info); + time(¤t_time_seconds); + current_time_seconds -= sys_info.uptime; + current_time = localtime(¤t_time_seconds); + nsh_output(vtbl, "%04u-%02u-%02u %02u:%02u:%02u\n", + current_time->tm_year + 1900, current_time->tm_mon + 1, + current_time->tm_mday, current_time->tm_hour, + current_time->tm_min, current_time->tm_sec); + return OK; + } + else + { + if (strcmp(argv[1], "-h") != 0) + { + nsh_output(vtbl, "uptime: invalid option -- %s\n", argv[1]); + } + + nsh_output(vtbl, "Usage:\n"); + nsh_output(vtbl, "uptime [options]\n"); + + nsh_output(vtbl, "Options:\n"); + nsh_output(vtbl, "-p, show uptime in pretty format\n"); + nsh_output(vtbl, "-h, display this help and exit\n"); + nsh_output(vtbl, "-s, system up since\n"); + + return ERROR; + } + + sysinfo(&sys_info); + uptime = sys_info.uptime; + + updays = uptime / 86400; + uptime -= updays * 86400; + uphours = uptime / 3600; + uptime -= uphours * 3600; + upminutes = uptime / 60; + + nsh_output(vtbl, "up "); + + if (updays) + { + nsh_output(vtbl, "%" PRIu32 " day%s, ", updays, + (updays > 1) ? "s" : ""); + } + + if (pretty_format_opt) + { + if (uphours) + { + nsh_output(vtbl, "%" PRIu32 " hour%s, ", uphours, + (uphours > 1) ? "s" : ""); + } + + nsh_output(vtbl, "%" PRIu32 " minute%s", upminutes, + (upminutes > 1) ? "s" : ""); + } + else + { + nsh_output(vtbl, "%2" PRIu32 ":" "%02" PRIu32, uphours, upminutes); + } + + if (system_load_opt) + { + nsh_output(vtbl, ", load average: %lu.%02lu, %lu.%02lu, %lu.%02lu", + LOAD_INT(sys_info.loads[0]), LOAD_FRAC(sys_info.loads[0]), + LOAD_INT(sys_info.loads[1]), LOAD_FRAC(sys_info.loads[1]), + LOAD_INT(sys_info.loads[2]), LOAD_FRAC(sys_info.loads[2])); + } + + nsh_output(vtbl, "\n"); + + return OK; +} +#endif