rt_console.c 21 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  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. #ifdef BSP_CAN_ENABLE
  397. {"can",can_stat,"CAN总线统计"},
  398. #endif
  399. #if defined(BSP_DTU3) || defined(BSP_DTU2)
  400. {"sb",can_app_sb_monitor, "子板监视信息"},
  401. {"cantest",can_app_test_printf, "子板测试信息"},
  402. #endif
  403. };
  404. #define CMD_NUM ((int)(sizeof(gCmd)/sizeof(TCmd)))
  405. //------------------------------------- 外部函数 ----------------------------------------
  406. static void rt_console_thread(void *arg)
  407. {
  408. static char EscCmd[16];
  409. static int IsEsc=0;
  410. char c;
  411. char *p;
  412. int i;
  413. g_thread_exit_flag = 0;
  414. // 1.得到一行字符,每接收一个字符要回送.
  415. prctl(PR_SET_NAME, "rt_console_thread");
  416. while(rt_console_read((unsigned char *)&c, 1) == 1)
  417. {
  418. //ESC处理
  419. if(c == 0x1b)
  420. {
  421. IsEsc=0;
  422. EscCmd[IsEsc++] = c;
  423. continue;
  424. }
  425. else if(IsEsc)
  426. {
  427. EscCmd[IsEsc++] = c;
  428. if(IsEsc == 3)
  429. {
  430. IsEsc=0;
  431. if(memcmp(EscCmd,str_up,3) == 0 || memcmp(EscCmd,str_down,3) == 0)
  432. {
  433. rt_printf("%s%dD",str_esc,gCmdLineCount);
  434. rt_printf(str_clr);
  435. strcpy(gCmdLine,gCmdLineBack);
  436. gCmdLineCount = (int)strlen(gCmdLine);
  437. rt_printf(gCmdLine);
  438. }
  439. }
  440. continue;
  441. }
  442. if(c == '\b' && gCmdLineCount > 0)
  443. {
  444. gCmdLineCount--;
  445. rt_printf(str_clr);
  446. continue;
  447. }
  448. else if(c == '\n' || c == '\r')
  449. {
  450. gCmdLine[gCmdLineCount] = 0;
  451. strcpy(gCmdLineBack,gCmdLine);
  452. // gCmdLineBack[strlen(gCmdLineBack) - 1] = 0;//去掉最后的回车符
  453. gCmdLineCount++;
  454. // break;
  455. }
  456. else if(gCmdLineCount < DT_CMDLINE_SIZE -1)
  457. {
  458. gCmdLine[gCmdLineCount] = c;
  459. gCmdLineCount++;
  460. continue;
  461. }
  462. //如果是空行,重新开始
  463. if(strlen(gCmdLine)<1)
  464. {
  465. gCmdLineCount = 0;
  466. rt_printf(str_hint);
  467. continue;
  468. }
  469. //将命令行转换成小写
  470. #if 0 // 不允许将命令行转为小写,否则auth授权命令不正确
  471. for(i=0;i<strlen(gCmdLine);i++)
  472. {
  473. if(gCmdLine[i]>='A' && gCmdLine[i]<='Z')
  474. gCmdLine[i] += 'a' - 'A';
  475. }
  476. #endif
  477. // 2.分解出所有的参数
  478. memset(gCmdArg,0,sizeof(gCmdArg));
  479. gCmdArgCount = 0;
  480. p = gCmdLine;
  481. while(*p)
  482. {
  483. //去掉前面的空格
  484. while(*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
  485. p++;
  486. if(*p == 0)
  487. break;
  488. //得到参数
  489. gCmdArg[gCmdArgCount++] = p;
  490. while(*p != 0 &&*p != ' ' && *p != '\t' && *p != '\r' && *p != '\n')
  491. p++;
  492. if(*p == 0)
  493. break;
  494. *p =0;
  495. if(gCmdArgCount >= 32)
  496. break;
  497. p++;
  498. }
  499. if(gCmdArgCount == 0)
  500. {
  501. gCmdLineCount = 0;
  502. continue;
  503. }
  504. // 3.寻找相应的命令,执行
  505. for(i=0;i<CMD_NUM;i++)
  506. {
  507. if(strcmp(gCmdArg[0],gCmd[i].szCmd) == 0)
  508. {
  509. gCmd[i].fnCmd();
  510. break;
  511. }
  512. }
  513. if(i == CMD_NUM)
  514. rt_printf("不能识别的命令: \"%s\"!\r\n",gCmdArg[0]);
  515. //命令提示符
  516. rt_printf(str_hint);
  517. gCmdLineCount = 0;
  518. }
  519. g_thread_created_flag = 0;
  520. }
  521. //------------------------------------- 内部函数 ----------------------------------------
  522. int dt_CmdCls(void)
  523. {
  524. rt_printf(str_cls);
  525. return 0;
  526. }
  527. static unsigned int str2int(char *str)
  528. {
  529. unsigned int i,result;
  530. char n;
  531. if(!str)
  532. return 0;
  533. //处理10进制
  534. if( !(strlen(str)>2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) )
  535. {
  536. return (unsigned int)atoi(str);
  537. }
  538. //处理16进制
  539. str += 2;
  540. result = 0;
  541. for(i=0;i<strlen(str);i++)
  542. {
  543. n = str[i];
  544. if(n>='0' && n<='9')
  545. n = n - '0';
  546. else if(n>='a' && n<='f')
  547. n = n - 'a' + 10;
  548. else if(n>='A' && n<='F')
  549. n = n - 'A' + 10;
  550. else
  551. break;
  552. result = result*16 + n;
  553. }
  554. return result;
  555. }
  556. //------------------------------------- 命令行函数 ----------------------------------------
  557. //帮助
  558. int dt_CmdHelp(void)
  559. {
  560. int i;
  561. rt_printf("\r\n");
  562. rt_printf(str_version);
  563. rt_printf("\r\n\r\n");
  564. for(i=0;i<CMD_NUM;i++)
  565. {
  566. rt_printf("%s: %s\r\n",gCmd[i].szCmd,gCmd[i].szCmdHelp);
  567. }
  568. rt_printf("\r\n");
  569. rt_printf("如果需要命令的详细帮助,请输入\"命令 -h\"\r\n");
  570. return 0;
  571. }
  572. int dt_CmdMem(void)
  573. {
  574. unsigned int i,addr,value,length;
  575. unsigned short value1;
  576. unsigned char value2;
  577. if(gCmdArgCount == 1)
  578. {
  579. rt_printf("mem [-r addr |-w addr value] [-t4 number|-t2 number|-t1 number] -h\r\n");
  580. return 0;
  581. }
  582. if(strcmp(gCmdArg[1],"-h") == 0)
  583. {
  584. rt_printf("mem [-r addr |-w addr value] [-t4 number|-t2 number|-t1 number] -h\r\n");
  585. return 0;
  586. }
  587. else if(strcmp(gCmdArg[1],"-r") == 0 && gCmdArgCount >= 3)
  588. {
  589. addr = str2int(gCmdArg[2]);
  590. addr = addr&0xfffffffc;
  591. if((gCmdArgCount >=5) && ((strcmp(gCmdArg[3],"-t4") == 0) || (strcmp(gCmdArg[3],"-t2") == 0) || (strcmp(gCmdArg[3],"-t1") == 0)))
  592. length = str2int(gCmdArg[4]);
  593. else if(gCmdArgCount == 4 && ((strcmp(gCmdArg[3],"-t4") == 0) || (strcmp(gCmdArg[3],"-t2") == 0) || (strcmp(gCmdArg[3],"-t1") == 0)))
  594. {
  595. length = 1;
  596. }
  597. else if(gCmdArgCount == 3)
  598. {
  599. length = 1;
  600. gCmdArg[3] = "-t4";
  601. }
  602. else
  603. {
  604. rt_printf("不能识别的参数:%s\r\n",gCmdArg[3]);
  605. return -1;
  606. }
  607. if(strcmp(gCmdArg[3],"-t4") == 0)
  608. {
  609. for(i=0;i<length;i++)
  610. {
  611. if(i%4 == 0)
  612. {
  613. rt_printf("0x%08x: ",(addr+i*4));
  614. }
  615. rt_printf("%08x ",*(unsigned int *)(addr+i*4));
  616. if(i%4 == 3)
  617. {
  618. rt_printf("\r\n");
  619. }
  620. //rt_printf("0x%08x: %08x\r\n",(addr+i*4),*(unsigned int *)(addr+i*4));
  621. }
  622. if((length-1)%4 != 3)
  623. {
  624. rt_printf("\r\n");
  625. }
  626. }
  627. else if((strcmp(gCmdArg[3],"-t2") == 0))
  628. {
  629. for(i=0;i<length;i++)
  630. {
  631. if(i%8 == 0)
  632. {
  633. rt_printf("0x%08x: ",(addr+i*2));
  634. }
  635. rt_printf("%04x ",*(unsigned short *)(addr+i*2));
  636. if(i%8 == 7)
  637. {
  638. rt_printf("\r\n");
  639. }
  640. //rt_printf("0x%04x: %04x ",(addr+i*2),*(unsigned short *)(addr+i*2));
  641. }
  642. if((length-1)%8 != 7)
  643. {
  644. rt_printf("\r\n");
  645. }
  646. }
  647. else if((strcmp(gCmdArg[3],"-t1") == 0))
  648. {
  649. for(i=0;i<length;i++)
  650. {
  651. if(i%16 == 0)
  652. {
  653. rt_printf("0x%08x: ",(addr+i));
  654. }
  655. rt_printf("%02x ",*(unsigned char *)(addr+i));
  656. if(i%16 == 15)
  657. {
  658. rt_printf("\r\n");
  659. }
  660. //rt_printf("0x%02x: %02x ",(addr+i),*(unsigned char *)(addr+i));
  661. }
  662. if((length-1)%16 != 15)
  663. {
  664. rt_printf("\r\n");
  665. }
  666. }
  667. return 0;
  668. }
  669. else if(strcmp(gCmdArg[1],"-w") == 0 && gCmdArgCount >= 4)
  670. {
  671. addr = str2int(gCmdArg[2]);
  672. addr = addr&0xfffffffc;
  673. value = str2int(gCmdArg[3]);
  674. if(gCmdArgCount >=6 && ((strcmp(gCmdArg[4],"-t4") == 0) || (strcmp(gCmdArg[4],"-t2") == 0) || (strcmp(gCmdArg[4],"-t1") == 0)))
  675. length = str2int(gCmdArg[5]);
  676. else if(gCmdArgCount == 5 && ((strcmp(gCmdArg[4],"-t4") == 0) || (strcmp(gCmdArg[4],"-t2") == 0) || (strcmp(gCmdArg[4],"-t1") == 0)))
  677. {
  678. length = 1;
  679. }
  680. else if(gCmdArgCount == 4)
  681. {
  682. length = 1;
  683. gCmdArg[4] = "-t4";
  684. }
  685. else if(gCmdArgCount == 3)
  686. {
  687. rt_printf("缺少参数\r\n");
  688. return -1;
  689. }
  690. else
  691. {
  692. rt_printf("不能识别的参数:%s\r\n",gCmdArg[4]);
  693. return -1;
  694. }
  695. if((strcmp(gCmdArg[4],"-t4") == 0))
  696. {
  697. for(i=0;i<length;i++)
  698. {
  699. *(unsigned int *)(addr+i*4) = value;
  700. if(i%4 == 0)
  701. {
  702. rt_printf("0x%08x: ",(addr+i*4));
  703. }
  704. rt_printf("%08x ",*(unsigned int *)(addr+i*4));
  705. if(i%4 == 3)
  706. {
  707. rt_printf("\r\n");
  708. }
  709. //rt_printf("0x%08x: %08x \r\n",(addr+i*4),*(unsigned int *)(addr+i*4));
  710. }
  711. if((length-1)%4 != 3)
  712. {
  713. rt_printf("\r\n");
  714. }
  715. }
  716. else if((strcmp(gCmdArg[4],"-t2") == 0))
  717. {
  718. value1 = (unsigned short)(value);
  719. for(i=0;i<length;i++)
  720. {
  721. *(unsigned short *)(addr+i*2) = value1;
  722. if(i%8 == 0)
  723. {
  724. rt_printf("0x%04x: ",(addr+i*2));
  725. }
  726. rt_printf("%04x ",*(unsigned short *)(addr+i*2));
  727. if(i%8 == 7)
  728. {
  729. rt_printf("\r\n");
  730. }
  731. //rt_printf("0x%04x: %04x ",(addr+i*2),*(unsigned short *)(addr+i*2));
  732. }
  733. if((length-1)%8 != 7)
  734. {
  735. rt_printf("\r\n");
  736. }
  737. }
  738. else if((strcmp(gCmdArg[4],"-t1") == 0))
  739. {
  740. value2 = (unsigned char)(value);
  741. for(i=0;i<length;i++)
  742. {
  743. *(unsigned char *)(addr+i) = value2;
  744. if(i%16 == 0)
  745. {
  746. rt_printf("0x%02x: ",(addr+i));
  747. }
  748. rt_printf("%02x ",*(unsigned char *)(addr+i));
  749. if(i%16 == 15)
  750. {
  751. rt_printf("\r\n");
  752. }
  753. //rt_printf("0x%02x: %02x ",(addr+i),*(unsigned char *)(addr+i));
  754. }
  755. if((length-1)%16 != 15)
  756. {
  757. rt_printf("\r\n");
  758. }
  759. }
  760. return 0;
  761. }
  762. else
  763. {
  764. rt_printf("不能识别的参数:%s\r\n",gCmdArg[1]);
  765. }
  766. return -1;
  767. }
  768. struct timespec g_ts_rt_reset;
  769. static void dt_cmd_rt_printf_head(void)
  770. {
  771. struct timespec ts;
  772. struct rtc_time_t tm;
  773. //rt_printf("%s!\r\n",RT_SYSTEM_INFO);
  774. timespec_to_rtc(g_ts_rt_reset,&tm,0);
  775. rt_printf("RESET TIME: %04d-%02d-%02d %02d:%02d:%02d:%09d!\r\n",
  776. tm.year + 2000,
  777. tm.month,
  778. tm.day,
  779. tm.hour,
  780. tm.min,
  781. tm.ms/1000,
  782. g_ts_rt_reset.tv_nsec
  783. );
  784. clk_time_get(&ts);
  785. timespec_to_rtc(ts,&tm,0);
  786. rt_printf("UPDATE TIME: %04d-%02d-%02d %02d:%02d:%02d:%09d!\r\n",
  787. tm.year + 2000,
  788. tm.month,
  789. tm.day,
  790. tm.hour,
  791. tm.min,
  792. tm.ms/1000,
  793. ts.tv_nsec
  794. );
  795. }
  796. int dt_cmd_rt(void)
  797. {
  798. dt_cmd_rt_printf_head();
  799. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt");
  800. pit_stat_printf();
  801. rt_stat_other_printf();
  802. return 0;
  803. }
  804. int dt_cmd_adc(void)
  805. {
  806. dt_cmd_rt_printf_head();
  807. adc_stat_printf();
  808. return 0;
  809. }
  810. int dt_cmd_freq(void)
  811. {
  812. dt_cmd_rt_printf_head();
  813. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt");
  814. // sunxi 20200805 freq_stat_printf();
  815. return 0;
  816. }
  817. extern SOCKET g_debug_client;
  818. #define COMM_CHANNEL_NUM 10 // sunxi 20200814 这些命令的实现不应该放在rt这边的,特别是涉及到这些业务的代码。
  819. int dt_cmd_comm(void)
  820. {
  821. u32 port;
  822. if(gCmdArgCount == 2)
  823. {
  824. port = atoi(gCmdArg[1]);
  825. if(port < COMM_CHANNEL_NUM)
  826. {
  827. // sunxi 20200805 g_print_port = 1<<port;
  828. rt_printf("报文监视打开成功:port=%lu.\r\n",port);
  829. }
  830. else
  831. {
  832. rt_printf("报文监视打开失败:port=%lu.\r\n",port);
  833. return -1;
  834. }
  835. }
  836. else
  837. {
  838. // sunxi 20200805 g_print_port = -1;
  839. rt_printf("报文监视打开成功...\r\n");
  840. }
  841. // g_print_comm_raw = 1;
  842. // sunxi 20200805 g_print_sys = 1;
  843. // sunxi 20200805 g_print_104 = 1;
  844. // sunxi 20200805 g_print_101 = 1;
  845. // sunxi 20200805 g_print_lnk = 1;
  846. if(g_debug_client != RT_SOCKET_ERR)
  847. {
  848. // sunxi 20200805 g_print_to_net = 1;
  849. }
  850. return 0;
  851. }
  852. #if 0
  853. static int dt_soe_gen(void)
  854. {
  855. g_soe_gen_state = 0;
  856. if(gCmdArgCount != 2 && gCmdArgCount != 4)
  857. {
  858. rt_printf("soe发生器已关闭。\r\n");
  859. rt_printf("soe发生器用法:soegen soe_seq_ms soe_on_ms g_soe_off_ms\r\n");
  860. return 0;
  861. }
  862. if(gCmdArgCount == 2)
  863. {
  864. g_soe_gen_seq_us = atoi(gCmdArg[1]);
  865. g_soe_gen_on_us = 50;
  866. g_soe_gen_off_us = 50;
  867. }
  868. else if(gCmdArgCount == 4)
  869. {
  870. g_soe_gen_seq_us = atoi(gCmdArg[1]);
  871. g_soe_gen_on_us = atoi(gCmdArg[2]);
  872. g_soe_gen_off_us = atoi(gCmdArg[3]);
  873. }
  874. 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);
  875. g_soe_gen_seq_us *= 10;
  876. g_soe_gen_on_us *= 10;
  877. g_soe_gen_off_us *= 10;
  878. g_soe_gen_state = 1;
  879. return 0;
  880. }
  881. #endif
  882. // sunxi 20200805 extern unsigned int g_iec101_recv_count;
  883. void s_stat_reset1(int all)
  884. {
  885. }
  886. extern int dido_stat_reset(void);
  887. extern int s_stat_reset(int all);
  888. extern int soe_stat_reset(void);
  889. int dt_cmd_rt_reset(void)
  890. {
  891. // sunxi 20200805 g_print_104 = 0;
  892. // sunxi 20200805 g_print_101 = 0;
  893. // sunxi 20200805 g_print_lnk = 0;
  894. // g_print_comm_raw = 0;
  895. // sunxi 20200805 g_print_port = -1;
  896. //clock_gettime(CLOCK_REALTIME, &g_ts_rt_reset);
  897. pit_stat_reset();
  898. rt_stat_other_reset();
  899. // sunxi 20200805 adc_stat_reset();
  900. // sunxi 20200805 freq_stat_reset();
  901. // atimer_stat_reset();
  902. // sunxi 20200805 sw_stat_reset();
  903. dido_stat_reset();
  904. // sunxi 20200805 protect_stat_reset();
  905. s_stat_reset(1);//串口统计信息复位
  906. soe_stat_reset();
  907. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  908. can_stat_reset();
  909. #endif
  910. rt_printf("实时统计数据已复位!\r\n");
  911. return 0;
  912. }
  913. /*------------------------------ 文件结束 -------------------------------------
  914. */