rt_console.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: rt_console.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2020-01-18
  7. 功能说明: 实时FIFO,采用免锁算法,只支持单进单出。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "rt.h"
  14. #include "my_rtc.h"
  15. #include <pthread.h>
  16. #include <sys/prctl.h>
  17. /*------------------------------- 宏定义 --------------------------------------
  18. */
  19. #define CONSOLE_BUF_SIZE 16384
  20. /*------------------------------ 类型结构 -------------------------------------
  21. */
  22. /*------------------------------ 全局变量 -------------------------------------
  23. */
  24. static unsigned char g_console_buf_tx[CONSOLE_BUF_SIZE];
  25. static unsigned char g_console_buf_rx[CONSOLE_BUF_SIZE];
  26. struct rt_fifo g_console_fifo_tx;
  27. struct rt_fifo g_console_fifo_rx;
  28. // static int g_uart_imr = 0;
  29. static char str_hint[] = "DTU_SHELL:\\>";
  30. int g_console_dev_write = 0;
  31. // SOE信号发生器控制全局变量
  32. int g_soe_gen_state; // 状态,0停止,1初始化,2运行
  33. int g_soe_gen_on_us; // 导通时间
  34. int g_soe_gen_off_us; // 断开时间
  35. int g_soe_gen_seq_us; // 通道序列间隔时间
  36. static pthread_t g_tidp = 0;
  37. int g_thread_exit_flag = 1;
  38. int g_thread_created_flag = 0;
  39. /*------------------------------ 函数声明 -------------------------------------
  40. */
  41. static void rt_console_thread(void *arg);
  42. /*------------------------------ 外部函数 -------------------------------------
  43. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  44. */
  45. /******************************************************************************
  46. 函数名称: rt_fifo_init
  47. 函数版本: 01.01
  48. 创建作者: sunxi
  49. 创建日期: 2020-06-18
  50. 函数说明: rt_fifo初始化
  51. 参数说明:
  52. fifo: 要初始化的rt_fifo结构的指针
  53. buffer 需要和fifo相连接的buffer
  54. size buffer的大小,必须是2的n次方
  55. 返回值:
  56. 0: 成功
  57. 其它: 失败
  58. 修改记录:
  59. */
  60. int rt_console_init(void)
  61. {
  62. int ret;
  63. // 初始化FIFO
  64. rt_fifo_init(&g_console_fifo_tx, g_console_buf_tx, CONSOLE_BUF_SIZE);
  65. rt_fifo_init(&g_console_fifo_rx, g_console_buf_rx, CONSOLE_BUF_SIZE);
  66. ret = pthread_create(&g_tidp, NULL, (void *)rt_console_thread, NULL);
  67. if (ret)
  68. {
  69. rt_printf("thread create error!\n");
  70. g_tidp = 0;
  71. return ret;
  72. }
  73. g_thread_created_flag = 1;
  74. return 0;
  75. }
  76. int rt_console_exit(void)
  77. {
  78. int try_cnt = 0;
  79. if (!g_thread_created_flag)
  80. return 0;
  81. g_thread_exit_flag = 1;
  82. g_tidp = 0;
  83. while (g_thread_exit_flag && (try_cnt < 10))
  84. {
  85. try_cnt++;
  86. usleep(50000);
  87. }
  88. return 0;
  89. }
  90. int rt_console_read(unsigned char *buffer, unsigned int len)
  91. {
  92. if (buffer == NULL)
  93. {
  94. return -1;
  95. }
  96. return (int)rt_fifo_get(&g_console_fifo_rx, buffer, len);
  97. }
  98. int rt_console_write(int is_net, unsigned char *buffer, unsigned int len)
  99. {
  100. if (buffer == NULL)
  101. {
  102. return -1;
  103. }
  104. {
  105. #if 1
  106. if (g_console_dev_write)
  107. {
  108. rt_fifo_put(&g_console_fifo_tx, buffer, len);
  109. }
  110. // else if(g_print_to_net)
  111. //{
  112. // net_debug_send(buffer,len);
  113. // return 0;
  114. //}
  115. else
  116. {
  117. unsigned int i;
  118. unsigned char *buf = buffer;
  119. for (i = 0; i < len; i++)
  120. {
  121. rt_printf("%c", *buf++);
  122. }
  123. }
  124. #if 0
  125. if(is_net && pRunSet->bTT_LogPrintf)
  126. {
  127. // 如果末尾有回车换行,去掉,因为log_str_len函数会加上。
  128. if(len > 2)
  129. {
  130. if((buffer[len-2]==0x0D) && (buffer[len-1]==0x0A))
  131. {
  132. len -= 2;
  133. }
  134. }
  135. log_str_len(LOG_PRINTF,buffer,len);
  136. }
  137. #endif
  138. #else
  139. struct console *con;
  140. for (con = console_drivers; con; con = con->next)
  141. {
  142. if ((con->flags & CON_ENABLED) && con->write &&
  143. (cpu_online(smp_processor_id()) ||
  144. (con->flags & CON_ANYTIME)))
  145. con->write(con, buffer, len);
  146. }
  147. #endif
  148. }
  149. return 0;
  150. }
  151. unsigned int rt_console_write_len(void)
  152. {
  153. return g_console_fifo_tx.size - rt_fifo_len(&g_console_fifo_tx);
  154. }
  155. static inline void console_tx_chars(void)
  156. {
  157. unsigned char c;
  158. if (rt_fifo_get(&g_console_fifo_tx, &c, 1))
  159. {
  160. /* Wait until space is available in the FIFO */
  161. // while (!(MCF_UART_USR(CFG_UART_RT_CONSOLE) & MCF_UART_USR_TXRDY)) ;
  162. // MCF_UART_UTB(CFG_UART_RT_CONSOLE) = c;
  163. }
  164. else
  165. {
  166. // g_uart_imr &= ~(MCF_UART_UIMR_TXRDY);
  167. // MCF_UART_UIMR(CFG_UART_RT_CONSOLE) = (unsigned char)g_uart_imr;
  168. }
  169. }
  170. /*------------------------------ 内部函数 -------------------------------------
  171. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  172. */
  173. /*------------------------------ 测试函数 -------------------------------------
  174. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  175. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  176. */
  177. //-------------------------------------- 外部移植 -------------------------------------
  178. //-------------------------------------- 函数声明 -------------------------------------
  179. // sunxi 20200805 char dt_In(void);
  180. // sunxi 20200805 int dt_OutOne(char c);
  181. // sunxi 20200805 int dt_CmdLine(void);
  182. int dt_CmdCls(void);
  183. int dt_CmdHelp(void);
  184. // sunxi 20200805 int dt_CmdArp(void);
  185. // sunxi 20200805 int dt_CmdExit(void);
  186. // sunxi 20200805 int dt_CmdNetStat(void);
  187. // sunxi 20200805 int dt_CmdReg(void);
  188. int dt_CmdMem(void);
  189. int dt_cmd_rt(void);
  190. int dt_cmd_rt_reset(void);
  191. int dt_cmd_adc(void);
  192. int dt_cmd_freq(void);
  193. int dt_cmd_comm(void);
  194. extern int can_stat(void);
  195. #if 0
  196. static int dt_soe_gen(void);
  197. int printf_file101(void)
  198. {
  199. return 0;
  200. }
  201. int can_stat_reset(void)
  202. {
  203. return 0;
  204. }
  205. // sunxi 20200805 int atimer_stat(void);
  206. // sunxi 20200805 int atimer_stat_reset(void);
  207. int equ_info_printf(void)
  208. {
  209. return 0;
  210. }
  211. int equ_info_printf_di(void)
  212. {
  213. return 0;
  214. }
  215. int equ_info_printf_do(void)
  216. {
  217. return 0;
  218. }
  219. int equ_info_printf_ac(void)
  220. {
  221. return 0;
  222. }
  223. int dido_printf(void)
  224. {
  225. return 0;
  226. }
  227. int dido_stat_reset(void)
  228. {
  229. return 0;
  230. }
  231. int factor_printf(void)
  232. {
  233. return 0;
  234. }
  235. int dcfactor_printf(void)
  236. {
  237. return 0;
  238. }
  239. int tbl_printf_rsc(void)
  240. {
  241. return 0;
  242. }
  243. int tbl_printf(void)
  244. {
  245. return 0;
  246. }
  247. int sw_ui_temp(void)
  248. {
  249. return 0;
  250. }
  251. int runstu_printf(void)
  252. {
  253. return 0;
  254. }
  255. int s_stat_display(void)
  256. {
  257. return 0;
  258. }
  259. int x509_show_all(void)
  260. {
  261. return 0;
  262. }
  263. int protect_printf_process(void)
  264. {
  265. return 0;
  266. }
  267. int IEC101_Info_Printf(void)
  268. {
  269. return 0;
  270. }
  271. int IEC104_Info_Printf(void)
  272. {
  273. return 0;
  274. }
  275. int plc_info_printf(void)
  276. {
  277. return 0;
  278. }
  279. int plc_lp_printf(void)
  280. {
  281. return 0;
  282. }
  283. int soe_info_printf(void)
  284. {
  285. return 0;
  286. }
  287. int soe_stat_reset(void)
  288. {
  289. return 0;
  290. }
  291. // sunxi 20200805 int bat_create_csv(void);
  292. int led_info_printf(void)
  293. {
  294. return 0;
  295. }
  296. int auth_info_printf(void)
  297. {
  298. return 0;
  299. }
  300. #endif
  301. //-------------------------------------- 宏定义 -------------------------------------
  302. #ifdef __WIN32__
  303. #define DT_COM "COM2"
  304. #else
  305. #define DT_COM "COM1"
  306. #endif
  307. #define DT_COM_BAUD 57600
  308. #define DT_CMDLINE_SIZE 256
  309. typedef struct
  310. {
  311. char *szCmd;
  312. int (*fnCmd)(void);
  313. char *szCmdHelp;
  314. } TCmd;
  315. // 发送
  316. static char str_esc[] = {0x1b, 0x5b, 0x0}; // ESC[
  317. static char str_version[] = "V01.01.01 2012/02/15";
  318. static char str_cls[] = "\x1b[2J";
  319. static char str_clr[] = "\x1b[K";
  320. // static char str_save[] = "\x1b[s" ;
  321. // static char str_load[] = "\x1b[u" ;
  322. // static char str_moveto[] = "\x1b[H" ;
  323. // 接收
  324. static char str_up[] = "\x1b[A";
  325. static char str_down[] = "\x1b[B";
  326. //------------------------------------- 全局变量 ----------------------------------------
  327. // static int ghCom = -1;
  328. // static int gThreadId = -1;
  329. // static char gOutLine[DT_CMDLINE_SIZE];
  330. static char gCmdLine[DT_CMDLINE_SIZE];
  331. static char gCmdLineBack[DT_CMDLINE_SIZE];
  332. static int gCmdLineCount;
  333. char *gCmdArg[32];
  334. int gCmdArgCount;
  335. TCmd gCmd[] =
  336. {
  337. {"help", dt_CmdHelp, "帮助,列出所有命令"},
  338. {"?", dt_CmdHelp, "帮助,列出所有命令"},
  339. {"cls", dt_CmdCls, "清屏"},
  340. {"mem", dt_CmdMem, "显示和修改存储器内容"},
  341. {"rt", dt_cmd_rt, "显示实时时间统计"},
  342. {"reset", dt_cmd_rt_reset, "实时统计数据复位"},
  343. #if 0
  344. {"adc",dt_cmd_adc,"显示ADC抖动统计"},
  345. {"freq",dt_cmd_freq,"显示频率抖动统计"},
  346. {"f101",printf_file101,"101文件传输状态"},
  347. {"dido",dido_printf,"开入开出打印"},
  348. // {"at",atimer_stat,"可调定时器统计"},
  349. {"equ",equ_info_printf,"装置信息"},
  350. {"equdi",equ_info_printf_di,"装置开入信息"},
  351. {"equdo",equ_info_printf_do,"装置开出信息"},
  352. {"equac",equ_info_printf_ac,"装置模拟量信息"},
  353. {"led",led_info_printf,"LED灯信息"},
  354. //{"pub",sw_pub_printf,"开关公共信息打印"},
  355. //{"sw",sw_printf,"开关信息打印"},
  356. //{"pubv",sw_pub_printf_v,"开关公共值打印"},
  357. //{"swv",sw_printf_v,"开关值打印"},
  358. //{"ui",sw_ui_printf,"电压电流系数打印"},
  359. //{"uie",sw_ui_printf_e,"测量电压电流有效值打印"},
  360. //{"uip",sw_ui_printf_p,"测量电压电流角度值打印"},
  361. //{"uim",sw_ui_printf_m,"保护电压电流M2值打印"},
  362. {"factor",factor_printf,"校正系数"},
  363. {"dcfactor",dcfactor_printf,"直流校正系数"},
  364. {"rsc", tbl_printf_rsc, "资源表打印"},
  365. {"err",rt_err_printf, "系统错误信息"},
  366. {"uitemp",sw_ui_temp, "温度校正系数"},
  367. {"tbl",tbl_printf, "转发点表打印"},
  368. //{"vol_stu",vol_stu_printf, "上电合闸状态打印"},
  369. {"run_st",runstu_printf, "内部状态打印"},
  370. {"x509",x509_show_all, "查看证书内容"},
  371. {"protect", protect_printf_process, "保护整组处理过程"},
  372. {"sstat", s_stat_display, "通讯统计信息"},
  373. {"101", IEC101_Info_Printf, "101规约信息打印"},
  374. {"104", IEC104_Info_Printf, "104规约信息打印"},
  375. {"lp",plc_lp_printf,"逻辑点信息打印"},
  376. {"plc", plc_info_printf, "可编程逻辑信息打印"},
  377. {"soe", soe_info_printf, "SOE信息打印"},
  378. {"soegen", dt_soe_gen, "SOE信号发生器"},
  379. {"comm", dt_cmd_comm, "通讯报文监视"},
  380. #endif
  381. #if 0
  382. {"bathh", bat_create_csv, "生成电池活化CSV文件"},
  383. {"extrema",extrema_create_csv,"极值文件生成"},
  384. {"energy", energy_create_csv, "电度文件生成"},
  385. {"mearcd", mearcd_create_csv, "定点遥测文件生成"},
  386. {"capmanage", capmanage_create_csv, "电容器管理文件生成"},
  387. {"udcrcd", udcrcd_create_csv, "电池电压文件生成"},
  388. #endif
  389. // {"auth", auth_info_printf, "装置授权信息打印"},
  390. //{"linktbl", tbl_link_printf, "级联点表打印"},
  391. //{"link", lnk_info_printf, "级联信息打印"},
  392. //{"xdl", xdl_info_printf, "小电流接地信息打印"},
  393. //{"fxdl", xdl_info_fromfile_printf, "录波文件小电流接地信息打印"},
  394. //{"esam", esam_info_printf, "加解密芯片信息打印"},
  395. //{"sec", sec_info_printf, "安全信息打印"},
  396. //{"ept", print_EquipParaTable, "装置参数打印"},
  397. #ifdef BSP_CAN_ENABLE
  398. {"can", can_stat, "CAN总线统计"},
  399. {"sb", can_app_sb_monitor, "子板监视信息"},
  400. {"cantest", can_app_test_printf, "子板测试信息"},
  401. #endif
  402. };
  403. #define CMD_NUM ((int)(sizeof(gCmd) / sizeof(TCmd)))
  404. //------------------------------------- 外部函数 ----------------------------------------
  405. static void rt_console_thread(void *arg)
  406. {
  407. static char EscCmd[16];
  408. static int IsEsc = 0;
  409. char c;
  410. char *p;
  411. int i;
  412. g_thread_exit_flag = 0;
  413. // 1.得到一行字符,每接收一个字符要回送.
  414. prctl(PR_SET_NAME, "rt_console_thread");
  415. while (rt_console_read((unsigned char *)&c, 1) == 1)
  416. {
  417. // ESC处理
  418. if (c == 0x1b)
  419. {
  420. IsEsc = 0;
  421. EscCmd[IsEsc++] = c;
  422. continue;
  423. }
  424. else if (IsEsc)
  425. {
  426. EscCmd[IsEsc++] = c;
  427. if (IsEsc == 3)
  428. {
  429. IsEsc = 0;
  430. if (memcmp(EscCmd, str_up, 3) == 0 || memcmp(EscCmd, str_down, 3) == 0)
  431. {
  432. rt_printf("%s%dD", str_esc, gCmdLineCount);
  433. rt_printf(str_clr);
  434. strcpy(gCmdLine, gCmdLineBack);
  435. gCmdLineCount = (int)strlen(gCmdLine);
  436. rt_printf(gCmdLine);
  437. }
  438. }
  439. continue;
  440. }
  441. if (c == '\b' && gCmdLineCount > 0)
  442. {
  443. gCmdLineCount--;
  444. rt_printf(str_clr);
  445. continue;
  446. }
  447. else if (c == '\n' || c == '\r')
  448. {
  449. gCmdLine[gCmdLineCount] = 0;
  450. strcpy(gCmdLineBack, gCmdLine);
  451. // gCmdLineBack[strlen(gCmdLineBack) - 1] = 0;//去掉最后的回车符
  452. gCmdLineCount++;
  453. // break;
  454. }
  455. else if (gCmdLineCount < DT_CMDLINE_SIZE - 1)
  456. {
  457. gCmdLine[gCmdLineCount] = c;
  458. gCmdLineCount++;
  459. continue;
  460. }
  461. // 如果是空行,重新开始
  462. if (strlen(gCmdLine) < 1)
  463. {
  464. gCmdLineCount = 0;
  465. rt_printf(str_hint);
  466. continue;
  467. }
  468. // 将命令行转换成小写
  469. #if 0 // 不允许将命令行转为小写,否则auth授权命令不正确
  470. for(i=0;i<strlen(gCmdLine);i++)
  471. {
  472. if(gCmdLine[i]>='A' && gCmdLine[i]<='Z')
  473. gCmdLine[i] += 'a' - 'A';
  474. }
  475. #endif
  476. // 2.分解出所有的参数
  477. memset(gCmdArg, 0, sizeof(gCmdArg));
  478. gCmdArgCount = 0;
  479. p = gCmdLine;
  480. while (*p)
  481. {
  482. // 去掉前面的空格
  483. while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
  484. p++;
  485. if (*p == 0)
  486. break;
  487. // 得到参数
  488. gCmdArg[gCmdArgCount++] = p;
  489. while (*p != 0 && *p != ' ' && *p != '\t' && *p != '\r' && *p != '\n')
  490. p++;
  491. if (*p == 0)
  492. break;
  493. *p = 0;
  494. if (gCmdArgCount >= 32)
  495. break;
  496. p++;
  497. }
  498. if (gCmdArgCount == 0)
  499. {
  500. gCmdLineCount = 0;
  501. continue;
  502. }
  503. // 3.寻找相应的命令,执行
  504. for (i = 0; i < CMD_NUM; i++)
  505. {
  506. if (strcmp(gCmdArg[0], gCmd[i].szCmd) == 0)
  507. {
  508. gCmd[i].fnCmd();
  509. break;
  510. }
  511. }
  512. if (i == CMD_NUM)
  513. rt_printf("不能识别的命令: \"%s\"!\r\n", gCmdArg[0]);
  514. // 命令提示符
  515. rt_printf(str_hint);
  516. gCmdLineCount = 0;
  517. }
  518. g_thread_created_flag = 0;
  519. }
  520. //------------------------------------- 内部函数 ----------------------------------------
  521. int dt_CmdCls(void)
  522. {
  523. rt_printf(str_cls);
  524. return 0;
  525. }
  526. static unsigned int str2int(char *str)
  527. {
  528. unsigned int i, result;
  529. char n;
  530. if (!str)
  531. return 0;
  532. // 处理10进制
  533. if (!(strlen(str) > 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')))
  534. {
  535. return (unsigned int)atoi(str);
  536. }
  537. // 处理16进制
  538. str += 2;
  539. result = 0;
  540. for (i = 0; i < strlen(str); i++)
  541. {
  542. n = str[i];
  543. if (n >= '0' && n <= '9')
  544. n = n - '0';
  545. else if (n >= 'a' && n <= 'f')
  546. n = n - 'a' + 10;
  547. else if (n >= 'A' && n <= 'F')
  548. n = n - 'A' + 10;
  549. else
  550. break;
  551. result = result * 16 + n;
  552. }
  553. return result;
  554. }
  555. //------------------------------------- 命令行函数 ----------------------------------------
  556. // 帮助
  557. int dt_CmdHelp(void)
  558. {
  559. int i;
  560. rt_printf("\r\n");
  561. rt_printf(str_version);
  562. rt_printf("\r\n\r\n");
  563. for (i = 0; i < CMD_NUM; i++)
  564. {
  565. rt_printf("%s: %s\r\n", gCmd[i].szCmd, gCmd[i].szCmdHelp);
  566. }
  567. rt_printf("\r\n");
  568. rt_printf("如果需要命令的详细帮助,请输入\"命令 -h\"\r\n");
  569. return 0;
  570. }
  571. int dt_CmdMem(void)
  572. {
  573. unsigned int i, addr, value, length;
  574. unsigned short value1;
  575. unsigned char value2;
  576. if (gCmdArgCount == 1)
  577. {
  578. rt_printf("mem [-r addr |-w addr value] [-t4 number|-t2 number|-t1 number] -h\r\n");
  579. return 0;
  580. }
  581. if (strcmp(gCmdArg[1], "-h") == 0)
  582. {
  583. rt_printf("mem [-r addr |-w addr value] [-t4 number|-t2 number|-t1 number] -h\r\n");
  584. return 0;
  585. }
  586. else if (strcmp(gCmdArg[1], "-r") == 0 && gCmdArgCount >= 3)
  587. {
  588. addr = str2int(gCmdArg[2]);
  589. addr = addr & 0xfffffffc;
  590. if ((gCmdArgCount >= 5) && ((strcmp(gCmdArg[3], "-t4") == 0) || (strcmp(gCmdArg[3], "-t2") == 0) || (strcmp(gCmdArg[3], "-t1") == 0)))
  591. length = str2int(gCmdArg[4]);
  592. else if (gCmdArgCount == 4 && ((strcmp(gCmdArg[3], "-t4") == 0) || (strcmp(gCmdArg[3], "-t2") == 0) || (strcmp(gCmdArg[3], "-t1") == 0)))
  593. {
  594. length = 1;
  595. }
  596. else if (gCmdArgCount == 3)
  597. {
  598. length = 1;
  599. gCmdArg[3] = "-t4";
  600. }
  601. else
  602. {
  603. rt_printf("不能识别的参数:%s\r\n", gCmdArg[3]);
  604. return -1;
  605. }
  606. if (strcmp(gCmdArg[3], "-t4") == 0)
  607. {
  608. for (i = 0; i < length; i++)
  609. {
  610. if (i % 4 == 0)
  611. {
  612. rt_printf("0x%08x: ", (addr + i * 4));
  613. }
  614. rt_printf("%08x ", *(unsigned int *)(addr + i * 4));
  615. if (i % 4 == 3)
  616. {
  617. rt_printf("\r\n");
  618. }
  619. // rt_printf("0x%08x: %08x\r\n",(addr+i*4),*(unsigned int *)(addr+i*4));
  620. }
  621. if ((length - 1) % 4 != 3)
  622. {
  623. rt_printf("\r\n");
  624. }
  625. }
  626. else if ((strcmp(gCmdArg[3], "-t2") == 0))
  627. {
  628. for (i = 0; i < length; i++)
  629. {
  630. if (i % 8 == 0)
  631. {
  632. rt_printf("0x%08x: ", (addr + i * 2));
  633. }
  634. rt_printf("%04x ", *(unsigned short *)(addr + i * 2));
  635. if (i % 8 == 7)
  636. {
  637. rt_printf("\r\n");
  638. }
  639. // rt_printf("0x%04x: %04x ",(addr+i*2),*(unsigned short *)(addr+i*2));
  640. }
  641. if ((length - 1) % 8 != 7)
  642. {
  643. rt_printf("\r\n");
  644. }
  645. }
  646. else if ((strcmp(gCmdArg[3], "-t1") == 0))
  647. {
  648. for (i = 0; i < length; i++)
  649. {
  650. if (i % 16 == 0)
  651. {
  652. rt_printf("0x%08x: ", (addr + i));
  653. }
  654. rt_printf("%02x ", *(unsigned char *)(addr + i));
  655. if (i % 16 == 15)
  656. {
  657. rt_printf("\r\n");
  658. }
  659. // rt_printf("0x%02x: %02x ",(addr+i),*(unsigned char *)(addr+i));
  660. }
  661. if ((length - 1) % 16 != 15)
  662. {
  663. rt_printf("\r\n");
  664. }
  665. }
  666. return 0;
  667. }
  668. else if (strcmp(gCmdArg[1], "-w") == 0 && gCmdArgCount >= 4)
  669. {
  670. addr = str2int(gCmdArg[2]);
  671. addr = addr & 0xfffffffc;
  672. value = str2int(gCmdArg[3]);
  673. if (gCmdArgCount >= 6 && ((strcmp(gCmdArg[4], "-t4") == 0) || (strcmp(gCmdArg[4], "-t2") == 0) || (strcmp(gCmdArg[4], "-t1") == 0)))
  674. length = str2int(gCmdArg[5]);
  675. else if (gCmdArgCount == 5 && ((strcmp(gCmdArg[4], "-t4") == 0) || (strcmp(gCmdArg[4], "-t2") == 0) || (strcmp(gCmdArg[4], "-t1") == 0)))
  676. {
  677. length = 1;
  678. }
  679. else if (gCmdArgCount == 4)
  680. {
  681. length = 1;
  682. gCmdArg[4] = "-t4";
  683. }
  684. else if (gCmdArgCount == 3)
  685. {
  686. rt_printf("缺少参数\r\n");
  687. return -1;
  688. }
  689. else
  690. {
  691. rt_printf("不能识别的参数:%s\r\n", gCmdArg[4]);
  692. return -1;
  693. }
  694. if ((strcmp(gCmdArg[4], "-t4") == 0))
  695. {
  696. for (i = 0; i < length; i++)
  697. {
  698. *(unsigned int *)(addr + i * 4) = value;
  699. if (i % 4 == 0)
  700. {
  701. rt_printf("0x%08x: ", (addr + i * 4));
  702. }
  703. rt_printf("%08x ", *(unsigned int *)(addr + i * 4));
  704. if (i % 4 == 3)
  705. {
  706. rt_printf("\r\n");
  707. }
  708. // rt_printf("0x%08x: %08x \r\n",(addr+i*4),*(unsigned int *)(addr+i*4));
  709. }
  710. if ((length - 1) % 4 != 3)
  711. {
  712. rt_printf("\r\n");
  713. }
  714. }
  715. else if ((strcmp(gCmdArg[4], "-t2") == 0))
  716. {
  717. value1 = (unsigned short)(value);
  718. for (i = 0; i < length; i++)
  719. {
  720. *(unsigned short *)(addr + i * 2) = value1;
  721. if (i % 8 == 0)
  722. {
  723. rt_printf("0x%04x: ", (addr + i * 2));
  724. }
  725. rt_printf("%04x ", *(unsigned short *)(addr + i * 2));
  726. if (i % 8 == 7)
  727. {
  728. rt_printf("\r\n");
  729. }
  730. // rt_printf("0x%04x: %04x ",(addr+i*2),*(unsigned short *)(addr+i*2));
  731. }
  732. if ((length - 1) % 8 != 7)
  733. {
  734. rt_printf("\r\n");
  735. }
  736. }
  737. else if ((strcmp(gCmdArg[4], "-t1") == 0))
  738. {
  739. value2 = (unsigned char)(value);
  740. for (i = 0; i < length; i++)
  741. {
  742. *(unsigned char *)(addr + i) = value2;
  743. if (i % 16 == 0)
  744. {
  745. rt_printf("0x%02x: ", (addr + i));
  746. }
  747. rt_printf("%02x ", *(unsigned char *)(addr + i));
  748. if (i % 16 == 15)
  749. {
  750. rt_printf("\r\n");
  751. }
  752. // rt_printf("0x%02x: %02x ",(addr+i),*(unsigned char *)(addr+i));
  753. }
  754. if ((length - 1) % 16 != 15)
  755. {
  756. rt_printf("\r\n");
  757. }
  758. }
  759. return 0;
  760. }
  761. else
  762. {
  763. rt_printf("不能识别的参数:%s\r\n", gCmdArg[1]);
  764. }
  765. return -1;
  766. }
  767. struct timespec g_ts_rt_reset;
  768. static void dt_cmd_rt_printf_head(void)
  769. {
  770. struct timespec ts;
  771. struct rtc_time_t tm;
  772. // rt_printf("%s!\r\n",RT_SYSTEM_INFO);
  773. timespec_to_rtc(g_ts_rt_reset, &tm, 0);
  774. rt_printf("RESET TIME: %04d-%02d-%02d %02d:%02d:%02d:%09d!\r\n",
  775. tm.year + 2000,
  776. tm.month,
  777. tm.day,
  778. tm.hour,
  779. tm.min,
  780. tm.ms / 1000,
  781. g_ts_rt_reset.tv_nsec);
  782. clk_time_get(&ts);
  783. timespec_to_rtc(ts, &tm, 0);
  784. rt_printf("UPDATE TIME: %04d-%02d-%02d %02d:%02d:%02d:%09d!\r\n",
  785. tm.year + 2000,
  786. tm.month,
  787. tm.day,
  788. tm.hour,
  789. tm.min,
  790. tm.ms / 1000,
  791. ts.tv_nsec);
  792. }
  793. int dt_cmd_rt(void)
  794. {
  795. dt_cmd_rt_printf_head();
  796. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt");
  797. pit_stat_printf();
  798. rt_stat_other_printf();
  799. return 0;
  800. }
  801. int dt_cmd_adc(void)
  802. {
  803. dt_cmd_rt_printf_head();
  804. adc_stat_printf();
  805. return 0;
  806. }
  807. int dt_cmd_freq(void)
  808. {
  809. dt_cmd_rt_printf_head();
  810. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt");
  811. // sunxi 20200805 freq_stat_printf();
  812. return 0;
  813. }
  814. extern SOCKET g_debug_client;
  815. #define COMM_CHANNEL_NUM 10 // sunxi 20200814 这些命令的实现不应该放在rt这边的,特别是涉及到这些业务的代码。
  816. int dt_cmd_comm(void)
  817. {
  818. u32 port;
  819. if (gCmdArgCount == 2)
  820. {
  821. port = atoi(gCmdArg[1]);
  822. if (port < COMM_CHANNEL_NUM)
  823. {
  824. // sunxi 20200805 g_print_port = 1<<port;
  825. rt_printf("报文监视打开成功:port=%lu.\r\n", port);
  826. }
  827. else
  828. {
  829. rt_printf("报文监视打开失败:port=%lu.\r\n", port);
  830. return -1;
  831. }
  832. }
  833. else
  834. {
  835. // sunxi 20200805 g_print_port = -1;
  836. rt_printf("报文监视打开成功...\r\n");
  837. }
  838. // g_print_comm_raw = 1;
  839. // sunxi 20200805 g_print_sys = 1;
  840. // sunxi 20200805 g_print_104 = 1;
  841. // sunxi 20200805 g_print_101 = 1;
  842. // sunxi 20200805 g_print_lnk = 1;
  843. if (g_debug_client != RT_SOCKET_ERR)
  844. {
  845. // sunxi 20200805 g_print_to_net = 1;
  846. }
  847. return 0;
  848. }
  849. #if 0
  850. static int dt_soe_gen(void)
  851. {
  852. g_soe_gen_state = 0;
  853. if(gCmdArgCount != 2 && gCmdArgCount != 4)
  854. {
  855. rt_printf("soe发生器已关闭。\r\n");
  856. rt_printf("soe发生器用法:soegen soe_seq_ms soe_on_ms g_soe_off_ms\r\n");
  857. return 0;
  858. }
  859. if(gCmdArgCount == 2)
  860. {
  861. g_soe_gen_seq_us = atoi(gCmdArg[1]);
  862. g_soe_gen_on_us = 50;
  863. g_soe_gen_off_us = 50;
  864. }
  865. else if(gCmdArgCount == 4)
  866. {
  867. g_soe_gen_seq_us = atoi(gCmdArg[1]);
  868. g_soe_gen_on_us = atoi(gCmdArg[2]);
  869. g_soe_gen_off_us = atoi(gCmdArg[3]);
  870. }
  871. rt_printf("soe发生器开启:间隔时间=%dms,ON时间=%dms,OFF时间=%dms.\r\n",g_soe_gen_seq_us,g_soe_gen_on_us,g_soe_gen_off_us);
  872. g_soe_gen_seq_us *= 10;
  873. g_soe_gen_on_us *= 10;
  874. g_soe_gen_off_us *= 10;
  875. g_soe_gen_state = 1;
  876. return 0;
  877. }
  878. #endif
  879. // sunxi 20200805 extern unsigned int g_iec101_recv_count;
  880. void s_stat_reset1(int all)
  881. {
  882. }
  883. extern int dido_stat_reset(void);
  884. extern int s_stat_reset(int all);
  885. extern int soe_stat_reset(void);
  886. int dt_cmd_rt_reset(void)
  887. {
  888. // sunxi 20200805 g_print_104 = 0;
  889. // sunxi 20200805 g_print_101 = 0;
  890. // sunxi 20200805 g_print_lnk = 0;
  891. // g_print_comm_raw = 0;
  892. // sunxi 20200805 g_print_port = -1;
  893. // clock_gettime(CLOCK_REALTIME, &g_ts_rt_reset);
  894. pit_stat_reset();
  895. rt_stat_other_reset();
  896. // sunxi 20200805 adc_stat_reset();
  897. // sunxi 20200805 freq_stat_reset();
  898. // atimer_stat_reset();
  899. // sunxi 20200805 sw_stat_reset();
  900. dido_stat_reset();
  901. // sunxi 20200805 protect_stat_reset();
  902. s_stat_reset(1); // 串口统计信息复位
  903. soe_stat_reset();
  904. #if defined(BSP_CAN_ENABLE)
  905. can_stat_reset();
  906. #endif
  907. rt_printf("实时统计数据已复位!\r\n");
  908. return 0;
  909. }
  910. /*------------------------------ 文件结束 -------------------------------------
  911. */