346 lines
5.6 KiB
C
346 lines
5.6 KiB
C
|
|
|
|||
|
|
#include "shell.h"
|
|||
|
|
#include "cpuid.h"
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
ShellCmdItem g_cmdList[MAX_CMD_NUM];
|
|||
|
|
int g_cmdNum = 0;
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
void ChangeToUper(char * str)
|
|||
|
|
{
|
|||
|
|
char tmp;
|
|||
|
|
while (str != NULL)
|
|||
|
|
{
|
|||
|
|
tmp = *str;
|
|||
|
|
if (tmp == 0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (tmp >= 'a' && tmp <= 'z')
|
|||
|
|
{
|
|||
|
|
tmp -= ('a'-'A');
|
|||
|
|
*str = tmp;
|
|||
|
|
}
|
|||
|
|
str++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int AddShellCmd(const char*pCmd, const char*pHelp, ShellFunc func)
|
|||
|
|
{
|
|||
|
|
if (g_cmdNum < MAX_CMD_NUM)
|
|||
|
|
{
|
|||
|
|
if ((strlen(pCmd) >= MAX_CMD_STR))
|
|||
|
|
{
|
|||
|
|
memcpy(g_cmdList[g_cmdNum].cmdstr, pCmd, MAX_CMD_STR-1);
|
|||
|
|
g_cmdList[g_cmdNum].cmdstr[MAX_CMD_STR-1] = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
strcpy(g_cmdList[g_cmdNum].cmdstr, pCmd);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ChangeToUper(g_cmdList[g_cmdNum].cmdstr);
|
|||
|
|
#if (1) // <20><>Ϊָ<CEAA><D6B8>
|
|||
|
|
g_cmdList[g_cmdNum].helpstr = pHelp;
|
|||
|
|
#else
|
|||
|
|
if ((strlen(pHelp) >= MAX_HELP_STR))
|
|||
|
|
{
|
|||
|
|
memcpy(g_cmdList[g_cmdNum].helpstr, pHelp, MAX_HELP_STR-1);
|
|||
|
|
g_cmdList[g_cmdNum].helpstr[MAX_HELP_STR-1] = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
strcpy(g_cmdList[g_cmdNum].helpstr, pHelp);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
g_cmdList[g_cmdNum].shellfunc = func;
|
|||
|
|
g_cmdNum++;
|
|||
|
|
return g_cmdNum;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("AddShellCmd failed, g_cmdNum=%d\r\n", g_cmdNum);
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ShellTask(void)
|
|||
|
|
{
|
|||
|
|
int i, j, k;
|
|||
|
|
int sta;
|
|||
|
|
char ch, ch1;
|
|||
|
|
char command[MAX_CMD_LINE];
|
|||
|
|
char cmd[MAX_CMD_LINE];
|
|||
|
|
char para1[MAX_CMD_LINE];
|
|||
|
|
char para2[MAX_CMD_LINE];
|
|||
|
|
int cmdlen, para1len, para2len;
|
|||
|
|
int cmdstrlen;
|
|||
|
|
|
|||
|
|
if (IsNewCommand() == 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
|
|||
|
|
cmdstrlen = LockExecAndGetCmdStr(command);
|
|||
|
|
|
|||
|
|
sta = 0;
|
|||
|
|
cmdlen = 0;
|
|||
|
|
para1len = 0;
|
|||
|
|
para2len = 0;
|
|||
|
|
|
|||
|
|
cmd[0] = 0;
|
|||
|
|
para1[0] = 0;
|
|||
|
|
para2[0] = 0;
|
|||
|
|
|
|||
|
|
for(i = 0; i < cmdstrlen; i++)
|
|||
|
|
{
|
|||
|
|
ch = command[i];
|
|||
|
|
// printf("0x%x ", ch);
|
|||
|
|
if (sta == 0)
|
|||
|
|
{
|
|||
|
|
if (cmdlen == 0 && ch == ' ') // ǰ<>ո<EFBFBD>
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else if (cmdlen != 0 && ch == ' ') // <20><><EFBFBD>ո<EFBFBD>
|
|||
|
|
{
|
|||
|
|
cmd[cmdlen] = 0;
|
|||
|
|
sta = 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (cmdlen < MAX_CMD_LINE-1)
|
|||
|
|
{
|
|||
|
|
cmd[cmdlen] = ch;
|
|||
|
|
cmdlen++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (sta == 1)
|
|||
|
|
{
|
|||
|
|
if (para1len == 0 && ch == ' ') // ǰ<>ո<EFBFBD>
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else if (para1len != 0 && ch == ' ') // <20><><EFBFBD>ո<EFBFBD>
|
|||
|
|
{
|
|||
|
|
para1[para1len] = 0;
|
|||
|
|
sta = 2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (para1len < MAX_CMD_LINE-1)
|
|||
|
|
{
|
|||
|
|
para1[para1len] = ch;
|
|||
|
|
para1len++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (sta == 2)
|
|||
|
|
{
|
|||
|
|
if (para2len == 0 && ch == ' ') // ǰ<>ո<EFBFBD>
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else if (para2len != 0 && ch == ' ') // <20><><EFBFBD>ո<EFBFBD>
|
|||
|
|
{
|
|||
|
|
para2[para2len] = 0;
|
|||
|
|
sta = 3;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (para2len < MAX_CMD_LINE-1)
|
|||
|
|
{
|
|||
|
|
para2[para2len] = ch;
|
|||
|
|
para2len++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
cmd[cmdlen] = 0;
|
|||
|
|
para1[para1len] = 0;
|
|||
|
|
para2[para2len] = 0;
|
|||
|
|
|
|||
|
|
// printf("cmd=%s,para1=%s,para2=%s", cmd, para1, para2);
|
|||
|
|
|
|||
|
|
ChangeToUper(cmd);
|
|||
|
|
ChangeToUper(para1);
|
|||
|
|
ChangeToUper(para2);
|
|||
|
|
|
|||
|
|
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (i = 0; i < g_cmdNum; i++)
|
|||
|
|
{
|
|||
|
|
if (strcmp(g_cmdList[i].cmdstr, cmd) == 0)
|
|||
|
|
{
|
|||
|
|
if (g_cmdList[i].shellfunc != NULL)
|
|||
|
|
{
|
|||
|
|
g_cmdList[i].shellfunc(para1, para2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (i >= g_cmdNum) // û<><C3BB><EFBFBD>ҵ<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD>Ѱ<EEA3AC>Ҿֲ<D2BE>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
k = -1;
|
|||
|
|
for (i = 0; i < g_cmdNum; i++)
|
|||
|
|
{
|
|||
|
|
for (j = 0; j < cmdlen; j++)
|
|||
|
|
{
|
|||
|
|
ch = cmd[j];
|
|||
|
|
ch1 = g_cmdList[i].cmdstr[j];
|
|||
|
|
if (ch == ' ' || ch == 0 || ch1 == ' ' || ch1 == 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (ch != ch1)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (j == cmdlen && cmdlen != 0) // ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
k = i;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (k >= 0) // <20><>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (g_cmdList[k].shellfunc != NULL)
|
|||
|
|
{
|
|||
|
|
g_cmdList[k].shellfunc(para1, para2);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OutNewCmdLine();
|
|||
|
|
UnlockExec();
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD>
|
|||
|
|
void VersionInfo(char * para1, char * para2)
|
|||
|
|
{
|
|||
|
|
char buff[VERSION_LEN+1];
|
|||
|
|
|
|||
|
|
GetVersionStr(buff);
|
|||
|
|
buff[VERSION_LEN] = 0;
|
|||
|
|
printf("Software Version = %s\r\n", buff);
|
|||
|
|
GetBuildStr(buff);
|
|||
|
|
printf("%s\r\n", buff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void HelpString(char * para1, char * para2)
|
|||
|
|
{
|
|||
|
|
int i;
|
|||
|
|
if (para1 == para2)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (i = 0; i < g_cmdNum; i++)
|
|||
|
|
{
|
|||
|
|
printf("\r\n%s\r\n", g_cmdList[i].cmdstr);
|
|||
|
|
printf("\t%s\r\n", g_cmdList[i].helpstr);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void CleanScreen(char * para1, char * para2)
|
|||
|
|
{
|
|||
|
|
if (para1 == para2)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
putchar(0x0C); // <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Restart(char * para1, char * para2)
|
|||
|
|
{
|
|||
|
|
RestartMcu();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ShowHistoryCmd(char * para1, char * para2)
|
|||
|
|
{
|
|||
|
|
if (para1 == NULL || para2 == NULL)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int num = GetHistoryNum(); // <20>Ѿ<EFBFBD><D1BE>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int maxnum = GetHistoryMaxNum();
|
|||
|
|
int rslt;
|
|||
|
|
char ch[MAX_CMD_LINE];
|
|||
|
|
|
|||
|
|
printf("show all history cmd:\r\n");
|
|||
|
|
|
|||
|
|
if (num == maxnum)
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
for (int idx = GetHistoryIdx(); idx < maxnum; idx++)
|
|||
|
|
{
|
|||
|
|
rslt = GetHistoryCmd(idx, &ch[0]);
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
printf("\t%d.%s\r\n", i+1, ch);
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
for (int idx = 0; idx < GetHistoryIdx(); idx++)
|
|||
|
|
{
|
|||
|
|
rslt = GetHistoryCmd(idx, &ch[0]);
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
printf("\t%d.%s\r\n", i+1, ch);
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (num < maxnum)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < num; i++)
|
|||
|
|
{
|
|||
|
|
rslt = GetHistoryCmd(i, &ch[0]);
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
printf("\t%d.%s\r\n", i+1, ch);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
void InitShell(void)
|
|||
|
|
{
|
|||
|
|
InitConsole(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨
|
|||
|
|
|
|||
|
|
memset(g_cmdList, 0, sizeof(ShellCmdItem)*MAX_CMD_NUM);
|
|||
|
|
g_cmdNum = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
AddShellCmd("HELP", "show the help info", HelpString);
|
|||
|
|
AddShellCmd("VERSION", "show the version info", VersionInfo);
|
|||
|
|
// AddShellCmd("CLS", "clean the screen", CleanScreen);
|
|||
|
|
AddShellCmd("REBOOT", "reboot the mcu", Restart);
|
|||
|
|
|
|||
|
|
// AddShellCmd("HISTORY", "show all history cmd", ShowHistoryCmd);
|
|||
|
|
|
|||
|
|
}
|