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