console.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. #include "macro_common.h"
  2. #include "uart.h"
  3. #include "trace.h"
  4. #include "console.h"
  5. /*TRACE模式使用的输出函数,cli模块借用trace模块的输出函数进行输出,cli初始化时根据
  6. 指定uart端口指定输出函数*/
  7. extern trace_msg_send g_msg_msg_send;
  8. /*console口的命令信息*/
  9. console_cmd_info g_cmd_info;
  10. /*记录上一个输入的命令,用于上箭头时重复执行,目前只支持一条历史命令*/
  11. char g_cmd_last_cmd[CMD_LINE_LEN_MAX];
  12. /*存储console使用的串口ID*/
  13. u8 Console_UID;
  14. /*用于保存用户注册的所有命令的数据结构*/
  15. S_CLI_CMD_LIST g_cli_cmd_list;
  16. /*功能*/
  17. const u32 escape_sequences[] =
  18. {
  19. 0x001B4F50, /* PF1 */
  20. 0x001B4F51, /* PF2 */
  21. 0x001B4F52, /* PF3 */
  22. 0x001B4F53, /* PF4 */
  23. 0x001B5B41, /* UP */
  24. 0x001B5B42, /* DOWN */
  25. 0x001B5B43, /* RIGHT */
  26. 0x001B5B44, /* LEFT */
  27. 0
  28. };
  29. /**************************************************************************************************
  30. *cmd_cmdline_parse --命令行解析函数
  31. *Input:
  32. * pcmd --需要解析的命令字符串;
  33. * cmdlen --需要解析的字符串的长度;
  34. *Output:
  35. * argv --解析出的参数变量
  36. * argc --解析出的参数数目
  37. *Return:
  38. * 0 --正确解析
  39. * -1 --命令字符串有错误
  40. */
  41. #if(0)
  42. static int cmd_cmdline_parse(char *pcmd, u8 cmdlen, char **argv, u8 *argc)
  43. {
  44. char *ptemp = NULL;
  45. u8 argnum = 0;
  46. if(pcmd == NULL || cmdlen == 0)
  47. {
  48. return -1;
  49. }
  50. ptemp = pcmd;
  51. while((*ptemp == ' ')&&(ptemp))
  52. {
  53. ptemp++;
  54. }
  55. argv[argnum++] = ptemp;
  56. ptemp = strstr(pcmd, " ");
  57. while(ptemp != NULL)
  58. {
  59. ptemp++;
  60. *(ptemp-1) = '\0';
  61. /*lint -save -e779*/
  62. while(( " " ==ptemp)&&(ptemp))
  63. {
  64. ptemp++;
  65. }
  66. /*lint -restore*/
  67. argv[argnum++] = ptemp;
  68. ptemp = strstr(ptemp, " ");
  69. }
  70. *argc = argnum;
  71. return 0;
  72. }
  73. #endif
  74. #define CMD_CHECK_0 0 /*正确的命令*/
  75. #define INCOMPLET_CMD 1 /*不完整的命令*/
  76. #define UNKOWN_CMD 2 /*未知命令*/
  77. #define UNCONFIRM_CMD 3 /*不确定命令*/
  78. /**************************************************************************************************
  79. *cmd_cmdstr_check --命令行参数检查
  80. *Input:
  81. * argv --解析出来的参数变量
  82. * argc --解析出来的参数数量
  83. *Output:
  84. * pcmdelement --如果参数检查正确,输出对应的命令数据结构的指针
  85. *Return:
  86. * CMD_CHECK_0
  87. * INCOMPLET_CMD
  88. * UNKOWN_CMD
  89. * UNCONFIRM_CMD
  90. */
  91. /*lint -save -e818*/
  92. #if(0)
  93. static int cmd_cmdstr_check(char **argv, u8 argc, u32 *pcmdelement)
  94. {
  95. u8 i = 0, cmdnum = 0, samecmd = 0;
  96. char *arg[CMD_PARAM_NUM_MAX] = {NULL};
  97. PS_CLI_CMD pcmd = NULL;
  98. char buf[CMD_LINE_LEN_MAX];
  99. if(argc >= CMD_PARAM_NUM_MAX)
  100. {
  101. return UNKOWN_CMD;
  102. }
  103. memset(buf,0,sizeof(buf));
  104. for(i=0; i<CMD_MAX_NUM; i++)
  105. {
  106. if(g_cli_cmd_list.cmd[i]!=0)
  107. {
  108. pcmd = (PS_CLI_CMD)g_cli_cmd_list.cmd[i];
  109. if(strncmp(argv[0], pcmd->cmd, strlen(argv[0])) != 0)
  110. {
  111. continue;
  112. }
  113. *pcmdelement = g_cli_cmd_list.cmd[i];
  114. samecmd++;
  115. }
  116. }
  117. if(samecmd == 0)
  118. {
  119. return UNKOWN_CMD;
  120. }
  121. if(samecmd > 1)
  122. {
  123. return UNCONFIRM_CMD;
  124. }
  125. pcmd = (PS_CLI_CMD)(*pcmdelement);
  126. strncpy(buf, pcmd->cmd, strlen(pcmd->cmd));
  127. (void)cmd_cmdline_parse(buf, strlen(buf), arg, &cmdnum);
  128. if(argc < cmdnum)
  129. {
  130. return INCOMPLET_CMD;
  131. }
  132. /* if(argc > cmdnum)
  133. {
  134. return UNKOWN_CMD;
  135. }
  136. */
  137. return 0;
  138. }
  139. #endif
  140. /*lint -restore*/
  141. /******************************************************************************
  142. *cmd_run --运行命令函数
  143. *Input:
  144. * None
  145. *Output:
  146. * None
  147. *Return:
  148. * None
  149. */
  150. #if(0)
  151. static void cmd_run(void)
  152. {
  153. u8 argc = 0;
  154. char *arg[CMD_PARAM_NUM_MAX] = {NULL};
  155. PS_CLI_CMD pcmd = NULL;
  156. u32 cmdelement = 0;
  157. int ret = 0;
  158. (void)cmd_out(NEWLINE);
  159. if( 0 == g_cmd_info.cmdLineLen)
  160. {
  161. (void)cmd_out("%s", CMD_PROMPT);
  162. return;
  163. }
  164. memset(g_cmd_last_cmd, 0, sizeof(g_cmd_last_cmd));
  165. strncpy(g_cmd_last_cmd, g_cmd_info.cmdLine, g_cmd_info.cmdLineLen);
  166. if( 0 != cmd_cmdline_parse(g_cmd_info.cmdLine, g_cmd_info.cmdLineLen, arg, &argc) )
  167. {
  168. (void)cmd_out(NEWLINE);
  169. (void)cmd_out("%%\"%s\" unknown commond"NEWLINE, g_cmd_last_cmd);
  170. /*szb add*/
  171. (void)cmd_out("%s",CMD_PROMPT);
  172. return;
  173. }
  174. ret = cmd_cmdstr_check(arg, argc, &cmdelement);
  175. if(ret == CMD_CHECK_0)
  176. {
  177. pcmd = (PS_CLI_CMD)cmdelement;
  178. if(pcmd->func(argc,arg) != 0)
  179. {
  180. (void)cmd_out("%%\"%s\" unknown commond"NEWLINE, g_cmd_last_cmd);
  181. }
  182. }
  183. else
  184. {
  185. switch(ret)
  186. {
  187. case INCOMPLET_CMD:
  188. (void)cmd_out("%% \"%s\" incomplete command"NEWLINE,arg[0]);
  189. break;
  190. case UNKOWN_CMD:
  191. (void)cmd_out("%% \"%s\" unknown command"NEWLINE,arg[0]);
  192. break;
  193. case UNCONFIRM_CMD:
  194. (void)cmd_out("%% \"%s\" unconfirm command"NEWLINE,arg[0]);
  195. break;
  196. default:
  197. break;
  198. }
  199. }
  200. /*szb add*/
  201. (void)cmd_out("%s",CMD_PROMPT);
  202. }
  203. #endif
  204. /*****************************************************************************
  205. *cmd_rcv --命令字符串接收函数
  206. *
  207. *Input:
  208. * prt --协议类型,固定为PRTTYPE_CONSOLE,校验用
  209. * pbuf --接收到的数据缓冲头指针
  210. * buflen --接收到的字符串的长度
  211. * version
  212. *Output:
  213. * None
  214. *Return:
  215. * 0 --正确执行
  216. * -1 --执行失败
  217. */
  218. /*lint -save -e818*/
  219. #if(0)
  220. static int cmd_rcv(u8 uartid, void *arg, u8 *pbuf, u16 buflen,u8 version)
  221. {
  222. u32 i = 0, j = 0;
  223. u8 curpos = 0;
  224. static u32 key = 0;
  225. NO_USE(uartid);
  226. NO_USE(arg);
  227. NO_USE(version);
  228. curpos = g_cmd_info.curentpos;
  229. for(i=0; i<buflen; i++)
  230. {
  231. if(pbuf[i] == ESC_KEY)
  232. {
  233. continue;
  234. }
  235. else
  236. {
  237. key = pbuf[i];
  238. }
  239. switch(key)
  240. {/*根据需要增减case*/
  241. case ENTER_KEY:
  242. //if(uart_msg_send_disable(uartid)==FALSE)
  243. {
  244. cmd_run();
  245. }
  246. curpos = 0;
  247. memset(&g_cmd_info, 0, sizeof(g_cmd_info));
  248. break;
  249. case '\t':
  250. /*cmd_out("%c%c%c", 0x1b,0x5b,0x43);*/
  251. break;
  252. case BS_KEY:
  253. if((curpos > 0)&&(curpos == g_cmd_info.cmdLineLen))
  254. {
  255. curpos--;
  256. g_cmd_info.cmdLineLen--;
  257. g_cmd_info.cmdLine[curpos] = '\0';
  258. (void)cmd_out("%c %c", pbuf[i], pbuf[i]);
  259. }
  260. break;
  261. case ESC_KEY:
  262. break;
  263. case RIGHTARROW_KEY:
  264. break;
  265. case LEFTARROW_KEY:
  266. /* if(curpos >0)
  267. {
  268. curpos--;
  269. cmd_out("%c", BS_KEY);
  270. }*/
  271. break;
  272. case DOWNARROW_KEY:
  273. case UPARROW_KEY:
  274. for(j=0; j<g_cmd_info.cmdLineLen; j++)
  275. {
  276. (void)cmd_out("%c %c", BS_KEY, BS_KEY);
  277. }
  278. g_cmd_info.cmdLineLen = 0;
  279. memset(g_cmd_info.cmdLine, 0, sizeof(g_cmd_info.cmdLineLen));
  280. strncpy(g_cmd_info.cmdLine, g_cmd_last_cmd, strlen(g_cmd_last_cmd));
  281. g_cmd_info.cmdLineLen = strlen(g_cmd_last_cmd);
  282. g_cmd_info.curentpos = strlen(g_cmd_last_cmd);
  283. curpos = g_cmd_info.curentpos;
  284. (void)cmd_out("%s", g_cmd_info.cmdLine);
  285. break;
  286. case DEL_KEY:
  287. default:
  288. (void)cmd_out("%c", pbuf[i]);
  289. if(curpos<(CMD_LINE_LEN_MAX-1))
  290. {
  291. g_cmd_info.cmdLine[curpos++] = (char)pbuf[i];
  292. g_cmd_info.cmdLineLen++;
  293. }
  294. break;
  295. }
  296. }
  297. g_cmd_info.curentpos = curpos;
  298. return 0;
  299. }
  300. #endif
  301. /*lint -restore*/
  302. /************************************************************
  303. *cmd_install --命令行安装命令函数
  304. *
  305. *Input:
  306. * 待安装的命令行结构
  307. *Output:
  308. * Noen
  309. *Return:
  310. * 0 --安装成功
  311. * -1 --安装失败
  312. */
  313. int cmd_install(CPS_CLI_CMD pcmdelement)
  314. {
  315. if(pcmdelement == NULL)
  316. {
  317. return -1;
  318. }
  319. if(g_cli_cmd_list.num >= CMD_MAX_NUM)
  320. {/*位置不够了*/
  321. return -1;
  322. }
  323. if(strlen(pcmdelement->cmd) > CMD_LINE_LEN_MAX)
  324. {/*命令字符串太长了,不能解析*/
  325. return -1;
  326. }
  327. g_cli_cmd_list.cmd[g_cli_cmd_list.num] = (u32)pcmdelement;
  328. g_cli_cmd_list.num++;
  329. return 0;
  330. }
  331. u8 uart_redirect_cfg[UART_MAX];
  332. DEFCLICMD(uart_redirect_cmd, uart_redirect_struct,
  333. "redirect uart SRC_ID to uart DST_ID","redirect")
  334. {
  335. u8 src_id = 0, dst_id = 0;
  336. NO_USE(argc);
  337. NO_USE(argv);
  338. src_id = atoi(argv[2]);
  339. dst_id = atoi(argv[5]);
  340. if(src_id&&(src_id <= UART_MAX)&&(dst_id <= UART_MAX)) {
  341. (void)cmd_out(NEWLINE"redirect uart src %d to uart %d ", src_id, dst_id);
  342. uart_redirect_cfg[src_id - 1] = dst_id;
  343. (void)cmd_out(NEWLINE);
  344. }
  345. return 0;
  346. }
  347. DEFCLICMD(uart_redirect_show, uart_redirect_show_struct,
  348. "uart redirect show","show redirect")
  349. {
  350. u8 id;
  351. NO_USE(argc);
  352. NO_USE(argv);
  353. cmd_out("%8s %8s"NEWLINE, "SrcUart", "DstUart");
  354. for(id = 0;id < UART_MAX;id++) {
  355. cmd_out("%7s%d %7s%d"NEWLINE, "Uart", id+1, "Uart", uart_redirect_cfg[id]);
  356. }
  357. return 0;
  358. }
  359. extern void cmd_test_install(void);
  360. extern int uart_msg_send(u8 uartid, const char *buf, u32 buflen);
  361. int cmd_init(u8 uartid)
  362. {
  363. Console_UID=uartid;
  364. g_msg_msg_send = uart_msg_send;
  365. //ESC_check_delay_htmr=0;
  366. memset(&g_cli_cmd_list,0,sizeof(g_cli_cmd_list));
  367. memset(&g_cmd_info, 0, sizeof(g_cmd_info));
  368. cmd_test_install();
  369. cmd_install(&uart_redirect_struct);
  370. cmd_install(&uart_redirect_show_struct);
  371. // uart_rs232_init(Console_UID, cmd_rcv);
  372. cmd_out("%s", BOOT_LOGO_INFO);
  373. return 0;
  374. }