Janus Erasmus / Console

Dependents:   Nucleo_blink_led

Committer:
JanusErasmus
Date:
Sat Mar 17 11:13:55 2018 +0000
Revision:
0:cda1bfa06c7c
Child:
1:ffc6a669f391
Initial Commit for Console

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