1 Star 3 Fork 6

vtor3478 / vtor_elec_module

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
vtor_shell.c 7.03 KB
一键复制 编辑 原始数据 按行查看 历史
#include "vtor_shell.h"
#include "vtor_string.h"
#include "vtor_timer.h"
#ifdef __VTOR_SHELL__
VtorShell* vtorShellHeader = NULL;
void VtorShell_Void(void)
{
}
void VtorShell_Help(void)
{
VtorString_Print("\tVtorShell_Help(void)\r\n");
VtorString_Print("\tVtorShell designed by vtor3478@qq.com\r\n");
VtorString_Print("\tcurrent date 2024-05-28\r\n");
VtorString_Print("\tparameter must be int32_t\r\n");
VtorString_Print("\tuser determeter parameters number\r\n\r\n");
}
void VtorShell_List(void)
{
VtorShell* shell = vtorShellHeader;
while(NULL != shell->fun)
{
uint8_t shellListBuf[50] = {0};
VtorString_Clear(shellListBuf);
VtorString_AppendString(shellListBuf, "\t");
VtorString_AppendString(shellListBuf, shell->name);
VtorString_AppendString(shellListBuf, "\r\n");
VtorString_Print(shellListBuf);
shell++;
}
}
void VtorShell_Int(int32_t num)
{
uint8_t buf[50] = { 0 };
VtorString_Clear(buf);
VtorString_AppendString(buf, "\tVtorShell_Int(");
VtorString_AppendInt(buf, num);
VtorString_AppendString(buf, ") = hex(");
VtorString_AppendHex(buf, num);
VtorString_AppendString(buf, ")\r\n");
VtorString_Print(buf);
}
int32_t VtorShell_CallAddress(uint32_t addr)
{
return ((VtorShellFun)addr)();
}
void VtorShell_WriteMem(int32_t addr, int32_t val)
{
*(int32_t*)addr = val;
}
int32_t VtorShell_ReadMem(int32_t addr)
{
return *(int32_t*)addr;
}
#ifdef __VTOR_SHELL_CONFIG_GET_TIME_RESERVE__
int32_t VtorShell_GetTime()
{
return 0;
}
#endif // __VTOR_SHELL_CONFIG_GET_TIME_RESERVE__
#ifdef __VTOR_SHELL_CONFIG_GET_TIME_BY_VTOR_TIMER__
int32_t VtorShell_GetTime()
{
return VtorTimer_GetTick();
}
#endif // __VTOR_SHELL_CONFIG_GET_TIME_BY_VTOR_TIMER__
VtorShell* VtorShell_GetShell(uint8_t* str)
{
int16_t mostSimilarity = 0;
VtorShell* shell = vtorShellHeader;
VtorShell* mostSimilarityShell = NULL;
while(shell->fun)
{
int16_t similarity = VtorString_GetSimilarity(str, shell->name);
if(similarity > 50 // 有足够的相似度
&& similarity > mostSimilarity) // 并且比历史最高更高
{
// 记录最大相似度的shell
mostSimilarityShell = shell;
mostSimilarity = similarity;
}
shell++;
}
// 返回相似度最高的shell
return mostSimilarityShell;
}
int8_t VtorShellPlus_GetArg(uint8_t* str, VtorVar* argv)
{
int8_t argc = 0;
uint8_t* argStr = VtorString_FindString(str, "(");
while(*argStr)
{
argStr = VtorString_FindVariable(argStr, argv);
// 成功读到数据,参数个数与参数数据才增加
if (*argStr)
{
argv++;
argc++;
}
}
return argc;
}
void VtorShellPlus_PrintArg(VtorShell* shell, int8_t argc, VtorVar* argv)
{
uint8_t i = 0;
uint8_t shellInfoBuf[50] = {0};
VtorString_AppendString(shellInfoBuf, shell->name);
VtorString_AppendString(shellInfoBuf, "(");
for(i = 0; i < argc; i++)
{
switch(argv->type)
{
case VTOR_VAR_TYPE_CHAR:
VtorString_AppendChar(shellInfoBuf, '\'');
VtorString_AppendChar(shellInfoBuf, argv[i].intVar);
VtorString_AppendChar(shellInfoBuf, '\'');
break;
case VTOR_VAR_TYPE_INT:
VtorString_AppendInt(shellInfoBuf, argv[i].intVar);
break;
case VTOR_VAR_TYPE_HEX:
VtorString_AppendHex(shellInfoBuf, argv[i].intVar);
break;
case VTOR_VAR_TYPE_FLOAT:
VtorString_AppendFloat(shellInfoBuf, argv[i].floatVar);
break;
case VTOR_VAR_TYPE_STRING:
VtorString_AppendString(shellInfoBuf, argv[i].strVar);
break;
}
if(i == argc - 1)
{
break;
}
VtorString_AppendString(shellInfoBuf, ", ");
}
VtorString_AppendString(shellInfoBuf, ")\r\n{\r\n");
VtorString_Print(shellInfoBuf);
}
int32_t VtorShell_GetArg(uint8_t* str, int32_t* argv)
{
//char* splitArray = {" (),"};
int8_t argc = 0;
uint8_t* argStr = VtorString_FindString(str, "(");
while(*argStr)
{
argStr = VtorString_FindInt(argStr, argv);
// 成功读到数据,参数个数与参数数据才增加
if (*argStr)
{
argv++;
argc++;
}
}
return argc;
}
void VtorShell_PrintArg(VtorShell* shell, uint8_t argc, int32_t* argv)
{
uint8_t i = 0;
uint8_t shellInfoBuf[127] = {0};
VtorString_AppendString(shellInfoBuf, shell->name);
VtorString_AppendString(shellInfoBuf, "(");
for(i = 0; i < argc; i++)
{
VtorString_AppendInt(shellInfoBuf, argv[i]);
if(i == argc - 1)
{
break;
}
VtorString_AppendString(shellInfoBuf, ", ");
}
VtorString_AppendString(shellInfoBuf, ")\r\n{\r\n");
VtorString_Print(shellInfoBuf);
}
void VtorShell_PrintRet(int32_t ret, int32_t time)
{
uint8_t shellInfoBuf[50] = {0};
VtorString_AppendString(shellInfoBuf, "\treturn ");
VtorString_AppendInt(shellInfoBuf, ret);
VtorString_AppendString(shellInfoBuf, "; // elapsed ");
VtorString_AppendInt(shellInfoBuf, time);
VtorString_AppendString(shellInfoBuf, " ms\r\n}\r\n\r\n");
VtorString_Print(shellInfoBuf);
}
#ifdef __VTOR_SHELL_CONFIG_MINI__
int32_t VtorShell_Scan(uint8_t* str)
{
VtorShell* shell = VtorShell_GetShell(str);
if(shell)
{
shell->fun();
}
return 0;
}
#endif // __VTOR_SHELL_CONFIG_MINI__
#ifdef __VTOR_SHELL_CONFIG_BASIC__
int32_t VtorShell_Scan(uint8_t* str)
{
VtorShell* shell = VtorShell_GetShell(str);
if(shell)
{
int32_t argv[10] = { 0 };
int8_t argc = VtorShell_GetArg(str, argv);
VtorShell_PrintArg(shell, argc, argv);
uint32_t time = VtorShell_GetTime();
int32_t ret = VtorShell_Exec(shell, argc, argv);
time = VtorShell_GetTime() - time;
VtorShell_PrintRet(ret, time);
return ret;
}
return 0;
}
#endif // __VTOR_SHELL_CONFIG_BASIC__
#ifdef __VTOR_SHELL_CONFIG_PLUS__
int32_t VtorShell_Scan(uint8_t* str)
{
VtorShell* shell = VtorShell_GetShell(str);
if(shell)
{
VtorVar argv[10] = { 0 };
int8_t argc = VtorShellPlus_GetArg(str, argv);
VtorShellPlus_PrintArg(shell, argc, argv);
uint32_t time = VtorShell_GetTime();
int32_t ret = VtorShellPlus_Exec(shell, argc, argv);
time = VtorShell_GetTime() - time;
VtorShell_PrintRet(ret, time);
return ret;
}
return 0;
}
#endif // __VTOR_SHELL_CONFIG_PLUS__
int32_t VtorShellPlus_Exec(VtorShell* shell, int8_t argc, VtorVar* argv)
{
// 要将var数据提取出来
int32_t ret = 0;
return ret;
}
int32_t VtorShell_Exec(VtorShell* shell, uint8_t argc, int32_t* argv)
{
int32_t ret = 0;
switch (argc)
{
case 0:
ret = shell->fun();
break;
case 1:
ret = shell->fun(argv[0]);
break;
case 2:
ret = shell->fun(argv[0], argv[1]);
break;
case 3:
ret = shell->fun(argv[0], argv[1], argv[2]);
break;
case 4:
ret = shell->fun(argv[0], argv[1], argv[2], argv[3]);
break;
case 5:
ret = shell->fun(argv[0], argv[1], argv[2], argv[3], argv[4]);
break;
case 6:
ret = shell->fun(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
break;
case 7:
ret = shell->fun(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
break;
case 8:
ret = shell->fun(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
break;
case 9:
ret = shell->fun(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
break;
case 10:
ret = shell->fun(argv[0], argv[1], argv[2], argv[2], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
break;
default:
break;
}
return ret;
}
#endif // __VTOR_SHELL__
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/vtor3478/vtor_elec_module.git
git@gitee.com:vtor3478/vtor_elec_module.git
vtor3478
vtor_elec_module
vtor_elec_module
main

搜索帮助

344bd9b3 5694891 D2dac590 5694891