00001
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00069 #include <string.h>
00070 #include "compiler.h"
00071 #include "board.h"
00072
00073 #include "shell.h"
00074
00075 #include "sensor.h"
00076 #include "actuator.h"
00077 #include "fscmds.h"
00078 #include "syscmds.h"
00079 #include "supervisor.h"
00080 #include "tracedump.h"
00081 #include "ethernet.h"
00082 #include "usbsys.h"
00083 #include "com1shell.h"
00084
00085
00086
00087
00089 #define SHELL_MAX_NBTOKEN 8
00090
00092 #if configCTRLPANEL_TRACE == 1
00093 #define SHELL_NB_COMMANDS 37
00094 #else
00095 #define SHELL_NB_COMMANDS 35
00096 #endif
00097
00099 #define SHELL_FS_FIRSTCMDIDX 9
00100
00102 #define SHELL_FS_LASTCMDIDX 29
00103
00104
00105
00106
00107 extern eExecStatus e_supervisor_switch_to_maintenance_mode( eModId xModId,
00108 signed short FsNavId,
00109 int ac, signed portCHAR *av[],
00110 signed portCHAR **ppcStringReply );
00111
00112 static eExecStatus e_Shell_help( eModId xModId, signed short FsNavId,
00113 int ac, signed portCHAR *av[],
00114 signed portCHAR **ppcStringReply );
00115
00119 typedef enum {
00120 SHELL_CMDSTATUS_FOUND,
00121 SHELL_CMDSTATUS_NOTFOUND,
00122 SHELL_CMDSTATUS_PERMISSIONDENIED,
00123 } eCmdStatus;
00124
00125
00129 typedef struct st_cmd_registration {
00130 const signed portCHAR *const pc_string_cmd_name;
00131 pfShellCmd pf_exec_cmd;
00132 portBASE_TYPE mod_rights_map;
00133
00134
00135 }Cmd_registration;
00136
00137
00141 Cmd_registration a_cmd_registration[SHELL_NB_COMMANDS] = {
00142 {(signed portCHAR *)"!!", e_Shell_help, SYS_MODID_COM1SHELL},
00143 {(signed portCHAR *)"get_sensor_value", e_sensor_cmd_get_value, 0xFFFFFFFF},
00144 {(signed portCHAR *)"get_sensor_config", e_sensor_cmd_get_config, 0xFFFFFFFF},
00145 {(signed portCHAR *)"get_actuator_value", e_actuator_cmd_get_value, 0xFFFFFFFF},
00146 {(signed portCHAR *)"get_sys_config", e_syscmds_cmd_get_config, 0xFFFFFFFF},
00147 {(signed portCHAR *)"set_sensor_config", e_sensor_cmd_set_config, 0xFFFFFFFF},
00148 {(signed portCHAR *)"set_actuator_value", e_actuator_cmd_set_value, 0xFFFFFFFF},
00149 {(signed portCHAR *)"set_sys_config", e_syscmds_cmd_set_config, 0xFFFFFFFF},
00150 {(signed portCHAR *)"reboot", e_syscmds_reboot, SYS_MODID_COM1SHELL},
00151 {(signed portCHAR *)"mount", e_fscmds_shell_mount, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00152 {(signed portCHAR *)"cd", e_fscmds_shell_cd, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00153 {(signed portCHAR *)"ls", e_fscmds_shell_ls, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00154 {(signed portCHAR *)"pwd", e_fscmds_shell_pwd, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00155 {(signed portCHAR *)"cat", e_fscmds_shell_cat, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00156 {(signed portCHAR *)"append", e_fscmds_shell_append, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00157 {(signed portCHAR *)"touch", e_fscmds_shell_touch, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00158 {(signed portCHAR *)"mkdir", e_fscmds_shell_mkdir, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00159 {(signed portCHAR *)"disk", e_fscmds_shell_disk, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00160 {(signed portCHAR *)"df", e_fscmds_shell_df, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00161 {(signed portCHAR *)"rm", e_fscmds_shell_rm, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00162 {(signed portCHAR *)"fat", e_fscmds_shell_fat, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00163 {(signed portCHAR *)"a:", e_fscmds_shell_goto_a_drive, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00164 {(signed portCHAR *)"b:", e_fscmds_shell_goto_b_drive, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00165 {(signed portCHAR *)"c:", e_fscmds_shell_goto_c_drive, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00166 {(signed portCHAR *)"d:", e_fscmds_shell_goto_d_drive, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00167 {(signed portCHAR *)"mark", e_fscmds_shell_mark, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00168 {(signed portCHAR *)"goto", e_fscmds_shell_goto, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00169 {(signed portCHAR *)"mv", e_fscmds_shell_mv, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00170 {(signed portCHAR *)"cp", e_fscmds_shell_cp, SYS_MODID_COM1SHELL|SYS_MODID_USB},
00171 {(signed portCHAR *)"format", e_fscmds_shell_format, SYS_MODID_COM1SHELL|SYS_MODID_USB|SYS_MODID_HTTP},
00172 {(signed portCHAR *)"help", e_Shell_help, 0xFFFFFFFF},
00173 #if configCTRLPANEL_TRACE == 1
00174 {(signed portCHAR *)"ipstat", e_ip_stat, SYS_MODID_COM1SHELL},
00175 #endif
00176 {(signed portCHAR *)"lsusb", e_usbsys_lsusb, SYS_MODID_COM1SHELL},
00177 {(signed portCHAR *)"cp_logs_to_ukey", e_usbsys_cp_logs_to_key, SYS_MODID_COM1SHELL},
00178 {(signed portCHAR *)"maintain", e_supervisor_switch_to_maintenance_mode, SYS_MODID_COM1SHELL},
00179 #if configCTRLPANEL_TRACE == 1
00180 {(signed portCHAR *)"dbgtrace", e_syscmds_trace, SYS_MODID_COM1SHELL},
00181 #endif
00182 {(signed portCHAR *)"version", e_syscmds_version, SYS_MODID_COM1SHELL}
00183 };
00184
00185
00190 const signed portCHAR *const SHELL_MSG_CMDNOTFOUND = (signed portCHAR *)"Error"CRLF"Command not found"CRLF;
00192 const signed portCHAR *const SHELL_MSG_SYNTAXERROR = (signed portCHAR *)"Error"CRLF"Syntax error"CRLF;
00194 const signed portCHAR *const SHELL_MSG_PERMISSIONDENIED = (signed portCHAR *)"Error"CRLF"Permission denied"CRLF;
00195
00196 const signed portCHAR *const SHELL_MSG_HELP = (signed portCHAR *)"Commands summary"CRLF"help"CRLF"!!: execute the previous command"CRLF;
00197
00199 const signed portCHAR *const SHELL_MSG_NOHISTORY = (signed portCHAR *)"Error"CRLF"No previous command"CRLF;
00200
00202 const signed portCHAR *const SHELL_ERRMSG_HELP_SYNTAXERROR = (signed portCHAR *)"Error"CRLF"Usage: help [sensor,actuator,sys,fs]"CRLF;
00203
00205 static portBASE_TYPE PrevCmdIdx = -1;
00206 static portBASE_TYPE PrevCmdAc;
00207 signed portCHAR *PrevCmdAv[SHELL_MAX_NBTOKEN];
00208
00210 extern xSemaphoreHandle xSHELLFSMutex;
00211
00212 static eCmdStatus prvCmdIdentify_Tokenize( signed portCHAR *pcStringCmd,
00213 eModId xModId,
00214 portBASE_TYPE *ac,
00215 signed portCHAR **av,
00216 portBASE_TYPE *pCmdIdx );
00217
00218
00219
00220
00235 eExecStatus Shell_exec( signed portCHAR *pcStringCmd,
00236 eModId xModId,
00237 signed short FsNavId,
00238 signed portCHAR **ppcStringReply)
00239 {
00240 eCmdStatus xCmdStatus;
00241 portBASE_TYPE ac;
00242 signed portCHAR *av[SHELL_MAX_NBTOKEN];
00243 portBASE_TYPE CmdIdx;
00244 int i;
00245 eExecStatus xRet;
00246
00247
00248
00249 xCmdStatus = prvCmdIdentify_Tokenize( pcStringCmd, xModId, &ac, av, &CmdIdx );
00250 if(SHELL_CMDSTATUS_NOTFOUND == xCmdStatus)
00251 {
00252 if(ppcStringReply != NULL)
00253 {
00254 *ppcStringReply = (signed portCHAR *)SHELL_MSG_CMDNOTFOUND;
00255 }
00256 return(SHELL_EXECSTATUS_KO);
00257 }
00258 else if(SHELL_CMDSTATUS_PERMISSIONDENIED == xCmdStatus)
00259 {
00260 if(ppcStringReply != NULL)
00261 {
00262 *ppcStringReply = (signed portCHAR *)SHELL_MSG_PERMISSIONDENIED;
00263 }
00264 return(SHELL_EXECSTATUS_KO);
00265 }
00266
00267
00268
00269
00270 if( ( CmdIdx >= SHELL_FS_FIRSTCMDIDX ) && ( CmdIdx <= SHELL_FS_LASTCMDIDX ) )
00271 {
00272 if( pdFALSE == x_supervisor_SemaphoreTake( xSHELLFSMutex, 0 ) )
00273 {
00274 if(ppcStringReply != NULL)
00275 {
00276 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_MAINTENANCEMODE;
00277 }
00278 return(SHELL_EXECSTATUS_KO);
00279 }
00280 }
00281
00282
00283
00284 if( 0 == CmdIdx )
00285 {
00286 CmdIdx = PrevCmdIdx;
00287 if( -1 == CmdIdx )
00288 {
00289 if(ppcStringReply != NULL)
00290 {
00291 *ppcStringReply = (signed portCHAR *)SHELL_MSG_NOHISTORY;
00292 }
00293 return(SHELL_EXECSTATUS_KO);
00294 }
00295 ac = PrevCmdAc;
00296
00297 for(i=0; i<ac; i++) av[i] = PrevCmdAv[i];
00298 }
00299 else
00300 {
00301 PrevCmdIdx = CmdIdx;
00302 PrevCmdAc = ac;
00303 for(i=0; i<ac; i++) PrevCmdAv[i] = av[i];
00304 }
00305
00306
00307 if(ppcStringReply != NULL)
00308 *ppcStringReply = NULL;
00309 xRet = a_cmd_registration[CmdIdx].pf_exec_cmd( xModId, FsNavId, ac, av, ppcStringReply );
00310
00311
00312 if( ( CmdIdx >= SHELL_FS_FIRSTCMDIDX ) && ( CmdIdx <= SHELL_FS_LASTCMDIDX ) )
00313 {
00314 x_supervisor_SemaphoreGive( xSHELLFSMutex );
00315 }
00316
00317 return( xRet );
00318 }
00319
00320
00334 static eCmdStatus prvCmdIdentify_Tokenize( signed portCHAR *pcStringCmd, eModId xModId,
00335 portBASE_TYPE *ac, signed portCHAR **av,
00336 portBASE_TYPE *pCmdIdx )
00337 {
00338 signed portCHAR *pcStringPtr = pcStringCmd;
00339 size_t token_len, parsed_len, tempo_len;
00340 portBASE_TYPE cmd_len = strlen( (char *)pcStringCmd );
00341
00342
00343
00344
00345
00346 pcStringPtr += parsed_len = strspn((char *)pcStringCmd, " ");
00347
00348
00349 parsed_len += token_len = strcspn((char *)pcStringPtr," ");
00350
00351 pcStringPtr[token_len] = '\0';
00352
00353
00354 for(*pCmdIdx = 0; *pCmdIdx < SHELL_NB_COMMANDS; (*pCmdIdx)++)
00355 {
00356 if(0 == strcmp( (char *)pcStringPtr,
00357 (char *)a_cmd_registration[*pCmdIdx].pc_string_cmd_name ) )
00358 break;
00359 }
00360 if(SHELL_NB_COMMANDS == *pCmdIdx)
00361 return(SHELL_CMDSTATUS_NOTFOUND);
00362
00363
00364
00365
00366 if( 0 == ( xModId & a_cmd_registration[*pCmdIdx].mod_rights_map ) )
00367 return(SHELL_CMDSTATUS_PERMISSIONDENIED);
00368
00369 pcStringPtr += token_len+1;
00370 parsed_len++;
00371
00372
00373
00374
00375
00376 *ac = 0;
00377 while( ( parsed_len < cmd_len ) && (*pcStringPtr != '\0') && (*ac <= SHELL_MAX_NBTOKEN) )
00378 {
00382
00383 parsed_len += tempo_len = strspn((char *)pcStringPtr, " =");
00384 pcStringPtr += tempo_len;
00385
00386
00387 if(*pcStringPtr == '\0')
00388 break;
00389
00390
00391
00392 if(*pcStringPtr == '"')
00393 {
00394 pcStringPtr++;
00395 parsed_len++;
00396
00397
00398
00399
00400 token_len = strcspn((char *)pcStringPtr,"\"");
00401
00402
00403
00404 }
00405 else
00406 {
00407
00408 token_len = strcspn((char *)pcStringPtr," =");
00409 }
00410
00411
00412 av[*ac] = pcStringPtr;
00413 (*ac)++;
00414 pcStringPtr += token_len;
00415 parsed_len += token_len;
00416 if(*pcStringPtr == '\0')
00417 break;
00418 else
00419 *pcStringPtr++ = '\0';
00420
00421
00422 }
00423
00424 return(SHELL_CMDSTATUS_FOUND);
00425 }
00426
00427
00446 static eExecStatus e_Shell_help( eModId xModId, signed short FsNavId,
00447 int ac, signed portCHAR *av[],
00448 signed portCHAR **ppcStringReply )
00449 {
00450 signed portCHAR *pcStringSensor;
00451 signed portCHAR *pcStringActuator;
00452 signed portCHAR *pcStringFs;
00453 signed portCHAR *pcStringSys;
00454 int ShellMsgLen = strlen((char *)SHELL_MSG_HELP);
00455 eExecStatus eRetStatus = SHELL_EXECSTATUS_KO;
00456
00457
00458
00459 if( ppcStringReply == NULL )
00460 return( eRetStatus );
00461
00462
00463
00464
00465 if( 0 != ac )
00466 {
00467 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_HELP_SYNTAXERROR;
00468 return( eRetStatus );
00469 }
00470
00471
00472 e_fscmds_shell_help( xModId, FsNavId, ac, av, &pcStringFs );
00473
00474 e_sensor_help( xModId, FsNavId, ac, av, &pcStringSensor );
00475
00476 e_actuator_help(xModId, FsNavId, ac, av, &pcStringActuator );
00477
00478 e_syscmds_help(xModId, FsNavId, ac, av, &pcStringSys );
00479
00480
00481 ShellMsgLen += strlen( (char *)pcStringFs ) + strlen( (char *)pcStringSensor )
00482 + strlen( (char *)pcStringActuator ) + strlen( (char *)pcStringSys ) +1;
00483 *ppcStringReply = (signed portCHAR *)pvPortMalloc(ShellMsgLen);
00484
00485
00486 strcpy((char *)*ppcStringReply, (char *)SHELL_MSG_HELP);
00487 strcat((char *)*ppcStringReply, (char *)pcStringSensor);
00488 strcat((char *)*ppcStringReply, (char *)pcStringActuator);
00489 strcat((char *)*ppcStringReply, (char *)pcStringFs);
00490 strcat((char *)*ppcStringReply, (char *)pcStringSys);
00491
00492
00493
00494
00495 return(SHELL_EXECSTATUS_OK);
00496 }
00497
00498
00506 void v_shell_Print_String_To_Requester_Stream( eModId xModId,
00507 const signed portCHAR *pcStringToDisplay )
00508 {
00509 switch( xModId )
00510 {
00511 case SYS_MODID_COM1SHELL:
00512 vcom1shell_PrintMsg(pcStringToDisplay);
00513 break;
00514 case SYS_MODID_USB:
00515 TRACE_COM2((char *)"Unimplemented stream redirection (from fscmds to USB)");
00516 break;
00517 default:
00518 TRACE_COM2((char *) "Unexpected stream redirection");
00519 break;
00520 }
00521 }