Janus Erasmus / Console

Dependents:   Nucleo_blink_led

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?

UserRevisionLine numberNew 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 }