Janus Erasmus / Console

Dependents:   Nucleo_blink_led

Committer:
jcerasmus@gmail.com
Date:
Sat Mar 17 15:02:12 2018 +0200
Revision:
3:c97f4e7f2685
Parent:
2:4c8b24eb7ad5
Child:
4:8e1c0e634ba6
Fix new line

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>
JanusErasmus 0:cda1bfa06c7c 8
jcerasmus@gmail.com 1:ffc6a669f391 9 #include "mbed_stats.h"
jcerasmus@gmail.com 1:ffc6a669f391 10
JanusErasmus 0:cda1bfa06c7c 11 #include "Console.h"
JanusErasmus 0:cda1bfa06c7c 12
JanusErasmus 0:cda1bfa06c7c 13 void Console::help(int argc,char *argv[])
JanusErasmus 0:cda1bfa06c7c 14 {
JanusErasmus 0:cda1bfa06c7c 15 printf(GREEN("TermCMD commands:\n"));
JanusErasmus 0:cda1bfa06c7c 16
JanusErasmus 0:cda1bfa06c7c 17 int index = 0;
JanusErasmus 0:cda1bfa06c7c 18 cmd_list_t* cmdList = mCmdTable[index++];
JanusErasmus 0:cda1bfa06c7c 19 while(cmdList)
JanusErasmus 0:cda1bfa06c7c 20 {
JanusErasmus 0:cda1bfa06c7c 21 cmd_list_t* t_ptr = 0;
JanusErasmus 0:cda1bfa06c7c 22 int k = 0;
JanusErasmus 0:cda1bfa06c7c 23 do
JanusErasmus 0:cda1bfa06c7c 24 {
JanusErasmus 0:cda1bfa06c7c 25 t_ptr = &cmdList[k++];
JanusErasmus 0:cda1bfa06c7c 26 if(!t_ptr || !t_ptr->cmd)
JanusErasmus 0:cda1bfa06c7c 27 break;
JanusErasmus 0:cda1bfa06c7c 28
JanusErasmus 0:cda1bfa06c7c 29 if(t_ptr->f)
JanusErasmus 0:cda1bfa06c7c 30 {
JanusErasmus 0:cda1bfa06c7c 31 char txt[16];
JanusErasmus 0:cda1bfa06c7c 32 sprintf(txt,"%s %s", t_ptr->cmd, t_ptr->argDesc);
JanusErasmus 0:cda1bfa06c7c 33 printf(" %-10s - ",txt);
JanusErasmus 0:cda1bfa06c7c 34 printf("%s\n",t_ptr->desc);
JanusErasmus 0:cda1bfa06c7c 35 }
JanusErasmus 0:cda1bfa06c7c 36 else
JanusErasmus 0:cda1bfa06c7c 37 {
JanusErasmus 0:cda1bfa06c7c 38 //this is a caption
JanusErasmus 0:cda1bfa06c7c 39 printf(BLUE("%s\n"), t_ptr->cmd);
JanusErasmus 0:cda1bfa06c7c 40 }
JanusErasmus 0:cda1bfa06c7c 41
JanusErasmus 0:cda1bfa06c7c 42 }while(t_ptr->cmd);
JanusErasmus 0:cda1bfa06c7c 43
JanusErasmus 0:cda1bfa06c7c 44 cmdList = mCmdTable[index++];
JanusErasmus 0:cda1bfa06c7c 45 }
JanusErasmus 0:cda1bfa06c7c 46
JanusErasmus 0:cda1bfa06c7c 47 }
JanusErasmus 0:cda1bfa06c7c 48
jcerasmus@gmail.com 1:ffc6a669f391 49 void Console::dumpThreadInfo(int argc,char *argv[])
jcerasmus@gmail.com 1:ffc6a669f391 50 {
jcerasmus@gmail.com 2:4c8b24eb7ad5 51 printf("Thread Info:\n");
jcerasmus@gmail.com 1:ffc6a669f391 52 mbed_stats_stack_t stacks[10];
jcerasmus@gmail.com 1:ffc6a669f391 53 int cnt = mbed_stats_stack_get_each(stacks, 10);
jcerasmus@gmail.com 1:ffc6a669f391 54 for(int k = 0; k < cnt; k++)
jcerasmus@gmail.com 1:ffc6a669f391 55 {
jcerasmus@gmail.com 2:4c8b24eb7ad5 56 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 57 }
jcerasmus@gmail.com 1:ffc6a669f391 58 }
jcerasmus@gmail.com 1:ffc6a669f391 59
JanusErasmus 0:cda1bfa06c7c 60 const Console::cmd_list_t shellCommands[] =
JanusErasmus 0:cda1bfa06c7c 61 {
jcerasmus@gmail.com 1:ffc6a669f391 62 {"MBED OS" ,0,0,0},
JanusErasmus 0:cda1bfa06c7c 63 {"h", "", "Show this help info", Console::help},
jcerasmus@gmail.com 2:4c8b24eb7ad5 64 {"dt", "", "Dump Thread info", Console::dumpThreadInfo},
JanusErasmus 0:cda1bfa06c7c 65 {0,0,0}
JanusErasmus 0:cda1bfa06c7c 66 };
JanusErasmus 0:cda1bfa06c7c 67
JanusErasmus 0:cda1bfa06c7c 68
JanusErasmus 0:cda1bfa06c7c 69 Console *Console ::__instance = 0;
JanusErasmus 0:cda1bfa06c7c 70
jcerasmus@gmail.com 2:4c8b24eb7ad5 71 void Console::init(Serial *serial, const char *prompt)
JanusErasmus 0:cda1bfa06c7c 72 {
JanusErasmus 0:cda1bfa06c7c 73 if(!__instance)
jcerasmus@gmail.com 2:4c8b24eb7ad5 74 __instance = new Console(serial, prompt);
JanusErasmus 0:cda1bfa06c7c 75 }
JanusErasmus 0:cda1bfa06c7c 76
jcerasmus@gmail.com 2:4c8b24eb7ad5 77 Console::Console(Serial *serial, const char *prompt) : mSerial(serial), mPrompt(prompt)
JanusErasmus 0:cda1bfa06c7c 78 {
jcerasmus@gmail.com 2:4c8b24eb7ad5 79 printf("New Console\n%s $", mPrompt);
JanusErasmus 0:cda1bfa06c7c 80 work.start(callback(ReceiveSerial, this));
JanusErasmus 0:cda1bfa06c7c 81
JanusErasmus 0:cda1bfa06c7c 82 mIndex = 0;
JanusErasmus 0:cda1bfa06c7c 83 }
JanusErasmus 0:cda1bfa06c7c 84
JanusErasmus 0:cda1bfa06c7c 85 Console::~Console()
JanusErasmus 0:cda1bfa06c7c 86 {
JanusErasmus 0:cda1bfa06c7c 87 }
JanusErasmus 0:cda1bfa06c7c 88
JanusErasmus 0:cda1bfa06c7c 89 void util_parse_params(char *str,char *argv[],int &argc,char delim1,char delim2)
JanusErasmus 0:cda1bfa06c7c 90 {
JanusErasmus 0:cda1bfa06c7c 91
JanusErasmus 0:cda1bfa06c7c 92 int max_args = argc;
JanusErasmus 0:cda1bfa06c7c 93 char * cmdl = str;
JanusErasmus 0:cda1bfa06c7c 94 bool done = false;
JanusErasmus 0:cda1bfa06c7c 95 argc = 0;
JanusErasmus 0:cda1bfa06c7c 96 char delim = delim1;
JanusErasmus 0:cda1bfa06c7c 97 while ( !done )
JanusErasmus 0:cda1bfa06c7c 98 {
JanusErasmus 0:cda1bfa06c7c 99 /* Strip Leading Whitespce */
JanusErasmus 0:cda1bfa06c7c 100 while ( isspace(*cmdl) )
JanusErasmus 0:cda1bfa06c7c 101 {
JanusErasmus 0:cda1bfa06c7c 102 if ( *cmdl )
JanusErasmus 0:cda1bfa06c7c 103 {
JanusErasmus 0:cda1bfa06c7c 104 cmdl++;
JanusErasmus 0:cda1bfa06c7c 105 }
JanusErasmus 0:cda1bfa06c7c 106 else
JanusErasmus 0:cda1bfa06c7c 107 {
JanusErasmus 0:cda1bfa06c7c 108 done = true;
JanusErasmus 0:cda1bfa06c7c 109 break;
JanusErasmus 0:cda1bfa06c7c 110 }
JanusErasmus 0:cda1bfa06c7c 111 }
JanusErasmus 0:cda1bfa06c7c 112 /* Now we are at an arg */
JanusErasmus 0:cda1bfa06c7c 113 if ( !done && *cmdl )
JanusErasmus 0:cda1bfa06c7c 114 {
JanusErasmus 0:cda1bfa06c7c 115 argv[argc] = cmdl;
JanusErasmus 0:cda1bfa06c7c 116 argc++;
JanusErasmus 0:cda1bfa06c7c 117 if(argc >= max_args)
JanusErasmus 0:cda1bfa06c7c 118 {
JanusErasmus 0:cda1bfa06c7c 119 done =true;
JanusErasmus 0:cda1bfa06c7c 120 break;
JanusErasmus 0:cda1bfa06c7c 121 }
JanusErasmus 0:cda1bfa06c7c 122 }
JanusErasmus 0:cda1bfa06c7c 123 /* Go to the next delim */
JanusErasmus 0:cda1bfa06c7c 124 while ( delim != *cmdl )
JanusErasmus 0:cda1bfa06c7c 125 {
JanusErasmus 0:cda1bfa06c7c 126 if ( *cmdl )
JanusErasmus 0:cda1bfa06c7c 127 {
JanusErasmus 0:cda1bfa06c7c 128 cmdl++;
JanusErasmus 0:cda1bfa06c7c 129 }
JanusErasmus 0:cda1bfa06c7c 130 else
JanusErasmus 0:cda1bfa06c7c 131 {
JanusErasmus 0:cda1bfa06c7c 132 done = true;
JanusErasmus 0:cda1bfa06c7c 133 break;
JanusErasmus 0:cda1bfa06c7c 134 }
JanusErasmus 0:cda1bfa06c7c 135 }
JanusErasmus 0:cda1bfa06c7c 136 if ( *cmdl )
JanusErasmus 0:cda1bfa06c7c 137 {
JanusErasmus 0:cda1bfa06c7c 138 *cmdl = 0;
JanusErasmus 0:cda1bfa06c7c 139 cmdl++;
JanusErasmus 0:cda1bfa06c7c 140 }
JanusErasmus 0:cda1bfa06c7c 141 else
JanusErasmus 0:cda1bfa06c7c 142 {
JanusErasmus 0:cda1bfa06c7c 143 done = true;
JanusErasmus 0:cda1bfa06c7c 144 }
JanusErasmus 0:cda1bfa06c7c 145 if(argc)
JanusErasmus 0:cda1bfa06c7c 146 {
JanusErasmus 0:cda1bfa06c7c 147 delim = delim2;
JanusErasmus 0:cda1bfa06c7c 148 }
JanusErasmus 0:cda1bfa06c7c 149 }
JanusErasmus 0:cda1bfa06c7c 150 }
JanusErasmus 0:cda1bfa06c7c 151
JanusErasmus 0:cda1bfa06c7c 152 void Console::ReceiveSerial(Console *instance)
JanusErasmus 0:cda1bfa06c7c 153 {
JanusErasmus 0:cda1bfa06c7c 154 while(__instance)
JanusErasmus 0:cda1bfa06c7c 155 {
JanusErasmus 0:cda1bfa06c7c 156 __instance->handleByte(__instance->mSerial->getc());
JanusErasmus 0:cda1bfa06c7c 157 }
JanusErasmus 0:cda1bfa06c7c 158 }
JanusErasmus 0:cda1bfa06c7c 159
JanusErasmus 0:cda1bfa06c7c 160 void Console::handleByte(char byte)
JanusErasmus 0:cda1bfa06c7c 161 {
jcerasmus@gmail.com 2:4c8b24eb7ad5 162 mSerial->putc(byte);
jcerasmus@gmail.com 2:4c8b24eb7ad5 163
JanusErasmus 0:cda1bfa06c7c 164 mBuffer[mIndex] = byte;
JanusErasmus 0:cda1bfa06c7c 165
JanusErasmus 0:cda1bfa06c7c 166 if(mIndex++ > 128)
JanusErasmus 0:cda1bfa06c7c 167 {
JanusErasmus 0:cda1bfa06c7c 168 handleCommand(mBuffer);
JanusErasmus 0:cda1bfa06c7c 169 return;
JanusErasmus 0:cda1bfa06c7c 170 }
JanusErasmus 0:cda1bfa06c7c 171
JanusErasmus 0:cda1bfa06c7c 172 if((byte == '\n') || (byte == '\r'))
JanusErasmus 0:cda1bfa06c7c 173 {
jcerasmus@gmail.com 2:4c8b24eb7ad5 174 mSerial->putc('\n');
jcerasmus@gmail.com 2:4c8b24eb7ad5 175
JanusErasmus 0:cda1bfa06c7c 176 mBuffer[mIndex - 1] = 0;
jcerasmus@gmail.com 2:4c8b24eb7ad5 177 if(mIndex > 1)
jcerasmus@gmail.com 2:4c8b24eb7ad5 178 handleCommand(mBuffer);
jcerasmus@gmail.com 2:4c8b24eb7ad5 179
JanusErasmus 0:cda1bfa06c7c 180 mIndex = 0;
jcerasmus@gmail.com 2:4c8b24eb7ad5 181
jcerasmus@gmail.com 3:c97f4e7f2685 182 printf("%s $", mPrompt);
JanusErasmus 0:cda1bfa06c7c 183 }
JanusErasmus 0:cda1bfa06c7c 184 }
JanusErasmus 0:cda1bfa06c7c 185
JanusErasmus 0:cda1bfa06c7c 186 void Console::handleCommand(char *cmd)
JanusErasmus 0:cda1bfa06c7c 187 {
JanusErasmus 0:cda1bfa06c7c 188 char *argv[10];
JanusErasmus 0:cda1bfa06c7c 189 int argc = 10;
JanusErasmus 0:cda1bfa06c7c 190
JanusErasmus 0:cda1bfa06c7c 191 util_parse_params(cmd,argv,argc,' ',' ');
JanusErasmus 0:cda1bfa06c7c 192 process(argc, argv);
JanusErasmus 0:cda1bfa06c7c 193 }
JanusErasmus 0:cda1bfa06c7c 194
JanusErasmus 0:cda1bfa06c7c 195 void Console::process(int argc,char *argv[])
JanusErasmus 0:cda1bfa06c7c 196 {
JanusErasmus 0:cda1bfa06c7c 197 int index = 0;
JanusErasmus 0:cda1bfa06c7c 198 cmd_list_t* cmdList = mCmdTable[index++];
JanusErasmus 0:cda1bfa06c7c 199
JanusErasmus 0:cda1bfa06c7c 200 // if(!strcmp(argv[0], "debug"))
JanusErasmus 0:cda1bfa06c7c 201 // {
JanusErasmus 0:cda1bfa06c7c 202 // cDebug::porcessDebug(t, argc, argv);
JanusErasmus 0:cda1bfa06c7c 203 // return;
JanusErasmus 0:cda1bfa06c7c 204 // }
JanusErasmus 0:cda1bfa06c7c 205
JanusErasmus 0:cda1bfa06c7c 206
JanusErasmus 0:cda1bfa06c7c 207 while(cmdList)
JanusErasmus 0:cda1bfa06c7c 208 {
JanusErasmus 0:cda1bfa06c7c 209 cmd_list_t* t_ptr = 0;
JanusErasmus 0:cda1bfa06c7c 210 int k = 0;
JanusErasmus 0:cda1bfa06c7c 211 do
JanusErasmus 0:cda1bfa06c7c 212 {
JanusErasmus 0:cda1bfa06c7c 213 t_ptr = &cmdList[k++];
JanusErasmus 0:cda1bfa06c7c 214 if(!t_ptr || !t_ptr->cmd)
JanusErasmus 0:cda1bfa06c7c 215 break;
JanusErasmus 0:cda1bfa06c7c 216
JanusErasmus 0:cda1bfa06c7c 217 // //Special AT commands for modem
JanusErasmus 0:cda1bfa06c7c 218 // if(!strncmp(argv[0],"AT",2))
JanusErasmus 0:cda1bfa06c7c 219 // {
JanusErasmus 0:cda1bfa06c7c 220 // if(mMdm)
JanusErasmus 0:cda1bfa06c7c 221 // mMdm->ATcmd(t, argc, argv);
JanusErasmus 0:cda1bfa06c7c 222 //
JanusErasmus 0:cda1bfa06c7c 223 // return;
JanusErasmus 0:cda1bfa06c7c 224 // }
JanusErasmus 0:cda1bfa06c7c 225
JanusErasmus 0:cda1bfa06c7c 226 if(t_ptr->f && !strcmp(argv[0],t_ptr->cmd))
JanusErasmus 0:cda1bfa06c7c 227 {
JanusErasmus 0:cda1bfa06c7c 228 t_ptr->f(argc, argv);
JanusErasmus 0:cda1bfa06c7c 229 return;
JanusErasmus 0:cda1bfa06c7c 230 }
JanusErasmus 0:cda1bfa06c7c 231 }while(t_ptr->cmd);
JanusErasmus 0:cda1bfa06c7c 232
JanusErasmus 0:cda1bfa06c7c 233 cmdList = mCmdTable[index++];
JanusErasmus 0:cda1bfa06c7c 234 }
JanusErasmus 0:cda1bfa06c7c 235
JanusErasmus 0:cda1bfa06c7c 236 printf(RED("Unknown Command \'%s\'. Type help for a list of commands\n"), argv[0]);
JanusErasmus 0:cda1bfa06c7c 237 }