Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:de4e2fb3c765, 2018-04-02 (annotated)
- Committer:
- nguyentrongthan
- Date:
- Mon Apr 02 10:20:06 2018 +0000
- Revision:
- 0:de4e2fb3c765
next commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| nguyentrongthan | 0:de4e2fb3c765 | 1 | #include "mbed.h" |
| nguyentrongthan | 0:de4e2fb3c765 | 2 | #include "cmd_line.h" |
| nguyentrongthan | 0:de4e2fb3c765 | 3 | #include <vector> |
| nguyentrongthan | 0:de4e2fb3c765 | 4 | #include <string> |
| nguyentrongthan | 0:de4e2fb3c765 | 5 | |
| nguyentrongthan | 0:de4e2fb3c765 | 6 | #define SHELL_BUFFER_LENGHT 64 |
| nguyentrongthan | 0:de4e2fb3c765 | 7 | |
| nguyentrongthan | 0:de4e2fb3c765 | 8 | static int32_t shell_reset(uint8_t* argv); |
| nguyentrongthan | 0:de4e2fb3c765 | 9 | static int32_t shell_help(uint8_t* argv); |
| nguyentrongthan | 0:de4e2fb3c765 | 10 | |
| nguyentrongthan | 0:de4e2fb3c765 | 11 | cmd_line_t lgn_cmd_table[] = { |
| nguyentrongthan | 0:de4e2fb3c765 | 12 | |
| nguyentrongthan | 0:de4e2fb3c765 | 13 | /*************************************************************************/ |
| nguyentrongthan | 0:de4e2fb3c765 | 14 | /* system command */ |
| nguyentrongthan | 0:de4e2fb3c765 | 15 | /*************************************************************************/ |
| nguyentrongthan | 0:de4e2fb3c765 | 16 | {(const int8_t*)"help", shell_help, (const int8_t*)"help info"}, |
| nguyentrongthan | 0:de4e2fb3c765 | 17 | {(const int8_t*)"reset", shell_reset, (const int8_t*)"reset terminal"}, |
| nguyentrongthan | 0:de4e2fb3c765 | 18 | |
| nguyentrongthan | 0:de4e2fb3c765 | 19 | |
| nguyentrongthan | 0:de4e2fb3c765 | 20 | /* End Of Table */ |
| nguyentrongthan | 0:de4e2fb3c765 | 21 | {(const int8_t*)0,(pf_cmd_func)0,(const int8_t*)0} |
| nguyentrongthan | 0:de4e2fb3c765 | 22 | }; |
| nguyentrongthan | 0:de4e2fb3c765 | 23 | |
| nguyentrongthan | 0:de4e2fb3c765 | 24 | Serial console(D1, D0, 115200); |
| nguyentrongthan | 0:de4e2fb3c765 | 25 | |
| nguyentrongthan | 0:de4e2fb3c765 | 26 | vector<string> command_vector; |
| nguyentrongthan | 0:de4e2fb3c765 | 27 | |
| nguyentrongthan | 0:de4e2fb3c765 | 28 | struct shell_t { |
| nguyentrongthan | 0:de4e2fb3c765 | 29 | uint8_t index; |
| nguyentrongthan | 0:de4e2fb3c765 | 30 | uint8_t data[SHELL_BUFFER_LENGHT]; |
| nguyentrongthan | 0:de4e2fb3c765 | 31 | }; |
| nguyentrongthan | 0:de4e2fb3c765 | 32 | |
| nguyentrongthan | 0:de4e2fb3c765 | 33 | volatile struct shell_t shell; |
| nguyentrongthan | 0:de4e2fb3c765 | 34 | |
| nguyentrongthan | 0:de4e2fb3c765 | 35 | void console_rx_callback() |
| nguyentrongthan | 0:de4e2fb3c765 | 36 | { |
| nguyentrongthan | 0:de4e2fb3c765 | 37 | volatile uint8_t c = console.getc(); |
| nguyentrongthan | 0:de4e2fb3c765 | 38 | if (shell.index < SHELL_BUFFER_LENGHT - 1) { |
| nguyentrongthan | 0:de4e2fb3c765 | 39 | |
| nguyentrongthan | 0:de4e2fb3c765 | 40 | if (c == '\r' || c == '\n') { /* linefeed */ |
| nguyentrongthan | 0:de4e2fb3c765 | 41 | |
| nguyentrongthan | 0:de4e2fb3c765 | 42 | console.putc('\r'); |
| nguyentrongthan | 0:de4e2fb3c765 | 43 | console.putc('\n'); |
| nguyentrongthan | 0:de4e2fb3c765 | 44 | |
| nguyentrongthan | 0:de4e2fb3c765 | 45 | shell.data[shell.index] = c; |
| nguyentrongthan | 0:de4e2fb3c765 | 46 | shell.data[shell.index + 1] = 0; |
| nguyentrongthan | 0:de4e2fb3c765 | 47 | |
| nguyentrongthan | 0:de4e2fb3c765 | 48 | string str_cmd = (const char*)shell.data; |
| nguyentrongthan | 0:de4e2fb3c765 | 49 | |
| nguyentrongthan | 0:de4e2fb3c765 | 50 | command_vector.push_back(str_cmd); |
| nguyentrongthan | 0:de4e2fb3c765 | 51 | |
| nguyentrongthan | 0:de4e2fb3c765 | 52 | shell.index = 0; |
| nguyentrongthan | 0:de4e2fb3c765 | 53 | } else { |
| nguyentrongthan | 0:de4e2fb3c765 | 54 | |
| nguyentrongthan | 0:de4e2fb3c765 | 55 | console.putc(c); |
| nguyentrongthan | 0:de4e2fb3c765 | 56 | |
| nguyentrongthan | 0:de4e2fb3c765 | 57 | if (c == 8 && shell.index) { /* backspace */ |
| nguyentrongthan | 0:de4e2fb3c765 | 58 | shell.index--; |
| nguyentrongthan | 0:de4e2fb3c765 | 59 | } else { |
| nguyentrongthan | 0:de4e2fb3c765 | 60 | shell.data[shell.index++] = c; |
| nguyentrongthan | 0:de4e2fb3c765 | 61 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 62 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 63 | } else { |
| nguyentrongthan | 0:de4e2fb3c765 | 64 | console.printf("\nerror: cmd too long, cmd size: %d, try again !\r\n", SHELL_BUFFER_LENGHT); |
| nguyentrongthan | 0:de4e2fb3c765 | 65 | shell.index = 0; |
| nguyentrongthan | 0:de4e2fb3c765 | 66 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 67 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 68 | |
| nguyentrongthan | 0:de4e2fb3c765 | 69 | static void task_shell(); |
| nguyentrongthan | 0:de4e2fb3c765 | 70 | |
| nguyentrongthan | 0:de4e2fb3c765 | 71 | int main() |
| nguyentrongthan | 0:de4e2fb3c765 | 72 | { |
| nguyentrongthan | 0:de4e2fb3c765 | 73 | console.printf("Started Application !\r\n"); |
| nguyentrongthan | 0:de4e2fb3c765 | 74 | console.attach(console_rx_callback, Serial::RxIrq); |
| nguyentrongthan | 0:de4e2fb3c765 | 75 | while (1) { |
| nguyentrongthan | 0:de4e2fb3c765 | 76 | task_shell(); |
| nguyentrongthan | 0:de4e2fb3c765 | 77 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 78 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 79 | |
| nguyentrongthan | 0:de4e2fb3c765 | 80 | void task_shell() |
| nguyentrongthan | 0:de4e2fb3c765 | 81 | { |
| nguyentrongthan | 0:de4e2fb3c765 | 82 | if (!command_vector.empty()) { |
| nguyentrongthan | 0:de4e2fb3c765 | 83 | string console_command = command_vector.back(); |
| nguyentrongthan | 0:de4e2fb3c765 | 84 | uint8_t* c_str = (uint8_t*)console_command.c_str(); |
| nguyentrongthan | 0:de4e2fb3c765 | 85 | uint8_t fist_char = c_str[0]; |
| nguyentrongthan | 0:de4e2fb3c765 | 86 | |
| nguyentrongthan | 0:de4e2fb3c765 | 87 | switch (cmd_line_parser(lgn_cmd_table, (uint8_t*)&shell.data[0])) { |
| nguyentrongthan | 0:de4e2fb3c765 | 88 | case CMD_SUCCESS: |
| nguyentrongthan | 0:de4e2fb3c765 | 89 | break; |
| nguyentrongthan | 0:de4e2fb3c765 | 90 | |
| nguyentrongthan | 0:de4e2fb3c765 | 91 | case CMD_NOT_FOUND: { |
| nguyentrongthan | 0:de4e2fb3c765 | 92 | if (fist_char != '\r' && |
| nguyentrongthan | 0:de4e2fb3c765 | 93 | fist_char != '\n') { |
| nguyentrongthan | 0:de4e2fb3c765 | 94 | console.printf("cmd unknown\r\n"); |
| nguyentrongthan | 0:de4e2fb3c765 | 95 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 96 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 97 | break; |
| nguyentrongthan | 0:de4e2fb3c765 | 98 | |
| nguyentrongthan | 0:de4e2fb3c765 | 99 | case CMD_TOO_LONG: { |
| nguyentrongthan | 0:de4e2fb3c765 | 100 | console.printf("cmd too long\r\n"); |
| nguyentrongthan | 0:de4e2fb3c765 | 101 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 102 | break; |
| nguyentrongthan | 0:de4e2fb3c765 | 103 | |
| nguyentrongthan | 0:de4e2fb3c765 | 104 | case CMD_TBL_NOT_FOUND: { |
| nguyentrongthan | 0:de4e2fb3c765 | 105 | console.printf("cmd table not found\r\n"); |
| nguyentrongthan | 0:de4e2fb3c765 | 106 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 107 | break; |
| nguyentrongthan | 0:de4e2fb3c765 | 108 | |
| nguyentrongthan | 0:de4e2fb3c765 | 109 | default: { |
| nguyentrongthan | 0:de4e2fb3c765 | 110 | console.printf("cmd error\r\n"); |
| nguyentrongthan | 0:de4e2fb3c765 | 111 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 112 | break; |
| nguyentrongthan | 0:de4e2fb3c765 | 113 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 114 | |
| nguyentrongthan | 0:de4e2fb3c765 | 115 | console.printf("#"); |
| nguyentrongthan | 0:de4e2fb3c765 | 116 | |
| nguyentrongthan | 0:de4e2fb3c765 | 117 | command_vector.pop_back(); |
| nguyentrongthan | 0:de4e2fb3c765 | 118 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 119 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 120 | |
| nguyentrongthan | 0:de4e2fb3c765 | 121 | int32_t shell_reset(uint8_t* argv) |
| nguyentrongthan | 0:de4e2fb3c765 | 122 | { |
| nguyentrongthan | 0:de4e2fb3c765 | 123 | console.printf("shell_reset: %s\r\n", argv); |
| nguyentrongthan | 0:de4e2fb3c765 | 124 | return 0; |
| nguyentrongthan | 0:de4e2fb3c765 | 125 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 126 | |
| nguyentrongthan | 0:de4e2fb3c765 | 127 | |
| nguyentrongthan | 0:de4e2fb3c765 | 128 | int32_t shell_help(uint8_t* argv) |
| nguyentrongthan | 0:de4e2fb3c765 | 129 | { |
| nguyentrongthan | 0:de4e2fb3c765 | 130 | uint32_t idx = 0; |
| nguyentrongthan | 0:de4e2fb3c765 | 131 | switch (*(argv + 4)) { |
| nguyentrongthan | 0:de4e2fb3c765 | 132 | default: |
| nguyentrongthan | 0:de4e2fb3c765 | 133 | console.printf("\nCOMMANDS INFORMATION:\r\n\n"); |
| nguyentrongthan | 0:de4e2fb3c765 | 134 | while(lgn_cmd_table[idx].cmd != (const int8_t*)0) { |
| nguyentrongthan | 0:de4e2fb3c765 | 135 | console.printf("%s\n\t%s\r\n\n", lgn_cmd_table[idx].cmd, lgn_cmd_table[idx].info); |
| nguyentrongthan | 0:de4e2fb3c765 | 136 | idx++; |
| nguyentrongthan | 0:de4e2fb3c765 | 137 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 138 | break; |
| nguyentrongthan | 0:de4e2fb3c765 | 139 | } |
| nguyentrongthan | 0:de4e2fb3c765 | 140 | return 0; |
| nguyentrongthan | 0:de4e2fb3c765 | 141 | } |