rt_console.c 21 KB

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