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.
Console.cpp@4:8e1c0e634ba6, 2018-03-17 (annotated)
- Committer:
- jcerasmus@gmail.com
- Date:
- Sat Mar 17 15:25:04 2018 +0200
- Revision:
- 4:8e1c0e634ba6
- Parent:
- 3:c97f4e7f2685
Time?
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JanusErasmus | 0:cda1bfa06c7c | 1 | /* |
JanusErasmus | 0:cda1bfa06c7c | 2 | * Console.cpp |
JanusErasmus | 0:cda1bfa06c7c | 3 | * |
JanusErasmus | 0:cda1bfa06c7c | 4 | * Created on: 17 Mar 2018 |
JanusErasmus | 0:cda1bfa06c7c | 5 | * Author: Janus |
JanusErasmus | 0:cda1bfa06c7c | 6 | */ |
JanusErasmus | 0:cda1bfa06c7c | 7 | #include <ctype.h> |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 8 | #include <time.h> |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 9 | #include <stdlib.h> |
JanusErasmus | 0:cda1bfa06c7c | 10 | |
jcerasmus@gmail.com | 1:ffc6a669f391 | 11 | #include "mbed_stats.h" |
jcerasmus@gmail.com | 1:ffc6a669f391 | 12 | |
JanusErasmus | 0:cda1bfa06c7c | 13 | #include "Console.h" |
JanusErasmus | 0:cda1bfa06c7c | 14 | |
JanusErasmus | 0:cda1bfa06c7c | 15 | void Console::help(int argc,char *argv[]) |
JanusErasmus | 0:cda1bfa06c7c | 16 | { |
JanusErasmus | 0:cda1bfa06c7c | 17 | printf(GREEN("TermCMD commands:\n")); |
JanusErasmus | 0:cda1bfa06c7c | 18 | |
JanusErasmus | 0:cda1bfa06c7c | 19 | int index = 0; |
JanusErasmus | 0:cda1bfa06c7c | 20 | cmd_list_t* cmdList = mCmdTable[index++]; |
JanusErasmus | 0:cda1bfa06c7c | 21 | while(cmdList) |
JanusErasmus | 0:cda1bfa06c7c | 22 | { |
JanusErasmus | 0:cda1bfa06c7c | 23 | cmd_list_t* t_ptr = 0; |
JanusErasmus | 0:cda1bfa06c7c | 24 | int k = 0; |
JanusErasmus | 0:cda1bfa06c7c | 25 | do |
JanusErasmus | 0:cda1bfa06c7c | 26 | { |
JanusErasmus | 0:cda1bfa06c7c | 27 | t_ptr = &cmdList[k++]; |
JanusErasmus | 0:cda1bfa06c7c | 28 | if(!t_ptr || !t_ptr->cmd) |
JanusErasmus | 0:cda1bfa06c7c | 29 | break; |
JanusErasmus | 0:cda1bfa06c7c | 30 | |
JanusErasmus | 0:cda1bfa06c7c | 31 | if(t_ptr->f) |
JanusErasmus | 0:cda1bfa06c7c | 32 | { |
JanusErasmus | 0:cda1bfa06c7c | 33 | char txt[16]; |
JanusErasmus | 0:cda1bfa06c7c | 34 | sprintf(txt,"%s %s", t_ptr->cmd, t_ptr->argDesc); |
JanusErasmus | 0:cda1bfa06c7c | 35 | printf(" %-10s - ",txt); |
JanusErasmus | 0:cda1bfa06c7c | 36 | printf("%s\n",t_ptr->desc); |
JanusErasmus | 0:cda1bfa06c7c | 37 | } |
JanusErasmus | 0:cda1bfa06c7c | 38 | else |
JanusErasmus | 0:cda1bfa06c7c | 39 | { |
JanusErasmus | 0:cda1bfa06c7c | 40 | //this is a caption |
JanusErasmus | 0:cda1bfa06c7c | 41 | printf(BLUE("%s\n"), t_ptr->cmd); |
JanusErasmus | 0:cda1bfa06c7c | 42 | } |
JanusErasmus | 0:cda1bfa06c7c | 43 | |
JanusErasmus | 0:cda1bfa06c7c | 44 | }while(t_ptr->cmd); |
JanusErasmus | 0:cda1bfa06c7c | 45 | |
JanusErasmus | 0:cda1bfa06c7c | 46 | cmdList = mCmdTable[index++]; |
JanusErasmus | 0:cda1bfa06c7c | 47 | } |
JanusErasmus | 0:cda1bfa06c7c | 48 | |
JanusErasmus | 0:cda1bfa06c7c | 49 | } |
JanusErasmus | 0:cda1bfa06c7c | 50 | |
jcerasmus@gmail.com | 1:ffc6a669f391 | 51 | void Console::dumpThreadInfo(int argc,char *argv[]) |
jcerasmus@gmail.com | 1:ffc6a669f391 | 52 | { |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 53 | printf("Thread Info:\n"); |
jcerasmus@gmail.com | 1:ffc6a669f391 | 54 | mbed_stats_stack_t stacks[10]; |
jcerasmus@gmail.com | 1:ffc6a669f391 | 55 | int cnt = mbed_stats_stack_get_each(stacks, 10); |
jcerasmus@gmail.com | 1:ffc6a669f391 | 56 | for(int k = 0; k < cnt; k++) |
jcerasmus@gmail.com | 1:ffc6a669f391 | 57 | { |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 58 | printf("%d - TH[%lu]: max: %lu, res: %lu\n", k, stacks[k].thread_id, stacks[k].max_size, stacks[k].reserved_size); |
jcerasmus@gmail.com | 1:ffc6a669f391 | 59 | } |
jcerasmus@gmail.com | 1:ffc6a669f391 | 60 | } |
jcerasmus@gmail.com | 1:ffc6a669f391 | 61 | |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 62 | void Console::date(int argc,char *argv[]) |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 63 | { |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 64 | time_t seconds = time(0); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 65 | |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 66 | if(argc > 5) |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 67 | { |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 68 | printf("Set time %s %s %s %s:%s\n", argv[1], argv[2], argv[3], argv[4], argv[5]); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 69 | |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 70 | struct tm t; |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 71 | // adjust for tm structure required values |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 72 | t.tm_year = atoi(argv[1]) - 1900; |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 73 | t.tm_mon = atoi(argv[2]) - 1; |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 74 | t.tm_mday = atoi(argv[3]); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 75 | t.tm_hour = atoi(argv[4]); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 76 | t.tm_min = atoi(argv[5]); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 77 | t.tm_sec = 0; |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 78 | set_time(mktime(&t)); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 79 | } |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 80 | |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 81 | seconds = time(0); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 82 | // printf("Seconds since January 1, 1970: %d\n", (int)seconds); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 83 | printf("Date: %s", ctime(&seconds)); |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 84 | |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 85 | } |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 86 | |
JanusErasmus | 0:cda1bfa06c7c | 87 | const Console::cmd_list_t shellCommands[] = |
JanusErasmus | 0:cda1bfa06c7c | 88 | { |
jcerasmus@gmail.com | 1:ffc6a669f391 | 89 | {"MBED OS" ,0,0,0}, |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 90 | {"h", "", "Show this help info", Console::help}, |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 91 | {"dt", "", "Dump Thread info", Console::dumpThreadInfo}, |
jcerasmus@gmail.com | 4:8e1c0e634ba6 | 92 | {"date", "<yyyy mm dd HH:MM>", "show / set current time", Console::date}, |
JanusErasmus | 0:cda1bfa06c7c | 93 | {0,0,0} |
JanusErasmus | 0:cda1bfa06c7c | 94 | }; |
JanusErasmus | 0:cda1bfa06c7c | 95 | |
JanusErasmus | 0:cda1bfa06c7c | 96 | |
JanusErasmus | 0:cda1bfa06c7c | 97 | Console *Console ::__instance = 0; |
JanusErasmus | 0:cda1bfa06c7c | 98 | |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 99 | void Console::init(Serial *serial, const char *prompt) |
JanusErasmus | 0:cda1bfa06c7c | 100 | { |
JanusErasmus | 0:cda1bfa06c7c | 101 | if(!__instance) |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 102 | __instance = new Console(serial, prompt); |
JanusErasmus | 0:cda1bfa06c7c | 103 | } |
JanusErasmus | 0:cda1bfa06c7c | 104 | |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 105 | Console::Console(Serial *serial, const char *prompt) : mSerial(serial), mPrompt(prompt) |
JanusErasmus | 0:cda1bfa06c7c | 106 | { |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 107 | printf("New Console\n%s $", mPrompt); |
JanusErasmus | 0:cda1bfa06c7c | 108 | work.start(callback(ReceiveSerial, this)); |
JanusErasmus | 0:cda1bfa06c7c | 109 | |
JanusErasmus | 0:cda1bfa06c7c | 110 | mIndex = 0; |
JanusErasmus | 0:cda1bfa06c7c | 111 | } |
JanusErasmus | 0:cda1bfa06c7c | 112 | |
JanusErasmus | 0:cda1bfa06c7c | 113 | Console::~Console() |
JanusErasmus | 0:cda1bfa06c7c | 114 | { |
JanusErasmus | 0:cda1bfa06c7c | 115 | } |
JanusErasmus | 0:cda1bfa06c7c | 116 | |
JanusErasmus | 0:cda1bfa06c7c | 117 | void util_parse_params(char *str,char *argv[],int &argc,char delim1,char delim2) |
JanusErasmus | 0:cda1bfa06c7c | 118 | { |
JanusErasmus | 0:cda1bfa06c7c | 119 | |
JanusErasmus | 0:cda1bfa06c7c | 120 | int max_args = argc; |
JanusErasmus | 0:cda1bfa06c7c | 121 | char * cmdl = str; |
JanusErasmus | 0:cda1bfa06c7c | 122 | bool done = false; |
JanusErasmus | 0:cda1bfa06c7c | 123 | argc = 0; |
JanusErasmus | 0:cda1bfa06c7c | 124 | char delim = delim1; |
JanusErasmus | 0:cda1bfa06c7c | 125 | while ( !done ) |
JanusErasmus | 0:cda1bfa06c7c | 126 | { |
JanusErasmus | 0:cda1bfa06c7c | 127 | /* Strip Leading Whitespce */ |
JanusErasmus | 0:cda1bfa06c7c | 128 | while ( isspace(*cmdl) ) |
JanusErasmus | 0:cda1bfa06c7c | 129 | { |
JanusErasmus | 0:cda1bfa06c7c | 130 | if ( *cmdl ) |
JanusErasmus | 0:cda1bfa06c7c | 131 | { |
JanusErasmus | 0:cda1bfa06c7c | 132 | cmdl++; |
JanusErasmus | 0:cda1bfa06c7c | 133 | } |
JanusErasmus | 0:cda1bfa06c7c | 134 | else |
JanusErasmus | 0:cda1bfa06c7c | 135 | { |
JanusErasmus | 0:cda1bfa06c7c | 136 | done = true; |
JanusErasmus | 0:cda1bfa06c7c | 137 | break; |
JanusErasmus | 0:cda1bfa06c7c | 138 | } |
JanusErasmus | 0:cda1bfa06c7c | 139 | } |
JanusErasmus | 0:cda1bfa06c7c | 140 | /* Now we are at an arg */ |
JanusErasmus | 0:cda1bfa06c7c | 141 | if ( !done && *cmdl ) |
JanusErasmus | 0:cda1bfa06c7c | 142 | { |
JanusErasmus | 0:cda1bfa06c7c | 143 | argv[argc] = cmdl; |
JanusErasmus | 0:cda1bfa06c7c | 144 | argc++; |
JanusErasmus | 0:cda1bfa06c7c | 145 | if(argc >= max_args) |
JanusErasmus | 0:cda1bfa06c7c | 146 | { |
JanusErasmus | 0:cda1bfa06c7c | 147 | done =true; |
JanusErasmus | 0:cda1bfa06c7c | 148 | break; |
JanusErasmus | 0:cda1bfa06c7c | 149 | } |
JanusErasmus | 0:cda1bfa06c7c | 150 | } |
JanusErasmus | 0:cda1bfa06c7c | 151 | /* Go to the next delim */ |
JanusErasmus | 0:cda1bfa06c7c | 152 | while ( delim != *cmdl ) |
JanusErasmus | 0:cda1bfa06c7c | 153 | { |
JanusErasmus | 0:cda1bfa06c7c | 154 | if ( *cmdl ) |
JanusErasmus | 0:cda1bfa06c7c | 155 | { |
JanusErasmus | 0:cda1bfa06c7c | 156 | cmdl++; |
JanusErasmus | 0:cda1bfa06c7c | 157 | } |
JanusErasmus | 0:cda1bfa06c7c | 158 | else |
JanusErasmus | 0:cda1bfa06c7c | 159 | { |
JanusErasmus | 0:cda1bfa06c7c | 160 | done = true; |
JanusErasmus | 0:cda1bfa06c7c | 161 | break; |
JanusErasmus | 0:cda1bfa06c7c | 162 | } |
JanusErasmus | 0:cda1bfa06c7c | 163 | } |
JanusErasmus | 0:cda1bfa06c7c | 164 | if ( *cmdl ) |
JanusErasmus | 0:cda1bfa06c7c | 165 | { |
JanusErasmus | 0:cda1bfa06c7c | 166 | *cmdl = 0; |
JanusErasmus | 0:cda1bfa06c7c | 167 | cmdl++; |
JanusErasmus | 0:cda1bfa06c7c | 168 | } |
JanusErasmus | 0:cda1bfa06c7c | 169 | else |
JanusErasmus | 0:cda1bfa06c7c | 170 | { |
JanusErasmus | 0:cda1bfa06c7c | 171 | done = true; |
JanusErasmus | 0:cda1bfa06c7c | 172 | } |
JanusErasmus | 0:cda1bfa06c7c | 173 | if(argc) |
JanusErasmus | 0:cda1bfa06c7c | 174 | { |
JanusErasmus | 0:cda1bfa06c7c | 175 | delim = delim2; |
JanusErasmus | 0:cda1bfa06c7c | 176 | } |
JanusErasmus | 0:cda1bfa06c7c | 177 | } |
JanusErasmus | 0:cda1bfa06c7c | 178 | } |
JanusErasmus | 0:cda1bfa06c7c | 179 | |
JanusErasmus | 0:cda1bfa06c7c | 180 | void Console::ReceiveSerial(Console *instance) |
JanusErasmus | 0:cda1bfa06c7c | 181 | { |
JanusErasmus | 0:cda1bfa06c7c | 182 | while(__instance) |
JanusErasmus | 0:cda1bfa06c7c | 183 | { |
JanusErasmus | 0:cda1bfa06c7c | 184 | __instance->handleByte(__instance->mSerial->getc()); |
JanusErasmus | 0:cda1bfa06c7c | 185 | } |
JanusErasmus | 0:cda1bfa06c7c | 186 | } |
JanusErasmus | 0:cda1bfa06c7c | 187 | |
JanusErasmus | 0:cda1bfa06c7c | 188 | void Console::handleByte(char byte) |
JanusErasmus | 0:cda1bfa06c7c | 189 | { |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 190 | mSerial->putc(byte); |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 191 | |
JanusErasmus | 0:cda1bfa06c7c | 192 | mBuffer[mIndex] = byte; |
JanusErasmus | 0:cda1bfa06c7c | 193 | |
JanusErasmus | 0:cda1bfa06c7c | 194 | if(mIndex++ > 128) |
JanusErasmus | 0:cda1bfa06c7c | 195 | { |
JanusErasmus | 0:cda1bfa06c7c | 196 | handleCommand(mBuffer); |
JanusErasmus | 0:cda1bfa06c7c | 197 | return; |
JanusErasmus | 0:cda1bfa06c7c | 198 | } |
JanusErasmus | 0:cda1bfa06c7c | 199 | |
JanusErasmus | 0:cda1bfa06c7c | 200 | if((byte == '\n') || (byte == '\r')) |
JanusErasmus | 0:cda1bfa06c7c | 201 | { |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 202 | mSerial->putc('\n'); |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 203 | |
JanusErasmus | 0:cda1bfa06c7c | 204 | mBuffer[mIndex - 1] = 0; |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 205 | if(mIndex > 1) |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 206 | handleCommand(mBuffer); |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 207 | |
JanusErasmus | 0:cda1bfa06c7c | 208 | mIndex = 0; |
jcerasmus@gmail.com | 2:4c8b24eb7ad5 | 209 | |
jcerasmus@gmail.com | 3:c97f4e7f2685 | 210 | printf("%s $", mPrompt); |
JanusErasmus | 0:cda1bfa06c7c | 211 | } |
JanusErasmus | 0:cda1bfa06c7c | 212 | } |
JanusErasmus | 0:cda1bfa06c7c | 213 | |
JanusErasmus | 0:cda1bfa06c7c | 214 | void Console::handleCommand(char *cmd) |
JanusErasmus | 0:cda1bfa06c7c | 215 | { |
JanusErasmus | 0:cda1bfa06c7c | 216 | char *argv[10]; |
JanusErasmus | 0:cda1bfa06c7c | 217 | int argc = 10; |
JanusErasmus | 0:cda1bfa06c7c | 218 | |
JanusErasmus | 0:cda1bfa06c7c | 219 | util_parse_params(cmd,argv,argc,' ',' '); |
JanusErasmus | 0:cda1bfa06c7c | 220 | process(argc, argv); |
JanusErasmus | 0:cda1bfa06c7c | 221 | } |
JanusErasmus | 0:cda1bfa06c7c | 222 | |
JanusErasmus | 0:cda1bfa06c7c | 223 | void Console::process(int argc,char *argv[]) |
JanusErasmus | 0:cda1bfa06c7c | 224 | { |
JanusErasmus | 0:cda1bfa06c7c | 225 | int index = 0; |
JanusErasmus | 0:cda1bfa06c7c | 226 | cmd_list_t* cmdList = mCmdTable[index++]; |
JanusErasmus | 0:cda1bfa06c7c | 227 | |
JanusErasmus | 0:cda1bfa06c7c | 228 | // if(!strcmp(argv[0], "debug")) |
JanusErasmus | 0:cda1bfa06c7c | 229 | // { |
JanusErasmus | 0:cda1bfa06c7c | 230 | // cDebug::porcessDebug(t, argc, argv); |
JanusErasmus | 0:cda1bfa06c7c | 231 | // return; |
JanusErasmus | 0:cda1bfa06c7c | 232 | // } |
JanusErasmus | 0:cda1bfa06c7c | 233 | |
JanusErasmus | 0:cda1bfa06c7c | 234 | |
JanusErasmus | 0:cda1bfa06c7c | 235 | while(cmdList) |
JanusErasmus | 0:cda1bfa06c7c | 236 | { |
JanusErasmus | 0:cda1bfa06c7c | 237 | cmd_list_t* t_ptr = 0; |
JanusErasmus | 0:cda1bfa06c7c | 238 | int k = 0; |
JanusErasmus | 0:cda1bfa06c7c | 239 | do |
JanusErasmus | 0:cda1bfa06c7c | 240 | { |
JanusErasmus | 0:cda1bfa06c7c | 241 | t_ptr = &cmdList[k++]; |
JanusErasmus | 0:cda1bfa06c7c | 242 | if(!t_ptr || !t_ptr->cmd) |
JanusErasmus | 0:cda1bfa06c7c | 243 | break; |
JanusErasmus | 0:cda1bfa06c7c | 244 | |
JanusErasmus | 0:cda1bfa06c7c | 245 | // //Special AT commands for modem |
JanusErasmus | 0:cda1bfa06c7c | 246 | // if(!strncmp(argv[0],"AT",2)) |
JanusErasmus | 0:cda1bfa06c7c | 247 | // { |
JanusErasmus | 0:cda1bfa06c7c | 248 | // if(mMdm) |
JanusErasmus | 0:cda1bfa06c7c | 249 | // mMdm->ATcmd(t, argc, argv); |
JanusErasmus | 0:cda1bfa06c7c | 250 | // |
JanusErasmus | 0:cda1bfa06c7c | 251 | // return; |
JanusErasmus | 0:cda1bfa06c7c | 252 | // } |
JanusErasmus | 0:cda1bfa06c7c | 253 | |
JanusErasmus | 0:cda1bfa06c7c | 254 | if(t_ptr->f && !strcmp(argv[0],t_ptr->cmd)) |
JanusErasmus | 0:cda1bfa06c7c | 255 | { |
JanusErasmus | 0:cda1bfa06c7c | 256 | t_ptr->f(argc, argv); |
JanusErasmus | 0:cda1bfa06c7c | 257 | return; |
JanusErasmus | 0:cda1bfa06c7c | 258 | } |
JanusErasmus | 0:cda1bfa06c7c | 259 | }while(t_ptr->cmd); |
JanusErasmus | 0:cda1bfa06c7c | 260 | |
JanusErasmus | 0:cda1bfa06c7c | 261 | cmdList = mCmdTable[index++]; |
JanusErasmus | 0:cda1bfa06c7c | 262 | } |
JanusErasmus | 0:cda1bfa06c7c | 263 | |
JanusErasmus | 0:cda1bfa06c7c | 264 | printf(RED("Unknown Command \'%s\'. Type help for a list of commands\n"), argv[0]); |
JanusErasmus | 0:cda1bfa06c7c | 265 | } |