Janus Erasmus / Console

Dependents:   Nucleo_blink_led

Committer:
jcerasmus@gmail.com
Date:
Sat Mar 17 14:05:07 2018 +0200
Revision:
1:ffc6a669f391
Parent:
0:cda1bfa06c7c
Child:
2:4c8b24eb7ad5
Make Console generic

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 1:ffc6a669f391 51 mbed_stats_stack_t stacks[10];
jcerasmus@gmail.com 1:ffc6a669f391 52 int cnt = mbed_stats_stack_get_each(stacks, 10);
jcerasmus@gmail.com 1:ffc6a669f391 53 for(int k = 0; k < cnt; k++)
jcerasmus@gmail.com 1:ffc6a669f391 54 {
jcerasmus@gmail.com 1:ffc6a669f391 55 printf("%d - TH[%lu]: max: %lu, res: %lu\r\n", k, stacks[k].thread_id, stacks[k].max_size, stacks[k].reserved_size);
jcerasmus@gmail.com 1:ffc6a669f391 56 }
jcerasmus@gmail.com 1:ffc6a669f391 57 }
jcerasmus@gmail.com 1:ffc6a669f391 58
JanusErasmus 0:cda1bfa06c7c 59 const Console::cmd_list_t shellCommands[] =
JanusErasmus 0:cda1bfa06c7c 60 {
jcerasmus@gmail.com 1:ffc6a669f391 61 {"MBED OS" ,0,0,0},
JanusErasmus 0:cda1bfa06c7c 62 {"h", "", "Show this help info", Console::help},
jcerasmus@gmail.com 1:ffc6a669f391 63 {"dt", "", "Dump Thread info", Console::dumpThreadInfo},
JanusErasmus 0:cda1bfa06c7c 64 {0,0,0}
JanusErasmus 0:cda1bfa06c7c 65 };
JanusErasmus 0:cda1bfa06c7c 66
JanusErasmus 0:cda1bfa06c7c 67
JanusErasmus 0:cda1bfa06c7c 68 Console *Console ::__instance = 0;
JanusErasmus 0:cda1bfa06c7c 69
JanusErasmus 0:cda1bfa06c7c 70 void Console::init(Serial *serial)
JanusErasmus 0:cda1bfa06c7c 71 {
JanusErasmus 0:cda1bfa06c7c 72 if(!__instance)
JanusErasmus 0:cda1bfa06c7c 73 __instance = new Console(serial);
JanusErasmus 0:cda1bfa06c7c 74 }
JanusErasmus 0:cda1bfa06c7c 75
JanusErasmus 0:cda1bfa06c7c 76 Console::Console(Serial *serial) : mSerial(serial)
JanusErasmus 0:cda1bfa06c7c 77 {
JanusErasmus 0:cda1bfa06c7c 78 printf("New Console\r\n");
JanusErasmus 0:cda1bfa06c7c 79 work.start(callback(ReceiveSerial, this));
JanusErasmus 0:cda1bfa06c7c 80
JanusErasmus 0:cda1bfa06c7c 81 mIndex = 0;
JanusErasmus 0:cda1bfa06c7c 82 }
JanusErasmus 0:cda1bfa06c7c 83
JanusErasmus 0:cda1bfa06c7c 84 Console::~Console()
JanusErasmus 0:cda1bfa06c7c 85 {
JanusErasmus 0:cda1bfa06c7c 86 }
JanusErasmus 0:cda1bfa06c7c 87
JanusErasmus 0:cda1bfa06c7c 88 void util_parse_params(char *str,char *argv[],int &argc,char delim1,char delim2)
JanusErasmus 0:cda1bfa06c7c 89 {
JanusErasmus 0:cda1bfa06c7c 90
JanusErasmus 0:cda1bfa06c7c 91 int max_args = argc;
JanusErasmus 0:cda1bfa06c7c 92 char * cmdl = str;
JanusErasmus 0:cda1bfa06c7c 93 bool done = false;
JanusErasmus 0:cda1bfa06c7c 94 argc = 0;
JanusErasmus 0:cda1bfa06c7c 95 char delim = delim1;
JanusErasmus 0:cda1bfa06c7c 96 while ( !done )
JanusErasmus 0:cda1bfa06c7c 97 {
JanusErasmus 0:cda1bfa06c7c 98 /* Strip Leading Whitespce */
JanusErasmus 0:cda1bfa06c7c 99 while ( isspace(*cmdl) )
JanusErasmus 0:cda1bfa06c7c 100 {
JanusErasmus 0:cda1bfa06c7c 101 if ( *cmdl )
JanusErasmus 0:cda1bfa06c7c 102 {
JanusErasmus 0:cda1bfa06c7c 103 cmdl++;
JanusErasmus 0:cda1bfa06c7c 104 }
JanusErasmus 0:cda1bfa06c7c 105 else
JanusErasmus 0:cda1bfa06c7c 106 {
JanusErasmus 0:cda1bfa06c7c 107 done = true;
JanusErasmus 0:cda1bfa06c7c 108 break;
JanusErasmus 0:cda1bfa06c7c 109 }
JanusErasmus 0:cda1bfa06c7c 110 }
JanusErasmus 0:cda1bfa06c7c 111 /* Now we are at an arg */
JanusErasmus 0:cda1bfa06c7c 112 if ( !done && *cmdl )
JanusErasmus 0:cda1bfa06c7c 113 {
JanusErasmus 0:cda1bfa06c7c 114 argv[argc] = cmdl;
JanusErasmus 0:cda1bfa06c7c 115 argc++;
JanusErasmus 0:cda1bfa06c7c 116 if(argc >= max_args)
JanusErasmus 0:cda1bfa06c7c 117 {
JanusErasmus 0:cda1bfa06c7c 118 done =true;
JanusErasmus 0:cda1bfa06c7c 119 break;
JanusErasmus 0:cda1bfa06c7c 120 }
JanusErasmus 0:cda1bfa06c7c 121 }
JanusErasmus 0:cda1bfa06c7c 122 /* Go to the next delim */
JanusErasmus 0:cda1bfa06c7c 123 while ( delim != *cmdl )
JanusErasmus 0:cda1bfa06c7c 124 {
JanusErasmus 0:cda1bfa06c7c 125 if ( *cmdl )
JanusErasmus 0:cda1bfa06c7c 126 {
JanusErasmus 0:cda1bfa06c7c 127 cmdl++;
JanusErasmus 0:cda1bfa06c7c 128 }
JanusErasmus 0:cda1bfa06c7c 129 else
JanusErasmus 0:cda1bfa06c7c 130 {
JanusErasmus 0:cda1bfa06c7c 131 done = true;
JanusErasmus 0:cda1bfa06c7c 132 break;
JanusErasmus 0:cda1bfa06c7c 133 }
JanusErasmus 0:cda1bfa06c7c 134 }
JanusErasmus 0:cda1bfa06c7c 135 if ( *cmdl )
JanusErasmus 0:cda1bfa06c7c 136 {
JanusErasmus 0:cda1bfa06c7c 137 *cmdl = 0;
JanusErasmus 0:cda1bfa06c7c 138 cmdl++;
JanusErasmus 0:cda1bfa06c7c 139 }
JanusErasmus 0:cda1bfa06c7c 140 else
JanusErasmus 0:cda1bfa06c7c 141 {
JanusErasmus 0:cda1bfa06c7c 142 done = true;
JanusErasmus 0:cda1bfa06c7c 143 }
JanusErasmus 0:cda1bfa06c7c 144 if(argc)
JanusErasmus 0:cda1bfa06c7c 145 {
JanusErasmus 0:cda1bfa06c7c 146 delim = delim2;
JanusErasmus 0:cda1bfa06c7c 147 }
JanusErasmus 0:cda1bfa06c7c 148 }
JanusErasmus 0:cda1bfa06c7c 149 }
JanusErasmus 0:cda1bfa06c7c 150
JanusErasmus 0:cda1bfa06c7c 151 void Console::ReceiveSerial(Console *instance)
JanusErasmus 0:cda1bfa06c7c 152 {
JanusErasmus 0:cda1bfa06c7c 153 printf("Console listening\r\n");
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 {
JanusErasmus 0:cda1bfa06c7c 162 mBuffer[mIndex] = byte;
JanusErasmus 0:cda1bfa06c7c 163
JanusErasmus 0:cda1bfa06c7c 164 if(mIndex++ > 128)
JanusErasmus 0:cda1bfa06c7c 165 {
JanusErasmus 0:cda1bfa06c7c 166 handleCommand(mBuffer);
JanusErasmus 0:cda1bfa06c7c 167 return;
JanusErasmus 0:cda1bfa06c7c 168 }
JanusErasmus 0:cda1bfa06c7c 169
JanusErasmus 0:cda1bfa06c7c 170 if((byte == '\n') || (byte == '\r'))
JanusErasmus 0:cda1bfa06c7c 171 {
JanusErasmus 0:cda1bfa06c7c 172 mBuffer[mIndex - 1] = 0;
JanusErasmus 0:cda1bfa06c7c 173 handleCommand(mBuffer);
JanusErasmus 0:cda1bfa06c7c 174 mIndex = 0;
JanusErasmus 0:cda1bfa06c7c 175 }
JanusErasmus 0:cda1bfa06c7c 176 }
JanusErasmus 0:cda1bfa06c7c 177
JanusErasmus 0:cda1bfa06c7c 178 void Console::handleCommand(char *cmd)
JanusErasmus 0:cda1bfa06c7c 179 {
JanusErasmus 0:cda1bfa06c7c 180 printf("Console: %s\n\r", cmd);
JanusErasmus 0:cda1bfa06c7c 181 char *argv[10];
JanusErasmus 0:cda1bfa06c7c 182 int argc = 10;
JanusErasmus 0:cda1bfa06c7c 183
JanusErasmus 0:cda1bfa06c7c 184 util_parse_params(cmd,argv,argc,' ',' ');
JanusErasmus 0:cda1bfa06c7c 185 process(argc, argv);
JanusErasmus 0:cda1bfa06c7c 186 }
JanusErasmus 0:cda1bfa06c7c 187
JanusErasmus 0:cda1bfa06c7c 188 void Console::process(int argc,char *argv[])
JanusErasmus 0:cda1bfa06c7c 189 {
JanusErasmus 0:cda1bfa06c7c 190 int index = 0;
JanusErasmus 0:cda1bfa06c7c 191 cmd_list_t* cmdList = mCmdTable[index++];
JanusErasmus 0:cda1bfa06c7c 192
JanusErasmus 0:cda1bfa06c7c 193 // if(!strcmp(argv[0], "debug"))
JanusErasmus 0:cda1bfa06c7c 194 // {
JanusErasmus 0:cda1bfa06c7c 195 // cDebug::porcessDebug(t, argc, argv);
JanusErasmus 0:cda1bfa06c7c 196 // return;
JanusErasmus 0:cda1bfa06c7c 197 // }
JanusErasmus 0:cda1bfa06c7c 198
JanusErasmus 0:cda1bfa06c7c 199
JanusErasmus 0:cda1bfa06c7c 200 while(cmdList)
JanusErasmus 0:cda1bfa06c7c 201 {
JanusErasmus 0:cda1bfa06c7c 202 cmd_list_t* t_ptr = 0;
JanusErasmus 0:cda1bfa06c7c 203 int k = 0;
JanusErasmus 0:cda1bfa06c7c 204 do
JanusErasmus 0:cda1bfa06c7c 205 {
JanusErasmus 0:cda1bfa06c7c 206 t_ptr = &cmdList[k++];
JanusErasmus 0:cda1bfa06c7c 207 if(!t_ptr || !t_ptr->cmd)
JanusErasmus 0:cda1bfa06c7c 208 break;
JanusErasmus 0:cda1bfa06c7c 209
JanusErasmus 0:cda1bfa06c7c 210 // //Special AT commands for modem
JanusErasmus 0:cda1bfa06c7c 211 // if(!strncmp(argv[0],"AT",2))
JanusErasmus 0:cda1bfa06c7c 212 // {
JanusErasmus 0:cda1bfa06c7c 213 // if(mMdm)
JanusErasmus 0:cda1bfa06c7c 214 // mMdm->ATcmd(t, argc, argv);
JanusErasmus 0:cda1bfa06c7c 215 //
JanusErasmus 0:cda1bfa06c7c 216 // return;
JanusErasmus 0:cda1bfa06c7c 217 // }
JanusErasmus 0:cda1bfa06c7c 218
JanusErasmus 0:cda1bfa06c7c 219 if(t_ptr->f && !strcmp(argv[0],t_ptr->cmd))
JanusErasmus 0:cda1bfa06c7c 220 {
JanusErasmus 0:cda1bfa06c7c 221 t_ptr->f(argc, argv);
JanusErasmus 0:cda1bfa06c7c 222 return;
JanusErasmus 0:cda1bfa06c7c 223 }
JanusErasmus 0:cda1bfa06c7c 224 }while(t_ptr->cmd);
JanusErasmus 0:cda1bfa06c7c 225
JanusErasmus 0:cda1bfa06c7c 226 cmdList = mCmdTable[index++];
JanusErasmus 0:cda1bfa06c7c 227 }
JanusErasmus 0:cda1bfa06c7c 228
JanusErasmus 0:cda1bfa06c7c 229 printf(RED("Unknown Command \'%s\'. Type help for a list of commands\n"), argv[0]);
JanusErasmus 0:cda1bfa06c7c 230 }