GadgetSeed  0.9.6
com_system.c
[詳解]
1 /** @file
2  @brief システムコマンド
3 
4  @date 2007.04.22
5  @author Takashi SHUDO
6 
7  @section sys_command sysコマンド
8 
9  sys コマンドには以下のサブコマンドがあります。
10 
11  | サブコマンド | 機能 | 詳細 |
12  |:------------------|:------------------------------|:----------------------|
13  | info | @copybrief com_sys_info | @ref com_sys_info |
14  | timercheck | @copybrief com_sys_timercheck | @ref com_sys_timercheck |
15  | kerneltime | @copybrief com_sys_kerneltime | @ref com_sys_kerneltime |
16  | systime | @copybrief com_sys_systime | @ref com_sys_systime |
17  | datetime | @copybrief com_sys_datetime | @ref com_sys_datetime |
18  | setdate | @copybrief com_sys_setdate | @ref com_sys_setdate |
19  | rtcdate | @copybrief com_sys_rtcdate | @ref com_sys_rtcdate |
20  | datesync | @copybrief com_sys_datesync | @ref com_sys_datesync |
21  | rtcsync | @copybrief com_sys_rtcsync | @ref com_sys_rtcsync |
22  | event | @copybrief com_sys_event | @ref com_sys_event |
23  | setevent | @copybrief com_sys_setevent | @ref com_sys_setevent |
24  | sleep | @copybrief com_sys_sleep | @ref com_sys_sleep |
25  | console | @copybrief com_sys_console | @ref com_sys_console |
26  | sysmem | @copybrief com_sys_sysmem | @ref com_sys_sysmem |
27  | heap | @copybrief com_sys_heap | @ref com_sys_heap |
28  | reboot | @copybrief com_sys_reboot | @ref com_sys_reboot |
29  | random | @copybrief com_sys_random | @ref com_sys_random |
30  | interrupt | @copybrief com_sys_interrupt | @ref com_sys_interrupt |
31 */
32 
33 #include "gadgetseed.h"
34 #include "shell.h"
35 #include "lineedit.h"
36 #include "console.h"
37 #include "timer.h"
38 #include "datetime.h"
39 #include "str.h"
40 #include "sysevent.h"
41 #include "key.h"
42 #include "memory.h"
43 #include "tprintf.h"
44 #include "system.h"
45 #include "task/syscall.h"
46 
47 //#define DEBUGTBITS 0x01
48 #include "dtprintf.h"
49 
50 
51 /*
52  システム情報
53 */
54 static int system_info(int argc, uchar *argv[])
55 {
56  extern const char os_version[];
57  extern const char cpu_name[];
58  extern const char arch_name[];
59  extern const char system_name[];
60  extern const char build_date[];
61  extern const char build_time[];
62 
63  tprintf("Version : %s\n", os_version);
64  tprintf("CPU ARCH : %s\n", arch_name);
65  tprintf("CPU NAME : %s\n", cpu_name);
66  tprintf("SYSTEM : %s\n", system_name);
67  tprintf("Build date : %s %s\n", build_time, build_date);
68 
69  return 0;
70 }
71 
72 /**
73  @brief システム情報を表示
74 
75  [使用例]
76 
77  : sys info
78  Version : 0.94\n
79  CPU ARCH : Cortex-M7\n
80  CPU NAME : STM32F769NIH6\n
81  SYSTEM : 32F769IDISCOVERY\n
82  Build date : 22:50:34 Jun 20 2018\n
83 */
84 static const struct st_shell_command com_sys_info = {
85  .name = "info",
86  .command = system_info,
87  .manual_str = "Print system info"
88 };
89 
90 /*
91  タイマーチェック
92 */
93 static int timer_check_time(int argc, uchar *argv[])
94 {
95  unsigned long long lktime = get_kernel_time();
96 
97  do {
98  unsigned long long ktime = get_kernel_time();
99  unsigned long long utime = get_system_utime();
100 
101  tprintf("Kernel = %16lld ", ktime);
102  tprintf("System = %16lld.%03lld ", utime/1000, utime%1000);
103  tprintf("diff = %8d %8lld\n", (int)(ktime - lktime), utime/1000 - ktime);
104 
105  if(cwait(1000) != 0) {
106  unsigned char rd;
107  if(cgetcnw(&rd) != 0) {
108  return 0;
109  }
110  }
111 
112  lktime = ktime;
113  } while(1);
114 
115  return 0;
116 }
117 
118 /**
119  @brief カーネルタイマとシステムタイマの差分を表示し続ける
120 
121  何らかのキー入力があればコマンドは停止します。
122 */
123 static const struct st_shell_command com_sys_timercheck = {
124  .name = "timercheck",
125  .command = timer_check_time,
126  .manual_str = "Kerne timer & system time check"
127 };
128 
129 /*
130  カーネル時間
131 */
132 static int com_kernel_time(int argc, uchar *argv[])
133 {
134  unsigned long long ktime = get_kernel_time();
135 
136  tprintf("Kernel Time : %14lld (ms)\n", ktime);
137 
138  return 0;
139 }
140 
141 /**
142  @brief カーネルタイマ値を表示
143 
144  [使用例]
145 
146  : sys kerneltime\n
147  Kernel Time : 88504437 (ms)
148 */
149 static const struct st_shell_command com_sys_kerneltime = {
150  .name = "kerneltime",
151  .command = com_kernel_time,
152  .manual_str = "Print kernel time"
153 };
154 
155 static int sys_time(int argc, uchar *argv[])
156 {
157  unsigned long long kutime = get_system_utime();
158 
159  tprintf("System Time : %14lld.%03lld (ms)\n", kutime/1000, kutime%1000);
160 
161  return 0;
162 }
163 
164 /**
165  @brief システムタイマ値を表示
166 
167  [使用例]
168 
169  : sys timertime\n
170  System Time : 89049644.538 (ms)
171 */
172 static const struct st_shell_command com_sys_systime = {
173  .name = "systime",
174  .command = sys_time,
175  .manual_str = "Print System time"
176 };
177 
178 /*
179  日時表示
180 */
181 static int datetime(int argc, uchar *argv[])
182 {
183  struct st_systime systime;
184  struct st_datetime datetime;
185  char str[30];
186 
187  get_systime(&systime);
188  systime_to_datetime(&datetime, &systime);
189  datemtime_to_str(str, &datetime);
190 
191  tprintf("%s %s\n", str, GSC_TIMEZONE_STR);
192  tprintf("UNIX time : %lld.%03d (sec)\n", systime.sec, systime.usec/1000);
193 
194  return 0;
195 }
196 
197 /**
198  @brief 日付時刻を表示
199 
200  [使用例]
201 
202  : sys datetime\n
203  2018/06/24 Sun 11:07:38.567\n
204  UNIX time : 1529806058.567 (sec)
205 */
206 static const struct st_shell_command com_sys_datetime = {
207  .name = "datetime",
208  .command = datetime,
209  .manual_str = "Print datetime"
210 };
211 
212 /*
213  日時設定
214 */
215 static int setdate(int argc, uchar *argv[]);
216 
217 /**
218  @brief 日付時刻を設定
219 */
220 static const struct st_shell_command com_sys_setdate = {
221  .name = "setdate",
222  .command = setdate,
223  .usage_str = "<year> <month> <day> <hour> <min> <sec> [msec]>",
224  .manual_str = "Set datetime"
225 };
226 
227 static int setdate(int argc, uchar *argv[])
228 {
229  struct st_datetime time;
230  struct st_systime systime;
231  char str[30];
232 
233  if(argc < 7) {
234  print_command_usage(&com_sys_setdate);
235  return 0;
236  }
237 
238  time.year = dstoi(argv[1]);
239  time.month = dstoi(argv[2]);
240  time.day = dstoi(argv[3]);
241  time.hour = dstoi(argv[4]);
242  time.min = dstoi(argv[5]);
243  time.sec = dstoi(argv[6]);
244 
245  if(argc > 6) {
246  time.msec = dstoi(argv[7]);
247  } else {
248  time.msec = 0;
249  }
250 
251  time.dayofweek = date_to_dayofweek(time.year, time.month, time.day);
252 
253  systime.sec = datetime_to_utc(&time);
254  systime.usec = time.msec * 1000;
255  set_systime(&systime);
256 
257  datemtime_to_str(str, &time);
258 
259  tprintf("%s\n", str);
260 
261  return 0;
262 }
263 
264 #ifdef GSC_DEV_ENABLE_RTC
265 /*
266  RTCの時計を表示する
267 */
268 static int rtcdate(int argc, uchar *argv[]);
269 
270 /**
271  @brief RTCの時刻を表示
272 */
273 static const struct st_shell_command com_sys_rtcdate = {
274  .name = "rtcdate",
275  .command = rtcdate,
276  .manual_str = "Print RTC datetime"
277 };
278 
279 static int rtcdate(int argc, uchar *argv[])
280 {
281  struct st_datetime rtctime;
282  char str[DATEMTIME_STR_LEN];
283  struct st_systime systime;
284  struct st_systime rstime;
285  long long rtime, stime, dtime, dsec, dmsec;
286  int rt = 0;
287  int flg_repeat = 0;
288  unsigned int rpt_cnt = 0;
289 
290  if(argc > 1) {
291  flg_repeat = 1;
292  rpt_cnt = dstou(argv[1]);
293  }
294 
295 loop:
296  rt = read_rtc_time(&rtctime);
297  if(rt == 0) {
298  datemtime_to_str(str, &rtctime);
299  tprintf("RTC(UTC) : %s\n", str);
300  } else {
301  tprintf("Can not read RTC time(%d)\n", rt);
302  }
303 
304  datetime_to_systime(&rstime, &rtctime);
305  rtime = (((long long)rstime.sec) * 1000) + rstime.usec / 1000;
306  DTPRINTF(0x01, "RTC : %lld\n", rtime);
307 
308  get_systime(&systime);
309  systime_to_datetime(&rtctime, &systime);
310  datemtime_to_str(str, &rtctime);
311 
312  tprintf("SYS(%s) : %s\nUNIX time : %11lld.%06d (sec)\n", GSC_TIMEZONE_STR, str,
313  systime.sec, systime.usec);
314 
315  stime = (((long long)systime.sec) * 1000) + (systime.usec / 1000);
316  DTPRINTF(0x01, "SYS : %lld\n", stime);
317 
318  dtime = stime - rtime;
319  tprintf("Error : ");
320  if(dtime < 0) {
321  dsec = (-dtime)/1000;
322  dmsec = (-dtime) % 1000;
323  tprintf("(-)");
324  } else {
325  dsec = dtime/1000;
326  dmsec = dtime % 1000;
327  tprintf("(+)");
328  }
329  //tprintf("%12lld.%03lld (sec)\n", dsec, dmsec);
330  tprintf("%12d.%03d (sec)\n", (int)dsec, (int)dmsec);
331 
332  if(flg_repeat != 0) {
333  if(cwait(rpt_cnt) != 0) {
334  unsigned char rd;
335  if(cgetcnw(&rd) != 0) {
336  return 0;
337  }
338  }
339  goto loop;
340  }
341 
342  return 0;
343 }
344 
345 
346 
347 /*
348  時計をRTCから同期をとる
349 */
350 static int datesync(int argc, uchar *argv[])
351 {
352  struct st_datetime time;
353  char str[30];
354 
355  sync_systime_from_rtc();
356  read_rtc_time(&time);
357  datemtime_to_str(str, &time);
358  tprintf("Set systime from RTC(UTC) : %s\n", str);
359 
360  return 0;
361 }
362 
363 /**
364  @brief 日付時刻をRTCから同期する
365 */
366 static const struct st_shell_command com_sys_datesync = {
367  .name = "datesync",
368  .command = datesync,
369  .manual_str = "System datetime sync from RTC"
370 };
371 
372 
373 /*
374  RTCを時計から同期をとる
375 */
376 static int rtcsync(int argc, uchar *argv[])
377 {
378  struct st_systime systime;
379  struct st_datetime datetime;
380  char str[30];
381 
382  get_systime(&systime);
383  unixtime_to_datetime(&datetime, &systime);
384 
385  sync_rtc_from_systime();
386 
387  datemtime_to_str(str, &datetime);
388  tprintf("Set RTC from systime : %s\n", str);
389 
390  return 0;
391 }
392 
393 /**
394  @brief RTCを日付時刻から同期する
395 */
396 static const struct st_shell_command com_sys_rtcsync = {
397  .name = "rtcsync",
398  .command = rtcsync,
399  .manual_str = "RTC sync from system datetime"
400 };
401 #endif // GSC_DEV_ENABLE_RTC
402 
403 /*
404  イベント表示
405 */
406 static void disp_key(unsigned short key)
407 {
408  switch(key) {
409  case KEY_HOME: tprintf("KEY_HOME"); break;
410  case KEY_ESC: tprintf("KEY_ESC"); break;
411  case KEY_ENTER: tprintf("KEY_ENTER"); break;
412 
413  case KEY_UP: tprintf("KEY_UP"); break;
414  case KEY_DOWN: tprintf("KEY_DOWN"); break;
415  case KEY_LEFT: tprintf("KEY_LEFT"); break;
416  case KEY_RIGHT: tprintf("KEY_RIGHT"); break;
417 
418  case KEY_COMMA: tprintf("KEY_COMMA"); break;
419  case KEY_PERIOD: tprintf("KEY_PERIOD"); break;
420  case KEY_POWER: tprintf("KEY_POWER"); break;
421  case KEY_PGUP: tprintf("KEY_PGUP"); break;
422  case KEY_PGDN: tprintf("KEY_PGDN"); break;
423 
424  case KEY_F1: tprintf("KEY_F1"); break;
425  case KEY_F2: tprintf("KEY_F2"); break;
426  case KEY_F3: tprintf("KEY_F3"); break;
427  case KEY_F4: tprintf("KEY_F4"); break;
428  case KEY_F5: tprintf("KEY_F5"); break;
429  case KEY_F6: tprintf("KEY_F6"); break;
430 
431  case KEY_R: tprintf("KEY_R"); break;
432  case KEY_S: tprintf("KEY_S"); break;
433  case KEY_P: tprintf("KEY_P"); break;
434  case KEY_F: tprintf("KEY_F"); break;
435 
436 // case KEY_BLUE: tprintf("KEY_BLUE"); break;
437 // case KEY_RED: tprintf("KEY_RED"); break;
438 // case KEY_GREEN: tprintf("KEY_GREEN"); break;
439 // case KEY_YELLOW: tprintf("KEY_YELLOW"); break;
440 
441  case KEY_0: tprintf("KEY_0"); break;
442  case KEY_1: tprintf("KEY_1"); break;
443  case KEY_2: tprintf("KEY_2"); break;
444  case KEY_3: tprintf("KEY_3"); break;
445  case KEY_4: tprintf("KEY_4"); break;
446  case KEY_5: tprintf("KEY_5"); break;
447  case KEY_6: tprintf("KEY_6"); break;
448  case KEY_7: tprintf("KEY_7"); break;
449  case KEY_8: tprintf("KEY_8"); break;
450  case KEY_9: tprintf("KEY_9"); break;
451  case KEY_F10: tprintf("KEY_F10"); break;
452  case KEY_F11: tprintf("KEY_F11"); break;
453  case KEY_F12: tprintf("KEY_F12"); break;
454  case KEY_KPSLASH: tprintf("KEY_KPSLASH"); break;
455  case KEY_KPASTERISC: tprintf("KEY_KPASTERISC"); break;
456  case KEY_KPHYPHEN: tprintf("KEY_KPHYPHEN"); break;
457  case KEY_KPPLUS: tprintf("KEY_KPPLUS"); break;
458  case KEY_BACKSPACES: tprintf("KEY_BACKSPACES"); break;
459  case KEY_SPACE: tprintf("KEY_SPACE"); break;
460  case KEY_LSHIFT: tprintf("KEY_LSHIFT"); break;
461  case KEY_KPPERIOD: tprintf("KEY_KPPERIOD"); break;
462  case KEY_LEFTCTRL: tprintf("KEY_LEFTCTRL"); break;
463 
464  case KEY_GB_UP: tprintf("KEY_GB_UP"); break;
465  case KEY_GB_DOWN: tprintf("KEY_GB_DOWN"); break;
466  case KEY_GB_LEFT: tprintf("KEY_GB_LEFT"); break;
467  case KEY_GB_RIGHT: tprintf("KEY_GB_RIGHT"); break;
468  case KEY_GB_ESC: tprintf("KEY_GB_ECS"); break;
469  case KEY_GB_ENTER: tprintf("KEY_GB_ENTER"); break;
470  case KEY_GB_VOLUP: tprintf("KEY_GB_VOLUP"); break;
471  case KEY_GB_VOLDOWN: tprintf("KEY_GB_VOLDOWN"); break;
472 
473  default:
474  tprintf("??? %d", key);
475  break;
476  }
477 }
478 
479 void display_event(struct st_sysevent *event)
480 {
481  tprintf("[%8d] ", (int)event->when);
482 
483  switch(event->what) {
484  case EVT_KEYDOWN:
485  tprintf("EVT_KEYDOWN %3d : ", event->arg);
486  disp_key(event->arg);
487  break;
488 
489  case EVT_KEYUP:
490  tprintf("EVT_KEYUP %3d : ", event->arg);
491  disp_key(event->arg);
492  break;
493 
494  case EVT_KEYDOWN_REPEAT:
495  tprintf("EVT_KEYDOWN_R %3d : ", event->arg);
496  disp_key(event->arg);
497  break;
498 
499  case EVT_TOUCHSTART:
500  tprintf("EVT_TOUCHSTART : X=%4d Y=%4d",
501  event->pos_x, event->pos_y);
502  break;
503 
504  case EVT_TOUCHMOVE:
505  tprintf("EVT_TOUCHMOVE : X=%4d Y=%4d",
506  event->pos_x, event->pos_y);
507  break;
508 
509  case EVT_TOUCHEND:
510  tprintf("EVT_TOUCHEND : X=%4d Y=%4d",
511  event->pos_x, event->pos_y);
512  break;
513 
514  case EVT_POWEROFF:
515  tprintf("EVT_POWEROFF %3d : ", event->arg);
516  break;
517 
518  default:
519  tprintf("Unknown Event(%d) %3d : ",
520  event->what, event->arg);
521  break;
522  }
523  tprintf("\n");
524 }
525 
526 static int dispevent(int argc, uchar *argv[])
527 {
528  struct st_sysevent event;
529  uchar rd;
530 
531  while(1) {
532  if(get_event(&event, 100) == 1) {
533  display_event(&event);
534 #if 0
535  if(event.arg == KEY_GB_ENTER) {
536  break;
537  }
538 #endif
539  }
540 
541  if(cgetcnw(&rd)) {
542  if(rd == 0x0d) {
543  break;
544  }
545  }
546  }
547 
548  return 0;
549 }
550 
551 /**
552  @brief 発生したイベントを表示する
553 
554  他のタスクで get_event() でイベントを取得していた場合、イベントが表示されない場合がある。
555 */
556 static const struct st_shell_command com_sys_event = {
557  .name = "event",
558  .command = dispevent,
559  .manual_str = "Print sysevent"
560 };
561 
562 static int setevent(int argc, uchar *argv[])
563 {
564  struct st_sysevent event;
565  uchar rd;
566 
567  tprintf("push any key(k:UP, j:DOWN, h:LEFT, l:RIGHT, [SPC]:SPACE, [ENT]:ENTER, [ESC]:exit\n");
568 
569  while(1) {
570  task_sleep(1);
571  if(cgetcnw(&rd)) {
572  switch(rd) {
573  case 0x1b:
574  tprintf("exit\n");
575  goto end;
576 
577  case 'k':
578  event.arg = KEY_GB_UP;
579  event.what = EVT_KEYDOWN;
580  set_event(&event);
581  event.what = EVT_KEYUP;
582  set_event(&event);
583  break;
584 
585  case 'j':
586  event.arg = KEY_GB_DOWN;
587  event.what = EVT_KEYDOWN;
588  set_event(&event);
589  event.what = EVT_KEYUP;
590  set_event(&event);
591  break;
592 
593  case 'h':
594  event.arg = KEY_GB_LEFT;
595  event.what = EVT_KEYDOWN;
596  set_event(&event);
597  event.what = EVT_KEYUP;
598  set_event(&event);
599  break;
600 
601  case 'l':
602  event.arg = KEY_GB_RIGHT;
603  event.what = EVT_KEYDOWN;
604  set_event(&event);
605  event.what = EVT_KEYUP;
606  set_event(&event);
607  break;
608 
609  case 0x0d:
610  case 'n':
611  event.arg = KEY_GB_ENTER;
612  event.what = EVT_KEYDOWN;
613  set_event(&event);
614  event.what = EVT_KEYUP;
615  set_event(&event);
616  break;
617 
618  case ' ':
619  case 'm':
620  event.arg = KEY_GB_SPACE;
621  event.what = EVT_KEYDOWN;
622  set_event(&event);
623  event.what = EVT_KEYUP;
624  set_event(&event);
625  break;
626 
627  default:
628  break;
629  }
630  }
631  }
632 
633 end:
634  return 0;
635 }
636 
637 /**
638  @brief イベントを発生する
639 
640  キー入力によりイベントを発生する。\n
641  入力キーと発生できるイベントは以下となる。
642 
643  k : EVT_KEYDOWN KEY_GB_UP, EVT_KEYUP KEY_GB_UP
644 
645  j : EVT_KEYDOWN KEY_GB_DOWN, EVT_KEYUP KEY_GB_DOWN
646 
647  h : EVT_KEYDOWN KEY_GB_LEFT, EVT_KEYUP KEY_GB_LEFT
648 
649  l : EVT_KEYDOWN KEY_GB_RIGHT, EVT_KEYUP KEY_GB_RIGHT
650 
651  SPACE : EVT_KEYDOWN KEY_GB_SPACE, EVT_KEYUP KEY_GB_SPACE
652 
653  ENTER : EVT_KEYDOWN KEY_GB_ENTER, EVT_KEYUP KEY_GB_ENTER
654 
655  ESC : EVT_KEYDOWN KEY_GB_ESC, EVT_KEYUP KEY_GB_ESC
656 */
657 static const struct st_shell_command com_sys_setevent = {
658  .name = "setevent",
659  .command = setevent,
660  .manual_str = "Set sysevent from key input"
661 };
662 
663 static int cmd_sleep(int argc, uchar *argv[])
664 {
665  unsigned int t;
666 
667  if(argc < 2) {
668  return 0;
669  }
670 
671  t = dstou(argv[1]);
672 
673  //wait_time(t);
674  task_sleep(t);
675 
676  return 0;
677 }
678 
679 /**
680  @brief task_sleep() でshellタスクを指定時間スリープする
681 
682  スリープ時間はミリ秒で指定する。
683 */
684 static const struct st_shell_command com_sys_sleep = {
685  .name = "sleep",
686  .command = cmd_sleep,
687  .usage_str = "<sleep_time(ms)>",
688  .manual_str = "Sleep shell task"
689 };
690 
691 extern struct st_tcb *run_task;
692 
693 static int console(int argc, uchar *argv[])
694 {
695  tprintf("in : ");
696  if(run_task->stdin_dev == 0) {
697  tprintf("-\n");
698  } else {
699  tprintf("%s\n", run_task->stdin_dev->name);
700  }
701 
702  tprintf("out : ");
703  if(run_task->stdout_dev == 0) {
704  tprintf("-\n");
705  } else {
706  tprintf("%s\n", run_task->stdout_dev->name);
707  }
708 
709  tprintf("err : ");
710  if(run_task->error_dev == 0) {
711  tprintf("-\n");
712  } else {
713  tprintf("%s\n", run_task->error_dev->name);
714  }
715 
716  return 0;
717 }
718 
719 static int console_set(int argc, uchar *argv[])
720 {
721  struct st_device *dev;
722 
723  if(argc > 1) {
724  dev = open_device((char *)argv[1]);
725  if(dev == 0) {
726  tprintf("Cannot open device \"%s\".\n", argv[1]);
727  } else {
728  if(strcomp(argv[0], (uchar *)"in") == 0) {
730  } else if(strcomp(argv[0], (uchar *)"out") == 0) {
732  } else if(strcomp(argv[0], (uchar *)"err") == 0) {
734  } else {
735  tprintf("Cannot set device %s\n", argv[0]);
736  }
737  }
738  } else {
739  if(strcomp(argv[0], (uchar *)"in") == 0) {
740  dev = run_task->stdin_dev;
741  } else if(strcomp(argv[0], (uchar *)"out") == 0) {
742  dev = run_task->stdout_dev;
743  } else if(strcomp(argv[0], (uchar *)"err") == 0) {
744  dev = run_task->error_dev;
745  } else {
746  tprintf("Cannot set device %s\n", argv[0]);
747  return 0;
748  }
749  tprintf("%3s : ", argv[0]);
750  if(dev == 0) {
751  tprintf("-\n");
752  } else {
753  tprintf("%s\n", dev->name);
754  }
755  }
756 
757  return 0;
758 }
759 
760 static const struct st_shell_command com_sys_console_in = {
761  .name = "in",
762  .command = console_set,
763  .usage_str = "[device_name]",
764  .manual_str = "Set console in device"
765 };
766 
767 static const struct st_shell_command com_sys_console_out = {
768  .name = "out",
769  .command = console_set,
770  .usage_str = "[device_name]",
771  .manual_str = "Set console out device"
772 };
773 
774 static const struct st_shell_command com_sys_console_err = {
775  .name = "err",
776  .command = console_set,
777  .usage_str = "[device_name]",
778  .manual_str = "Set console error device"
779 };
780 
781 static const struct st_shell_command * const com_sys_console_sub[] = {
782  &com_sys_console_in,
783  &com_sys_console_out,
784  &com_sys_console_err,
785  0
786 };
787 
788 /**
789  @brief shellタスクのコンソールデバイスを表示、設定する
790 */
791 static const struct st_shell_command com_sys_console = {
792  .name = "console",
793  .command = console,
794  .usage_str = "[in|out|err] [device_name]",
795  .manual_str = "Set console device",
796  .sublist = com_sys_console_sub
797 };
798 
799 #ifndef GSC_TARGET_SYSTEM_EMU
800 static int sysmem(int argc, uchar *argv[])
801 {
802  extern long *BSS_START;
803  extern long *BSS_END;
804  extern long *DATAROM_START;
805  extern long *DATARAM_START;
806  extern long *DATARAM_END;
807 
808  tprintf("DATAROM_START : %08lX\n", (unsigned long)DATAROM_START);
809  tprintf("DATARAM_START : %08lX\n", (unsigned long)DATARAM_START);
810  tprintf("DATARAM_END : %08lX\n", (unsigned long)DATARAM_END);
811  tprintf("BSS_START : %08lX\n", (unsigned long)BSS_START);
812  tprintf("BSS_END : %08lX\n", (unsigned long)BSS_END);
813 
814  return 0;
815 }
816 
817 /**
818  @brief システムメモリ状態を表示する
819 */
820 static const struct st_shell_command com_sys_sysmem = {
821  .name = "sysmem",
822  .command = sysmem,
823  .manual_str = "Print system memory status"
824 };
825 #endif // GSC_TARGET_SYSTEM_EMU
826 
827 #ifdef GSC_MEMORY_ENABLE_HEAP_MEMORY
828 static int disp_heap(int argc, uchar *argv[])
829 {
830  int sk = 0;
831  unsigned long total = heap_total_size();
832  unsigned long free = heap_free_size();
833  unsigned long use = total - free;
834 
835  if(argc > 1) {
836  switch(argv[1][0]) {
837  case 'k':
838  case 'K':
839  sk = 1;
840  break;
841 
842  case 'm':
843  case 'M':
844  sk = 2;
845  break;
846  }
847  }
848 
849  switch(sk) {
850  case 2:
851  tprintf("Total : %4ld M byte\n", total/1024/1024);
852  tprintf("Use : %4ld M byte\n", use/1024/1024);
853  tprintf("Free : %4ld M byte\n", free/1024/1024);
854  break;
855 
856  case 1:
857  tprintf("Total : %7ld K byte\n", total/1024);
858  tprintf("Use : %7ld K byte\n", use/1024);
859  tprintf("Free : %7ld K byte\n", free/1024);
860  break;
861 
862  case 0:
863  default:
864  tprintf("Total : %10ld byte\n", total);
865  tprintf("Use : %10ld byte\n", use);
866  tprintf("Free : %10ld byte\n", free);
867  break;
868  }
869 
870  return 0;
871 }
872 
873 /**
874  @brief ヒープメモリの状態を表示する
875 */
876 static const struct st_shell_command com_sys_heap = {
877  .name = "heap",
878  .command = disp_heap,
879  .usage_str = "[k|m]",
880  .manual_str = "Print heap memory status"
881 };
882 
883 #if 0
884 static int mem_alloc(int argc, uchar *argv[]);
885 
886 static const struct st_shell_command com_mem_alloc = {
887  .name = "memalloc",
888  .command = mem_alloc,
889  .usage_str = "<size>",
890  .manual_str = "Memory alloc"
891 };
892 
893 static int mem_alloc(int argc, uchar *argv[])
894 {
895  unsigned char *p;
896  unsigned int size;
897 
898  if(argc < 2) {
899  print_command_usage(&com_mem_alloc);
900  return 0;
901  }
902 
903  size = dstou(argv[1]);
904  p = alloc_memory(size);
905  tprintf("Memory Size = %d\n", size);
906  tprintf("Memory pointer = 0x%p\n", p);
907 
908  return 0;
909 }
910 
911 
912 static int mem_free(int argc, uchar *argv[]);
913 
914 static const struct st_shell_command com_mem_free = {
915  .name = "memfree",
916  .command = mem_free,
917  .usage_str = "<address>",
918  .manual_str = "Free memory"
919 };
920 
921 static int mem_free(int argc, uchar *argv[])
922 {
923  unsigned char *p;
924 
925  if(argc < 2) {
926  print_command_usage(&com_mem_free);
927  return 0;
928  }
929 
930  p = (unsigned char *)(long)hstoi(argv[1]);
931  free_memory(p);
932  tprintf("Free pointer = 0x%08lX\n", (unsigned long)p);
933 
934  return 0;
935 }
936 #endif
937 
938 #endif // GSC_MEMORY_ENABLE_HEAP_MEMORY
939 
940 static int reboot(int argc, uchar *argv[])
941 {
942  reset_system();
943 
944  return 0;
945 }
946 
947 /**
948  @brief システムを再起動する
949 */
950 static const struct st_shell_command com_sys_reboot = {
951  .name = "reboot",
952  .command = reboot,
953  .manual_str = "Reboot system"
954 };
955 
956 #ifdef GSC_LIB_ENABLE_RANDOM
957 #include "random.h"
958 
959 static int random(int argc, uchar *argv[])
960 {
961  unsigned int r = (unsigned int)genrand_int32();
962 
963  tprintf("%u\n", r);
964 
965  return 0;
966 }
967 
968 /**
969  @brief 乱数を発生する
970 
971  この機能を使用するにはマクロ GSC_LIB_ENABLE_RANDOM を定義する必要があります。
972 */
973 static const struct st_shell_command com_sys_random = {
974  .name = "random",
975  .command = random,
976  .manual_str = "Generate random value"
977 };
978 #endif
979 
980 #ifndef GSC_TARGET_SYSTEM_EMU
981 #ifdef GSC_KERNEL_ENABLE_INTERRUPT_COUNT
982 #include "interrupt.h"
983 
984 static int interrupt(int argc, uchar *argv[])
985 {
986  int i;
987  int count = 0;
988 
989  for(i=0; i<MAXVECT; i++) {
990  count = get_interrupt_count(i);
991  if(count != -1) {
992  tprintf("%-3d : %d\n", i, count);
993  }
994  }
995 
996  return 0;
997 }
998 
999 /**
1000  @brief 割り込みハンドラが登録されている割り込みの、割込発生回数を表示する
1001 
1002  この機能を使用するにはマクロ GSC_KERNEL_ENABLE_INTERRUPT_COUNT を定義する必要があります。
1003 */
1004 static const struct st_shell_command com_sys_interrupt = {
1005  .name = "interrupt",
1006  .command = interrupt,
1007  .manual_str = "Print interrupt count"
1008 };
1009 #endif
1010 #endif
1011 
1012 /*
1013  ヘルプメッセージ表示
1014 */
1015 extern const struct st_shell_command *com_list[];
1016 
1017 static void print_command_manual(const struct st_shell_command *cp, int indent)
1018 {
1019  while(indent) {
1020  tprintf(" ");
1021  indent --;
1022  }
1023  tprintf("%12s : ", cp->name);
1024  if(cp->manual_str != 0) {
1025  tprintf("%s\n", cp->manual_str);
1026  } else {
1027  tprintf("\n");
1028  }
1029 }
1030 
1031 static void print_command_list(const struct st_shell_command **cl, int indent)
1032 {
1033  const struct st_shell_command **cp = cl;
1034 
1035  while((*cp) != 0) {
1036  if((*cp)->name[0] != 0) {
1037  DTPRINTF(0x02, "Disp %s\n",(*cp)->name);
1038  print_command_manual(*cp, indent);
1039  }
1040  cp ++;
1041  }
1042 }
1043 
1044 static void print_command_list_manual(const struct st_shell_command **cl, int indent)
1045 {
1046  const struct st_shell_command **cp = cl;
1047 
1048  if((*cp)->name[0] != 0) {
1049  DTPRINTF(0x02, "Disp %s\n",(*cp)->name);
1050  print_command_manual(*cp, indent);
1051  }
1052 
1053  if((*cp)->sublist != 0) {
1054  indent ++;
1055  cp = (const struct st_shell_command **)(*cp)->sublist;
1056  print_command_list(cp, indent);
1057  }
1058 }
1059 
1060 static int help(int argc, uchar *argv[])
1061 {
1062  const struct st_shell_command **cp = com_list;
1063  int arg = 1;
1064  int i;
1065 
1066  if(argc == 1) {
1067  DTPRINTF(0x01, "help only\n");
1068  print_command_list(cp, 0);
1069  return 0;
1070  } else {
1071  while((*cp) != 0) {
1072  DTPRINTF(0x01, "? %s == %s\n", argv[arg], (*cp)->name);
1073  if(strcomp((unsigned char *)(*cp)->name, (unsigned char *)argv[arg]) == 0) {
1074  tprintf(" -> %s", (*cp)->name);
1075  if((*cp)->sublist == 0) {
1076  tprintf("\n");
1077  print_command_manual(*cp, arg);
1078  if((*cp)->usage_str != 0) {
1079  print_command_usage(*cp);
1080  }
1081  return 0;
1082  } else {
1083  if(arg < (argc - 1)) {
1084  arg ++;
1085  DTPRINTF(0x01, "Next arg %s\n", argv[arg]);
1086  cp = (const struct st_shell_command **)(*cp)->sublist;
1087  } else {
1088  tprintf("\n");
1089  print_command_list_manual(cp, arg);
1090  return 0;
1091  }
1092  }
1093  } else {
1094  cp ++;
1095  }
1096  }
1097 
1098  for(i=1; i<argc; i++) {
1099  tprintf(" %s", argv[i]);
1100  }
1101  tprintf(" : command not found\n");
1102  }
1103 
1104  return 0;
1105 }
1106 
1107 const struct st_shell_command com_help = {
1108  .name = "help",
1109  .command = help,
1110  .usage_str = "[command]",
1111  .manual_str = "Print command help message"
1112 }; ///< ヘルプメッセージ表示
1113 
1114 /**
1115  @section help_command ヘルプコマンド
1116 
1117  ヘルプメッセージを表示します。
1118 
1119  [実行例]
1120 
1121  : help\n
1122  help : Print command help message\n
1123  sys : System operation commands\n
1124  mem : Memory operation commands\n
1125  dev : Device operation commands\n
1126  task : Task operation commands\n
1127  graph : Graphics operation commands\n
1128  file : File strage operation commands
1129 */
1130 
1131 static const struct st_shell_command * const com_sys_list[] = {
1132  &com_sys_info,
1135  &com_sys_systime,
1137  &com_sys_setdate,
1138 #ifdef GSC_DEV_ENABLE_RTC
1139  &com_sys_rtcdate,
1140  &com_sys_datesync,
1141  &com_sys_rtcsync,
1142 #endif
1143  &com_sys_event,
1145  &com_sys_sleep,
1146  &com_sys_console,
1147 #ifndef GSC_TARGET_SYSTEM_EMU
1148  &com_sys_sysmem,
1149 #endif
1150 #ifdef GSC_MEMORY_ENABLE_HEAP_MEMORY
1151  &com_sys_heap,
1152 #if 0
1153  &com_mem_alloc,
1154  &com_mem_free,
1155 #endif
1156 #endif
1157  &com_sys_reboot,
1158 #ifdef GSC_LIB_ENABLE_RANDOM
1159  &com_sys_random,
1160 #endif
1161 #ifndef GSC_TARGET_SYSTEM_EMU
1162 #ifdef GSC_KERNEL_ENABLE_INTERRUPT_COUNT
1163  &com_sys_interrupt,
1164 #endif
1165 #endif
1166  0
1167 };
1168 
1169 const struct st_shell_command com_sys = {
1170  .name = "sys",
1171  .usage_str = "<command>",
1172  .manual_str = "System operation commands",
1173  .sublist = com_sys_list
1174 }; ///< システム状態取得、設定
unsigned char uchar
GadgetSeedの文字(列)は unsigned char 型となる
Definition: str.h:13
static const struct st_shell_command com_sys_systime
システムタイマ値を表示
Definition: com_system.c:172
時刻構造体
Definition: datetime.h:29
static const struct st_shell_command com_sys_sleep
task_sleep() でshellタスクを指定時間スリープする
Definition: com_system.c:684
シェルコマンド構造体
Definition: shell.h:33
#define EVT_KEYDOWN
キーを押した
Definition: sysevent.h:27
コマンドシェル
メモリ管理
short msec
ミリ秒
Definition: datetime.h:37
void task_sleep(unsigned int stime)
タスクを指定時間タイマ待ち状態にする
Definition: syscall_api.c:290
#define EVT_TOUCHEND
(画面に)タッチした状態から離した
Definition: sysevent.h:33
char hour
Definition: datetime.h:34
static const struct st_shell_command com_sys_info
システム情報を表示
Definition: com_system.c:84
void set_console_out_device(struct st_device *dev)
実行タスクの標準出力デバイスを設定する
Definition: syscall_api.c:596
void free_memory(void *ptr)
確保したメモリを開放する
Definition: memory.c:195
アプリケーション(タスク)デバッグ用マクロ
static const struct st_shell_command com_sys_sysmem
システムメモリ状態を表示する
Definition: com_system.c:820
static const struct st_shell_command com_sys_reboot
システムを再起動する
Definition: com_system.c:950
システム時間
Definition: datetime.h:40
#define EVT_POWEROFF
電源Off
Definition: sysevent.h:35
int usec
マイクロ秒(0〜999999)
Definition: datetime.h:42
unsigned long long when
イベントが発生したカーネル時間
Definition: sysevent.h:17
struct st_device * open_device(char *name)
デバイスをオープンする
Definition: device.c:262
ラインエディタ
char min
Definition: datetime.h:35
int cgetcnw(unsigned char *rd)
標準入力より1文字を取得する(待ち無し)
Definition: console.c:235
char date_to_dayofweek(short year, char month, char day)
西暦年、月、日より曜日を求める
Definition: datetime.c:594
文字列処理
unsigned short arg
イベント引数
Definition: sysevent.h:14
void datemtime_to_str(char *str, struct st_datetime *datetime)
時間を日付ミリ秒時間文字列に変換する
Definition: datetime.c:444
int set_event(struct st_sysevent *event)
システムイベントを登録する
Definition: sysevent.c:128
unsigned int dstou(uchar *str)
10進数文字列 unsigned int 変換
Definition: str.c:558
char month
Definition: datetime.h:31
unsigned long long get_system_utime(void)
システム時間を取得する
Definition: timer.c:202
カーネルタイマ
char sec
Definition: datetime.h:36
日付時刻
#define EVT_KEYUP
キーを離した
Definition: sysevent.h:28
struct st_device * stdin_dev
タスク標準入力デバイス
Definition: tcb.h:52
#define GSC_TIMEZONE_STR
$gsc タイムゾーンを示す文字列
Definition: datetime.h:15
t_time sec
Definition: datetime.h:41
struct st_device * stdout_dev
タスク標準出力デバイス
Definition: tcb.h:53
unsigned short what
イベント種類
Definition: sysevent.h:13
static const struct st_shell_command com_sys_datetime
日付時刻を表示
Definition: com_system.c:206
void get_systime(struct st_systime *systime)
システム時間を取得する
Definition: datetime.c:802
int strcomp(const uchar *s1, const uchar *s2)
文字列比較
Definition: str.c:583
int dstoi(uchar *str)
10進数文字列 int 変換
Definition: str.c:523
システムイベント
void * alloc_memory(unsigned int size)
メモリを確保する
Definition: memory.c:138
uchar name[12]
コマンド名文字列
Definition: shell.h:34
unsigned long heap_total_size(void)
全てのメモリのバイト数を取得する
Definition: memory.c:276
char day
Definition: datetime.h:32
void unixtime_to_datetime(struct st_datetime *datetime, struct st_systime *unixtime)
UNIX時間より時刻を求める
Definition: datetime.c:658
void set_error_out_device(struct st_device *dev)
実行タスクのエラー出力デバイスを設定する
Definition: syscall_api.c:610
static const struct st_shell_command com_sys_kerneltime
カーネルタイマ値を表示
Definition: com_system.c:149
static const struct st_shell_command com_sys_console
shellタスクのコンソールデバイスを表示、設定する
Definition: com_system.c:791
void systime_to_datetime(struct st_datetime *datetime, struct st_systime *stime)
システム時間よりローカル時刻を求める
Definition: datetime.c:684
unsigned short pos_x
イベント発生X座標
Definition: sysevent.h:15
GadgetSeed カーネル
#define EVT_KEYDOWN_REPEAT
キーを押した(リピート)
Definition: sysevent.h:29
int tprintf(const char *fmt,...)
簡易printf
Definition: tprintf.c:85
システムコール
割り込みハンドラ
#define EVT_TOUCHSTART
(画面に)タッチした
Definition: sysevent.h:31
unsigned long heap_free_size(void)
未確保のメモリの合計バイト数を取得する
Definition: memory.c:255
static const struct st_shell_command com_sys_event
発生したイベントを表示する
Definition: com_system.c:556
#define EVT_TOUCHMOVE
(画面に)タッチしたまま動かした
Definition: sysevent.h:32
static const struct st_shell_command com_sys_setevent
イベントを発生する
Definition: com_system.c:657
int get_event(struct st_sysevent *event, unsigned int timeout)
システムイベントを待つ
Definition: sysevent.c:195
char dayofweek
曜日 0:日曜日〜6:土曜日
Definition: datetime.h:33
void set_systime(struct st_systime *systime)
UTC時刻からシステム時間を設定する
Definition: datetime.c:747
システムイベント
Definition: sysevent.h:12
t_time datetime_to_utc(struct st_datetime *datetime)
ローカル西暦年月日、時間よりUTCを求める
Definition: datetime.c:704
const struct st_shell_command *const * sublist
サブコマンド配列
Definition: shell.h:40
struct st_device * error_dev
タスクエラー出力デバイス
Definition: tcb.h:54
システム固有初期化関連
コンソールI/O
int hstoi(uchar *str)
16進数文字列 int 変換
Definition: str.c:145
unsigned long long get_kernel_time(void)
カーネル時間を取得する
Definition: timer.c:192
unsigned short pos_y
イベント発生Y座標
Definition: sysevent.h:16
デバイスドライバ構造体
Definition: device.h:25
疑似乱数発生
static const struct st_shell_command com_sys_heap
ヒープメモリの状態を表示する
Definition: com_system.c:876
static const struct st_shell_command com_sys_timercheck
カーネルタイマとシステムタイマの差分を表示し続ける
Definition: com_system.c:123
void set_console_in_device(struct st_device *dev)
実行タスクの標準入力デバイスを設定する
Definition: syscall_api.c:582
int cwait(unsigned int timeout)
標準入力より入力を待つ
Definition: console.c:219
DADG109Aキーコード定義
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26
void datetime_to_systime(struct st_systime *systime, struct st_datetime *time)
ローカル西暦年月日、時間よりシステム時間を求める
Definition: datetime.c:736
タスクコンテキスト
Definition: tcb.h:32
static const struct st_shell_command com_sys_setdate
日付時刻を設定
Definition: com_system.c:220
機能限定printf
short year
Definition: datetime.h:30
char * manual_str
マニュアル文字列
Definition: shell.h:39