Command Processor
.
This is a relatively simple command processor. It has a few objectives -
- Permit flexible IO assignment for serial input and output (serial, USB, etc.).
- Does not "block" the CPU by waiting for a keystroke (process individual chars and return).
- Compiles on mbed target and desktop under Visual C++ 2010 Express.
You can read more about the APIs and get the library at CommandProcessor.
Sample in Action
Here's a sample of the program in action, and further below is the source to this sample that makes it happen.
This program was built Oct 1 2011 15:16:17. >Help Echo : Echo [1|on|0|off] turns echo on or off. Exit : Exits the program Help : Help or '?' shows this help, 'Help ?' shows more details. History: Show command history who : Shows who is logged on, or 'who id' for specifics >who who... >About This program was built Oct 1 2011 15:16:17. >
Sample Source Code
And here's the code that makes it happen.
// CommandLine.cpp : Defines the entry point for the // console application. // #ifdef WIN32 #include "stdio.h" #include "conio.h" #include "string.h" #include "assert.h" #else #include "mbed.h" #endif extern "C" { #include "CommandProcessor.h" } #ifdef WIN32 #else Serial pc(USBTX, USBRX); #endif RUNRESULT_T Who(char *p); const CMD_T WhoCmd = { "who", "Shows who is logged on, or 'who id' for specifics", Who, visible }; RUNRESULT_T SignOnBanner(char *p); const CMD_T SignOnBannerCmd = { "About", "About this program", SignOnBanner, invisible }; RUNRESULT_T SignOnBanner(char *p) { puts("\r\nThis program was built " __DATE__ " " __TIME__ ".\r\n"); return runok; } RUNRESULT_T Who(char *p) { printf("\r\nwho...\r\n"); if (*p) printf(" Sorry, no help for [%s]\r\n", p); return runok; } // Provide the serial interface methods for the command processor #ifdef WIN32 int mReadable() { return _kbhit(); } int mGetCh() { return _getch(); } int mPutCh(int a) { return _putch(a); } int mPutS(const char * s) { return printf("%s\r\n", s); } #else Serial pc(USBTX, USBRX); int mReadable() { return pc.readable(); } int mGetCh() { return pc.getc(); } int mPutCh(int a) { return pc.putc(a); } int mPutS(const char * s) { return pc.printf("%s\r\n", s); } #endif int main(int argc, char* argv[]) { CMDP_T * cp = GetCommandProcessor(); #ifdef WIN32 // nothing special for Win32 #else pc.baud(921600); #endif cp->Init( &SignOnBannerCmd, CFG_ENABLE_TERMINATE | CFG_ENABLE_SYSTEM | CFG_ECHO_ON | CFG_CASE_INSENSITIVE, // options 50, // Command Buffer length 5, // History depth # of commands mReadable, // User provided API (kbhit()) mGetCh, // User provided API mPutCh, // User provided API mPutS); // User provided API // Start adding custom commands now cp->Add(&WhoCmd); // Should never "wait" in here while (cp->Run() == runok) // run this timeslice { // do non-blocking things here ; } cp->End(); // cleanup return 0; }
Please log in to post comments.